Bug 1251995 part 7 - Use struct to pass params for nsTextFrame::Paint*Shadow functions. r=jfkthame

MozReview-Commit-ID: 5Wa9U0Ile4L

--HG--
extra : rebase_source : a568bb94fd7d51ed5308e2a1e13c308b67b143f2
This commit is contained in:
Xidorn Quan 2016-03-02 09:41:43 +08:00
Родитель a6408cb861
Коммит e64f114346
2 изменённых файлов: 63 добавлений и 67 удалений

Просмотреть файл

@ -5836,15 +5836,9 @@ AddHyphenToMetrics(nsTextFrame* aTextFrame, gfxTextRun* aBaseTextRun,
} }
void void
nsTextFrame::PaintOneShadow(Range aRange, nsTextFrame::PaintOneShadow(const PaintShadowParams& aParams,
nsCSSShadowItem* aShadowDetails, nsCSSShadowItem* aShadowDetails,
PropertyProvider* aProvider, gfxRect& aBoundingBox, uint32_t aBlurFlags)
const LayoutDeviceRect& aDirtyRect,
const gfxPoint& aFramePt, const gfxPoint& aTextBaselinePt,
gfxContext* aCtx, const nscolor& aForegroundColor,
const nsCharClipDisplayItem::ClipEdges& aClipEdges,
nscoord aLeftSideOffset, gfxRect& aBoundingBox,
uint32_t aBlurFlags)
{ {
PROFILER_LABEL("nsTextFrame", "PaintOneShadow", PROFILER_LABEL("nsTextFrame", "PaintOneShadow",
js::ProfileEntry::Category::GRAPHICS); js::ProfileEntry::Category::GRAPHICS);
@ -5865,12 +5859,12 @@ nsTextFrame::PaintOneShadow(Range aRange,
// for vertical-RL, reverse direction of x-coords of bounding box // for vertical-RL, reverse direction of x-coords of bounding box
shadowGfxRect.x = -shadowGfxRect.XMost(); shadowGfxRect.x = -shadowGfxRect.XMost();
} }
shadowGfxRect += shadowGfxRect += gfxPoint(aParams.textBaselinePt.x,
gfxPoint(aTextBaselinePt.x, aFramePt.y + aLeftSideOffset); aParams.framePt.y + aParams.leftSideOffset);
} else { } else {
shadowGfxRect = shadowGfxRect =
aBoundingBox + gfxPoint(aFramePt.x + aLeftSideOffset, aBoundingBox + gfxPoint(aParams.framePt.x + aParams.leftSideOffset,
aTextBaselinePt.y); aParams.textBaselinePt.y);
} }
shadowGfxRect += shadowOffset; shadowGfxRect += shadowOffset;
@ -5882,8 +5876,8 @@ nsTextFrame::PaintOneShadow(Range aRange,
nsContextBoxBlur contextBoxBlur; nsContextBoxBlur contextBoxBlur;
const auto A2D = PresContext()->AppUnitsPerDevPixel(); const auto A2D = PresContext()->AppUnitsPerDevPixel();
gfxContext* shadowContext = contextBoxBlur.Init( gfxContext* shadowContext = contextBoxBlur.Init(
shadowRect, 0, blurRadius, A2D, aCtx, shadowRect, 0, blurRadius, A2D, aParams.context,
LayoutDevicePixel::ToAppUnits(aDirtyRect, A2D), nullptr, aBlurFlags); LayoutDevicePixel::ToAppUnits(aParams.dirtyRect, A2D), nullptr, aBlurFlags);
if (!shadowContext) if (!shadowContext)
return; return;
@ -5893,13 +5887,13 @@ nsTextFrame::PaintOneShadow(Range aRange,
shadowColor = aShadowDetails->mColor; shadowColor = aShadowDetails->mColor;
decorationOverrideColor = &shadowColor; decorationOverrideColor = &shadowColor;
} else { } else {
shadowColor = aForegroundColor; shadowColor = aParams.foregroundColor;
decorationOverrideColor = nullptr; decorationOverrideColor = nullptr;
} }
aCtx->Save(); aParams.context->Save();
aCtx->NewPath(); aParams.context->NewPath();
aCtx->SetColor(Color::FromABGR(shadowColor)); aParams.context->SetColor(Color::FromABGR(shadowColor));
// Draw the text onto our alpha-only surface to capture the alpha values. // Draw the text onto our alpha-only surface to capture the alpha values.
// Remember that the box blur context has a device offset on it, so we don't need to // Remember that the box blur context has a device offset on it, so we don't need to
@ -5908,18 +5902,19 @@ nsTextFrame::PaintOneShadow(Range aRange,
nsTextPaintStyle textPaintStyle(this); nsTextPaintStyle textPaintStyle(this);
DrawTextParams params(shadowContext); DrawTextParams params(shadowContext);
params.advanceWidth = &advanceWidth; params.advanceWidth = &advanceWidth;
params.dirtyRect = aDirtyRect; params.dirtyRect = aParams.dirtyRect;
params.framePt = aFramePt + shadowOffset; params.framePt = aParams.framePt + shadowOffset;
params.provider = aProvider; params.provider = aParams.provider;
params.textStyle = &textPaintStyle; params.textStyle = &textPaintStyle;
params.textColor = aCtx == shadowContext ? shadowColor : NS_RGB(0, 0, 0); params.textColor =
params.clipEdges = &aClipEdges; aParams.context == shadowContext ? shadowColor : NS_RGB(0, 0, 0);
params.clipEdges = aParams.clipEdges;
params.drawSoftHyphen = (GetStateBits() & TEXT_HYPHEN_BREAK) != 0; params.drawSoftHyphen = (GetStateBits() & TEXT_HYPHEN_BREAK) != 0;
params.decorationOverrideColor = decorationOverrideColor; params.decorationOverrideColor = decorationOverrideColor;
DrawText(aRange, aTextBaselinePt + shadowOffset, params); DrawText(aParams.range, aParams.textBaselinePt + shadowOffset, params);
contextBoxBlur.DoPaint(); contextBoxBlur.DoPaint();
aCtx->Restore(); aParams.context->Restore();
} }
// Paints selection backgrounds and text in the correct colors. Also computes // Paints selection backgrounds and text in the correct colors. Also computes
@ -6031,6 +6026,10 @@ nsTextFrame::PaintTextWithSelectionColors(
params.advanceWidth = &advance; params.advanceWidth = &advance;
params.callbacks = aParams.callbacks; params.callbacks = aParams.callbacks;
PaintShadowParams shadowParams(aParams);
shadowParams.provider = aParams.provider;
shadowParams.clipEdges = &aClipEdges;
// Draw text // Draw text
const nsStyleText* textStyle = StyleText(); const nsStyleText* textStyle = StyleText();
SelectionIterator iterator(prevailingSelections, contentRange, SelectionIterator iterator(prevailingSelections, contentRange,
@ -6054,9 +6053,11 @@ nsTextFrame::PaintTextWithSelectionColors(
startEdge -= hyphenWidth + startEdge -= hyphenWidth +
mTextRun->GetAdvanceWidth(range, aParams.provider); mTextRun->GetAdvanceWidth(range, aParams.provider);
} }
PaintShadows( shadowParams.range = range;
shadow, range, aParams.dirtyRect, aParams.framePt, textBaselinePt, shadowParams.textBaselinePt = textBaselinePt;
startEdge, *aParams.provider, foreground, aClipEdges, aParams.context); shadowParams.foregroundColor = foreground;
shadowParams.leftSideOffset = startEdge;
PaintShadows(shadow, shadowParams);
} }
// Draw text segment // Draw text segment
@ -6402,30 +6403,23 @@ nsTextFrame::MeasureCharClippedText(PropertyProvider& aProvider,
void void
nsTextFrame::PaintShadows(nsCSSShadowArray* aShadow, nsTextFrame::PaintShadows(nsCSSShadowArray* aShadow,
Range aRange, const PaintShadowParams& aParams)
const LayoutDeviceRect& aDirtyRect,
const gfxPoint& aFramePt,
const gfxPoint& aTextBaselinePt,
nscoord aLeftEdgeOffset,
PropertyProvider& aProvider,
nscolor aForegroundColor,
const nsCharClipDisplayItem::ClipEdges& aClipEdges,
gfxContext* aCtx)
{ {
if (!aShadow) { if (!aShadow) {
return; return;
} }
gfxTextRun::Metrics shadowMetrics = gfxTextRun::Metrics shadowMetrics =
mTextRun->MeasureText(aRange, gfxFont::LOOSE_INK_EXTENTS, mTextRun->MeasureText(aParams.range, gfxFont::LOOSE_INK_EXTENTS,
nullptr, &aProvider); nullptr, aParams.provider);
if (GetWritingMode().IsLineInverted()) { if (GetWritingMode().IsLineInverted()) {
Swap(shadowMetrics.mAscent, shadowMetrics.mDescent); Swap(shadowMetrics.mAscent, shadowMetrics.mDescent);
shadowMetrics.mBoundingBox.y = -shadowMetrics.mBoundingBox.YMost(); shadowMetrics.mBoundingBox.y = -shadowMetrics.mBoundingBox.YMost();
} }
if (GetStateBits() & TEXT_HYPHEN_BREAK) { if (GetStateBits() & TEXT_HYPHEN_BREAK) {
AddHyphenToMetrics(this, mTextRun, &shadowMetrics, AddHyphenToMetrics(this, mTextRun, &shadowMetrics,
gfxFont::LOOSE_INK_EXTENTS, aCtx->GetDrawTarget()); gfxFont::LOOSE_INK_EXTENTS,
aParams.context->GetDrawTarget());
} }
// Add bounds of text decorations // Add bounds of text decorations
gfxRect decorationRect(0, -shadowMetrics.mAscent, gfxRect decorationRect(0, -shadowMetrics.mAscent,
@ -6452,12 +6446,8 @@ nsTextFrame::PaintShadows(nsCSSShadowArray* aShadow,
} }
for (uint32_t i = aShadow->Length(); i > 0; --i) { for (uint32_t i = aShadow->Length(); i > 0; --i) {
PaintOneShadow(aRange, aShadow->ShadowAt(i - 1), &aProvider, PaintOneShadow(aParams, aShadow->ShadowAt(i - 1),
aDirtyRect, aFramePt, aTextBaselinePt, aCtx, shadowMetrics.mBoundingBox, blurFlags);
aForegroundColor, aClipEdges,
aLeftEdgeOffset,
shadowMetrics.mBoundingBox,
blurFlags);
} }
} }
@ -6550,9 +6540,14 @@ nsTextFrame::PaintText(const PaintTextParams& aParams,
range = Range(startOffset, startOffset + maxLength); range = Range(startOffset, startOffset + maxLength);
if (!aParams.callbacks) { if (!aParams.callbacks) {
const nsStyleText* textStyle = StyleText(); const nsStyleText* textStyle = StyleText();
PaintShadows(textStyle->mTextShadow, range, aParams.dirtyRect, PaintShadowParams shadowParams(aParams);
aParams.framePt, textBaselinePt, snappedStartEdge, shadowParams.range = range;
provider, foregroundColor, clipEdges, aParams.context); shadowParams.textBaselinePt = textBaselinePt;
shadowParams.leftSideOffset = snappedStartEdge;
shadowParams.provider = &provider;
shadowParams.foregroundColor = foregroundColor;
shadowParams.clipEdges = &clipEdges;
PaintShadows(textStyle->mTextShadow, shadowParams);
} }
gfxFloat advanceWidth; gfxFloat advanceWidth;

Просмотреть файл

@ -617,29 +617,30 @@ protected:
nsRect UpdateTextEmphasis(mozilla::WritingMode aWM, nsRect UpdateTextEmphasis(mozilla::WritingMode aWM,
PropertyProvider& aProvider); PropertyProvider& aProvider);
void PaintOneShadow(Range aRange, struct PaintShadowParams
{
gfxTextRun::Range range;
LayoutDeviceRect dirtyRect;
gfxPoint framePt;
gfxPoint textBaselinePt;
gfxContext* context;
nscolor foregroundColor = NS_RGBA(0, 0, 0, 0);
const nsCharClipDisplayItem::ClipEdges* clipEdges = nullptr;
PropertyProvider* provider = nullptr;
nscoord leftSideOffset = 0;
explicit PaintShadowParams(const PaintTextParams& aParams)
: dirtyRect(aParams.dirtyRect)
, framePt(aParams.framePt)
, context(aParams.context) {}
};
void PaintOneShadow(const PaintShadowParams& aParams,
nsCSSShadowItem* aShadowDetails, nsCSSShadowItem* aShadowDetails,
PropertyProvider* aProvider,
const LayoutDeviceRect& aDirtyRect,
const gfxPoint& aFramePt,
const gfxPoint& aTextBaselinePt,
gfxContext* aCtx,
const nscolor& aForegroundColor,
const nsCharClipDisplayItem::ClipEdges& aClipEdges,
nscoord aLeftSideOffset,
gfxRect& aBoundingBox, gfxRect& aBoundingBox,
uint32_t aBlurFlags); uint32_t aBlurFlags);
void PaintShadows(nsCSSShadowArray* aShadow, void PaintShadows(nsCSSShadowArray* aShadow,
Range aRange, const PaintShadowParams& aParams);
const LayoutDeviceRect& aDirtyRect,
const gfxPoint& aFramePt,
const gfxPoint& aTextBaselinePt,
nscoord aLeftEdgeOffset,
PropertyProvider& aProvider,
nscolor aForegroundColor,
const nsCharClipDisplayItem::ClipEdges& aClipEdges,
gfxContext* aCtx);
struct LineDecoration { struct LineDecoration {
nsIFrame* mFrame; nsIFrame* mFrame;