guestrendering/guestopenvg/inc/vgstate.h
author Matt Plumtree <matt.plumtree@nokia.com>
Thu, 07 Oct 2010 13:58:22 +0100
branchbug235_bringup_0
changeset 55 09263774e342
parent 24 a3f46bb01be2
child 59 d9b81aebba7b
permissions -rwxr-xr-x
Move GLES20 source into standard locations Move Khronos headers into their respective components, to be exported by each. Remove hostthreadadapter as nothing outside of the vghwapiwrapper, which now contains the code, needs it

// Copyright (c) 2010 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:
// Header file defining Open VG client-side state classes.

#ifndef VGSTATE_H
#define VGSTATE_H

#include <EGL/egl.h>
#include <VG/openvg.h>
#include <e32hashtab.h>
#include "vghwutils.h"



// tracing
#include <e32debug.h>
#ifdef _DEBUG
	#define OPENVG_TRACE(fmt, args...) RDebug::Printf(fmt, ##args)
	#define VGPANIC_ASSERT(condition, panic) if (!(condition)) { VgPanic(panic, #panic, #condition, __FILE__, __LINE__); }
	#define VGPANIC_ASSERT_DEBUG(condition, panic) if (!(condition)) { VgPanic(panic, #panic, #condition, __FILE__, __LINE__); }
	#define VGPANIC_ALWAYS(panic) { VgPanic(panic, #panic, NULL, __FILE__, __LINE__); }
#else
	#define OPENVG_TRACE(fmt, args...)
	#define VGPANIC_ASSERT(condition, panic) if (!(condition)) { VgPanic(panic, NULL, NULL, NULL, __LINE__); }
	#define VGPANIC_ASSERT_DEBUG(condition, panic)
	#define VGPANIC_ALWAYS(panic) { VgPanic(panic, NULL, NULL, NULL, __LINE__); }
#endif


// Guest Open VG panic codes
typedef enum
	{
	EVgPanicTemp = 1, // note: for development, references should be replaced with a more specific panic
	EVgPanicNullPixmapPointer,
	EVgPanicPixmapSizeError,
	EVgPanicSingletonAlreadyInitialised,
	EVgPanicSingletonNotInitialised,
	EVgPanicNullPointer,
	EVgPanicBadLastBitsParam,
	EVgPanicBadRowLengthParam,
	EVgPanicBadRowCountParam,
	EVgPanicStrideSmallerThanRowLength, // 10
	EVgPanicNotReplyOpcode,
	EVgPanicDeleteInUseVgImageInfo,
	EVgPanicUidGeneratorZeroSeed,
	EVgPanicMissingEglInterface,
	EVgPanicNullCVgHandlePointer,
	EVgPanicWrongVgHandleType,
	EVgPanicHandleAlreadyMarkedDestroyed,
	EVgPanicUnknownVgHandleType,
	EVgPanicHostHandleIsInvalid,
	EVgPanicImageParentIsInvalid, // 20
	EVgPanicFunctionParameterIsNull,
	EVgPanicValueFromHostVgIsInvalid,
	EVgPanicHostHandleAlreadySet,
	EVgPanicParentImageAlreadyDestroyed,
	EVgPanicStateLockMutexNotHeld,
	} TVgPanic;

void VgPanic(TVgPanic aPanicCode, char* aPanicName, char* aCondition, char* aFile, TInt aLine);


// state singleton, in Writeable Static Data memory
class XOpenVgState;
extern XOpenVgState OpenVgState;

// classes declared in this header
class CVgHandleBase;
class CVgImageBase;
class CVgMaskLayerInfo;
class CVgFontInfo;
class CVgImageInfo;
class CVgPaintInfo;
class CVgPathInfo;
class THandleGen;
class TVgLockHolder;

extern const float KFloatMinusOne;


class THandleGen
	{
public:
	inline void Init(TUint aInit);
	TUint NextUid();
private:
	TUint iValue;
	};

typedef enum
	{
	EVgHandleAny = -1, // match any valid handle type, e.g. for vgSetParameteri
	EVgHandleForFont = 0, // specific types ...
	EVgHandleForImage,
	EVgHandleForPaint,
	EVgHandleForPath,
	EVgHandleForMaskLayer,
	} TVgHandleType;


