1d0825bca7fe65beaee391d30da42e937db621564Steve Block/* 2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies) 3d0825bca7fe65beaee391d30da42e937db621564Steve Block * 4d0825bca7fe65beaee391d30da42e937db621564Steve Block * This library is free software; you can redistribute it and/or 5d0825bca7fe65beaee391d30da42e937db621564Steve Block * modify it under the terms of the GNU Lesser General Public 6d0825bca7fe65beaee391d30da42e937db621564Steve Block * License as published by the Free Software Foundation; either 7d0825bca7fe65beaee391d30da42e937db621564Steve Block * version 2 of the License, or (at your option) any later version. 8d0825bca7fe65beaee391d30da42e937db621564Steve Block * 9d0825bca7fe65beaee391d30da42e937db621564Steve Block * This library is distributed in the hope that it will be useful, 10d0825bca7fe65beaee391d30da42e937db621564Steve Block * but WITHOUT ANY WARRANTY; without even the implied warranty of 11d0825bca7fe65beaee391d30da42e937db621564Steve Block * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12d0825bca7fe65beaee391d30da42e937db621564Steve Block * Lesser General Public License for more details. 13d0825bca7fe65beaee391d30da42e937db621564Steve Block * 14d0825bca7fe65beaee391d30da42e937db621564Steve Block * You should have received a copy of the GNU Lesser General Public 15d0825bca7fe65beaee391d30da42e937db621564Steve Block * License along with this library; if not, write to the Free Software 16d0825bca7fe65beaee391d30da42e937db621564Steve Block * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17d0825bca7fe65beaee391d30da42e937db621564Steve Block * 18d0825bca7fe65beaee391d30da42e937db621564Steve Block */ 19d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "config.h" 20d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "qt_pixmapruntime.h" 21d0825bca7fe65beaee391d30da42e937db621564Steve Block 22d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "CachedImage.h" 23d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HTMLImageElement.h" 24d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "JSGlobalObject.h" 25d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "JSHTMLImageElement.h" 26d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "JSLock.h" 27d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "ObjectPrototype.h" 28d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "StillImageQt.h" 29d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QBuffer> 30d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QByteArray> 31d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QImage> 32d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QPixmap> 33d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QVariant> 345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include <runtime_method.h> 35d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <runtime_object.h> 36d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <runtime_root.h> 3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "runtime/FunctionPrototype.h" 38d0825bca7fe65beaee391d30da42e937db621564Steve Block 39d0825bca7fe65beaee391d30da42e937db621564Steve Blockusing namespace WebCore; 40d0825bca7fe65beaee391d30da42e937db621564Steve Blocknamespace JSC { 41d0825bca7fe65beaee391d30da42e937db621564Steve Block 42d0825bca7fe65beaee391d30da42e937db621564Steve Blocknamespace Bindings { 43d0825bca7fe65beaee391d30da42e937db621564Steve Block 44d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass QtPixmapClass : public Class { 45d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic: 46d0825bca7fe65beaee391d30da42e937db621564Steve Block QtPixmapClass(); 47d0825bca7fe65beaee391d30da42e937db621564Steve Block virtual MethodList methodsNamed(const Identifier&, Instance*) const; 48d0825bca7fe65beaee391d30da42e937db621564Steve Block virtual Field* fieldNamed(const Identifier&, Instance*) const; 49d0825bca7fe65beaee391d30da42e937db621564Steve Block}; 50d0825bca7fe65beaee391d30da42e937db621564Steve Block 51d0825bca7fe65beaee391d30da42e937db621564Steve Block 52d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass QtPixmapWidthField : public Field { 53d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic: 54d0825bca7fe65beaee391d30da42e937db621564Steve Block static const char* name() { return "width"; } 55e14391e94c850b8bd03680c23b38978db68687a8John Reck virtual JSValue valueFromInstance(ExecState*, const Instance* instance) const 56d0825bca7fe65beaee391d30da42e937db621564Steve Block { 57e14391e94c850b8bd03680c23b38978db68687a8John Reck return jsNumber(static_cast<const QtPixmapInstance*>(instance)->width()); 58d0825bca7fe65beaee391d30da42e937db621564Steve Block } 59d0825bca7fe65beaee391d30da42e937db621564Steve Block virtual void setValueToInstance(ExecState*, const Instance*, JSValue) const {} 60d0825bca7fe65beaee391d30da42e937db621564Steve Block}; 61692e5dbf12901edacf14812a6fae25462920af42Steve Block 62d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass QtPixmapHeightField : public Field { 63d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic: 64d0825bca7fe65beaee391d30da42e937db621564Steve Block static const char* name() { return "height"; } 65e14391e94c850b8bd03680c23b38978db68687a8John Reck virtual JSValue valueFromInstance(ExecState*, const Instance* instance) const 66d0825bca7fe65beaee391d30da42e937db621564Steve Block { 67e14391e94c850b8bd03680c23b38978db68687a8John Reck return jsNumber(static_cast<const QtPixmapInstance*>(instance)->height()); 68d0825bca7fe65beaee391d30da42e937db621564Steve Block } 69d0825bca7fe65beaee391d30da42e937db621564Steve Block virtual void setValueToInstance(ExecState*, const Instance*, JSValue) const {} 70d0825bca7fe65beaee391d30da42e937db621564Steve Block}; 71d0825bca7fe65beaee391d30da42e937db621564Steve Block 72d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass QtPixmapRuntimeMethod : public Method { 73d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic: 74d0825bca7fe65beaee391d30da42e937db621564Steve Block virtual int numParameters() const 75d0825bca7fe65beaee391d30da42e937db621564Steve Block { 76d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 77d0825bca7fe65beaee391d30da42e937db621564Steve Block } 785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke virtual JSValue invoke(ExecState* exec, QtPixmapInstance*) = 0; 79d0825bca7fe65beaee391d30da42e937db621564Steve Block 80d0825bca7fe65beaee391d30da42e937db621564Steve Block}; 81d0825bca7fe65beaee391d30da42e937db621564Steve Block 82692e5dbf12901edacf14812a6fae25462920af42Steve Block// this function receives an HTML image element as a parameter, makes it display the pixmap/image from Qt 83692e5dbf12901edacf14812a6fae25462920af42Steve Blockclass QtPixmapAssignToElementMethod : public QtPixmapRuntimeMethod { 84d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic: 85692e5dbf12901edacf14812a6fae25462920af42Steve Block static const char* name() { return "assignToHTMLImageElement"; } 865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue invoke(ExecState* exec, QtPixmapInstance* instance) 87d0825bca7fe65beaee391d30da42e937db621564Steve Block { 885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (!exec->argumentCount()) 89692e5dbf12901edacf14812a6fae25462920af42Steve Block return jsUndefined(); 90692e5dbf12901edacf14812a6fae25462920af42Steve Block 915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSObject* objectArg = exec->argument(0).toObject(exec); 92692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!objectArg) 93692e5dbf12901edacf14812a6fae25462920af42Steve Block return jsUndefined(); 94692e5dbf12901edacf14812a6fae25462920af42Steve Block 95692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!objectArg->inherits(&JSHTMLImageElement::s_info)) 96692e5dbf12901edacf14812a6fae25462920af42Steve Block return jsUndefined(); 97692e5dbf12901edacf14812a6fae25462920af42Steve Block 98692e5dbf12901edacf14812a6fae25462920af42Steve Block // we now know that we have a valid <img> element as the argument, we can attach the pixmap to it. 99692e5dbf12901edacf14812a6fae25462920af42Steve Block PassRefPtr<StillImage> stillImage = WebCore::StillImage::create(instance->toPixmap()); 100692e5dbf12901edacf14812a6fae25462920af42Steve Block HTMLImageElement* imageElement = static_cast<HTMLImageElement*>(static_cast<JSHTMLImageElement*>(objectArg)->impl()); 101692e5dbf12901edacf14812a6fae25462920af42Steve Block imageElement->setCachedImage(new CachedImage(stillImage.get())); 102692e5dbf12901edacf14812a6fae25462920af42Steve Block JSDOMGlobalObject* global = static_cast<JSDOMGlobalObject*>(instance->rootObject()->globalObject()); 103692e5dbf12901edacf14812a6fae25462920af42Steve Block toJS(exec, global, imageElement->document()); 104d0825bca7fe65beaee391d30da42e937db621564Steve Block return jsUndefined(); 105d0825bca7fe65beaee391d30da42e937db621564Steve Block } 106d0825bca7fe65beaee391d30da42e937db621564Steve Block 107692e5dbf12901edacf14812a6fae25462920af42Steve Block virtual int numParameters() const 108692e5dbf12901edacf14812a6fae25462920af42Steve Block { 109692e5dbf12901edacf14812a6fae25462920af42Steve Block return 1; 110692e5dbf12901edacf14812a6fae25462920af42Steve Block } 111d0825bca7fe65beaee391d30da42e937db621564Steve Block}; 112d0825bca7fe65beaee391d30da42e937db621564Steve Block 113692e5dbf12901edacf14812a6fae25462920af42Steve Block// this function encodes the image to a dataUrl, to be used in background etc. Note: very slow. 114d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass QtPixmapToDataUrlMethod : public QtPixmapRuntimeMethod { 115d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic: 116d0825bca7fe65beaee391d30da42e937db621564Steve Block static const char* name() { return "toDataUrl"; } 1175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue invoke(ExecState* exec, QtPixmapInstance* instance) 118d0825bca7fe65beaee391d30da42e937db621564Steve Block { 119692e5dbf12901edacf14812a6fae25462920af42Steve Block QByteArray byteArray; 120692e5dbf12901edacf14812a6fae25462920af42Steve Block QBuffer buffer(&byteArray); 121692e5dbf12901edacf14812a6fae25462920af42Steve Block instance->toImage().save(&buffer, "PNG"); 1222bde8e466a4451c7319e3a072d118917957d6554Steve Block const QString encodedString = QLatin1String("data:image/png;base64,") + QLatin1String(byteArray.toBase64()); 123692e5dbf12901edacf14812a6fae25462920af42Steve Block const UString ustring((UChar*)encodedString.utf16(), encodedString.length()); 124d0825bca7fe65beaee391d30da42e937db621564Steve Block return jsString(exec, ustring); 125d0825bca7fe65beaee391d30da42e937db621564Steve Block } 126d0825bca7fe65beaee391d30da42e937db621564Steve Block}; 127d0825bca7fe65beaee391d30da42e937db621564Steve Block 128d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass QtPixmapToStringMethod : public QtPixmapRuntimeMethod { 129d0825bca7fe65beaee391d30da42e937db621564Steve Block public: 130d0825bca7fe65beaee391d30da42e937db621564Steve Block static const char* name() { return "toString"; } 1315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke JSValue invoke(ExecState* exec, QtPixmapInstance* instance) 132d0825bca7fe65beaee391d30da42e937db621564Steve Block { 133692e5dbf12901edacf14812a6fae25462920af42Steve Block return instance->valueOf(exec); 134d0825bca7fe65beaee391d30da42e937db621564Steve Block } 135d0825bca7fe65beaee391d30da42e937db621564Steve Block}; 136d0825bca7fe65beaee391d30da42e937db621564Steve Block 137d0825bca7fe65beaee391d30da42e937db621564Steve Blockstruct QtPixmapMetaData { 138d0825bca7fe65beaee391d30da42e937db621564Steve Block QtPixmapToDataUrlMethod toDataUrlMethod; 139692e5dbf12901edacf14812a6fae25462920af42Steve Block QtPixmapAssignToElementMethod assignToElementMethod; 140d0825bca7fe65beaee391d30da42e937db621564Steve Block QtPixmapToStringMethod toStringMethod; 141d0825bca7fe65beaee391d30da42e937db621564Steve Block QtPixmapHeightField heightField; 142d0825bca7fe65beaee391d30da42e937db621564Steve Block QtPixmapWidthField widthField; 143d0825bca7fe65beaee391d30da42e937db621564Steve Block QtPixmapClass cls; 144d0825bca7fe65beaee391d30da42e937db621564Steve Block} qt_pixmap_metaData; 145d0825bca7fe65beaee391d30da42e937db621564Steve Block 146d0825bca7fe65beaee391d30da42e937db621564Steve Block// Derived RuntimeObject 147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass QtPixmapRuntimeObject : public RuntimeObject { 148d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic: 149e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block QtPixmapRuntimeObject(ExecState*, JSGlobalObject*, PassRefPtr<Instance>); 150d0825bca7fe65beaee391d30da42e937db621564Steve Block 151d0825bca7fe65beaee391d30da42e937db621564Steve Block static const ClassInfo s_info; 152d0825bca7fe65beaee391d30da42e937db621564Steve Block 1532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* createStructure(JSGlobalData& globalData, JSValue prototype) 154d0825bca7fe65beaee391d30da42e937db621564Steve Block { 1552bde8e466a4451c7319e3a072d118917957d6554Steve Block return Structure::create(globalData, prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); 156d0825bca7fe65beaee391d30da42e937db621564Steve Block } 157d0825bca7fe65beaee391d30da42e937db621564Steve Block 158d0825bca7fe65beaee391d30da42e937db621564Steve Blockprotected: 159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static const unsigned StructureFlags = RuntimeObject::StructureFlags | OverridesMarkChildren; 160d0825bca7fe65beaee391d30da42e937db621564Steve Block}; 161d0825bca7fe65beaee391d30da42e937db621564Steve Block 162e78cbe89e6f337f2f1fe40315be88f742b547151Steve BlockQtPixmapRuntimeObject::QtPixmapRuntimeObject(ExecState* exec, JSGlobalObject* globalObject, PassRefPtr<Instance> instance) 163e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block : RuntimeObject(exec, globalObject, WebCore::deprecatedGetDOMStructure<QtPixmapRuntimeObject>(exec), instance) 164d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 165d0825bca7fe65beaee391d30da42e937db621564Steve Block} 166d0825bca7fe65beaee391d30da42e937db621564Steve Block 167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockconst ClassInfo QtPixmapRuntimeObject::s_info = { "QtPixmapRuntimeObject", &RuntimeObject::s_info, 0, 0 }; 168d0825bca7fe65beaee391d30da42e937db621564Steve Block 169d0825bca7fe65beaee391d30da42e937db621564Steve BlockQtPixmapClass::QtPixmapClass() 170d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 171d0825bca7fe65beaee391d30da42e937db621564Steve Block} 172d0825bca7fe65beaee391d30da42e937db621564Steve Block 173d0825bca7fe65beaee391d30da42e937db621564Steve Block 174d0825bca7fe65beaee391d30da42e937db621564Steve BlockClass* QtPixmapInstance::getClass() const 175d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 176d0825bca7fe65beaee391d30da42e937db621564Steve Block return &qt_pixmap_metaData.cls; 177d0825bca7fe65beaee391d30da42e937db621564Steve Block} 178d0825bca7fe65beaee391d30da42e937db621564Steve Block 179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSValue QtPixmapInstance::getMethod(ExecState* exec, const Identifier& propertyName) 180d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block MethodList methodList = getClass()->methodsNamed(propertyName, this); 18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return new (exec) RuntimeMethod(exec, exec->lexicalGlobalObject(), WebCore::deprecatedGetDOMStructure<RuntimeMethod>(exec), propertyName, methodList); 183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1855af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue QtPixmapInstance::invokeMethod(ExecState* exec, RuntimeMethod* runtimeMethod) 186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const MethodList& methods = *runtimeMethod->methods(); 188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 189d0825bca7fe65beaee391d30da42e937db621564Steve Block if (methods.size() == 1) { 190692e5dbf12901edacf14812a6fae25462920af42Steve Block QtPixmapRuntimeMethod* method = static_cast<QtPixmapRuntimeMethod*>(methods[0]); 1915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return method->invoke(exec, this); 192d0825bca7fe65beaee391d30da42e937db621564Steve Block } 193d0825bca7fe65beaee391d30da42e937db621564Steve Block return jsUndefined(); 194d0825bca7fe65beaee391d30da42e937db621564Steve Block} 195d0825bca7fe65beaee391d30da42e937db621564Steve Block 196d0825bca7fe65beaee391d30da42e937db621564Steve BlockMethodList QtPixmapClass::methodsNamed(const Identifier& identifier, Instance*) const 197d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 198d0825bca7fe65beaee391d30da42e937db621564Steve Block MethodList methods; 199d0825bca7fe65beaee391d30da42e937db621564Steve Block if (identifier == QtPixmapToDataUrlMethod::name()) 200d0825bca7fe65beaee391d30da42e937db621564Steve Block methods.append(&qt_pixmap_metaData.toDataUrlMethod); 201692e5dbf12901edacf14812a6fae25462920af42Steve Block else if (identifier == QtPixmapAssignToElementMethod::name()) 202692e5dbf12901edacf14812a6fae25462920af42Steve Block methods.append(&qt_pixmap_metaData.assignToElementMethod); 203d0825bca7fe65beaee391d30da42e937db621564Steve Block else if (identifier == QtPixmapToStringMethod::name()) 204d0825bca7fe65beaee391d30da42e937db621564Steve Block methods.append(&qt_pixmap_metaData.toStringMethod); 205d0825bca7fe65beaee391d30da42e937db621564Steve Block return methods; 206d0825bca7fe65beaee391d30da42e937db621564Steve Block} 207d0825bca7fe65beaee391d30da42e937db621564Steve Block 208d0825bca7fe65beaee391d30da42e937db621564Steve BlockField* QtPixmapClass::fieldNamed(const Identifier& identifier, Instance*) const 209d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 210d0825bca7fe65beaee391d30da42e937db621564Steve Block if (identifier == QtPixmapWidthField::name()) 211d0825bca7fe65beaee391d30da42e937db621564Steve Block return &qt_pixmap_metaData.widthField; 212d0825bca7fe65beaee391d30da42e937db621564Steve Block if (identifier == QtPixmapHeightField::name()) 213d0825bca7fe65beaee391d30da42e937db621564Steve Block return &qt_pixmap_metaData.heightField; 214d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 215d0825bca7fe65beaee391d30da42e937db621564Steve Block} 216d0825bca7fe65beaee391d30da42e937db621564Steve Block 217d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid QtPixmapInstance::getPropertyNames(ExecState*exec, PropertyNameArray& arr) 218d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 219d0825bca7fe65beaee391d30da42e937db621564Steve Block arr.add(Identifier(exec, UString(QtPixmapToDataUrlMethod::name()))); 220692e5dbf12901edacf14812a6fae25462920af42Steve Block arr.add(Identifier(exec, UString(QtPixmapAssignToElementMethod::name()))); 221d0825bca7fe65beaee391d30da42e937db621564Steve Block arr.add(Identifier(exec, UString(QtPixmapToStringMethod::name()))); 222d0825bca7fe65beaee391d30da42e937db621564Steve Block arr.add(Identifier(exec, UString(QtPixmapWidthField::name()))); 223d0825bca7fe65beaee391d30da42e937db621564Steve Block arr.add(Identifier(exec, UString(QtPixmapHeightField::name()))); 224d0825bca7fe65beaee391d30da42e937db621564Steve Block} 225d0825bca7fe65beaee391d30da42e937db621564Steve Block 226d0825bca7fe65beaee391d30da42e937db621564Steve BlockJSValue QtPixmapInstance::defaultValue(ExecState* exec, PreferredPrimitiveType ptype) const 227d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 228d0825bca7fe65beaee391d30da42e937db621564Steve Block if (ptype == PreferNumber) { 229d0825bca7fe65beaee391d30da42e937db621564Steve Block return jsBoolean( 230d0825bca7fe65beaee391d30da42e937db621564Steve Block (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>()) && !(data.value<QImage>()).isNull()) 231d0825bca7fe65beaee391d30da42e937db621564Steve Block || (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>()) && !data.value<QPixmap>().isNull())); 232d0825bca7fe65beaee391d30da42e937db621564Steve Block } 233692e5dbf12901edacf14812a6fae25462920af42Steve Block 234d0825bca7fe65beaee391d30da42e937db621564Steve Block if (ptype == PreferString) 235d0825bca7fe65beaee391d30da42e937db621564Steve Block return valueOf(exec); 236692e5dbf12901edacf14812a6fae25462920af42Steve Block 237d0825bca7fe65beaee391d30da42e937db621564Steve Block return jsUndefined(); 238d0825bca7fe65beaee391d30da42e937db621564Steve Block} 239d0825bca7fe65beaee391d30da42e937db621564Steve Block 240d0825bca7fe65beaee391d30da42e937db621564Steve BlockJSValue QtPixmapInstance::valueOf(ExecState* exec) const 241d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 2422bde8e466a4451c7319e3a072d118917957d6554Steve Block const QString stringValue = QString::fromLatin1("[Qt Native Pixmap %1,%2]").arg(width()).arg(height()); 243692e5dbf12901edacf14812a6fae25462920af42Steve Block UString ustring((UChar*)stringValue.utf16(), stringValue.length()); 244d0825bca7fe65beaee391d30da42e937db621564Steve Block return jsString(exec, ustring); 245d0825bca7fe65beaee391d30da42e937db621564Steve Block} 246d0825bca7fe65beaee391d30da42e937db621564Steve Block 247d0825bca7fe65beaee391d30da42e937db621564Steve BlockQtPixmapInstance::QtPixmapInstance(PassRefPtr<RootObject> rootObj, const QVariant& d) 248d0825bca7fe65beaee391d30da42e937db621564Steve Block :Instance(rootObj), data(d) 249d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 250d0825bca7fe65beaee391d30da42e937db621564Steve Block} 251d0825bca7fe65beaee391d30da42e937db621564Steve Block 252d0825bca7fe65beaee391d30da42e937db621564Steve Blockint QtPixmapInstance::width() const 253d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 254d0825bca7fe65beaee391d30da42e937db621564Steve Block if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>())) 255d0825bca7fe65beaee391d30da42e937db621564Steve Block return data.value<QPixmap>().width(); 256d0825bca7fe65beaee391d30da42e937db621564Steve Block if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>())) 257d0825bca7fe65beaee391d30da42e937db621564Steve Block return data.value<QImage>().width(); 258d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 259d0825bca7fe65beaee391d30da42e937db621564Steve Block} 260d0825bca7fe65beaee391d30da42e937db621564Steve Block 261d0825bca7fe65beaee391d30da42e937db621564Steve Blockint QtPixmapInstance::height() const 262d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 263d0825bca7fe65beaee391d30da42e937db621564Steve Block if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>())) 264d0825bca7fe65beaee391d30da42e937db621564Steve Block return data.value<QPixmap>().height(); 265d0825bca7fe65beaee391d30da42e937db621564Steve Block if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>())) 266d0825bca7fe65beaee391d30da42e937db621564Steve Block return data.value<QImage>().height(); 267d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 268d0825bca7fe65beaee391d30da42e937db621564Steve Block} 269d0825bca7fe65beaee391d30da42e937db621564Steve Block 270d0825bca7fe65beaee391d30da42e937db621564Steve BlockQPixmap QtPixmapInstance::toPixmap() 271d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 272d0825bca7fe65beaee391d30da42e937db621564Steve Block if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>())) 273d0825bca7fe65beaee391d30da42e937db621564Steve Block return data.value<QPixmap>(); 274692e5dbf12901edacf14812a6fae25462920af42Steve Block 275d0825bca7fe65beaee391d30da42e937db621564Steve Block if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>())) { 276692e5dbf12901edacf14812a6fae25462920af42Steve Block const QPixmap pixmap = QPixmap::fromImage(data.value<QImage>()); 277692e5dbf12901edacf14812a6fae25462920af42Steve Block data = QVariant::fromValue<QPixmap>(pixmap); 278692e5dbf12901edacf14812a6fae25462920af42Steve Block return pixmap; 279d0825bca7fe65beaee391d30da42e937db621564Steve Block } 280d0825bca7fe65beaee391d30da42e937db621564Steve Block 281692e5dbf12901edacf14812a6fae25462920af42Steve Block return QPixmap(); 282d0825bca7fe65beaee391d30da42e937db621564Steve Block} 283d0825bca7fe65beaee391d30da42e937db621564Steve Block 284d0825bca7fe65beaee391d30da42e937db621564Steve BlockQImage QtPixmapInstance::toImage() 285d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 286d0825bca7fe65beaee391d30da42e937db621564Steve Block if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>())) 287d0825bca7fe65beaee391d30da42e937db621564Steve Block return data.value<QImage>(); 288692e5dbf12901edacf14812a6fae25462920af42Steve Block 289d0825bca7fe65beaee391d30da42e937db621564Steve Block if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>())) { 290692e5dbf12901edacf14812a6fae25462920af42Steve Block const QImage image = data.value<QPixmap>().toImage(); 291692e5dbf12901edacf14812a6fae25462920af42Steve Block data = QVariant::fromValue<QImage>(image); 292692e5dbf12901edacf14812a6fae25462920af42Steve Block return image; 293d0825bca7fe65beaee391d30da42e937db621564Steve Block } 294692e5dbf12901edacf14812a6fae25462920af42Steve Block 295d0825bca7fe65beaee391d30da42e937db621564Steve Block return QImage(); 296d0825bca7fe65beaee391d30da42e937db621564Steve Block} 297d0825bca7fe65beaee391d30da42e937db621564Steve Block 298d0825bca7fe65beaee391d30da42e937db621564Steve BlockQVariant QtPixmapInstance::variantFromObject(JSObject* object, QMetaType::Type hint) 299d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 300692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!object) 301692e5dbf12901edacf14812a6fae25462920af42Steve Block goto returnEmptyVariant; 302692e5dbf12901edacf14812a6fae25462920af42Steve Block 303692e5dbf12901edacf14812a6fae25462920af42Steve Block if (object->inherits(&JSHTMLImageElement::s_info)) { 304692e5dbf12901edacf14812a6fae25462920af42Steve Block JSHTMLImageElement* elementJSWrapper = static_cast<JSHTMLImageElement*>(object); 305692e5dbf12901edacf14812a6fae25462920af42Steve Block HTMLImageElement* imageElement = static_cast<HTMLImageElement*>(elementJSWrapper->impl()); 306692e5dbf12901edacf14812a6fae25462920af42Steve Block 307692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!imageElement) 308692e5dbf12901edacf14812a6fae25462920af42Steve Block goto returnEmptyVariant; 309692e5dbf12901edacf14812a6fae25462920af42Steve Block 310692e5dbf12901edacf14812a6fae25462920af42Steve Block CachedImage* cachedImage = imageElement->cachedImage(); 311692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!cachedImage) 312692e5dbf12901edacf14812a6fae25462920af42Steve Block goto returnEmptyVariant; 313692e5dbf12901edacf14812a6fae25462920af42Steve Block 314692e5dbf12901edacf14812a6fae25462920af42Steve Block Image* image = cachedImage->image(); 315692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!image) 316692e5dbf12901edacf14812a6fae25462920af42Steve Block goto returnEmptyVariant; 317692e5dbf12901edacf14812a6fae25462920af42Steve Block 318692e5dbf12901edacf14812a6fae25462920af42Steve Block QPixmap* pixmap = image->nativeImageForCurrentFrame(); 319692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!pixmap) 320692e5dbf12901edacf14812a6fae25462920af42Steve Block goto returnEmptyVariant; 321692e5dbf12901edacf14812a6fae25462920af42Steve Block 322692e5dbf12901edacf14812a6fae25462920af42Steve Block return (hint == static_cast<QMetaType::Type>(qMetaTypeId<QPixmap>())) 323692e5dbf12901edacf14812a6fae25462920af42Steve Block ? QVariant::fromValue<QPixmap>(*pixmap) 324692e5dbf12901edacf14812a6fae25462920af42Steve Block : QVariant::fromValue<QImage>(pixmap->toImage()); 325692e5dbf12901edacf14812a6fae25462920af42Steve Block } 326692e5dbf12901edacf14812a6fae25462920af42Steve Block 327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (object->inherits(&QtPixmapRuntimeObject::s_info)) { 328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block QtPixmapRuntimeObject* runtimeObject = static_cast<QtPixmapRuntimeObject*>(object); 329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block QtPixmapInstance* instance = static_cast<QtPixmapInstance*>(runtimeObject->getInternalInstance()); 330692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!instance) 331692e5dbf12901edacf14812a6fae25462920af42Steve Block goto returnEmptyVariant; 332692e5dbf12901edacf14812a6fae25462920af42Steve Block 333d0825bca7fe65beaee391d30da42e937db621564Steve Block if (hint == qMetaTypeId<QPixmap>()) 334692e5dbf12901edacf14812a6fae25462920af42Steve Block return QVariant::fromValue<QPixmap>(instance->toPixmap()); 335692e5dbf12901edacf14812a6fae25462920af42Steve Block 336d0825bca7fe65beaee391d30da42e937db621564Steve Block if (hint == qMetaTypeId<QImage>()) 337692e5dbf12901edacf14812a6fae25462920af42Steve Block return QVariant::fromValue<QImage>(instance->toImage()); 338d0825bca7fe65beaee391d30da42e937db621564Steve Block } 339692e5dbf12901edacf14812a6fae25462920af42Steve Block 340692e5dbf12901edacf14812a6fae25462920af42Steve BlockreturnEmptyVariant: 341692e5dbf12901edacf14812a6fae25462920af42Steve Block if (hint == qMetaTypeId<QPixmap>()) 342692e5dbf12901edacf14812a6fae25462920af42Steve Block return QVariant::fromValue<QPixmap>(QPixmap()); 343692e5dbf12901edacf14812a6fae25462920af42Steve Block if (hint == qMetaTypeId<QImage>()) 344692e5dbf12901edacf14812a6fae25462920af42Steve Block return QVariant::fromValue<QImage>(QImage()); 345692e5dbf12901edacf14812a6fae25462920af42Steve Block return QVariant(); 346d0825bca7fe65beaee391d30da42e937db621564Steve Block} 347545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch 348545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochRuntimeObject* QtPixmapInstance::newRuntimeObject(ExecState* exec) 349545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{ 350545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return new(exec) QtPixmapRuntimeObject(exec, exec->lexicalGlobalObject(), this); 351545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch} 352545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch 353545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochJSObject* QtPixmapInstance::createPixmapRuntimeObject(ExecState* exec, PassRefPtr<RootObject> root, const QVariant& data) 354d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 355d0825bca7fe65beaee391d30da42e937db621564Steve Block JSLock lock(SilenceAssertionsOnly); 356e14391e94c850b8bd03680c23b38978db68687a8John Reck RefPtr<QtPixmapInstance> instance = adoptRef(new QtPixmapInstance(root, data)); 357545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return instance->createRuntimeObject(exec); 358d0825bca7fe65beaee391d30da42e937db621564Steve Block} 359d0825bca7fe65beaee391d30da42e937db621564Steve Block 360d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool QtPixmapInstance::canHandle(QMetaType::Type hint) 361d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 362d0825bca7fe65beaee391d30da42e937db621564Steve Block return hint == qMetaTypeId<QImage>() || hint == qMetaTypeId<QPixmap>(); 363d0825bca7fe65beaee391d30da42e937db621564Steve Block} 364d0825bca7fe65beaee391d30da42e937db621564Steve Block 365d0825bca7fe65beaee391d30da42e937db621564Steve Block} 366d0825bca7fe65beaee391d30da42e937db621564Steve Block 367d0825bca7fe65beaee391d30da42e937db621564Steve Block} 368