diff options
author | Jani Hautakangas <ext-jani.hautakangas@nokia.com> | 2010-08-24 11:53:10 (GMT) |
---|---|---|
committer | Jani Hautakangas <ext-jani.hautakangas@nokia.com> | 2010-08-24 12:16:26 (GMT) |
commit | 6ab7925d9944f0debe56a5085c58715549566451 (patch) | |
tree | d3bad7c19313c411fa33240499e0b0414e42dac2 | |
parent | 1e55b0ecf415d023bbb5f291a2f26ba50c1a508b (diff) | |
download | Qt-6ab7925d9944f0debe56a5085c58715549566451.zip Qt-6ab7925d9944f0debe56a5085c58715549566451.tar.gz Qt-6ab7925d9944f0debe56a5085c58715549566451.tar.bz2 |
Use QImage 'convertInPlace' versions in QVGPixmapData load functions.
QImage 'convertInPlace' uses less memory than 'convertToFormat' version.
Task-number: QT-3710
Reviewed-by: Jason Barron
-rw-r--r-- | src/openvg/qpixmapdata_vg.cpp | 53 | ||||
-rw-r--r-- | src/openvg/qpixmapdata_vg_p.h | 8 |
2 files changed, 60 insertions, 1 deletions
diff --git a/src/openvg/qpixmapdata_vg.cpp b/src/openvg/qpixmapdata_vg.cpp index cb413d0..e8ec333 100644 --- a/src/openvg/qpixmapdata_vg.cpp +++ b/src/openvg/qpixmapdata_vg.cpp @@ -47,6 +47,9 @@ #endif #include "qvg_p.h" #include "qvgimagepool_p.h" +#include <QBuffer> +#include <QImageReader> +#include <QtGui/private/qimage_p.h> QT_BEGIN_NAMESPACE @@ -152,11 +155,59 @@ void QVGPixmapData::resize(int wid, int ht) void QVGPixmapData::fromImage (const QImage &image, Qt::ImageConversionFlags flags) { + QImage img = image; + createPixmapForImage(img, flags, false); +} + +void QVGPixmapData::fromImageReader(QImageReader *imageReader, + Qt::ImageConversionFlags flags) +{ + QImage image = imageReader->read(); + if (image.isNull()) + return; + + createPixmapForImage(image, flags, true); +} + +bool QVGPixmapData::fromFile(const QString &filename, const char *format, + Qt::ImageConversionFlags flags) +{ + QImage image = QImageReader(filename, format).read(); + if (image.isNull()) + return false; + + createPixmapForImage(image, flags, true); + + return !isNull(); +} + +bool QVGPixmapData::fromData(const uchar *buffer, uint len, const char *format, + Qt::ImageConversionFlags flags) +{ + QByteArray a = QByteArray::fromRawData(reinterpret_cast<const char *>(buffer), len); + QBuffer b(&a); + b.open(QIODevice::ReadOnly); + QImage image = QImageReader(&b, format).read(); + if (image.isNull()) + return false; + + createPixmapForImage(image, flags, true); + + return !isNull(); +} + +void QVGPixmapData::createPixmapForImage(QImage &image, Qt::ImageConversionFlags flags, bool inPlace) +{ if (image.size() == QSize(w, h)) setSerialNumber(++qt_vg_pixmap_serial); else resize(image.width(), image.height()); - source = image.convertToFormat(sourceFormat(), flags); + + if (inPlace && image.data_ptr()->convertInPlace(sourceFormat(), flags)) + source = image; + else + source = image.convertToFormat(sourceFormat()); + recreate = true; } diff --git a/src/openvg/qpixmapdata_vg_p.h b/src/openvg/qpixmapdata_vg_p.h index c21b48f..114d545 100644 --- a/src/openvg/qpixmapdata_vg_p.h +++ b/src/openvg/qpixmapdata_vg_p.h @@ -64,6 +64,7 @@ QT_BEGIN_NAMESPACE class QEglContext; class QVGImagePool; +class QImageReader; #if !defined(QT_NO_EGL) class QVGPixmapData; @@ -87,6 +88,12 @@ public: void resize(int width, int height); void fromImage(const QImage &image, Qt::ImageConversionFlags flags); + void fromImageReader(QImageReader *imageReader, + Qt::ImageConversionFlags flags); + bool fromFile(const QString &filename, const char *format, + Qt::ImageConversionFlags flags); + bool fromData(const uchar *buffer, uint len, const char *format, + Qt::ImageConversionFlags flags); void fill(const QColor &color); bool hasAlphaChannel() const; @@ -126,6 +133,7 @@ public: protected: int metric(QPaintDevice::PaintDeviceMetric metric) const; + void createPixmapForImage(QImage &image, Qt::ImageConversionFlags flags, bool inPlace); #if defined(Q_OS_SYMBIAN) void cleanup(); |