// state structures for VG objects (i.e. anything that is a VGHandle): VGImage, VGPath, VGMaskLayer, VGPaint, VGFont
// ToDo review how to handle thread locking these objects whilst they are in use
NONSHARABLE_CLASS(CVgHandleBase) : public CBase // Base Class
	{
public:
	static void InitStatics();

	// public inline methods 
	inline VGHandle HostHandle() const;
	inline TVgHandleType HandleType() const;
	inline TBool IsDestroyed() const;
	inline void SetHostHandle(VGHandle aHostHandle);
	inline TUint ClientHandle() const;

	// general & specific portions of derived object destruction
	void Destroy(MVgContext& aVgContext);
	virtual TBool DestroyObject(MVgContext& aVgContext) = 0;

	// Each VGHandle object type must implement GetParameterVectorSize
	virtual VGint GetParameterVectorSize(MVgContext& aVgContext, VGint aParamType) = 0;
	// Base version of  GetParameter* uses GetParameterVectorSize to validate aParamType then calls Host VG
	virtual VGfloat GetParameterf(MVgContext& aVgContext, VGint aParamType);
	virtual VGint GetParameteri(MVgContext& aVgContext, VGint aParamType);
	// For details of Base versions of GetParameter*v see vghandle.cpp
	virtual void GetParameterfv(MVgContext& aVgContext, VGint aParamType, VGint aCount, VGfloat * aValues);
	virtual void GetParameteriv(MVgContext& aVgContext, VGint aParamType, VGint aCount, VGint * aValues);
	// Base versions of SetParameter* assume parameters are read-only, and give an error return
	virtual void SetParameterf(MVgContext& aVgContext, VGint aParamType, VGfloat aValue);
	virtual void SetParameteri(MVgContext& aVgContext, VGint aParamType, VGint aValue);
	virtual void SetParameterfv(MVgContext& aVgContext, VGint aParamType, VGint aCount, const VGfloat * aValues);
	virtual void SetParameteriv(MVgContext& aVgContext, VGint aParamType, VGint aCount, const VGint * aValues);

protected:
	inline CVgHandleBase(TVgHandleType aHandleType);
	inline ~CVgHandleBase();

	VGint HostVgGetParameterVectorSize(MVgContext& aVgContext, VGint aParamType);
	VGint HostVgGetParameteri(MVgContext& aVgContext, VGint aParamType);
	VGfloat HostVgGetParameterf(MVgContext& aVgContext, VGint aParamType);
	void HostVgGetParameterfv(MVgContext& aVgContext, VGint aParamType, VGint aCount, const VGfloat * aValues);
	void HostVgGetParameteriv(MVgContext& aVgContext, VGint aParamType, VGint aCount, const VGint * aValues);
	void HostVgSetParameterf(MVgContext& aVgContext, VGint aParamType, VGfloat aValue);
	void HostVgSetParameteri(MVgContext& aVgContext, VGint aParamType, VGint aValue);
	void HostVgSetParameterfv(MVgContext& aVgContext, VGint aParamType, VGint aCount, const VGfloat * aValues);
	void HostVgSetParameteriv(MVgContext& aVgContext, VGint aParamType, VGint aCount, const VGint * aValues);

protected:
	TUint iClientHandle;
	TVgHandleType iHandleType;
	VGHandle iHostHandle;
	TBool iIsDestroyed;

private:
	static THandleGen iHandleGen; // generator for unique client side handles
	};


NONSHARABLE_CLASS(CVgImageBase) : public CVgHandleBase
	{
public:
	inline VGint Width() const;
	inline VGint Height() const;

	TBool DestroyObject(MVgContext& aVgContext) = 0;

	virtual VGint GetParameterVectorSize(MVgContext& aVgContext, VGint aParamType) = 0;

protected:
	inline CVgImageBase(TVgHandleType aHandleType, VGint aWidth, VGint aHeight);

protected:
	VGint const   iWidth;
	VGint const   iHeight;
	};


NONSHARABLE_CLASS(CVgMaskLayerInfo) : public CVgImageBase
	{
public:
	static CVgMaskLayerInfo* New(VGint aWidth, VGint aHeight);
	virtual TBool DestroyObject(MVgContext& aVgContext);

	virtual VGint GetParameterVectorSize(MVgContext& aVgContext, VGint aParamType);

	// Mask specific operations
	void FillMaskLayer(MVgContext& aVgContext, VGint aX, VGint aY, VGint aWidth, VGint aHeight, VGfloat aValue);
	void CopyMask(MVgContext& aVgContext, VGint aSx, VGint aSy, VGint aDx, VGint aDy, VGint aWidth, VGint aHeight);

private:
	inline CVgMaskLayerInfo(VGint aWidth, VGint aHeight);
	inline ~CVgMaskLayerInfo();
	};


