Bug 550309 - Part c: Implement ImageData; r=bz

This commit is contained in:
Ms2ger 2012-03-16 10:44:08 +01:00
Родитель c4ac60d8ed
Коммит b47d7ff113
8 изменённых файлов: 205 добавлений и 38 удалений

Просмотреть файл

@ -0,0 +1,82 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 et tw=78: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/ImageData.h"
#include "nsDOMClassInfoID.h"
#include "nsContentUtils.h"
#include "jsapi.h"
DOMCI_DATA(ImageData, mozilla::dom::ImageData)
namespace mozilla {
namespace dom {
NS_IMPL_CYCLE_COLLECTING_ADDREF(ImageData)
NS_IMPL_CYCLE_COLLECTING_RELEASE(ImageData)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ImageData)
NS_INTERFACE_MAP_ENTRY(nsIDOMImageData)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(ImageData)
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_CLASS(ImageData)
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ImageData)
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(tmp->mData, "mData")
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(ImageData)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ImageData)
tmp->DropData();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
/* readonly attribute unsigned long width; */
NS_IMETHODIMP
ImageData::GetWidth(PRUint32* aWidth)
{
*aWidth = GetWidth();
return NS_OK;
}
/* readonly attribute unsigned long height; */
NS_IMETHODIMP
ImageData::GetHeight(PRUint32* aHeight)
{
*aHeight = GetHeight();
return NS_OK;
}
/* readonly attribute jsval data; */
NS_IMETHODIMP
ImageData::GetData(JS::Value* aData)
{
*aData = GetData();
return NS_OK;
}
void
ImageData::HoldData()
{
NS_HOLD_JS_OBJECTS(this, ImageData);
}
void
ImageData::DropData()
{
if (mData) {
NS_DROP_JS_OBJECTS(this, ImageData);
mData = NULL;
}
}
} // namespace dom
} // namespace mozilla

Просмотреть файл

