Bug 1234485 - Part 4. Implement nsDisplayMask::ShouldPaintOnMaskLayer.
MozReview-Commit-ID: CChi1vbLLh8
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -7052,19 +7052,47 @@ nsDisplayMask::BuildLayer(nsDisplayListB
return container.forget();
}
LayerState
nsDisplayMask::GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aParameters)
{
+ if (ShouldPaintOnMaskLayer(aManager)) {
+ return RequiredLayerStateForChildren(aBuilder, aManager, aParameters,
+ mList, GetAnimatedGeometryRoot());
+ }
+
return LAYER_SVG_EFFECTS;
}
+bool nsDisplayMask::ShouldPaintOnMaskLayer(LayerManager* aManager)
+{
+ if (!aManager->IsCompositingCheap()) {
+ return false;
+ }
+
+ nsSVGIntegrationUtils::MaskUsage maskUsage;
+ nsSVGIntegrationUtils::DetermineMaskUsage(mFrame, mHandleOpacity, maskUsage);
+
+ if (!maskUsage.shouldGenerateMaskLayer ||
+ maskUsage.opacity != 1.0 || maskUsage.shouldApplyClipPath ||
+ maskUsage.shouldApplyBasicShape ||
+ maskUsage.shouldGenerateClipMaskLayer) {
+ return false;
+ }
+
+ if (!nsSVGIntegrationUtils::IsMaskResourceReady(mFrame)) {
+ return false;
+ }
+
+ return true;
+}
+
bool nsDisplayMask::ComputeVisibility(nsDisplayListBuilder* aBuilder,
nsRegion* aVisibleRegion)
{
// Our children may be made translucent or arbitrarily deformed so we should
// not allow them to subtract area from aVisibleRegion.
nsRegion childrenVisible(mVisibleRect);
nsRect r = mVisibleRect.Intersect(mList.GetBounds(aBuilder));
mList.ComputeVisibilityForSublist(aBuilder, &childrenVisible, r);
--- a/layout/base/nsDisplayList.h
+++ b/layout/base/nsDisplayList.h
@@ -3913,16 +3913,20 @@ public:
nsRenderingContext* aCtx,
LayerManager* aManager);
const nsTArray<nsRect>& GetDestRects()
{
return mDestRects;
}
private:
+ // According to mask property and the capability of aManager, determine
+ // whether paint mask onto a dedicate mask layer.
+ bool ShouldPaintOnMaskLayer(LayerManager* aManager);
+
nsTArray<nsRect> mDestRects;
};
/**
* A display item to paint a stacking context with filter effects set by the
* stacking context root frame's style.
*/
class nsDisplayFilter : public nsDisplaySVGEffects {