OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "core/paint/InlineTextBoxPainter.h" | 5 #include "core/paint/InlineTextBoxPainter.h" |
6 | 6 |
7 #include "core/editing/CompositionUnderline.h" | 7 #include "core/editing/CompositionUnderline.h" |
8 #include "core/editing/Editor.h" | 8 #include "core/editing/Editor.h" |
9 #include "core/editing/markers/DocumentMarkerController.h" | 9 #include "core/editing/markers/DocumentMarkerController.h" |
10 #include "core/frame/LocalFrame.h" | 10 #include "core/frame/LocalFrame.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 const InlineTextBox* inline_text_box) { | 45 const InlineTextBox* inline_text_box) { |
46 bool first_line = inline_text_box->IsFirstLineStyle(); | 46 bool first_line = inline_text_box->IsFirstLineStyle(); |
47 for (LineLayoutItem current = inline_text_box->Parent()->GetLineLayoutItem(); | 47 for (LineLayoutItem current = inline_text_box->Parent()->GetLineLayoutItem(); |
48 ;) { | 48 ;) { |
49 if (current.IsLayoutBlock()) | 49 if (current.IsLayoutBlock()) |
50 return current; | 50 return current; |
51 if (!current.IsLayoutInline() || current.IsRubyText()) | 51 if (!current.IsLayoutInline() || current.IsRubyText()) |
52 return nullptr; | 52 return nullptr; |
53 | 53 |
54 const ComputedStyle& style_to_use = current.StyleRef(first_line); | 54 const ComputedStyle& style_to_use = current.StyleRef(first_line); |
55 if (style_to_use.GetTextDecoration() & kTextDecorationUnderline) | 55 if (EnumHasFlags(style_to_use.GetTextDecoration(), |
| 56 TextDecoration::kUnderline)) |
56 return current; | 57 return current; |
57 | 58 |
58 current = current.Parent(); | 59 current = current.Parent(); |
59 if (!current) | 60 if (!current) |
60 return current; | 61 return current; |
61 | 62 |
62 if (Node* node = current.GetNode()) { | 63 if (Node* node = current.GetNode()) { |
63 if (isHTMLAnchorElement(node) || node->HasTagName(HTMLNames::fontTag)) | 64 if (isHTMLAnchorElement(node) || node->HasTagName(HTMLNames::fontTag)) |
64 return current; | 65 return current; |
65 } | 66 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 decoration_info.underline_position; | 220 decoration_info.underline_position; |
220 bool flip_underline_and_overline = false; | 221 bool flip_underline_and_overline = false; |
221 if (underline_position == ResolvedUnderlinePosition::kOver) { | 222 if (underline_position == ResolvedUnderlinePosition::kOver) { |
222 flip_underline_and_overline = true; | 223 flip_underline_and_overline = true; |
223 underline_position = ResolvedUnderlinePosition::kUnder; | 224 underline_position = ResolvedUnderlinePosition::kUnder; |
224 } | 225 } |
225 | 226 |
226 for (const AppliedTextDecoration& decoration : decorations) { | 227 for (const AppliedTextDecoration& decoration : decorations) { |
227 TextDecoration lines = decoration.Lines(); | 228 TextDecoration lines = decoration.Lines(); |
228 if (flip_underline_and_overline) { | 229 if (flip_underline_and_overline) { |
229 lines = static_cast<TextDecoration>( | 230 lines ^= (TextDecoration::kUnderline | TextDecoration::kOverline); |
230 lines ^ (kTextDecorationUnderline | kTextDecorationOverline)); | |
231 } | 231 } |
232 if ((lines & kTextDecorationUnderline) && decoration_info.font_data) { | 232 if (EnumHasFlags(lines, TextDecoration::kUnderline) && |
| 233 decoration_info.font_data) { |
233 const int underline_offset = ComputeUnderlineOffset( | 234 const int underline_offset = ComputeUnderlineOffset( |
234 underline_position, *decoration_info.style, | 235 underline_position, *decoration_info.style, |
235 decoration_info.font_data->GetFontMetrics(), &box, decorating_box, | 236 decoration_info.font_data->GetFontMetrics(), &box, decorating_box, |
236 decoration_info.thickness); | 237 decoration_info.thickness); |
237 text_painter.PaintDecorationUnderOrOverLine( | 238 text_painter.PaintDecorationUnderOrOverLine( |
238 context, decoration_info, decoration, underline_offset, | 239 context, decoration_info, decoration, underline_offset, |
239 decoration_info.double_offset); | 240 decoration_info.double_offset); |
240 } | 241 } |
241 if (lines & kTextDecorationOverline) { | 242 if (EnumHasFlags(lines, TextDecoration::kOverline)) { |
242 const int overline_offset = ComputeUnderlineOffsetForUnder( | 243 const int overline_offset = ComputeUnderlineOffsetForUnder( |
243 *decoration_info.style, &box, decorating_box, | 244 *decoration_info.style, &box, decorating_box, |
244 decoration_info.thickness, | 245 decoration_info.thickness, |
245 flip_underline_and_overline ? LineVerticalPositionType::TopOfEmHeight | 246 flip_underline_and_overline ? LineVerticalPositionType::TopOfEmHeight |
246 : LineVerticalPositionType::TextTop); | 247 : LineVerticalPositionType::TextTop); |
247 text_painter.PaintDecorationUnderOrOverLine( | 248 text_painter.PaintDecorationUnderOrOverLine( |
248 context, decoration_info, decoration, overline_offset, | 249 context, decoration_info, decoration, overline_offset, |
249 -decoration_info.double_offset); | 250 -decoration_info.double_offset); |
250 } | 251 } |
251 // We could instead build a vector of the TextDecoration instances needing | 252 // We could instead build a vector of the TextDecoration instances needing |
252 // line-through but this is a rare case so better to avoid vector overhead. | 253 // line-through but this is a rare case so better to avoid vector overhead. |
253 has_line_through_decoration |= ((lines & kTextDecorationLineThrough) != 0); | 254 has_line_through_decoration |= |
| 255 EnumHasFlags(lines, TextDecoration::kLineThrough); |
254 } | 256 } |
255 } | 257 } |
256 | 258 |
257 void InlineTextBoxPainter::Paint(const PaintInfo& paint_info, | 259 void InlineTextBoxPainter::Paint(const PaintInfo& paint_info, |
258 const LayoutPoint& paint_offset) { | 260 const LayoutPoint& paint_offset) { |
259 if (!ShouldPaintTextBox(paint_info)) | 261 if (!ShouldPaintTextBox(paint_info)) |
260 return; | 262 return; |
261 | 263 |
262 DCHECK(!ShouldPaintSelfOutline(paint_info.phase) && | 264 DCHECK(!ShouldPaintSelfOutline(paint_info.phase) && |
263 !ShouldPaintDescendantOutlines(paint_info.phase)); | 265 !ShouldPaintDescendantOutlines(paint_info.phase)); |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 emphasis_mark_position); | 454 emphasis_mark_position); |
453 if (combined_text) | 455 if (combined_text) |
454 text_painter.SetCombinedText(combined_text); | 456 text_painter.SetCombinedText(combined_text); |
455 if (inline_text_box_.Truncation() != kCNoTruncation && ltr != flow_is_ltr) | 457 if (inline_text_box_.Truncation() != kCNoTruncation && ltr != flow_is_ltr) |
456 text_painter.SetEllipsisOffset(inline_text_box_.Truncation()); | 458 text_painter.SetEllipsisOffset(inline_text_box_.Truncation()); |
457 | 459 |
458 if (!paint_selected_text_only) { | 460 if (!paint_selected_text_only) { |
459 // Paint text decorations except line-through. | 461 // Paint text decorations except line-through. |
460 DecorationInfo decoration_info; | 462 DecorationInfo decoration_info; |
461 bool has_line_through_decoration = false; | 463 bool has_line_through_decoration = false; |
462 if (style_to_use.TextDecorationsInEffect() != kTextDecorationNone && | 464 if (style_to_use.TextDecorationsInEffect() != TextDecoration::kNone && |
463 inline_text_box_.Truncation() != kCFullTruncation) { | 465 inline_text_box_.Truncation() != kCFullTruncation) { |
464 LayoutPoint local_origin = LayoutPoint(box_origin); | 466 LayoutPoint local_origin = LayoutPoint(box_origin); |
465 LayoutUnit width = inline_text_box_.LogicalWidth(); | 467 LayoutUnit width = inline_text_box_.LogicalWidth(); |
466 ComputeOriginAndWidthForBox(inline_text_box_, local_origin, width); | 468 ComputeOriginAndWidthForBox(inline_text_box_, local_origin, width); |
467 const LineLayoutItem& decorating_box = | 469 const LineLayoutItem& decorating_box = |
468 EnclosingUnderlineObject(&inline_text_box_); | 470 EnclosingUnderlineObject(&inline_text_box_); |
469 const ComputedStyle* decorating_box_style = | 471 const ComputedStyle* decorating_box_style = |
470 decorating_box ? decorating_box.Style() : nullptr; | 472 decorating_box ? decorating_box.Style() : nullptr; |
471 text_painter.ComputeDecorationInfo(decoration_info, box_origin, | 473 text_painter.ComputeDecorationInfo(decoration_info, box_origin, |
472 local_origin, width, | 474 local_origin, width, |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1178 | 1180 |
1179 LayoutRect box_rect(box_origin, LayoutSize(inline_text_box_.LogicalWidth(), | 1181 LayoutRect box_rect(box_origin, LayoutSize(inline_text_box_.LogicalWidth(), |
1180 inline_text_box_.LogicalHeight())); | 1182 inline_text_box_.LogicalHeight())); |
1181 context.Clip(FloatRect(box_rect)); | 1183 context.Clip(FloatRect(box_rect)); |
1182 context.DrawHighlightForText(font, run, FloatPoint(box_origin), | 1184 context.DrawHighlightForText(font, run, FloatPoint(box_origin), |
1183 box_rect.Height().ToInt(), color, | 1185 box_rect.Height().ToInt(), color, |
1184 paint_offsets.first, paint_offsets.second); | 1186 paint_offsets.first, paint_offsets.second); |
1185 } | 1187 } |
1186 | 1188 |
1187 } // namespace blink | 1189 } // namespace blink |
OLD | NEW |