Bug 1402183 - Part 1: Make nsDisplayMask::CanMerge() symmetric
MozReview-Commit-ID: 6qqHVpbMg1b
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -8949,27 +8949,46 @@ nsDisplayMask::nsDisplayMask(nsDisplayLi
#ifdef NS_BUILD_REFCNT_LOGGING
nsDisplayMask::~nsDisplayMask()
{
MOZ_COUNT_DTOR(nsDisplayMask);
}
#endif
+static bool
+CanMergeDisplayMaskFrame(nsIFrame* aFrame)
+{
+ // Do not merge items for box-decoration-break:clone elements,
+ // since each box should have its own mask in that case.
+ if (aFrame->StyleBorder()->mBoxDecorationBreak ==
+ mozilla::StyleBoxDecorationBreak::Clone) {
+ return false;
+ }
+
+ // Do not merge if either frame has a mask. Continuation frames should apply
+ // the mask independently (just like nsDisplayBackgroundImage).
+ if (aFrame->StyleSVGReset()->HasMask()) {
+ return false;
+ }
+
+ return true;
+}
+
bool
nsDisplayMask::CanMerge(const nsDisplayItem* aItem) const
{
// Items for the same content element should be merged into a single
// compositing group.
- // Do not merge if mFrame has mask. Continuation frames should apply mask
- // independently (just like nsDisplayBackgroundImage).
- return HasSameTypeAndClip(aItem) && HasSameContent(aItem) &&
- !mFrame->StyleSVGReset()->HasMask() &&
- (mFrame->StyleBorder()->mBoxDecorationBreak !=
- mozilla::StyleBoxDecorationBreak::Clone);
+ if (!HasSameTypeAndClip(aItem) || !HasSameContent(aItem)) {
+ return false;
+ }
+
+ return CanMergeDisplayMaskFrame(mFrame) &&
+ CanMergeDisplayMaskFrame(aItem->Frame());
}
already_AddRefed<Layer>
nsDisplayMask::BuildLayer(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aContainerParameters)
{
if (!ValidateSVGFrame()) {