Bug 1402183 - Part 1: Make nsDisplayMask::CanMerge() symmetric draft
authorMiko Mynttinen <mikokm@gmail.com>
Fri, 22 Sep 2017 16:29:13 +0200
changeset 669484 4274d17014a4e412f20cb8a266d74bbd5499b78e
parent 669023 2cd3752963fc8f24f7c202687eab55e83222f608
child 669485 32b75c5facd2bedb14f8b62cf888996ede3615b1
push id81343
push userbmo:mikokm@gmail.com
push dateSat, 23 Sep 2017 16:49:11 +0000
bugs1402183
milestone58.0a1
Bug 1402183 - Part 1: Make nsDisplayMask::CanMerge() symmetric MozReview-Commit-ID: 6qqHVpbMg1b
layout/painting/nsDisplayList.cpp
--- 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()) {