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:
cku 2016-10-13 18:35:35 +08:00
parent bba6d2557f
commit abdaa5d307
6 changed files with 42 additions and 13 deletions

View File

@ -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();

View File

@ -3913,6 +3913,13 @@ public:
void PaintAsLayer(nsDisplayListBuilder* aBuilder,
nsRenderingContext* aCtx,
LayerManager* aManager);
const nsTArray<nsRect>& GetDestRects()
{
return mDestRects;
}
private:
nsTArray<nsRect> mDestRects;
};
/**

View File

@ -119,6 +119,7 @@ nsDisplayMaskGeometry::nsDisplayMaskGeometry(nsDisplayMask* aItem, nsDisplayList
, mBBox(aItem->BBoxInUserSpace())
, mUserSpaceOffset(aItem->UserSpaceOffset())
, mFrameOffsetToReferenceFrame(aItem->ToReferenceFrame())
, mDestRects(aItem->GetDestRects())
{}
void

View File

@ -277,6 +277,8 @@ public:
gfxRect mBBox;
gfxPoint mUserSpaceOffset;
nsPoint mFrameOffsetToReferenceFrame;
nsTArray<nsRect> mDestRects;
};
class nsDisplayFilterGeometry : public nsDisplayItemGeometry

View File

@ -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;

View File

@ -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() {