--- a/guestrendering/guestopenvg/src/vgpath.cpp Thu Sep 16 12:43:44 2010 +0100
+++ b/guestrendering/guestopenvg/src/vgpath.cpp Mon Sep 20 14:29:05 2010 +0100
@@ -1,467 +1,467 @@
-// 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:
-// Client-side state information for OpenVG handle based objects
-
-#include "vgstate.h"
-#include "remotefunctioncall.h"
-#include "openvgrfc.h"
-
-
-/////////////////////////////////////////////////////////////////////////////////////////////
-// CVgPathInfo
-/////////////////////////////////////////////////////////////////////////////////////////////
-
-CVgPathInfo* CVgPathInfo::New(VGPathDatatype aDatatype, VGfloat aScale, VGfloat aBias, VGbitfield aCapabilities)
- {
- RHeap* clientHeap = CVghwUtils::SwitchToVghwHeap();
- CVgPathInfo* self = new CVgPathInfo(aDatatype, aScale, aBias, aCapabilities);
- CVghwUtils::SwitchFromVghwHeap(clientHeap);
- return self;
- }
-
-
-void CVgPathInfo::ClearPath(MVgContext& aVgContext, VGbitfield aCapabilities)
- {
- iCapabilities = aCapabilities & VG_PATH_CAPABILITY_ALL;
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgClearPath, RemoteFunctionCallData::EOpRequest);
- vgApiData.AppendParam(HostHandle());
- vgApiData.AppendParam(aCapabilities);
- aVgContext.ExecuteVgCommand(vgApiData);
- }
-
-
-void CVgPathInfo::RemovePathCapabilities(MVgContext& aVgContext, VGbitfield aCapabilities)
- {
- if (aCapabilities & VG_PATH_CAPABILITY_ALL)
- {
- iCapabilities = (iCapabilities & ~aCapabilities);
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgRemovePathCapabilities, RemoteFunctionCallData::EOpRequest);
- vgApiData.AppendParam(HostHandle());
- vgApiData.AppendParam(aCapabilities & VG_PATH_CAPABILITY_ALL);
- aVgContext.ExecuteVgCommand(vgApiData);
- }
- }
-
-
-VGbitfield CVgPathInfo::GetPathCapabilities(MVgContext& aVgContext)
- {
- // value is tracked in Client side - but Debug builds verify state with the Host Open VG
-#ifdef _DEBUG
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgGetPathCapabilities);
- vgApiData.AppendParam(HostHandle());
- VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
- aVgContext.ExecuteVgCommand(vgApiData);
- VGbitfield hostCapabilities = static_cast<VGbitfield>(vgApiData.ReturnValue());
- VGPANIC_ASSERT_DEBUG(hostCapabilities == iCapabilities, EVgPanicTemp);
-#endif
- return iCapabilities;
- }
-
-
-CVgPathInfo::~CVgPathInfo()
- {}
-
-CVgPathInfo::CVgPathInfo(VGPathDatatype aDatatype, VGfloat aScale, VGfloat aBias, VGbitfield aCapabilities) :
- CVgHandleBase(EVgHandleForPath), iDatatype(aDatatype), iScale(aScale), iBias(aBias), iCapabilities(aCapabilities)
- {}
-
-
-VGPathDatatype CVgPathInfo::PathDatatype() const
- {
- return iDatatype;
- }
-
-
-TBool CVgPathInfo::CheckHasPathCapabilities(MVgContext& aVgContext, VGbitfield aCapabilities)
- {
- if ( aCapabilities == (aCapabilities & iCapabilities) )
- {
- return ETrue;
- }
-
- OPENVG_TRACE("CVgPathInfo::CheckHasPathCapabilities (iCapabilities=0x%x, aCapabilities=0x%x) setting VG_PATH_CAPABILITY_ERROR",
- iCapabilities, aCapabilities);
- aVgContext.SetVgError(VG_PATH_CAPABILITY_ERROR);
- return EFalse;
- }
-
-
-TBool CVgPathInfo::CheckPathDataAlignment(MVgContext& aVgContext, const void* aPathData)
- {
- TBool result = EFalse;
- if (aPathData != NULL)
- {
- switch (iDatatype)
- {
- case VG_PATH_DATATYPE_S_8:
- result = ETrue;
- break;
- case VG_PATH_DATATYPE_S_16:
- result = !( 1ul & (unsigned)aPathData );
- break;
- case VG_PATH_DATATYPE_S_32:
- case VG_PATH_DATATYPE_F:
- result = !( 3ul & (unsigned)aPathData );
- break;
- }
- }
- if (!result)
- {
- OPENVG_TRACE("CVgPathInfo::CheckPathDataAlignment (iDatatype=%d, aPathData=0x%x) setting VG_ILLEGAL_ARGUMENT_ERROR",
- iDatatype, aPathData);
- aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
- }
- return result;
- }
-
-
-//
-TBool CVgPathInfo::CheckPathDataSize(MVgContext& aVgContext, const VGubyte* aPathSegments, VGint aNumSegments, VGint* aPathDataSize)
- {
- TBool checkOkay = EFalse;
- VGint pathDataSize = 0;
-
- if ( (aNumSegments > 0) && (aPathSegments != NULL) )
- {
- checkOkay = ETrue;
-
-#define SEGMENT_COMMAND(command) ((command) >> 1)
- // Number of coordinates for each command
- static const VGint KNumCoords[] = {0,2,2,1,1,4,6,2,4,5,5,5,5};
-
- for (VGint segIdx = 0; segIdx < aNumSegments; )
- {
- VGubyte segmentType = aPathSegments[segIdx++];
- if (segmentType > 25) // VGPathSegment max value 12 << 1 or'd with 0|1
- {
- OPENVG_TRACE(" CheckPathDataSize - unknown segmentType-0x%x", segmentType);
- checkOkay = EFalse;
- break;
- }
- VGint command = SEGMENT_COMMAND(segmentType);
- pathDataSize += KNumCoords[command];
- OPENVG_TRACE(" CheckPathDataSize segmentType=0x%x: command=0x%x, Total Coord Count=%d", segmentType, command, pathDataSize);
- }
- }
-
- if ( !checkOkay )
- {
- aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
- OPENVG_TRACE(" CheckPathDataSize - Illegal Argument Error, aPathSegments=0x%x, aNumSegments=%d", aPathSegments, aNumSegments);
- }
- else
- {
- // Number of bytes for each VGPathDatatype
- static const VGint KNumBytes[] = {1,2,4,4};
- // convert coord count to bytes
- pathDataSize *= KNumBytes[iDatatype];
-
- *aPathDataSize = pathDataSize;
- OPENVG_TRACE(" CheckPathDataSize - success, pathDataSize=%d bytes", pathDataSize);
- }
- return checkOkay;
- }
-
-
-// Check path parameters for vgAppendPathData
-TBool CVgPathInfo::CheckAppendPathData(MVgContext& aVgContext, VGint aNumSegments, const VGubyte* aPathSegments, const void* aPathData,
- VGint* aPathDataSize)
- {
- return CheckPathDataAlignment(aVgContext, aPathData) && CheckPathDataSize(aVgContext, aPathSegments, aNumSegments, aPathDataSize);
- }
-
-
-TBool CVgPathInfo::DestroyObject(MVgContext& aVgContext)
- {
- VGPANIC_ASSERT_DEBUG(iIsDestroyed, EVgPanicTemp);
- OPENVG_TRACE(" CVgPathInfo::DestroyObject HostHandle=0x%x", iHostHandle);
-
- if (iHostHandle)
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgDestroyPath, RemoteFunctionCallData::EOpRequest);
- vgApiData.AppendParam(iHostHandle);
- aVgContext.ExecuteVgCommand(vgApiData);
- }
-
- return ETrue;
- }
-
-
-VGint CVgPathInfo::GetParameterVectorSize(MVgContext& aVgContext, VGint aParamType)
- {
- switch (aParamType)
- {
- case VG_PATH_FORMAT:
- case VG_PATH_DATATYPE:
- case VG_PATH_SCALE:
- case VG_PATH_BIAS:
- case VG_PATH_NUM_SEGMENTS:
- case VG_PATH_NUM_COORDS:
- return 1;
- }
-
- // invalid ParamType
- aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
- return 0;
- }
-
-
-VGfloat CVgPathInfo::GetParameterf(MVgContext& aVgContext, VGint aParamType)
- {
- switch (aParamType)
- {
- case VG_PATH_DATATYPE:
- return (VGfloat) iDatatype;
-
- case VG_PATH_SCALE:
- return iScale;
-
- case VG_PATH_BIAS:
- return iBias;
-
- case VG_PATH_FORMAT:
- case VG_PATH_NUM_SEGMENTS:
- case VG_PATH_NUM_COORDS:
- return HostVgGetParameterf(aVgContext, aParamType);
- }
-
- // invalid ParamType
- aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
- return 0;
- }
-
-
-VGint CVgPathInfo::GetParameteri(MVgContext& aVgContext, VGint aParamType)
- {
- switch (aParamType)
- {
- case VG_PATH_DATATYPE:
- return iDatatype;
-
- case VG_PATH_SCALE:
- return (VGint) iScale;
-
- case VG_PATH_BIAS:
- return (VGint) iBias;
-
- case VG_PATH_FORMAT:
- case VG_PATH_NUM_SEGMENTS:
- case VG_PATH_NUM_COORDS:
- return HostVgGetParameteri(aVgContext, aParamType);
- }
-
- // invalid ParamType
- aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
- return 0;
- }
-
-
-void CVgPathInfo::AppendPath(MVgContext& aVgContext, CVgPathInfo& aSrcPathInfo)
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgAppendPath, RemoteFunctionCallData::EOpRequest);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendParam(aSrcPathInfo.HostHandle());
- aVgContext.ExecuteVgCommand(vgApiData);
- }
-
-
-void CVgPathInfo::AppendPathData(MVgContext& aVgContext, VGint aNumSegments, const VGubyte * aPathSegments, const void* aPathData)
- {
- VGint pathDataSize = 0;
- if ( CheckAppendPathData(aVgContext, aNumSegments, aPathSegments, aPathData, &pathDataSize) )
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgAppendPathData, RemoteFunctionCallData::EOpRequest);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendParam(aNumSegments);
- vgApiData.AppendVector(aPathSegments, aNumSegments);
- vgApiData.AppendVector(aPathData, pathDataSize);
- aVgContext.ExecuteVgCommand(vgApiData);
- }
- }
-
-
-//Private extension to Open VG API to get the path length
-VGint CVgPathInfo::HostVgeGetPathCoordsSizeInBytes(MVgContext& aVgContext, VGint aStartIndex, VGint aNumSegments)
- {
- RemoteFunctionCallData rfcdata; OpenVgRFC vgApiData(rfcdata);
- vgApiData.Init(OpenVgRFC::EvgePathCoordsSizeInBytes);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendParam(aStartIndex);
- vgApiData.AppendParam(aNumSegments);
- VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
- aVgContext.ExecuteVgCommand(vgApiData);
- return static_cast<VGint>(vgApiData.ReturnValue());
- }
-
-
-void CVgPathInfo::ModifyPathCoords(MVgContext& aVgContext, VGint aStartIndex, VGint aNumSegments, const void* aPathData)
- {
- if (CheckPathDataAlignment(aVgContext, aPathData))
- {
- // The host OpenVG implementation returns -1 if vgePathCoordsSizeInBytes is not supported
- // It does not seem simple to reliably implement vgePathCoordsSizeInBytes in the Symbian client
- VGint dataSize = HostVgeGetPathCoordsSizeInBytes(aVgContext, aStartIndex, aNumSegments);
- OPENVG_TRACE("TGuestOpenVg::vgModifyPathCoords - dataSize=%d", dataSize);
- if (dataSize <= 0)
- {
- aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
- }
- else
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgModifyPathCoords, RemoteFunctionCallData::EOpRequest);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendParam(aStartIndex);
- vgApiData.AppendParam(aNumSegments);
- vgApiData.AppendVector(aPathData, dataSize);
- aVgContext.ExecuteVgCommand(vgApiData);
- }
- }
- }
-
-
-void CVgPathInfo::TransformPath(MVgContext& aVgContext, CVgPathInfo& aSrcPathInfo)
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgTransformPath, RemoteFunctionCallData::EOpRequest);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendParam(aSrcPathInfo.HostHandle());
- aVgContext.ExecuteVgCommand(vgApiData);
- }
-
-
-VGboolean CVgPathInfo::InterpolatePath(MVgContext& aVgContext, CVgPathInfo& aStartPathInfo, CVgPathInfo& aEndPathInfo, VGfloat aAmount)
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgInterpolatePath);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendParam(aStartPathInfo.HostHandle());
- vgApiData.AppendParam(aEndPathInfo.HostHandle());
- vgApiData.AppendParam(aAmount);
- VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
- aVgContext.ExecuteVgCommand(vgApiData);
- return static_cast<VGboolean>(vgApiData.ReturnValue());
- }
-
-
-VGfloat CVgPathInfo::PathLength(MVgContext& aVgContext, VGint aStartSegment, VGint aNumSegments)
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgPathLength);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendParam(aStartSegment);
- vgApiData.AppendParam(aNumSegments);
- VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
- aVgContext.ExecuteVgCommand(vgApiData);
- return static_cast<VGfloat>(vgApiData.ReturnValue());
- }
-
-
-void CVgPathInfo::PointAlongPath(MVgContext& aVgContext, VGint aStartSegment, VGint aNumSegments, VGfloat aDistance,
- VGfloat* aX, VGfloat* aY, VGfloat* aTangentX, VGfloat* aTangentY)
- {
- TBool getPoint = (aX && aY);
- TBool getTangent = (aTangentX && aTangentY);
-
- if ( getPoint && !TCheck::Chk2x32bitPtr(aVgContext, aX, aY) )
- {
- return;
- }
- if ( getTangent && !TCheck::Chk2x32bitPtr(aVgContext, aTangentX, aTangentY) )
- {
- return;
- }
- if (getPoint || getTangent)
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgPointAlongPath);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendParam(aStartSegment);
- vgApiData.AppendParam(aNumSegments);
- vgApiData.AppendParam(aDistance);
- vgApiData.AppendVector(aX, getPoint ? 1 : 0, RemoteFunctionCallData::EOut);
- vgApiData.AppendVector(aY, getPoint ? 1 : 0, RemoteFunctionCallData::EOut);
- vgApiData.AppendVector(aTangentX, getTangent ? 1 : 0, RemoteFunctionCallData::EOut);
- vgApiData.AppendVector(aTangentY, getTangent ? 1 : 0, RemoteFunctionCallData::EOut);
- aVgContext.ExecuteVgCommand(vgApiData);
- }
- }
-
-
-void CVgPathInfo::PathBounds(MVgContext& aVgContext, VGfloat* aMinX, VGfloat* aMinY, VGfloat* aWidth, VGfloat* aHeight)
- {
- if (TCheck::Chk4x32bitPtr(aVgContext, aMinX, aMinY, aWidth, aHeight) )
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgPathBounds);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendVector(aMinX, 1, RemoteFunctionCallData::EOut);
- vgApiData.AppendVector(aMinY, 1, RemoteFunctionCallData::EOut);
- vgApiData.AppendVector(aWidth, 1, RemoteFunctionCallData::EOut);
- vgApiData.AppendVector(aHeight, 1, RemoteFunctionCallData::EOut);
- aVgContext.ExecuteVgCommand(vgApiData);
- }
- }
-
-
-void CVgPathInfo::PathTransformedBounds(MVgContext& aVgContext, VGfloat* aMinX, VGfloat* aMinY, VGfloat* aWidth, VGfloat* aHeight)
- {
- if (TCheck::Chk4x32bitPtr(aVgContext, aMinX, aMinY, aWidth, aHeight) )
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgPathTransformedBounds);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendVector(aMinX, 1, RemoteFunctionCallData::EOut);
- vgApiData.AppendVector(aMinY, 1, RemoteFunctionCallData::EOut);
- vgApiData.AppendVector(aWidth, 1, RemoteFunctionCallData::EOut);
- vgApiData.AppendVector(aHeight, 1, RemoteFunctionCallData::EOut);
- aVgContext.ExecuteVgCommand(vgApiData);
- }
- }
-
-
-void CVgPathInfo::DrawPath(MVgContext& aVgContext, VGbitfield aPaintModes)
- {
- if ( TCheck::ChkVGPaintModesCombination(aVgContext, aPaintModes) )
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgDrawPath, RemoteFunctionCallData::EOpRequest);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendParam(aPaintModes);
- aVgContext.ExecuteVgCommand(vgApiData);
- }
- }
-
-
-void CVgPathInfo::RenderToMask(MVgContext& aVgContext, VGbitfield aPaintModes, VGMaskOperation aOperation)
- {
- if ( TCheck::ChkVGPaintModesCombination(aVgContext, aPaintModes) && TCheck::ChkVGMaskOperation(aVgContext, aOperation) )
- {
- RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
- vgApiData.Init(OpenVgRFC::EvgRenderToMask, RemoteFunctionCallData::EOpRequest);
- vgApiData.AppendParam(iHostHandle);
- vgApiData.AppendParam(aPaintModes);
- vgApiData.AppendParam(aOperation);
- aVgContext.ExecuteVgCommand(vgApiData);
- }
- }
-
-
-// end of file vgpath.cpp
+// 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:
+// Client-side state information for OpenVG handle based objects
+
+#include "vgstate.h"
+#include "remotefunctioncall.h"
+#include "openvgrfc.h"
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+// CVgPathInfo
+/////////////////////////////////////////////////////////////////////////////////////////////
+
+CVgPathInfo* CVgPathInfo::New(VGPathDatatype aDatatype, VGfloat aScale, VGfloat aBias, VGbitfield aCapabilities)
+ {
+ RHeap* clientHeap = CVghwUtils::SwitchToVghwHeap();
+ CVgPathInfo* self = new CVgPathInfo(aDatatype, aScale, aBias, aCapabilities);
+ CVghwUtils::SwitchFromVghwHeap(clientHeap);
+ return self;
+ }
+
+
+void CVgPathInfo::ClearPath(MVgContext& aVgContext, VGbitfield aCapabilities)
+ {
+ iCapabilities = aCapabilities & VG_PATH_CAPABILITY_ALL;
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgClearPath, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(HostHandle());
+ vgApiData.AppendParam(aCapabilities);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+
+
+void CVgPathInfo::RemovePathCapabilities(MVgContext& aVgContext, VGbitfield aCapabilities)
+ {
+ if (aCapabilities & VG_PATH_CAPABILITY_ALL)
+ {
+ iCapabilities = (iCapabilities & ~aCapabilities);
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgRemovePathCapabilities, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(HostHandle());
+ vgApiData.AppendParam(aCapabilities & VG_PATH_CAPABILITY_ALL);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+ }
+
+
+VGbitfield CVgPathInfo::GetPathCapabilities(MVgContext& aVgContext)
+ {
+ // value is tracked in Client side - but Debug builds verify state with the Host Open VG
+#ifdef _DEBUG
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgGetPathCapabilities);
+ vgApiData.AppendParam(HostHandle());
+ VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ VGbitfield hostCapabilities = static_cast<VGbitfield>(vgApiData.ReturnValue());
+ VGPANIC_ASSERT_DEBUG(hostCapabilities == iCapabilities, EVgPanicTemp);
+#endif
+ return iCapabilities;
+ }
+
+
+CVgPathInfo::~CVgPathInfo()
+ {}
+
+CVgPathInfo::CVgPathInfo(VGPathDatatype aDatatype, VGfloat aScale, VGfloat aBias, VGbitfield aCapabilities) :
+ CVgHandleBase(EVgHandleForPath), iDatatype(aDatatype), iScale(aScale), iBias(aBias), iCapabilities(aCapabilities)
+ {}
+
+
+VGPathDatatype CVgPathInfo::PathDatatype() const
+ {
+ return iDatatype;
+ }
+
+
+TBool CVgPathInfo::CheckHasPathCapabilities(MVgContext& aVgContext, VGbitfield aCapabilities)
+ {
+ if ( aCapabilities == (aCapabilities & iCapabilities) )
+ {
+ return ETrue;
+ }
+
+ OPENVG_TRACE("CVgPathInfo::CheckHasPathCapabilities (iCapabilities=0x%x, aCapabilities=0x%x) setting VG_PATH_CAPABILITY_ERROR",
+ iCapabilities, aCapabilities);
+ aVgContext.SetVgError(VG_PATH_CAPABILITY_ERROR);
+ return EFalse;
+ }
+
+
+TBool CVgPathInfo::CheckPathDataAlignment(MVgContext& aVgContext, const void* aPathData)
+ {
+ TBool result = EFalse;
+ if (aPathData != NULL)
+ {
+ switch (iDatatype)
+ {
+ case VG_PATH_DATATYPE_S_8:
+ result = ETrue;
+ break;
+ case VG_PATH_DATATYPE_S_16:
+ result = !( 1ul & (unsigned)aPathData );
+ break;
+ case VG_PATH_DATATYPE_S_32:
+ case VG_PATH_DATATYPE_F:
+ result = !( 3ul & (unsigned)aPathData );
+ break;
+ }
+ }
+ if (!result)
+ {
+ OPENVG_TRACE("CVgPathInfo::CheckPathDataAlignment (iDatatype=%d, aPathData=0x%x) setting VG_ILLEGAL_ARGUMENT_ERROR",
+ iDatatype, aPathData);
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ }
+ return result;
+ }
+
+
+//
+TBool CVgPathInfo::CheckPathDataSize(MVgContext& aVgContext, const VGubyte* aPathSegments, VGint aNumSegments, VGint* aPathDataSize)
+ {
+ TBool checkOkay = EFalse;
+ VGint pathDataSize = 0;
+
+ if ( (aNumSegments > 0) && (aPathSegments != NULL) )
+ {
+ checkOkay = ETrue;
+
+#define SEGMENT_COMMAND(command) ((command) >> 1)
+ // Number of coordinates for each command
+ static const VGint KNumCoords[] = {0,2,2,1,1,4,6,2,4,5,5,5,5};
+
+ for (VGint segIdx = 0; segIdx < aNumSegments; )
+ {
+ VGubyte segmentType = aPathSegments[segIdx++];
+ if (segmentType > 25) // VGPathSegment max value 12 << 1 or'd with 0|1
+ {
+ OPENVG_TRACE(" CheckPathDataSize - unknown segmentType-0x%x", segmentType);
+ checkOkay = EFalse;
+ break;
+ }
+ VGint command = SEGMENT_COMMAND(segmentType);
+ pathDataSize += KNumCoords[command];
+ OPENVG_TRACE(" CheckPathDataSize segmentType=0x%x: command=0x%x, Total Coord Count=%d", segmentType, command, pathDataSize);
+ }
+ }
+
+ if ( !checkOkay )
+ {
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ OPENVG_TRACE(" CheckPathDataSize - Illegal Argument Error, aPathSegments=0x%x, aNumSegments=%d", aPathSegments, aNumSegments);
+ }
+ else
+ {
+ // Number of bytes for each VGPathDatatype
+ static const VGint KNumBytes[] = {1,2,4,4};
+ // convert coord count to bytes
+ pathDataSize *= KNumBytes[iDatatype];
+
+ *aPathDataSize = pathDataSize;
+ OPENVG_TRACE(" CheckPathDataSize - success, pathDataSize=%d bytes", pathDataSize);
+ }
+ return checkOkay;
+ }
+
+
+// Check path parameters for vgAppendPathData
+TBool CVgPathInfo::CheckAppendPathData(MVgContext& aVgContext, VGint aNumSegments, const VGubyte* aPathSegments, const void* aPathData,
+ VGint* aPathDataSize)
+ {
+ return CheckPathDataAlignment(aVgContext, aPathData) && CheckPathDataSize(aVgContext, aPathSegments, aNumSegments, aPathDataSize);
+ }
+
+
+TBool CVgPathInfo::DestroyObject(MVgContext& aVgContext)
+ {
+ VGPANIC_ASSERT_DEBUG(iIsDestroyed, EVgPanicTemp);
+ OPENVG_TRACE(" CVgPathInfo::DestroyObject HostHandle=0x%x", iHostHandle);
+
+ if (iHostHandle)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgDestroyPath, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(iHostHandle);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+
+ return ETrue;
+ }
+
+
+VGint CVgPathInfo::GetParameterVectorSize(MVgContext& aVgContext, VGint aParamType)
+ {
+ switch (aParamType)
+ {
+ case VG_PATH_FORMAT:
+ case VG_PATH_DATATYPE:
+ case VG_PATH_SCALE:
+ case VG_PATH_BIAS:
+ case VG_PATH_NUM_SEGMENTS:
+ case VG_PATH_NUM_COORDS:
+ return 1;
+ }
+
+ // invalid ParamType
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ return 0;
+ }
+
+
+VGfloat CVgPathInfo::GetParameterf(MVgContext& aVgContext, VGint aParamType)
+ {
+ switch (aParamType)
+ {
+ case VG_PATH_DATATYPE:
+ return (VGfloat) iDatatype;
+
+ case VG_PATH_SCALE:
+ return iScale;
+
+ case VG_PATH_BIAS:
+ return iBias;
+
+ case VG_PATH_FORMAT:
+ case VG_PATH_NUM_SEGMENTS:
+ case VG_PATH_NUM_COORDS:
+ return HostVgGetParameterf(aVgContext, aParamType);
+ }
+
+ // invalid ParamType
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ return 0;
+ }
+
+
+VGint CVgPathInfo::GetParameteri(MVgContext& aVgContext, VGint aParamType)
+ {
+ switch (aParamType)
+ {
+ case VG_PATH_DATATYPE:
+ return iDatatype;
+
+ case VG_PATH_SCALE:
+ return (VGint) iScale;
+
+ case VG_PATH_BIAS:
+ return (VGint) iBias;
+
+ case VG_PATH_FORMAT:
+ case VG_PATH_NUM_SEGMENTS:
+ case VG_PATH_NUM_COORDS:
+ return HostVgGetParameteri(aVgContext, aParamType);
+ }
+
+ // invalid ParamType
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ return 0;
+ }
+
+
+void CVgPathInfo::AppendPath(MVgContext& aVgContext, CVgPathInfo& aSrcPathInfo)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgAppendPath, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aSrcPathInfo.HostHandle());
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+
+
+void CVgPathInfo::AppendPathData(MVgContext& aVgContext, VGint aNumSegments, const VGubyte * aPathSegments, const void* aPathData)
+ {
+ VGint pathDataSize = 0;
+ if ( CheckAppendPathData(aVgContext, aNumSegments, aPathSegments, aPathData, &pathDataSize) )
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgAppendPathData, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aNumSegments);
+ vgApiData.AppendVector(aPathSegments, aNumSegments);
+ vgApiData.AppendVector(aPathData, pathDataSize);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+ }
+
+
+//Private extension to Open VG API to get the path length
+VGint CVgPathInfo::HostVgeGetPathCoordsSizeInBytes(MVgContext& aVgContext, VGint aStartIndex, VGint aNumSegments)
+ {
+ RemoteFunctionCallData rfcdata; OpenVgRFC vgApiData(rfcdata);
+ vgApiData.Init(OpenVgRFC::EvgePathCoordsSizeInBytes);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aStartIndex);
+ vgApiData.AppendParam(aNumSegments);
+ VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ return static_cast<VGint>(vgApiData.ReturnValue());
+ }
+
+
+void CVgPathInfo::ModifyPathCoords(MVgContext& aVgContext, VGint aStartIndex, VGint aNumSegments, const void* aPathData)
+ {
+ if (CheckPathDataAlignment(aVgContext, aPathData))
+ {
+ // The host OpenVG implementation returns -1 if vgePathCoordsSizeInBytes is not supported
+ // It does not seem simple to reliably implement vgePathCoordsSizeInBytes in the Symbian client
+ VGint dataSize = HostVgeGetPathCoordsSizeInBytes(aVgContext, aStartIndex, aNumSegments);
+ OPENVG_TRACE("TGuestOpenVg::vgModifyPathCoords - dataSize=%d", dataSize);
+ if (dataSize <= 0)
+ {
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ }
+ else
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgModifyPathCoords, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aStartIndex);
+ vgApiData.AppendParam(aNumSegments);
+ vgApiData.AppendVector(aPathData, dataSize);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+ }
+ }
+
+
+void CVgPathInfo::TransformPath(MVgContext& aVgContext, CVgPathInfo& aSrcPathInfo)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgTransformPath, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aSrcPathInfo.HostHandle());
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+
+
+VGboolean CVgPathInfo::InterpolatePath(MVgContext& aVgContext, CVgPathInfo& aStartPathInfo, CVgPathInfo& aEndPathInfo, VGfloat aAmount)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgInterpolatePath);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aStartPathInfo.HostHandle());
+ vgApiData.AppendParam(aEndPathInfo.HostHandle());
+ vgApiData.AppendParam(aAmount);
+ VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ return static_cast<VGboolean>(vgApiData.ReturnValue());
+ }
+
+
+VGfloat CVgPathInfo::PathLength(MVgContext& aVgContext, VGint aStartSegment, VGint aNumSegments)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgPathLength);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aStartSegment);
+ vgApiData.AppendParam(aNumSegments);
+ VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ return static_cast<VGfloat>(vgApiData.ReturnValue());
+ }
+
+
+void CVgPathInfo::PointAlongPath(MVgContext& aVgContext, VGint aStartSegment, VGint aNumSegments, VGfloat aDistance,
+ VGfloat* aX, VGfloat* aY, VGfloat* aTangentX, VGfloat* aTangentY)
+ {
+ TBool getPoint = (aX && aY);
+ TBool getTangent = (aTangentX && aTangentY);
+
+ if ( getPoint && !TCheck::Chk2x32bitPtr(aVgContext, aX, aY) )
+ {
+ return;
+ }
+ if ( getTangent && !TCheck::Chk2x32bitPtr(aVgContext, aTangentX, aTangentY) )
+ {
+ return;
+ }
+ if (getPoint || getTangent)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgPointAlongPath);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aStartSegment);
+ vgApiData.AppendParam(aNumSegments);
+ vgApiData.AppendParam(aDistance);
+ vgApiData.AppendVector(aX, getPoint ? 1 : 0, RemoteFunctionCallData::EOut);
+ vgApiData.AppendVector(aY, getPoint ? 1 : 0, RemoteFunctionCallData::EOut);
+ vgApiData.AppendVector(aTangentX, getTangent ? 1 : 0, RemoteFunctionCallData::EOut);
+ vgApiData.AppendVector(aTangentY, getTangent ? 1 : 0, RemoteFunctionCallData::EOut);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+ }
+
+
+void CVgPathInfo::PathBounds(MVgContext& aVgContext, VGfloat* aMinX, VGfloat* aMinY, VGfloat* aWidth, VGfloat* aHeight)
+ {
+ if (TCheck::Chk4x32bitPtr(aVgContext, aMinX, aMinY, aWidth, aHeight) )
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgPathBounds);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendVector(aMinX, 1, RemoteFunctionCallData::EOut);
+ vgApiData.AppendVector(aMinY, 1, RemoteFunctionCallData::EOut);
+ vgApiData.AppendVector(aWidth, 1, RemoteFunctionCallData::EOut);
+ vgApiData.AppendVector(aHeight, 1, RemoteFunctionCallData::EOut);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+ }
+
+
+void CVgPathInfo::PathTransformedBounds(MVgContext& aVgContext, VGfloat* aMinX, VGfloat* aMinY, VGfloat* aWidth, VGfloat* aHeight)
+ {
+ if (TCheck::Chk4x32bitPtr(aVgContext, aMinX, aMinY, aWidth, aHeight) )
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgPathTransformedBounds);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendVector(aMinX, 1, RemoteFunctionCallData::EOut);
+ vgApiData.AppendVector(aMinY, 1, RemoteFunctionCallData::EOut);
+ vgApiData.AppendVector(aWidth, 1, RemoteFunctionCallData::EOut);
+ vgApiData.AppendVector(aHeight, 1, RemoteFunctionCallData::EOut);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+ }
+
+
+void CVgPathInfo::DrawPath(MVgContext& aVgContext, VGbitfield aPaintModes)
+ {
+ if ( TCheck::ChkVGPaintModesCombination(aVgContext, aPaintModes) )
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgDrawPath, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aPaintModes);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+ }
+
+
+void CVgPathInfo::RenderToMask(MVgContext& aVgContext, VGbitfield aPaintModes, VGMaskOperation aOperation)
+ {
+ if ( TCheck::ChkVGPaintModesCombination(aVgContext, aPaintModes) && TCheck::ChkVGMaskOperation(aVgContext, aOperation) )
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgRenderToMask, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aPaintModes);
+ vgApiData.AppendParam(aOperation);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+ }
+
+
+// end of file vgpath.cpp