On Oct 4, 2008, at 2:53 PM, Maciej Stachowiak wrote:

setFillColor avoid the need for allocation entirely in all cases.

We could also consider letting fillStyle take a number to be interpreted as a 32-bit RGBA value, since modern JS engines can do math and masking faster than string operations or array allocation. But the broken out setFillStyle version seems like it might still be more of a perf win in many cases.

It's worth recalling that existing content (and i imagine most complex canvas code in general) that uses any single data structure for colour uses arrays so that there isn't any additional allocation. The reason you see

fillStyle = "rgba("+r+","...

is because it is much easier to work with colours when keeping the channels as float values in [0..1], so these have to be converted to [0..255] values for the string which is cleaner when done over multiple lines -- eg

r = Math.round(colour[0] * 255);
g = Math.round(colour[1] * 255);
b = Math.round(colour[2] * 255);
fillStyle = "rgba("+r+","+g+","+b+","+colour[3]+")" // I have actually seen people do "rgba("+[r,g,b,colour[3]].join()+")"; because even that is more concise

setFillColor requires
setFillColor(color[0], color[1], color[2], color[3]);

which is still more verbose then
fillStyle = color

On Oct 4, 2008, at 8:02 AM, Kristof Zelechovski wrote:
Instead of an array, we could also use a generic, "duck-typed"
javascript object:
fillStyle = {r:0, g:0.3, b: 0.6, a:1.0};
This would seem a little clearer semantically, I think, since arrays
are after all supposed to represent a list of semantically identical
values.

The issue with this is that it doesn't make things much better than they currently are -- you end up having to convert from arrays to an object with named properties. While this is nice on a conceptual level, it is far easier to work with colours if you just treat them as vectors -- by giving each channel a separately named property you can't trivially iterate through the channels which means you end up having to repeat code, and also make it impossible to just do all computation cleanly with "vectors", as you will eventually have to convert to the object form for assignment.

--Oliver

Reply via email to