Update CGuestEGL::eglCreateWindowSurface to save iSurfaceId and get offesets to buffers that lower layers require
// 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