NONSHARABLE_CLASS(CVgImageInfo) : public CVgImageBase
	{
public:
	static CVgImageInfo* New(VGImageFormat aFormat, VGint aWidth, VGint aHeight, VGbitfield aAllowedQuality);
	static CVgImageInfo* New(VGImageFormat aFormat, VGint aWidth, VGint aHeight, EGLImageKHR aEglImage, TUint64& aSgImageId);
	static CVgImageInfo* New(VGint aWidth, VGint aHeight, CVgImageInfo* aParent);
	virtual TBool DestroyObject(MVgContext& aVgContext);

	TInt ChildCount() const;
	CVgImageInfo* Parent() const;
	VGbitfield AllowedQuality() const;
	TBool IsEglSibling() const;
	TUint64 SgImageId() const;
	EGLImageKHR EglImage() const;

	static TInt BitsPerPixelForVgImageFormat(VGImageFormat aFormat);
	static void PixmapBlit(TUint8* aDest, const TUint8* aSource, TInt aDestStride, TInt aSourceStride, TInt aRowCount,
			size_t aRowLength, TInt aLastBits=0);

	virtual VGint GetParameterVectorSize(MVgContext& aVgContext, VGint aParamType);
	virtual VGfloat GetParameterf(MVgContext& aVgContext, VGint aParamType);
	virtual VGint GetParameteri(MVgContext& aVgContext, VGint aParamType);

	void ClearImage(MVgContext& aVgContext, VGint aX, VGint aY, VGint aWidth, VGint aHeight);
	void ImageSubData(MVgContext& aVgContext, const void * aData, VGint aDataStride, VGImageFormat aDataFormat, VGint aX, VGint aY,
			VGint aWidth, VGint aHeight);
	void GetImageSubData(MVgContext& aVgContext, void * aData, VGint aDataStride, VGImageFormat aDataFormat, VGint aX, VGint aY,
			VGint aWidth, VGint aHeight);
	void CopyImage(MVgContext& aVgContext, VGint aDx, VGint aDy, CVgImageInfo& aSrcImageInfo, VGint aSx, VGint aSy, VGint aWidth,
			VGint aHeight, VGboolean aDither);
	void DrawImage(MVgContext& aVgContext);
	void SetPixels(MVgContext& aVgContext, VGint aDx, VGint aDy, VGint aSx, VGint aSy, VGint aWidth, VGint aHeight);
	void GetPixels(MVgContext& aVgContext, VGint aDx, VGint aDy, VGint aSx, VGint aSy, VGint aWidth, VGint aHeight);
	void ColorMatrix(MVgContext& aVgContext, CVgImageInfo& aSrcImageInfo, const VGfloat * aMatrix);
	void Convolve(MVgContext& aVgContext, CVgImageInfo& aSrcImageInfo, VGint aKernelWidth, VGint aKernelHeight,
			VGint aShiftX, VGint aShiftY, const VGshort * aKernel, VGfloat aScale, VGfloat aBias, VGTilingMode aTilingMode);
	void SeparableConvolve(MVgContext& aVgContext, CVgImageInfo& aSrcImageInfo, VGint aKernelWidth, VGint aKernelHeight,
			VGint aShiftX, VGint aShiftY, const VGshort * aKernelX, const VGshort * aKernelY, 
			VGfloat aScale, VGfloat aBias, VGTilingMode aTilingMode);
	void GaussianBlur(MVgContext& aVgContext, CVgImageInfo& aSrcImageInfo, VGfloat aStdDeviationX, VGfloat aStdDeviationY, VGTilingMode aTilingMode);
	void Lookup(MVgContext& aVgContext, CVgImageInfo& aSrcImageInfo, const VGubyte * aRedLUT, const VGubyte * aGreenLUT, const VGubyte * aBlueLUT,
			const VGubyte * aAlphaLUT, VGboolean aOutputLinear, VGboolean aOutputPremultiplied);
	void LookupSingle(MVgContext& aVgContext, CVgImageInfo& aSrcImageInfo, const VGuint * aLookupTable, VGImageChannel aSourceChannel,
			VGboolean aOutputLinear, VGboolean aOutputPremultiplied);

private:
	inline CVgImageInfo(VGImageFormat aFormat, VGint aWidth, VGint aHeight, CVgImageInfo* aParent, VGbitfield aAllowedQuality,
			EGLImageKHR aEglImage, TUint64 aSgImageId);
	inline ~CVgImageInfo();
	inline void IncChildCount();
	inline void DecChildCount();
	void HostVgGetImageSubData(MVgContext& aVgContext, void* aPixmap, size_t aPixmapSize, VGint aHostDataStride,
			VGImageFormat aDataFormat, VGint aX, VGint aY, VGint aWidth, VGint aHeight);
	void HostVgImageSubData(MVgContext& aVgContext, const void* aPixmap, size_t aPixmapSize, VGint aHostDataStride,
			VGImageFormat aDataFormat, VGint aX, VGint aY, VGint aWidth, VGint aHeight);


	/* **** desireable: expand CVgImageInfo to include and use for validating for various appropriate:
		(TBool iIsRenderTarget; - VgImage is a surface currently being rendered, blocks some operations)
		(TUint iUsedAsPaintPattern; - non-zero stops use as a render target)
		(TUint iUsedAsGlyph; - count of how many places the VgImage is being used as a font glyph)
	   */
private:
	VGImageFormat       iFormat; // not const because this is not currently initialised at creation for EglImages
	CVgImageInfo* const iParent; // immediate parent VgImage, NULL if not a child
	VGbitfield    const iAllowedQuality;
	// EglImage / SgImage info ...
	TBool         const iIsEglSibling;
	EGLImageKHR   const iEglImage;
	TUint64       const iSgImageId;      // Set or copied from parent for Egl Sibling - used to prompt Cmd Scheduler to sync pbuffer & vgimage
	// non-const state
	TInt          iChildCount;     // count of direct child images
	};


