[whatwg] setting canvas colors as array

Oliver Hunt oliver at apple.com
Sat Oct 4 15:23:21 PDT 2008

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.


More information about the whatwg mailing list