Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
[LBSE] Pixel snapping logic is incorrect for SVG, when elements are c…
…omposited https://bugs.webkit.org/show_bug.cgi?id=245416 Reviewed by Rob Buis. In bug webkit.org/b/244966 ("[LBSE] Outermost <svg> elements are not device-pixel aligned") the rendering was adapted in such a way that the outermost <svg> element is the only element in the SVG subtree that is pixel snapped, delivering consistent results between e.g. HTML <div> elements and SVG <svg> elements, embedded in a CSS formatting context. The <div> will get pixel snapped upon painting -- the same was enforced for the outermost <svg>, however without propagating/accumulating sub-pixel errors for the descendant layers, since no pixel snapping is applied within the SVG subtree. When elements are composited another logic is used (RenderLayerBacking), and the device-pixel alignment is applied for all SVG layers -- effectively breaking content. By fixing that, the pixel snapping logic is consistent for all painting modes we have, no matter if the outer <svg> is composited, or any of its descendants. Added two new reftests covering LBSE + compositing + sub-pixel locations in different display modes. Doesn't affect any other existing tests. * LayoutTests/svg/compositing/inline-svg-non-integer-position-display-block-composited-expected.html: Added. * LayoutTests/svg/compositing/inline-svg-non-integer-position-display-block-composited.html: Added. * LayoutTests/svg/compositing/inline-svg-non-integer-position-display-inline-composited-expected.html: Added. * LayoutTests/svg/compositing/inline-svg-non-integer-position-display-inline-composited.html: Added. * Source/WebCore/rendering/RenderLayer.cpp: (WebCore::RenderLayer::convertToLayerCoords const): * Source/WebCore/rendering/RenderLayerBacking.cpp: (WebCore::snappedGraphicsLayer): (WebCore::RenderLayerBacking::computeParentGraphicsLayerRect const): (WebCore::RenderLayerBacking::updateGeometry): (WebCore::RenderLayerBacking::adjustOverflowControlsPositionRelativeToAncestor): (WebCore::RenderLayerBacking::updateMaskingLayerGeometry): (WebCore::RenderLayerBacking::updateContentsRects): (WebCore::RenderLayerBacking::updateClippingStackLayerGeometry): (WebCore::RenderLayerBacking::setContentsNeedDisplayInRect): Canonical link: https://commits.webkit.org/254863@main
- Loading branch information
1 parent
e28b8cb
commit d2c0299eb83a36da49226c4c3696e8ae7382c39b
Showing
6 changed files
with
243 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
<!DOCTYPE html><!-- webkit-test-runner [ LayerBasedSVGEngineEnabled=true ] --> | ||
<html> | ||
<head> | ||
<style> | ||
.rect1 { | ||
fill: blue; | ||
} | ||
|
||
.rect2 { | ||
fill: green; | ||
} | ||
|
||
svg { | ||
display: block; | ||
overflow: hidden; | ||
} | ||
|
||
.show-overflow { | ||
overflow: visible; | ||
} | ||
|
||
.scaled { | ||
transform: scale(2); | ||
transform-origin: 0 0; | ||
} | ||
</style> | ||
</head> | ||
<body> | ||
<h1>Enforce non-integer SVG location</h1> | ||
<svg width="50" height="50" class="show-overflow"> | ||
<rect x="0" y="0" width="50" height="50" class="rect1"/> | ||
</svg> | ||
<svg width="50" height="50" class="show-overflow"> | ||
<rect x="0" y="0" width="50" height="50" class="rect2"/> | ||
</svg> | ||
<h1>Effect of overflow: hidden</h1> | ||
<svg width="50" height="50"> | ||
<rect x="0" y="0" width="50" height="50" class="rect1"/> | ||
</svg> | ||
<svg width="50" height="50"> | ||
<rect x="0" y="0" width="50" height="50" class="rect2"/> | ||
</svg> | ||
<h1>With transformation</h1> | ||
<svg width="50" height="50" class="show-overflow"> | ||
<rect x="0" y="0" width="50" height="50" class="rect1"/> | ||
</svg> | ||
<svg width="50" height="50" class="show-overflow"> | ||
<rect x="0" y="0" width="50" height="50" class="rect2"/> | ||
</svg> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
<!DOCTYPE html><!-- webkit-test-runner [ LayerBasedSVGEngineEnabled=true ] --> | ||
<!-- Based on svg/in-html/inline-svg-non-integer-position-display-block.html + compositing enabled either for <svg> or <rect> --> | ||
<html> | ||
<head> | ||
<style> | ||
.rect1 { | ||
fill: blue; | ||
} | ||
|
||
.rect2 { | ||
fill: green; | ||
} | ||
|
||
svg { | ||
display: block; | ||
overflow: hidden; | ||
} | ||
|
||
.move-svg { | ||
top: 25px; | ||
position: relative; | ||
} | ||
|
||
.show-overflow { | ||
overflow: visible; | ||
} | ||
|
||
.composited { | ||
transform: translateZ(0); | ||
} | ||
|
||
.scaled { | ||
transform: scale(2); | ||
transform-origin: 0 0; | ||
} | ||
</style> | ||
</head> | ||
<body> | ||
<h1>Enforce non-integer SVG location</h1> | ||
<svg width="50" height="50" class="show-overflow composited"> | ||
<rect x="0" y="0" width="50" height="50" class="rect1"/> | ||
</svg> | ||
<svg width="50" height="50" class="show-overflow"> | ||
<rect x="0" y="0" width="50" height="50" class="rect2 composited"/> | ||
</svg> | ||
<h1>Effect of overflow: hidden</h1> | ||
<svg width="50" height="50" class="composited"> | ||
<rect x="0" y="0" width="50" height="50" class="rect1"/> | ||
</svg> | ||
<svg width="50" height="50"> | ||
<rect x="0" y="0" width="50" height="50" class="rect2 composited"/> | ||
</svg> | ||
<h1>With transformation</h1> | ||
<svg width="25" height="25" class="show-overflow composited scaled"> | ||
<rect x="0" y="0" width="25" height="25" class="rect1"/> | ||
</svg> | ||
<svg width="25" height="25" class="show-overflow move-svg scaled"> | ||
<rect x="0" y="0" width="25" height="25" class="rect2 composited"/> | ||
</svg> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
<!DOCTYPE html><!-- webkit-test-runner [ LayerBasedSVGEngineEnabled=true ] --> | ||
<html> | ||
<head> | ||
<style> | ||
.rect1 { | ||
fill: blue; | ||
} | ||
|
||
.rect2 { | ||
fill: green; | ||
} | ||
|
||
svg { | ||
display: inline-block; | ||
overflow: hidden; | ||
} | ||
|
||
.show-overflow { | ||
overflow: visible; | ||
} | ||
|
||
.scaled { | ||
transform: scale(2); | ||
transform-origin: 0 0; | ||
} | ||
</style> | ||
</head> | ||
<body> | ||
<h1>Enforce non-integer SVG location</h1> | ||
<svg width="50" height="50" class="show-overflow"> | ||
<rect x="0" y="0" width="50" height="50" class="rect1"/> | ||
</svg> | ||
<svg width="50" height="50" class="show-overflow"> | ||
<rect x="0" y="0" width="50" height="50" class="rect2"/> | ||
</svg> | ||
<h1>Effect of overflow: hidden</h1> | ||
<svg width="50" height="50"> | ||
<rect x="0" y="0" width="50" height="50" class="rect1"/> | ||
</svg> | ||
<svg width="50" height="50"> | ||
<rect x="0" y="0" width="50" height="50" class="rect2"/> | ||
</svg> | ||
<h1>With transformation</h1> | ||
<svg width="50" height="50" class="show-overflow"> | ||
<rect x="0" y="0" width="50" height="50" class="rect1"/> | ||
</svg> | ||
<svg width="50" height="50" class="show-overflow"> | ||
<rect x="0" y="0" width="50" height="50" class="rect2"/> | ||
</svg> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
<!DOCTYPE html><!-- webkit-test-runner [ LayerBasedSVGEngineEnabled=true ] --> | ||
<!-- Based on svg/in-html/inline-svg-non-integer-position-display-inline.html + compositing enabled either for <svg> or <rect> --> | ||
<html> | ||
<head> | ||
<style> | ||
.rect1 { | ||
fill: blue; | ||
} | ||
|
||
.rect2 { | ||
fill: green; | ||
} | ||
|
||
svg { | ||
display: inline-block; | ||
overflow: hidden; | ||
} | ||
|
||
.move-svg { | ||
left: 25px; | ||
position: relative; | ||
} | ||
|
||
.show-overflow { | ||
overflow: visible; | ||
} | ||
|
||
.composited { | ||
transform: translateZ(0); | ||
} | ||
|
||
.scaled { | ||
transform: scale(2); | ||
transform-origin: 0 0; | ||
} | ||
</style> | ||
</head> | ||
<body> | ||
<h1>Enforce non-integer SVG location</h1> | ||
<svg width="50" height="50" class="show-overflow composited"> | ||
<rect x="0" y="0" width="50" height="50" class="rect1"/> | ||
</svg> | ||
<svg width="50" height="50" class="show-overflow"> | ||
<rect x="0" y="0" width="50" height="50" class="rect2 composited"/> | ||
</svg> | ||
<h1>Effect of overflow: hidden</h1> | ||
<svg width="50" height="50" class="composited"> | ||
<rect x="0" y="0" width="50" height="50" class="rect1"/> | ||
</svg> | ||
<svg width="50" height="50"> | ||
<rect x="0" y="0" width="50" height="50" class="rect2 composited"/> | ||
</svg> | ||
<h1>With transformation</h1> | ||
<svg width="25" height="25" class="show-overflow composited scaled"> | ||
<rect x="0" y="0" width="25" height="25" class="rect1"/> | ||
</svg> | ||
<svg width="25" height="25" class="show-overflow move-svg scaled"> | ||
<rect x="0" y="0" width="25" height="25" class="rect2 composited"/> | ||
</svg> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters