uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiVg10VGImageBinder.cpp
changeset 0 15bf7259bb7c
child 17 3ac8bf5c5014
--- /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
+