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

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

Issue 2913773002: [WIP][b:eae_mywip_paint] Paint Selection NG.
Patch Set: update Created 3 years, 6 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 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 "core/paint/NGTextFragmentPainter.h" 5 #include "core/paint/NGTextFragmentPainter.h"
6 6
7 #include "core/editing/FrameSelection.h"
7 #include "core/frame/LocalFrame.h" 8 #include "core/frame/LocalFrame.h"
8 #include "core/layout/ng/inline/ng_physical_text_fragment.h" 9 #include "core/layout/ng/inline/ng_physical_text_fragment.h"
9 #include "core/paint/NGTextPainter.h" 10 #include "core/paint/NGTextPainter.h"
10 #include "core/paint/PaintInfo.h" 11 #include "core/paint/PaintInfo.h"
11 #include "core/paint/TextPainterBase.h" 12 #include "core/paint/TextPainterBase.h"
12 #include "core/style/AppliedTextDecoration.h" 13 #include "core/style/AppliedTextDecoration.h"
13 #include "platform/graphics/GraphicsContextStateSaver.h" 14 #include "platform/graphics/GraphicsContextStateSaver.h"
14 #include "platform/graphics/paint/DrawingRecorder.h" 15 #include "platform/graphics/paint/DrawingRecorder.h"
15 #include "platform/wtf/Optional.h" 16 #include "platform/wtf/Optional.h"
16 17
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 // decoration, 69 // decoration,
69 // overline_offset); 70 // overline_offset);
70 // } 71 // }
71 // // We could instead build a vector of the TextDecoration instances needing 72 // // We could instead build a vector of the TextDecoration instances needing
72 // // line-through but this is a rare case so better to avoid vector 73 // // line-through but this is a rare case so better to avoid vector
73 // overhead. has_line_through_decoration |= ((lines & 74 // overhead. has_line_through_decoration |= ((lines &
74 // kTextDecorationLineThrough) != 0); 75 // kTextDecorationLineThrough) != 0);
75 //} 76 //}
76 } 77 }
77 78
79 static std::pair<int, int> SelectionStartEnd(
kojii 2017/06/16 11:25:57 Can add explanation what this function does and wh
yoichio 2017/06/21 08:16:43 This returns 0-origin offset range in NGPhysicalTe
80 const NGPhysicalTextFragment* text_fragment) {
81 const SelectionState& selection_state =
82 text_fragment->GetLayoutObject()->GetSelectionState();
83 if (selection_state == SelectionState::kNone)
84 return {0, 0};
85 if (selection_state == SelectionState::kInside)
86 return {0, text_fragment->Text().length()};
kojii 2017/06/16 11:25:57 why it computes min/max to text_fragment->Start/En
yoichio 2017/06/21 08:16:43 Ah, it should be {text_fragment->StartOffst(), te
87
88 const std::pair<int, int> startend_in_ngblockflow =
kojii 2017/06/16 11:25:57 I can't understand how this works...so you get two
yoichio 2017/06/21 08:16:43 They are index in NGInlineNodeData.text_content_,
kojii 2017/06/21 10:10:09 But you get data from Frame, without passing text_
89 text_fragment->GetLayoutObject()
90 ->GetFrameView()
91 ->GetFrame()
92 .Selection()
93 .LayoutSelectionStartEnd();
94 int selection_start = std::max<int>(
95 0, startend_in_ngblockflow.first - text_fragment->StartOffset());
kojii 2017/06/16 11:25:57 This might not work, because StartOffset() is unsi
96 int selection_end = std::min<int>(
97 text_fragment->Text().length(),
98 startend_in_ngblockflow.second - text_fragment->StartOffset());
99
100 switch (selection_state) {
101 case SelectionState::kStart:
102 return {selection_start, text_fragment->Text().length()};
103 case SelectionState::kEnd:
104 return {0, selection_end};
105 case SelectionState::kStartAndEnd:
106 return {selection_start, selection_end};
107 }
108
109 NOTREACHED();
110 return {0, 0};
111 }
112
78 } // anonymous namespace 113 } // anonymous namespace
79 114
80 void NGTextFragmentPainter::Paint(const Document& document, 115 void NGTextFragmentPainter::Paint(const Document& document,
81 const PaintInfo& paint_info, 116 const PaintInfo& paint_info,
82 const LayoutPoint& paint_offset) { 117 const LayoutPoint& paint_offset) {
83 // TODO(eae): Move 118 // TODO(eae): Move
84 static unsigned short kCNoTruncation = USHRT_MAX; 119 static unsigned short kCNoTruncation = USHRT_MAX;
85 static unsigned short kCFullTruncation = USHRT_MAX - 1; 120 static unsigned short kCFullTruncation = USHRT_MAX - 1;
86 121
87 const ComputedStyle& style_to_use = text_fragment_->Style(); 122 const ComputedStyle& style_to_use = text_fragment_->Style();
(...skipping 27 matching lines...) Expand all
115 } 150 }
116 151
117 // Determine text colors. 152 // Determine text colors.
118 TextPainterBase::Style text_style = 153 TextPainterBase::Style text_style =
119 TextPainterBase::TextPaintingStyle(document, style_to_use, paint_info); 154 TextPainterBase::TextPaintingStyle(document, style_to_use, paint_info);
120 // TextPainterBase::Style selection_style = 155 // TextPainterBase::Style selection_style =
121 // TextPainter::SelectionPaintingStyle( 156 // TextPainter::SelectionPaintingStyle(
122 // text_fragment_.GetLineLayoutItem(), have_selection, paint_info, 157 // text_fragment_.GetLineLayoutItem(), have_selection, paint_info,
123 // text_style); 158 // text_style);
124 TextPainterBase::Style selection_style = text_style; 159 TextPainterBase::Style selection_style = text_style;
160 selection_style.fill_color = Color(1.0f, 0.0f, 0.0f, 1.0f);
kojii 2017/06/16 11:25:57 this is temporary, correct? Can you add TODO comme
yoichio 2017/06/21 08:16:43 Yes, just for testing. Remove from reviewing.
125 bool paint_selected_text_only = (paint_info.phase == kPaintPhaseSelection); 161 bool paint_selected_text_only = (paint_info.phase == kPaintPhaseSelection);
126 bool paint_selected_text_separately = 162 bool paint_selected_text_separately =
127 !paint_selected_text_only && text_style != selection_style; 163 !paint_selected_text_only && text_style != selection_style;
128 164
129 // Set our font. 165 // Set our font.
130 const Font& font = style_to_use.GetFont(); 166 const Font& font = style_to_use.GetFont();
131 const SimpleFontData* font_data = font.PrimaryFont(); 167 const SimpleFontData* font_data = font.PrimaryFont();
132 DCHECK(font_data); 168 DCHECK(font_data);
133 169
134 int ascent = font_data ? font_data->GetFontMetrics().Ascent() : 0; 170 int ascent = font_data ? font_data->GetFontMetrics().Ascent() : 0;
(...skipping 16 matching lines...) Expand all
151 // else 187 // else
152 // PaintSelection<InlineTextBoxPainter::PaintOptions::kNormal>( 188 // PaintSelection<InlineTextBoxPainter::PaintOptions::kNormal>(
153 // context, box_rect, style_to_use, font, 189 // context, box_rect, style_to_use, font,
154 // selection_style.fill_color); 190 // selection_style.fill_color);
155 //} 191 //}
156 } 192 }
157 193
158 // 2. Now paint the foreground, including text and decorations. 194 // 2. Now paint the foreground, including text and decorations.
159 int selection_start = 0; 195 int selection_start = 0;
160 int selection_end = 0; 196 int selection_end = 0;
161 // if (paint_selected_text_only || paint_selected_text_separately) 197 if (paint_selected_text_only || paint_selected_text_separately) {
162 // text_fragment_.SelectionStartEnd(selection_start, selection_end); 198 std::tie(selection_start, selection_end) =
199 SelectionStartEnd(text_fragment_);
200 }
163 201
164 // bool respect_hyphen = 202 // bool respect_hyphen =
165 // selection_end == static_cast<int>(text_fragment_.Len()) && 203 // selection_end == static_cast<int>(text_fragment_.Len()) &&
166 // text_fragment_.HasHyphen(); 204 // text_fragment_.HasHyphen();
167 // if (respect_hyphen) 205 // if (respect_hyphen)
168 // selection_end = text_run.length(); 206 // selection_end = text_run.length();
169 207
170 unsigned length = text_fragment_->Text().length(); 208 unsigned length = text_fragment_->Text().length();
171 209
172 bool ltr = true; 210 bool ltr = true;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 // PaintDocumentMarkers(paint_info, box_origin, style_to_use, font, 308 // PaintDocumentMarkers(paint_info, box_origin, style_to_use, font,
271 // DocumentMarkerPaintPhase::kForeground); 309 // DocumentMarkerPaintPhase::kForeground);
272 310
273 if (should_rotate) { 311 if (should_rotate) {
274 context.ConcatCTM(TextPainterBase::Rotation( 312 context.ConcatCTM(TextPainterBase::Rotation(
275 box_rect, TextPainterBase::kCounterclockwise)); 313 box_rect, TextPainterBase::kCounterclockwise));
276 } 314 }
277 } 315 }
278 316
279 } // namespace blink 317 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698