author | Jonathan Kew <jkew@mozilla.com> |
Mon, 27 Apr 2015 09:35:59 +0100 | |
changeset 241092 | e5b77cbe4bbc9de13fea99b816029e09128d900d |
parent 241091 | b371db0898943674968815abf05bd555e4d70785 |
child 241093 | 4a4c3607809e16a96083686b24befbf9b9998118 |
push id | 59032 |
push user | jkew@mozilla.com |
push date | Mon, 27 Apr 2015 08:36:23 +0000 |
treeherder | mozilla-inbound@4a4c3607809e [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | smontagu |
bugs | 1154227 |
milestone | 40.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
|
--- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -5554,18 +5554,35 @@ nsTextFrame::PaintOneShadow(uint32_t aOf js::ProfileEntry::Category::GRAPHICS); gfxPoint shadowOffset(aShadowDetails->mXOffset, aShadowDetails->mYOffset); nscoord blurRadius = std::max(aShadowDetails->mRadius, 0); // This rect is the box which is equivalent to where the shadow will be painted. // The origin of aBoundingBox is the text baseline left, so we must translate it by // that much in order to make the origin the top-left corner of the text bounding box. - gfxRect shadowGfxRect = aBoundingBox + - gfxPoint(aFramePt.x + aLeftSideOffset, aTextBaselinePt.y) + shadowOffset; + // Note that aLeftSideOffset is line-left, so actually means top offset in + // vertical writing modes. + gfxRect shadowGfxRect; + WritingMode wm = GetWritingMode(); + if (wm.IsVertical()) { + shadowGfxRect = aBoundingBox; + if (wm.IsVerticalRL()) { + // for vertical-RL, reverse direction of x-coords of bounding box + shadowGfxRect.x = -shadowGfxRect.XMost(); + } + shadowGfxRect += + gfxPoint(aTextBaselinePt.x, aFramePt.y + aLeftSideOffset); + } else { + shadowGfxRect = + aBoundingBox + gfxPoint(aFramePt.x + aLeftSideOffset, + aTextBaselinePt.y); + } + shadowGfxRect += shadowOffset; + nsRect shadowRect(NSToCoordRound(shadowGfxRect.X()), NSToCoordRound(shadowGfxRect.Y()), NSToCoordRound(shadowGfxRect.Width()), NSToCoordRound(shadowGfxRect.Height())); nsContextBoxBlur contextBoxBlur; gfxContext* shadowContext = contextBoxBlur.Init(shadowRect, 0, blurRadius, PresContext()->AppUnitsPerDevPixel(), @@ -6068,16 +6085,20 @@ nsTextFrame::PaintShadows(nsCSSShadowArr { if (!aShadow) { return; } gfxTextRun::Metrics shadowMetrics = mTextRun->MeasureText(aOffset, aLength, gfxFont::LOOSE_INK_EXTENTS, nullptr, &aProvider); + if (GetWritingMode().IsLineInverted()) { + Swap(shadowMetrics.mAscent, shadowMetrics.mDescent); + shadowMetrics.mBoundingBox.y = -shadowMetrics.mBoundingBox.YMost(); + } if (GetStateBits() & TEXT_HYPHEN_BREAK) { AddHyphenToMetrics(this, mTextRun, &shadowMetrics, gfxFont::LOOSE_INK_EXTENTS, aCtx); } // Add bounds of text decorations gfxRect decorationRect(0, -shadowMetrics.mAscent, shadowMetrics.mAdvanceWidth, shadowMetrics.mAscent + shadowMetrics.mDescent); shadowMetrics.mBoundingBox.UnionRect(shadowMetrics.mBoundingBox, @@ -6091,16 +6112,21 @@ nsTextFrame::PaintShadows(nsCSSShadowArr while (numGlyphRuns-- > 0) { if (run->mFont->AlwaysNeedsMaskForShadow()) { blurFlags = nsContextBoxBlur::FORCE_MASK; break; } run++; } + if (mTextRun->IsVertical()) { + Swap(shadowMetrics.mBoundingBox.x, shadowMetrics.mBoundingBox.y); + Swap(shadowMetrics.mBoundingBox.width, shadowMetrics.mBoundingBox.height); + } + for (uint32_t i = aShadow->Length(); i > 0; --i) { PaintOneShadow(aOffset, aLength, aShadow->ShadowAt(i - 1), &aProvider, aDirtyRect, aFramePt, aTextBaselinePt, aCtx, aForegroundColor, aClipEdges, aLeftEdgeOffset, shadowMetrics.mBoundingBox, blurFlags);