W3C home > Mailing lists > Public > public-webapps@w3.org > April to June 2015

Re: Async Image -> ImageData conversion

From: Justin Novosad <junov@google.com>
Date: Thu, 25 Jun 2015 09:48:48 -0400
Message-ID: <CABpaAqRuH6J5bPReMWpEz--dM8oWEX5TJLD+1xb_EUqTrncd8A@mail.gmail.com>
To: Ashley Gullen <ashley@scirra.com>
Cc: Kenneth Russell <kbr@google.com>, Boris Zbarsky <bzbarsky@mit.edu>, "public-webapps@w3.org" <public-webapps@w3.org>, Jeff Muizelaar <jrmuizel@mozilla.com>
On Thu, Jun 25, 2015 at 9:40 AM, Justin Novosad <junov@google.com> wrote:

>
>
> On Thu, Jun 25, 2015 at 5:56 AM, Ashley Gullen <ashley@scirra.com> wrote:
>
>> I see that OffscreenCanvas also specifies a close() method for
>> ImageBitmap. Perhaps browsers could use copy-on-write with the
>> toImageData() method? Then you can efficiently either transfer or copy
>> depending on if you close the ImageBitmap you transferred to an ImageData.
>>
>
>> Transfer:
>> createImageBitmap() -> imageBitmap.toImageData() -> imageBitmap.close()
>> No copy made, contents transferred to the imageData
>>
>> createImageBitmap() -> imageBitmap.toImageData() -> access resulting
>> imageData.data
>> Copy made on first access
>>
>
> Copy on write is probably not a good idea because it would require
> injecting an observer pattern (or some kind of notification mechanism) into
> Uint8ClampedArray data assignment, which would realistically degrade
> performance of Image processing pixel loops.  Having a one step transfer
> API (transferToImageData) avoids adding overhead to what is otherwise just
> a simple memory access.
>

Something more: Blink, and probably other implementations as well, stores
decoded images in alpha pre-multiplied form.  ImageData is not
pre-multiplied.  For this reason sharing a buffer between ImageBitmap and
ImageData would be somewhat inconvenient.


>>
>> On 24 June 2015 at 21:54, Kenneth Russell <kbr@google.com> wrote:
>>
>>> On Wed, Jun 24, 2015 at 1:28 PM, Ashley Gullen <ashley@scirra.com>
>>> wrote:
>>> > Sorry for the confusion. Yes, the latest URL is:
>>> >
>>> https://www.scirra.com/labs/specs/imagebitmap-conversion-extensions.html
>>> > I'm new to specs and WebIDL, my intent was to say those are new
>>> methods on
>>> > ImageBitmap. Is "partial interface ImageBitmap" the correct way to say
>>> that?
>>> > (I updated the URL to say that instead)
>>> >
>>> > The wording of "undue latency" in the ImageBitmap spec does not appear
>>> to
>>> > rule out ImageBitmap storing its encoded image data, and lazily
>>> decoding it.
>>> > However I'm not sure what the point of that would be, since it seems
>>> to be
>>> > how drawing HTMLImageElements to a canvas already works. I see a
>>> couple of
>>> > options:
>>> > - allow lazy decoding in ImageBitmap, and therefore converting to
>>> ImageData
>>> > is an explicit request to decompress
>>> > - require ImageBitmap to decompress its contents, and make it available
>>> > through a read-only Uint8ClampedArray like ImageData has. Therefore,
>>> > converting to ImageData indicates the intent to modify this content,
>>> > therefore a copy is warranted.
>>> > - provide a way to "neuter" the ImageBitmap when converting it to
>>> ImageData,
>>> > transferring its contents and avoiding any copy, which is useful if the
>>> > ImageBitmap is a temporary object only being created for the purposes
>>> of
>>> > getting the ImageData. I guess this would be similar to transferrable
>>> > objects with workers.
>>>
>>> Perhaps this could be done by specifying a "transferToImageData" method.
>>>
>>> This proposal makes ImageBitmap neuterable, and there's intent to
>>> implement it in order to allow rendering to canvas contexts from
>>> worker threads: https://wiki.whatwg.org/wiki/OffscreenCanvas .
>>>
>>> -Ken
>>>
>>>
>>> > - add some kind of "load" method on ImageBitmap. It may store its
>>> contents
>>> > in compressed form, but calling "load" causes it to be decompressed (or
>>> > loaded from somewhere else). The ImageBitmap is only guaranteed to be
>>> drawn
>>> > with "undue latency" after the "load" call. Therefore for the use case
>>> of
>>> > low-latency rendering "load" can always be called immediately after
>>> > creation, but for conversion purposes not calling "load" avoids
>>> duplicating
>>> > memory.
>>> >
>>> > Note for devices with discrete GPUs, it's possible that ImageBitmap
>>> stores
>>> > the decompressed image data in a GPU texture but does not have it in
>>> system
>>> > RAM. In this case making a copy for the ImageData is also warranted.
>>> >
>>> > I'm a web developer proposing this because it would be useful for my
>>> > purposes, I've no idea which of these would be favoured by
>>> implementors or
>>> > the spec process. I'm happy to get involved in spec work though so
>>> please
>>> > let me know if you have any feedback/suggestions on anything I'm doing
>>> here.
>>> >
>>> > Ashley
>>> >
>>> >
>>> >
>>> > On 24 June 2015 at 19:12, Boris Zbarsky <bzbarsky@mit.edu> wrote:
>>> >>
>>> >> On 6/19/15 5:43 AM, Ashley Gullen wrote:
>>> >>>
>>> >>> I've not done this before, so I've no idea if this is the
>>> right/useful
>>> >>> approach, but I drafted a spec for it here:
>>> >>>
>>> >>> https://www.scirra.com/labs/specs/imagedata-blob-extensions.html
>>> >>
>>> >>
>>> >> Ashley,
>>> >>
>>> >> We at Mozilla were just discussing this proposal, and we have a
>>> concern.
>>> >>
>>> >> With this proposal, going from an <img> to an ImageData requires
>>> >> conversion of an intermediate ImageBitmap.  Unfortunately, an
>>> ImageBitmap is
>>> >> specified to be paintable "without undue latency", which we interpret
>>> to
>>> >> mean it needs to have decoded image data, and the ImageData will end
>>> up
>>> >> needing to copy said data in practice (because it needs an editable
>>> copy).
>>> >>
>>> >> That creates two copies of the decoded image data in memory, which
>>> seems
>>> >> fairly undesirable on memory-constrained devices.
>>> >>
>>> >> -Boris
>>> >>
>>> >>
>>> >
>>>
>>
>>
>
Received on Thursday, 25 June 2015 13:49:17 UTC

This archive was generated by hypermail 2.3.1 : Friday, 27 October 2017 07:27:31 UTC