Added /NOBUILD option to holdingarea/build.bat
This allows cmake to be run without subsequently invoking nmake
// 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