OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "platform/fonts/shaping/ShapingLineBreaker.h" | 5 #include "platform/fonts/shaping/ShapingLineBreaker.h" |
6 | 6 |
7 #include "platform/fonts/Font.h" | 7 #include "platform/fonts/Font.h" |
8 #include "platform/fonts/shaping/HarfBuzzShaper.h" | 8 #include "platform/fonts/shaping/HarfBuzzShaper.h" |
9 #include "platform/fonts/shaping/ShapeResult.h" | 9 #include "platform/fonts/shaping/ShapeResult.h" |
10 #include "platform/fonts/shaping/ShapeResultInlineHeaders.h" | 10 #include "platform/fonts/shaping/ShapeResultInlineHeaders.h" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 | 79 |
80 inline PassRefPtr<ShapeResult> ShapingLineBreaker::Shape( | 80 inline PassRefPtr<ShapeResult> ShapingLineBreaker::Shape( |
81 TextDirection direction, | 81 TextDirection direction, |
82 unsigned start, | 82 unsigned start, |
83 unsigned end) { | 83 unsigned end) { |
84 if (!spacing_ || !spacing_->HasSpacing()) | 84 if (!spacing_ || !spacing_->HasSpacing()) |
85 return shaper_->Shape(font_, direction, start, end); | 85 return shaper_->Shape(font_, direction, start, end); |
86 | 86 |
87 RefPtr<ShapeResult> result = shaper_->Shape(font_, direction, start, end); | 87 RefPtr<ShapeResult> result = shaper_->Shape(font_, direction, start, end); |
88 result->ApplySpacing(*spacing_, direction); | 88 result->ApplySpacing(*spacing_, direction); |
89 return result.Release(); | 89 return result; |
90 } | 90 } |
91 | 91 |
92 // Shapes a line of text by finding a valid and appropriate break opportunity | 92 // Shapes a line of text by finding a valid and appropriate break opportunity |
93 // based on the shaping results for the entire paragraph. Re-shapes the start | 93 // based on the shaping results for the entire paragraph. Re-shapes the start |
94 // and end of the line as needed. | 94 // and end of the line as needed. |
95 // | 95 // |
96 // Definitions: | 96 // Definitions: |
97 // Candidate break opportunity: Ideal point to break, disregarding line | 97 // Candidate break opportunity: Ideal point to break, disregarding line |
98 // breaking rules. May be in the middle of a word | 98 // breaking rules. May be in the middle of a word |
99 // or inside a ligature. | 99 // or inside a ligature. |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 if (last_safe > first_safe) | 237 if (last_safe > first_safe) |
238 result_->CopyRange(first_safe, last_safe, line_result.Get()); | 238 result_->CopyRange(first_safe, last_safe, line_result.Get()); |
239 if (line_end_result) | 239 if (line_end_result) |
240 line_end_result->CopyRange(last_safe, max_length, line_result.Get()); | 240 line_end_result->CopyRange(last_safe, max_length, line_result.Get()); |
241 | 241 |
242 DCHECK_GT(break_opportunity, start); | 242 DCHECK_GT(break_opportunity, start); |
243 DCHECK_EQ(std::min(break_opportunity, range_end) - start, | 243 DCHECK_EQ(std::min(break_opportunity, range_end) - start, |
244 line_result->NumCharacters()); | 244 line_result->NumCharacters()); |
245 | 245 |
246 *break_offset = break_opportunity; | 246 *break_offset = break_opportunity; |
247 return line_result.Release(); | 247 return line_result; |
248 } | 248 } |
249 | 249 |
250 // Shape from the specified offset to the end of the ShapeResult. | 250 // Shape from the specified offset to the end of the ShapeResult. |
251 // If |start| is safe-to-break, this copies the subset of the result. | 251 // If |start| is safe-to-break, this copies the subset of the result. |
252 PassRefPtr<ShapeResult> ShapingLineBreaker::ShapeToEnd( | 252 PassRefPtr<ShapeResult> ShapingLineBreaker::ShapeToEnd( |
253 unsigned start, | 253 unsigned start, |
254 LayoutUnit start_position, | 254 LayoutUnit start_position, |
255 unsigned range_end) { | 255 unsigned range_end) { |
256 unsigned first_safe = | 256 unsigned first_safe = |
257 NextSafeToBreakBefore(shaper_->GetText(), shaper_->TextLength(), start); | 257 NextSafeToBreakBefore(shaper_->GetText(), shaper_->TextLength(), start); |
258 DCHECK_GE(first_safe, start); | 258 DCHECK_GE(first_safe, start); |
259 | 259 |
260 RefPtr<ShapeResult> line_result; | 260 RefPtr<ShapeResult> line_result; |
261 TextDirection direction = result_->Direction(); | 261 TextDirection direction = result_->Direction(); |
262 if (first_safe == start) { | 262 if (first_safe == start) { |
263 // If |start| is safe-to-break, reshape is not needed. | 263 // If |start| is safe-to-break, reshape is not needed. |
264 line_result = ShapeResult::Create(font_, 0, direction); | 264 line_result = ShapeResult::Create(font_, 0, direction); |
265 result_->CopyRange(start, range_end, line_result.Get()); | 265 result_->CopyRange(start, range_end, line_result.Get()); |
266 } else if (first_safe < range_end) { | 266 } else if (first_safe < range_end) { |
267 // Otherwise reshape to the first safe, then copy the rest. | 267 // Otherwise reshape to the first safe, then copy the rest. |
268 line_result = Shape(direction, start, first_safe); | 268 line_result = Shape(direction, start, first_safe); |
269 result_->CopyRange(first_safe, range_end, line_result.Get()); | 269 result_->CopyRange(first_safe, range_end, line_result.Get()); |
270 } else { | 270 } else { |
271 // If no safe-to-break in the ragne, reshape the whole range. | 271 // If no safe-to-break in the ragne, reshape the whole range. |
272 line_result = Shape(direction, start, range_end); | 272 line_result = Shape(direction, start, range_end); |
273 } | 273 } |
274 return line_result.Release(); | 274 return line_result; |
275 } | 275 } |
276 | 276 |
277 } // namespace blink | 277 } // namespace blink |
OLD | NEW |