Bug 1418893 - Check opacity changes when computing mask's invalidation region. r=mattwoodrow
MozReview-Commit-ID: 54XDjoh67Mb
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -9634,16 +9634,21 @@ nsDisplayMask::ComputeInvalidationRegion
nsDisplaySVGEffects::ComputeInvalidationRegion(aBuilder, aGeometry,
aInvalidRegion);
const nsDisplayMaskGeometry* geometry =
static_cast<const nsDisplayMaskGeometry*>(aGeometry);
bool snap;
nsRect bounds = GetBounds(aBuilder, &snap);
+ if (mFrame->StyleEffects()->mOpacity != geometry->mOpacity ||
+ mHandleOpacity != geometry->mHandleOpacity) {
+ aInvalidRegion->Or(*aInvalidRegion, bounds);
+ }
+
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;
}
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -5588,16 +5588,20 @@ public:
virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
HitTestState* aState,
nsTArray<nsIFrame*> *aOutFrames) override;
virtual bool ShouldFlattenAway(nsDisplayListBuilder* aBuilder) override {
return false;
}
+ bool ShouldHandleOpacity() {
+ return mHandleOpacity;
+ }
+
gfxRect BBoxInUserSpace() const;
gfxPoint UserSpaceOffset() const;
virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
const nsDisplayItemGeometry* aGeometry,
nsRegion* aInvalidRegion) const override;
protected:
bool ValidateSVGFrame();
--- a/layout/painting/nsDisplayListInvalidation.cpp
+++ b/layout/painting/nsDisplayListInvalidation.cpp
@@ -127,16 +127,18 @@ nsDisplaySVGEffectGeometry::MoveBy(const
mBounds.MoveBy(aOffset);
mFrameOffsetToReferenceFrame += aOffset;
}
nsDisplayMaskGeometry::nsDisplayMaskGeometry(nsDisplayMask* aItem, nsDisplayListBuilder* aBuilder)
: nsDisplaySVGEffectGeometry(aItem, aBuilder)
, nsImageGeometryMixin(aItem, aBuilder)
, mDestRects(aItem->GetDestRects())
+ , mOpacity(aItem->Frame()->StyleEffects()->mOpacity)
+ , mHandleOpacity(aItem->ShouldHandleOpacity())
{}
nsDisplayFilterGeometry::nsDisplayFilterGeometry(nsDisplayFilter* aItem, nsDisplayListBuilder* aBuilder)
: nsDisplaySVGEffectGeometry(aItem, aBuilder)
, nsImageGeometryMixin(aItem, aBuilder)
{}
nsCharClipGeometry::nsCharClipGeometry(nsCharClipDisplayItem* aItem, nsDisplayListBuilder* aBuilder)
--- a/layout/painting/nsDisplayListInvalidation.h
+++ b/layout/painting/nsDisplayListInvalidation.h
@@ -308,16 +308,18 @@ public:
nsDisplayMaskGeometry(nsDisplayMask* aItem, nsDisplayListBuilder* aBuilder);
virtual bool InvalidateForSyncDecodeImages() const override
{
return ShouldInvalidateToSyncDecodeImages();
}
nsTArray<nsRect> mDestRects;
+ float mOpacity;
+ bool mHandleOpacity;
};
class nsDisplayFilterGeometry : public nsDisplaySVGEffectGeometry
, public nsImageGeometryMixin<nsDisplayFilterGeometry>
{
public:
nsDisplayFilterGeometry(nsDisplayFilter* aItem,
nsDisplayListBuilder* aBuilder);