--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/guestrendering/guestopenvg/src/vgpaint.cpp Wed Sep 08 17:02:34 2010 +0100
@@ -0,0 +1,429 @@
+// 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 Open VG handle based objects
+
+#include "vgstate.h"
+#include "remotefunctioncall.h"
+#include "openvgrfc.h"
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////
+// CVgPaintInfo
+/////////////////////////////////////////////////////////////////////////////////////////////
+
+CVgPaintInfo* CVgPaintInfo::New()
+ {
+ RHeap* clientHeap = CVghwUtils::SwitchToVghwHeap();
+ CVgPaintInfo* self = new CVgPaintInfo();
+ CVghwUtils::SwitchFromVghwHeap(clientHeap);
+ return self;
+ }
+
+
+CVgPaintInfo::~CVgPaintInfo()
+ {}
+
+
+CVgPaintInfo::CVgPaintInfo() :
+ CVgHandleBase(EVgHandleForPaint),
+ iPaintType(VG_PAINT_TYPE_COLOR), iColorRampSpreadMode(VG_COLOR_RAMP_SPREAD_PAD),
+ iColorRampPremultiplied(VG_TRUE), iPatternTilingMode(VG_TILE_FILL)
+ {}
+
+
+TBool CVgPaintInfo::DestroyObject(MVgContext& aVgContext)
+ {
+ VGPANIC_ASSERT_DEBUG(iIsDestroyed, EVgPanicTemp);
+ OPENVG_TRACE(" CVgPaintInfo::DestroyObject HostHandle=0x%x", iHostHandle);
+
+ if (iHostHandle)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgDestroyPaint, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(iHostHandle);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+
+ return ETrue;
+ }
+
+
+VGint CVgPaintInfo::GetParameterVectorSize(MVgContext& aVgContext, VGint aParamType)
+ {
+ switch (aParamType)
+ {
+ case VG_PAINT_TYPE:
+ case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
+ case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
+ case VG_PAINT_PATTERN_TILING_MODE:
+ return 1;
+
+ case VG_PAINT_COLOR:
+ case VG_PAINT_LINEAR_GRADIENT:
+ return 4;
+
+ case VG_PAINT_COLOR_RAMP_STOPS:
+ return 10000; // note: finite limit due to Guest serialisation limits
+
+ case VG_PAINT_RADIAL_GRADIENT:
+ return 5;
+ }
+
+ // invalid ParamType
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ return 0;
+ }
+
+
+VGfloat CVgPaintInfo::GetParameterf(MVgContext& aVgContext, VGint aParamType)
+ {
+ switch (aParamType)
+ {
+ case VG_PAINT_TYPE:
+ return (VGfloat) iPaintType;
+ case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
+ return (VGfloat) iColorRampSpreadMode;
+ case VG_PAINT_PATTERN_TILING_MODE:
+ return (VGfloat) iPatternTilingMode;
+ case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
+ return (VGfloat) iColorRampPremultiplied;
+ case VG_PAINT_COLOR:
+ case VG_PAINT_COLOR_RAMP_STOPS:
+ case VG_PAINT_LINEAR_GRADIENT:
+ case VG_PAINT_RADIAL_GRADIENT:
+ return HostVgGetParameterf(aVgContext, aParamType);
+ }
+
+ // invalid ParamType
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ return 0;
+ }
+
+
+VGint CVgPaintInfo::GetParameteri(MVgContext& aVgContext, VGint aParamType)
+ {
+ switch (aParamType)
+ {
+ case VG_PAINT_TYPE:
+ return iPaintType;
+ case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
+ return iColorRampSpreadMode;
+ case VG_PAINT_PATTERN_TILING_MODE:
+ return iPatternTilingMode;
+ case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
+ return iColorRampPremultiplied;
+ case VG_PAINT_COLOR:
+ case VG_PAINT_COLOR_RAMP_STOPS:
+ case VG_PAINT_LINEAR_GRADIENT:
+ case VG_PAINT_RADIAL_GRADIENT:
+ return HostVgGetParameteri(aVgContext, aParamType);
+ }
+
+ // invalid ParamType
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ return 0;
+ }
+
+
+void CVgPaintInfo::GetParameterfv(MVgContext& aVgContext, VGint aParamType, VGint aCount, VGfloat * aValues)
+ {
+ if (aCount > 0)
+ {
+ // vSize = 0 means the ParamType is not valid for this object, and VG error is already set
+ VGint vSize = GetParameterVectorSize(aVgContext, aParamType);
+ if (vSize == 0)
+ { // VG Error already set
+ return;
+ }
+
+ if ( (aCount <= vSize) )
+ {
+ switch (aParamType)
+ {
+ case VG_PAINT_TYPE:
+ *aValues = (VGfloat) iPaintType;
+ return;
+ case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
+ *aValues = (VGfloat) iColorRampSpreadMode;
+ return;
+ case VG_PAINT_PATTERN_TILING_MODE:
+ *aValues = (VGfloat) iPatternTilingMode;
+ return;
+ case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
+ *aValues = (VGfloat) iColorRampPremultiplied;
+ return;
+ case VG_PAINT_COLOR:
+ case VG_PAINT_COLOR_RAMP_STOPS:
+ case VG_PAINT_LINEAR_GRADIENT:
+ case VG_PAINT_RADIAL_GRADIENT:
+ HostVgGetParameterfv(aVgContext, aParamType, aCount, aValues);
+ return;
+ }
+ }
+ }
+
+ // invalid ParamType
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ return;
+ }
+
+
+void CVgPaintInfo::GetParameteriv(MVgContext& aVgContext, VGint aParamType, VGint aCount, VGint * aValues)
+ {
+ if (aCount > 0)
+ {
+ // vSize = 0 means the ParamType is not valid for this object, and VG error is already set
+ VGint vSize = GetParameterVectorSize(aVgContext, aParamType);
+ if (vSize == 0)
+ { // VG Error already set
+ return;
+ }
+
+ if ( (aCount <= vSize) )
+ {
+ switch (aParamType)
+ {
+ case VG_PAINT_TYPE:
+ *aValues = iPaintType;
+ return;
+ case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
+ *aValues = iColorRampSpreadMode;
+ return;
+ case VG_PAINT_PATTERN_TILING_MODE:
+ *aValues = iPatternTilingMode;
+ return;
+ case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
+ *aValues = iColorRampPremultiplied;
+ return;
+ case VG_PAINT_COLOR:
+ case VG_PAINT_COLOR_RAMP_STOPS:
+ case VG_PAINT_LINEAR_GRADIENT:
+ case VG_PAINT_RADIAL_GRADIENT:
+ HostVgGetParameteriv(aVgContext, aParamType, aCount, aValues);
+ return;
+ }
+ }
+ }
+
+ // invalid ParamType
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ return;
+ }
+
+
+void CVgPaintInfo::SetParameterf(MVgContext& aVgContext, VGint aParamType, VGfloat aValue)
+ {
+ switch (aParamType)
+ {
+ case VG_PAINT_TYPE:
+ case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
+ case VG_PAINT_PATTERN_TILING_MODE:
+ case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
+ SetParameteri(aVgContext, aParamType, (VGint) aValue);
+ return;
+ // **** desireable: add full checks for valid Values
+ case VG_PAINT_COLOR:
+ case VG_PAINT_COLOR_RAMP_STOPS:
+ case VG_PAINT_LINEAR_GRADIENT:
+ case VG_PAINT_RADIAL_GRADIENT:
+ HostVgSetParameterf(aVgContext, aParamType, aValue);
+ return;
+ }
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR); // invalid or Read-Only parameter
+ }
+
+
+void CVgPaintInfo::SetParameteri(MVgContext& aVgContext, VGint aParamType, VGint aValue)
+ {
+ switch (aParamType)
+ {
+ case VG_PAINT_TYPE:
+ if ( (aValue >= VG_PAINT_TYPE_COLOR) && (aValue <= VG_PAINT_TYPE_PATTERN) )
+ {
+ iPaintType = (VGPaintType) aValue;
+ HostVgSetParameteri(aVgContext, aParamType, aValue);
+ return;
+ }
+ break;
+ case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
+ if ( (aValue >= VG_COLOR_RAMP_SPREAD_PAD) && (aValue <= VG_COLOR_RAMP_SPREAD_REFLECT) )
+ {
+ iColorRampSpreadMode = (VGColorRampSpreadMode) aValue;
+ HostVgSetParameteri(aVgContext, aParamType, aValue);
+ return;
+ }
+ break;
+ case VG_PAINT_PATTERN_TILING_MODE:
+ if ( (aValue >= VG_TILE_FILL) && (aValue <= VG_TILE_REFLECT) )
+ {
+ iPatternTilingMode = (VGTilingMode) aValue;
+ HostVgSetParameteri(aVgContext, aParamType, aValue);
+ return;
+ }
+ break;
+ case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
+ if ( (aValue == VG_FALSE) || (aValue == VG_TRUE) )
+ {
+ iColorRampPremultiplied = (VGboolean) aValue;
+ HostVgSetParameteri(aVgContext, aParamType, aValue);
+ return;
+ }
+ break;
+ // **** desireable: add full checks for valid Values
+ case VG_PAINT_COLOR:
+ case VG_PAINT_COLOR_RAMP_STOPS:
+ case VG_PAINT_LINEAR_GRADIENT:
+ case VG_PAINT_RADIAL_GRADIENT:
+ HostVgSetParameteri(aVgContext, aParamType, aValue);
+ return;
+ }
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR); // invalid or Read-Only parameter
+ }
+
+
+void CVgPaintInfo::SetParameterfv(MVgContext& aVgContext, VGint aParamType, VGint aCount, const VGfloat * aValues)
+ {
+ VGint vSize = GetParameterVectorSize(aVgContext, aParamType);
+ if (vSize > 0)
+ {
+ if ( (aCount == 0) && (aValues == NULL) )
+ { // pointless but legal according to Open VG 1.1 spec
+ return;
+ }
+
+ if ( (aCount > 0) && (aCount <= vSize) )
+ {
+ switch (aParamType)
+ {
+ case VG_PAINT_TYPE:
+ case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
+ case VG_PAINT_PATTERN_TILING_MODE:
+ case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
+ SetParameteri(aVgContext, aParamType, (VGint) *aValues);
+ return;
+ case VG_PAINT_COLOR:
+ case VG_PAINT_COLOR_RAMP_STOPS:
+ case VG_PAINT_LINEAR_GRADIENT:
+ case VG_PAINT_RADIAL_GRADIENT:
+ HostVgSetParameterfv(aVgContext, aParamType, aCount, aValues);
+ return;
+ }
+ }
+ // VGPaint parameter is Read-Only or should have a smaller vector
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ }
+ }
+
+
+void CVgPaintInfo::SetParameteriv(MVgContext& aVgContext, VGint aParamType, VGint aCount, const VGint * aValues)
+ {
+ VGint vSize = GetParameterVectorSize(aVgContext, aParamType);
+ if (vSize > 0)
+ {
+ if ( (aCount == 0) && (aValues == NULL) )
+ { // pointless but legal according to Open VG 1.1 spec
+ return;
+ }
+
+ if ( (aCount > 0) && (aCount <= vSize) )
+ {
+ switch (aParamType)
+ {
+ case VG_PAINT_TYPE:
+ case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
+ case VG_PAINT_PATTERN_TILING_MODE:
+ case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
+ SetParameteri(aVgContext, aParamType, *aValues);
+ return;
+ case VG_PAINT_COLOR:
+ case VG_PAINT_COLOR_RAMP_STOPS:
+ case VG_PAINT_LINEAR_GRADIENT:
+ case VG_PAINT_RADIAL_GRADIENT:
+ HostVgSetParameteriv(aVgContext, aParamType, aCount, aValues);
+ return;
+ }
+ }
+ // VGPaint parameter is Read-Only or should have a smaller vector
+ aVgContext.SetVgError(VG_ILLEGAL_ARGUMENT_ERROR);
+ }
+ }
+
+
+void CVgPaintInfo::SetPaint(MVgContext& aVgContext, VGbitfield aPaintModes)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgSetPaint, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aPaintModes);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+
+
+//static
+void CVgPaintInfo::ResetPaint(MVgContext& aVgContext)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgSetPaint, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(VG_INVALID_HANDLE);
+ const VGuint KZero = 0;
+ vgApiData.AppendParam(KZero);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+
+
+void CVgPaintInfo::SetColor(MVgContext& aVgContext, VGuint aRgba)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgSetColor, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(iHostHandle);
+ vgApiData.AppendParam(aRgba);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+
+
+VGuint CVgPaintInfo::GetColor(MVgContext& aVgContext)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgGetColor);
+ vgApiData.AppendParam(iHostHandle);
+ VGPANIC_ASSERT_DEBUG(vgApiData.Data().Header().iOpType == RemoteFunctionCallData::EOpRequestWithReply, EVgPanicNotReplyOpcode);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ return vgApiData.ReturnValue();
+ }
+
+
+void CVgPaintInfo::PaintPattern(MVgContext& aVgContext, CVgImageInfo* aPatternInfo)
+ {
+ RemoteFunctionCallData data; OpenVgRFC vgApiData(data);
+ vgApiData.Init(OpenVgRFC::EvgPaintPattern, RemoteFunctionCallData::EOpRequest);
+ vgApiData.AppendParam(iHostHandle);
+ TUint64 sgId(0L);
+ if (aPatternInfo == NULL)
+ {
+ vgApiData.AppendParam(VG_INVALID_HANDLE);
+ }
+ else
+ {
+ vgApiData.AppendParam(aPatternInfo->HostHandle());
+ if (aPatternInfo->IsEglSibling())
+ {
+ sgId = aPatternInfo->SgImageId();
+ }
+ }
+ vgApiData.AppendTUint64(sgId);
+ aVgContext.ExecuteVgCommand(vgApiData);
+ }
+
+
+// end of file vgpaint.cpp