diff options
Diffstat (limited to 'src/quick/items/context2d/qquickcontext2d.cpp')
-rw-r--r-- | src/quick/items/context2d/qquickcontext2d.cpp | 1442 |
1 files changed, 693 insertions, 749 deletions
diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp index 6a2b36d759..28c84facb5 100644 --- a/src/quick/items/context2d/qquickcontext2d.cpp +++ b/src/quick/items/context2d/qquickcontext2d.cpp @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtQuick module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ @@ -125,10 +117,10 @@ static const double Q_PI = 3.14159265358979323846; // pi #define DEGREES(t) ((t) * 180.0 / Q_PI) -#define CHECK_CONTEXT(r) if (!r || !r->context || !r->context->bufferValid()) \ +#define CHECK_CONTEXT(r) if (!r || !r->d()->context || !r->d()->context->bufferValid()) \ V4THROW_ERROR("Not a Context2D object"); -#define CHECK_CONTEXT_SETTER(r) if (!r || !r->context || !r->context->bufferValid()) \ +#define CHECK_CONTEXT_SETTER(r) if (!r || !r->d()->context || !r->d()->context->bufferValid()) \ V4THROW_ERROR("Not a Context2D object"); #define qClamp(val, min, max) qMin(qMax(val, min), max) #define CHECK_RGBA(c) (c == '-' || c == '.' || (c >=0 && c <= 9)) @@ -482,16 +474,17 @@ public: V8_DEFINE_EXTENSION(QQuickContext2DEngineData, engineData) -class QQuickJSContext2D : public QV4::Object +struct QQuickJSContext2D : public QV4::Object { - V4_OBJECT -public: - QQuickJSContext2D(QV4::ExecutionEngine *engine) - : QV4::Object(engine) - { - setVTable(staticVTable()); - } - QQuickContext2D* context; + struct Data : Object::Data { + Data(QV4::ExecutionEngine *engine) + : Object::Data(engine) + { + setVTable(staticVTable()); + } + QQuickContext2D* context; + }; + V4_OBJECT(QV4::Object) static QV4::ReturnedValue method_get_globalAlpha(QV4::CallContext *ctx); static QV4::ReturnedValue method_set_globalAlpha(QV4::CallContext *ctx); @@ -532,12 +525,6 @@ public: static QV4::ReturnedValue method_set_textAlign(QV4::CallContext *ctx); static QV4::ReturnedValue method_get_textBaseline(QV4::CallContext *ctx); static QV4::ReturnedValue method_set_textBaseline(QV4::CallContext *ctx); - -protected: - static void destroy(Managed *that) - { - static_cast<QQuickJSContext2D *>(that)->~QQuickJSContext2D(); - } }; DEFINE_OBJECT_VTABLE(QQuickJSContext2D); @@ -545,58 +532,59 @@ DEFINE_OBJECT_VTABLE(QQuickJSContext2D); struct QQuickJSContext2DPrototype : public QV4::Object { - V4_OBJECT + V4_OBJECT(QV4::Object) public: - QQuickJSContext2DPrototype(QV4::ExecutionEngine *engine) - : QV4::Object(engine) + static QQuickJSContext2DPrototype *create(QV4::ExecutionEngine *engine) { QV4::Scope scope(engine); - QV4::ScopedObject protectThis(scope, this); - - defineDefaultProperty(QStringLiteral("quadraticCurveTo"), method_quadraticCurveTo, 0); - defineDefaultProperty(QStringLiteral("restore"), method_restore, 0); - defineDefaultProperty(QStringLiteral("moveTo"), method_moveTo, 0); - defineDefaultProperty(QStringLiteral("lineTo"), method_lineTo, 0); - defineDefaultProperty(QStringLiteral("caretBlinkRate"), method_caretBlinkRate, 0); - defineDefaultProperty(QStringLiteral("clip"), method_clip, 0); - defineDefaultProperty(QStringLiteral("setTransform"), method_setTransform, 0); - defineDefaultProperty(QStringLiteral("text"), method_text, 0); - defineDefaultProperty(QStringLiteral("roundedRect"), method_roundedRect, 0); - defineDefaultProperty(QStringLiteral("createPattern"), method_createPattern, 0); - defineDefaultProperty(QStringLiteral("stroke"), method_stroke, 0); - defineDefaultProperty(QStringLiteral("arc"), method_arc, 0); - defineDefaultProperty(QStringLiteral("createImageData"), method_createImageData, 0); - defineDefaultProperty(QStringLiteral("measureText"), method_measureText, 0); - defineDefaultProperty(QStringLiteral("ellipse"), method_ellipse, 0); - defineDefaultProperty(QStringLiteral("fill"), method_fill, 0); - defineDefaultProperty(QStringLiteral("save"), method_save, 0); - defineDefaultProperty(QStringLiteral("scale"), method_scale, 0); - defineDefaultProperty(QStringLiteral("drawImage"), method_drawImage, 0); - defineDefaultProperty(QStringLiteral("transform"), method_transform, 0); - defineDefaultProperty(QStringLiteral("fillText"), method_fillText, 0); - defineDefaultProperty(QStringLiteral("strokeText"), method_strokeText, 0); - defineDefaultProperty(QStringLiteral("translate"), method_translate, 0); - defineDefaultProperty(QStringLiteral("createRadialGradient"), method_createRadialGradient, 0); - defineDefaultProperty(QStringLiteral("shear"), method_shear, 0); - defineDefaultProperty(QStringLiteral("isPointInPath"), method_isPointInPath, 0); - defineDefaultProperty(QStringLiteral("bezierCurveTo"), method_bezierCurveTo, 0); - defineDefaultProperty(QStringLiteral("resetTransform"), method_resetTransform, 0); - defineDefaultProperty(QStringLiteral("arcTo"), method_arcTo, 0); - defineDefaultProperty(QStringLiteral("fillRect"), method_fillRect, 0); - defineDefaultProperty(QStringLiteral("createConicalGradient"), method_createConicalGradient, 0); - defineDefaultProperty(QStringLiteral("drawFocusRing"), method_drawFocusRing, 0); - defineDefaultProperty(QStringLiteral("beginPath"), method_beginPath, 0); - defineDefaultProperty(QStringLiteral("clearRect"), method_clearRect, 0); - defineDefaultProperty(QStringLiteral("rect"), method_rect, 0); - defineDefaultProperty(QStringLiteral("reset"), method_reset, 0); - defineDefaultProperty(QStringLiteral("rotate"), method_rotate, 0); - defineDefaultProperty(QStringLiteral("setCaretSelectionRect"), method_setCaretSelectionRect, 0); - defineDefaultProperty(QStringLiteral("putImageData"), method_putImageData, 0); - defineDefaultProperty(QStringLiteral("getImageData"), method_getImageData, 0); - defineDefaultProperty(QStringLiteral("createLinearGradient"), method_createLinearGradient, 0); - defineDefaultProperty(QStringLiteral("strokeRect"), method_strokeRect, 0); - defineDefaultProperty(QStringLiteral("closePath"), method_closePath, 0); - defineAccessorProperty(QStringLiteral("canvas"), QQuickJSContext2DPrototype::method_get_canvas, 0); + QV4::ScopedObject o(scope, engine->memoryManager->alloc<QQuickJSContext2DPrototype>(engine)); + + o->defineDefaultProperty(QStringLiteral("quadraticCurveTo"), method_quadraticCurveTo, 0); + o->defineDefaultProperty(QStringLiteral("restore"), method_restore, 0); + o->defineDefaultProperty(QStringLiteral("moveTo"), method_moveTo, 0); + o->defineDefaultProperty(QStringLiteral("lineTo"), method_lineTo, 0); + o->defineDefaultProperty(QStringLiteral("caretBlinkRate"), method_caretBlinkRate, 0); + o->defineDefaultProperty(QStringLiteral("clip"), method_clip, 0); + o->defineDefaultProperty(QStringLiteral("setTransform"), method_setTransform, 0); + o->defineDefaultProperty(QStringLiteral("text"), method_text, 0); + o->defineDefaultProperty(QStringLiteral("roundedRect"), method_roundedRect, 0); + o->defineDefaultProperty(QStringLiteral("createPattern"), method_createPattern, 0); + o->defineDefaultProperty(QStringLiteral("stroke"), method_stroke, 0); + o->defineDefaultProperty(QStringLiteral("arc"), method_arc, 0); + o->defineDefaultProperty(QStringLiteral("createImageData"), method_createImageData, 0); + o->defineDefaultProperty(QStringLiteral("measureText"), method_measureText, 0); + o->defineDefaultProperty(QStringLiteral("ellipse"), method_ellipse, 0); + o->defineDefaultProperty(QStringLiteral("fill"), method_fill, 0); + o->defineDefaultProperty(QStringLiteral("save"), method_save, 0); + o->defineDefaultProperty(QStringLiteral("scale"), method_scale, 0); + o->defineDefaultProperty(QStringLiteral("drawImage"), method_drawImage, 0); + o->defineDefaultProperty(QStringLiteral("transform"), method_transform, 0); + o->defineDefaultProperty(QStringLiteral("fillText"), method_fillText, 0); + o->defineDefaultProperty(QStringLiteral("strokeText"), method_strokeText, 0); + o->defineDefaultProperty(QStringLiteral("translate"), method_translate, 0); + o->defineDefaultProperty(QStringLiteral("createRadialGradient"), method_createRadialGradient, 0); + o->defineDefaultProperty(QStringLiteral("shear"), method_shear, 0); + o->defineDefaultProperty(QStringLiteral("isPointInPath"), method_isPointInPath, 0); + o->defineDefaultProperty(QStringLiteral("bezierCurveTo"), method_bezierCurveTo, 0); + o->defineDefaultProperty(QStringLiteral("resetTransform"), method_resetTransform, 0); + o->defineDefaultProperty(QStringLiteral("arcTo"), method_arcTo, 0); + o->defineDefaultProperty(QStringLiteral("fillRect"), method_fillRect, 0); + o->defineDefaultProperty(QStringLiteral("createConicalGradient"), method_createConicalGradient, 0); + o->defineDefaultProperty(QStringLiteral("drawFocusRing"), method_drawFocusRing, 0); + o->defineDefaultProperty(QStringLiteral("beginPath"), method_beginPath, 0); + o->defineDefaultProperty(QStringLiteral("clearRect"), method_clearRect, 0); + o->defineDefaultProperty(QStringLiteral("rect"), method_rect, 0); + o->defineDefaultProperty(QStringLiteral("reset"), method_reset, 0); + o->defineDefaultProperty(QStringLiteral("rotate"), method_rotate, 0); + o->defineDefaultProperty(QStringLiteral("setCaretSelectionRect"), method_setCaretSelectionRect, 0); + o->defineDefaultProperty(QStringLiteral("putImageData"), method_putImageData, 0); + o->defineDefaultProperty(QStringLiteral("getImageData"), method_getImageData, 0); + o->defineDefaultProperty(QStringLiteral("createLinearGradient"), method_createLinearGradient, 0); + o->defineDefaultProperty(QStringLiteral("strokeRect"), method_strokeRect, 0); + o->defineDefaultProperty(QStringLiteral("closePath"), method_closePath, 0); + o->defineAccessorProperty(QStringLiteral("canvas"), QQuickJSContext2DPrototype::method_get_canvas, 0); + + return static_cast<QQuickJSContext2DPrototype*>(o.getPointer()); } static QV4::ReturnedValue method_get_canvas(QV4::CallContext *ctx); @@ -649,26 +637,27 @@ public: DEFINE_OBJECT_VTABLE(QQuickJSContext2DPrototype); -class QQuickContext2DStyle : public QV4::Object +struct QQuickContext2DStyle : public QV4::Object { - V4_OBJECT -public: - QQuickContext2DStyle(QV4::ExecutionEngine *e) - : QV4::Object(e) - , patternRepeatX(false) - , patternRepeatY(false) - { - setVTable(staticVTable()); - } - QBrush brush; - bool patternRepeatX:1; - bool patternRepeatY:1; + struct Data : Object::Data { + Data(QV4::ExecutionEngine *e) + : Object::Data(e) + { + patternRepeatX = false; + patternRepeatY = false; + setVTable(staticVTable()); + } + QBrush brush; + bool patternRepeatX:1; + bool patternRepeatY:1; + }; + V4_OBJECT(QV4::Object) static QV4::ReturnedValue gradient_proto_addColorStop(QV4::CallContext *ctx); protected: static void destroy(Managed *that) { - static_cast<QQuickContext2DStyle *>(that)->~QQuickContext2DStyle(); + static_cast<QQuickContext2DStyle *>(that)->d()->~Data(); } }; @@ -871,63 +860,60 @@ static QString qt_composite_mode_to_string(QPainter::CompositionMode op) struct QQuickJSContext2DPixelData : public QV4::Object { - V4_OBJECT - QQuickJSContext2DPixelData(QV4::ExecutionEngine *engine) - : QV4::Object(engine) - { - setVTable(staticVTable()); - QV4::Scope scope(engine); - QV4::ScopedObject protectThis(scope, this); - Q_UNUSED(protectThis); - setArrayType(QV4::ArrayData::Custom); - } + struct Data : Object::Data { + Data(QV4::ExecutionEngine *engine) + : Object::Data(engine) + { + setVTable(staticVTable()); + QV4::Scope scope(engine); + QV4::ScopedObject o(scope, this); + o->setArrayType(QV4::ArrayData::Custom); + } + QImage image; + }; + V4_OBJECT(QV4::Object) static void destroy(QV4::Managed *that) { - static_cast<QQuickJSContext2DPixelData *>(that)->~QQuickJSContext2DPixelData(); + static_cast<QQuickJSContext2DPixelData *>(that)->d()->~Data(); } static QV4::ReturnedValue getIndexed(QV4::Managed *m, uint index, bool *hasProperty); static void putIndexed(QV4::Managed *m, uint index, const QV4::ValueRef value); static QV4::ReturnedValue proto_get_length(QV4::CallContext *ctx); - - QImage image; }; DEFINE_OBJECT_VTABLE(QQuickJSContext2DPixelData); struct QQuickJSContext2DImageData : public QV4::Object { - V4_OBJECT - QQuickJSContext2DImageData(QV4::ExecutionEngine *engine) - : QV4::Object(engine) - { - setVTable(staticVTable()); - pixelData = QV4::Primitive::undefinedValue(); + struct Data : Object::Data { + Data(QV4::ExecutionEngine *engine) + : Object::Data(engine) + { + setVTable(staticVTable()); + pixelData = QV4::Primitive::undefinedValue(); - QV4::Scope scope(engine); - QV4::ScopedObject protectThis(scope, this); + QV4::Scope scope(engine); + QV4::ScopedObject o(scope, this); - defineAccessorProperty(QStringLiteral("width"), method_get_width, 0); - defineAccessorProperty(QStringLiteral("height"), method_get_height, 0); - defineAccessorProperty(QStringLiteral("data"), method_get_data, 0); - } + o->defineAccessorProperty(QStringLiteral("width"), method_get_width, 0); + o->defineAccessorProperty(QStringLiteral("height"), method_get_height, 0); + o->defineAccessorProperty(QStringLiteral("data"), method_get_data, 0); + } + QV4::Value pixelData; + }; + V4_OBJECT(QV4::Object) static QV4::ReturnedValue method_get_width(QV4::CallContext *ctx); static QV4::ReturnedValue method_get_height(QV4::CallContext *ctx); static QV4::ReturnedValue method_get_data(QV4::CallContext *ctx); static void markObjects(Managed *that, QV4::ExecutionEngine *engine) { - static_cast<QQuickJSContext2DImageData *>(that)->pixelData.mark(engine); + static_cast<QQuickJSContext2DImageData *>(that)->d()->pixelData.mark(engine); QV4::Object::markObjects(that, engine); } - - - - QV4::Value pixelData; }; -DEFINE_REF(QQuickJSContext2DImageData, QV4::Object); - DEFINE_OBJECT_VTABLE(QQuickJSContext2DImageData); static QV4::ReturnedValue qt_create_image_data(qreal w, qreal h, QV8Engine* engine, const QImage& image) @@ -935,20 +921,20 @@ static QV4::ReturnedValue qt_create_image_data(qreal w, qreal h, QV8Engine* engi QQuickContext2DEngineData *ed = engineData(engine); QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2DPixelData> pixelData(scope, new (v4->memoryManager) QQuickJSContext2DPixelData(v4)); + QV4::Scoped<QQuickJSContext2DPixelData> pixelData(scope, scope.engine->memoryManager->alloc<QQuickJSContext2DPixelData>(v4)); QV4::ScopedObject p(scope, ed->pixelArrayProto.value()); pixelData->setPrototype(p.getPointer()); if (image.isNull()) { - pixelData->image = QImage(w, h, QImage::Format_ARGB32); - pixelData->image.fill(0x00000000); + pixelData->d()->image = QImage(w, h, QImage::Format_ARGB32); + pixelData->d()->image.fill(0x00000000); } else { Q_ASSERT(image.width() == int(w) && image.height() == int(h)); - pixelData->image = image.format() == QImage::Format_ARGB32 ? image : image.convertToFormat(QImage::Format_ARGB32); + pixelData->d()->image = image.format() == QImage::Format_ARGB32 ? image : image.convertToFormat(QImage::Format_ARGB32); } - QV4::Scoped<QQuickJSContext2DImageData> imageData(scope, new (v4->memoryManager) QQuickJSContext2DImageData(v4)); - imageData->pixelData = pixelData.asReturnedValue(); + QV4::Scoped<QQuickJSContext2DImageData> imageData(scope, scope.engine->memoryManager->alloc<QQuickJSContext2DImageData>(v4)); + imageData->d()->pixelData = pixelData.asReturnedValue(); return imageData.asReturnedValue(); } @@ -962,12 +948,11 @@ static QV4::ReturnedValue qt_create_image_data(qreal w, qreal h, QV8Engine* engi */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_get_canvas(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - return QV4::QObjectWrapper::wrap(ctx->engine, r->context->canvas()); + return QV4::QObjectWrapper::wrap(scope.engine, r->d()->context->canvas()); } /*! @@ -978,13 +963,12 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_get_canvas(QV4::CallContex */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_restore(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - r->context->popState(); - return ctx->callData->thisObject.asReturnedValue(); + r->d()->context->popState(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -993,14 +977,13 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_restore(QV4::CallContext * */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_reset(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - r->context->reset(); + r->d()->context->reset(); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -1035,14 +1018,13 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_reset(QV4::CallContext *ct */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_save(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - r->context->pushState(); + r->d()->context->pushState(); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } // transformations @@ -1065,14 +1047,13 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_save(QV4::CallContext *ctx */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_rotate(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - if (ctx->callData->argc == 1) - r->context->rotate(ctx->callData->args[0].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + if (ctx->d()->callData->argc >= 1) + r->d()->context->rotate(ctx->d()->callData->args[0].toNumber()); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -1094,15 +1075,14 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_rotate(QV4::CallContext *c */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_scale(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - if (ctx->callData->argc == 2) - r->context->scale(ctx->callData->args[0].toNumber(), ctx->callData->args[1].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + if (ctx->d()->callData->argc >= 2) + r->d()->context->scale(ctx->d()->callData->args[0].toNumber(), ctx->d()->callData->args[1].toNumber()); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -1141,21 +1121,20 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_scale(QV4::CallContext *ct */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_setTransform(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - if (ctx->callData->argc == 6) - r->context->setTransform( ctx->callData->args[0].toNumber() - , ctx->callData->args[1].toNumber() - , ctx->callData->args[2].toNumber() - , ctx->callData->args[3].toNumber() - , ctx->callData->args[4].toNumber() - , ctx->callData->args[5].toNumber()); + if (ctx->d()->callData->argc >= 6) + r->d()->context->setTransform( ctx->d()->callData->args[0].toNumber() + , ctx->d()->callData->args[1].toNumber() + , ctx->d()->callData->args[2].toNumber() + , ctx->d()->callData->args[3].toNumber() + , ctx->d()->callData->args[4].toNumber() + , ctx->d()->callData->args[5].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -1171,20 +1150,19 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_setTransform(QV4::CallCont */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_transform(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - if (ctx->callData->argc == 6) - r->context->transform( ctx->callData->args[0].toNumber() - , ctx->callData->args[1].toNumber() - , ctx->callData->args[2].toNumber() - , ctx->callData->args[3].toNumber() - , ctx->callData->args[4].toNumber() - , ctx->callData->args[5].toNumber()); + if (ctx->d()->callData->argc >= 6) + r->d()->context->transform( ctx->d()->callData->args[0].toNumber() + , ctx->d()->callData->args[1].toNumber() + , ctx->d()->callData->args[2].toNumber() + , ctx->d()->callData->args[3].toNumber() + , ctx->d()->callData->args[4].toNumber() + , ctx->d()->callData->args[5].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -1198,14 +1176,13 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_transform(QV4::CallContext */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_translate(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - if (ctx->callData->argc == 2) - r->context->translate(ctx->callData->args[0].toNumber(), ctx->callData->args[1].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + if (ctx->d()->callData->argc >= 2) + r->d()->context->translate(ctx->d()->callData->args[0].toNumber(), ctx->d()->callData->args[1].toNumber()); + return ctx->d()->callData->thisObject.asReturnedValue(); } @@ -1219,14 +1196,13 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_translate(QV4::CallContext */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_resetTransform(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - r->context->setTransform(1, 0, 0, 1, 0, 0); + r->d()->context->setTransform(1, 0, 0, 1, 0, 0); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } @@ -1238,15 +1214,14 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_resetTransform(QV4::CallCo */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_shear(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - if (ctx->callData->argc == 2) - r->context->shear(ctx->callData->args[0].toNumber(), ctx->callData->args[1].toNumber()); + if (ctx->d()->callData->argc >= 2) + r->d()->context->shear(ctx->d()->callData->args[0].toNumber(), ctx->d()->callData->args[1].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } // compositing @@ -1259,29 +1234,27 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_shear(QV4::CallContext *ct */ QV4::ReturnedValue QQuickJSContext2D::method_get_globalAlpha(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - return QV4::Encode(r->context->state.globalAlpha); + return QV4::Encode(r->d()->context->state.globalAlpha); } QV4::ReturnedValue QQuickJSContext2D::method_set_globalAlpha(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT_SETTER(r) - double globalAlpha = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN(); + double globalAlpha = ctx->d()->callData->argc ? ctx->d()->callData->args[0].toNumber() : qSNaN(); if (!qIsFinite(globalAlpha)) return QV4::Encode::undefined(); - if (globalAlpha >= 0.0 && globalAlpha <= 1.0 && r->context->state.globalAlpha != globalAlpha) { - r->context->state.globalAlpha = globalAlpha; - r->context->buffer()->setGlobalAlpha(r->context->state.globalAlpha); + if (globalAlpha >= 0.0 && globalAlpha <= 1.0 && r->d()->context->state.globalAlpha != globalAlpha) { + r->d()->context->state.globalAlpha = globalAlpha; + r->d()->context->buffer()->setGlobalAlpha(r->d()->context->state.globalAlpha); } return QV4::Encode::undefined(); } @@ -1314,32 +1287,30 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_globalAlpha(QV4::CallContext *c */ QV4::ReturnedValue QQuickJSContext2D::method_get_globalCompositeOperation(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - return QV4::Encode(ctx->engine->newString(qt_composite_mode_to_string(r->context->state.globalCompositeOperation))); + return QV4::Encode(scope.engine->newString(qt_composite_mode_to_string(r->d()->context->state.globalCompositeOperation))); } QV4::ReturnedValue QQuickJSContext2D::method_set_globalCompositeOperation(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT_SETTER(r) - if (!ctx->callData->argc) + if (!ctx->d()->callData->argc) return ctx->throwTypeError(); - QString mode = ctx->callData->args[0].toQString(); + QString mode = ctx->d()->callData->args[0].toQString(); QPainter::CompositionMode cm = qt_composite_mode_from_string(mode); if (cm == QPainter::CompositionMode_SourceOver && mode != QStringLiteral("source-over")) return QV4::Encode::undefined(); - if (cm != r->context->state.globalCompositeOperation) { - r->context->state.globalCompositeOperation = cm; - r->context->buffer()->setGlobalCompositeOperation(cm); + if (cm != r->d()->context->state.globalCompositeOperation) { + r->d()->context->state.globalCompositeOperation = cm; + r->d()->context->buffer()->setGlobalCompositeOperation(cm); } return QV4::Encode::undefined(); } @@ -1369,58 +1340,56 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_globalCompositeOperation(QV4::C */ QV4::ReturnedValue QQuickJSContext2D::method_get_fillStyle(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - QColor color = r->context->state.fillStyle.color(); + QColor color = r->d()->context->state.fillStyle.color(); if (color.isValid()) { if (color.alpha() == 255) - return QV4::Encode(ctx->engine->newString(color.name())); + return QV4::Encode(scope.engine->newString(color.name())); QString alphaString = QString::number(color.alphaF(), 'f'); while (alphaString.endsWith(QLatin1Char('0'))) alphaString.chop(1); if (alphaString.endsWith(QLatin1Char('.'))) alphaString += QLatin1Char('0'); QString str = QString::fromLatin1("rgba(%1, %2, %3, %4)").arg(color.red()).arg(color.green()).arg(color.blue()).arg(alphaString); - return QV4::Encode(ctx->engine->newString(str)); + return QV4::Encode(scope.engine->newString(str)); } - return r->context->m_fillStyle.value(); + return r->d()->context->m_fillStyle.value(); } QV4::ReturnedValue QQuickJSContext2D::method_set_fillStyle(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT_SETTER(r) QV4::ScopedValue value(scope, ctx->argument(0)); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = scope.engine->v8Engine; if (value->asObject()) { QColor color = engine->toVariant(value, qMetaTypeId<QColor>()).value<QColor>(); if (color.isValid()) { - r->context->state.fillStyle = color; - r->context->buffer()->setFillStyle(color); - r->context->m_fillStyle = value; + r->d()->context->state.fillStyle = color; + r->d()->context->buffer()->setFillStyle(color); + r->d()->context->m_fillStyle = value; } else { QV4::Scoped<QQuickContext2DStyle> style(scope, value->as<QQuickContext2DStyle>()); - if (style && style->brush != r->context->state.fillStyle) { - r->context->state.fillStyle = style->brush; - r->context->buffer()->setFillStyle(style->brush, style->patternRepeatX, style->patternRepeatY); - r->context->m_fillStyle = value; - r->context->state.fillPatternRepeatX = style->patternRepeatX; - r->context->state.fillPatternRepeatY = style->patternRepeatY; + if (style && style->d()->brush != r->d()->context->state.fillStyle) { + r->d()->context->state.fillStyle = style->d()->brush; + r->d()->context->buffer()->setFillStyle(style->d()->brush, style->d()->patternRepeatX, style->d()->patternRepeatY); + r->d()->context->m_fillStyle = value; + r->d()->context->state.fillPatternRepeatX = style->d()->patternRepeatX; + r->d()->context->state.fillPatternRepeatY = style->d()->patternRepeatY; } } } else if (value->isString()) { QColor color = qt_color_from_string(value); - if (color.isValid() && r->context->state.fillStyle != QBrush(color)) { - r->context->state.fillStyle = QBrush(color); - r->context->buffer()->setFillStyle(r->context->state.fillStyle); - r->context->m_fillStyle = value; + if (color.isValid() && r->d()->context->state.fillStyle != QBrush(color)) { + r->d()->context->state.fillStyle = QBrush(color); + r->d()->context->buffer()->setFillStyle(r->d()->context->state.fillStyle); + r->d()->context->m_fillStyle = value; } } return QV4::Encode::undefined(); @@ -1439,34 +1408,32 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_fillStyle(QV4::CallContext *ctx */ QV4::ReturnedValue QQuickJSContext2D::method_get_fillRule(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - QV8Engine *engine = ctx->engine->v8Engine; - return engine->fromVariant(r->context->state.fillRule); + QV8Engine *engine = scope.engine->v8Engine; + return engine->fromVariant(r->d()->context->state.fillRule); } QV4::ReturnedValue QQuickJSContext2D::method_set_fillRule(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT_SETTER(r) QV4::ScopedValue value(scope, ctx->argument(0)); if ((value->isString() && value->toQString() == QStringLiteral("WindingFill")) || (value->isInt32() && value->integerValue() == Qt::WindingFill)) { - r->context->state.fillRule = Qt::WindingFill; + r->d()->context->state.fillRule = Qt::WindingFill; } else if ((value->isString() && value->toQStringNoThrow() == QStringLiteral("OddEvenFill")) || (value->isInt32() && value->integerValue() == Qt::OddEvenFill)) { - r->context->state.fillRule = Qt::OddEvenFill; + r->d()->context->state.fillRule = Qt::OddEvenFill; } else { //error } - r->context->m_path.setFillRule(r->context->state.fillRule); + r->d()->context->m_path.setFillRule(r->d()->context->state.fillRule); return QV4::Encode::undefined(); } /*! @@ -1484,59 +1451,57 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_fillRule(QV4::CallContext *ctx) */ QV4::ReturnedValue QQuickJSContext2D::method_get_strokeStyle(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - QColor color = r->context->state.strokeStyle.color(); + QColor color = r->d()->context->state.strokeStyle.color(); if (color.isValid()) { if (color.alpha() == 255) - return QV4::Encode(ctx->engine->newString(color.name())); + return QV4::Encode(scope.engine->newString(color.name())); QString alphaString = QString::number(color.alphaF(), 'f'); while (alphaString.endsWith(QLatin1Char('0'))) alphaString.chop(1); if (alphaString.endsWith(QLatin1Char('.'))) alphaString += QLatin1Char('0'); QString str = QString::fromLatin1("rgba(%1, %2, %3, %4)").arg(color.red()).arg(color.green()).arg(color.blue()).arg(alphaString); - return QV4::Encode(ctx->engine->newString(str)); + return QV4::Encode(scope.engine->newString(str)); } - return r->context->m_strokeStyle.value(); + return r->d()->context->m_strokeStyle.value(); } QV4::ReturnedValue QQuickJSContext2D::method_set_strokeStyle(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT_SETTER(r) - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = scope.engine->v8Engine; QV4::ScopedValue value(scope, ctx->argument(0)); if (value->asObject()) { QColor color = engine->toVariant(value, qMetaTypeId<QColor>()).value<QColor>(); if (color.isValid()) { - r->context->state.fillStyle = color; - r->context->buffer()->setStrokeStyle(color); - r->context->m_strokeStyle = value; + r->d()->context->state.fillStyle = color; + r->d()->context->buffer()->setStrokeStyle(color); + r->d()->context->m_strokeStyle = value; } else { QV4::Scoped<QQuickContext2DStyle> style(scope, value->as<QQuickContext2DStyle>()); - if (style && style->brush != r->context->state.strokeStyle) { - r->context->state.strokeStyle = style->brush; - r->context->buffer()->setStrokeStyle(style->brush, style->patternRepeatX, style->patternRepeatY); - r->context->m_strokeStyle = value; - r->context->state.strokePatternRepeatX = style->patternRepeatX; - r->context->state.strokePatternRepeatY = style->patternRepeatY; + if (style && style->d()->brush != r->d()->context->state.strokeStyle) { + r->d()->context->state.strokeStyle = style->d()->brush; + r->d()->context->buffer()->setStrokeStyle(style->d()->brush, style->d()->patternRepeatX, style->d()->patternRepeatY); + r->d()->context->m_strokeStyle = value; + r->d()->context->state.strokePatternRepeatX = style->d()->patternRepeatX; + r->d()->context->state.strokePatternRepeatY = style->d()->patternRepeatY; } } } else if (value->isString()) { QColor color = qt_color_from_string(value); - if (color.isValid() && r->context->state.strokeStyle != QBrush(color)) { - r->context->state.strokeStyle = QBrush(color); - r->context->buffer()->setStrokeStyle(r->context->state.strokeStyle); - r->context->m_strokeStyle = value; + if (color.isValid() && r->d()->context->state.strokeStyle != QBrush(color)) { + r->d()->context->state.strokeStyle = QBrush(color); + r->d()->context->buffer()->setStrokeStyle(r->d()->context->state.strokeStyle); + r->d()->context->m_strokeStyle = value; } } return QV4::Encode::undefined(); @@ -1561,19 +1526,18 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_strokeStyle(QV4::CallContext *c QV4::ReturnedValue QQuickJSContext2DPrototype::method_createLinearGradient(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = scope.engine->v8Engine; - if (ctx->callData->argc == 4) { - qreal x0 = ctx->callData->args[0].toNumber(); - qreal y0 = ctx->callData->args[1].toNumber(); - qreal x1 = ctx->callData->args[2].toNumber(); - qreal y1 = ctx->callData->args[3].toNumber(); + if (ctx->d()->callData->argc >= 4) { + qreal x0 = ctx->d()->callData->args[0].toNumber(); + qreal y0 = ctx->d()->callData->args[1].toNumber(); + qreal x1 = ctx->d()->callData->args[2].toNumber(); + qreal y1 = ctx->d()->callData->args[3].toNumber(); if (!qIsFinite(x0) || !qIsFinite(y0) @@ -1583,14 +1547,14 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createLinearGradient(QV4:: } QQuickContext2DEngineData *ed = engineData(engine); - QV4::Scoped<QQuickContext2DStyle> gradient(scope, new (v4->memoryManager) QQuickContext2DStyle(v4)); + QV4::Scoped<QQuickContext2DStyle> gradient(scope, scope.engine->memoryManager->alloc<QQuickContext2DStyle>(scope.engine)); QV4::ScopedObject p(scope, ed->gradientProto.value()); gradient->setPrototype(p.getPointer()); - gradient->brush = QLinearGradient(x0, y0, x1, y1); + gradient->d()->brush = QLinearGradient(x0, y0, x1, y1); return gradient.asReturnedValue(); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -1608,21 +1572,20 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createLinearGradient(QV4:: QV4::ReturnedValue QQuickJSContext2DPrototype::method_createRadialGradient(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = scope.engine->v8Engine; - if (ctx->callData->argc == 6) { - qreal x0 = ctx->callData->args[0].toNumber(); - qreal y0 = ctx->callData->args[1].toNumber(); - qreal r0 = ctx->callData->args[2].toNumber(); - qreal x1 = ctx->callData->args[3].toNumber(); - qreal y1 = ctx->callData->args[4].toNumber(); - qreal r1 = ctx->callData->args[5].toNumber(); + if (ctx->d()->callData->argc >= 6) { + qreal x0 = ctx->d()->callData->args[0].toNumber(); + qreal y0 = ctx->d()->callData->args[1].toNumber(); + qreal r0 = ctx->d()->callData->args[2].toNumber(); + qreal x1 = ctx->d()->callData->args[3].toNumber(); + qreal y1 = ctx->d()->callData->args[4].toNumber(); + qreal r1 = ctx->d()->callData->args[5].toNumber(); if (!qIsFinite(x0) || !qIsFinite(y0) @@ -1638,14 +1601,14 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createRadialGradient(QV4:: QQuickContext2DEngineData *ed = engineData(engine); - QV4::Scoped<QQuickContext2DStyle> gradient(scope, new (v4->memoryManager) QQuickContext2DStyle(v4)); + QV4::Scoped<QQuickContext2DStyle> gradient(scope, scope.engine->memoryManager->alloc<QQuickContext2DStyle>(scope.engine)); QV4::ScopedObject p(scope, ed->gradientProto.value()); gradient->setPrototype(p.getPointer()); - gradient->brush = QRadialGradient(QPointF(x1, y1), r0+r1, QPointF(x0, y0)); + gradient->d()->brush = QRadialGradient(QPointF(x1, y1), r0+r1, QPointF(x0, y0)); return gradient.asReturnedValue(); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -1663,18 +1626,17 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createRadialGradient(QV4:: QV4::ReturnedValue QQuickJSContext2DPrototype::method_createConicalGradient(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = scope.engine->v8Engine; - if (ctx->callData->argc == 3) { - qreal x = ctx->callData->args[0].toNumber(); - qreal y = ctx->callData->args[1].toNumber(); - qreal angle = DEGREES(ctx->callData->args[2].toNumber()); + if (ctx->d()->callData->argc >= 3) { + qreal x = ctx->d()->callData->args[0].toNumber(); + qreal y = ctx->d()->callData->args[1].toNumber(); + qreal angle = DEGREES(ctx->d()->callData->args[2].toNumber()); if (!qIsFinite(x) || !qIsFinite(y)) { V4THROW_DOM(DOMEXCEPTION_NOT_SUPPORTED_ERR, "createConicalGradient(): Incorrect arguments"); } @@ -1685,14 +1647,14 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createConicalGradient(QV4: QQuickContext2DEngineData *ed = engineData(engine); - QV4::Scoped<QQuickContext2DStyle> gradient(scope, new (v4->memoryManager) QQuickContext2DStyle(v4)); + QV4::Scoped<QQuickContext2DStyle> gradient(scope, scope.engine->memoryManager->alloc<QQuickContext2DStyle>(scope.engine)); QV4::ScopedObject p(scope, ed->gradientProto.value()); gradient->setPrototype(p.getPointer()); - gradient->brush = QConicalGradient(x, y, angle); + gradient->d()->brush = QConicalGradient(x, y, angle); return gradient.asReturnedValue(); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! \qmlmethod variant QtQuick::Context2D::createPattern(color color, enumeration patternMode) @@ -1739,53 +1701,52 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createConicalGradient(QV4: */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createPattern(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = scope.engine->v8Engine; - if (ctx->callData->argc == 2) { - QV4::Scoped<QQuickContext2DStyle> pattern(scope, new (v4->memoryManager) QQuickContext2DStyle(v4)); + if (ctx->d()->callData->argc >= 2) { + QV4::Scoped<QQuickContext2DStyle> pattern(scope, scope.engine->memoryManager->alloc<QQuickContext2DStyle>(scope.engine)); - QColor color = engine->toVariant(ctx->callData->args[0], qMetaTypeId<QColor>()).value<QColor>(); + QColor color = engine->toVariant(ctx->d()->callData->args[0], qMetaTypeId<QColor>()).value<QColor>(); if (color.isValid()) { - int patternMode = ctx->callData->args[1].toInt32(); + int patternMode = ctx->d()->callData->args[1].toInt32(); Qt::BrushStyle style = Qt::SolidPattern; if (patternMode >= 0 && patternMode < Qt::LinearGradientPattern) { style = static_cast<Qt::BrushStyle>(patternMode); } - pattern->brush = QBrush(color, style); + pattern->d()->brush = QBrush(color, style); } else { QImage patternTexture; - if (QV4::Object *o = ctx->callData->args[0].asObject()) { - QV4::ScopedString s(scope, ctx->engine->newString(QStringLiteral("data"))); - QV4::Scoped<QQuickJSContext2DPixelData> pixelData(scope, o->get(s)); + if (QV4::Object *o = ctx->d()->callData->args[0].asObject()) { + QV4::ScopedString s(scope, scope.engine->newString(QStringLiteral("data"))); + QV4::Scoped<QQuickJSContext2DPixelData> pixelData(scope, o->get(s.getPointer())); if (!!pixelData) { - patternTexture = pixelData->image; + patternTexture = pixelData->d()->image; } } else { - patternTexture = r->context->createPixmap(QUrl(ctx->callData->args[0].toQStringNoThrow()))->image(); + patternTexture = r->d()->context->createPixmap(QUrl(ctx->d()->callData->args[0].toQStringNoThrow()))->image(); } if (!patternTexture.isNull()) { - pattern->brush.setTextureImage(patternTexture); + pattern->d()->brush.setTextureImage(patternTexture); - QString repetition = ctx->callData->args[1].toQStringNoThrow(); + QString repetition = ctx->d()->callData->args[1].toQStringNoThrow(); if (repetition == QStringLiteral("repeat") || repetition.isEmpty()) { - pattern->patternRepeatX = true; - pattern->patternRepeatY = true; + pattern->d()->patternRepeatX = true; + pattern->d()->patternRepeatY = true; } else if (repetition == QStringLiteral("repeat-x")) { - pattern->patternRepeatX = true; - pattern->patternRepeatY = false; + pattern->d()->patternRepeatX = true; + pattern->d()->patternRepeatY = false; } else if (repetition == QStringLiteral("repeat-y")) { - pattern->patternRepeatX = false; - pattern->patternRepeatY = true; + pattern->d()->patternRepeatX = false; + pattern->d()->patternRepeatY = true; } else if (repetition == QStringLiteral("no-repeat")) { - pattern->patternRepeatX = false; - pattern->patternRepeatY = false; + pattern->d()->patternRepeatX = false; + pattern->d()->patternRepeatY = false; } else { //TODO: exception: SYNTAX_ERR } @@ -1813,31 +1774,29 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createPattern(QV4::CallCon */ QV4::ReturnedValue QQuickJSContext2D::method_get_lineCap(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - switch (r->context->state.lineCap) { + switch (r->d()->context->state.lineCap) { case Qt::RoundCap: - return QV4::Encode(ctx->engine->newString(QStringLiteral("round"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("round"))); case Qt::SquareCap: - return QV4::Encode(ctx->engine->newString(QStringLiteral("square"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("square"))); case Qt::FlatCap: default: break; } - return QV4::Encode(ctx->engine->newString(QStringLiteral("butt"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("butt"))); } QV4::ReturnedValue QQuickJSContext2D::method_set_lineCap(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) - QString lineCap = ctx->callData->args[0].toQString(); + QString lineCap = ctx->d()->callData->args[0].toQString(); Qt::PenCapStyle cap; if (lineCap == QStringLiteral("round")) cap = Qt::RoundCap; @@ -1848,9 +1807,9 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_lineCap(QV4::CallContext *ctx) else return QV4::Encode::undefined(); - if (cap != r->context->state.lineCap) { - r->context->state.lineCap = cap; - r->context->buffer()->setLineCap(cap); + if (cap != r->d()->context->state.lineCap) { + r->d()->context->state.lineCap = cap; + r->d()->context->buffer()->setLineCap(cap); } return QV4::Encode::undefined(); } @@ -1871,34 +1830,32 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_lineCap(QV4::CallContext *ctx) */ QV4::ReturnedValue QQuickJSContext2D::method_get_lineJoin(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - switch (r->context->state.lineJoin) { + switch (r->d()->context->state.lineJoin) { case Qt::RoundJoin: - return QV4::Encode(ctx->engine->newString(QStringLiteral("round"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("round"))); case Qt::BevelJoin: - return QV4::Encode(ctx->engine->newString(QStringLiteral("bevel"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("bevel"))); case Qt::MiterJoin: default: break; } - return QV4::Encode(ctx->engine->newString(QStringLiteral("miter"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("miter"))); } QV4::ReturnedValue QQuickJSContext2D::method_set_lineJoin(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) - if (!ctx->callData->argc) + if (!ctx->d()->callData->argc) return ctx->throwTypeError(); - QString lineJoin = ctx->callData->args[0].toQString(); + QString lineJoin = ctx->d()->callData->args[0].toQString(); Qt::PenJoinStyle join; if (lineJoin == QStringLiteral("round")) join = Qt::RoundJoin; @@ -1909,9 +1866,9 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_lineJoin(QV4::CallContext *ctx) else return QV4::Encode::undefined(); - if (join != r->context->state.lineJoin) { - r->context->state.lineJoin = join; - r->context->buffer()->setLineJoin(join); + if (join != r->d()->context->state.lineJoin) { + r->d()->context->state.lineJoin = join; + r->d()->context->buffer()->setLineJoin(join); } return QV4::Encode::undefined(); } @@ -1922,26 +1879,24 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_lineJoin(QV4::CallContext *ctx) */ QV4::ReturnedValue QQuickJSContext2D::method_get_lineWidth(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - return QV4::Encode(r->context->state.lineWidth); + return QV4::Encode(r->d()->context->state.lineWidth); } QV4::ReturnedValue QQuickJSContext2D::method_set_lineWidth(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) - qreal w = ctx->callData->argc ? ctx->callData->args[0].toNumber() : -1; + qreal w = ctx->d()->callData->argc ? ctx->d()->callData->args[0].toNumber() : -1; - if (w > 0 && qIsFinite(w) && w != r->context->state.lineWidth) { - r->context->state.lineWidth = w; - r->context->buffer()->setLineWidth(w); + if (w > 0 && qIsFinite(w) && w != r->d()->context->state.lineWidth) { + r->d()->context->state.lineWidth = w; + r->d()->context->buffer()->setLineWidth(w); } return QV4::Encode::undefined(); } @@ -1953,26 +1908,24 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_lineWidth(QV4::CallContext *ctx */ QV4::ReturnedValue QQuickJSContext2D::method_get_miterLimit(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - return QV4::Encode(r->context->state.miterLimit); + return QV4::Encode(r->d()->context->state.miterLimit); } QV4::ReturnedValue QQuickJSContext2D::method_set_miterLimit(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) - qreal ml = ctx->callData->argc ? ctx->callData->args[0].toNumber() : -1; + qreal ml = ctx->d()->callData->argc ? ctx->d()->callData->args[0].toNumber() : -1; - if (ml > 0 && qIsFinite(ml) && ml != r->context->state.miterLimit) { - r->context->state.miterLimit = ml; - r->context->buffer()->setMiterLimit(ml); + if (ml > 0 && qIsFinite(ml) && ml != r->d()->context->state.miterLimit) { + r->d()->context->state.miterLimit = ml; + r->d()->context->buffer()->setMiterLimit(ml); } return QV4::Encode::undefined(); } @@ -1984,26 +1937,24 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_miterLimit(QV4::CallContext *ct */ QV4::ReturnedValue QQuickJSContext2D::method_get_shadowBlur(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - return QV4::Encode(r->context->state.shadowBlur); + return QV4::Encode(r->d()->context->state.shadowBlur); } QV4::ReturnedValue QQuickJSContext2D::method_set_shadowBlur(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) - qreal blur = ctx->callData->argc ? ctx->callData->args[0].toNumber() : -1; + qreal blur = ctx->d()->callData->argc ? ctx->d()->callData->args[0].toNumber() : -1; - if (blur > 0 && qIsFinite(blur) && blur != r->context->state.shadowBlur) { - r->context->state.shadowBlur = blur; - r->context->buffer()->setShadowBlur(blur); + if (blur > 0 && qIsFinite(blur) && blur != r->d()->context->state.shadowBlur) { + r->d()->context->state.shadowBlur = blur; + r->d()->context->buffer()->setShadowBlur(blur); } return QV4::Encode::undefined(); } @@ -2014,28 +1965,26 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_shadowBlur(QV4::CallContext *ct */ QV4::ReturnedValue QQuickJSContext2D::method_get_shadowColor(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - return QV4::Encode(ctx->engine->newString(r->context->state.shadowColor.name())); + return QV4::Encode(scope.engine->newString(r->d()->context->state.shadowColor.name())); } QV4::ReturnedValue QQuickJSContext2D::method_set_shadowColor(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) QColor color; - if (ctx->callData->argc) - color = qt_color_from_string(ctx->callData->args[0]); + if (ctx->d()->callData->argc) + color = qt_color_from_string(ctx->d()->callData->args[0]); - if (color.isValid() && color != r->context->state.shadowColor) { - r->context->state.shadowColor = color; - r->context->buffer()->setShadowColor(color); + if (color.isValid() && color != r->d()->context->state.shadowColor) { + r->d()->context->state.shadowColor = color; + r->d()->context->buffer()->setShadowColor(color); } return QV4::Encode::undefined(); } @@ -2049,25 +1998,23 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_shadowColor(QV4::CallContext *c */ QV4::ReturnedValue QQuickJSContext2D::method_get_shadowOffsetX(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - return QV4::Encode(r->context->state.shadowOffsetX); + return QV4::Encode(r->d()->context->state.shadowOffsetX); } QV4::ReturnedValue QQuickJSContext2D::method_set_shadowOffsetX(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) - qreal offsetX = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN(); - if (qIsFinite(offsetX) && offsetX != r->context->state.shadowOffsetX) { - r->context->state.shadowOffsetX = offsetX; - r->context->buffer()->setShadowOffsetX(offsetX); + qreal offsetX = ctx->d()->callData->argc ? ctx->d()->callData->args[0].toNumber() : qSNaN(); + if (qIsFinite(offsetX) && offsetX != r->d()->context->state.shadowOffsetX) { + r->d()->context->state.shadowOffsetX = offsetX; + r->d()->context->buffer()->setShadowOffsetX(offsetX); } return QV4::Encode::undefined(); } @@ -2079,57 +2026,53 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_shadowOffsetX(QV4::CallContext */ QV4::ReturnedValue QQuickJSContext2D::method_get_shadowOffsetY(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - return QV4::Encode(r->context->state.shadowOffsetY); + return QV4::Encode(r->d()->context->state.shadowOffsetY); } QV4::ReturnedValue QQuickJSContext2D::method_set_shadowOffsetY(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) - qreal offsetY = ctx->callData->argc ? ctx->callData->args[0].toNumber() : qSNaN(); - if (qIsFinite(offsetY) && offsetY != r->context->state.shadowOffsetY) { - r->context->state.shadowOffsetY = offsetY; - r->context->buffer()->setShadowOffsetY(offsetY); + qreal offsetY = ctx->d()->callData->argc ? ctx->d()->callData->args[0].toNumber() : qSNaN(); + if (qIsFinite(offsetY) && offsetY != r->d()->context->state.shadowOffsetY) { + r->d()->context->state.shadowOffsetY = offsetY; + r->d()->context->buffer()->setShadowOffsetY(offsetY); } return QV4::Encode::undefined(); } QV4::ReturnedValue QQuickJSContext2D::method_get_path(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - return r->context->m_v4path.value(); + return r->d()->context->m_v4path.value(); } QV4::ReturnedValue QQuickJSContext2D::method_set_path(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) QV4::ScopedValue value(scope, ctx->argument(0)); - r->context->beginPath(); - QV4::QObjectWrapperRef qobjectWrapper = value; + r->d()->context->beginPath(); + QV4::Scoped<QV4::QObjectWrapper> qobjectWrapper(scope, value); if (!!qobjectWrapper) { if (QQuickPath *path = qobject_cast<QQuickPath*>(qobjectWrapper->object())) - r->context->m_path = path->path(); + r->d()->context->m_path = path->path(); } else { QString path =value->toQStringNoThrow(); - QQuickSvgParser::parsePathDataFast(path, r->context->m_path); + QQuickSvgParser::parsePathDataFast(path, r->d()->context->m_path); } - r->context->m_v4path = value; + r->d()->context->m_v4path = value; return QV4::Encode::undefined(); } @@ -2140,19 +2083,18 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_path(QV4::CallContext *ctx) */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_clearRect(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 4) - r->context->clearRect(ctx->callData->args[0].toNumber(), - ctx->callData->args[1].toNumber(), - ctx->callData->args[2].toNumber(), - ctx->callData->args[3].toNumber()); + if (ctx->d()->callData->argc >= 4) + r->d()->context->clearRect(ctx->d()->callData->args[0].toNumber(), + ctx->d()->callData->args[1].toNumber(), + ctx->d()->callData->args[2].toNumber(), + ctx->d()->callData->args[3].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! \qmlmethod object QtQuick::Context2D::fillRect(real x, real y, real w, real h) @@ -2162,14 +2104,13 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_clearRect(QV4::CallContext */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_fillRect(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 4) - r->context->fillRect(ctx->callData->args[0].toNumber(), ctx->callData->args[1].toNumber(), ctx->callData->args[2].toNumber(), ctx->callData->args[3].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + if (ctx->d()->callData->argc >= 4) + r->d()->context->fillRect(ctx->d()->callData->args[0].toNumber(), ctx->d()->callData->args[1].toNumber(), ctx->d()->callData->args[2].toNumber(), ctx->d()->callData->args[3].toNumber()); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2184,15 +2125,14 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_fillRect(QV4::CallContext */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_strokeRect(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 4) - r->context->strokeRect(ctx->callData->args[0].toNumber(), ctx->callData->args[1].toNumber(), ctx->callData->args[2].toNumber(), ctx->callData->args[3].toNumber()); + if (ctx->d()->callData->argc >= 4) + r->d()->context->strokeRect(ctx->d()->callData->args[0].toNumber(), ctx->d()->callData->args[1].toNumber(), ctx->d()->callData->args[2].toNumber(), ctx->d()->callData->args[3].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } // Complex shapes (paths) API @@ -2218,31 +2158,30 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_strokeRect(QV4::CallContex */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_arc(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc >= 5) { + if (ctx->d()->callData->argc >= 5) { bool antiClockwise = false; - if (ctx->callData->argc == 6) - antiClockwise = ctx->callData->args[5].toBoolean(); + if (ctx->d()->callData->argc == 6) + antiClockwise = ctx->d()->callData->args[5].toBoolean(); - qreal radius = ctx->callData->args[2].toNumber(); + qreal radius = ctx->d()->callData->args[2].toNumber(); if (qIsFinite(radius) && radius < 0) V4THROW_DOM(DOMEXCEPTION_INDEX_SIZE_ERR, "Incorrect argument radius"); - r->context->arc(ctx->callData->args[0].toNumber(), - ctx->callData->args[1].toNumber(), + r->d()->context->arc(ctx->d()->callData->args[0].toNumber(), + ctx->d()->callData->args[1].toNumber(), radius, - ctx->callData->args[3].toNumber(), - ctx->callData->args[4].toNumber(), + ctx->d()->callData->args[3].toNumber(), + ctx->d()->callData->args[4].toNumber(), antiClockwise); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2270,25 +2209,24 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_arc(QV4::CallContext *ctx) */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_arcTo(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 5) { - qreal radius = ctx->callData->args[4].toNumber(); + if (ctx->d()->callData->argc >= 5) { + qreal radius = ctx->d()->callData->args[4].toNumber(); if (qIsFinite(radius) && radius < 0) V4THROW_DOM(DOMEXCEPTION_INDEX_SIZE_ERR, "Incorrect argument radius"); - r->context->arcTo(ctx->callData->args[0].toNumber(), - ctx->callData->args[1].toNumber(), - ctx->callData->args[2].toNumber(), - ctx->callData->args[3].toNumber(), + r->d()->context->arcTo(ctx->d()->callData->args[0].toNumber(), + ctx->d()->callData->args[1].toNumber(), + ctx->d()->callData->args[2].toNumber(), + ctx->d()->callData->args[3].toNumber(), radius); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2298,14 +2236,13 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_arcTo(QV4::CallContext *ct */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_beginPath(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - r->context->beginPath(); + r->d()->context->beginPath(); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2329,27 +2266,26 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_beginPath(QV4::CallContext */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_bezierCurveTo(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 6) { - qreal cp1x = ctx->callData->args[0].toNumber(); - qreal cp1y = ctx->callData->args[1].toNumber(); - qreal cp2x = ctx->callData->args[2].toNumber(); - qreal cp2y = ctx->callData->args[3].toNumber(); - qreal x = ctx->callData->args[4].toNumber(); - qreal y = ctx->callData->args[5].toNumber(); + if (ctx->d()->callData->argc >= 6) { + qreal cp1x = ctx->d()->callData->args[0].toNumber(); + qreal cp1y = ctx->d()->callData->args[1].toNumber(); + qreal cp2x = ctx->d()->callData->args[2].toNumber(); + qreal cp2y = ctx->d()->callData->args[3].toNumber(); + qreal x = ctx->d()->callData->args[4].toNumber(); + qreal y = ctx->d()->callData->args[5].toNumber(); if (!qIsFinite(cp1x) || !qIsFinite(cp1y) || !qIsFinite(cp2x) || !qIsFinite(cp2y) || !qIsFinite(x) || !qIsFinite(y)) - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); - r->context->bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); + r->d()->context->bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2378,13 +2314,12 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_bezierCurveTo(QV4::CallCon */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_clip(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - r->context->clip(); - return ctx->callData->thisObject.asReturnedValue(); + r->d()->context->clip(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2396,15 +2331,14 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_clip(QV4::CallContext *ctx */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_closePath(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - r->context->closePath(); + r->d()->context->closePath(); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2418,12 +2352,11 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_closePath(QV4::CallContext */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_fill(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r); - r->context->fill(); - return ctx->callData->thisObject.asReturnedValue(); + r->d()->context->fill(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2434,21 +2367,21 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_fill(QV4::CallContext *ctx QV4::ReturnedValue QQuickJSContext2DPrototype::method_lineTo(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 2) { - qreal x = ctx->callData->args[0].toNumber(); - qreal y = ctx->callData->args[1].toNumber(); + if (ctx->d()->callData->argc >= 2) { + qreal x = ctx->d()->callData->args[0].toNumber(); + qreal y = ctx->d()->callData->args[1].toNumber(); if (!qIsFinite(x) || !qIsFinite(y)) - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); - r->context->lineTo(x, y); + r->d()->context->lineTo(x, y); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2459,18 +2392,18 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_lineTo(QV4::CallContext *c QV4::ReturnedValue QQuickJSContext2DPrototype::method_moveTo(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 2) { - qreal x = ctx->callData->args[0].toNumber(); - qreal y = ctx->callData->args[1].toNumber(); + if (ctx->d()->callData->argc >= 2) { + qreal x = ctx->d()->callData->args[0].toNumber(); + qreal y = ctx->d()->callData->args[1].toNumber(); if (!qIsFinite(x) || !qIsFinite(y)) - return ctx->callData->thisObject.asReturnedValue(); - r->context->moveTo(x, y); + return ctx->d()->callData->thisObject.asReturnedValue(); + r->d()->context->moveTo(x, y); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2478,27 +2411,27 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_moveTo(QV4::CallContext *c Adds a quadratic bezier curve between the current point and the endpoint (\c x, \c y) with the control point specified by (\c cpx, \c cpy). - See \l{http://www.w3.org/TR/2dcontext/#dom-context-2d-quadraticcurveto}{W3C 2d context standard for for quadraticCurveTo} + See \l{http://www.w3.org/TR/2dcontext/#dom-context-2d-quadraticcurveto}{W3C 2d context standard for quadraticCurveTo} */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_quadraticCurveTo(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 4) { - qreal cpx = ctx->callData->args[0].toNumber(); - qreal cpy = ctx->callData->args[1].toNumber(); - qreal x = ctx->callData->args[2].toNumber(); - qreal y = ctx->callData->args[3].toNumber(); + if (ctx->d()->callData->argc >= 4) { + qreal cpx = ctx->d()->callData->args[0].toNumber(); + qreal cpy = ctx->d()->callData->args[1].toNumber(); + qreal x = ctx->d()->callData->args[2].toNumber(); + qreal y = ctx->d()->callData->args[3].toNumber(); if (!qIsFinite(cpx) || !qIsFinite(cpy) || !qIsFinite(x) || !qIsFinite(y)) - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); - r->context->quadraticCurveTo(cpx, cpy, x, y); + r->d()->context->quadraticCurveTo(cpx, cpy, x, y); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2509,12 +2442,12 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_quadraticCurveTo(QV4::Call QV4::ReturnedValue QQuickJSContext2DPrototype::method_rect(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 4) - r->context->rect(ctx->callData->args[0].toNumber(), ctx->callData->args[1].toNumber(), ctx->callData->args[2].toNumber(), ctx->callData->args[3].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + if (ctx->d()->callData->argc >= 4) + r->d()->context->rect(ctx->d()->callData->args[0].toNumber(), ctx->d()->callData->args[1].toNumber(), ctx->d()->callData->args[2].toNumber(), ctx->d()->callData->args[3].toNumber()); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2526,17 +2459,17 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_rect(QV4::CallContext *ctx QV4::ReturnedValue QQuickJSContext2DPrototype::method_roundedRect(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 6) - r->context->roundedRect(ctx->callData->args[0].toNumber() - , ctx->callData->args[1].toNumber() - , ctx->callData->args[2].toNumber() - , ctx->callData->args[3].toNumber() - , ctx->callData->args[4].toNumber() - , ctx->callData->args[5].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + if (ctx->d()->callData->argc >= 6) + r->d()->context->roundedRect(ctx->d()->callData->args[0].toNumber() + , ctx->d()->callData->args[1].toNumber() + , ctx->d()->callData->args[2].toNumber() + , ctx->d()->callData->args[3].toNumber() + , ctx->d()->callData->args[4].toNumber() + , ctx->d()->callData->args[5].toNumber()); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2550,14 +2483,14 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_roundedRect(QV4::CallConte QV4::ReturnedValue QQuickJSContext2DPrototype::method_ellipse(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 4) - r->context->ellipse(ctx->callData->args[0].toNumber(), ctx->callData->args[1].toNumber(), ctx->callData->args[2].toNumber(), ctx->callData->args[3].toNumber()); + if (ctx->d()->callData->argc >= 4) + r->d()->context->ellipse(ctx->d()->callData->args[0].toNumber(), ctx->d()->callData->args[1].toNumber(), ctx->d()->callData->args[2].toNumber(), ctx->d()->callData->args[3].toNumber()); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2569,18 +2502,18 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_ellipse(QV4::CallContext * QV4::ReturnedValue QQuickJSContext2DPrototype::method_text(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 3) { - qreal x = ctx->callData->args[1].toNumber(); - qreal y = ctx->callData->args[2].toNumber(); + if (ctx->d()->callData->argc >= 3) { + qreal x = ctx->d()->callData->args[1].toNumber(); + qreal y = ctx->d()->callData->args[2].toNumber(); if (!qIsFinite(x) || !qIsFinite(y)) - return ctx->callData->thisObject.asReturnedValue(); - r->context->text(ctx->callData->args[0].toQStringNoThrow(), x, y); + return ctx->d()->callData->thisObject.asReturnedValue(); + r->d()->context->text(ctx->d()->callData->args[0].toQStringNoThrow(), x, y); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2595,11 +2528,11 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_text(QV4::CallContext *ctx QV4::ReturnedValue QQuickJSContext2DPrototype::method_stroke(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - r->context->stroke(); - return ctx->callData->thisObject.asReturnedValue(); + r->d()->context->stroke(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2611,14 +2544,13 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_stroke(QV4::CallContext *c */ QV4::ReturnedValue QQuickJSContext2DPrototype::method_isPointInPath(QV4::CallContext *ctx) { - QV4::ExecutionEngine *v4 = ctx->engine; - QV4::Scope scope(v4); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scope scope(ctx); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) bool pointInPath = false; - if (ctx->callData->argc == 2) - pointInPath = r->context->isPointInPath(ctx->callData->args[0].toNumber(), ctx->callData->args[1].toNumber()); + if (ctx->d()->callData->argc >= 2) + pointInPath = r->d()->context->isPointInPath(ctx->d()->callData->args[0].toNumber(), ctx->d()->callData->args[1].toNumber()); return QV4::Primitive::fromBoolean(pointInPath).asReturnedValue(); } @@ -2669,24 +2601,24 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_caretBlinkRate(QV4::CallCo QV4::ReturnedValue QQuickJSContext2D::method_get_font(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - return QV4::Encode(ctx->engine->newString(r->context->state.font.toString())); + return QV4::Encode(scope.engine->newString(r->d()->context->state.font.toString())); } QV4::ReturnedValue QQuickJSContext2D::method_set_font(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) QV4::Scoped<QV4::String> s(scope, ctx->argument(0), QV4::Scoped<QV4::String>::Convert); if (scope.engine->hasException) return QV4::Encode::undefined(); - QFont font = qt_font_from_string(s->toQString(), r->context->state.font); - if (font != r->context->state.font) { - r->context->state.font = font; + QFont font = qt_font_from_string(s->toQString(), r->d()->context->state.font); + if (font != r->d()->context->state.font) { + r->d()->context->state.font = font; } return QV4::Encode::undefined(); } @@ -2708,29 +2640,29 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_font(QV4::CallContext *ctx) QV4::ReturnedValue QQuickJSContext2D::method_get_textAlign(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - switch (r->context->state.textAlign) { + switch (r->d()->context->state.textAlign) { case QQuickContext2D::End: - return QV4::Encode(ctx->engine->newString(QStringLiteral("end"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("end"))); case QQuickContext2D::Left: - return QV4::Encode(ctx->engine->newString(QStringLiteral("left"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("left"))); case QQuickContext2D::Right: - return QV4::Encode(ctx->engine->newString(QStringLiteral("right"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("right"))); case QQuickContext2D::Center: - return QV4::Encode(ctx->engine->newString(QStringLiteral("center"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("center"))); case QQuickContext2D::Start: default: break; } - return QV4::Encode(ctx->engine->newString(QStringLiteral("start"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("start"))); } QV4::ReturnedValue QQuickJSContext2D::method_set_textAlign(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) QV4::Scoped<QV4::String> s(scope, ctx->argument(0), QV4::Scoped<QV4::String>::Convert); @@ -2752,8 +2684,8 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_textAlign(QV4::CallContext *ctx else return QV4::Encode::undefined(); - if (ta != r->context->state.textAlign) - r->context->state.textAlign = ta; + if (ta != r->d()->context->state.textAlign) + r->d()->context->state.textAlign = ta; return QV4::Encode::undefined(); } @@ -2776,29 +2708,29 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_textAlign(QV4::CallContext *ctx QV4::ReturnedValue QQuickJSContext2D::method_get_textBaseline(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - switch (r->context->state.textBaseline) { + switch (r->d()->context->state.textBaseline) { case QQuickContext2D::Hanging: - return QV4::Encode(ctx->engine->newString(QStringLiteral("hanging"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("hanging"))); case QQuickContext2D::Top: - return QV4::Encode(ctx->engine->newString(QStringLiteral("top"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("top"))); case QQuickContext2D::Bottom: - return QV4::Encode(ctx->engine->newString(QStringLiteral("bottom"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("bottom"))); case QQuickContext2D::Middle: - return QV4::Encode(ctx->engine->newString(QStringLiteral("middle"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("middle"))); case QQuickContext2D::Alphabetic: default: break; } - return QV4::Encode(ctx->engine->newString(QStringLiteral("alphabetic"))); + return QV4::Encode(scope.engine->newString(QStringLiteral("alphabetic"))); } QV4::ReturnedValue QQuickJSContext2D::method_set_textBaseline(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT_SETTER(r) QV4::Scoped<QV4::String> s(scope, ctx->argument(0), QV4::Scoped<QV4::String>::Convert); if (scope.engine->hasException) @@ -2819,8 +2751,8 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_textBaseline(QV4::CallContext * else return QV4::Encode::undefined(); - if (tb != r->context->state.textBaseline) - r->context->state.textBaseline = tb; + if (tb != r->d()->context->state.textBaseline) + r->d()->context->state.textBaseline = tb; return QV4::Encode::undefined(); } @@ -2836,18 +2768,18 @@ QV4::ReturnedValue QQuickJSContext2D::method_set_textBaseline(QV4::CallContext * QV4::ReturnedValue QQuickJSContext2DPrototype::method_fillText(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 3) { - qreal x = ctx->callData->args[1].toNumber(); - qreal y = ctx->callData->args[2].toNumber(); + if (ctx->d()->callData->argc >= 3) { + qreal x = ctx->d()->callData->args[1].toNumber(); + qreal y = ctx->d()->callData->args[2].toNumber(); if (!qIsFinite(x) || !qIsFinite(y)) - return ctx->callData->thisObject.asReturnedValue(); - QPainterPath textPath = r->context->createTextGlyphs(x, y, ctx->callData->args[0].toQStringNoThrow()); - r->context->buffer()->fill(textPath); + return ctx->d()->callData->thisObject.asReturnedValue(); + QPainterPath textPath = r->d()->context->createTextGlyphs(x, y, ctx->d()->callData->args[0].toQStringNoThrow()); + r->d()->context->buffer()->fill(textPath); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! \qmlmethod object QtQuick::Context2D::strokeText(text, x, y) @@ -2860,12 +2792,12 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_fillText(QV4::CallContext QV4::ReturnedValue QQuickJSContext2DPrototype::method_strokeText(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 3) - r->context->drawText(ctx->callData->args[0].toQStringNoThrow(), ctx->callData->args[1].toNumber(), ctx->callData->args[2].toNumber(), false); - return ctx->callData->thisObject.asReturnedValue(); + if (ctx->d()->callData->argc >= 3) + r->d()->context->drawText(ctx->d()->callData->args[0].toQStringNoThrow(), ctx->d()->callData->args[1].toNumber(), ctx->d()->callData->args[2].toNumber(), false); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -2895,14 +2827,14 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_strokeText(QV4::CallContex QV4::ReturnedValue QQuickJSContext2DPrototype::method_measureText(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) - if (ctx->callData->argc == 1) { - QFontMetrics fm(r->context->state.font); - uint width = fm.width(ctx->callData->args[0].toQStringNoThrow()); - QV4::Scoped<QV4::Object> tm(scope, ctx->engine->newObject()); - tm->put(QV4::ScopedString(scope, ctx->engine->newIdentifier(QStringLiteral("width"))), + if (ctx->d()->callData->argc >= 1) { + QFontMetrics fm(r->d()->context->state.font); + uint width = fm.width(ctx->d()->callData->args[0].toQStringNoThrow()); + QV4::Scoped<QV4::Object> tm(scope, scope.engine->newObject()); + tm->put(QV4::ScopedString(scope, scope.engine->newIdentifier(QStringLiteral("width"))).getPointer(), QV4::ScopedValue(scope, QV4::Primitive::fromDouble(width))); return tm.asReturnedValue(); } @@ -2971,32 +2903,32 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_measureText(QV4::CallConte QV4::ReturnedValue QQuickJSContext2DPrototype::method_drawImage(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject); CHECK_CONTEXT(r) qreal sx, sy, sw, sh, dx, dy, dw, dh; - if (!ctx->callData->argc) - return ctx->callData->thisObject.asReturnedValue(); + if (!ctx->d()->callData->argc) + return ctx->d()->callData->thisObject.asReturnedValue(); //FIXME:This function should be moved to QQuickContext2D::drawImage(...) - if (!r->context->state.invertibleCTM) - return ctx->callData->thisObject.asReturnedValue(); + if (!r->d()->context->state.invertibleCTM) + return ctx->d()->callData->thisObject.asReturnedValue(); QQmlRefPointer<QQuickCanvasPixmap> pixmap; - QV4::ScopedValue arg(scope, ctx->callData->args[0]); + QV4::ScopedValue arg(scope, ctx->d()->callData->args[0]); if (arg->isString()) { QUrl url(arg->toQString()); if (!url.isValid()) V4THROW_DOM(DOMEXCEPTION_TYPE_MISMATCH_ERR, "drawImage(), type mismatch"); - pixmap = r->context->createPixmap(url); + pixmap = r->d()->context->createPixmap(url); } else if (arg->isObject()) { - QV4::QObjectWrapperRef qobjectWrapper = arg; + QV4::Scoped<QV4::QObjectWrapper> qobjectWrapper(scope, arg); if (!!qobjectWrapper) { if (QQuickImage *imageItem = qobject_cast<QQuickImage*>(qobjectWrapper->object())) { - pixmap = r->context->createPixmap(imageItem->source()); + pixmap = r->d()->context->createPixmap(imageItem->source()); } else if (QQuickCanvasItem *canvas = qobject_cast<QQuickCanvasItem*>(qobjectWrapper->object())) { QImage img = canvas->toImage(); if (!img.isNull()) @@ -3005,18 +2937,18 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_drawImage(QV4::CallContext V4THROW_DOM(DOMEXCEPTION_TYPE_MISMATCH_ERR, "drawImage(), type mismatch"); } } else { - QQuickJSContext2DImageDataRef imageData = arg; + QV4::Scoped<QQuickJSContext2DImageData> imageData(scope, arg); if (!!imageData) { - QV4::Scoped<QQuickJSContext2DPixelData> pix(scope, imageData->pixelData.as<QQuickJSContext2DPixelData>()); - if (pix && !pix->image.isNull()) { - pixmap.take(new QQuickCanvasPixmap(pix->image)); + QV4::Scoped<QQuickJSContext2DPixelData> pix(scope, imageData->d()->pixelData.as<QQuickJSContext2DPixelData>()); + if (pix && !pix->d()->image.isNull()) { + pixmap.take(new QQuickCanvasPixmap(pix->d()->image)); } else { V4THROW_DOM(DOMEXCEPTION_TYPE_MISMATCH_ERR, "drawImage(), type mismatch"); } } else { QUrl url(arg->toQStringNoThrow()); if (url.isValid()) - pixmap = r->context->createPixmap(url); + pixmap = r->d()->context->createPixmap(url); else V4THROW_DOM(DOMEXCEPTION_TYPE_MISMATCH_ERR, "drawImage(), type mismatch"); } @@ -3026,37 +2958,37 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_drawImage(QV4::CallContext } if (pixmap.isNull() || !pixmap->isValid()) - return ctx->callData->thisObject.asReturnedValue(); - - if (ctx->callData->argc == 3) { - dx = ctx->callData->args[1].toNumber(); - dy = ctx->callData->args[2].toNumber(); + return ctx->d()->callData->thisObject.asReturnedValue(); + + if (ctx->d()->callData->argc >= 9) { + sx = ctx->d()->callData->args[1].toNumber(); + sy = ctx->d()->callData->args[2].toNumber(); + sw = ctx->d()->callData->args[3].toNumber(); + sh = ctx->d()->callData->args[4].toNumber(); + dx = ctx->d()->callData->args[5].toNumber(); + dy = ctx->d()->callData->args[6].toNumber(); + dw = ctx->d()->callData->args[7].toNumber(); + dh = ctx->d()->callData->args[8].toNumber(); + } else if (ctx->d()->callData->argc >= 5) { sx = 0; sy = 0; sw = pixmap->width(); sh = pixmap->height(); - dw = sw; - dh = sh; - } else if (ctx->callData->argc == 5) { + dx = ctx->d()->callData->args[1].toNumber(); + dy = ctx->d()->callData->args[2].toNumber(); + dw = ctx->d()->callData->args[3].toNumber(); + dh = ctx->d()->callData->args[4].toNumber(); + } else if (ctx->d()->callData->argc >= 3) { + dx = ctx->d()->callData->args[1].toNumber(); + dy = ctx->d()->callData->args[2].toNumber(); sx = 0; sy = 0; sw = pixmap->width(); sh = pixmap->height(); - dx = ctx->callData->args[1].toNumber(); - dy = ctx->callData->args[2].toNumber(); - dw = ctx->callData->args[3].toNumber(); - dh = ctx->callData->args[4].toNumber(); - } else if (ctx->callData->argc == 9) { - sx = ctx->callData->args[1].toNumber(); - sy = ctx->callData->args[2].toNumber(); - sw = ctx->callData->args[3].toNumber(); - sh = ctx->callData->args[4].toNumber(); - dx = ctx->callData->args[5].toNumber(); - dy = ctx->callData->args[6].toNumber(); - dw = ctx->callData->args[7].toNumber(); - dh = ctx->callData->args[8].toNumber(); + dw = sw; + dh = sh; } else { - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } if (!qIsFinite(sx) @@ -3067,7 +2999,7 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_drawImage(QV4::CallContext || !qIsFinite(dy) || !qIsFinite(dw) || !qIsFinite(dh)) - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); if (sx < 0 || sy < 0 @@ -3079,9 +3011,9 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_drawImage(QV4::CallContext V4THROW_DOM(DOMEXCEPTION_INDEX_SIZE_ERR, "drawImage(), index size error"); } - r->context->buffer()->drawPixmap(pixmap, QRectF(sx, sy, sw, sh), QRectF(dx, dy, dw, dh)); + r->d()->context->buffer()->drawPixmap(pixmap, QRectF(sx, sy, sw, sh), QRectF(dx, dy, dw, dh)); - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } // pixel manipulation @@ -3111,13 +3043,13 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_drawImage(QV4::CallContext QV4::ReturnedValue QQuickJSContext2DImageData::method_get_width(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2DImageData> imageData(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2DImageData> imageData(scope, ctx->d()->callData->thisObject); if (!imageData) return ctx->throwTypeError(); - QV4::Scoped<QQuickJSContext2DPixelData> r(scope, imageData->pixelData.as<QQuickJSContext2DPixelData>()); + QV4::Scoped<QQuickJSContext2DPixelData> r(scope, imageData->d()->pixelData.as<QQuickJSContext2DPixelData>()); if (!r) return QV4::Encode(0); - return QV4::Encode(r->image.width()); + return QV4::Encode(r->d()->image.width()); } /*! @@ -3127,13 +3059,13 @@ QV4::ReturnedValue QQuickJSContext2DImageData::method_get_width(QV4::CallContext QV4::ReturnedValue QQuickJSContext2DImageData::method_get_height(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2DImageData> imageData(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2DImageData> imageData(scope, ctx->d()->callData->thisObject); if (!imageData) return ctx->throwTypeError(); - QV4::Scoped<QQuickJSContext2DPixelData> r(scope, imageData->pixelData.as<QQuickJSContext2DPixelData>()); + QV4::Scoped<QQuickJSContext2DPixelData> r(scope, imageData->d()->pixelData.as<QQuickJSContext2DPixelData>()); if (!r) return QV4::Encode(0); - return QV4::Encode(r->image.height()); + return QV4::Encode(r->d()->image.height()); } /*! @@ -3143,10 +3075,10 @@ QV4::ReturnedValue QQuickJSContext2DImageData::method_get_height(QV4::CallContex QV4::ReturnedValue QQuickJSContext2DImageData::method_get_data(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2DImageData> imageData(scope, ctx->callData->thisObject); + QV4::Scoped<QQuickJSContext2DImageData> imageData(scope, ctx->d()->callData->thisObject); if (!imageData) return ctx->throwTypeError(); - return imageData->pixelData.asReturnedValue(); + return imageData->d()->pixelData.asReturnedValue(); } /*! @@ -3170,11 +3102,11 @@ QV4::ReturnedValue QQuickJSContext2DImageData::method_get_data(QV4::CallContext QV4::ReturnedValue QQuickJSContext2DPixelData::proto_get_length(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2DPixelData> r(scope, ctx->callData->thisObject.as<QQuickJSContext2DPixelData>()); - if (!r || r->image.isNull()) + QV4::Scoped<QQuickJSContext2DPixelData> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2DPixelData>()); + if (!r || r->d()->image.isNull()) return QV4::Encode::undefined(); - return QV4::Encode(r->image.width() * r->image.height() * 4); + return QV4::Encode(r->d()->image.width() * r->d()->image.height() * 4); } QV4::ReturnedValue QQuickJSContext2DPixelData::getIndexed(QV4::Managed *m, uint index, bool *hasProperty) @@ -3183,13 +3115,13 @@ QV4::ReturnedValue QQuickJSContext2DPixelData::getIndexed(QV4::Managed *m, uint QV4::Scope scope(v4); QV4::Scoped<QQuickJSContext2DPixelData> r(scope, m->as<QQuickJSContext2DPixelData>()); - if (r && index < static_cast<quint32>(r->image.width() * r->image.height() * 4)) { + if (r && index < static_cast<quint32>(r->d()->image.width() * r->d()->image.height() * 4)) { if (hasProperty) *hasProperty = true; - const quint32 w = r->image.width(); + const quint32 w = r->d()->image.width(); const quint32 row = (index / 4) / w; const quint32 col = (index / 4) % w; - const QRgb* pixel = reinterpret_cast<const QRgb*>(r->image.constScanLine(row)); + const QRgb* pixel = reinterpret_cast<const QRgb*>(r->d()->image.constScanLine(row)); pixel += col; switch (index % 4) { case 0: @@ -3216,17 +3148,17 @@ void QQuickJSContext2DPixelData::putIndexed(QV4::Managed *m, uint index, const Q QV4::Scoped<QQuickJSContext2DPixelData> r(scope, m->as<QQuickJSContext2DPixelData>()); if (!r) { - v4->currentContext()->throwTypeError(); + scope.engine->currentContext()->throwTypeError(); return; } const int v = value->toInt32(); - if (r && index < static_cast<quint32>(r->image.width() * r->image.height() * 4) && v >= 0 && v <= 255) { - const quint32 w = r->image.width(); + if (r && index < static_cast<quint32>(r->d()->image.width() * r->d()->image.height() * 4) && v >= 0 && v <= 255) { + const quint32 w = r->d()->image.width(); const quint32 row = (index / 4) / w; const quint32 col = (index / 4) % w; - QRgb* pixel = reinterpret_cast<QRgb*>(r->image.scanLine(row)); + QRgb* pixel = reinterpret_cast<QRgb*>(r->d()->image.scanLine(row)); pixel += col; switch (index % 4) { case 0: @@ -3268,28 +3200,28 @@ void QQuickJSContext2DPixelData::putIndexed(QV4::Managed *m, uint index, const Q QV4::ReturnedValue QQuickJSContext2DPrototype::method_createImageData(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = scope.engine->v8Engine; - if (ctx->callData->argc == 1) { - QV4::ScopedValue arg0(scope, ctx->callData->args[0]); - QQuickJSContext2DImageDataRef imgData = arg0; + if (ctx->d()->callData->argc == 1) { + QV4::ScopedValue arg0(scope, ctx->d()->callData->args[0]); + QV4::Scoped<QQuickJSContext2DImageData> imgData(scope, arg0); if (!!imgData) { - QV4::Scoped<QQuickJSContext2DPixelData> pa(scope, imgData->pixelData.as<QQuickJSContext2DPixelData>()); + QV4::Scoped<QQuickJSContext2DPixelData> pa(scope, imgData->d()->pixelData.as<QQuickJSContext2DPixelData>()); if (pa) { - qreal w = pa->image.width(); - qreal h = pa->image.height(); + qreal w = pa->d()->image.width(); + qreal h = pa->d()->image.height(); return qt_create_image_data(w, h, engine, QImage()); } } else if (arg0->isString()) { - QImage image = r->context->createPixmap(QUrl(arg0->toQStringNoThrow()))->image(); + QImage image = r->d()->context->createPixmap(QUrl(arg0->toQStringNoThrow()))->image(); return qt_create_image_data(image.width(), image.height(), engine, image); } - } else if (ctx->callData->argc == 2) { - qreal w = ctx->callData->args[0].toNumber(); - qreal h = ctx->callData->args[1].toNumber(); + } else if (ctx->d()->callData->argc == 2) { + qreal w = ctx->d()->callData->args[0].toNumber(); + qreal h = ctx->d()->callData->args[1].toNumber(); if (!qIsFinite(w) || !qIsFinite(h)) V4THROW_DOM(DOMEXCEPTION_NOT_SUPPORTED_ERR, "createImageData(): invalid arguments"); @@ -3309,22 +3241,22 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_createImageData(QV4::CallC QV4::ReturnedValue QQuickJSContext2DPrototype::method_getImageData(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - QV8Engine *engine = ctx->engine->v8Engine; - if (ctx->callData->argc == 4) { - qreal x = ctx->callData->args[0].toNumber(); - qreal y = ctx->callData->args[1].toNumber(); - qreal w = ctx->callData->args[2].toNumber(); - qreal h = ctx->callData->args[3].toNumber(); + QV8Engine *engine = scope.engine->v8Engine; + if (ctx->d()->callData->argc >= 4) { + qreal x = ctx->d()->callData->args[0].toNumber(); + qreal y = ctx->d()->callData->args[1].toNumber(); + qreal w = ctx->d()->callData->args[2].toNumber(); + qreal h = ctx->d()->callData->args[3].toNumber(); if (!qIsFinite(x) || !qIsFinite(y) || !qIsFinite(w) || !qIsFinite(h)) V4THROW_DOM(DOMEXCEPTION_NOT_SUPPORTED_ERR, "getImageData(): Invalid arguments"); if (w <= 0 || h <= 0) V4THROW_DOM(DOMEXCEPTION_INDEX_SIZE_ERR, "getImageData(): Invalid arguments"); - QImage image = r->context->canvas()->toImage(QRectF(x, y, w, h)); + QImage image = r->d()->context->canvas()->toImage(QRectF(x, y, w, h)); return qt_create_image_data(w, h, engine, image); } return QV4::Encode::null(); @@ -3337,36 +3269,36 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_getImageData(QV4::CallCont QV4::ReturnedValue QQuickJSContext2DPrototype::method_putImageData(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickJSContext2D> r(scope, ctx->callData->thisObject.as<QQuickJSContext2D>()); + QV4::Scoped<QQuickJSContext2D> r(scope, ctx->d()->callData->thisObject.as<QQuickJSContext2D>()); CHECK_CONTEXT(r) - if (ctx->callData->argc != 3 && ctx->callData->argc != 7) + if (ctx->d()->callData->argc < 7) return QV4::Encode::undefined(); - QV4::ScopedValue arg0(scope, ctx->callData->args[0]); + QV4::ScopedValue arg0(scope, ctx->d()->callData->args[0]); if (!arg0->isObject()) V4THROW_DOM(DOMEXCEPTION_TYPE_MISMATCH_ERR, "Context2D::putImageData, the image data type mismatch"); - qreal dx = ctx->callData->args[1].toNumber(); - qreal dy = ctx->callData->args[2].toNumber(); + qreal dx = ctx->d()->callData->args[1].toNumber(); + qreal dy = ctx->d()->callData->args[2].toNumber(); qreal w, h, dirtyX, dirtyY, dirtyWidth, dirtyHeight; if (!qIsFinite(dx) || !qIsFinite(dy)) V4THROW_DOM(DOMEXCEPTION_NOT_SUPPORTED_ERR, "putImageData() : Invalid arguments"); - QQuickJSContext2DImageDataRef imageData = arg0; + QV4::Scoped<QQuickJSContext2DImageData> imageData(scope, arg0); if (!imageData) - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); - QV4::Scoped<QQuickJSContext2DPixelData> pixelArray(scope, imageData->pixelData.as<QQuickJSContext2DPixelData>()); + QV4::Scoped<QQuickJSContext2DPixelData> pixelArray(scope, imageData->d()->pixelData.as<QQuickJSContext2DPixelData>()); if (pixelArray) { - w = pixelArray->image.width(); - h = pixelArray->image.height(); + w = pixelArray->d()->image.width(); + h = pixelArray->d()->image.height(); - if (ctx->callData->argc == 7) { - dirtyX = ctx->callData->args[3].toNumber(); - dirtyY = ctx->callData->args[4].toNumber(); - dirtyWidth = ctx->callData->args[5].toNumber(); - dirtyHeight = ctx->callData->args[6].toNumber(); + if (ctx->d()->callData->argc == 7) { + dirtyX = ctx->d()->callData->args[3].toNumber(); + dirtyY = ctx->d()->callData->args[4].toNumber(); + dirtyWidth = ctx->d()->callData->args[5].toNumber(); + dirtyHeight = ctx->d()->callData->args[6].toNumber(); if (!qIsFinite(dirtyX) || !qIsFinite(dirtyY) || !qIsFinite(dirtyWidth) || !qIsFinite(dirtyHeight)) V4THROW_DOM(DOMEXCEPTION_NOT_SUPPORTED_ERR, "putImageData() : Invalid arguments"); @@ -3401,7 +3333,7 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_putImageData(QV4::CallCont } if (dirtyWidth <=0 || dirtyHeight <= 0) - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } else { dirtyX = 0; dirtyY = 0; @@ -3409,10 +3341,10 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_putImageData(QV4::CallCont dirtyHeight = h; } - QImage image = pixelArray->image.copy(dirtyX, dirtyY, dirtyWidth, dirtyHeight); - r->context->buffer()->drawImage(image, QRectF(dirtyX, dirtyY, dirtyWidth, dirtyHeight), QRectF(dx, dy, dirtyWidth, dirtyHeight)); + QImage image = pixelArray->d()->image.copy(dirtyX, dirtyY, dirtyWidth, dirtyHeight); + r->d()->context->buffer()->drawImage(image, QRectF(dirtyX, dirtyY, dirtyWidth, dirtyHeight), QRectF(dx, dy, dirtyWidth, dirtyHeight)); } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } /*! @@ -3438,24 +3370,24 @@ QV4::ReturnedValue QQuickJSContext2DPrototype::method_putImageData(QV4::CallCont QV4::ReturnedValue QQuickContext2DStyle::gradient_proto_addColorStop(QV4::CallContext *ctx) { QV4::Scope scope(ctx); - QV4::Scoped<QQuickContext2DStyle> style(scope, ctx->callData->thisObject.as<QQuickContext2DStyle>()); + QV4::Scoped<QQuickContext2DStyle> style(scope, ctx->d()->callData->thisObject.as<QQuickContext2DStyle>()); if (!style) V4THROW_ERROR("Not a CanvasGradient object"); - QV8Engine *engine = ctx->engine->v8Engine; + QV8Engine *engine = scope.engine->v8Engine; - if (ctx->callData->argc == 2) { + if (ctx->d()->callData->argc == 2) { - if (!style->brush.gradient()) + if (!style->d()->brush.gradient()) V4THROW_ERROR("Not a valid CanvasGradient object, can't get the gradient information"); - QGradient gradient = *(style->brush.gradient()); - qreal pos = ctx->callData->args[0].toNumber(); + QGradient gradient = *(style->d()->brush.gradient()); + qreal pos = ctx->d()->callData->args[0].toNumber(); QColor color; - if (ctx->callData->args[1].asObject()) { - color = engine->toVariant(ctx->callData->args[1], qMetaTypeId<QColor>()).value<QColor>(); + if (ctx->d()->callData->args[1].asObject()) { + color = engine->toVariant(ctx->d()->callData->args[1], qMetaTypeId<QColor>()).value<QColor>(); } else { - color = qt_color_from_string(ctx->callData->args[1]); + color = qt_color_from_string(ctx->d()->callData->args[1]); } if (pos < 0.0 || pos > 1.0 || !qIsFinite(pos)) { V4THROW_DOM(DOMEXCEPTION_INDEX_SIZE_ERR, "CanvasGradient: parameter offset out of range"); @@ -3466,10 +3398,10 @@ QV4::ReturnedValue QQuickContext2DStyle::gradient_proto_addColorStop(QV4::CallCo } else { V4THROW_DOM(DOMEXCEPTION_SYNTAX_ERR, "CanvasGradient: parameter color is not a valid color string"); } - style->brush = gradient; + style->d()->brush = gradient; } - return ctx->callData->thisObject.asReturnedValue(); + return ctx->d()->callData->thisObject.asReturnedValue(); } void QQuickContext2D::scale(qreal x, qreal y) @@ -4087,6 +4019,13 @@ public: QOffscreenSurface *surface; }; +class QQuickContext2DTextureCleanup : public QRunnable +{ +public: + QQuickContext2DTexture *texture; + void run() Q_DECL_OVERRIDE { delete texture; } +}; + QMutex QQuickContext2D::mutex; QQuickContext2D::QQuickContext2D(QObject *parent) @@ -4119,7 +4058,13 @@ QQuickContext2D::~QQuickContext2D() cleaner->moveToThread(m_texture->thread()); cleaner->deleteLater(); } else { - m_texture->deleteLater(); + if (m_canvas->window()) { + QQuickContext2DTextureCleanup *c = new QQuickContext2DTextureCleanup; + c->texture = m_texture; + m_canvas->window()->scheduleRenderJob(c, QQuickWindow::AfterSynchronizingStage); + } else { + m_texture->deleteLater(); + } } } else { // Image based does not have GL resources, but must still be deleted @@ -4271,7 +4216,7 @@ QQuickContext2DEngineData::QQuickContext2DEngineData(QV8Engine *engine) QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); QV4::Scope scope(v4); - QV4::Scoped<QV4::Object> proto(scope, new (v4->memoryManager) QQuickJSContext2DPrototype(v4)); + QV4::Scoped<QV4::Object> proto(scope, QQuickJSContext2DPrototype::create(v4)); proto->defineAccessorProperty(QStringLiteral("strokeStyle"), QQuickJSContext2D::method_get_strokeStyle, QQuickJSContext2D::method_set_strokeStyle); proto->defineAccessorProperty(QStringLiteral("font"), QQuickJSContext2D::method_get_font, QQuickJSContext2D::method_set_font); proto->defineAccessorProperty(QStringLiteral("fillRule"), QQuickJSContext2D::method_get_fillRule, QQuickJSContext2D::method_set_fillRule); @@ -4291,13 +4236,12 @@ QQuickContext2DEngineData::QQuickContext2DEngineData(QV8Engine *engine) proto->defineAccessorProperty(QStringLiteral("shadowBlur"), QQuickJSContext2D::method_get_shadowBlur, QQuickJSContext2D::method_set_shadowBlur); contextPrototype = proto; - proto = v4->newObject(); + proto = scope.engine->newObject(); proto->defineDefaultProperty(QStringLiteral("addColorStop"), QQuickContext2DStyle::gradient_proto_addColorStop, 0); gradientProto = proto; - proto = v4->newObject(); - QV4::ScopedString s(scope, v4->id_length); - proto->defineAccessorProperty(s, QQuickJSContext2DPixelData::proto_get_length, 0); + proto = scope.engine->newObject(); + proto->defineAccessorProperty(scope.engine->id_length, QQuickJSContext2DPixelData::proto_get_length, 0); pixelArrayProto = proto; } @@ -4387,10 +4331,10 @@ void QQuickContext2D::setV8Engine(QV8Engine *engine) QQuickContext2DEngineData *ed = engineData(engine); QV4::ExecutionEngine *v4Engine = QV8Engine::getV4(engine); QV4::Scope scope(v4Engine); - QV4::Scoped<QQuickJSContext2D> wrapper(scope, new (v4Engine->memoryManager) QQuickJSContext2D(v4Engine)); + QV4::Scoped<QQuickJSContext2D> wrapper(scope, v4Engine->memoryManager->alloc<QQuickJSContext2D>(v4Engine)); QV4::ScopedObject p(scope, ed->contextPrototype.value()); wrapper->setPrototype(p.getPointer()); - wrapper->context = this; + wrapper->d()->context = this; m_v4value = wrapper; } } |