Changeset 54986 in webkit
- Timestamp:
- Feb 18, 2010 1:50:59 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r54984 r54986 1 2010-02-18 Noam Rosenthal <noam.rosenthal@nokia.com> 2 3 Reviewed by Kenneth Rohde Christiansen. 4 5 [Qt] Minor improvement to hybrid QPixmap 6 https://bugs.webkit.org/show_bug.cgi?id=34507 7 Instead of having toHTMLImageElement which creates a new element, 8 assignToHTMLImageElement would set an existing HTML <img/> element to 9 contain the native QPixmap/QImge. 10 Also made some style fixes. 11 12 Additions to existing tests: see WebKit/qt/tests 13 14 * bridge/qt/qt_pixmapruntime.cpp: 15 (JSC::Bindings::QtPixmapWidthField::valueFromInstance): style 16 (JSC::Bindings::QtPixmapHeightField::valueFromInstance): style 17 (JSC::Bindings::QtPixmapAssignToElementMethod::name): assignTo 18 (JSC::Bindings::QtPixmapAssignToElementMethod::invoke): new function 19 (JSC::Bindings::QtPixmapAssignToElementMethod::numParameters): 1 20 (JSC::Bindings::QtPixmapToDataUrlMethod::invoke): style 21 (JSC::Bindings::QtPixmapToStringMethod::invoke): style 22 (JSC::Bindings::QtPixmapInstance::invokeMethod): style 23 (JSC::Bindings::QtPixmapClass::methodsNamed): new func, removed old 24 (JSC::Bindings::QtPixmapInstance::getPropertyNames): ditto 25 (JSC::Bindings::QtPixmapInstance::defaultValue): style 26 (JSC::Bindings::QtPixmapInstance::valueOf): style 27 (JSC::Bindings::QtPixmapInstance::toPixmap): style 28 (JSC::Bindings::QtPixmapInstance::variantFromObject): style 29 1 30 2010-02-18 Peter Kasting <pkasting@google.com> 2 31 -
trunk/WebCore/bridge/qt/qt_pixmapruntime.cpp
r54025 r54986 21 21 22 22 #include "CachedImage.h" 23 #include "DOMWindow.h"24 23 #include "HTMLImageElement.h" 25 #include "HTMLNames.h"26 #include "JSDOMBinding.h"27 #include "JSDOMWindow.h"28 24 #include "JSGlobalObject.h" 29 25 #include "JSHTMLImageElement.h" … … 55 51 public: 56 52 static const char* name() { return "width"; } 57 virtual JSValue valueFromInstance(ExecState* exec, const Instance* pixmap) const58 { 59 return jsNumber(exec, static_cast<const QtPixmapInstance*>( pixmap)->width());53 virtual JSValue valueFromInstance(ExecState* exec, const Instance* instance) const 54 { 55 return jsNumber(exec, static_cast<const QtPixmapInstance*>(instance)->width()); 60 56 } 61 57 virtual void setValueToInstance(ExecState*, const Instance*, JSValue) const {} 62 58 }; 59 63 60 class QtPixmapHeightField : public Field { 64 61 public: 65 62 static const char* name() { return "height"; } 66 virtual JSValue valueFromInstance(ExecState* exec, const Instance* inst ) const67 { 68 return jsNumber(exec, static_cast<const QtPixmapInstance*>(inst )->height());63 virtual JSValue valueFromInstance(ExecState* exec, const Instance* instance) const 64 { 65 return jsNumber(exec, static_cast<const QtPixmapInstance*>(instance)->height()); 69 66 } 70 67 virtual void setValueToInstance(ExecState*, const Instance*, JSValue) const {} … … 77 74 return 0; 78 75 } 79 virtual JSValue invoke(ExecState* exec, QVariant&, PassRefPtr<RootObject> root, QtPixmapInstance* inst) = 0; 80 81 }; 82 83 class QtPixmapCreateElementMethod : public QtPixmapRuntimeMethod { 84 public: 85 static const char* name() { return "toHTMLImageElement"; } 86 JSValue invoke(ExecState* exec, QVariant& v, PassRefPtr<RootObject> root, QtPixmapInstance*) 87 { 88 QPixmap pxm; 89 if (v.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>())) { 90 pxm = QPixmap::fromImage(v.value<QImage>()); 91 v = QVariant::fromValue<QPixmap>(pxm); 92 } else 93 pxm = v.value<QPixmap>(); 94 95 Document* document = 0; 96 JSDOMGlobalObject* global = static_cast<JSDOMGlobalObject*>(root->globalObject()); 97 if (global) { 98 DOMWindow* dWindow = toDOMWindow(global); 99 if (dWindow) 100 document = dWindow->document(); 101 } 102 103 if (document) { 104 PassRefPtr<StillImage> img = WebCore::StillImage::create(pxm); 105 RefPtr<HTMLImageElement> image = new HTMLImageElement(HTMLNames::imgTag, document); 106 image->setCachedImage(new CachedImage(img.get())); 107 toJS(exec, global, document); 108 return asObject(toJS(exec, global, image.release())); 109 } 76 virtual JSValue invoke(ExecState* exec, QtPixmapInstance*, const ArgList&) = 0; 77 78 }; 79 80 // this function receives an HTML image element as a parameter, makes it display the pixmap/image from Qt 81 class QtPixmapAssignToElementMethod : public QtPixmapRuntimeMethod { 82 public: 83 static const char* name() { return "assignToHTMLImageElement"; } 84 JSValue invoke(ExecState* exec, QtPixmapInstance* instance, const ArgList& args) 85 { 86 if (!args.size()) 87 return jsUndefined(); 88 89 JSObject* objectArg = args.at(0).toObject(exec); 90 if (!objectArg) 91 return jsUndefined(); 92 93 if (!objectArg->inherits(&JSHTMLImageElement::s_info)) 94 return jsUndefined(); 95 96 // we now know that we have a valid <img> element as the argument, we can attach the pixmap to it. 97 PassRefPtr<StillImage> stillImage = WebCore::StillImage::create(instance->toPixmap()); 98 HTMLImageElement* imageElement = static_cast<HTMLImageElement*>(static_cast<JSHTMLImageElement*>(objectArg)->impl()); 99 imageElement->setCachedImage(new CachedImage(stillImage.get())); 100 JSDOMGlobalObject* global = static_cast<JSDOMGlobalObject*>(instance->rootObject()->globalObject()); 101 toJS(exec, global, imageElement->document()); 110 102 return jsUndefined(); 111 103 } 112 104 113 }; 114 105 virtual int numParameters() const 106 { 107 return 1; 108 } 109 }; 110 111 // this function encodes the image to a dataUrl, to be used in background etc. Note: very slow. 115 112 class QtPixmapToDataUrlMethod : public QtPixmapRuntimeMethod { 116 113 public: 117 114 static const char* name() { return "toDataUrl"; } 118 JSValue invoke(ExecState* exec, QVariant& v, PassRefPtr<RootObject> root, QtPixmapInstance*) 119 { 120 QImage image; 121 // for getting the data url, we always prefer the image. 122 if (v.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>())) { 123 image = v.value<QPixmap>().toImage(); 124 v = QVariant::fromValue<QImage>(image); 125 } else 126 image = v.value<QImage>(); 127 QByteArray ba; 128 QBuffer b(&ba); 129 image.save(&b, "PNG"); 130 const QString b64 = QString("data:image/png;base64,") + ba.toBase64(); 131 const UString ustring((UChar*)b64.utf16(), b64.length()); 115 JSValue invoke(ExecState* exec, QtPixmapInstance* instance, const ArgList&) 116 { 117 QByteArray byteArray; 118 QBuffer buffer(&byteArray); 119 instance->toImage().save(&buffer, "PNG"); 120 const QString encodedString = QString("data:image/png;base64,") + byteArray.toBase64(); 121 const UString ustring((UChar*)encodedString.utf16(), encodedString.length()); 132 122 return jsString(exec, ustring); 133 123 } 134 135 124 }; 136 125 … … 138 127 public: 139 128 static const char* name() { return "toString"; } 140 JSValue invoke(ExecState* exec, QVariant& v, PassRefPtr<RootObject> root, QtPixmapInstance* inst) 141 { 142 return inst->valueOf(exec); 143 } 144 129 JSValue invoke(ExecState* exec, QtPixmapInstance* instance, const ArgList&) 130 { 131 return instance->valueOf(exec); 132 } 145 133 }; 146 134 147 135 struct QtPixmapMetaData { 148 136 QtPixmapToDataUrlMethod toDataUrlMethod; 149 QtPixmap CreateElementMethod createElementMethod;137 QtPixmapAssignToElementMethod assignToElementMethod; 150 138 QtPixmapToStringMethod toStringMethod; 151 139 QtPixmapHeightField heightField; … … 180 168 const ClassInfo QtPixmapRuntimeObjectImp::s_info = { "QtPixmapRuntimeObject", &RuntimeObjectImp::s_info, 0, 0 }; 181 169 182 183 170 QtPixmapClass::QtPixmapClass() 184 171 { … … 194 181 { 195 182 if (methods.size() == 1) { 196 QtPixmapRuntimeMethod* m td = static_cast<QtPixmapRuntimeMethod*>(methods[0]);197 return m td->invoke(exec, data, rootObject(), this);183 QtPixmapRuntimeMethod* method = static_cast<QtPixmapRuntimeMethod*>(methods[0]); 184 return method->invoke(exec, this, args); 198 185 } 199 186 return jsUndefined(); … … 205 192 if (identifier == QtPixmapToDataUrlMethod::name()) 206 193 methods.append(&qt_pixmap_metaData.toDataUrlMethod); 207 else if (identifier == QtPixmap CreateElementMethod::name())208 methods.append(&qt_pixmap_metaData. createElementMethod);194 else if (identifier == QtPixmapAssignToElementMethod::name()) 195 methods.append(&qt_pixmap_metaData.assignToElementMethod); 209 196 else if (identifier == QtPixmapToStringMethod::name()) 210 197 methods.append(&qt_pixmap_metaData.toStringMethod); … … 224 211 { 225 212 arr.add(Identifier(exec, UString(QtPixmapToDataUrlMethod::name()))); 226 arr.add(Identifier(exec, UString(QtPixmap CreateElementMethod::name())));213 arr.add(Identifier(exec, UString(QtPixmapAssignToElementMethod::name()))); 227 214 arr.add(Identifier(exec, UString(QtPixmapToStringMethod::name()))); 228 215 arr.add(Identifier(exec, UString(QtPixmapWidthField::name()))); … … 237 224 || (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>()) && !data.value<QPixmap>().isNull())); 238 225 } 226 239 227 if (ptype == PreferString) 240 228 return valueOf(exec); 229 241 230 return jsUndefined(); 242 231 } … … 244 233 JSValue QtPixmapInstance::valueOf(ExecState* exec) const 245 234 { 246 const QString toStr= QString("[Qt Native Pixmap %1,%2]").arg(width()).arg(height());247 UString ustring((UChar*) toStr.utf16(), toStr.length());235 const QString stringValue = QString("[Qt Native Pixmap %1,%2]").arg(width()).arg(height()); 236 UString ustring((UChar*)stringValue.utf16(), stringValue.length()); 248 237 return jsString(exec, ustring); 249 238 } … … 276 265 if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>())) 277 266 return data.value<QPixmap>(); 267 278 268 if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>())) { 279 const QPixmap pxm = QPixmap::fromImage(data.value<QImage>()); 280 data = QVariant::fromValue<QPixmap>(pxm); 281 return pxm; 282 } 269 const QPixmap pixmap = QPixmap::fromImage(data.value<QImage>()); 270 data = QVariant::fromValue<QPixmap>(pixmap); 271 return pixmap; 272 } 273 283 274 return QPixmap(); 284 285 275 } 286 276 … … 289 279 if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>())) 290 280 return data.value<QImage>(); 281 291 282 if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>())) { 292 const QImage img = data.value<QPixmap>().toImage(); 293 data = QVariant::fromValue<QImage>(img); 294 return img; 295 } 283 const QImage image = data.value<QPixmap>().toImage(); 284 data = QVariant::fromValue<QImage>(image); 285 return image; 286 } 287 296 288 return QImage(); 297 289 } … … 299 291 QVariant QtPixmapInstance::variantFromObject(JSObject* object, QMetaType::Type hint) 300 292 { 301 if (!object) { 293 if (!object) 294 goto returnEmptyVariant; 295 296 if (object->inherits(&JSHTMLImageElement::s_info)) { 297 JSHTMLImageElement* elementJSWrapper = static_cast<JSHTMLImageElement*>(object); 298 HTMLImageElement* imageElement = static_cast<HTMLImageElement*>(elementJSWrapper->impl()); 299 300 if (!imageElement) 301 goto returnEmptyVariant; 302 303 CachedImage* cachedImage = imageElement->cachedImage(); 304 if (!cachedImage) 305 goto returnEmptyVariant; 306 307 Image* image = cachedImage->image(); 308 if (!image) 309 goto returnEmptyVariant; 310 311 QPixmap* pixmap = image->nativeImageForCurrentFrame(); 312 if (!pixmap) 313 goto returnEmptyVariant; 314 315 return (hint == static_cast<QMetaType::Type>(qMetaTypeId<QPixmap>())) 316 ? QVariant::fromValue<QPixmap>(*pixmap) 317 : QVariant::fromValue<QImage>(pixmap->toImage()); 318 } 319 320 if (object->inherits(&QtPixmapRuntimeObjectImp::s_info)) { 321 QtPixmapRuntimeObjectImp* imp = static_cast<QtPixmapRuntimeObjectImp*>(object); 322 QtPixmapInstance* instance = static_cast<QtPixmapInstance*>(imp->getInternalInstance()); 323 if (!instance) 324 goto returnEmptyVariant; 325 302 326 if (hint == qMetaTypeId<QPixmap>()) 303 return QVariant::fromValue<QPixmap>(QPixmap()); 327 return QVariant::fromValue<QPixmap>(instance->toPixmap()); 328 304 329 if (hint == qMetaTypeId<QImage>()) 305 return QVariant::fromValue<QImage>(QImage()); 306 } else if (object->inherits(&JSHTMLImageElement::s_info)) { 307 JSHTMLImageElement* el = static_cast<JSHTMLImageElement*>(object); 308 HTMLImageElement* imageElement = static_cast<HTMLImageElement*>(el->impl()); 309 if (imageElement) { 310 CachedImage* cImg = imageElement->cachedImage(); 311 if (cImg) { 312 Image* img = cImg->image(); 313 if (img) { 314 QPixmap* pxm = img->nativeImageForCurrentFrame(); 315 if (pxm) { 316 return (hint == static_cast<QMetaType::Type>(qMetaTypeId<QPixmap>())) 317 ? QVariant::fromValue<QPixmap>(*pxm) 318 : QVariant::fromValue<QImage>(pxm->toImage()); 319 } 320 } 321 } 322 } 323 } else if (object->inherits(&QtPixmapRuntimeObjectImp::s_info)) { 324 QtPixmapRuntimeObjectImp* imp = static_cast<QtPixmapRuntimeObjectImp*>(object); 325 QtPixmapInstance* inst = static_cast<QtPixmapInstance*>(imp->getInternalInstance()); 326 if (inst) { 327 if (hint == qMetaTypeId<QPixmap >()) 328 return QVariant::fromValue<QPixmap>(inst->toPixmap()); 329 if (hint == qMetaTypeId<QImage>()) 330 return QVariant::fromValue<QImage>(inst->toImage()); 331 } 332 } 333 return 0; 330 return QVariant::fromValue<QImage>(instance->toImage()); 331 } 332 333 returnEmptyVariant: 334 if (hint == qMetaTypeId<QPixmap>()) 335 return QVariant::fromValue<QPixmap>(QPixmap()); 336 if (hint == qMetaTypeId<QImage>()) 337 return QVariant::fromValue<QImage>(QImage()); 338 return QVariant(); 334 339 } 335 340 JSObject* QtPixmapInstance::createRuntimeObject(ExecState* exec, PassRefPtr<RootObject> root, const QVariant& data) -
trunk/WebKit/qt/ChangeLog
r54938 r54986 1 2010-02-18 Noam Rosenthal <noam.rosenthal@nokia.com> 2 3 Reviewed by Kenneth Rohde Christiansen. 4 5 [Qt] Minor improvement to hybrid QPixmap 6 https://bugs.webkit.org/show_bug.cgi?id=34507 7 8 * tests/hybridPixmap/test.html: use assignToHTMLImageElement on an 9 existing element instead of toHTMLImageElement which creates a new one 10 1 11 2010-02-17 Dmitry Titov <dimich@chromium.org> 2 12 -
trunk/WebKit/qt/tests/hybridPixmap/test.html
r53611 r54986 10 10 var pxm = myWidget.pixmap; 11 11 12 var img = obj.toHTMLImageElement(); 12 var img = new Image; 13 obj.assignToHTMLImageElement(img); 13 14 var img1 = document.getElementById("img1"); 14 15 var img2 = document.getElementById("img2"); 16 var img3 = document.getElementById("img3"); 17 var img4 = document.getElementById("img4"); 15 18 document.body.appendChild(img); 16 document.body.appendChild(pxm.toHTMLImageElement()); 19 obj.assignToHTMLImageElement(img3); 20 pxm.assignToHTMLImageElement(img4); 21 myWidget.compare(pxm.width, img4.width); 22 myWidget.compare(obj.width, img3.width); 17 23 var signalsFired = 0; 18 24 myWidget.compare(obj.toString(),"[Qt Native Pixmap "+obj.width+","+obj.height+"]"); … … 54 60 <img id="img1" /> 55 61 <img id="img2" /> 62 <img id="img3" /> 63 <img id="img4" /> 56 64 </body> 57 65 </html>
Note: See TracChangeset
for help on using the changeset viewer.