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

Unified Diff: Source/core/paint/InlineTextBoxPainter.cpp

Issue 988903002: [S.P.] Fix cull rects for InlineTextBox to account for vertical text. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/paint/InlineTextBoxPainter.cpp
diff --git a/Source/core/paint/InlineTextBoxPainter.cpp b/Source/core/paint/InlineTextBoxPainter.cpp
index 994f4e8475323386ee3b30d51b4cb309831cbb08..d0c8d5537efb530a31ce3c2c391343e7426efaa7 100644
--- a/Source/core/paint/InlineTextBoxPainter.cpp
+++ b/Source/core/paint/InlineTextBoxPainter.cpp
@@ -49,18 +49,38 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint&
ASSERT(paintInfo.phase != PaintPhaseSelfOutline && paintInfo.phase != PaintPhaseChildOutlines);
- LayoutRect logicalVisualOverflow = m_inlineTextBox.logicalOverflowRect();
- LayoutUnit logicalStart = logicalVisualOverflow.x() + (m_inlineTextBox.isHorizontal() ? paintOffset.x() : paintOffset.y());
- LayoutUnit logicalExtent = logicalVisualOverflow.width();
-
- LayoutUnit paintEnd = m_inlineTextBox.isHorizontal() ? paintInfo.rect.maxX() : paintInfo.rect.maxY();
- LayoutUnit paintStart = m_inlineTextBox.isHorizontal() ? paintInfo.rect.x() : paintInfo.rect.y();
+ const LayoutStyle& styleToUse = m_inlineTextBox.renderer().styleRef(m_inlineTextBox.isFirstLineStyle());
+ GraphicsContext* context = paintInfo.context;
// We round the y-axis to ensure consistent line heights.
LayoutPoint adjustedPaintOffset = LayoutPoint(paintOffset.x(), paintOffset.y().round());
- if (logicalStart >= paintEnd || logicalStart + logicalExtent <= paintStart)
- return;
+ FloatPoint boxOrigin = m_inlineTextBox.locationIncludingFlipping().toFloatPoint();
+ boxOrigin.move(adjustedPaintOffset.x().toFloat(), adjustedPaintOffset.y().toFloat());
+ FloatRect boxRect(boxOrigin, FloatSize(m_inlineTextBox.logicalWidth(), m_inlineTextBox.logicalHeight()));
Xianzhu 2015/03/06 23:17:06 It seems that we used overflowRect to check for ea
chrishtr 2015/03/06 23:19:22 Yes. Part of this CL is unifying that code, since
Xianzhu 2015/03/06 23:31:33 Based on InlineBox.cpp, it seems that logicalFrame
chrishtr 2015/03/07 00:52:35 Sigh. Yes it does. Oh well. Going to make this CL
+ bool shouldRotate = false;
+ LayoutTextCombine* combinedText = nullptr;
+ if (!m_inlineTextBox.isHorizontal()) {
+ if (styleToUse.hasTextCombine() && m_inlineTextBox.renderer().isCombineText()) {
+ combinedText = &toLayoutTextCombine(m_inlineTextBox.renderer());
+ if (!combinedText->isCombined())
+ combinedText = nullptr;
+ }
+ if (combinedText) {
+ combinedText->updateFont();
+ boxRect.setWidth(combinedText->inlineWidthForLayout());
+ } else {
+ shouldRotate = true;
+ }
+ }
+
+ if (m_inlineTextBox.isHorizontal()) {
+ if (boxRect.x() >= paintInfo.rect.maxX() || boxRect.x() + boxRect.width() <= paintInfo.rect.x())
+ return;
+ } else {
+ if (boxRect.y() >= paintInfo.rect.maxY() || boxRect.y() + boxRect.width() <= paintInfo.rect.y())
+ return;
+ }
bool isPrinting = m_inlineTextBox.renderer().document().printing();
@@ -75,13 +95,15 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint&
// within a DrawingRecorder.
OwnPtr<DrawingRecorder> drawingRecorder;
if (RuntimeEnabledFeatures::slimmingPaintEnabled() && paintInfo.phase != PaintPhaseTextClip) {
- LayoutRect paintRect = logicalVisualOverflow;
- paintRect.moveBy(adjustedPaintOffset);
- drawingRecorder = adoptPtr(new DrawingRecorder(paintInfo.context, m_inlineTextBox.displayItemClient(), DisplayItem::paintPhaseToDrawingType(paintInfo.phase), paintRect));
+ drawingRecorder = adoptPtr(new DrawingRecorder(paintInfo.context, m_inlineTextBox.displayItemClient(), DisplayItem::paintPhaseToDrawingType(paintInfo.phase), boxRect));
Xianzhu 2015/03/06 23:17:06 Ditto.
if (drawingRecorder->canUseCachedDrawing())
return;
}
+ if (shouldRotate)
+ context->concatCTM(TextPainter::rotation(boxRect, TextPainter::Clockwise));
+
+
if (m_inlineTextBox.truncation() != cNoTruncation) {
if (m_inlineTextBox.renderer().containingBlock()->style()->isLeftToRightDirection() != m_inlineTextBox.isLeftToRightDirection()) {
// Make the visible fragment of text hug the edge closest to the rest of the run by moving the origin
@@ -100,30 +122,6 @@ void InlineTextBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint&
}
}
- GraphicsContext* context = paintInfo.context;
- const LayoutStyle& styleToUse = m_inlineTextBox.renderer().styleRef(m_inlineTextBox.isFirstLineStyle());
-
- FloatPoint boxOrigin = m_inlineTextBox.locationIncludingFlipping().toFloatPoint();
- boxOrigin.move(adjustedPaintOffset.x().toFloat(), adjustedPaintOffset.y().toFloat());
- FloatRect boxRect(boxOrigin, FloatSize(m_inlineTextBox.logicalWidth(), m_inlineTextBox.logicalHeight()));
-
- bool shouldRotate = false;
- LayoutTextCombine* combinedText = nullptr;
- if (!m_inlineTextBox.isHorizontal()) {
- if (styleToUse.hasTextCombine() && m_inlineTextBox.renderer().isCombineText()) {
- combinedText = &toLayoutTextCombine(m_inlineTextBox.renderer());
- if (!combinedText->isCombined())
- combinedText = nullptr;
- }
- if (combinedText) {
- combinedText->updateFont();
- boxRect.setWidth(combinedText->inlineWidthForLayout());
- } else {
- shouldRotate = true;
- context->concatCTM(TextPainter::rotation(boxRect, TextPainter::Clockwise));
- }
- }
-
// Determine whether or not we have composition underlines to draw.
bool containsComposition = m_inlineTextBox.renderer().node() && m_inlineTextBox.renderer().frame()->inputMethodController().compositionNode() == m_inlineTextBox.renderer().node();
bool useCustomUnderlines = containsComposition && m_inlineTextBox.renderer().frame()->inputMethodController().compositionUsesCustomUnderlines();
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698