[whatwg] [canvas] matrix based changes on bitmaps

Charles Pritchard chuck at jumis.com
Mon Apr 23 14:57:21 PDT 2012


On 4/23/2012 2:38 PM, Tyler Larson wrote:
> Can we add matrix transformations?
> Looping over every pixel in JavaScript is slow. Many cool things could be taken care of much faster if the canvas had some form of matrix manipulations built in.
> All of the pixels could have one transformation operation defined and all of the pixels could be operated on at once in something lower level.
>
> It could look like this...
>
> context.transformMatrix([0.5,0.5,0.5,0,0,
> 					0.5,0.5,0.5,0,0,
> 					0.5,0.5,0.5,0,0,
> 					0,0,0,1,0,
> 					0,0,0,0,1]);
>
> It's far simpler than looping over an array of pixels and picking out the values of each color.
>
> Other graphics systems have ways of doing this already. You can easily find sample tutorials on how to create and transform matrixes.
> In some languages they have matrix objects that have methods for even easier manipulation of these transformations but I'm cool without this if it is easier.
>

WebKit recently landed Uint8ClampedArray. That brings us all in line 
with Typed Arrays.

Currently, if you want to do "fast" operations on a Canvas, you need to 
load it into WebGL and use GLSL to do your quick vector math.
It'd be nice to see a math object for Typed Arrays with similar power.

When we implemented Canvas independently (prior to WebGL publication), 
we simply stuck filters onto the ImageData object.
such as ImageData.blur().

But, directly addressing your example, I could see something like:

var a = new MatrixMath();
var b = ctx.getImageData(0,0,200,200);
a.mulAdd(b.width, b.height, b.data,  [0.5,0.5,0.5,0,0,
                     0.5,0.5,0.5,0,0,
                     0.5,0.5,0.5,0,0,
                     0,0,0,1,0,
                     0,0,0,0,1]);
a.process(function() { ctx.putImageData(a,0,0); });





More information about the whatwg mailing list