--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiVg10VGImageBinder.cpp Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Class HuiVg10VGImageBinder
+*
+*/
+
+#include "HuiVg10VgImageBinder.h"
+#include "HuiVg10RenderPlugin.h"
+#include "uiacceltk/HuiUtil.h"
+
+CHuiVg10VgImageBinder::CHuiVg10VgImageBinder(CHuiVg10RenderPlugin* aRenderPlugin):
+ iRenderPlugin(aRenderPlugin)
+ {
+ }
+
+void CHuiVg10VgImageBinder::ConstructL()
+ {
+ }
+
+CHuiVg10VgImageBinder::~CHuiVg10VgImageBinder()
+ {
+ if (iEglPBufferSurface_Client)
+ {
+ eglDestroySurface( iRenderPlugin->EglDisplay(), iEglPBufferSurface_Client );
+ iEglPBufferSurface_Client = EGL_NO_SURFACE;
+ }
+ // Not owned, don't delete.
+ iRenderPlugin = NULL;
+ }
+
+CHuiVg10VgImageBinder* CHuiVg10VgImageBinder::NewL(CHuiVg10RenderPlugin* aRenderPlugin)
+ {
+ CHuiVg10VgImageBinder* self = new (ELeave) CHuiVg10VgImageBinder(aRenderPlugin);
+ self->ConstructL();
+ return self;
+ }
+
+TInt CHuiVg10VgImageBinder::BindClientBuffer(TUint aBuffer)
+ {
+ // Check whether we should use the Alpha format bit
+ VGImageFormat imageFormat = (VGImageFormat)vgGetParameteri(aBuffer, VG_IMAGE_FORMAT);
+ TInt maskBit = 0;
+ if (imageFormat == VG_sRGBA_8888_PRE)
+ {
+ maskBit = EGL_VG_ALPHA_FORMAT_PRE_BIT;
+ }
+
+ const TInt BITS_PER_CHANNEL = 8;
+ // Choose an EGL config
+ const EGLint attrs[] =
+ {
+ EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
+ EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | maskBit,
+ EGL_RED_SIZE, BITS_PER_CHANNEL,
+ EGL_GREEN_SIZE, BITS_PER_CHANNEL,
+ EGL_BLUE_SIZE, BITS_PER_CHANNEL,
+ EGL_ALPHA_SIZE, BITS_PER_CHANNEL,
+ EGL_NONE
+ };
+
+ // Create a context
+ TInt configCount = iRenderPlugin->EglChooseConfig(attrs);
+ EGLConfig config = iRenderPlugin->EglConfig(0);
+
+ // Create a pbuffer surface
+ iEglPBufferSurface_Client = eglCreatePbufferFromClientBuffer(iRenderPlugin->EglDisplay(),
+ EGL_OPENVG_IMAGE,
+ static_cast<EGLClientBuffer>(aBuffer), // Use the param image as buffer
+ config, NULL);
+
+ if (iEglPBufferSurface_Client == EGL_NO_SURFACE)
+ {
+ HUI_DEBUG1(_L("CHuiVg10VgImageBinder::BindClientBuffer() - EGL Surface could not be created, eglErr: %04x"), eglGetError() );
+ return KErrGeneral;
+ }
+
+ // Save current context and surfaces
+ iSavedContext = eglGetCurrentContext();
+ iSavedDrawSurface = eglGetCurrentSurface(EGL_DRAW);
+ iSavedReadSurface = eglGetCurrentSurface(EGL_READ);
+
+ EGLContext context = iRenderPlugin->EglSharedContext();
+
+ // Bind our own PBuffer surface (from VGImage)
+ if ( eglMakeCurrent(iRenderPlugin->EglDisplay(), iEglPBufferSurface_Client, iEglPBufferSurface_Client, context /*iSavedContext*/) == EGL_FALSE )
+ {
+ HUI_DEBUG1(_L("CHuiVg10VgImageBinder::BindClientBuffer() - EGL Surface could not be made current, eglErr: %04x"), eglGetError());
+ return KErrGeneral;
+ }
+
+ // Alles in Ordnung!
+ return KErrNone;
+ }
+
+TInt CHuiVg10VgImageBinder::UnBindClientBuffer()
+ {
+ if ( eglMakeCurrent(iRenderPlugin->EglDisplay(), iSavedDrawSurface, iSavedReadSurface, iSavedContext) == EGL_FALSE )
+ {
+ HUI_DEBUG1(_L("CHuiVg10VgImageBinder::BindClientBuffer() - EGL Surface could not be made current, eglErr: %04x"), eglGetError());
+ return KErrGeneral;
+ }
+
+ iSavedDrawSurface = 0;
+ iSavedReadSurface = 0;
+ iSavedContext = 0;
+
+ if (iEglPBufferSurface_Client)
+ {
+ eglDestroySurface( iRenderPlugin->EglDisplay(), iEglPBufferSurface_Client );
+ iEglPBufferSurface_Client = EGL_NO_SURFACE;
+ }
+
+ // Everything went fine
+ return KErrNone;
+ }
+
+// End of file
+