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