NONSHARABLE_CLASS(CVgFontInfo) : public CVgHandleBase
	{
public:
	static CVgFontInfo* New();
	virtual TBool DestroyObject(MVgContext& aVgContext);

	virtual VGint GetParameterVectorSize(MVgContext& aVgContext, VGint aParamType);

	void SetGlyphToPath(MVgContext& aVgContext, VGuint aGlyphIndex, CVgPathInfo* aPathInfo, VGboolean aIsHinted,
			const VGfloat aGlyphOrigin [2], const VGfloat aEscapement[2]);
	void SetGlyphToImage(MVgContext& aVgContext, VGuint aGlyphIndex, CVgImageInfo* aImageInfo, const VGfloat aGlyphOrigin [2],
			const VGfloat aEscapement[2]);
	void ClearGlyph(MVgContext& aVgContext, VGuint aGlyphIndex);
	void DrawGlyph(MVgContext& aVgContext, VGuint aGlyphIndex, VGbitfield aPaintModes, VGboolean aAllowAutoHinting);
	void DrawGlyphs(MVgContext& aVgContext, VGint aGlyphCount, const VGuint * aGlyphIndices, const VGfloat * aAdjustmentsX,
			const VGfloat * aAdjustmentsY, VGbitfield aPaintModes, VGboolean aAllowAutoHinting);

private:
	inline CVgFontInfo();
	inline ~CVgFontInfo();
	};


NONSHARABLE_CLASS(CVgPaintInfo) : public CVgHandleBase
	{
public:
	static CVgPaintInfo* New();
	virtual TBool DestroyObject(MVgContext& aVgContext);

	virtual VGint GetParameterVectorSize(MVgContext& aVgContext, VGint aParamType);
	virtual VGfloat GetParameterf(MVgContext& aVgContext, VGint aParamType);
	virtual VGint GetParameteri(MVgContext& aVgContext, VGint aParamType);
	virtual void GetParameterfv(MVgContext& aVgContext, VGint aParamType, VGint aCount, VGfloat * aValues);
	virtual void GetParameteriv(MVgContext& aVgContext, VGint aParamType, VGint aCount, VGint * aValues);

	virtual void SetParameterf(MVgContext& aVgContext, VGint aParamType, VGfloat aValue);
	virtual void SetParameteri(MVgContext& aVgContext, VGint aParamType, VGint aValue);
	virtual void SetParameterfv(MVgContext& aVgContext, VGint aParamType, VGint aCount, const VGfloat * aValues);
	virtual void SetParameteriv(MVgContext& aVgContext, VGint aParamType, VGint aCount, const VGint * aValues);

	static void ResetPaint(MVgContext& aVgContext);
	void SetPaint(MVgContext& aVgContext, VGbitfield aPaintModes);
	void SetColor(MVgContext& aVgContext, VGuint aRgba);
	VGuint GetColor(MVgContext& aVgContext);
	void PaintPattern(MVgContext& aVgContext, CVgImageInfo* aPatternInfo);

private:
	inline CVgPaintInfo();
	inline ~CVgPaintInfo();

private:
	// cached parameters
	VGPaintType           iPaintType;
	VGColorRampSpreadMode iColorRampSpreadMode;
	VGboolean             iColorRampPremultiplied;
	VGTilingMode          iPatternTilingMode;
	// VGfloat vector parameters are not currently cached in client
	};


NONSHARABLE_CLASS(CVgPathInfo) : public CVgHandleBase
	{
public:
	static CVgPathInfo* CVgPathInfo::New(VGPathDatatype aDatatype, VGfloat aScale, VGfloat aBias, VGbitfield aCapabilities);
	virtual TBool DestroyObject(MVgContext& aVgContext);

	void ClearPath(MVgContext& aVgContext, VGbitfield aCapabilities);
	void RemovePathCapabilities(MVgContext& aVgContext, VGbitfield aCapabilities);
	VGbitfield GetPathCapabilities(MVgContext& aVgContext);

	void AppendPath(MVgContext& aVgContext, CVgPathInfo& aSrcPathInfo);
	void AppendPathData(MVgContext& aVgContext, VGint aNumSegments, const VGubyte * aPathSegments, const void* aPathData);
	void ModifyPathCoords(MVgContext& aVgContext, VGint aStartIndex, VGint aNumSegments, const void* aPathData);
	void TransformPath(MVgContext& aVgContext, CVgPathInfo& aSrcPathInfo);
	VGboolean InterpolatePath(MVgContext& aVgContext, CVgPathInfo& aStartPathInfo, CVgPathInfo& aEndPathInfo, VGfloat aAmount);
	VGfloat PathLength(MVgContext& aVgContext, VGint aStartSegment, VGint aNumSegments);
	void PointAlongPath(MVgContext& aVgContext, VGint aStartSegment, VGint aNumSegments, VGfloat aDistance,
			VGfloat* aX, VGfloat* aY, VGfloat* aTangentX, VGfloat* aTangentY);
	void PathBounds(MVgContext& aVgContext, VGfloat* aMinX, VGfloat* aMinY, VGfloat* aWidth, VGfloat* aHeight);
	void PathTransformedBounds(MVgContext& aVgContext, VGfloat* aMinX, VGfloat* aMinY, VGfloat* aWidth, VGfloat* aHeight);
	void DrawPath(MVgContext& aVgContext, VGbitfield aPaintModes);
	void RenderToMask(MVgContext& aVgContext, VGbitfield aPaintModes, VGMaskOperation aOperation);

	inline VGPathDatatype PathDatatype() const;

	TBool CheckHasPathCapabilities(MVgContext& aVgContext, VGbitfield aCapabilities);

	virtual VGint GetParameterVectorSize(MVgContext& aVgContext, VGint aParamType);
	virtual VGfloat GetParameterf(MVgContext& aVgContext, VGint aParamType);
	virtual VGint GetParameteri(MVgContext& aVgContext, VGint aParamType);

private:
	inline CVgPathInfo(VGPathDatatype aPathDatatype, VGfloat aScale, VGfloat aBias, VGbitfield aCapabilities);
	inline ~CVgPathInfo();
	TBool CheckAppendPathData(MVgContext& aVgContext, VGint aNumSegments, const VGubyte* aPathSegments, const void* aPathData,
			VGint* aPathDataSize);
	TBool CheckPathDataAlignment(MVgContext& aVgContext, const void* aPathData);
	TBool CheckPathDataSize(MVgContext& aVgContext, const VGubyte* aPathSegments, VGint aNumSegments, VGint* aPathDataSize);
	VGint HostVgeGetPathCoordsSizeInBytes(MVgContext& aVgContext, VGint aStartIndex, VGint aNumSegments);

private:
	VGPathDatatype const iDatatype;
	VGfloat const        iScale;
	VGfloat const        iBias; 
	VGbitfield           iCapabilities;
	};


