[fxtf-drafts] [filter-effects] Browsers don't match spec for feDisplacementMap

AmeliaBR has just created a new issue for 
https://github.com/w3c/fxtf-drafts:

== [filter-effects] Browsers don't match spec for feDisplacementMap ==
The [spec for 
`feDisplacementMap`](https://drafts.fxtf.org/filters/#feDisplacementMapElement)
 says:

> This filter primitive uses the pixels values from the image from in2
 to spatially displace the image from in. This is the transformation 
to be performed:
>
>    P'(x,y) ← P( x + scale * (XC(x,y) - .5), y + scale * (YC(x,y) - 
.5))
>
>where P(x,y) is the input image, in, and P'(x,y) is the destination. 
XC(x,y) and YC(x,y) are the component values of the channel designated
 by the xChannelSelector and yChannelSelector. For example, to use the
 R component of in2 to control displacement in x and the G component 
of Image2 to control displacement in y, set xChannelSelector to "R" 
and yChannelSelector to "G".
>
> The displacement map, in2, defines the inverse of the mapping 
performed.
>
> The input image in is to remain premultiplied for this filter 
primitive. The calculations using the pixel values from in2 are 
performed using non-premultiplied color values.

If I'm reading that correctly, I would expect that, when 
`xChannelSelector` and `yChannelSelector` are R,G,or B:

- If the input map is solid white, the filtered graphic would be 
displaced in negative x&y directions by 0.5*scale.
- If the input map is solid black, the filtered graphic would be 
displaced in a positive x&y directions by 0.5*scale.
- If the input map is solid 50% gray (#888 if 
color-interpolation-filters is linearRGB), the filtered graphic would 
not be displaced at all.

If the input map is partially transparent, I'm not quite sure what 
should happen next.  It depends on whether "premultiplied" only 
applies to scaling the color channel range, or whether it also 
includes scaling by alpha.  If we do not scale the color channels by 
the alpha, then the alpha value should not have any effect unless the 
value of  `xChannelSelector` or `yChannelSelector` is `A`.  This is 
what I would expect as an author.

If you do scale the color channels by alpha, which I think is a more 
literal reading of the spec, then I would expect:

- 50% opaque white to have the same effect as 50% solid gray, i.e. no 
displacement.
- 50% opaque/50% gray input to have the same effect as 25% solid gray,
 aka positive displacement by 0.25*scale.
- fully transparent (0% opaque) input to have the same effect as solid
 black, i.e. positive displacement by 0.5*scale.

None of the browsers tested (Chrome 56, Firefox 53, and Edge 14) lead 
to any of these sets of expected results.

Solid black and white input are treated as expected in all browsers: 
displacement by half the scale factor, in opposing directions.  But a 
50% gray input in all browsers _does_ displace the image, halfway the 
distance of the displacement for a solid black input.

Chrome and Firefox treat a 50% transparent input the same as a solid 
input of the same color, but treat a completely transparent input the 
same as solid black.  MS Edge linearly scales the amount of 
displacement by the alpha of the input color.

[CodePen test case](http://codepen.io/AmeliaBR/pen/ZeYBZb/)

Please view or discuss this issue at 
https://github.com/w3c/fxtf-drafts/issues/113 using your GitHub 
account

Received on Saturday, 25 February 2017 00:08:59 UTC