Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1063)

Side by Side Diff: third_party/WebKit/Source/core/paint/InlineTextBoxPainter.cpp

Issue 2845773002: Make TextDecoration an enum class. (Closed)
Patch Set: Rebase Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698