Changeset 54986 in webkit


Ignore:
Timestamp:
Feb 18, 2010 1:50:59 PM (14 years ago)
Author:
eric@webkit.org
Message:

2010-02-18 Noam Rosenthal <noam.rosenthal@nokia.com>

Reviewed by Kenneth Rohde Christiansen.

[Qt] Minor improvement to hybrid QPixmap
https://bugs.webkit.org/show_bug.cgi?id=34507
Instead of having toHTMLImageElement which creates a new element,
assignToHTMLImageElement would set an existing HTML <img/> element to
contain the native QPixmap/QImge.
Also made some style fixes.

Additions to existing tests: see WebKit/qt/tests

  • bridge/qt/qt_pixmapruntime.cpp: (JSC::Bindings::QtPixmapWidthField::valueFromInstance): style (JSC::Bindings::QtPixmapHeightField::valueFromInstance): style (JSC::Bindings::QtPixmapAssignToElementMethod::name): assignTo (JSC::Bindings::QtPixmapAssignToElementMethod::invoke): new function (JSC::Bindings::QtPixmapAssignToElementMethod::numParameters): 1 (JSC::Bindings::QtPixmapToDataUrlMethod::invoke): style (JSC::Bindings::QtPixmapToStringMethod::invoke): style (JSC::Bindings::QtPixmapInstance::invokeMethod): style (JSC::Bindings::QtPixmapClass::methodsNamed): new func, removed old (JSC::Bindings::QtPixmapInstance::getPropertyNames): ditto (JSC::Bindings::QtPixmapInstance::defaultValue): style (JSC::Bindings::QtPixmapInstance::valueOf): style (JSC::Bindings::QtPixmapInstance::toPixmap): style (JSC::Bindings::QtPixmapInstance::variantFromObject): style

2010-02-18 Noam Rosenthal <noam.rosenthal@nokia.com>

Reviewed by Kenneth Rohde Christiansen.

