Invalid blending results across all browsers with HTML5 canvas Invalid blending results across all browsers with HTML5 canvas javascript javascript

Invalid blending results across all browsers with HTML5 canvas


Oh geez. I think we just stepped into the twilight zone here. I'm afraid I don't have an answer but I can provide some more information at least. Your hunch is right that at least something is larger here.

I'd prefer an example that is drastically more simple (and thus less prone to any sort of error - I fear you might have a problem with 0-255 somewhere instead of 0-1 but didnt look thoroughly) than yours so I whipped up something tiny. What I found wasn't pleasant:

<canvas id="canvas1" width="128" height="128"></canvas><canvas id="canvas2" width="127" height="127"></canvas>

+

var can = document.getElementById('canvas1');var ctx = can.getContext('2d');var can2 = document.getElementById('canvas2');var ctx2 = can2.getContext('2d');var alpha = 2/255.0;ctx.fillStyle = 'rgba(127, 0, 0, ' + alpha + ')';ctx2.fillStyle = 'rgba(127, 0, 0, ' + alpha + ')'; // this is grey//ctx2.fillStyle = 'rgba(171, 0, 0, ' + alpha + ')'; // this worksfor (var i = 0; i < 32; i++) {      ctx.fillRect(0,0,500,500);      ctx2.fillRect(0,0,500,500);}

Yields this:

enter image description here

See for yourself here:

http://jsfiddle.net/jjAMX/

It seems that if your surface area is too small (not the fillRect area, but the canvas area itself) then the drawing operation will be a wash.

It seems to work fine in IE9 and FF7. I submitted it as a bug to Chromium. (We'll see what they say, but their typical M.O. so far is to ignore most bug reports unless they are security issues).

I'd urge you to check your example - I think you might have a 0-255 to 0-1 issue somewhere. The code I have here seems to work just dandy, save for maybe the expected reddish color, but it is a consistent resultant color across all browsers with the exception of this Chrome issue.

In the end Chrome is probably doing something to optimize canvases with a surface area smaller than 128x128 that is fouling things up.


Setting globalCompositeOperation to "lighter" (the operation where overlapping pixels values are added together, it is not the default operation for many browsers) yields same color and results in ie9, chrome 14 and latest firefox aurora:

Expected: [126.99999999999999, 0, 0, 63.51372549019608]Result: [127, 0, 0, 64]Expected: [126.99999999999999, 0, 0, 63.51372549019608]Result: [127, 0, 0, 64]

http://jsfiddle.net/jMjFh/11/

edit: you may learn what the different composite operations mean here:

https://developer.mozilla.org/en/Canvas_tutorial/Compositing#globalCompositeOperation

for example, "copy" was useful to me when I needed to do fade animation in certain parts of a canvas