mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-17 22:32:51 +00:00
Bug 1309646 - Part 3. Use nsChangeHint_UpdateBackgroundPosition in position mask. r=mstange
MozReview-Commit-ID: CeLPAN8OdhF --HG-- extra : rebase_source : cdd4808fe3b42a4cf6e610c8f106732744afe330
This commit is contained in:
parent
bba6d2557f
commit
abdaa5d307
@ -6952,6 +6952,21 @@ nsDisplayMask::nsDisplayMask(nsDisplayListBuilder* aBuilder,
|
||||
: nsDisplaySVGEffects(aBuilder, aFrame, aList, aHandleOpacity, aScrollClip)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsDisplayMask);
|
||||
|
||||
nsPresContext* presContext = mFrame->PresContext();
|
||||
uint32_t flags = aBuilder->GetBackgroundPaintFlags() |
|
||||
nsCSSRendering::PAINTBG_MASK_IMAGE;
|
||||
const nsStyleSVGReset *svgReset = aFrame->StyleSVGReset();
|
||||
NS_FOR_VISIBLE_IMAGE_LAYERS_BACK_TO_FRONT(i, svgReset->mMask) {
|
||||
bool isTransformedFixed;
|
||||
nsBackgroundLayerState state =
|
||||
nsCSSRendering::PrepareImageLayer(presContext, aFrame, flags,
|
||||
mFrame->GetRectRelativeToSelf(),
|
||||
mFrame->GetRectRelativeToSelf(),
|
||||
svgReset->mMask.mLayers[i],
|
||||
&isTransformedFixed);
|
||||
mDestRects.AppendElement(state.mDestArea);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NS_BUILD_REFCNT_LOGGING
|
||||
@ -7057,6 +7072,18 @@ nsDisplayMask::ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
|
||||
static_cast<const nsDisplayMaskGeometry*>(aGeometry);
|
||||
bool snap;
|
||||
nsRect bounds = GetBounds(aBuilder, &snap);
|
||||
|
||||
if (mDestRects.Length() != geometry->mDestRects.Length()) {
|
||||
aInvalidRegion->Or(bounds, geometry->mBounds);
|
||||
} else {
|
||||
for (size_t i = 0; i < mDestRects.Length(); i++) {
|
||||
if (!mDestRects[i].IsEqualInterior(geometry->mDestRects[i])) {
|
||||
aInvalidRegion->Or(bounds, geometry->mBounds);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (aBuilder->ShouldSyncDecodeImages() &&
|
||||
geometry->ShouldInvalidateToSyncDecodeImages()) {
|
||||
const nsStyleSVGReset *svgReset = mFrame->StyleSVGReset();
|
||||
|
@ -3913,6 +3913,13 @@ public:
|
||||
void PaintAsLayer(nsDisplayListBuilder* aBuilder,
|
||||
nsRenderingContext* aCtx,
|
||||
LayerManager* aManager);
|
||||
|
||||
const nsTArray<nsRect>& GetDestRects()
|
||||
{
|
||||
return mDestRects;
|
||||
}
|
||||
private:
|
||||
nsTArray<nsRect> mDestRects;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -119,6 +119,7 @@ nsDisplayMaskGeometry::nsDisplayMaskGeometry(nsDisplayMask* aItem, nsDisplayList
|
||||
, mBBox(aItem->BBoxInUserSpace())
|
||||
, mUserSpaceOffset(aItem->UserSpaceOffset())
|
||||
, mFrameOffsetToReferenceFrame(aItem->ToReferenceFrame())
|
||||
, mDestRects(aItem->GetDestRects())
|
||||
{}
|
||||
|
||||
void
|
||||
|
@ -277,6 +277,8 @@ public:
|
||||
gfxRect mBBox;
|
||||
gfxPoint mUserSpaceOffset;
|
||||
nsPoint mFrameOffsetToReferenceFrame;
|
||||
|
||||
nsTArray<nsRect> mDestRects;
|
||||
};
|
||||
|
||||
class nsDisplayFilterGeometry : public nsDisplayItemGeometry
|
||||
|
@ -2380,11 +2380,6 @@ nsChangeHint
|
||||
nsStyleImageLayers::CalcDifference(const nsStyleImageLayers& aNewLayers,
|
||||
nsStyleImageLayers::LayerType aType) const
|
||||
{
|
||||
nsChangeHint positionChangeHint =
|
||||
(aType == nsStyleImageLayers::LayerType::Background)
|
||||
? nsChangeHint_UpdateBackgroundPosition
|
||||
: nsChangeHint_RepaintFrame;
|
||||
|
||||
nsChangeHint hint = nsChangeHint(0);
|
||||
|
||||
const nsStyleImageLayers& moreLayers =
|
||||
@ -2397,8 +2392,7 @@ nsStyleImageLayers::CalcDifference(const nsStyleImageLayers& aNewLayers,
|
||||
NS_FOR_VISIBLE_IMAGE_LAYERS_BACK_TO_FRONT(i, moreLayers) {
|
||||
if (i < lessLayers.mImageCount) {
|
||||
nsChangeHint layerDifference =
|
||||
moreLayers.mLayers[i].CalcDifference(lessLayers.mLayers[i],
|
||||
positionChangeHint);
|
||||
moreLayers.mLayers[i].CalcDifference(lessLayers.mLayers[i]);
|
||||
hint |= layerDifference;
|
||||
if (layerDifference &&
|
||||
((moreLayers.mLayers[i].mImage.GetType() == eStyleImageType_Element) ||
|
||||
@ -2686,8 +2680,7 @@ nsStyleImageLayers::Layer::operator==(const Layer& aOther) const
|
||||
}
|
||||
|
||||
nsChangeHint
|
||||
nsStyleImageLayers::Layer::CalcDifference(const nsStyleImageLayers::Layer& aNewLayer,
|
||||
nsChangeHint aPositionChangeHint) const
|
||||
nsStyleImageLayers::Layer::CalcDifference(const nsStyleImageLayers::Layer& aNewLayer) const
|
||||
{
|
||||
nsChangeHint hint = nsChangeHint(0);
|
||||
if (!DefinitelyEqualURIs(mSourceURI, aNewLayer.mSourceURI)) {
|
||||
@ -2743,7 +2736,7 @@ nsStyleImageLayers::Layer::CalcDifference(const nsStyleImageLayers::Layer& aNewL
|
||||
}
|
||||
|
||||
if (mPosition != aNewLayer.mPosition) {
|
||||
hint |= aPositionChangeHint;
|
||||
hint |= nsChangeHint_UpdateBackgroundPosition;
|
||||
}
|
||||
|
||||
return hint;
|
||||
|
@ -740,9 +740,7 @@ struct nsStyleImageLayers {
|
||||
bool RenderingMightDependOnPositioningAreaSizeChange() const;
|
||||
|
||||
// Compute the change hint required by changes in just this layer.
|
||||
// aPositionChangeHint indicates the hint for position change.
|
||||
nsChangeHint CalcDifference(const Layer& aNewLayer,
|
||||
nsChangeHint aPositionChangeHint) const;
|
||||
nsChangeHint CalcDifference(const Layer& aNewLayer) const;
|
||||
|
||||
// An equality operator that compares the images using URL-equality
|
||||
// rather than pointer-equality.
|
||||
@ -3669,6 +3667,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleSVGReset
|
||||
nsChangeHint_UpdateOverflow |
|
||||
nsChangeHint_NeutralChange |
|
||||
nsChangeHint_RepaintFrame |
|
||||
nsChangeHint_UpdateBackgroundPosition |
|
||||
NS_STYLE_HINT_REFLOW;
|
||||
}
|
||||
static nsChangeHint DifferenceAlwaysHandledForDescendants() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user