Bug 1442190 - Part 1: Add nsDisplayOpacityGeometry
MozReview-Commit-ID: K7WqIlib10v
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -6636,16 +6636,30 @@ nsDisplayOpacity::ComputeVisibility(nsDi
nsRect bounds = GetClippedBounds(aBuilder);
nsRegion visibleUnderChildren;
visibleUnderChildren.And(*aVisibleRegion, bounds);
return
nsDisplayWrapList::ComputeVisibility(aBuilder, &visibleUnderChildren);
}
void
+nsDisplayOpacity::ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
+ const nsDisplayItemGeometry* aGeometry,
+ nsRegion* aInvalidRegion) const
+{
+ const nsDisplayOpacityGeometry* geometry =
+ static_cast<const nsDisplayOpacityGeometry*>(aGeometry);
+
+ bool snap;
+ if (mOpacity != geometry->mOpacity) {
+ aInvalidRegion->Or(GetBounds(aBuilder, &snap), geometry->mBounds);
+ }
+}
+
+void
nsDisplayOpacity::WriteDebugInfo(std::stringstream& aStream)
{
aStream << " (opacity " << mOpacity << ")";
}
bool
nsDisplayOpacity::CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
mozilla::wr::IpcResourceUpdateQueue& aResources,
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -5200,22 +5200,25 @@ public:
virtual bool CanMerge(const nsDisplayItem* aItem) const override
{
// items for the same content element should be merged into a single
// compositing group
// aItem->GetUnderlyingFrame() returns non-null because it's nsDisplayOpacity
return HasSameTypeAndClip(aItem) && HasSameContent(aItem);
}
+ virtual nsDisplayItemGeometry* AllocateGeometry(nsDisplayListBuilder* aBuilder) override
+ {
+ return new nsDisplayOpacityGeometry(this, aBuilder, mOpacity);
+ }
+
virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
const nsDisplayItemGeometry* aGeometry,
- nsRegion* aInvalidRegion) const override
- {
- // We don't need to compute an invalidation region since we have LayerTreeInvalidation
- }
+ nsRegion* aInvalidRegion) const override;
+
virtual bool IsInvalid(nsRect& aRect) const override
{
if (mForEventsAndPluginsOnly) {
return false;
}
return nsDisplayWrapList::IsInvalid(aRect);
}
virtual void ApplyOpacity(nsDisplayListBuilder* aBuilder,
--- a/layout/painting/nsDisplayListInvalidation.h
+++ b/layout/painting/nsDisplayListInvalidation.h
@@ -348,9 +348,22 @@ public:
virtual bool InvalidateForSyncDecodeImages() const override
{
return ShouldInvalidateToSyncDecodeImages();
}
nsPoint mFrameOffsetToViewport;
};
+class nsDisplayOpacityGeometry : public nsDisplayItemGenericGeometry
+{
+public:
+ nsDisplayOpacityGeometry(nsDisplayItem* aItem,
+ nsDisplayListBuilder* aBuilder,
+ float aOpacity)
+ : nsDisplayItemGenericGeometry(aItem, aBuilder)
+ , mOpacity(aOpacity)
+ {}
+
+ float mOpacity;
+};
+
#endif /*NSDISPLAYLISTINVALIDATION_H_*/