mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1030604 - Use nsChangeHint_UpdateOverflow for clip-path and mask changes so we update the PreEffectsBBoxProperty and run the effect on the correct area. r=roc
The testcase is a slight simplification of dholbert's testcase 2 (attachment 8456312) in the bug. It fails in the reftest harness without the patch, and passes in the reftest harness with the patch.
This commit is contained in:
parent
cbcf674ada
commit
cfb436efb1
40
layout/reftests/svg/dynamic-mask-pre-effects-bbox-ref.html
Normal file
40
layout/reftests/svg/dynamic-mask-pre-effects-bbox-ref.html
Normal file
@ -0,0 +1,40 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
#container {
|
||||
border: 3px dotted black;
|
||||
background: yellow;
|
||||
overflow: hidden;
|
||||
width: 400px;
|
||||
max-height: 25px;
|
||||
}
|
||||
|
||||
#container.masked {
|
||||
mask: url('#fade_mask_bottom');
|
||||
}
|
||||
.item {
|
||||
font-size: 30px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id='container' class="masked"><div class="item">PASS</div></div>
|
||||
|
||||
<!-- BEGIN SVG MASK: -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
|
||||
<mask id="fade_mask_bottom"
|
||||
maskUnits="objectBoundingBox" maskContentUnits="objectBoundingBox">
|
||||
<linearGradient id="fade_gradient_bottom"
|
||||
gradientUnits="objectBoundingBox" x2="0" y2="1">
|
||||
<stop stop-color="white" stop-opacity="1" offset="0.7"></stop>
|
||||
<stop stop-color="white" stop-opacity="0" offset="1"></stop>
|
||||
</linearGradient>
|
||||
<rect x="0" y="0" width="1" height="1"
|
||||
fill="url(#fade_gradient_bottom)"></rect>
|
||||
</mask>
|
||||
</svg>
|
||||
<!-- END SVG MASK -->
|
||||
|
||||
</body>
|
||||
</html>
|
71
layout/reftests/svg/dynamic-mask-pre-effects-bbox.html
Normal file
71
layout/reftests/svg/dynamic-mask-pre-effects-bbox.html
Normal file
@ -0,0 +1,71 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="reftest-wait">
|
||||
<head>
|
||||
<style>
|
||||
#container {
|
||||
border: 3px dotted black;
|
||||
background: yellow;
|
||||
overflow: hidden;
|
||||
width: 400px;
|
||||
max-height: 25px;
|
||||
}
|
||||
|
||||
#container.masked {
|
||||
mask: url('#fade_mask_bottom');
|
||||
}
|
||||
.item {
|
||||
font-size: 30px;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
function go() {
|
||||
clear();
|
||||
insert();
|
||||
}
|
||||
|
||||
function clear() {
|
||||
// Force reflow:
|
||||
container.offsetHeight;
|
||||
|
||||
// Remove mask:
|
||||
container.classList.remove('masked');
|
||||
}
|
||||
|
||||
function insert() {
|
||||
// Add new child:
|
||||
var notificationNode = document.createElement('div');
|
||||
notificationNode.classList.add('item');
|
||||
notificationNode.appendChild(document.createTextNode("PASS"));
|
||||
var container = document.getElementById('container');
|
||||
container.appendChild(notificationNode);
|
||||
|
||||
// Force reflow:
|
||||
container.offsetHeight;
|
||||
|
||||
// Add back mask:
|
||||
container.classList.add('masked');
|
||||
|
||||
document.documentElement.classList.remove('reftest-wait');
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body onload="go();">
|
||||
<div id='container' class="masked"></div>
|
||||
|
||||
<!-- BEGIN SVG MASK: -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
|
||||
<mask id="fade_mask_bottom"
|
||||
maskUnits="objectBoundingBox" maskContentUnits="objectBoundingBox">
|
||||
<linearGradient id="fade_gradient_bottom"
|
||||
gradientUnits="objectBoundingBox" x2="0" y2="1">
|
||||
<stop stop-color="white" stop-opacity="1" offset="0.7"></stop>
|
||||
<stop stop-color="white" stop-opacity="0" offset="1"></stop>
|
||||
</linearGradient>
|
||||
<rect x="0" y="0" width="1" height="1"
|
||||
fill="url(#fade_gradient_bottom)"></rect>
|
||||
</mask>
|
||||
</svg>
|
||||
<!-- END SVG MASK -->
|
||||
|
||||
</body>
|
||||
</html>
|
@ -89,6 +89,7 @@ skip-if(B2G) == dynamic-marker-02.svg dynamic-marker-02-ref.svg
|
||||
skip-if(B2G) == dynamic-marker-03.svg pass.svg
|
||||
== dynamic-mask-01.svg pass.svg
|
||||
skip-if(B2G) == dynamic-mask-contents-01.svg pass.svg
|
||||
== dynamic-mask-pre-effects-bbox.html dynamic-mask-pre-effects-bbox-ref.html
|
||||
== dynamic-opacity-property-01.svg pass.svg
|
||||
skip-if(B2G) == dynamic-pattern-01.svg pass.svg
|
||||
skip-if(B2G) == dynamic-pattern-02.svg pass.svg
|
||||
|
@ -1154,17 +1154,16 @@ nsChangeHint nsStyleSVGReset::CalcDifference(const nsStyleSVGReset& aOther) cons
|
||||
{
|
||||
nsChangeHint hint = nsChangeHint(0);
|
||||
|
||||
bool equalFilters = (mFilters == aOther.mFilters);
|
||||
|
||||
if (!equalFilters) {
|
||||
NS_UpdateHint(hint, nsChangeHint_UpdateOverflow);
|
||||
}
|
||||
|
||||
if (!EqualURIs(mClipPath, aOther.mClipPath) ||
|
||||
!EqualURIs(mMask, aOther.mMask) ||
|
||||
!equalFilters) {
|
||||
mFilters != aOther.mFilters) {
|
||||
NS_UpdateHint(hint, nsChangeHint_UpdateEffects);
|
||||
NS_UpdateHint(hint, nsChangeHint_RepaintFrame);
|
||||
// We only actually need to update the overflow area for filter
|
||||
// changes. However, mask and clip-path changes require that we
|
||||
// update the PreEffectsBBoxProperty, which is done during overflow
|
||||
// computation.
|
||||
NS_UpdateHint(hint, nsChangeHint_UpdateOverflow);
|
||||
}
|
||||
|
||||
if (mDominantBaseline != aOther.mDominantBaseline) {
|
||||
|
@ -2720,6 +2720,9 @@ struct nsStyleFilter {
|
||||
nsStyleFilter& operator=(const nsStyleFilter& aOther);
|
||||
|
||||
bool operator==(const nsStyleFilter& aOther) const;
|
||||
bool operator!=(const nsStyleFilter& aOther) const {
|
||||
return !(*this == aOther);
|
||||
}
|
||||
|
||||
int32_t GetType() const {
|
||||
return mType;
|
||||
|
Loading…
Reference in New Issue
Block a user