WebCore/ChangeLog

 12010-11-24 Yuqiang Xian <yuqiang.xian@intel.com>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 We can create a normal V8 object which has a PixelArray as the backing storage,
 6 and set the "data" property of ImageData object to it.
 7 This way we don't need to call through the C++ bindings for ImageData "data" access.
 8 This eliminates big overhead in switching between JavaScript and native contexts and
 9 performing object bindings when there're frequent "data" property accesses of ImageData.
 10 https://bugs.webkit.org/show_bug.cgi?id=49999
 11
 12 No new tests. Relying on existing Canvas tests.
 13
 14 * WebCore.gypi:
 15 * bindings/scripts/CodeGeneratorV8.pm:
 16 * bindings/v8/custom/V8CanvasPixelArrayCustom.cpp:
 17 (WebCore::toV8):
 18 * bindings/v8/custom/V8ImageDataCustom.cpp: Added.
 19 (WebCore::toV8):
 20 * html/ImageData.idl:
 21 * html/canvas/CanvasPixelArray.idl:
 22
1232010-11-24 James Robinson <jamesr@chromium.org>
224
325 Reviewed by Kenneth Russell.
72709

WebCore/bindings/scripts/CodeGeneratorV8.pm

25272527 # We don't generate a custom converter (but JSC does) for the following:
25282528 return 0 if $interfaceName eq "AbstractWorker";
25292529 return 0 if $interfaceName eq "CanvasRenderingContext";
2530  return 0 if $interfaceName eq "ImageData";
25312530 return 0 if $interfaceName eq "SVGElementInstance";
25322531
25332532 # For everything else, do what JSC does.
72709

WebCore/bindings/v8/custom/V8CanvasPixelArrayCustom.cpp

3838 if (!impl)
3939 return v8::Null();
4040 v8::Handle<v8::Object> wrapper = V8CanvasPixelArray::wrap(impl);
41  if (!wrapper.IsEmpty())
 41 if (!wrapper.IsEmpty()) {
4242 wrapper->SetIndexedPropertiesToPixelData(impl->data()->data(), impl->length());
 43 wrapper->Set(v8::String::NewSymbol("length"),
 44 v8::Integer::New(impl->length()),
 45 v8::ReadOnly);
 46 }
4347 return wrapper;
4448}
4549
72709

WebCore/bindings/v8/custom/V8ImageDataCustom.cpp

 1/*
 2 * Copyright (C) 2010 Google Inc. All rights reserved.
 3 *
 4 * Redistribution and use in source and binary forms, with or without
 5 * modification, are permitted provided that the following conditions are
 6 * met:
 7 *
 8 * * Redistributions of source code must retain the above copyright
 9 * notice, this list of conditions and the following disclaimer.
 10 * * Redistributions in binary form must reproduce the above
 11 * copyright notice, this list of conditions and the following disclaimer
 12 * in the documentation and/or other materials provided with the
 13 * distribution.
 14 * * Neither the name of Google Inc. nor the names of its
 15 * contributors may be used to endorse or promote products derived from
 16 * this software without specific prior written permission.
 17 *
 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 29 */
 30
 31#include "config.h"
 32#include "V8CanvasPixelArray.h"
 33#include "V8ImageData.h"
 34
 35namespace WebCore {
 36
 37v8::Handle<v8::Value> toV8(ImageData* impl)
 38{
 39 if (!impl)
 40 return v8::Null();
 41 v8::Handle<v8::Object> wrapper = V8ImageData::wrap(impl);
 42 if (!wrapper.IsEmpty()) {
 43 // create a V8 CanvasPixelArray object.
 44 v8::Handle<v8::Value> pixelArray = toV8(impl->data());
 45 // set the "data" property of the ImageData object to
 46 // the created v8 object, elimnating the C++ callback
 47 // when accessing the "data" property.
 48 if (!pixelArray.IsEmpty()) {
 49 wrapper->Set(v8::String::NewSymbol("data"),
 50 pixelArray,
 51 v8::ReadOnly);
 52 }
 53 }
 54
 55 return wrapper;
 56}
 57
 58} // namespace WebCore
0

WebCore/WebCore.gypi

744744 'bindings/v8/ChildThreadDOMData.h',
745745 'bindings/v8/IDBBindingUtilities.cpp',
746746 'bindings/v8/IDBBindingUtilities.h',
 747 'bindings/v8/custom/V8ImageDataCustom.cpp',
747748 'bindings/v8/custom/V8CanvasPixelArrayCustom.cpp',
748749 'bindings/v8/custom/V8ArrayBufferViewCustom.h',
749750 'bindings/v8/custom/V8ArrayBufferCustom.cpp',
72709

WebCore/html/ImageData.idl

3333 ] ImageData {
3434 readonly attribute long width;
3535 readonly attribute long height;
36 #if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT || defined(V8_BINDING) && V8_BINDING
 36#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
3737 readonly attribute CanvasPixelArray data;
3838#endif
3939 };
72709

WebCore/html/canvas/CanvasPixelArray.idl

3434 HasNumericIndexGetter,
3535 HasCustomIndexSetter
3636 ] CanvasPixelArray {
 37#if !defined(V8_BINDING) || !V8_BINDING
3738 readonly attribute long length;
 39#endif
3840 };
3941#endif
4042}
72709