| 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 |