src/openvg/qpixmapdata_vg.cpp
changeset 30 5dc02b23752f
parent 22 79de32ba3296
child 33 3e2da88830cd
--- a/src/openvg/qpixmapdata_vg.cpp	Wed Jun 23 19:07:03 2010 +0300
+++ b/src/openvg/qpixmapdata_vg.cpp	Tue Jul 06 15:10:48 2010 +0300
@@ -42,6 +42,9 @@
 #include "qpixmapdata_vg_p.h"
 #include "qpaintengine_vg_p.h"
 #include <QtGui/private/qdrawhelper_p.h>
+#if !defined(QT_NO_EGL)
+#include <QtGui/private/qegl_p.h>
+#endif
 #include "qvg_p.h"
 #include "qvgimagepool_p.h"
 
@@ -51,8 +54,6 @@
 #endif
 #ifdef QT_SYMBIAN_SUPPORTS_SGIMAGE
 #include <sgresource/sgimage.h>
-typedef EGLImageKHR (*pfnEglCreateImageKHR)(EGLDisplay, EGLContext, EGLenum, EGLClientBuffer, EGLint*);
-typedef EGLBoolean (*pfnEglDestroyImageKHR)(EGLDisplay, EGLImageKHR);
 typedef VGImage (*pfnVgCreateEGLImageTargetKHR)(VGeglImageKHR);
 #endif // QT_SYMBIAN_SUPPORTS_SGIMAGE
 
@@ -233,14 +234,6 @@
     return source.paintEngine();
 }
 
-// This function works around QImage::bits() making a deep copy if the
-// QImage is not const.  We force it to be const and then get the bits.
-// XXX: Should add a QImage::constBits() in the future to replace this.
-const uchar *qt_vg_imageBits(const QImage& image)
-{
-    return image.bits();
-}
-
 VGImage QVGPixmapData::toVGImage()
 {
     if (!isValid())
@@ -273,7 +266,7 @@
     if (!source.isNull() && recreate) {
         vgImageSubData
             (vgImage,
-             qt_vg_imageBits(source), source.bytesPerLine(),
+             source.constBits(), source.bytesPerLine(),
              VG_sARGB_8888_PRE, 0, 0, w, h);
     }
 
@@ -496,18 +489,16 @@
             return;
         }
 
-        pfnEglCreateImageKHR eglCreateImageKHR = (pfnEglCreateImageKHR) eglGetProcAddress("eglCreateImageKHR");
-        pfnEglDestroyImageKHR eglDestroyImageKHR = (pfnEglDestroyImageKHR) eglGetProcAddress("eglDestroyImageKHR");
         pfnVgCreateEGLImageTargetKHR vgCreateEGLImageTargetKHR = (pfnVgCreateEGLImageTargetKHR) eglGetProcAddress("vgCreateEGLImageTargetKHR");
 
-        if (eglGetError() != EGL_SUCCESS || !eglCreateImageKHR || !eglDestroyImageKHR || !vgCreateEGLImageTargetKHR) {
+        if (eglGetError() != EGL_SUCCESS || !(QEgl::hasExtension("EGL_KHR_image") || QEgl::hasExtension("EGL_KHR_image_pixmap")) || !vgCreateEGLImageTargetKHR) {
             cleanup();
             driver.Close();
             return;
         }
 
         const EGLint KEglImageAttribs[] = {EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, EGL_NONE};
-        EGLImageKHR eglImage = eglCreateImageKHR(QEglContext::display(),
+        EGLImageKHR eglImage = QEgl::eglCreateImageKHR(QEgl::display(),
                 EGL_NO_CONTEXT,
                 EGL_NATIVE_PIXMAP_KHR,
                 (EGLClientBuffer)sgImage,
@@ -522,7 +513,7 @@
         vgImage = vgCreateEGLImageTargetKHR(eglImage);
         if (vgGetError() != VG_NO_ERROR) {
             cleanup();
-            eglDestroyImageKHR(QEglContext::display(), eglImage);
+            QEgl::eglDestroyImageKHR(QEgl::display(), eglImage);
             driver.Close();
             return;
         }
@@ -536,7 +527,7 @@
         prevSize = QSize(w, h);
         setSerialNumber(++qt_vg_pixmap_serial);
         // release stuff
-        eglDestroyImageKHR(QEglContext::display(), eglImage);
+        QEgl::eglDestroyImageKHR(QEgl::display(), eglImage);
         driver.Close();
 #endif
     } else if (type == QPixmapData::FbsBitmap) {
@@ -614,17 +605,15 @@
             return 0;
         }
 
-        pfnEglCreateImageKHR eglCreateImageKHR = (pfnEglCreateImageKHR) eglGetProcAddress("eglCreateImageKHR");
-        pfnEglDestroyImageKHR eglDestroyImageKHR = (pfnEglDestroyImageKHR) eglGetProcAddress("eglDestroyImageKHR");
         pfnVgCreateEGLImageTargetKHR vgCreateEGLImageTargetKHR = (pfnVgCreateEGLImageTargetKHR) eglGetProcAddress("vgCreateEGLImageTargetKHR");
 
-        if (eglGetError() != EGL_SUCCESS || !eglCreateImageKHR || !eglDestroyImageKHR || !vgCreateEGLImageTargetKHR) {
+        if (eglGetError() != EGL_SUCCESS || !(QEgl::hasExtension("EGL_KHR_image") || QEgl::hasExtension("EGL_KHR_image_pixmap")) || !vgCreateEGLImageTargetKHR) {
             driver.Close();
             return 0;
         }
 
         const EGLint KEglImageAttribs[] = {EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, EGL_NONE};
-        EGLImageKHR eglImage = eglCreateImageKHR(QEglContext::display(),
+        EGLImageKHR eglImage = QEgl::eglCreateImageKHR(QEgl::display(),
                 EGL_NO_CONTEXT,
                 EGL_NATIVE_PIXMAP_KHR,
                 (EGLClientBuffer)sgImage,
@@ -637,7 +626,7 @@
 
         VGImage dstVgImage = vgCreateEGLImageTargetKHR(eglImage);
         if (vgGetError() != VG_NO_ERROR) {
-            eglDestroyImageKHR(QEglContext::display(), eglImage);
+            QEgl::eglDestroyImageKHR(QEgl::display(), eglImage);
             sgImage->Close();
             driver.Close();
             return 0;
@@ -653,7 +642,7 @@
         }
         // release stuff
         vgDestroyImage(dstVgImage);
-        eglDestroyImageKHR(QEglContext::display(), eglImage);
+        QEgl::eglDestroyImageKHR(QEgl::display(), eglImage);
         driver.Close();
         return reinterpret_cast<void*>(sgImage);
 #endif
@@ -663,7 +652,7 @@
         if (bitmap) {
             if (bitmap->Create(TSize(source.width(), source.height()),
                               EColor16MAP) == KErrNone) {
-                const uchar *sptr = qt_vg_imageBits(source);
+                const uchar *sptr = source.constBits();
                 bitmap->BeginDataAccess();
 
                 uchar *dptr = (uchar*)bitmap->DataAddress();