From 434b5cde86f9710c0b8ace6304674186c8c46e62 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Fri, 10 May 2013 13:48:47 +0200 Subject: [PATCH] Initial port of JS canvas bindings to use QV4::Object subclass instead of V8 resources This patch comes with the same prototype injection as during the QML locale patch. This will allow for incremental porting method by method for this huge binding. Change-Id: Ie258f021ac6f926302bb375a8ce7a12fb5e0512a Reviewed-by: Lars Knoll --- src/qml/qml/v4/qv4managed_p.h | 5 +- src/qml/qml/v8/qv8engine.cpp | 2 - src/qml/qml/v8/qv8objectresource_p.h | 4 +- src/quick/items/context2d/context2d.pri | 2 + src/quick/items/context2d/qquickcanvascontext_p.h | 2 +- src/quick/items/context2d/qquickcanvasitem.cpp | 6 +- src/quick/items/context2d/qquickcontext2d.cpp | 196 ++++++++++++---------- src/quick/items/context2d/qquickcontext2d_p.h | 4 +- src/quick/items/items.pri | 10 ++ 9 files changed, 134 insertions(+), 97 deletions(-) diff --git a/src/qml/qml/v4/qv4managed_p.h b/src/qml/qml/v4/qv4managed_p.h index 7d2b572..c426f91 100644 --- a/src/qml/qml/v4/qv4managed_p.h +++ b/src/qml/qml/v4/qv4managed_p.h @@ -49,6 +49,7 @@ QT_BEGIN_NAMESPACE class QQmlLocaleData; +class QQuickJSContext2D; namespace QV4 { @@ -163,7 +164,8 @@ public: Type_RegExp, // QML bindings - Type_QmlLocale + Type_QmlLocale, + Type_QQuickJSContext2D }; ExecutionEngine *engine() const; @@ -183,6 +185,7 @@ public: ForeachIteratorObject *asForeachIteratorObject() { return type == Type_ForeachIteratorObject ? reinterpret_cast(this) : 0; } RegExp *asRegExp() { return type == Type_RegExp ? reinterpret_cast(this) : 0; } QQmlLocaleData *asQmlLocale() { return type == Type_QmlLocale ? reinterpret_cast(this) : 0; } + QQuickJSContext2D *asQQuickJSContext2D() { return type == Type_QQuickJSContext2D ? reinterpret_cast(this) : 0; } bool isArrayObject() const { return type == Type_ArrayObject; } bool isStringObject() const { return type == Type_StringObject; } diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index 8797bb3..02327c6 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -216,9 +216,7 @@ QVariant QV8Engine::toVariant(const QV4::Value &value, int typeHint) case QV8ObjectResource::DOMNodeType: case QV8ObjectResource::SQLDatabaseType: case QV8ObjectResource::ListModelType: - case QV8ObjectResource::Context2DType: case QV8ObjectResource::ParticleDataType: - case QV8ObjectResource::LocaleDataType: case QV8ObjectResource::ChangeSetArrayType: return QVariant(); case QV8ObjectResource::TypeType: diff --git a/src/qml/qml/v8/qv8objectresource_p.h b/src/qml/qml/v8/qv8objectresource_p.h index 78fd835..4caba6f 100644 --- a/src/qml/qml/v8/qv8objectresource_p.h +++ b/src/qml/qml/v8/qv8objectresource_p.h @@ -71,9 +71,9 @@ public: QV8ObjectResource(QV8Engine *engine) : engine(engine) { Q_ASSERT(engine); } enum ResourceType { ContextType, QObjectType, TypeType, ListType, VariantType, ValueTypeType, XMLHttpRequestType, DOMNodeType, SQLDatabaseType, - ListModelType, Context2DType, Context2DStyleType, Context2DPixelArrayType, + ListModelType, Context2DStyleType, Context2DPixelArrayType, ParticleDataType, SignalHandlerType, IncubatorType, VisualDataItemType, - SequenceType, LocaleDataType, ChangeSetArrayType }; + SequenceType, ChangeSetArrayType }; virtual ResourceType resourceType() const = 0; QV8Engine *engine; diff --git a/src/quick/items/context2d/context2d.pri b/src/quick/items/context2d/context2d.pri index c73d58b..c41de77 100644 --- a/src/quick/items/context2d/context2d.pri +++ b/src/quick/items/context2d/context2d.pri @@ -14,3 +14,5 @@ HEADERS += \ $$PWD/qquickcontext2dtexture_p.h \ $$PWD/qquickcontext2dcommandbuffer_p.h \ +JS_CLASS_SOURCES += \ + $$PWD/qquickcontext2d.cpp diff --git a/src/quick/items/context2d/qquickcanvascontext_p.h b/src/quick/items/context2d/qquickcanvascontext_p.h index d15f5d9..2e30440 100644 --- a/src/quick/items/context2d/qquickcanvascontext_p.h +++ b/src/quick/items/context2d/qquickcanvascontext_p.h @@ -69,7 +69,7 @@ public: virtual void flush(); virtual void setV8Engine(QV8Engine *engine) = 0; - virtual v8::Handle v8value() const = 0; + virtual QV4::Value v4value() const = 0; virtual QSGDynamicTexture *texture() const = 0; diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp index 780517c..b72d043 100644 --- a/src/quick/items/context2d/qquickcanvasitem.cpp +++ b/src/quick/items/context2d/qquickcanvasitem.cpp @@ -369,7 +369,7 @@ QQmlV4Handle QQuickCanvasItem::context() const { Q_D(const QQuickCanvasItem); if (d->contextInitialized) - return QQmlV4Handle(d->context->v8value()->v4Value()); + return QQmlV4Handle(d->context->v4value()); return QQmlV4Handle(QV4::Value::nullValue()); } @@ -744,7 +744,7 @@ void QQuickCanvasItem::getContext(QQmlV4Function *args) if (d->context != 0) { if (d->context->contextNames().contains(contextId, Qt::CaseInsensitive)) { - args->setReturnValue(d->context->v8value()->v4Value()); + args->setReturnValue(d->context->v4value()); return; } @@ -754,7 +754,7 @@ void QQuickCanvasItem::getContext(QQmlV4Function *args) } if (createContext(contextId)) - args->setReturnValue(d->context->v8value()->v4Value()); + args->setReturnValue(d->context->v4value()); else args->setReturnValue(QV4::Value::nullValue()); } diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp index 8682c42..a0c8c17 100644 --- a/src/quick/items/context2d/qquickcontext2d.cpp +++ b/src/quick/items/context2d/qquickcontext2d.cpp @@ -227,7 +227,7 @@ public: QQuickContext2DEngineData(QV8Engine *engine); ~QQuickContext2DEngineData(); - QV4::PersistentValue constructorContext; + QV4::PersistentValue contextPrototype; QV4::PersistentValue constructorGradient; QV4::PersistentValue constructorPattern; QV4::PersistentValue constructorPixelArray; @@ -236,14 +236,31 @@ public: V8_DEFINE_EXTENSION(QQuickContext2DEngineData, engineData) -class QV8Context2DResource : public QV8ObjectResource +class QV4_JS_CLASS(QQuickJSContext2D) : public QV4::Object { - V8_RESOURCE_TYPE(Context2DType) + QV4_ANNOTATE(staticInitClass true) public: - QV8Context2DResource(QV8Engine *e) : QV8ObjectResource(e), context(0) {} + QQuickJSContext2D(QV4::ExecutionEngine *engine) + : QV4::Object(engine) + { + vtbl = &static_vtbl; + type = Type_QQuickJSContext2D; + } QQuickContext2D* context; + + static void initClass(QV4::ExecutionEngine *engine, const QV4::Value &obj); + +protected: + static void destroy(Managed *that) + { + static_cast(that)->~QQuickJSContext2D(); + } + + static const QV4::ManagedVTable static_vtbl; }; +DEFINE_MANAGED_VTABLE(QQuickJSContext2D); + class QV8Context2DStyleResource : public QV8ObjectResource { V8_RESOURCE_TYPE(Context2DStyleType) @@ -456,7 +473,7 @@ static QV4::Value qt_create_image_data(qreal w, qreal h, QV8Engine* engine, cons */ static v8::Handle ctx2d_canvas(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -473,7 +490,7 @@ static v8::Handle ctx2d_canvas(v8::Handle, const v8::Acce */ static QV4::Value ctx2d_restore(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) r->context->popState(); @@ -486,7 +503,7 @@ static QV4::Value ctx2d_restore(const v8::Arguments &args) */ static QV4::Value ctx2d_reset(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) r->context->reset(); @@ -526,7 +543,7 @@ static QV4::Value ctx2d_reset(const v8::Arguments &args) */ static QV4::Value ctx2d_save(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) r->context->pushState(); @@ -552,7 +569,7 @@ static QV4::Value ctx2d_save(const v8::Arguments &args) */ static QV4::Value ctx2d_rotate(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 1) @@ -576,7 +593,7 @@ static QV4::Value ctx2d_rotate(const v8::Arguments &args) */ static QV4::Value ctx2d_scale(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -620,7 +637,7 @@ static QV4::Value ctx2d_scale(const v8::Arguments &args) */ static QV4::Value ctx2d_setTransform(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -647,7 +664,7 @@ static QV4::Value ctx2d_setTransform(const v8::Arguments &args) */ static QV4::Value ctx2d_transform(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -673,7 +690,7 @@ static QV4::Value ctx2d_transform(const v8::Arguments &args) */ static QV4::Value ctx2d_translate(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -691,7 +708,7 @@ static QV4::Value ctx2d_translate(const v8::Arguments &args) */ static QV4::Value ctx2d_resetTransform(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) r->context->setTransform(1, 0, 0, 1, 0, 0); @@ -706,7 +723,7 @@ static QV4::Value ctx2d_resetTransform(const v8::Arguments &args) */ static QV4::Value ctx2d_shear(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 2) @@ -724,7 +741,7 @@ static QV4::Value ctx2d_shear(const v8::Arguments &args) */ static v8::Handle ctx2d_globalAlpha(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) return v8::Number::New(r->context->state.globalAlpha); @@ -732,7 +749,7 @@ static v8::Handle ctx2d_globalAlpha(v8::Handle, const v8: static void ctx2d_globalAlpha_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) qreal globalAlpha = value->NumberValue(); @@ -774,7 +791,7 @@ static void ctx2d_globalAlpha_set(v8::Handle, v8::Handle */ static v8::Handle ctx2d_globalCompositeOperation(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -785,7 +802,7 @@ static v8::Handle ctx2d_globalCompositeOperation(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) QString mode = value->v4Value().toQString(); @@ -824,7 +841,7 @@ static void ctx2d_globalCompositeOperation_set(v8::Handle, v8::Handl */ static v8::Handle ctx2d_fillStyle(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) QV8Engine *engine = V8ENGINE_ACCESSOR(); @@ -845,7 +862,7 @@ static v8::Handle ctx2d_fillStyle(v8::Handle, const v8::A static void ctx2d_fillStyle_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) QV8Engine *engine = V8ENGINE_ACCESSOR(); @@ -889,7 +906,7 @@ static void ctx2d_fillStyle_set(v8::Handle, v8::Handle va */ static v8::Handle ctx2d_fillRule(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) QV8Engine *engine = V8ENGINE_ACCESSOR(); @@ -898,7 +915,7 @@ static v8::Handle ctx2d_fillRule(v8::Handle, const v8::Ac static void ctx2d_fillRule_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) if ((value->IsString() && value->v4Value().toQString() == QStringLiteral("WindingFill")) @@ -927,7 +944,7 @@ static void ctx2d_fillRule_set(v8::Handle, v8::Handle val */ v8::Handle ctx2d_strokeStyle(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) QV8Engine *engine = V8ENGINE_ACCESSOR(); @@ -948,7 +965,7 @@ v8::Handle ctx2d_strokeStyle(v8::Handle, const v8::Access static void ctx2d_strokeStyle_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) QV8Engine *engine = V8ENGINE_ACCESSOR(); @@ -999,7 +1016,7 @@ static void ctx2d_strokeStyle_set(v8::Handle, v8::Handle static QV4::Value ctx2d_createLinearGradient(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1045,7 +1062,7 @@ static QV4::Value ctx2d_createLinearGradient(const v8::Arguments &args) static QV4::Value ctx2d_createRadialGradient(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1100,7 +1117,7 @@ static QV4::Value ctx2d_createRadialGradient(const v8::Arguments &args) static QV4::Value ctx2d_createConicalGradient(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1176,7 +1193,7 @@ static QV4::Value ctx2d_createConicalGradient(const v8::Arguments &args) */ static QV4::Value ctx2d_createPattern(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1249,7 +1266,7 @@ static QV4::Value ctx2d_createPattern(const v8::Arguments &args) */ v8::Handle ctx2d_lineCap(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1269,7 +1286,7 @@ v8::Handle ctx2d_lineCap(v8::Handle, const v8::AccessorIn static void ctx2d_lineCap_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) QString lineCap = value->v4Value().toQString(); @@ -1305,7 +1322,7 @@ static void ctx2d_lineCap_set(v8::Handle, v8::Handle valu */ v8::Handle ctx2d_lineJoin(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1325,7 +1342,7 @@ v8::Handle ctx2d_lineJoin(v8::Handle, const v8::AccessorI static void ctx2d_lineJoin_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) QString lineJoin = value->v4Value().toQString(); @@ -1351,7 +1368,7 @@ static void ctx2d_lineJoin_set(v8::Handle, v8::Handle val */ v8::Handle ctx2d_lineWidth(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1360,7 +1377,7 @@ v8::Handle ctx2d_lineWidth(v8::Handle, const v8::Accessor static void ctx2d_lineWidth_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) qreal w = value->NumberValue(); @@ -1378,7 +1395,7 @@ static void ctx2d_lineWidth_set(v8::Handle, v8::Handle va */ v8::Handle ctx2d_miterLimit(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1387,7 +1404,7 @@ v8::Handle ctx2d_miterLimit(v8::Handle, const v8::Accesso static void ctx2d_miterLimit_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) qreal ml = value->NumberValue(); @@ -1405,7 +1422,7 @@ static void ctx2d_miterLimit_set(v8::Handle, v8::Handle v */ v8::Handle ctx2d_shadowBlur(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1414,7 +1431,7 @@ v8::Handle ctx2d_shadowBlur(v8::Handle, const v8::Accesso static void ctx2d_shadowBlur_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) qreal blur = value->NumberValue(); @@ -1430,7 +1447,7 @@ static void ctx2d_shadowBlur_set(v8::Handle, v8::Handle v */ v8::Handle ctx2d_shadowColor(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1441,7 +1458,7 @@ v8::Handle ctx2d_shadowColor(v8::Handle, const v8::Access static void ctx2d_shadowColor_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) QColor color = qt_color_from_string(value); @@ -1461,7 +1478,7 @@ static void ctx2d_shadowColor_set(v8::Handle, v8::Handle */ v8::Handle ctx2d_shadowOffsetX(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1470,7 +1487,7 @@ v8::Handle ctx2d_shadowOffsetX(v8::Handle, const v8::Acce static void ctx2d_shadowOffsetX_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) qreal offsetX = value->NumberValue(); @@ -1487,7 +1504,7 @@ static void ctx2d_shadowOffsetX_set(v8::Handle, v8::Handle ctx2d_shadowOffsetY(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1496,7 +1513,7 @@ v8::Handle ctx2d_shadowOffsetY(v8::Handle, const v8::Acce static void ctx2d_shadowOffsetY_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) qreal offsetY = value->NumberValue(); @@ -1508,14 +1525,14 @@ static void ctx2d_shadowOffsetY_set(v8::Handle, v8::Handle ctx2d_path(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) return r->context->m_v8path; } static void ctx2d_path_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) QV8Engine *engine = V8ENGINE_ACCESSOR(); @@ -1538,7 +1555,7 @@ static void ctx2d_path_set(v8::Handle, v8::Handle value, */ static QV4::Value ctx2d_clearRect(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1558,7 +1575,7 @@ static QV4::Value ctx2d_clearRect(const v8::Arguments &args) */ static QV4::Value ctx2d_fillRect(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 4) @@ -1578,7 +1595,7 @@ static QV4::Value ctx2d_fillRect(const v8::Arguments &args) */ static QV4::Value ctx2d_strokeRect(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 4) @@ -1597,7 +1614,7 @@ static QV4::Value ctx2d_strokeRect(const v8::Arguments &args) */ static QV4::Value ctx2d_arc(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() >= 5) { @@ -1644,7 +1661,7 @@ static QV4::Value ctx2d_arc(const v8::Arguments &args) */ static QV4::Value ctx2d_arcTo(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 5) { @@ -1670,7 +1687,7 @@ static QV4::Value ctx2d_arcTo(const v8::Arguments &args) */ static QV4::Value ctx2d_beginPath(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1700,7 +1717,7 @@ static QV4::Value ctx2d_beginPath(const v8::Arguments &args) */ static QV4::Value ctx2d_bezierCurveTo(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1747,7 +1764,7 @@ static QV4::Value ctx2d_bezierCurveTo(const v8::Arguments &args) */ static QV4::Value ctx2d_clip(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) r->context->clip(); @@ -1763,7 +1780,7 @@ static QV4::Value ctx2d_clip(const v8::Arguments &args) */ static QV4::Value ctx2d_closePath(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1783,7 +1800,7 @@ static QV4::Value ctx2d_closePath(const v8::Arguments &args) */ static QV4::Value ctx2d_fill(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r); r->context->fill(); return args.ThisV4(); @@ -1796,7 +1813,7 @@ static QV4::Value ctx2d_fill(const v8::Arguments &args) */ static QV4::Value ctx2d_lineTo(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1820,7 +1837,7 @@ static QV4::Value ctx2d_lineTo(const v8::Arguments &args) */ static QV4::Value ctx2d_moveTo(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 2) { @@ -1843,7 +1860,7 @@ static QV4::Value ctx2d_moveTo(const v8::Arguments &args) */ static QV4::Value ctx2d_quadraticCurveTo(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 4) { @@ -1868,7 +1885,7 @@ static QV4::Value ctx2d_quadraticCurveTo(const v8::Arguments &args) */ static QV4::Value ctx2d_rect(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 4) @@ -1884,7 +1901,7 @@ static QV4::Value ctx2d_rect(const v8::Arguments &args) */ static QV4::Value ctx2d_roundedRect(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 6) @@ -1907,7 +1924,7 @@ static QV4::Value ctx2d_roundedRect(const v8::Arguments &args) */ static QV4::Value ctx2d_ellipse(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) @@ -1925,7 +1942,7 @@ static QV4::Value ctx2d_ellipse(const v8::Arguments &args) */ static QV4::Value ctx2d_text(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 3) { @@ -1950,7 +1967,7 @@ static QV4::Value ctx2d_text(const v8::Arguments &args) */ static QV4::Value ctx2d_stroke(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) r->context->stroke(); @@ -1966,7 +1983,7 @@ static QV4::Value ctx2d_stroke(const v8::Arguments &args) */ static QV4::Value ctx2d_isPointInPath(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) bool pointInPath = false; @@ -2005,7 +2022,7 @@ static QV4::Value ctx2d_caretBlinkRate(const v8::Arguments &args) */ v8::Handle ctx2d_font(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) QV8Engine *engine = V8ENGINE_ACCESSOR(); @@ -2015,7 +2032,7 @@ v8::Handle ctx2d_font(v8::Handle, const v8::AccessorInfo static void ctx2d_font_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) QString fs = value->v4Value().toQString(); @@ -2041,7 +2058,7 @@ static void ctx2d_font_set(v8::Handle, v8::Handle value, */ v8::Handle ctx2d_textAlign(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) QV8Engine *engine = V8ENGINE_ACCESSOR(); switch (r->context->state.textAlign) { @@ -2063,7 +2080,7 @@ v8::Handle ctx2d_textAlign(v8::Handle, const v8::Accessor static void ctx2d_textAlign_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) QString textAlign = value->v4Value().toQString(); @@ -2104,7 +2121,7 @@ static void ctx2d_textAlign_set(v8::Handle, v8::Handle va */ v8::Handle ctx2d_textBaseline(v8::Handle, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) QV8Engine *engine = V8ENGINE_ACCESSOR(); @@ -2127,7 +2144,7 @@ v8::Handle ctx2d_textBaseline(v8::Handle, const v8::Acces static void ctx2d_textBaseline_set(v8::Handle, v8::Handle value, const v8::AccessorInfo &info) { - QV8Context2DResource *r = v8_resource_cast(info.This()); + QQuickJSContext2D *r = info.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT_SETTER(r) QString textBaseline = value->v4Value().toQString(); @@ -2160,7 +2177,7 @@ static void ctx2d_textBaseline_set(v8::Handle, v8::Handle */ static QV4::Value ctx2d_fillText(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 3) { @@ -2183,7 +2200,7 @@ static QV4::Value ctx2d_fillText(const v8::Arguments &args) */ static QV4::Value ctx2d_strokeText(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 3) @@ -2217,7 +2234,7 @@ static QV4::Value ctx2d_strokeText(const v8::Arguments &args) */ static QV4::Value ctx2d_measureText(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() == 1) { @@ -2291,7 +2308,7 @@ static QV4::Value ctx2d_measureText(const v8::Arguments &args) */ static QV4::Value ctx2d_drawImage(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) QV8Engine *engine = V8ENGINE(); @@ -2542,7 +2559,7 @@ v8::Handle ctx2d_pixelArray_indexed_set(uint32_t index, v8::Handle(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) QV8Engine *engine = V8ENGINE(); @@ -2581,7 +2598,7 @@ static QV4::Value ctx2d_createImageData(const v8::Arguments &args) */ static QV4::Value ctx2d_getImageData(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) QV8Engine *engine = V8ENGINE(); @@ -2610,7 +2627,7 @@ static QV4::Value ctx2d_getImageData(const v8::Arguments &args) */ static QV4::Value ctx2d_putImageData(const v8::Arguments &args) { - QV8Context2DResource *r = v8_resource_cast(args.This()); + QQuickJSContext2D *r = args.This()->v4Value().asObject()->asQQuickJSContext2D(); CHECK_CONTEXT(r) if (args.Length() != 3 && args.Length() != 7) return QV4::Value::undefinedValue(); @@ -3348,9 +3365,9 @@ QQuickContext2D::~QQuickContext2D() m_texture->deleteLater(); } -v8::Handle QQuickContext2D::v8value() const +QV4::Value QQuickContext2D::v4value() const { - return m_v8value.value(); + return m_v4value.value(); } QStringList QQuickContext2D::contextNames() const @@ -3526,7 +3543,11 @@ QQuickContext2DEngineData::QQuickContext2DEngineData(QV8Engine *engine) ft->PrototypeTemplate()->Set(v8::String::New("getImageData"), V8FUNCTION(ctx2d_getImageData, engine)); ft->PrototypeTemplate()->Set(v8::String::New("putImageData"), V8FUNCTION(ctx2d_putImageData, engine)); - constructorContext = ft->GetFunction()->v4Value(); + contextPrototype = QV4::Value::fromObject(ft->GetFunction()->NewInstance()->v4Value().asObject()->prototype); + QV4::ExecutionEngine *v4Engine = QV8Engine::getV4(engine); + QV4::Object *v4Prototype = v4Engine->newObject(); + QQuickJSContext2D::initClass(v4Engine, QV4::Value::fromObject(v4Prototype)); + contextPrototype.value().asObject()->prototype->prototype = v4Prototype; v8::Handle ftGradient = v8::FunctionTemplate::New(); ftGradient->InstanceTemplate()->SetHasExternalResource(true); @@ -3665,10 +3686,11 @@ void QQuickContext2D::setV8Engine(QV8Engine *engine) return; QQuickContext2DEngineData *ed = engineData(engine); - m_v8value = ed->constructorContext.value().asFunctionObject()->newInstance(); - QV8Context2DResource *r = new QV8Context2DResource(engine); - r->context = this; - v8::Handle(m_v8value)->SetExternalResource(r); + QV4::ExecutionEngine *v4Engine = QV8Engine::getV4(engine); + QQuickJSContext2D *wrapper = new (v4Engine->memoryManager) QQuickJSContext2D(v4Engine); + wrapper->prototype = ed->contextPrototype.value().asObject(); + wrapper->context = this; + m_v4value = QV4::Value::fromObject(wrapper); } } @@ -3678,4 +3700,6 @@ QQuickContext2DCommandBuffer* QQuickContext2D::nextBuffer() return m_bufferQueue.isEmpty() ? 0 : m_bufferQueue.dequeue(); } +#include "qquickcontext2d_jsclass.cpp" + QT_END_NAMESPACE diff --git a/src/quick/items/context2d/qquickcontext2d_p.h b/src/quick/items/context2d/qquickcontext2d_p.h index cdf6c2e..b1d6c2f 100644 --- a/src/quick/items/context2d/qquickcontext2d_p.h +++ b/src/quick/items/context2d/qquickcontext2d_p.h @@ -173,7 +173,7 @@ public: QSGDynamicTexture *texture() const; QImage toImage(const QRectF& bounds); - v8::Handle v8value() const; + QV4::Value v4value() const; void setV8Engine(QV8Engine *eng); QQuickCanvasItem* canvas() const { return m_canvas; } @@ -239,7 +239,7 @@ public: QV8Engine *m_v8engine; QSurface *m_surface; QOpenGLContext *m_glContext; - QV4::PersistentValue m_v8value; + QV4::PersistentValue m_v4value; QQuickContext2DTexture *m_texture; QQuickCanvasItem::RenderTarget m_renderTarget; QQuickCanvasItem::RenderStrategy m_renderStrategy; diff --git a/src/quick/items/items.pri b/src/quick/items/items.pri index 5aaf7d3..93e5683 100644 --- a/src/quick/items/items.pri +++ b/src/quick/items/items.pri @@ -137,6 +137,16 @@ HEADERS += \ $$PWD/qquickshadereffectnode_p.h \ $$PWD/qquickshadereffectsource_p.h \ +V4DIR = $$PWD/../../qml/qml/v4 +js_class_bindings.output = ${QMAKE_FILE_BASE}_jsclass.cpp +js_class_bindings.input = JS_CLASS_SOURCES +js_class_bindings.script = $$V4DIR/v4classgen +js_class_bindings.commands = python $$js_class_bindings.script ${QMAKE_FILE_IN} --output ${QMAKE_FILE_OUT} +js_class_bindings.depends += $$js_class_bindings.script $$V4DIR/qv4managed_p.h +js_class_bindings.CONFIG += no_link +QMAKE_EXTRA_COMPILERS += js_class_bindings + + include(context2d/context2d.pri) -- 2.7.4