Merge changes to enable building host libraries using GCC with work to get basic EGL going.
// 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"
#define _DEBUG // FAISALMEMON temporary
// 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