@ -0,0 +1,77 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 et tw=78: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_ImageData_h
#define mozilla_dom_ImageData_h
#include "nsIDOMCanvasRenderingContext2D.h"
#include "mozilla/Attributes.h"
#include "mozilla/StandardInteger.h"
#include "nsCycleCollectionParticipant.h"
#include "nsTraceRefcnt.h"
#include "xpcpublic.h"
#include "jsapi.h"
namespace mozilla {
namespace dom {
class ImageData MOZ_FINAL : public nsIDOMImageData
{
public:
ImageData(uint32_t aWidth, uint32_t aHeight, JSObject& aData)
: mWidth(aWidth)
, mHeight(aHeight)
, mData(&aData)
{
MOZ_COUNT_CTOR(ImageData);
HoldData();
}
~ImageData()
{
MOZ_COUNT_DTOR(ImageData);
DropData();
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_NSIDOMIMAGEDATA
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(ImageData)
uint32_t GetWidth()
{
return mWidth;
}
uint32_t GetHeight()
{
return mHeight;
}
JS::Value GetData()
{
return JS::ObjectOrNullValue(GetDataObject());
}
JSObject* GetDataObject()
{
xpc_UnmarkGrayObject(mData);
return mData;
}
private:
void HoldData();
void DropData();
ImageData() MOZ_DELETE;
uint32_t mWidth, mHeight;
JSObject* mData;
};
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_ImageData_h

Просмотреть файл

@ -54,6 +54,12 @@ EXPORTS = \
CustomQS_WebGL.h \
$(NULL)
EXPORTS_NAMESPACES = mozilla/dom
EXPORTS_mozilla/dom = \
ImageData.h \
$(NULL)
CPPSRCS = \
CanvasImageCache.cpp \
CanvasUtils.cpp \
@ -61,6 +67,7 @@ CPPSRCS = \
nsCanvasRenderingContext2DAzure.cpp \
DocumentRendererParent.cpp \
DocumentRendererChild.cpp \
ImageData.cpp \
$(NULL)
ifdef MOZ_WEBGL

Просмотреть файл

@ -7600,22 +7600,14 @@ function test_2d_imageData_create_type() {
var canvas = document.getElementById('c261');
var ctx = canvas.getContext('2d');
var _thrown_outer = false;
try {
todo(window.ImageData !== undefined, "window.ImageData !== undefined");
ok(window.ImageData !== undefined, "window.ImageData !== undefined");
ok(window.Uint8ClampedArray !== undefined, "window.Uint8ClampedArray !== undefined");
window.ImageData.prototype.thisImplementsImageData = true;
window.Uint8ClampedArray.prototype.thisImplementsUint8ClampedArray = true;
var imgdata = ctx.createImageData(1, 1);
ok(imgdata.thisImplementsImageData, "imgdata.thisImplementsImageData");
todo(imgdata.thisImplementsImageData, "imgdata.thisImplementsImageData");
ok(imgdata.data.thisImplementsUint8ClampedArray, "imgdata.data.thisImplementsUint8ClampedArray");
} catch (e) {
_thrown_outer = true;
}
todo(!_thrown_outer, ctx.canvas.id + ' should not throw exception');
}
</script>
@ -7632,10 +7624,7 @@ function test_2d_imageData_create1_type() {
var canvas = document.getElementById('c261a');
var ctx = canvas.getContext('2d');
var _thrown_outer = false;
try {
todo(window.ImageData !== undefined, "window.ImageData !== undefined");
ok(window.ImageData !== undefined, "window.ImageData !== undefined");
ok(window.Uint8ClampedArray !== undefined, "window.Uint8ClampedArray !== undefined");
window.ImageData.prototype.thisImplementsImageData = true;
window.Uint8ClampedArray.prototype.thisImplementsUint8ClampedArray = true;
@ -7643,11 +7632,6 @@ var imgdata = ctx.createImageData(ctx.createImageData(1, 1));
todo(imgdata.thisImplementsImageData, "imgdata.thisImplementsImageData");
ok(imgdata.data.thisImplementsUint8ClampedArray, "imgdata.data.thisImplementsUint8ClampedArray");
} catch (e) {
_thrown_outer = true;
}
todo(!_thrown_outer, ctx.canvas.id + ' should not throw exception');
}
</script>
@ -8058,9 +8042,6 @@ function test_2d_imageData_get_source_negative() {
var canvas = document.getElementById('c272');
var ctx = canvas.getContext('2d');
var _thrown_outer = false;
try {
ctx.fillStyle = '#000';
ctx.fillRect(0, 0, 100, 50);
ctx.fillStyle = '#fff';
@ -8082,11 +8063,6 @@ ok(imgdata2.data[1] === 0, "imgdata2.data[\""+(1)+"\"] === 0");
ok(imgdata2.data[2] === 0, "imgdata2.data[\""+(2)+"\"] === 0");
ok(imgdata2.data[3] === 0, "imgdata2.data[\""+(3)+"\"] === 0");
} catch (e) {
_thrown_outer = true;
}
ok(!_thrown_outer, ctx.canvas.id + ' should not throw exception');
}
</script>
@ -8238,22 +8214,14 @@ function test_2d_imageData_get_type() {
var canvas = document.getElementById('c276');
var ctx = canvas.getContext('2d');
var _thrown_outer = false;
try {
todo(window.ImageData !== undefined, "window.ImageData !== undefined");
ok(window.ImageData !== undefined, "window.ImageData !== undefined");
ok(window.Uint8ClampedArray !== undefined, "window.Uint8ClampedArray !== undefined");
window.ImageData.prototype.thisImplementsImageData = true;
window.Uint8ClampedArray.prototype.thisImplementsUint8ClampedArray = true;
var imgdata = ctx.getImageData(0, 0, 1, 1);
ok(imgdata.thisImplementsImageData, "imgdata.thisImplementsImageData");
todo(imgdata.thisImplementsImageData, "imgdata.thisImplementsImageData");
ok(imgdata.data.thisImplementsUint8ClampedArray, "imgdata.data.thisImplementsUint8ClampedArray");
} catch (e) {
_thrown_outer = true;
}
todo(!_thrown_outer, ctx.canvas.id + ' should not throw exception');
}
</script>
@ -8376,7 +8344,7 @@ function test_2d_imageData_object_ctor() {
var canvas = document.getElementById('c280');
var ctx = canvas.getContext('2d');
todo(window.ImageData !== undefined, "window.ImageData !== undefined");
ok(window.ImageData !== undefined, "window.ImageData !== undefined");
try { var _thrown = false;
new window.ImageData(1,1);
} catch (e) { _thrown = true; } finally { ok(_thrown, "should throw exception"); }

Просмотреть файл

@ -1302,6 +1302,8 @@ static nsDOMClassInfoData sClassInfoData[] = {
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(TextMetrics, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(ImageData, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(SmartCardEvent, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
@ -3851,6 +3853,10 @@ nsDOMClassInfo::Init()
DOM_CLASSINFO_MAP_ENTRY(nsIDOMTextMetrics)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(ImageData, nsIDOMImageData)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMImageData)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(XSLTProcessor, nsIXSLTProcessor)
DOM_CLASSINFO_MAP_ENTRY(nsIXSLTProcessor)
DOM_CLASSINFO_MAP_ENTRY(nsIXSLTProcessorPrivate)

Просмотреть файл

@ -350,6 +350,7 @@ DOMCI_CLASS(CanvasRenderingContext2D)
DOMCI_CLASS(CanvasGradient)
DOMCI_CLASS(CanvasPattern)
DOMCI_CLASS(TextMetrics)
DOMCI_CLASS(ImageData)
// SmartCard Events
DOMCI_CLASS(SmartCardEvent)

Просмотреть файл

@ -62,6 +62,14 @@ interface nsIDOMTextMetrics : nsISupports
readonly attribute float width;
};
[scriptable, builtinclass, uuid(1ea11207-b3e3-4ffc-a256-bf5c7011e806)]
interface nsIDOMImageData : nsISupports
{
readonly attribute unsigned long width;
readonly attribute unsigned long height;
readonly attribute jsval data;
};
[scriptable, uuid(274213a8-df51-4b52-bfad-d306a1d5f642)]
interface nsIDOMCanvasRenderingContext2D : nsISupports
{

Просмотреть файл

@ -97,6 +97,7 @@ members = [
'nsIDOMTextMetrics.*',
'nsIDOMCanvasGradient.*',
'nsIDOMCanvasPattern.*',
'nsIDOMImageData.*',
# dom/interfaces/core
'nsIDOMCharacterData.data',
@ -484,6 +485,7 @@ irregularFilenames = {
'nsIDOMTextMetrics': 'nsIDOMCanvasRenderingContext2D',
'nsIDOMCanvasGradient': 'nsIDOMCanvasRenderingContext2D',
'nsIDOMCanvasPattern': 'nsIDOMCanvasRenderingContext2D',
'nsIDOMImageData': 'nsIDOMCanvasRenderingContext2D',
'nsIDOMBlob': 'nsIDOMFile',
@ -524,6 +526,7 @@ customIncludes = [
'nsSVGStylableElement.h',
'nsHTMLDocument.h',
'nsDOMQS.h',
'mozilla/dom/ImageData.h'
]
customQuickStubs = [
@ -534,6 +537,7 @@ customQuickStubs = [
customReturnInterfaces = [
'nsIDOMCanvasPattern',
'nsIDOMCanvasGradient',
'nsIDOMImageData'
]
nsIDOMNode_GetChildNodes_customMethodCallCode = """
@ -1003,5 +1007,19 @@ customMethodCalls = {
# Nasty hack to make the ordering of |arc| and |arcTo| correct.
# |arc| is not traceable because it has an optional argument.
'nsIDOMCanvasRenderingContext2D_ArcTo' : { 'traceable' : False },
'nsIDOMImageData_GetWidth': {
'thisType': 'nsIDOMImageData',
'code': 'uint32_t result = static_cast<mozilla::dom::ImageData*>(self)->GetWidth();',
'canFail': False
},
'nsIDOMImageData_GetHeight': {
'thisType': 'nsIDOMImageData',
'code': 'uint32_t result = static_cast<mozilla::dom::ImageData*>(self)->GetHeight();',
'canFail': False
},
'nsIDOMImageData_GetData': {
'canFail': False
}
}