Bug 1393706 - Compute display item's visibility when creating fallback data in layers-free mode. r=jrmuizel draft
authorEthan Lin <ethlin@mozilla.com>
Fri, 25 Aug 2017 16:36:15 +0800
changeset 654068 080f541082d4d95ef8816a99a22409f6bff27338
parent 652858 9b5d8b83230c8457dbb3f785c4c9a3ee1331c1cc
child 728473 1650ca8a230594999e4b04f03cf50bec1e6f9f99
push id76473
push userbmo:ethlin@mozilla.com
push dateMon, 28 Aug 2017 08:43:31 +0000
reviewersjrmuizel
bugs1393706
milestone57.0a1
Bug 1393706 - Compute display item's visibility when creating fallback data in layers-free mode. r=jrmuizel MozReview-Commit-ID: 6eUnABLce2Z
gfx/layers/wr/WebRenderLayerManager.cpp
--- a/gfx/layers/wr/WebRenderLayerManager.cpp
+++ b/gfx/layers/wr/WebRenderLayerManager.cpp
@@ -502,16 +502,23 @@ WebRenderLayerManager::GenerateFallbackD
   nsRect itemBounds = aItem->GetBounds(aDisplayListBuilder, &snap);
   nsRect clippedBounds = itemBounds;
 
   const DisplayItemClip& clip = aItem->GetClip();
   if (clip.HasClip()) {
     clippedBounds = itemBounds.Intersect(clip.GetClipRect());
   }
 
+  // nsDisplayItem::Paint() may refer the variables that come from ComputeVisibility().
+  // So we should call ComputeVisibility() before painting. e.g.: nsDisplayBoxShadowInner
+  // uses mVisibleRegion in Paint() and mVisibleRegion is computed in
+  // nsDisplayBoxShadowInner::ComputeVisibility().
+  nsRegion visibleRegion(clippedBounds);
+  aItem->ComputeVisibility(aDisplayListBuilder, &visibleRegion);
+
   const int32_t appUnitsPerDevPixel = aItem->Frame()->PresContext()->AppUnitsPerDevPixel();
   LayerRect bounds = ViewAs<LayerPixel>(
       LayoutDeviceRect::FromAppUnits(clippedBounds, appUnitsPerDevPixel),
       PixelCastJustification::WebRenderHasUnitResolution);
 
   LayerIntSize imageSize = RoundedToInt(bounds.Size());
   aImageRect = LayerRect(LayerPoint(0, 0), LayerSize(imageSize));
   if (imageSize.width == 0 || imageSize.height == 0) {