Add OpenVGU guest library bug235_bringup_0
authorFaisal Memon <faisal.memon@nokia.com>
Wed, 08 Sep 2010 17:21:01 +0100
branchbug235_bringup_0
changeset 15 86401090b67f
parent 14 acbd4400e82b
child 16 1b3a923fcf07
Add OpenVGU guest library
guestrendering/guestopenvgu/group/bld.inf
guestrendering/guestopenvgu/group/guestopenvgu.mmp
guestrendering/guestopenvgu/src/openvgu.cpp
--- 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
--- /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 <platform_paths.hrh>
+#include <VG/openvguids.hrh> // 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
--- /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 <VG/1.1/openvg.h>
+
+#include "openvgrfc.h"
+
+class RemoteFunctionCall;
+
+// tracing
+#ifdef _DEBUG
+	#include <e32debug.h>
+    #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" */