// Collection of static parameter checking functions - all "Chk" functions set the appropriate last VG Error on failure 
class TCheck
	{
public:
	inline static TBool Chk16bitPtr(MVgContext& aVgContext, const void* aDataPtr);
	inline static TBool Chk2x16bitPtr(MVgContext& aVgContext, const void* aDataPtr1, const void* aDataPtr2);
	inline static TBool Chk32bitPtr(MVgContext& aVgContext, const void* aDataPtr);
	inline static TBool Chk2x32bitPtr(MVgContext& aVgContext, const void* aDataPtr1, const void* aDataPtr2);
	inline static TBool Chk4x32bitPtr(MVgContext& aVgContext, const void* aDataPtr1, const void* aDataPtr2, const void* aDataPtr3, const void* aDataPtr4);
	inline static TBool Chk2xOptional32bitPtr(MVgContext& aVgContext, const void* aDataPtr1, const void* aDataPtr2);
	inline static TBool ChkVGMaskOperation(MVgContext& aVgContext, VGMaskOperation aOperation);
	inline static TBool ChkVGPaintMode(MVgContext& aVgContext, VGPaintMode aPaintMode);
	inline static TBool ChkVGPathDataType(MVgContext& aVgContext, VGPathDatatype aDatatype);
	inline static TBool ChkVGTilingMode(MVgContext& aVgContext, VGTilingMode aTilingMode);
	inline static TBool ChkVgImageFormat(MVgContext& aVgContext, VGImageFormat aFormat);
	inline static TBool ChkImageAlignment(MVgContext& aVgContext, VGImageFormat aImageFormat, const void* aData);
	inline static TBool ChkPositiveImageSize(MVgContext& aVgContext, VGint aWidth, VGint aHeight);
	inline static TBool ChkNewImageSize(MVgContext& aVgContext, VGint aWidth, VGint aHeight);
	inline static TBool ChkVGPaintModesCombination(MVgContext& aVgContext, VGbitfield aPaintModes);
	inline static TBool ChkVGPathFormat(MVgContext& aVgContext, VGint aPathFormat);
	static TBool ChkAreaIsWithinImage(MVgContext& aVgContext, CVgImageBase* aImageInfo, VGint aX, VGint aY, VGint aWidth, VGint aHeight);
	static TBool ChkParamCountAndValuesPtr(MVgContext& aVgContext, VGint aCount, const void* aValues);
	static VGint ImageFormatByteDepth(VGImageFormat aImageFormat);
	};


/*
 Class holds mutex for Open VG client side state on construction, & releases it on destruction.

 Placing methods here ensures the procedural requirement that the Mutex is held before these methods are called.
 */ 
