diff -r 220791dae4c4 -r acbd4400e82b guestrendering/guestopenvg/src/vgpaint.cpp --- /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