Apply patch 6. Cleanup syborg specific variation by allowing the project file to build one specially for it. Fix include macros for test apps. Further tuning how the variant is build appears in later patches. Explicitly including platform_paths seems to make debugging easier for carbide. This might be removed if its bad practice or causes issues.
/*
* 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;
}