class TCleanupVgLocks
	{
public:
	// having functions here forces the caller to hold the Open VG Mutex before they are called (when the lock object is constructed)
	TCleanupVgLocks(MVgContext& aVgContext);
	~TCleanupVgLocks();
	void WaitForMutex(RMutex& aMutex);
	void SignalMutex();

	inline TBool CheckVGFont(VGFont aFont, CVgFontInfo** aFontInfo);
	inline TBool CheckVGImage(VGImage aImage, CVgImageInfo** aImageInfo);
	inline TBool CheckOptionalVGImage(VGImage aImage, CVgImageInfo** aImageInfo);
	inline TBool Check2VGImages(VGImage aImage1, CVgImageInfo** aImageInfo1, VGImage aImage2, CVgImageInfo** aImageInfo2);
	inline TBool CheckVGMaskLayer(VGMaskLayer aMaskLayer, CVgMaskLayerInfo** aHandleInfo);
	inline TBool CheckVGPaint(VGPaint aPaint, CVgPaintInfo** aPaintInfo);
	inline TBool CheckOptionalVGPaint(VGPaint aPaint, CVgPaintInfo** aPaintInfo);
	// ToDo maybe add a version that checks Start Segment & Segment Count
	inline TBool CheckVGPath(VGPath aPath, CVgPathInfo** aPathInfo, VGbitfield aReqdCapabilities=0);
	inline TBool CheckOptionalVGPath(VGPath aPath, CVgPathInfo** aPathInfo);
	inline TBool CheckVGAnyHandle(VGHandle aHandle, CVgHandleBase** aHandleInfo);
	TBool CheckVGMaskOperationAndHandle(VGMaskOperation aOperation, VGHandle aMask, CVgImageBase** aImageInfo);
	inline TBool CheckKernelWidthAndHeight(VGint aKernelWidth, VGint aKernelHeight, VGParamType aLimitType);

	VGFont CreateFont(VGint aGlyphCapacityHint);
	VGImage ChildImage(CVgImageInfo& aParentInfo, VGint aX, VGint aY, VGint aWidth, VGint aHeight);
	VGImage CreateImage(VGImageFormat aFormat, VGint aWidth, VGint aHeight, VGbitfield aAllowedQuality);
	VGMaskLayer CreateMaskLayer(VGint aWidth, VGint aHeight);
	VGPaint CreatePaint();
	VGPaint GetPaint(VGPaintMode aPaintMode);
	VGPath CreatePath(VGint aPathFormat, VGPathDatatype aDatatype, VGfloat aScale, VGfloat aBias,
			VGint aSegmentCapacityHint, VGint aCoordCapacityHint, VGbitfield aCapabilities);
	VGImage CreateEGLImageTargetKHR(VGeglImageKHR aImage);

private:
	MVgContext& const iVgContext;
	RMutex&           iMutex;
	TBool             iIsHeld;
	};



// per VG client state
NONSHARABLE_CLASS(XOpenVgState) : public MEglManagementApi, public MVgApiForEgl
	{
	friend class TCleanupVgLocks;
public:
	XOpenVgState();
	~XOpenVgState();

	// functions using/maintaining Open Vg Handle Map
	TBool AddToHashMap(MVgContext& aVgContext, CVgHandleBase* aHandleInfo, VGHandle aHostHandle);
	void UnMapHandle(TUint32 aClientHandle);

	// MEglManagementApi - redirects via CVghwUtils to the EGL implementation
	virtual TBool EglImageOpenForVgImage(EGLImageKHR aImage, TSize& aSize, VGHandle& aVgHandle, TUint64& aSgImageId);
	virtual void EglImageClose(EGLImageKHR aImage);

	// MVgApiForEgl - exported via CvghwUtils to the Guest EGL implementation
	virtual ExtensionProcPointer guestGetVgProcAddress (const char *aProcName);

protected: // fns only visible to TVgLockHolder class
	inline RMutex& MutexWait();
	TBool CheckVGHandle(MVgContext& aVgContext, VGHandle aHandle, CVgHandleBase** aHandleInfo, TVgHandleType aMatchType);
	// functions using cached values from Host Open VG implementation
	TBool CheckKernelWidthAndHeight(MVgContext& aVgContext, VGint aKernelWidth, VGint aKernelHeight, VGParamType aLimitType);

private:
	RMutex                          iStateLock;

	// Map holds info about VG Handle based objects
	RMutex                          iMapLock;
	RHashMap<TUint, CVgHandleBase*> iHandleHashMap;
	MEglManagementApi*              iEglManagementApi;

	// 'constants' initialised from x86 VG implementation the first time they are required
	VGint iKVgMaxKernelSize;
	VGint iKVgMaxSeparableKernelSize;
	// ToDo: more values to cache: VG_MAX_IMAGE_WIDTH, VG_MAX_IMAGE_HEIGHT, VG_MAX_IMAGE_PIXELS

	// ToDo Record when VG fonts use glyphs based on SgImages, required for Ref counting
	};




