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

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

Issue 1660863002: Force all LayoutUnit construction to be explicit (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Also fix LayoutRectTest.cpp Created 4 years, 10 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/editing/markers/RenderedDocumentMarker.h" 10 #include "core/editing/markers/RenderedDocumentMarker.h"
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 if (m_inlineTextBox.truncation() != cNoTruncation) { 101 if (m_inlineTextBox.truncation() != cNoTruncation) {
102 if (m_inlineTextBox.lineLayoutItem().containingBlock().style()->isLeftTo RightDirection() != m_inlineTextBox.isLeftToRightDirection()) { 102 if (m_inlineTextBox.lineLayoutItem().containingBlock().style()->isLeftTo RightDirection() != m_inlineTextBox.isLeftToRightDirection()) {
103 // Make the visible fragment of text hug the edge closest to the res t of the run by moving the origin 103 // Make the visible fragment of text hug the edge closest to the res t of the run by moving the origin
104 // at which we start drawing text. 104 // at which we start drawing text.
105 // e.g. In the case of LTR text truncated in an RTL Context, the cor rect behavior is: 105 // e.g. In the case of LTR text truncated in an RTL Context, the cor rect behavior is:
106 // |Hello|CBA| -> |...He|CBA| 106 // |Hello|CBA| -> |...He|CBA|
107 // In order to draw the fragment "He" aligned to the right edge of i t's box, we need to start drawing 107 // In order to draw the fragment "He" aligned to the right edge of i t's box, we need to start drawing
108 // farther to the right. 108 // farther to the right.
109 // NOTE: WebKit's behavior differs from that of IE which appears to just overlay the ellipsis on top of the 109 // NOTE: WebKit's behavior differs from that of IE which appears to just overlay the ellipsis on top of the
110 // truncated string i.e. |Hello|CBA| -> |...lo|CBA| 110 // truncated string i.e. |Hello|CBA| -> |...lo|CBA|
111 LayoutUnit widthOfVisibleText = m_inlineTextBox.lineLayoutItem().wid th(m_inlineTextBox.start(), m_inlineTextBox.truncation(), m_inlineTextBox.textPo s(), m_inlineTextBox.isLeftToRightDirection() ? LTR : RTL, m_inlineTextBox.isFir stLineStyle()); 111 LayoutUnit widthOfVisibleText = LayoutUnit(m_inlineTextBox.lineLayou tItem().width(
112 m_inlineTextBox.start(), m_inlineTextBox.truncation(), m_inlineT extBox.textPos(),
113 m_inlineTextBox.isLeftToRightDirection() ? LTR : RTL, m_inlineTe xtBox.isFirstLineStyle()));
112 LayoutUnit widthOfHiddenText = m_inlineTextBox.logicalWidth() - widt hOfVisibleText; 114 LayoutUnit widthOfHiddenText = m_inlineTextBox.logicalWidth() - widt hOfVisibleText;
113 // FIXME: The hit testing logic also needs to take this translation into account. 115 // FIXME: The hit testing logic also needs to take this translation into account.
114 LayoutSize truncationOffset(m_inlineTextBox.isLeftToRightDirection() ? widthOfHiddenText : -widthOfHiddenText, LayoutUnit()); 116 LayoutSize truncationOffset(m_inlineTextBox.isLeftToRightDirection() ? widthOfHiddenText : -widthOfHiddenText, LayoutUnit());
115 adjustedPaintOffset.move(m_inlineTextBox.isHorizontal() ? truncation Offset : truncationOffset.transposedSize()); 117 adjustedPaintOffset.move(m_inlineTextBox.isHorizontal() ? truncation Offset : truncationOffset.transposedSize());
116 } 118 }
117 } 119 }
118 120
119 GraphicsContext& context = paintInfo.context; 121 GraphicsContext& context = paintInfo.context;
120 const ComputedStyle& styleToUse = m_inlineTextBox.lineLayoutItem().styleRef( m_inlineTextBox.isFirstLineStyle()); 122 const ComputedStyle& styleToUse = m_inlineTextBox.lineLayoutItem().styleRef( m_inlineTextBox.isFirstLineStyle());
121 123
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 405
404 // Calculate start & width 406 // Calculate start & width
405 int deltaY = m_inlineTextBox.lineLayoutItem().style()->isFlippedLinesWri tingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalB ottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop(); 407 int deltaY = m_inlineTextBox.lineLayoutItem().style()->isFlippedLinesWri tingMode() ? m_inlineTextBox.root().selectionBottom() - m_inlineTextBox.logicalB ottom() : m_inlineTextBox.logicalTop() - m_inlineTextBox.root().selectionTop();
406 int selHeight = m_inlineTextBox.root().selectionHeight(); 408 int selHeight = m_inlineTextBox.root().selectionHeight();
407 LayoutPoint startPoint(boxOrigin.x(), boxOrigin.y() - deltaY); 409 LayoutPoint startPoint(boxOrigin.x(), boxOrigin.y() - deltaY);
408 TextRun run = m_inlineTextBox.constructTextRun(style, font); 410 TextRun run = m_inlineTextBox.constructTextRun(style, font);
409 411
410 // FIXME: Convert the document markers to float rects. 412 // FIXME: Convert the document markers to float rects.
411 IntRect markerRect = enclosingIntRect(font.selectionRectForText(run, Flo atPoint(startPoint), selHeight, startPosition, endPosition)); 413 IntRect markerRect = enclosingIntRect(font.selectionRectForText(run, Flo atPoint(startPoint), selHeight, startPosition, endPosition));
412 start = markerRect.x() - startPoint.x(); 414 start = markerRect.x() - startPoint.x();
413 width = markerRect.width(); 415 width = LayoutUnit(markerRect.width());
414 } 416 }
415 417
416 // IMPORTANT: The misspelling underline is not considered when calculating t he text bounds, so we have to 418 // IMPORTANT: The misspelling underline is not considered when calculating t he text bounds, so we have to
417 // make sure to fit within those bounds. This means the top pixel(s) of the underline will overlap the 419 // make sure to fit within those bounds. This means the top pixel(s) of the underline will overlap the
418 // bottom pixel(s) of the glyphs in smaller font sizes. The alternatives ar e to increase the line spacing (bad!!) 420 // bottom pixel(s) of the glyphs in smaller font sizes. The alternatives ar e to increase the line spacing (bad!!)
419 // or decrease the underline thickness. The overlap is actually the most us eful, and matches what AppKit does. 421 // or decrease the underline thickness. The overlap is actually the most us eful, and matches what AppKit does.
420 // So, we generally place the underline at the bottom of the text, but in la rger fonts that's not so good so 422 // So, we generally place the underline at the bottom of the text, but in la rger fonts that's not so good so
421 // we pin to two pixels under the baseline. 423 // we pin to two pixels under the baseline.
422 int lineThickness = misspellingLineThickness; 424 int lineThickness = misspellingLineThickness;
423 int baseline = m_inlineTextBox.lineLayoutItem().style(m_inlineTextBox.isFirs tLineStyle())->fontMetrics().ascent(); 425 int baseline = m_inlineTextBox.lineLayoutItem().style(m_inlineTextBox.isFirs tLineStyle())->fontMetrics().ascent();
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 if (m_inlineTextBox.truncation() == cFullTruncation) 731 if (m_inlineTextBox.truncation() == cFullTruncation)
730 return; 732 return;
731 733
732 GraphicsContext& context = paintInfo.context; 734 GraphicsContext& context = paintInfo.context;
733 GraphicsContextStateSaver stateSaver(context); 735 GraphicsContextStateSaver stateSaver(context);
734 736
735 LayoutPoint localOrigin(boxOrigin); 737 LayoutPoint localOrigin(boxOrigin);
736 738
737 LayoutUnit width = m_inlineTextBox.logicalWidth(); 739 LayoutUnit width = m_inlineTextBox.logicalWidth();
738 if (m_inlineTextBox.truncation() != cNoTruncation) { 740 if (m_inlineTextBox.truncation() != cNoTruncation) {
739 width = m_inlineTextBox.lineLayoutItem().width(m_inlineTextBox.start(), m_inlineTextBox.truncation(), m_inlineTextBox.textPos(), m_inlineTextBox.isLeftT oRightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); 741 width = LayoutUnit(m_inlineTextBox.lineLayoutItem().width(
742 m_inlineTextBox.start(), m_inlineTextBox.truncation(), m_inlineTextB ox.textPos(),
743 m_inlineTextBox.isLeftToRightDirection() ? LTR : RTL, m_inlineTextBo x.isFirstLineStyle()));
740 if (!m_inlineTextBox.isLeftToRightDirection()) 744 if (!m_inlineTextBox.isLeftToRightDirection())
741 localOrigin.move(m_inlineTextBox.logicalWidth() - width, LayoutUnit( )); 745 localOrigin.move(m_inlineTextBox.logicalWidth() - width, LayoutUnit( ));
742 } 746 }
743 747
744 // Get the text decoration colors. 748 // Get the text decoration colors.
745 LayoutObject::AppliedTextDecoration underline, overline, linethrough; 749 LayoutObject::AppliedTextDecoration underline, overline, linethrough;
746 LayoutObject& textBoxLayoutObject = *LineLayoutAPIShim::layoutObjectFrom(m_i nlineTextBox.lineLayoutItem()); 750 LayoutObject& textBoxLayoutObject = *LineLayoutAPIShim::layoutObjectFrom(m_i nlineTextBox.lineLayoutItem());
747 textBoxLayoutObject.getTextDecorations(deco, underline, overline, linethroug h, true); 751 textBoxLayoutObject.getTextDecorations(deco, underline, overline, linethroug h, true);
748 if (m_inlineTextBox.isFirstLineStyle()) 752 if (m_inlineTextBox.isFirstLineStyle())
749 textBoxLayoutObject.getTextDecorations(deco, underline, overline, lineth rough, true, true); 753 textBoxLayoutObject.getTextDecorations(deco, underline, overline, lineth rough, true, true);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
792 return; 796 return;
793 797
794 unsigned paintStart = underlinePaintStart(underline); 798 unsigned paintStart = underlinePaintStart(underline);
795 unsigned paintEnd = underlinePaintEnd(underline); 799 unsigned paintEnd = underlinePaintEnd(underline);
796 800
797 // start of line to draw 801 // start of line to draw
798 float start = paintStart == static_cast<unsigned>(m_inlineTextBox.start()) ? 0 : 802 float start = paintStart == static_cast<unsigned>(m_inlineTextBox.start()) ? 0 :
799 m_inlineTextBox.lineLayoutItem().width(m_inlineTextBox.start(), paintSta rt - m_inlineTextBox.start(), m_inlineTextBox.textPos(), m_inlineTextBox.isLeftT oRightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); 803 m_inlineTextBox.lineLayoutItem().width(m_inlineTextBox.start(), paintSta rt - m_inlineTextBox.start(), m_inlineTextBox.textPos(), m_inlineTextBox.isLeftT oRightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle());
800 // how much line to draw 804 // how much line to draw
801 float width = (paintStart == static_cast<unsigned>(m_inlineTextBox.start()) && paintEnd == static_cast<unsigned>(m_inlineTextBox.end()) + 1) ? m_inlineTextB ox.logicalWidth().toFloat() : 805 float width = (paintStart == static_cast<unsigned>(m_inlineTextBox.start()) && paintEnd == static_cast<unsigned>(m_inlineTextBox.end()) + 1) ? m_inlineTextB ox.logicalWidth().toFloat() :
802 m_inlineTextBox.lineLayoutItem().width(paintStart, paintEnd - paintStart , m_inlineTextBox.textPos() + start, m_inlineTextBox.isLeftToRightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); 806 m_inlineTextBox.lineLayoutItem().width(paintStart, paintEnd - paintStart , LayoutUnit(m_inlineTextBox.textPos() + start), m_inlineTextBox.isLeftToRightDi rection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle());
803 // In RTL mode, start and width are computed from the right end of the text box: 807 // In RTL mode, start and width are computed from the right end of the text box:
804 // starting at |logicalWidth| - |start| and continuing left by |width| to 808 // starting at |logicalWidth| - |start| and continuing left by |width| to
805 // |logicalWidth| - |start| - |width|. We will draw that line, but 809 // |logicalWidth| - |start| - |width|. We will draw that line, but
806 // backwards: |logicalWidth| - |start| - |width| to |logicalWidth| - |start| . 810 // backwards: |logicalWidth| - |start| - |width| to |logicalWidth| - |start| .
807 if (!m_inlineTextBox.isLeftToRightDirection()) 811 if (!m_inlineTextBox.isLeftToRightDirection())
808 start = m_inlineTextBox.logicalWidth().toFloat() - width - start; 812 start = m_inlineTextBox.logicalWidth().toFloat() - width - start;
809 813
810 814
811 // Thick marked text underlines are 2px thick as long as there is room for t he 2px line under the baseline. 815 // Thick marked text underlines are 2px thick as long as there is room for t he 2px line under the baseline.
812 // All other marked text underlines are 1px thick. 816 // All other marked text underlines are 1px thick.
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 871
868 Color color = LayoutTheme::theme().platformTextSearchHighlightColor(marker-> activeMatch()); 872 Color color = LayoutTheme::theme().platformTextSearchHighlightColor(marker-> activeMatch());
869 GraphicsContext& context = paintInfo.context; 873 GraphicsContext& context = paintInfo.context;
870 GraphicsContextStateSaver stateSaver(context); 874 GraphicsContextStateSaver stateSaver(context);
871 context.clip(FloatRect(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toF loat(), m_inlineTextBox.logicalWidth().toFloat(), selHeight)); 875 context.clip(FloatRect(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toF loat(), m_inlineTextBox.logicalWidth().toFloat(), selHeight));
872 context.drawHighlightForText(font, run, FloatPoint(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toFloat()), selHeight, color, sPos, ePos); 876 context.drawHighlightForText(font, run, FloatPoint(boxOrigin.x().toFloat(), (boxOrigin.y() - deltaY).toFloat()), selHeight, color, sPos, ePos);
873 } 877 }
874 878
875 879
876 } // namespace blink 880 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698