Changeset 40546 in webkit


Ignore:
Timestamp:
Feb 3, 2009 1:26:14 PM (15 years ago)
Author:
krit@webkit.org
Message:

2009-02-03 Dirk Schulze <krit@webkit.org>

Reviewed by Sam Weinig and Oliver Hunt.

Added getImageData() support for QtWebKit.

[QT] lacks getImageData / putImageData support in Canvas
https://bugs.webkit.org/show_bug.cgi?id=22186

  • platform/graphics/qt/ImageBufferQt.cpp: (WebCore::ImageBuffer::getImageData):
Location:
trunk/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r40545 r40546  
     12009-02-03  Dirk Schulze  <krit@webkit.org>
     2
     3        Reviewed by Sam Weinig and Oliver Hunt.
     4
     5        Added getImageData() support for QtWebKit.
     6
     7        [QT] lacks getImageData / putImageData support in Canvas
     8        https://bugs.webkit.org/show_bug.cgi?id=22186
     9
     10        * platform/graphics/qt/ImageBufferQt.cpp:
     11        (WebCore::ImageBuffer::getImageData):
     12
    1132009-02-03  Eric Roman  <eroman@chromium.org>
    214
  • trunk/WebCore/platform/graphics/qt/ImageBufferQt.cpp

    r38006 r40546  
    3636
    3737#include <QBuffer>
     38#include <QColor>
     39#include <QImage>
    3840#include <QImageWriter>
    3941#include <QPainter>
     
    8082}
    8183
    82 PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect&) const
     84PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const
    8385{
    84     notImplemented();
    85     return 0;
     86    PassRefPtr<ImageData> result = ImageData::create(rect.width(), rect.height());
     87    unsigned char* data = result->data()->data()->data();
     88
     89    if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > m_size.width() || (rect.y() + rect.height()) > m_size.height())
     90        memset(data, 0, result->data()->length());
     91
     92    int originx = rect.x();
     93    int destx = 0;
     94    if (originx < 0) {
     95        destx = -originx;
     96        originx = 0;
     97    }
     98    int endx = rect.x() + rect.width();
     99    if (endx > m_size.width())
     100        endx = m_size.width();
     101    int numColumns = endx - originx;
     102
     103    int originy = rect.y();
     104    int desty = 0;
     105    if (originy < 0) {
     106        desty = -originy;
     107        originy = 0;
     108    }
     109    int endy = rect.y() + rect.height();
     110    if (endy > m_size.height())
     111        endy = m_size.height();
     112    int numRows = endy - originy;
     113
     114    QImage image;
     115    if (m_data.m_pixmap.toImage().format() != QImage::Format_ARGB32)
     116        image = m_data.m_pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
     117    else
     118        image = m_data.m_pixmap.toImage();
     119    ASSERT(image);
     120
     121    unsigned destBytesPerRow = 4 * rect.width();
     122    unsigned char* destRows = data + desty * destBytesPerRow + destx * 4;
     123    for (int y = 0; y < numRows; ++y) {
     124        for (int x = 0; x < numColumns; x++) {
     125            QRgb value = image.pixel(x + originx, y + originy);
     126            int basex = x * 4;
     127
     128            destRows[basex] = qRed(value);
     129            destRows[basex + 1] = qGreen(value);
     130            destRows[basex + 2] = qBlue(value);
     131            destRows[basex + 3] = qAlpha(value);
     132        }
     133        destRows += destBytesPerRow;
     134    }
     135
     136    return result;
    86137}
    87138
Note: See TracChangeset for help on using the changeset viewer.