[whatwg] Yet another issue with the ImageData API

On Wed, 17 Dec 2008, Oliver Hunt wrote:
>
> So while playing around with some image filtering code using the Canvas 
> ImageData APIs I realised that the APIs as currently designed make it 
> difficult to do certain kinds of operation.  The specific issue is that 
> there is no direct mechanism to get a working/scratch ImageData object 
> of the same size as an existing buffer.
> 
> To illustrate imagine we have a (very) simplistic filter model (in a fairly
> horrific cludge of IDL, JS, etc)
> 
> interface Filter {
> ImageData apply(CanvasRenderingContext2D context, ImageData input);
> }
> 
> var filters = ...;
> ...
> CanvasRenderingContext2D context = canvas.getContext("2d");
> ImageData data = context.getImageData(0, 0, canvas.width, canvas.height);
> ...
> filters.myAwesomeFilter.apply(context,
> filters.myLessAwesomeFilter.apply(context,input));
> ...
> 
> Such a setup can allow developers to (inefficiently in this case) chain 
> a sequence of filters together to produce a desired result.
> 
> This trivial mechanism works for a variety of filters, as many filters 
> can just mutate the input buffer (negation, hue shifting, etc, etc) but 
> for any filter for which a single output pixel may depend on multiple 
> input pixels a second buffer must be used.
> 
> Unfortunately with the current ImageData API it is not possible to 
> simply create a new ImageData object with the same dimensions as an 
> existing instance as the width and height of the ImageData object are in 
> device pixels whereas the width and height parameters of 
> create/getImageData are both in CSS pixels. This means that on any 
> platform without a 1:1 correspondence a new ImageData created in a 
> manner similar to:
> 
> newData = context.createImageData(oldData.width, oldData.height)
> 
> will have different dimensions from the original input.
> 
> I think this is a problem that we need to resolve, but I have not yet 
> worked out any real way to achieve this.

I've extended createImageData() so that it is overloaded to take an 
ImageData object. If so invoked, it returns a new object with the same 
dimensions as the argument.

-- 
Ian Hickson               U+1047E                )\._.,--....,'``.    fL
http://ln.hixie.ch/       U+263A                /,   _.. \   _\  ;`._ ,.
Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'

Received on Thursday, 30 April 2009 16:00:16 UTC