[Qt] Minor improvement to hybrid QPixmap
https://bugs.webkit.org/show_bug.cgi?id=34507

  • tests/hybridPixmap/test.html: use assignToHTMLImageElement on an existing element instead of toHTMLImageElement which creates a new one
Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r54984 r54986  
     12010-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
    1302010-02-18  Peter Kasting  <pkasting@google.com>
    231
  • trunk/WebCore/bridge/qt/qt_pixmapruntime.cpp

    r54025 r54986  
    2121
    2222#include "CachedImage.h"
    23 #include "DOMWindow.h"
    2423#include "HTMLImageElement.h"
    25 #include "HTMLNames.h"
    26 #include "JSDOMBinding.h"
    27 #include "JSDOMWindow.h"
    2824#include "JSGlobalObject.h"
    2925#include "JSHTMLImageElement.h"
     
    5551public:
    5652    static const char* name() { return "width"; }
    57     virtual JSValue valueFromInstance(ExecState* exec, const Instance* pixmap) const
    58     {
    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());
    6056    }
    6157    virtual void setValueToInstance(ExecState*, const Instance*, JSValue) const {}
    6258};
     59
    6360class QtPixmapHeightField : public Field {
    6461public:
    6562    static const char* name() { return "height"; }
    66     virtual JSValue valueFromInstance(ExecState* exec, const Instance* inst) const
    67     {
    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());
    6966    }
    7067    virtual void setValueToInstance(ExecState*, const Instance*, JSValue) const {}
     
    7774        return 0;
    7875    }
    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
     81class QtPixmapAssignToElementMethod : public QtPixmapRuntimeMethod {
     82public:
     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());
    110102        return jsUndefined();
    111103    }
    112104
    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.
    115112class QtPixmapToDataUrlMethod : public QtPixmapRuntimeMethod {
    116113public:
    117114    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());
    132122        return jsString(exec, ustring);
    133123    }
    134 
    135124};
    136125
     
    138127    public:
    139128    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    }
    145133};
    146134
    147135struct QtPixmapMetaData {
    148136    QtPixmapToDataUrlMethod toDataUrlMethod;
    149     QtPixmapCreateElementMethod createElementMethod;
     137    QtPixmapAssignToElementMethod assignToElementMethod;
    150138    QtPixmapToStringMethod toStringMethod;
    151139    QtPixmapHeightField heightField;
     
    180168const ClassInfo QtPixmapRuntimeObjectImp::s_info = { "QtPixmapRuntimeObject", &RuntimeObjectImp::s_info, 0, 0 };
    181169
    182 
    183170QtPixmapClass::QtPixmapClass()
    184171{
     
    194181{
    195182    if (methods.size() == 1) {
    196         QtPixmapRuntimeMethod* mtd = static_cast<QtPixmapRuntimeMethod*>(methods[0]);       
    197         return mtd->invoke(exec, data, rootObject(), this);
     183        QtPixmapRuntimeMethod* method = static_cast<QtPixmapRuntimeMethod*>(methods[0]);
     184        return method->invoke(exec, this, args);
    198185    }
    199186    return jsUndefined();
     
    205192    if (identifier == QtPixmapToDataUrlMethod::name())
    206193        methods.append(&qt_pixmap_metaData.toDataUrlMethod);
    207     else if (identifier == QtPixmapCreateElementMethod::name())
    208         methods.append(&qt_pixmap_metaData.createElementMethod);
     194    else if (identifier == QtPixmapAssignToElementMethod::name())
     195        methods.append(&qt_pixmap_metaData.assignToElementMethod);
    209196    else if (identifier == QtPixmapToStringMethod::name())
    210197        methods.append(&qt_pixmap_metaData.toStringMethod);
     
    224211{
    225212    arr.add(Identifier(exec, UString(QtPixmapToDataUrlMethod::name())));
    226     arr.add(Identifier(exec, UString(QtPixmapCreateElementMethod::name())));
     213    arr.add(Identifier(exec, UString(QtPixmapAssignToElementMethod::name())));
    227214    arr.add(Identifier(exec, UString(QtPixmapToStringMethod::name())));
    228215    arr.add(Identifier(exec, UString(QtPixmapWidthField::name())));
     
    237224                || (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>()) && !data.value<QPixmap>().isNull()));
    238225    }
     226
    239227    if (ptype == PreferString)
    240228        return valueOf(exec);
     229
    241230    return jsUndefined();
    242231}
     
    244233JSValue QtPixmapInstance::valueOf(ExecState* exec) const
    245234{
    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());
    248237    return jsString(exec, ustring);
    249238}
     
    276265    if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QPixmap>()))
    277266        return data.value<QPixmap>();
     267
    278268    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
    283274    return QPixmap();
    284 
    285275}
    286276
     
    289279    if (data.type() == static_cast<QVariant::Type>(qMetaTypeId<QImage>()))
    290280        return data.value<QImage>();
     281
    291282    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
    296288    return QImage();
    297289}
     
    299291QVariant QtPixmapInstance::variantFromObject(JSObject* object, QMetaType::Type hint)
    300292{
    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
    302326        if (hint == qMetaTypeId<QPixmap>())
    303             return QVariant::fromValue<QPixmap>(QPixmap());
     327            return QVariant::fromValue<QPixmap>(instance->toPixmap());
     328
    304329        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
     333returnEmptyVariant:
     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();
    334339}
    335340JSObject* QtPixmapInstance::createRuntimeObject(ExecState* exec, PassRefPtr<RootObject> root, const QVariant& data)
  • trunk/WebKit/qt/ChangeLog

    r54938 r54986  
     12010-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
    1112010-02-17  Dmitry Titov  <dimich@chromium.org>
    212
  • trunk/WebKit/qt/tests/hybridPixmap/test.html

    r53611 r54986  
    1010                var pxm = myWidget.pixmap;
    1111
    12                 var img = obj.toHTMLImageElement();
     12                var img = new Image;
     13                obj.assignToHTMLImageElement(img);
    1314                var img1 = document.getElementById("img1");
    1415                var img2 = document.getElementById("img2");
     16                var img3 = document.getElementById("img3");
     17                var img4 = document.getElementById("img4");
    1518                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);
    1723                var signalsFired = 0;
    1824                myWidget.compare(obj.toString(),"[Qt Native Pixmap "+obj.width+","+obj.height+"]");
     
    5460        <img id="img1" />
    5561        <img id="img2" />
     62        <img id="img3" />
     63        <img id="img4" />
    5664    </body>
    5765</html>
Note: See TracChangeset for help on using the changeset viewer.