haikuwebkit/LayoutTests/css3/filters/filter-change-repaint.html

86 lines
2.5 KiB
HTML
Raw Permalink Normal View History

[CSS Filters] Trigger a repaint on elements with changed filter https://bugs.webkit.org/show_bug.cgi?id=82521 Reviewed by Dean Jackson. Source/WebCore: I've added ContextSensitivePropertyFilter and changed RenderStyle::diff to use it when the filter property is changed. In RenderObject::adjustStyleDifference the appropriate StyleDifferenceRepaintLayer or StyleDifferenceRecompositeLayer is used depending on whether the layer is painting filters in software or in hardware (composited). Tests: css3/filters/filter-change-repaint-composited.html css3/filters/filter-change-repaint.html * css/CSSStyleSelector.cpp: (WebCore::CSSStyleSelector::createFilterOperations): None was treated as an invalid value. * platform/graphics/ca/mac/PlatformCALayerMac.mm: Shadows were remaining behind. Fixed that. (PlatformCALayer::setFilters): * rendering/RenderBoxModelObject.cpp: (WebCore::RenderBoxModelObject::styleWillChange): Repaint the layer when there is a layout change and a filter change. * rendering/RenderLayer.cpp: (WebCore::RenderLayer::styleChanged): Making sure that the backing store is repainted when filters fallback to hardware. * rendering/RenderObject.cpp: (WebCore::RenderObject::adjustStyleDifference): * rendering/style/RenderStyle.cpp: (WebCore::RenderStyle::diff): * rendering/style/RenderStyleConstants.h: LayoutTests: Repaint was not triggered when the filter property was changed. I've added two tests, one for software and one for composited mode. Both tests are triggering all the possible scenarios of changing the filter property. * css3/filters/filter-change-repaint-composited-expected.png: Added. * css3/filters/filter-change-repaint-composited-expected.txt: Added. * css3/filters/filter-change-repaint-composited.html: Added. * css3/filters/filter-change-repaint-expected.png: Added. * css3/filters/filter-change-repaint-expected.txt: Added. * css3/filters/filter-change-repaint.html: Added. * platform/chromium/test_expectations.txt: Disabled the new tests on Chromium. They need rebaselining. Canonical link: https://commits.webkit.org/100031@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@112644 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2012-03-30 05:07:06 +00:00
<!DOCTYPE html>
<!--
This tests verifies that filters repaint correctly in software mode when the filter property is changed.
You should see 5 green rectangles. First 4 of the rectangles have a blue shadow. There should be no red.
-->
<html>
<head>
<style>
.box {
height: 50px;
width: 50px;
margin-left: 20px;
margin-bottom: 60px;
background-color: green;
}
.software_from_none {
-webkit-filter: drop-shadow(0px 0px 10px blue);
}
.software_from_none.before {
-webkit-filter: none;
}
.software_from_software {
-webkit-filter: drop-shadow(0px 0px 10px blue);
}
.software_from_software.before {
-webkit-filter: drop-shadow(0px 0px 10px red);
}
.composited_from_software {
/* force a composited layer */
-webkit-transform: translate3d(0, 0, 0);
-webkit-filter: drop-shadow(0px 0px 10px blue);
}
.composited_from_software.before {
-webkit-transform: none;
-webkit-filter: drop-shadow(0px 0px 10px red);
}
.software_from_composited {
-webkit-transform: none;
-webkit-filter: drop-shadow(0px 0px 10px blue);
}
.software_from_composited.before {
/* force a composited layer */
-webkit-transform: translate3d(0, 0, 0);
-webkit-filter: drop-shadow(0px 0px 10px red);
}
.none_from_software {
-webkit-filter: none;
}
.none_from_software.before {
-webkit-filter: drop-shadow(0px 0px 10px red);
}
</style>
<script src="../../fast/repaint/resources/repaint.js"></script>
<script>
if (window.testRunner)
testRunner.dumpAsText(true);
[CSS Filters] Trigger a repaint on elements with changed filter https://bugs.webkit.org/show_bug.cgi?id=82521 Reviewed by Dean Jackson. Source/WebCore: I've added ContextSensitivePropertyFilter and changed RenderStyle::diff to use it when the filter property is changed. In RenderObject::adjustStyleDifference the appropriate StyleDifferenceRepaintLayer or StyleDifferenceRecompositeLayer is used depending on whether the layer is painting filters in software or in hardware (composited). Tests: css3/filters/filter-change-repaint-composited.html css3/filters/filter-change-repaint.html * css/CSSStyleSelector.cpp: (WebCore::CSSStyleSelector::createFilterOperations): None was treated as an invalid value. * platform/graphics/ca/mac/PlatformCALayerMac.mm: Shadows were remaining behind. Fixed that. (PlatformCALayer::setFilters): * rendering/RenderBoxModelObject.cpp: (WebCore::RenderBoxModelObject::styleWillChange): Repaint the layer when there is a layout change and a filter change. * rendering/RenderLayer.cpp: (WebCore::RenderLayer::styleChanged): Making sure that the backing store is repainted when filters fallback to hardware. * rendering/RenderObject.cpp: (WebCore::RenderObject::adjustStyleDifference): * rendering/style/RenderStyle.cpp: (WebCore::RenderStyle::diff): * rendering/style/RenderStyleConstants.h: LayoutTests: Repaint was not triggered when the filter property was changed. I've added two tests, one for software and one for composited mode. Both tests are triggering all the possible scenarios of changing the filter property. * css3/filters/filter-change-repaint-composited-expected.png: Added. * css3/filters/filter-change-repaint-composited-expected.txt: Added. * css3/filters/filter-change-repaint-composited.html: Added. * css3/filters/filter-change-repaint-expected.png: Added. * css3/filters/filter-change-repaint-expected.txt: Added. * css3/filters/filter-change-repaint.html: Added. * platform/chromium/test_expectations.txt: Disabled the new tests on Chromium. They need rebaselining. Canonical link: https://commits.webkit.org/100031@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@112644 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2012-03-30 05:07:06 +00:00
function repaintTest()
{
var items = document.getElementsByClassName('before');
while (items.length)
items[0].classList.remove("before");
}
</script>
</head>
<body onload="runRepaintTest()">
<div class="box software_from_none before"></div>
<div class="box software_from_software before"></div>
<div class="box composited_from_software before"></div>
<div class="box software_from_composited before"></div>
<div class="box none_from_software before"></div>
</body>
</html>