guestrendering/guestopenvg/src/vgpaint.cpp
branchbug235_bringup_0
changeset 14 acbd4400e82b
child 24 a3f46bb01be2
--- /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