Bug 1415214 - (Part 1) Fix the bound of the clip rect for drawing decoration lines. r=jfkthame
☠☠ backed out by 257e3b6e6cf8 ☠ ☠
authorTommy Kuo <kuoe0@mozilla.com>
Fri, 10 Nov 2017 13:53:05 +0800
changeset 391067 dbd2b14a7466ce46b5b66056df599416e38d5b8d
parent 391066 2ed0ff57330d5dc9b54d980bb034df17a7fb3e47
child 391068 54a656b4c58718bbd3bf672a2dec8e017d165406
push id97188
push usermtseng@mozilla.com
push dateFri, 10 Nov 2017 05:53:53 +0000
treeherdermozilla-inbound@54a656b4c587 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjfkthame
bugs1415214
milestone58.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1415214 - (Part 1) Fix the bound of the clip rect for drawing decoration lines. r=jfkthame MozReview-Commit-ID: L534I2s3xTi
layout/generic/nsTextFrame.cpp
--- a/layout/generic/nsTextFrame.cpp
+++ b/layout/generic/nsTextFrame.cpp
@@ -7280,29 +7280,34 @@ nsTextFrame::DrawTextRunAndDecorations(R
     //   "text-combine-upright" (Bug 1408825)
     bool skipClipping = aRange.Length() == mTextRun->GetLength() ||
                         verticalDec != verticalRun;
 
     gfxRect clipRect;
     if (!skipClipping) {
       // Get the inline-size according to the specified range.
       gfxFloat clipLength = mTextRun->GetAdvanceWidth(aRange, aParams.provider);
-
-      clipRect.width = verticalDec ? frameSize.width : clipLength / app;
-      clipRect.height = verticalDec ? clipLength / app : frameSize.height;
+      nsRect visualRect = GetVisualOverflowRect();
 
       const bool isInlineReversed = mTextRun->IsInlineReversed();
       if (verticalDec) {
-        clipRect.y = (isInlineReversed ? aTextBaselinePt.y - clipLength
-                                       : aTextBaselinePt.y) / app;
+        clipRect.x = aParams.framePt.x + visualRect.x;
+        clipRect.y = isInlineReversed ? aTextBaselinePt.y - clipLength
+                                      : aTextBaselinePt.y;
+        clipRect.width = visualRect.width;
+        clipRect.height = clipLength;
       } else {
-        clipRect.x = (isInlineReversed ? aTextBaselinePt.x - clipLength
-                                       : aTextBaselinePt.x) / app;
-      }
-
+        clipRect.x = isInlineReversed ? aTextBaselinePt.x - clipLength
+                                      : aTextBaselinePt.x;
+        clipRect.y = aParams.framePt.y + visualRect.y;
+        clipRect.width = clipLength;
+        clipRect.height = visualRect.height;
+      }
+
+      clipRect.Scale(1 / app);
       clipRect.Round();
       params.context->Clip(clipRect);
     }
 
     // Underlines
     params.decoration = NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE;
     for (const LineDecoration& dec : Reversed(aDecorations.mUnderlines)) {
       paintDecorationLine(dec, &Metrics::underlineSize,