openvg/openvgrefimplementation/sfopenvg/vgi/vgi.cpp
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 6 250ac10a3d98
child 57 2bf8a359aa2f
child 78 49afd8c680ca
child 104 2ae553ab1feb
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

/*
* 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;
	}