[whatwg] inconsistent canvas implementations of destination-in compositing

David Karger karger at mit.edu
Thu Dec 22 10:36:58 PST 2011


It looks like whatwh strips attachments, so I am resending with the 
example inline.

Firefox and chrome inconsistently handle "destination-in" compositing; I 
suspect this may be due to a missing specification in the standard.  The 
inconsistency happens when I use the drawImage method to draw one canvas 
onto another while the globalCompositionOperation is set to 
"destination-in"  .  Under destination in, pixels in the destination 
canvas should be left alone where the source canvas has a set pixel and 
cleared where the source canvas has a cleared/transparent pixel.

Both browsers do this properly inside the range of the source canvas. 
But if the source canvas has smaller dimensions than the destination 
canvas, they inconsistently handle parts of the destination canvas 
_outside_ the source canvas: firefox clears those pixels while chrome 
leaves them alone.  I believe the standard isn't clear on what should 
happen in this case.   I'd say that firefox's behavior is more 
consistent with the intent of "destination-in", but obviously 
cross-platform consistency is the most important consideration.

I enclose a small html document demonstrating the inconsistency.  Just 
open it in firefox and chrome.

<!DOCTYPE HTML>
<html>
<head>
<title>
Canvas test
</title>

</head>
<body>
<h1>Canvas destination-in Compositing Test</h1>
canvas 1:
<div>
<canvas id="c1"></canvas>
</div>
canvas 2:
<div>
<canvas id="c2"></canvas>
</div>
<script>
var c1=document.getElementById("c1");
c1.width=50; c1.height=50;
var k1=c1.getContext("2d");
k1.fillStyle="#0000FF";
k1.fillRect(0,0,25,25);

var c2=document.getElementById("c2");
c2.width=100; c2.height=100;
var k2=c2.getContext("2d");
k2.fillStyle="#FF0000";
k2.fillRect(0,0,75,75);

k2.globalCompositeOperation="destination-in";
k2.drawImage(c1,0,0);
</script>
</body>
</html>






More information about the whatwg mailing list