Index: third_party/WebKit/Source/core/paint/PaintLayer.cpp |
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp |
index f93d85f709d718c91fd9709c95732111197a0b20..c2d92f6dd3ee80333735cbba8640fb2c889c2395 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp |
@@ -1106,7 +1106,7 @@ LayoutRect PaintLayer::transparencyClipBox(const PaintLayer* layer, const PaintL |
// paints unfragmented. |
LayoutRect clipRect = layer->physicalBoundingBox(LayoutPoint()); |
expandClipRectForDescendantsAndReflection(clipRect, layer, layer, transparencyBehavior, subPixelAccumulation, globalPaintFlags); |
- LayoutRect result = enclosingLayoutRect(transform.mapRect(layer->mapRectForFilter(FloatRect(clipRect)))); |
+ LayoutRect result = enclosingLayoutRect(transform.mapRect(layer->mapRectToAffectedFilterRegion(FloatRect(clipRect)))); |
if (!paginationLayer) |
return result; |
@@ -1124,7 +1124,7 @@ LayoutRect PaintLayer::transparencyClipBox(const PaintLayer* layer, const PaintL |
LayoutRect clipRect = layer->shouldFragmentCompositedBounds(rootLayer) ? layer->fragmentsBoundingBox(rootLayer) : layer->physicalBoundingBox(rootLayer); |
expandClipRectForDescendantsAndReflection(clipRect, layer, rootLayer, transparencyBehavior, subPixelAccumulation, globalPaintFlags); |
- clipRect = layer->mapLayoutRectForFilter(clipRect); |
+ clipRect = layer->mapLayoutRectToAffectedFilterRegion(clipRect); |
clipRect.move(subPixelAccumulation); |
return clipRect; |
} |
@@ -2250,7 +2250,7 @@ LayoutRect PaintLayer::boundingBoxForCompositing(const PaintLayer* ancestorLayer |
// Only enlarge by the filter outsets if we know the filter is going to be rendered in software. |
// Accelerated filters will handle their own outsets. |
if (paintsWithFilters()) |
- result = mapLayoutRectForFilter(result); |
+ result = mapLayoutRectToAffectedFilterRegion(result); |
} |
if (transform() && (options == IncludeTransformsAndCompositedChildLayers || ((paintsWithTransform(GlobalPaintNormalPhase) && (this != ancestorLayer || options == MaybeIncludeTransformForAncestorLayer))))) |
@@ -2741,7 +2741,7 @@ FilterEffect* PaintLayer::lastFilterEffect() const |
return builder->lastEffect(); |
} |
-FloatRect PaintLayer::mapRectForFilter(const FloatRect& rect) const |
+FloatRect PaintLayer::mapRectToAffectedFilterRegion(const FloatRect& rect) const |
{ |
if (!hasFilterThatMovesPixels()) |
return rect; |
@@ -2749,14 +2749,23 @@ FloatRect PaintLayer::mapRectForFilter(const FloatRect& rect) const |
updateFilterEffectBuilder(); |
FilterOperations filterOperations = computeFilterOperations(layoutObject()->styleRef()); |
- return filterOperations.mapRect(rect); |
+ FloatRect filteredRect = filterOperations.mapRect(rect); |
+ |
+ // Some reference filters (e.g., FETurbulence, FETile) have effect bounds |
+ // determined by the filter itself instead of the source rect. |
+ if (filterOperations.hasReferenceFilter()) { |
+ if (FilterEffect* lastEffect = lastFilterEffect()) |
+ filteredRect.unite(lastEffect->determineFilterPrimitiveSubregion(MapRectForward)); |
Stephen White
2016/08/25 15:03:14
I think this is papering over the problem. I think
pdr.
2016/08/29 17:51:12
I've filed https://crbug.com/642035 as a brain-dum
|
+ } |
+ |
+ return filteredRect; |
} |
-LayoutRect PaintLayer::mapLayoutRectForFilter(const LayoutRect& rect) const |
+LayoutRect PaintLayer::mapLayoutRectToAffectedFilterRegion(const LayoutRect& rect) const |
{ |
if (!hasFilterThatMovesPixels()) |
return rect; |
- return enclosingLayoutRect(mapRectForFilter(FloatRect(rect))); |
+ return enclosingLayoutRect(mapRectToAffectedFilterRegion(FloatRect(rect))); |
} |
bool PaintLayer::hasFilterThatMovesPixels() const |