--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/openvg/openvgrefimplementation/sfopenvg/vgi/vgi.cpp Mon Feb 08 19:15:06 2010 +0000
@@ -0,0 +1,200 @@
+/*
+* Copyright (c) 2009 Symbian Foundation Ltd
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* Symbian Foundation Ltd - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* Implementation of VGI interface
+*/
+
+#include <e32std.h>
+#include <vg\vgcontext.h>
+#include <vg\vgcontext_symbian.h>
+#include <egl.h>
+
+#define MAX_WIDTH 320*4 // in bytes
+#define MAX_HEIGHT 320*4 // in bytes
+class TEgl
+ {
+public:
+ TEgl() :
+ iEgldisplay(0),
+ iEglsurface(0),
+ iEglcontext(0),
+ iInitialised(EFalse),
+ iPixmap(NULL)
+ {};
+
+public: //data
+ EGLDisplay iEgldisplay;
+ EGLSurface iEglsurface;
+ EGLContext iEglcontext;
+ TBool iInitialised;
+ CFbsBitmap* iPixmap;
+ };
+
+
+TEgl& GetEglInstance()
+ {
+ //use TLS
+ //use TLS to store static global egl
+ TEgl* pEgl=NULL;
+ if((pEgl = static_cast<TEgl*>(Dll::Tls()))==NULL)
+ {
+ //create TLS instance
+ pEgl = new(ELeave)TEgl;
+ Dll::SetTls(pEgl);
+ }
+ return *pEgl;
+ }
+
+void ReleaseTls()
+ {
+ TEgl* pEgl = static_cast<TEgl*>(Dll::Tls());
+ if (pEgl)
+ delete pEgl;
+ Dll::SetTls(NULL);
+ }
+
+VGI_API_CALL int VGIInitialize( int /*width*/, int /*height*/, VGIColorSpace /*colorSpace*/ )
+ {
+ return VGI_OK;
+ }
+
+VGI_API_CALL int VGIInitializeEx( int /*width*/, int /*height*/, VGIColorSpace /*colorSpace*/, int /*premultiplied*/, int /*conformant*/ )
+ {
+ return VGI_OK;
+ }
+
+VGI_API_CALL int VGICopyToTarget( VGIColorBufferFormat /*format*/, int /*bufferStride*/, void */*buffer*/, int /*maskStride*/, void */*mask*/, VGICopyToTargetHint /*hint*/ )
+ {
+ return VGI_OK;
+ }
+
+VGI_API_CALL void VGITerminate( void )
+ {
+
+ }
+
+VGI_API_CALL int VGIResize( int /*width*/, int /*height*/ )
+ {
+ return VGI_OK;
+ }
+
+VGI_API_CALL int VGIBindToImage( VGImage /*image*/ )
+ {
+ return VGI_OK;
+ }
+
+VGI_API_CALL int VGIUnBindImage( void )
+ {
+ return VGI_OK;
+ }
+
+
+
+VGI_API_CALL TInt VGISymbianInitialize( TSize aSize, VGIColorSpace /*aColorSpace*/ )
+ {
+ TEgl& egl = GetEglInstance();
+ //only init once
+ if(!egl.iInitialised)
+ {
+ egl.iInitialised = ETrue;
+ static const EGLint s_configAttribs[] =
+ {
+ EGL_RED_SIZE,
+ 8,
+ EGL_GREEN_SIZE,
+ 8,
+ EGL_BLUE_SIZE,
+ 8,
+ EGL_ALPHA_SIZE,
+ 8,
+ EGL_LUMINANCE_SIZE,
+ EGL_DONT_CARE, //EGL_DONT_CARE
+ EGL_SURFACE_TYPE,
+ EGL_WINDOW_BIT,
+ EGL_SAMPLES,
+ 1,
+ EGL_NONE
+ };
+ EGLint numconfigs;
+
+ egl.iEgldisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ eglInitialize(egl.iEgldisplay, NULL, NULL);
+ __ASSERT_ALWAYS(eglGetError() == EGL_SUCCESS,User::Invariant());
+ eglBindAPI(EGL_OPENVG_API);
+
+ EGLConfig eglconfig;
+
+ eglChooseConfig(egl.iEgldisplay, s_configAttribs, &eglconfig, 1, &numconfigs);
+ __ASSERT_ALWAYS(eglGetError() == EGL_SUCCESS,User::Invariant());
+ __ASSERT_ALWAYS(numconfigs == 1,User::Invariant());
+
+ TSize maxSize(MAX_WIDTH,MAX_HEIGHT);
+ egl.iPixmap = new(ELeave) CFbsBitmap();
+ egl.iPixmap->Create( maxSize, EColor16MA );
+
+ egl.iEglsurface = eglCreatePixmapSurface(egl.iEgldisplay, eglconfig, (EGLNativePixmapType)egl.iPixmap, NULL);
+ __ASSERT_ALWAYS(eglGetError() == EGL_SUCCESS,User::Invariant());
+
+ egl.iEglcontext = eglCreateContext(egl.iEgldisplay, eglconfig, NULL, NULL);
+ __ASSERT_ALWAYS(eglGetError() == EGL_SUCCESS,User::Invariant());
+ eglMakeCurrent(egl.iEgldisplay, egl.iEglsurface, egl.iEglsurface, egl.iEglcontext);
+ __ASSERT_ALWAYS(eglGetError() == EGL_SUCCESS,User::Invariant());
+
+ }
+ return VGI_OK;
+ }
+
+VGI_API_CALL TInt VGISymbianInitializeEx( TSize /*aSize*/, VGIColorSpace /*aColorSpace*/, TBool /*aPremultiplied*/, TBool /*aConformant*/ )
+ {
+ return VGI_OK;
+ }
+
+VGI_API_CALL TInt VGISymbianCopyToBitmap( CFbsBitmap *aBitmap, CFbsBitmap *aMaskBitmap, VGICopyToTargetHint /*aHint*/ )
+ {
+ TEgl& egl = GetEglInstance();
+
+ eglCopyBuffers(egl.iEgldisplay, egl.iEglsurface,(EGLNativePixmapType)aBitmap);
+
+ if(aMaskBitmap)
+ {
+ eglCopyBuffers(egl.iEgldisplay, egl.iEglsurface,(EGLNativePixmapType)aMaskBitmap);
+ }
+
+ __ASSERT_ALWAYS(eglGetError() == EGL_SUCCESS,User::Invariant());
+ return VGI_OK;
+ }
+
+VGI_API_CALL void VGISymbianTerminate()
+{
+ TEgl& egl = GetEglInstance();
+ eglDestroyContext(egl.iEgldisplay, egl.iEglcontext);
+ eglDestroySurface(egl.iEgldisplay, egl.iEglsurface);
+ delete egl.iPixmap;
+ ReleaseTls();
+}
+
+VGI_API_CALL TInt VGISymbianResize( TSize aSize )
+ {
+ return VGI_OK;
+ }
+
+VGI_API_CALL TInt VGISymbianBindToImage( VGImage /*aImage*/ )
+ {
+ return VGI_OK;
+ }
+
+VGI_API_CALL TInt VGISymbianUnBindImage()
+ {
+ return VGI_OK;
+ }
+