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 "config.h" | 5 #include "config.h" |
6 #include "core/paint/InlineTextBoxPainter.h" | 6 #include "core/paint/InlineTextBoxPainter.h" |
7 | 7 |
8 #include "core/editing/CompositionUnderline.h" | 8 #include "core/editing/CompositionUnderline.h" |
9 #include "core/editing/CompositionUnderlineRangeFilter.h" | 9 #include "core/editing/CompositionUnderlineRangeFilter.h" |
10 #include "core/editing/Editor.h" | 10 #include "core/editing/Editor.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
72 bool isPrinting = paintInfo.isPrinting(); | 72 bool isPrinting = paintInfo.isPrinting(); |
73 | 73 |
74 // Determine whether or not we're selected. | 74 // Determine whether or not we're selected. |
75 bool haveSelection = !isPrinting && paintInfo.phase != PaintPhaseTextClip && m_inlineTextBox.selectionState() != SelectionNone; | 75 bool haveSelection = !isPrinting && paintInfo.phase != PaintPhaseTextClip && m_inlineTextBox.selectionState() != SelectionNone; |
76 if (!haveSelection && paintInfo.phase == PaintPhaseSelection) { | 76 if (!haveSelection && paintInfo.phase == PaintPhaseSelection) { |
77 // When only painting the selection, don't bother to paint if there is n one. | 77 // When only painting the selection, don't bother to paint if there is n one. |
78 return; | 78 return; |
79 } | 79 } |
80 | 80 |
81 // Determine whether or not we have composition underlines to draw. | 81 // Determine whether or not we have composition underlines to draw. |
82 bool containsComposition = m_inlineTextBox.layoutObject().node() && m_inline TextBox.layoutObject().frame()->inputMethodController().compositionNode() == m_i nlineTextBox.layoutObject().node(); | 82 bool containsComposition = m_inlineTextBox.layoutObject().node() && m_inline TextBox.layoutObject().frame()->inputMethodController().isCompositionNode(m_inli neTextBox.layoutObject().node()); |
yosin_UTC9
2015/08/31 01:35:40
Note: |isCompositionNode(Node*)| should be fast, s
| |
83 bool useCustomUnderlines = containsComposition && m_inlineTextBox.layoutObje ct().frame()->inputMethodController().compositionUsesCustomUnderlines(); | 83 bool useCustomUnderlines = containsComposition && m_inlineTextBox.layoutObje ct().frame()->inputMethodController().customCompositionUnderlines(m_inlineTextBo x.layoutObject().node()); |
84 | 84 |
85 // The text clip phase already has a DrawingRecorder. Text clips are initiat ed only in BoxPainter::paintLayerExtended, which is already | 85 // The text clip phase already has a DrawingRecorder. Text clips are initiat ed only in BoxPainter::paintLayerExtended, which is already |
86 // within a DrawingRecorder. | 86 // within a DrawingRecorder. |
87 Optional<DrawingRecorder> drawingRecorder; | 87 Optional<DrawingRecorder> drawingRecorder; |
88 if (RuntimeEnabledFeatures::slimmingPaintEnabled() && paintInfo.phase != Pai ntPhaseTextClip) { | 88 if (RuntimeEnabledFeatures::slimmingPaintEnabled() && paintInfo.phase != Pai ntPhaseTextClip) { |
89 if (DrawingRecorder::useCachedDrawingIfPossible(*paintInfo.context, m_in lineTextBox, DisplayItem::paintPhaseToDrawingType(paintInfo.phase))) | 89 if (DrawingRecorder::useCachedDrawingIfPossible(*paintInfo.context, m_in lineTextBox, DisplayItem::paintPhaseToDrawingType(paintInfo.phase))) |
90 return; | 90 return; |
91 LayoutRect paintRect(logicalVisualOverflow); | 91 LayoutRect paintRect(logicalVisualOverflow); |
92 m_inlineTextBox.logicalRectToPhysicalRect(paintRect); | 92 m_inlineTextBox.logicalRectToPhysicalRect(paintRect); |
93 if (paintInfo.phase != PaintPhaseSelection && (haveSelection || contains Composition || paintsMarkerHighlights(m_inlineTextBox.layoutObject()))) | 93 if (paintInfo.phase != PaintPhaseSelection && (haveSelection || contains Composition || paintsMarkerHighlights(m_inlineTextBox.layoutObject()))) |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
240 paintDecoration(paintInfo, boxOrigin, textDecorations); | 240 paintDecoration(paintInfo, boxOrigin, textDecorations); |
241 if (combinedText) | 241 if (combinedText) |
242 context->concatCTM(TextPainter::rotation(boxRect, TextPainter::Count erclockwise)); | 242 context->concatCTM(TextPainter::rotation(boxRect, TextPainter::Count erclockwise)); |
243 } | 243 } |
244 | 244 |
245 if (paintInfo.phase == PaintPhaseForeground) { | 245 if (paintInfo.phase == PaintPhaseForeground) { |
246 paintDocumentMarkers(context, boxOrigin, styleToUse, font, false); | 246 paintDocumentMarkers(context, boxOrigin, styleToUse, font, false); |
247 | 247 |
248 // Paint custom underlines for compositions. | 248 // Paint custom underlines for compositions. |
249 if (useCustomUnderlines) { | 249 if (useCustomUnderlines) { |
250 const Vector<CompositionUnderline>& underlines = m_inlineTextBox.lay outObject().frame()->inputMethodController().customCompositionUnderlines(); | 250 if (const Vector<CompositionUnderline>* underlines = m_inlineTextBox .layoutObject().frame()->inputMethodController().customCompositionUnderlines(m_i nlineTextBox.layoutObject().node())) { |
251 CompositionUnderlineRangeFilter filter(underlines, m_inlineTextBox.s tart(), m_inlineTextBox.end()); | 251 CompositionUnderlineRangeFilter filter(*underlines, m_inlineText Box.start(), m_inlineTextBox.end()); |
252 for (CompositionUnderlineRangeFilter::ConstIterator it = filter.begi n(); it != filter.end(); ++it) { | 252 for (CompositionUnderlineRangeFilter::ConstIterator it = filter. begin(); it != filter.end(); ++it) { |
253 if (it->color == Color::transparent) | 253 if (it->color == Color::transparent) |
254 continue; | 254 continue; |
255 paintCompositionUnderline(context, boxOrigin, *it); | 255 paintCompositionUnderline(context, boxOrigin, *it); |
256 } | |
256 } | 257 } |
257 } | 258 } |
258 } | 259 } |
259 | 260 |
260 if (shouldRotate) | 261 if (shouldRotate) |
261 context->concatCTM(TextPainter::rotation(boxRect, TextPainter::Countercl ockwise)); | 262 context->concatCTM(TextPainter::rotation(boxRect, TextPainter::Countercl ockwise)); |
262 } | 263 } |
263 | 264 |
264 unsigned InlineTextBoxPainter::underlinePaintStart(const CompositionUnderline& u nderline) | 265 unsigned InlineTextBoxPainter::underlinePaintStart(const CompositionUnderline& u nderline) |
265 { | 266 { |
266 return std::max(static_cast<unsigned>(m_inlineTextBox.start()), underline.st artOffset); | 267 return std::max(static_cast<unsigned>(m_inlineTextBox.start()), underline.st artOffset); |
267 } | 268 } |
268 | 269 |
269 unsigned InlineTextBoxPainter::underlinePaintEnd(const CompositionUnderline& und erline) | 270 unsigned InlineTextBoxPainter::underlinePaintEnd(const CompositionUnderline& und erline) |
270 { | 271 { |
271 unsigned paintEnd = std::min(m_inlineTextBox.end() + 1, underline.endOffset) ; // end() points at the last char, not past it. | 272 unsigned paintEnd = std::min(m_inlineTextBox.end() + 1, underline.endOffset) ; // end() points at the last char, not past it. |
272 if (m_inlineTextBox.truncation() != cNoTruncation) | 273 if (m_inlineTextBox.truncation() != cNoTruncation) |
273 paintEnd = std::min(paintEnd, static_cast<unsigned>(m_inlineTextBox.star t() + m_inlineTextBox.truncation())); | 274 paintEnd = std::min(paintEnd, static_cast<unsigned>(m_inlineTextBox.star t() + m_inlineTextBox.truncation())); |
274 return paintEnd; | 275 return paintEnd; |
275 } | 276 } |
276 | 277 |
277 void InlineTextBoxPainter::paintCompositionBackgrounds(GraphicsContext* pt, cons t LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, bool use CustomUnderlines) | 278 void InlineTextBoxPainter::paintCompositionBackgrounds(GraphicsContext* pt, cons t LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& font, bool use CustomUnderlines) |
278 { | 279 { |
279 if (useCustomUnderlines) { | 280 if (useCustomUnderlines) { |
280 // Paint custom background highlights for compositions. | 281 // Paint custom background highlights for compositions. |
281 const Vector<CompositionUnderline>& underlines = m_inlineTextBox.layoutO bject().frame()->inputMethodController().customCompositionUnderlines(); | 282 if (const Vector<CompositionUnderline>* underlines = m_inlineTextBox.lay outObject().frame()->inputMethodController().customCompositionUnderlines(m_inlin eTextBox.layoutObject().node())) { |
282 CompositionUnderlineRangeFilter filter(underlines, m_inlineTextBox.start (), m_inlineTextBox.end()); | 283 CompositionUnderlineRangeFilter filter(*underlines, m_inlineTextBox. start(), m_inlineTextBox.end()); |
283 for (CompositionUnderlineRangeFilter::ConstIterator it = filter.begin(); it != filter.end(); ++it) { | 284 for (CompositionUnderlineRangeFilter::ConstIterator it = filter.begi n(); it != filter.end(); ++it) { |
284 if (it->backgroundColor == Color::transparent) | 285 if (it->backgroundColor == Color::transparent) |
285 continue; | 286 continue; |
286 paintSingleCompositionBackgroundRun(pt, boxOrigin, style, font, it-> backgroundColor, underlinePaintStart(*it), underlinePaintEnd(*it)); | 287 paintSingleCompositionBackgroundRun(pt, boxOrigin, style, font, it->backgroundColor, underlinePaintStart(*it), underlinePaintEnd(*it)); |
288 } | |
287 } | 289 } |
288 | |
289 } else { | 290 } else { |
290 paintSingleCompositionBackgroundRun(pt, boxOrigin, style, font, LayoutTh eme::theme().platformDefaultCompositionBackgroundColor(), | 291 paintSingleCompositionBackgroundRun(pt, boxOrigin, style, font, LayoutTh eme::theme().platformDefaultCompositionBackgroundColor(), |
291 m_inlineTextBox.layoutObject().frame()->inputMethodController().comp ositionStart(), | 292 m_inlineTextBox.layoutObject().frame()->inputMethodController().comp ositionStart(), |
292 m_inlineTextBox.layoutObject().frame()->inputMethodController().comp ositionEnd()); | 293 m_inlineTextBox.layoutObject().frame()->inputMethodController().comp ositionEnd()); |
293 } | 294 } |
294 } | 295 } |
295 | 296 |
296 void InlineTextBoxPainter::paintSingleCompositionBackgroundRun(GraphicsContext* context, const LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& f ont, Color backgroundColor, int startPos, int endPos) | 297 void InlineTextBoxPainter::paintSingleCompositionBackgroundRun(GraphicsContext* context, const LayoutPoint& boxOrigin, const ComputedStyle& style, const Font& f ont, Color backgroundColor, int startPos, int endPos) |
297 { | 298 { |
298 int sPos = std::max(startPos - static_cast<int>(m_inlineTextBox.start()), 0) ; | 299 int sPos = std::max(startPos - static_cast<int>(m_inlineTextBox.start()), 0) ; |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
829 LayoutPoint textOrigin(boxOrigin.x(), boxOrigin.y() + font.fontMetri cs().ascent()); | 830 LayoutPoint textOrigin(boxOrigin.x(), boxOrigin.y() + font.fontMetri cs().ascent()); |
830 TextPainter textPainter(pt, font, run, textOrigin, boxRect, m_inline TextBox.isHorizontal()); | 831 TextPainter textPainter(pt, font, run, textOrigin, boxRect, m_inline TextBox.isHorizontal()); |
831 | 832 |
832 textPainter.paint(sPos, ePos, length, textStyle, 0); | 833 textPainter.paint(sPos, ePos, length, textStyle, 0); |
833 } | 834 } |
834 } | 835 } |
835 } | 836 } |
836 | 837 |
837 | 838 |
838 } // namespace blink | 839 } // namespace blink |
OLD | NEW |