haikuwebkit/LayoutTests/fast/repaint/transform-change-repaint.html

30 lines
632 B
HTML
Raw Permalink Normal View History

Avoid unnecessary repaints when transforms change https://bugs.webkit.org/show_bug.cgi?id=223307 Reviewed by Zalan Bujtas. Source/WebCore: RenderElement::repaintBeforeStyleChange() issues repaints when transforms, opacity or filters change because the layer might disappear, but we know that this only happens if the style changes between having a transform/filter/non-1 opacity and not. Transform changes in general repaint via layout (the RenderLayer gets setLayerNeedsFullRepaint() called on it). Opacity and filter changes repaint by virtue of a RepaintLayer style diff. This reduces some repaint calls in the MotionMark leaves test. This code is a mess and dates from ancient times (r7675); it doens't know about self-painting layers, and duplicates work done in RenderLayerModelObject::styleDidChange() when a renderer loses its layer, but that's too much to change now. Test: fast/repaint/transform-change-repaint.html * rendering/RenderBox.h: * rendering/RenderBoxModelObject.h: * rendering/RenderElement.cpp: (WebCore::RenderElement::repaintBeforeStyleChange): * rendering/RenderElement.h: (WebCore::RenderElement::createsGroupForStyle): * rendering/style/RenderStyle.h: (WebCore::RenderStyle::hasOpacity const): * style/StyleAdjuster.cpp: (WebCore::Style::Adjuster::adjust const): LayoutTests: * fast/repaint/transform-change-repaint-expected.txt: Added. * fast/repaint/transform-change-repaint.html: Added. Canonical link: https://commits.webkit.org/235438@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@274597 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-03-17 23:12:38 +00:00
<!DOCTYPE html>
<html>
<head>
<script src="resources/text-based-repaint.js"></script>
<style>
div {
margin: 50px;
width: 200px;
height: 50px;
border: 1px solid black;
transform-origin: top left;
transform: rotate(20deg);
}
body.changed div {
transform: rotate(30deg);
}
</style>
<script>
function repaintTest()
{
document.body.classList.add('changed');
}
</script>
</head>
<body onload="runRepaintTest();">
<div id="target"></div>
</body>
</html>