зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
a6408cb861
Коммит
e64f114346
|
@ -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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче