| Summary: | Filters aren't applied to elements in columns after the first | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| Product: | WebKit | Reporter: | Simon Fraser (smfr) <simon.fraser> | ||||||
| Component: | Layout and Rendering | Assignee: | Dean Jackson <dino> | ||||||
| Status: | RESOLVED FIXED | ||||||||
| Severity: | Normal | CC: | commit-queue, dino, esprehn+autocc, glenn, kondapallykalyan, krit, simon.fraser, webkit-bug-importer | ||||||
| Priority: | P2 | Keywords: | InRadar | ||||||
| Version: | 528+ (Nightly build) | ||||||||
| Hardware: | Unspecified | ||||||||
| OS: | Unspecified | ||||||||
| Bug Depends on: | |||||||||
| Bug Blocks: | 144043 | ||||||||
| Attachments: |
|
||||||||
|
Description
Simon Fraser (smfr)
2015-01-09 20:58:17 PST
Created attachment 244402 [details]
Testcase
The rootRelativeBounds computed by RenderLayer::setupFilters() doesn't take columns into account. clip-path is similarly broken. Fix is something like this:
diff --git a/Source/WebCore/rendering/RenderLayer.cpp b/Source/WebCore/rendering/RenderLayer.cpp
index 1e9f4955775fa120f39cca40126296089e043746..8688273887be2d6dba3d741afe925a02071de05b 100644
--- a/Source/WebCore/rendering/RenderLayer.cpp
+++ b/Source/WebCore/rendering/RenderLayer.cpp
@@ -4094,12 +4094,14 @@ void RenderLayer::paintLayerContents(GraphicsContext* context, const LayerPainti
bool needToAdjustSubpixelQuantization = setupFontSubpixelQuantization(context, didQuantizeFonts);
// Apply clip-path to context.
- bool hasClipPath = setupClipPath(context, paintingInfo, offsetFromRoot, rootRelativeBounds, rootRelativeBoundsComputed);
+ LayoutSize columnAwareOffsetFromRoot = toLayoutSize(convertToLayerCoords(paintingInfo.rootLayer, LayoutPoint(), AdjustForColumns));
+ bool hasClipPath = setupClipPath(context, paintingInfo, columnAwareOffsetFromRoot, rootRelativeBounds, rootRelativeBoundsComputed);
LayerPaintingInfo localPaintingInfo(paintingInfo);
GraphicsContext* transparencyLayerContext = context;
- std::unique_ptr<FilterEffectRendererHelper> filterPainter = setupFilters(context, localPaintingInfo, paintFlags, offsetFromRoot, rootRelativeBounds, rootRelativeBoundsComputed);
+
+ std::unique_ptr<FilterEffectRendererHelper> filterPainter = setupFilters(context, localPaintingInfo, paintFlags, columnAwareOffsetFromRoot, rootRelativeBounds, rootRelativeBoundsComputed);
if (filterPainter) {
context = filterPainter->filterContext();
if (context != transparencyLayerContext && haveTransparency) {
Created attachment 244539 [details]
Patch
Comment on attachment 244539 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=244539&action=review > Source/WebCore/rendering/RenderLayer.cpp:4110 > + if (renderer().flowThreadContainingBlock() && (renderer().hasClipPath() || hasFilterThatIsPainting(context, paintFlags))) Is the renderer().flowThreadContainingBlock() permissive enough to handle blocks deeply nested inside columns? Comment on attachment 244539 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=244539&action=review >> Source/WebCore/rendering/RenderLayer.cpp:4110 >> + if (renderer().flowThreadContainingBlock() && (renderer().hasClipPath() || hasFilterThatIsPainting(context, paintFlags))) > > Is the renderer().flowThreadContainingBlock() permissive enough to handle blocks deeply nested inside columns? I believe so. Committed r178380: <http://trac.webkit.org/changeset/178380> |