src/openvg/qpixmapdata_vg.cpp
changeset 37 758a864f9613
parent 33 3e2da88830cd
--- a/src/openvg/qpixmapdata_vg.cpp	Fri Sep 17 08:34:18 2010 +0300
+++ b/src/openvg/qpixmapdata_vg.cpp	Mon Oct 04 01:19:32 2010 +0300
@@ -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::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;
 }