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()), |