# HG changeset patch # User Faisal Memon # Date 1283962861 -3600 # Node ID 86401090b67f8460276cc762616557c0828a1953 # Parent acbd4400e82b598baff59fb0234a251bfba0e46f Add OpenVGU guest library diff -r acbd4400e82b -r 86401090b67f guestrendering/guestopenvgu/group/bld.inf --- a/guestrendering/guestopenvgu/group/bld.inf Wed Sep 08 17:02:34 2010 +0100 +++ b/guestrendering/guestopenvgu/group/bld.inf Wed Sep 08 17:21:01 2010 +0100 @@ -0,0 +1,22 @@ +// 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: +// OpenVG Utilities library build specification file + +PRJ_PLATFORMS +DEFAULT -WINSCW + +PRJ_EXPORTS + +PRJ_MMPFILES +guestopenvgu.mmp diff -r acbd4400e82b -r 86401090b67f guestrendering/guestopenvgu/group/guestopenvgu.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/guestrendering/guestopenvgu/group/guestopenvgu.mmp Wed Sep 08 17:21:01 2010 +0100 @@ -0,0 +1,50 @@ +// 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: +// Project file for the OpenVGU guest library + +#include +#include // For uids + +TARGET guestopenvgu.dll +TARGETTYPE dll +LINKAS libopenvgu.dll +UID KUidSharedDllUidValue KUidVGUDllUidValue +CAPABILITY CAP_GENERAL_DLL +VENDORID VID_DEFAULT + +OS_LAYER_SYSTEMINCLUDE +OS_LAYER_ESTLIB_SYSTEMINCLUDE +USERINCLUDE ../inc +USERINCLUDE ../../vghwutils/inc +USERINCLUDE ../../vghwserialiser/inc + +SOURCEPATH ../../vghwserialiser/src +SOURCE openvgrfc.cpp + +SOURCEPATH ../src +SOURCE openvgu.cpp + +LIBRARY euser.lib // Mandatory +LIBRARY vghwutils.lib +LIBRARY libOpenVG.lib +LIBRARY guestopenvg.lib +LIBRARY vghwserialiser.lib + +#ifdef WINS +DEFFILE /epoc32/include/def/win32/libopenvgu11.def // WINS/WINSCW def file +#else +DEFFILE /epoc32/include/def/eabi/libopenvgu11.def // ARM def file +#endif // WINS + +EPOCALLOWDLLDATA diff -r acbd4400e82b -r 86401090b67f guestrendering/guestopenvgu/src/openvgu.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/guestrendering/guestopenvgu/src/openvgu.cpp Wed Sep 08 17:21:01 2010 +0100 @@ -0,0 +1,514 @@ +// 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: +// Implementation of OpenVGU stub functions + +#include "vghwutils.h" + +#define __VG_OPENVG_H_ +#include + +#include "openvgrfc.h" + +class RemoteFunctionCall; + +// tracing +#ifdef _DEBUG + #include + #define OPENVGU_TRACE(fmt, args...) RDebug::Printf(fmt, ##args) +#else + #define OPENVGU_TRACE(fmt, args...) +#endif + + +extern "C" { +/* + Note: Comments at the start of each Open VG api are adapted from the Open VG 1.1 specification. + The text has been chosen/adapted to give a helpful overview of the function, and the errors + that it may generate. For more details and diagrams see the full Open VG specification. + */ + + +/* + Append a line segment to a path. + + ERRORS + VGU_BAD_HANDLE_ERROR + – if path is not a valid path handle, or is not shared with the current context + VGU_PATH_CAPABILITY_ERROR + – if VG_PATH_CAPABILITY_APPEND_TO is not enabled for path + */ +EXPORT_C VGUErrorCode + vguLine(VGPath path, + VGfloat x0, VGfloat y0, + VGfloat x1, VGfloat y1) + { + OPENVGU_TRACE("vguLine path=%d x0=0x%x, y0=0x%x, x1=0x%x, y1=0x%x", path, x0, y0, x1, y1); + + MVgContext* vgContext = CVghwUtils::VgContext(); + VGUErrorCode error = VGU_OUT_OF_MEMORY_ERROR; // nearest VGU has to an Invalid Context error + if (vgContext) + { + RemoteFunctionCallData rfcdata; OpenVgRFC vguApiData(rfcdata); + vguApiData.Init(OpenVgRFC::EvguLine); + vguApiData.AppendParam(path); + vguApiData.AppendParam(x0); + vguApiData.AppendParam(y0); + vguApiData.AppendParam(x1); + vguApiData.AppendParam(y1); + // TODO return type specific functions for VGU operations + vgContext->ExecuteVgCommand(vguApiData); + error = (VGUErrorCode)vguApiData.ReturnValue(); + } + return error; + } + +/* + Append a polyline (connected sequence of line segments) or polygon to a path. + + ERRORS + VGU_BAD_HANDLE_ERROR + – if path is not a valid path handle, or is not shared with the current context + VGU_PATH_CAPABILITY_ERROR + – if VG_PATH_CAPABILITY_APPEND_TO is not enabled for path + VGU_ILLEGAL_ARGUMENT_ERROR + – if points is NULL + – if points is not properly aligned + – if count is less than or equal to 0 + */ +EXPORT_C VGUErrorCode + vguPolygon(VGPath path, + const VGfloat * points, + VGint count, + VGboolean closed) + { + OPENVGU_TRACE("vguPolygon path=%d, points=0x%x, count=%d, closed=%d", path, points, count, closed); + + MVgContext* vgContext = CVghwUtils::VgContext(); + VGUErrorCode error = VGU_OUT_OF_MEMORY_ERROR; // nearest VGU has to an Invalid Context error + if (vgContext) + { + if ( (points == NULL) || (count <= 0) || (3ul & (unsigned)points) ) + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else + { + RemoteFunctionCallData rfcdata; OpenVgRFC vguApiData(rfcdata); + vguApiData.Init(OpenVgRFC::EvguPolygon); + vguApiData.AppendParam(path); + vguApiData.AppendParam(count); + vguApiData.AppendParam(closed); + vguApiData.AppendVector(points, count * 2); + + vgContext->ExecuteVgCommand(vguApiData); + error = (VGUErrorCode)vguApiData.ReturnValue(); + } + } + return error; + } + +/* + Append an axis-aligned rectangle with its lower-left corner at (x, y) and + a given width and height to a path. + + ERRORS + VGU_BAD_HANDLE_ERROR + – if path is not a valid path handle, or is not shared with the current context + VGU_PATH_CAPABILITY_ERROR + – if VG_PATH_CAPABILITY_APPEND_TO is not enabled for path + VGU_ILLEGAL_ARGUMENT_ERROR + – if width or height are less than or equal to 0 + */ +EXPORT_C VGUErrorCode + vguRect(VGPath path, + VGfloat x, VGfloat y, + VGfloat width, VGfloat height) + { + OPENVGU_TRACE("vguRect path=%d, x=0x%x, y=0x%x, width=0x%x, height=0x%x", path, x, y, width, height); + + MVgContext* vgContext = CVghwUtils::VgContext(); + VGUErrorCode error = VGU_OUT_OF_MEMORY_ERROR; // nearest VGU has to an Invalid Context error + if (vgContext) + { + if ( (width <= 0) || (height <= 0) ) + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else + { + RemoteFunctionCallData rfcdata; OpenVgRFC vguApiData(rfcdata); + vguApiData.Init(OpenVgRFC::EvguRect); + vguApiData.AppendParam(path); + vguApiData.AppendParam(x); + vguApiData.AppendParam(y); + vguApiData.AppendParam(width); + vguApiData.AppendParam(height); + + vgContext->ExecuteVgCommand(vguApiData); + error = (VGUErrorCode)vguApiData.ReturnValue(); + } + } + return error; + } + +/* + Append an axis-aligned round-cornered rectangle with the lower-left corner of + its rectangular bounding box at (x, y) and a given width, height, arcWidth, + and arcHeight to a path. + + ERRORS + VGU_BAD_HANDLE_ERROR + – if path is not a valid path handle, or is not shared with the current context + VGU_PATH_CAPABILITY_ERROR + – if VG_PATH_CAPABILITY_APPEND_TO is not enabled for path + VGU_ILLEGAL_ARGUMENT_ERROR + – if width or height is less than or equal to 0 + */ +EXPORT_C VGUErrorCode + vguRoundRect(VGPath path, + VGfloat x, VGfloat y, + VGfloat width, + VGfloat height, + VGfloat arcWidth, + VGfloat arcHeight) + { + OPENVGU_TRACE("vguRoundRect path=%d, x=0x%x, y=0x%x, width=0x%x, height=0x%x, arcWidth=0x%x, arcHeight=0x%x", + path, x, y, width, height, arcWidth, arcHeight); + + MVgContext* vgContext = CVghwUtils::VgContext(); + VGUErrorCode error = VGU_OUT_OF_MEMORY_ERROR; // nearest VGU has to an Invalid Context error + if (vgContext) + { + if ( (width <= 0) || (height <= 0) ) + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else + { + RemoteFunctionCallData rfcdata; OpenVgRFC vguApiData(rfcdata); + vguApiData.Init(OpenVgRFC::EvguRoundRect); + vguApiData.AppendParam(path); + vguApiData.AppendParam(x); + vguApiData.AppendParam(y); + vguApiData.AppendParam(width); + vguApiData.AppendParam(height); + vguApiData.AppendParam(arcWidth); + vguApiData.AppendParam(arcHeight); + + vgContext->ExecuteVgCommand(vguApiData); + error = (VGUErrorCode)vguApiData.ReturnValue(); + } + } + return error; + } + +/* + Append an axis-aligned ellipse to a path. The center of the ellipse is given by + (cx, cy) and the dimensions of the axis-aligned rectangle enclosing the ellipse are + given by width and height. The ellipse begins at (cx + width/2, cy) and is stroked + as two equal counter-clockwise arcs. + + ERRORS + VGU_BAD_HANDLE_ERROR + – if path is not a valid path handle, or is not shared with the current context + VGU_PATH_CAPABILITY_ERROR + – if VG_PATH_CAPABILITY_APPEND_TO is not enabled for path + VGU_ILLEGAL_ARGUMENT_ERROR + – if width or height is less than or equal to 0 + */ +EXPORT_C VGUErrorCode + vguEllipse(VGPath path, + VGfloat cx, VGfloat cy, + VGfloat width, + VGfloat height) + { + OPENVGU_TRACE("vguEllipse path=%d, cx=0x%x, cy=0x%x, width=0x%x, height=0x%x", path, cx, cy, width, height); + + MVgContext* vgContext = CVghwUtils::VgContext(); + VGUErrorCode error = VGU_OUT_OF_MEMORY_ERROR; // nearest VGU has to an Invalid Context error + if (vgContext) + { + if ( (width <= 0) || (height <= 0) ) + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else + { + RemoteFunctionCallData rfcdata; OpenVgRFC vguApiData(rfcdata); + vguApiData.Init(OpenVgRFC::EvguEllipse); + vguApiData.AppendParam(path); + vguApiData.AppendParam(cx); + vguApiData.AppendParam(cy); + vguApiData.AppendParam(width); + vguApiData.AppendParam(height); + + vgContext->ExecuteVgCommand(vguApiData); + error = (VGUErrorCode)vguApiData.ReturnValue(); + } + } + return error; + } + +/* + Append an elliptical arc to a path, possibly along with one or two line segments, + according to the arcType parameter. The startAngle and angleExtent parameters are + given in degrees, proceeding counter-clockwise from the positive X axis. The arc + is defined on the unit circle, then scaled by the width and height of the ellipse. + + ERRORS + VGU_BAD_HANDLE_ERROR + – if path is not a valid path handle, or is not shared with the current context + VGU_PATH_CAPABILITY_ERROR + – if VG_PATH_CAPABILITY_APPEND_TO is not enabled for path + VGU_ILLEGAL_ARGUMENT_ERROR + – if width or height is less than or equal to 0 + – if arcType is not one of the values from the VGUArcType enumeration + */ +EXPORT_C VGUErrorCode + vguArc(VGPath path, + VGfloat x, VGfloat y, + VGfloat width, VGfloat height, + VGfloat startAngle, + VGfloat angleExtent, + VGUArcType arcType) + { + OPENVGU_TRACE("vguArc path=%d, x=0x%x, y=0x%x, width=0x%x, height=0x%x, startAngle=0x%x, angleExtent=0x%x, arcType=%d", + path, x, y, width, height, startAngle, angleExtent, arcType); + + MVgContext* vgContext = CVghwUtils::VgContext(); + VGUErrorCode error = VGU_OUT_OF_MEMORY_ERROR; // nearest VGU has to an Invalid Context error + if (vgContext) + { + const unsigned int n_posinf = 0x7f800000u; + const unsigned int n_neginf = 0xff800000u; + VGfloat posinf = *(VGfloat*)&n_posinf; + VGfloat neginf = *(VGfloat*)&n_neginf; + + if ( (width <= 0) || (height <= 0) || ( (arcType != VGU_ARC_OPEN) && (arcType == VGU_ARC_CHORD) && (arcType == VGU_ARC_PIE) ) ) + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + // Tony TODO review NaN detection; not convinced that this works + else if ( ((x + x - x) != x) || ((y + y - y) != y) ) /* NaN's */ + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else if ( ((startAngle + startAngle - startAngle) != startAngle) || ((angleExtent + angleExtent - angleExtent) != angleExtent) ) + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else if ( (startAngle <= neginf) || (startAngle >= posinf) ) + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else if ( (angleExtent <= neginf) || (angleExtent >= posinf) ) + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else if ( (x <= neginf) || (x >= posinf) ) /*Infinity x */ + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else if ( (y <= neginf) || (y >= posinf) ) /*Infinity x */ + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else + { + RemoteFunctionCallData rfcdata; OpenVgRFC vguApiData(rfcdata); + vguApiData.Init(OpenVgRFC::EvguArc); + vguApiData.AppendParam(path); + vguApiData.AppendParam(x); + vguApiData.AppendParam(y); + vguApiData.AppendParam(width); + vguApiData.AppendParam(height); + vguApiData.AppendParam(startAngle); + vguApiData.AppendParam(angleExtent); + vguApiData.AppendParam(arcType); + + vgContext->ExecuteVgCommand(vguApiData); + error = (VGUErrorCode)vguApiData.ReturnValue(); + } + } + return error; + } + +/* + Sets the entries of matrix to a projective transformation that maps the point + (sx0, sy0) to (0, 0); (sx1, sy1) to (1, 0); (sx2, sy2) to (0, 1); and (sx3, sy3) + to (1, 1). If no non-degenerate matrix satisfies the constraints, + VGU_BAD_WARP_ERROR is returned and matrix is unchanged. + + ERRORS + VGU_ILLEGAL_ARGUMENT_ERROR + – if matrix is NULL + – if matrix is not properly aligned + VGU_BAD_WARP_ERROR + – if no non-degenerate transformation satisfies the constraints + */ +EXPORT_C VGUErrorCode + vguComputeWarpQuadToSquare(VGfloat sx0, VGfloat sy0, + VGfloat sx1, VGfloat sy1, + VGfloat sx2, VGfloat sy2, + VGfloat sx3, VGfloat sy3, + VGfloat * matrix) + { + OPENVGU_TRACE("vguComputeWarpQuadToSquare sx0=0x%x, sy0=0x%x, sx1=0x%x, sy1=0x%x, sx2=0x%x, sy2=0x%x, sx3=0x%x, sy3=0x%x, matrix=0x%x", + sx0, sy0, sx1, sy1, sx2, sy2, sx3, sy3, matrix); + + MVgContext* vgContext = CVghwUtils::VgContext(); + VGUErrorCode error = VGU_OUT_OF_MEMORY_ERROR; // nearest VGU has to an Invalid Context error + if (vgContext) + { + if ( (matrix == NULL) || (3ul & (unsigned)matrix)) + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else + { + RemoteFunctionCallData rfcdata; OpenVgRFC vguApiData( rfcdata ); + vguApiData.Init(OpenVgRFC::EvguComputeWarpQuadToSquare); + vguApiData.AppendParam(sx0); + vguApiData.AppendParam(sy0); + vguApiData.AppendParam(sx1); + vguApiData.AppendParam(sy1); + vguApiData.AppendParam(sx2); + vguApiData.AppendParam(sy2); + vguApiData.AppendParam(sx3); + vguApiData.AppendParam(sy3); + vguApiData.AppendVector(matrix, 9, RemoteFunctionCallData::EOut); + + vgContext->ExecuteVgCommand(vguApiData); + error = (VGUErrorCode)vguApiData.ReturnValue(); + } + } + return error; + } + +/* + Sets the entries of matrix to a projective transformation that maps the point + (0, 0) to (dx0, dy0); (1, 0) to (dx1, dy1); (0, 1) to (dx2, dy2); and (1, 1) to + (dx3, dy3). If no non-degenerate matrix satisfies the constraints, VGU_BAD_WARP_ERROR + is returned and matrix is unchanged. + + ERRORS + VGU_ILLEGAL_ARGUMENT_ERROR + – if matrix is NULL + – if matrix is not properly aligned + VGU_BAD_WARP_ERROR + – if no non-degenerate transformation satisfies the constraints + */ +EXPORT_C VGUErrorCode + vguComputeWarpSquareToQuad(VGfloat dx0, VGfloat dy0, + VGfloat dx1, VGfloat dy1, + VGfloat dx2, VGfloat dy2, + VGfloat dx3, VGfloat dy3, + VGfloat * matrix) + { + OPENVGU_TRACE("vguComputeWarpSquareToQuad dx0=0x%x, dy0=0x%x, dx1=0x%x, dy1=0x%x, dx2=0x%x, dy2=0x%x, dx3=0x%x, dy3=0x%x, matrix=0x%x", + dx0, dy0, dx1, dy1, dx2, dy2, dx3, dy3, matrix); + + MVgContext* vgContext = CVghwUtils::VgContext(); + VGUErrorCode error = VGU_OUT_OF_MEMORY_ERROR; // nearest VGU has to an Invalid Context error + if (vgContext) + { + if ( (matrix == NULL) || (3ul & (unsigned)matrix)) + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else + { + RemoteFunctionCallData rfcdata; OpenVgRFC vguApiData(rfcdata); + vguApiData.Init(OpenVgRFC::EvguComputeWarpSquareToQuad); + vguApiData.AppendParam(dx0); + vguApiData.AppendParam(dy0); + vguApiData.AppendParam(dx1); + vguApiData.AppendParam(dy1); + vguApiData.AppendParam(dx2); + vguApiData.AppendParam(dy2); + vguApiData.AppendParam(dx3); + vguApiData.AppendParam(dy3); + vguApiData.AppendVector(matrix, 9, RemoteFunctionCallData::EOut); + + vgContext->ExecuteVgCommand(vguApiData); + error = (VGUErrorCode)vguApiData.ReturnValue(); + } + } + return error; + } + +/* + Sets the entries of matrix to a projective transformation that maps the point + (sx0, sy0) to (dx0, dy0); (sx1, sy1) to (dx1, dy1); (sx2, sy2) to (dx2, dy2); + and (sx3, sy3) to (dx3, dy3). If no non-degenerate matrix satisfies the constraints, + VGU_BAD_WARP_ERROR is returned and matrix is unchanged. + + ERRORS + VGU_ILLEGAL_ARGUMENT_ERROR + – if matrix is NULL + – if matrix is not properly aligned + VGU_BAD_WARP_ERROR + – if no non-degenerate transformation satisfies the constraints + */ +EXPORT_C VGUErrorCode + vguComputeWarpQuadToQuad(VGfloat dx0, VGfloat dy0, + VGfloat dx1, VGfloat dy1, + VGfloat dx2, VGfloat dy2, + VGfloat dx3, VGfloat dy3, + VGfloat sx0, VGfloat sy0, + VGfloat sx1, VGfloat sy1, + VGfloat sx2, VGfloat sy2, + VGfloat sx3, VGfloat sy3, + VGfloat * matrix) + { + OPENVGU_TRACE("vguComputeWarpQuadToQuad"); + MVgContext* vgContext = CVghwUtils::VgContext(); + + VGUErrorCode error = VGU_OUT_OF_MEMORY_ERROR; // nearest VGU has to an Invalid Context error + if (vgContext) + { + if ( (matrix == NULL) || (3ul & (unsigned)matrix)) + { + error = VGU_ILLEGAL_ARGUMENT_ERROR; + } + else + { + RemoteFunctionCallData rfcdata; OpenVgRFC vguApiData(rfcdata); + vguApiData.Init(OpenVgRFC::EvguComputeWarpQuadToQuad); + vguApiData.AppendParam(dx0); + vguApiData.AppendParam(dy0); + vguApiData.AppendParam(dx1); + vguApiData.AppendParam(dy1); + vguApiData.AppendParam(dx2); + vguApiData.AppendParam(dy2); + vguApiData.AppendParam(dx3); + vguApiData.AppendParam(dy3); + vguApiData.AppendParam(sx0); + vguApiData.AppendParam(sy0); + vguApiData.AppendParam(sx1); + vguApiData.AppendParam(sy1); + vguApiData.AppendParam(sx2); + vguApiData.AppendParam(sy2); + vguApiData.AppendParam(sx3); + vguApiData.AppendParam(sy3); + vguApiData.AppendVector(matrix, 9, RemoteFunctionCallData::EOut); + + vgContext->ExecuteVgCommand(vguApiData); + error = (VGUErrorCode)vguApiData.ReturnValue(); + } + } + return error; + } + +} /* extern "C" */