guestrendering/guestopenvg/src/vgpaint.cpp
author Matt Plumtree <matt.plumtree@nokia.com>
Thu, 07 Oct 2010 13:58:22 +0100
branchbug235_bringup_0
changeset 55 09263774e342
parent 24 a3f46bb01be2
permissions -rwxr-xr-x
Move GLES20 source into standard locations Move Khronos headers into their respective components, to be exported by each. Remove hostthreadadapter as nothing outside of the vghwapiwrapper, which now contains the code, needs it

// 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