Bug 1393706 - Compute display item's visibility when creating fallback data in layers-free mode. r=jrmuizel
MozReview-Commit-ID: 6eUnABLce2Z
--- 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) {