// class of static methods to implement Open VG APIs
class TGuestOpenVg
	{
public:
	// VG APIs
	static VGPaint vgGetPaint(VGPaintMode aPaintMode);
	static VGPaint vgCreatePaint();
	static VGboolean vgInterpolatePath(VGPath aDstPath, VGPath aStartPath, VGPath aEndPath, VGfloat aAmount);
	static VGfloat vgPathLength(VGPath aPath, VGint aStartSegment, VGint aNumSegments);
	static VGbitfield vgGetPathCapabilities(VGPath aPath);
	static VGPath vgCreatePath(VGint aPathFormat, VGPathDatatype aDatatype, VGfloat aScale, VGfloat aBias,
		VGint aSegmentCapacityHint, VGint aCoordCapacityHint, VGbitfield aCapabilities);
	static VGfloat vgGetf(VGParamType aType);
	static VGint vgGeti(VGParamType aType);
	static VGfloat vgGetParameterf(VGHandle aObject,  VGint aParamType);
	static VGint vgGetParameteri(VGHandle aObject,  VGint aParamType);
	static VGint vgGetParameterVectorSize(VGHandle aObject, VGint aParamType);
	static VGMaskLayer vgCreateMaskLayer(VGint aWidth, VGint aHeight);
	static VGuint vgGetColor(VGPaint aPaint);
	static VGImage vgCreateImage(VGImageFormat aFormat, VGint aWidth, VGint aHeight, VGbitfield aAllowedQuality);
	static VGImage vgChildImage(VGImage aParent, VGint aX, VGint aY, VGint aWidth, VGint aHeight);
	static VGImage vgGetParent(VGImage aImage);
	static VGImage vgCreateEGLImageTargetKHR(VGeglImageKHR aImage);
	static VGFont vgCreateFont(VGint aGlyphCapacityHint);
	static VGHardwareQueryResult vgHardwareQuery(VGHardwareQueryType key, VGint setting);
	static void vgGetParameterfv(VGHandle aObject, VGint aParamType, VGint aCount, VGfloat * aValues);
	static void vgGetParameteriv(VGHandle aObject, VGint aParamType, VGint aCount, VGint * aValues);
	static VGint vgGetVectorSize(VGParamType type);
	static void vgGetfv(VGParamType aType, VGint aCount, const VGfloat * aValues);
	static void vgGetiv(VGParamType aType, VGint aCount, const VGint * aValues);
	static void vgGetMatrix(VGfloat* aM);
	static void vgGetImageSubData(VGImage aImage, void* aData, VGint aDataStride, VGImageFormat aDataFormat,
		VGint aX, VGint aY, VGint aWidth, VGint aHeight);
	static void vgReadPixels(void* aData, VGint aDataStride, VGImageFormat aDataFormat, VGint aSx, VGint aSy,
		VGint aWidth, VGint aHeight);
	static void vgPathBounds(VGPath aPath, VGfloat* aMinX, VGfloat* aMinY, VGfloat* aWidth, VGfloat* aHeight);
	static void vgPathTransformedBounds(VGPath aPath, VGfloat* aMinX, VGfloat* aMinY, VGfloat* aWidth, VGfloat* aHeight);
	static void vgSetf(VGParamType aType, VGfloat aValue);
	static void vgSeti(VGParamType aType, VGint aVvalue);
	static void vgSetfv(VGParamType aType, VGint aCount, const VGfloat * aValues);
	static void vgSetiv(VGParamType aType, VGint aCount, const VGint * aValues);
	static void vgSetParameterf(VGHandle aObject, VGint aParamType, VGfloat aValue);
	static void vgSetParameteri(VGHandle aObject, VGint aParamType, VGint aValue);
	static void vgSetParameterfv(VGHandle aObject, VGint aParamType, VGint aCount, const VGfloat * aValues);
	static void vgSetParameteriv(VGHandle aObject, VGint aParamType, VGint aCount, const VGint * aValues);
	static void vgLoadIdentity();
	static void vgLoadMatrix(const VGfloat* aM);
	static void vgMultMatrix(const VGfloat* aM);
	static void vgTranslate(VGfloat aTx, VGfloat aTy);
	static void vgScale(VGfloat aSx, VGfloat aSy);
	static void vgShear(VGfloat aShx, VGfloat aShy);
	static void vgRotate(VGfloat aAngle);
	static void vgMask(VGHandle aMask, VGMaskOperation aOperation, VGint aX, VGint aY, VGint aWidth, VGint aHeight);
	static void vgRenderToMask(VGPath aPath, VGbitfield aPaintModes, VGMaskOperation aOperation);
	static void vgDestroyMaskLayer(VGMaskLayer maskLayer);
	static void vgFillMaskLayer(VGMaskLayer aMaskLayer, VGint aX, VGint aY, VGint aWidth, VGint aHeight, VGfloat aValue);
	static void vgCopyMask(VGMaskLayer aMaskLayer, VGint aSx, VGint aSy, VGint aDx, VGint aDy, VGint aWidth, VGint aHeight);
	static void vgClear(VGint aX, VGint aY, VGint aWidth, VGint aHeight);
	static void vgClearPath(VGPath aPath, VGbitfield aCapabilities);
	static void vgDestroyPath(VGPath aPath);
	static void vgRemovePathCapabilities(VGPath aPath, VGbitfield aCapabilities);
	static void vgAppendPath(VGPath aDstPath, VGPath aSrcPath);
	static void vgAppendPathData(VGPath aDstPath, VGint aNumSegments, const VGubyte* aPathSegments, const void* aPathData);
	static void vgModifyPathCoords(VGPath aDstPath, VGint aStartIndex, VGint aNumSegments, const void* aPathData);
	static void vgTransformPath(VGPath aDstPath, VGPath aSrcPath);
	static void vgPointAlongPath(VGPath aPath, VGint aStartSegment, VGint aNumSegments, VGfloat aDistance,
		VGfloat* aX, VGfloat* aY, VGfloat* aTangentX, VGfloat* aTangentY);
	static void vgDrawPath(VGPath aPath, VGbitfield aPaintModes);
	static void vgDestroyPaint(VGPaint aPaint);
	static void vgSetPaint(VGPaint aPaint, VGbitfield aPaintModes);
	static void vgSetColor(VGPaint aPaint, VGuint aRgba);
	static void vgPaintPattern(VGPaint aPaint, VGImage aPattern);
	static void vgDestroyImage(VGImage aImage);
	static void vgClearImage(VGImage aImage, VGint aX, VGint aY, VGint aWidth, VGint aHeight);
	static void vgImageSubData(VGImage aImage, const void* aData, VGint aDataStride, VGImageFormat aDataFormat,
		VGint aX, VGint aY, VGint aWidth, VGint aHeight);
	static void vgCopyImage(VGImage aDst, VGint aDx, VGint aDy, VGImage aSrc, VGint aSx, VGint aSy, VGint aWidth, VGint aHeight,
		VGboolean aDither);
	static void vgDrawImage(VGImage aImage);
	static void vgSetPixels(VGint aDx, VGint aDy, VGImage aSrc, VGint aSx, VGint aSy, VGint aWidth, VGint aHeight);
	static void vgWritePixels(const void* data, VGint aDataStride, VGImageFormat aDataFormat, VGint aDx, VGint aDy,
		VGint aWidth, VGint aHeight);
	static void vgGetPixels(VGImage aDst, VGint aDx, VGint aDy, VGint aSx, VGint aSy, VGint aWidth, VGint aHeight);
	static void vgCopyPixels(VGint aDx, VGint aDy, VGint aSx, VGint aSy, VGint aWidth, VGint aHeight);
	static void vgDestroyFont(VGFont aFont);
	static void  vgSetGlyphToPath(VGFont aFont, VGuint aGlyphIndex, VGPath aPath, VGboolean aIsHinted, const VGfloat aGlyphOrigin [2],
		const VGfloat aEscapement[2]);
	static void  vgSetGlyphToImage(VGFont aFont, VGuint aGlyphIndex, VGImage aImage, const VGfloat aGlyphOrigin [2],
		const VGfloat aEscapement[2]);
	static void vgClearGlyph(VGFont aFont, VGuint aGlyphIndex);
	static void vgDrawGlyph(VGFont aFont, VGuint aGlyphIndex, VGbitfield aPaintModes, VGboolean aAllowAutoHinting);
	static void vgDrawGlyphs(VGFont aFont, VGint aGlyphCount, const VGuint* aGlyphIndices, const VGfloat* aAdjustmentsX,
		const VGfloat* aAdjustmentsY, VGbitfield aPaintModes, VGboolean aAllowAutoHinting);
	static void vgColorMatrix(VGImage aDst, VGImage aSrc, const VGfloat* aMatrix);
	static void vgConvolve(VGImage aDst, VGImage aSrc, VGint aKernelWidth, VGint aKernelHeight, VGint aShiftX, VGint aShiftY,
		const VGshort* aKernel, VGfloat aScale, VGfloat aBias, VGTilingMode aTilingMode);
	static void vgSeparableConvolve(VGImage aDst, VGImage aSrc, VGint aKernelWidth, VGint aKernelHeight, VGint aShiftX, VGint aShiftY,
		const VGshort* aKernelX, const VGshort* aKernelY, VGfloat aScale, VGfloat aBias, VGTilingMode aTilingMode);
	static void vgGaussianBlur(VGImage aDst, VGImage aSrc, VGfloat aStdDeviationX, VGfloat aStdDeviationY, VGTilingMode aTilingMode);
	static void vgLookup(VGImage aDst, VGImage aSrc, const VGubyte* aRedLUT, const VGubyte* aGreenLUT, const VGubyte* aBlueLUT,
		const VGubyte* aAlphaLUT, VGboolean aOutputLinear, VGboolean aOutputPremultiplied);
	static void vgLookupSingle(VGImage aDst, VGImage aSrc, const VGuint* aLookupTable, VGImageChannel aSourceChannel,
		VGboolean aOutputLinear, VGboolean aOutputPremultiplied);

private:
	// fns that directly talk to Host Open VG (no parameter checking)
	static void HostVgReadPixels(MVgContext& aVgContext, void* aPixmap, size_t aPixmapSize, VGint aHostDataStride,
			VGImageFormat aDataFormat, VGint aSx, VGint aSy, VGint aWidth, VGint aHeight);
	static void HostVgWritePixels(MVgContext& aVgContext, const void* aPixmap, size_t aPixmapSize, VGint aHostDataStride,
			VGImageFormat aDataFormat, VGint aDx, VGint aDy, VGint aWidth, VGint aHeight);

	static VGint HostGetVectorSize(MVgContext& aVgContext, VGParamType aType);

public: // ToDo find a more elegant way of calling this from XOpenVgState
	static VGint HostGeti(MVgContext& aVgContext, VGParamType type);
private:
	static inline VGfloat HostGetf(MVgContext& aVgContext, VGParamType type);
	};


// C api extensions
#ifdef __cplusplus
extern "C" {
#endif

VGImage vgCreateEGLImageTargetKHR(VGeglImageKHR image);

#ifdef __cplusplus
}
#endif


#include "openvg.inl"

#endif // VGSTATE_H