src/openvg/qpixmapdata_vg.cpp
changeset 19 fcece45ef507
parent 18 2f34d5167611
child 22 79de32ba3296
equal deleted inserted replaced
18:2f34d5167611 19:fcece45ef507
    37 **
    37 **
    38 ** $QT_END_LICENSE$
    38 ** $QT_END_LICENSE$
    39 **
    39 **
    40 ****************************************************************************/
    40 ****************************************************************************/
    41 
    41 
    42 #include "../src/gui/egl/qegl_p.h"
       
    43 #include "qpixmapdata_vg_p.h"
    42 #include "qpixmapdata_vg_p.h"
    44 #include "qpaintengine_vg_p.h"
    43 #include "qpaintengine_vg_p.h"
    45 #include <QtGui/private/qdrawhelper_p.h>
    44 #include <QtGui/private/qdrawhelper_p.h>
    46 #include "qvg_p.h"
    45 #include "qvg_p.h"
    47 #include "qvgimagepool_p.h"
    46 #include "qvgimagepool_p.h"
    48 
    47 
       
    48 #if defined(Q_OS_SYMBIAN)
    49 #include <private/qt_s60_p.h>
    49 #include <private/qt_s60_p.h>
    50 #include <fbs.h>
    50 #include <fbs.h>
       
    51 #endif
    51 #ifdef QT_SYMBIAN_SUPPORTS_SGIMAGE
    52 #ifdef QT_SYMBIAN_SUPPORTS_SGIMAGE
    52 #include <sgresource/sgimage.h>
    53 #include <sgresource/sgimage.h>
    53 typedef EGLImageKHR (*pfnEglCreateImageKHR)(EGLDisplay, EGLContext, EGLenum, EGLClientBuffer, EGLint*);
    54 typedef EGLImageKHR (*pfnEglCreateImageKHR)(EGLDisplay, EGLContext, EGLenum, EGLClientBuffer, EGLint*);
    54 typedef EGLBoolean (*pfnEglDestroyImageKHR)(EGLDisplay, EGLImageKHR);
    55 typedef EGLBoolean (*pfnEglDestroyImageKHR)(EGLDisplay, EGLImageKHR);
    55 typedef VGImage (*pfnVgCreateEGLImageTargetKHR)(VGeglImageKHR);
    56 typedef VGImage (*pfnVgCreateEGLImageTargetKHR)(VGeglImageKHR);
   463     source = QImage();
   464     source = QImage();
   464 }
   465 }
   465 
   466 
   466 void QVGPixmapData::fromNativeType(void* pixmap, NativeType type)
   467 void QVGPixmapData::fromNativeType(void* pixmap, NativeType type)
   467 {
   468 {
       
   469     if (type == QPixmapData::SgImage && pixmap) {
   468 #if defined(QT_SYMBIAN_SUPPORTS_SGIMAGE) && !defined(QT_NO_EGL)
   470 #if defined(QT_SYMBIAN_SUPPORTS_SGIMAGE) && !defined(QT_NO_EGL)
   469     if (type == QPixmapData::SgImage && pixmap) {
       
   470         RSgImage *sgImage = reinterpret_cast<RSgImage*>(pixmap);
   471         RSgImage *sgImage = reinterpret_cast<RSgImage*>(pixmap);
   471         // when "0" used as argument then
       
   472         // default display, context are used
       
   473         if (!context)
       
   474             context = qt_vg_create_context(0, QInternal::Pixmap);
       
   475 
   472 
   476         destroyImages();
   473         destroyImages();
   477         prevSize = QSize();
   474         prevSize = QSize();
   478 
   475 
   479         TInt err = 0;
   476         TInt err = 0;
   508             driver.Close();
   505             driver.Close();
   509             return;
   506             return;
   510         }
   507         }
   511 
   508 
   512         const EGLint KEglImageAttribs[] = {EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, EGL_NONE};
   509         const EGLint KEglImageAttribs[] = {EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, EGL_NONE};
   513         EGLImageKHR eglImage = eglCreateImageKHR(context->display(),
   510         EGLImageKHR eglImage = eglCreateImageKHR(QEglContext::display(),
   514                 EGL_NO_CONTEXT,
   511                 EGL_NO_CONTEXT,
   515                 EGL_NATIVE_PIXMAP_KHR,
   512                 EGL_NATIVE_PIXMAP_KHR,
   516                 (EGLClientBuffer)sgImage,
   513                 (EGLClientBuffer)sgImage,
   517                 (EGLint*)KEglImageAttribs);
   514                 (EGLint*)KEglImageAttribs);
   518 
   515 
   539         prevSize = QSize(w, h);
   536         prevSize = QSize(w, h);
   540         setSerialNumber(++qt_vg_pixmap_serial);
   537         setSerialNumber(++qt_vg_pixmap_serial);
   541         // release stuff
   538         // release stuff
   542         eglDestroyImageKHR(QEglContext::display(), eglImage);
   539         eglDestroyImageKHR(QEglContext::display(), eglImage);
   543         driver.Close();
   540         driver.Close();
       
   541 #endif
   544     } else if (type == QPixmapData::FbsBitmap) {
   542     } else if (type == QPixmapData::FbsBitmap) {
   545         CFbsBitmap *bitmap = reinterpret_cast<CFbsBitmap*>(pixmap);
   543         CFbsBitmap *bitmap = reinterpret_cast<CFbsBitmap*>(pixmap);
   546 
   544 
   547         bool deleteSourceBitmap = false;
   545         bool deleteSourceBitmap = false;
   548 
   546 
   584         fromImage(img, Qt::AutoColor);
   582         fromImage(img, Qt::AutoColor);
   585 
   583 
   586         if(deleteSourceBitmap)
   584         if(deleteSourceBitmap)
   587             delete bitmap;
   585             delete bitmap;
   588     }
   586     }
   589 #else
       
   590     Q_UNUSED(pixmap);
       
   591     Q_UNUSED(type);
       
   592 #endif
       
   593 }
   587 }
   594 
   588 
   595 void* QVGPixmapData::toNativeType(NativeType type)
   589 void* QVGPixmapData::toNativeType(NativeType type)
   596 {
   590 {
       
   591     if (type == QPixmapData::SgImage) {
   597 #if defined(QT_SYMBIAN_SUPPORTS_SGIMAGE) && !defined(QT_NO_EGL)
   592 #if defined(QT_SYMBIAN_SUPPORTS_SGIMAGE) && !defined(QT_NO_EGL)
   598     if (type == QPixmapData::SgImage) {
       
   599         toVGImage();
   593         toVGImage();
   600 
   594 
   601         if (!isValid() || vgImage == VG_INVALID_HANDLE)
   595         if (!isValid() || vgImage == VG_INVALID_HANDLE)
   602             return 0;
   596             return 0;
   603 
   597 
   628             driver.Close();
   622             driver.Close();
   629             return 0;
   623             return 0;
   630         }
   624         }
   631 
   625 
   632         const EGLint KEglImageAttribs[] = {EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, EGL_NONE};
   626         const EGLint KEglImageAttribs[] = {EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, EGL_NONE};
   633         EGLImageKHR eglImage = eglCreateImageKHR(context->display(),
   627         EGLImageKHR eglImage = eglCreateImageKHR(QEglContext::display(),
   634                 EGL_NO_CONTEXT,
   628                 EGL_NO_CONTEXT,
   635                 EGL_NATIVE_PIXMAP_KHR,
   629                 EGL_NATIVE_PIXMAP_KHR,
   636                 (EGLClientBuffer)sgImage,
   630                 (EGLClientBuffer)sgImage,
   637                 (EGLint*)KEglImageAttribs);
   631                 (EGLint*)KEglImageAttribs);
   638         if (eglGetError() != EGL_SUCCESS) {
   632         if (eglGetError() != EGL_SUCCESS) {
   660         // release stuff
   654         // release stuff
   661         vgDestroyImage(dstVgImage);
   655         vgDestroyImage(dstVgImage);
   662         eglDestroyImageKHR(QEglContext::display(), eglImage);
   656         eglDestroyImageKHR(QEglContext::display(), eglImage);
   663         driver.Close();
   657         driver.Close();
   664         return reinterpret_cast<void*>(sgImage);
   658         return reinterpret_cast<void*>(sgImage);
       
   659 #endif
   665     } else if (type == QPixmapData::FbsBitmap) {
   660     } else if (type == QPixmapData::FbsBitmap) {
   666         CFbsBitmap *bitmap = q_check_ptr(new CFbsBitmap);
   661         CFbsBitmap *bitmap = q_check_ptr(new CFbsBitmap);
   667 
   662 
   668         if (bitmap) {
   663         if (bitmap) {
   669             if (bitmap->Create(TSize(source.width(), source.height()),
   664             if (bitmap->Create(TSize(source.width(), source.height()),
   681             }
   676             }
   682         }
   677         }
   683 
   678 
   684         return reinterpret_cast<void*>(bitmap);
   679         return reinterpret_cast<void*>(bitmap);
   685     }
   680     }
   686 #else
       
   687     Q_UNUSED(type);
       
   688     return 0;
   681     return 0;
   689 #endif
       
   690 }
   682 }
   691 #endif //Q_OS_SYMBIAN
   683 #endif //Q_OS_SYMBIAN
   692 
   684 
   693 QT_END_NAMESPACE
   685 QT_END_NAMESPACE