egl/sfopenvg/riApi.cpp
branchEGL_MERGE
changeset 57 2bf8a359aa2f
child 59 0fb7b31791c3
equal deleted inserted replaced
14:0be82064630b 57:2bf8a359aa2f
       
     1 /*------------------------------------------------------------------------
       
     2  *
       
     3  * OpenVG 1.1 Reference Implementation
       
     4  * -----------------------------------
       
     5  *
       
     6  * Copyright (c) 2007 The Khronos Group Inc.
       
     7  *
       
     8  * Permission is hereby granted, free of charge, to any person obtaining a
       
     9  * copy of this software and /or associated documentation files
       
    10  * (the "Materials "), to deal in the Materials without restriction,
       
    11  * including without limitation the rights to use, copy, modify, merge,
       
    12  * publish, distribute, sublicense, and/or sell copies of the Materials,
       
    13  * and to permit persons to whom the Materials are furnished to do so,
       
    14  * subject to the following conditions: 
       
    15  *
       
    16  * The above copyright notice and this permission notice shall be included 
       
    17  * in all copies or substantial portions of the Materials. 
       
    18  *
       
    19  * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
       
    20  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
       
    21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
       
    22  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
       
    23  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
       
    24  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
       
    25  * THE USE OR OTHER DEALINGS IN THE MATERIALS.
       
    26  *
       
    27  *//**
       
    28  * \file
       
    29  * \brief	Implementations of OpenVG API functions.
       
    30  * \note	The actual processing is done in Path, Image, Rasterizer and PixelPipe classes.
       
    31  *//*-------------------------------------------------------------------*/
       
    32 
       
    33 #include "openvg.h"
       
    34 #include "egl.h"
       
    35 #include "riMiniEGL.h"
       
    36 #include "riContext.h"
       
    37 #include "riRasterizer.h"
       
    38 #include "riPixelPipe.h"
       
    39 #include "riPath.h"
       
    40 #include <stdio.h>
       
    41 #include <e32debug.h>
       
    42 
       
    43 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
    44 #include "openvginternal.h"
       
    45 #endif
       
    46 
       
    47 //==============================================================================================
       
    48 
       
    49 namespace OpenVGRI
       
    50 {
       
    51 
       
    52 /* EGL&OS functions for use in an OpenVG implementation */
       
    53 void* eglvgGetCurrentVGContext(void);
       
    54 bool  eglvgIsInUse(void* image);
       
    55 void  OSAcquireMutex(void);
       
    56 void  OSReleaseMutex(void);
       
    57 
       
    58 
       
    59 #define RI_NO_RETVAL
       
    60 
       
    61 //this must be the first line in an API function
       
    62 #define RI_GET_CONTEXT(RETVAL) \
       
    63 	OSAcquireMutex(); \
       
    64 	VGContext* context = (VGContext*)eglvgGetCurrentVGContext(); \
       
    65 	if(!context) \
       
    66 	{ \
       
    67 		OSReleaseMutex(); \
       
    68 		return RETVAL;\
       
    69 	}
       
    70 
       
    71 #define RI_IF_ERROR(COND, ERRORCODE, RETVAL) \
       
    72 	if(COND) { context->setError(ERRORCODE); OSReleaseMutex(); return RETVAL; }
       
    73 
       
    74 //all API functions must call this as their last operation (also functions that don't return values)
       
    75 //NOTE: don't evaluate anything or read state in RETVAL (it'll be executed after the mutex has been released)
       
    76 #define RI_RETURN(RETVAL) \
       
    77 	{ OSReleaseMutex(); \
       
    78 	return RETVAL; }
       
    79 
       
    80 static bool isAligned(const void* ptr, int alignment)
       
    81 {
       
    82 	RI_ASSERT(alignment == 1 || alignment == 2 || alignment == 4);
       
    83 	if(((RIuintptr)ptr) & (alignment-1))
       
    84 		return false;
       
    85 	return true;
       
    86 }
       
    87 
       
    88 static bool isAligned(const void* ptr, VGImageFormat format)
       
    89 {
       
    90 	RI_ASSERT(isValidImageFormat(format));
       
    91 	int alignment = Color::formatToDescriptor(format).bitsPerPixel >> 3;
       
    92 	if(alignment <= 1)
       
    93 		return true;	//one bit or byte per pixel
       
    94 	return isAligned(ptr, alignment);
       
    95 }
       
    96 
       
    97 bool isValidImageFormat(int f)
       
    98 {
       
    99 	if(f < VG_sRGBX_8888 || f > VG_lABGR_8888_PRE)
       
   100 		return false;
       
   101 	return true;
       
   102 }
       
   103 
       
   104 bool isValidImageFormat(EGLNativePixmapType f)
       
   105   {
       
   106 #warning TODO: implement isValidImageFormat for EGLNativePixmapType arg
       
   107   return false;
       
   108   }
       
   109 
       
   110 }	//namespace OpenVGRI
       
   111 
       
   112 using namespace OpenVGRI;
       
   113 
       
   114 /*-------------------------------------------------------------------*//*!
       
   115 * \brief	
       
   116 * \param	
       
   117 * \return	
       
   118 * \note		
       
   119 *//*-------------------------------------------------------------------*/
       
   120 
       
   121 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   122 void RI_APIENTRY do_vgFlush(void)
       
   123 #else
       
   124 void RI_APIENTRY vgFlush(void)
       
   125 #endif
       
   126 {
       
   127 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
   128 	//the RI doesn't cache anything, so this is a no-op
       
   129 	RI_RETURN(RI_NO_RETVAL);
       
   130 }
       
   131 
       
   132 /*-------------------------------------------------------------------*//*!
       
   133 * \brief	
       
   134 * \param	
       
   135 * \return	
       
   136 * \note		
       
   137 *//*-----
       
   138 *//*-------------------------------------------------------------------*/
       
   139 
       
   140 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   141 void RI_APIENTRY do_vgFinish(void)
       
   142 #else
       
   143 void RI_APIENTRY vgFinish(void)
       
   144 #endif
       
   145 {
       
   146 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
   147 	//the RI doesn't cache anything, so this is a no-op
       
   148 	RI_RETURN(RI_NO_RETVAL);
       
   149 }
       
   150 
       
   151 /*-------------------------------------------------------------------*//*!
       
   152 * \brief	
       
   153 * \param	
       
   154 * \return	
       
   155 * \note		
       
   156 *//*-------------------------------------------------------------------*/
       
   157 
       
   158 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   159 VGErrorCode RI_APIENTRY do_vgGetError(void)
       
   160 #else
       
   161 VGErrorCode RI_APIENTRY vgGetError(void)
       
   162 #endif
       
   163 {
       
   164 	RI_GET_CONTEXT(VG_NO_CONTEXT_ERROR);
       
   165 	VGErrorCode error = context->m_error;
       
   166 	context->m_error = VG_NO_ERROR;
       
   167 	RI_RETURN(error);
       
   168 }
       
   169 
       
   170 /*-------------------------------------------------------------------*//*!
       
   171 * \brief	
       
   172 * \param	
       
   173 * \return	
       
   174 * \note		
       
   175 *//*-------------------------------------------------------------------*/
       
   176 
       
   177 namespace OpenVGRI
       
   178 {
       
   179 
       
   180 RIfloat inputFloat(VGfloat f)
       
   181 {
       
   182 	//this function is used for all floating point input values
       
   183 	if(RI_ISNAN(f)) return 0.0f;	//convert NaN to zero
       
   184 	return RI_CLAMP(f, -RI_FLOAT_MAX, RI_FLOAT_MAX);	//clamp +-inf to +-RIfloat max
       
   185 }
       
   186 
       
   187 Vector2 inputVector2(const Vector2& v)
       
   188 {
       
   189     return Vector2(inputFloat(v.x), inputFloat(v.y));
       
   190 }
       
   191 
       
   192 Color inputColor(const Color& c)
       
   193 {
       
   194     Color r = c;
       
   195     r.r = inputFloat(r.r);
       
   196     r.g = inputFloat(r.g);
       
   197     r.b = inputFloat(r.b);
       
   198     r.a = inputFloat(r.a);
       
   199     return r;
       
   200 }
       
   201 
       
   202 static int inputFloatToInt(VGfloat value)
       
   203 {
       
   204 	double v = (double)floor(value);
       
   205 	v = v > (double)RI_INT32_MAX ? (double)RI_INT32_MAX : v;
       
   206 	v = v < (double)RI_INT32_MIN ? (double)RI_INT32_MIN : v;
       
   207 	return (int)v;
       
   208 }
       
   209 
       
   210 static int paramToInt(const void* values, bool floats, int count, int i)
       
   211 {
       
   212 	RI_ASSERT(i >= 0);
       
   213 	if(i >= count || !values)
       
   214 		return 0;
       
   215 	if(floats)
       
   216 		return inputFloatToInt(((const VGfloat*)values)[i]);
       
   217 	return (int)((const VGint*)values)[i];
       
   218 }
       
   219 
       
   220 static RIfloat paramToFloat(const void* values, bool floats, int count, int i)
       
   221 {
       
   222 	RI_ASSERT(i >= 0);
       
   223 	if(i >= count || !values)
       
   224 		return 0.0f;
       
   225 	if(floats)
       
   226 		return ((const VGfloat*)values)[i];
       
   227 	return (RIfloat)((const VGint*)values)[i];
       
   228 }
       
   229 
       
   230 static void floatToParam(void* output, bool outputFloats, int count, int i, VGfloat value)
       
   231 {
       
   232 	RI_ASSERT(i >= 0);
       
   233 	RI_ASSERT(output);
       
   234 	if(i >= count)
       
   235 		return;
       
   236 	if(outputFloats)
       
   237 		((VGfloat*)output)[i] = value;
       
   238 	else
       
   239 		((VGint*)output)[i] = (VGint)inputFloatToInt(value);
       
   240 }
       
   241 
       
   242 static void intToParam(void* output, bool outputFloats, int count, int i, VGint value)
       
   243 {
       
   244 	RI_ASSERT(i >= 0);
       
   245 	RI_ASSERT(output);
       
   246 	if(i >= count)
       
   247 		return;
       
   248 	if(outputFloats)
       
   249 		((VGfloat*)output)[i] = (VGfloat)value;
       
   250 	else
       
   251 		((VGint*)output)[i] = value;
       
   252 }
       
   253 
       
   254 }	//namespace OpenVGRI
       
   255 
       
   256 /*-------------------------------------------------------------------*//*!
       
   257 * \brief	
       
   258 * \param	
       
   259 * \return	
       
   260 * \note		
       
   261 *//*-------------------------------------------------------------------*/
       
   262 
       
   263 static void setifv(VGContext* context, VGParamType type, VGint count, const void* values, bool floats)
       
   264 {
       
   265 	RI_ASSERT(context);
       
   266 	RI_ASSERT(!count || (count && values));
       
   267 
       
   268 	int ivalue = paramToInt(values, floats, count, 0);
       
   269 	RIfloat fvalue = paramToFloat(values, floats, count, 0);
       
   270 
       
   271 	switch(type)
       
   272 	{
       
   273 	case VG_MATRIX_MODE:
       
   274 		if(count != 1 || ivalue < VG_MATRIX_PATH_USER_TO_SURFACE || ivalue > VG_MATRIX_GLYPH_USER_TO_SURFACE)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   275 		context->m_matrixMode = (VGMatrixMode)ivalue;
       
   276 		break;
       
   277 
       
   278 	case VG_FILL_RULE:
       
   279 		if(count != 1 || ivalue < VG_EVEN_ODD || ivalue > VG_NON_ZERO)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   280 		context->m_fillRule = (VGFillRule)ivalue;
       
   281 		break;
       
   282 
       
   283 	case VG_IMAGE_QUALITY:
       
   284 		if(count != 1 || ivalue < VG_IMAGE_QUALITY_NONANTIALIASED || ivalue > VG_IMAGE_QUALITY_BETTER)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   285 		context->m_imageQuality = (VGImageQuality)ivalue;
       
   286 		break;
       
   287 
       
   288 	case VG_RENDERING_QUALITY:
       
   289 		if(count != 1 || ivalue < VG_RENDERING_QUALITY_NONANTIALIASED || ivalue > VG_RENDERING_QUALITY_BETTER)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   290 		context->m_renderingQuality = (VGRenderingQuality)ivalue;
       
   291 		break;
       
   292 
       
   293 	case VG_BLEND_MODE:
       
   294 		if(count != 1 || ivalue < VG_BLEND_SRC || ivalue > VG_BLEND_ADDITIVE)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   295 		context->m_blendMode = (VGBlendMode)ivalue;
       
   296 		break;
       
   297 
       
   298 	case VG_IMAGE_MODE:
       
   299 		if(count != 1 || ivalue < VG_DRAW_IMAGE_NORMAL || ivalue > VG_DRAW_IMAGE_STENCIL)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   300 		context->m_imageMode = (VGImageMode)ivalue;
       
   301 		break;
       
   302 
       
   303 	case VG_SCISSOR_RECTS:
       
   304 	{
       
   305 		if(count & 3)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }	//count must be a multiple of four
       
   306 		try
       
   307 		{
       
   308 			Array<Rectangle> scissor;
       
   309 			for(int i=0;i<RI_INT_MIN(count, RI_MAX_SCISSOR_RECTANGLES*4);i+=4)
       
   310 			{
       
   311 				Rectangle s;
       
   312 				s.x = paramToInt(values, floats, count, i+0);
       
   313 				s.y = paramToInt(values, floats, count, i+1);
       
   314 				s.width = paramToInt(values, floats, count, i+2);
       
   315 				s.height = paramToInt(values, floats, count, i+3);
       
   316 				scissor.push_back(s);	//throws bad_alloc
       
   317 			}
       
   318 			context->m_scissor.swap(scissor);	//replace context data
       
   319 		}
       
   320 		catch(std::bad_alloc)
       
   321 		{
       
   322 			context->setError(VG_OUT_OF_MEMORY_ERROR);
       
   323 		}
       
   324 		break;
       
   325 	}
       
   326 
       
   327 	case VG_COLOR_TRANSFORM:
       
   328 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   329 		context->m_colorTransform = ivalue ? VG_TRUE : VG_FALSE;
       
   330 		break;
       
   331 
       
   332 	case VG_COLOR_TRANSFORM_VALUES:
       
   333 		if(count != 8 || !values) { context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   334         {
       
   335             for(int i=0;i<8;i++)
       
   336             {
       
   337                 context->m_inputColorTransformValues[i] = paramToFloat(values, floats, count, i);
       
   338                 context->m_colorTransformValues[i] = inputFloat(context->m_inputColorTransformValues[i]);
       
   339             }
       
   340         }
       
   341 		break;
       
   342 
       
   343 	case VG_STROKE_LINE_WIDTH:
       
   344 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   345 		context->m_inputStrokeLineWidth = fvalue;
       
   346         context->m_strokeLineWidth = inputFloat(fvalue);
       
   347 		break;
       
   348 
       
   349 	case VG_STROKE_CAP_STYLE:
       
   350 		if(count != 1 || ivalue < VG_CAP_BUTT || ivalue > VG_CAP_SQUARE)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   351 		context->m_strokeCapStyle = (VGCapStyle)ivalue;
       
   352 		break;
       
   353 
       
   354 	case VG_STROKE_JOIN_STYLE:
       
   355 		if(count != 1 || ivalue < VG_JOIN_MITER || ivalue > VG_JOIN_BEVEL)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   356 		context->m_strokeJoinStyle = (VGJoinStyle)ivalue;
       
   357 		break;
       
   358 
       
   359 	case VG_STROKE_MITER_LIMIT:
       
   360 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   361 		context->m_inputStrokeMiterLimit = fvalue;
       
   362 		context->m_strokeMiterLimit = inputFloat(fvalue);
       
   363 		break;
       
   364 
       
   365 	case VG_STROKE_DASH_PATTERN:
       
   366 	{
       
   367 		try
       
   368 		{
       
   369 			Array<RIfloat> inputStrokeDashPattern;
       
   370 			Array<RIfloat> strokeDashPattern;
       
   371 			for(int i=0;i<RI_INT_MIN(count, RI_MAX_DASH_COUNT);i++)
       
   372             {
       
   373                 RIfloat v = paramToFloat(values, floats, count, i);
       
   374 				inputStrokeDashPattern.push_back(v);	//throws bad_alloc
       
   375 				strokeDashPattern.push_back(inputFloat(v));	//throws bad_alloc
       
   376             }
       
   377 			context->m_inputStrokeDashPattern.swap(inputStrokeDashPattern);	//replace context data
       
   378 			context->m_strokeDashPattern.swap(strokeDashPattern);	//replace context data
       
   379 		}
       
   380 		catch(std::bad_alloc)
       
   381 		{
       
   382 			context->setError(VG_OUT_OF_MEMORY_ERROR);
       
   383 		}
       
   384 		break;
       
   385 	}
       
   386 
       
   387 	case VG_STROKE_DASH_PHASE:
       
   388 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   389 		context->m_inputStrokeDashPhase = fvalue;
       
   390 		context->m_strokeDashPhase = inputFloat(fvalue);
       
   391 		break;
       
   392 
       
   393 	case VG_STROKE_DASH_PHASE_RESET:
       
   394 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   395 		context->m_strokeDashPhaseReset = ivalue ? VG_TRUE : VG_FALSE;
       
   396 		break;
       
   397 
       
   398 	case VG_TILE_FILL_COLOR:
       
   399 		if(count != 4 || !values) { context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   400 		context->m_inputTileFillColor.set(paramToFloat(values, floats, count, 0),
       
   401 									 paramToFloat(values, floats, count, 1),
       
   402 									 paramToFloat(values, floats, count, 2),
       
   403 									 paramToFloat(values, floats, count, 3),
       
   404 									 Color::sRGBA);
       
   405         context->m_tileFillColor = inputColor(context->m_inputTileFillColor);
       
   406 		break;
       
   407 
       
   408 	case VG_GLYPH_ORIGIN:
       
   409 		if(count != 2 || !values) { context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   410 		context->m_inputGlyphOrigin.x = paramToFloat(values, floats, count, 0);
       
   411 		context->m_inputGlyphOrigin.y = paramToFloat(values, floats, count, 1);
       
   412 		context->m_glyphOrigin = inputVector2(context->m_inputGlyphOrigin);
       
   413 		break;
       
   414 
       
   415 	case VG_CLEAR_COLOR:
       
   416 		if(count != 4 || !values) { context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   417 		context->m_inputClearColor.set(paramToFloat(values, floats, count, 0),
       
   418 								  paramToFloat(values, floats, count, 1),
       
   419 								  paramToFloat(values, floats, count, 2),
       
   420 								  paramToFloat(values, floats, count, 3),
       
   421 								  Color::sRGBA);
       
   422         context->m_clearColor = inputColor(context->m_inputClearColor);
       
   423 		break;
       
   424 
       
   425 	case VG_MASKING:
       
   426 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   427 		context->m_masking = ivalue ? VG_TRUE : VG_FALSE;
       
   428 		break;
       
   429 
       
   430 	case VG_SCISSORING:
       
   431 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   432 		context->m_scissoring = ivalue ? VG_TRUE : VG_FALSE;
       
   433 		break;
       
   434 
       
   435 	case VG_PIXEL_LAYOUT:
       
   436 		if(count != 1 || ivalue < VG_PIXEL_LAYOUT_UNKNOWN || ivalue > VG_PIXEL_LAYOUT_BGR_HORIZONTAL)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   437 		context->m_pixelLayout = (VGPixelLayout)ivalue;
       
   438 		break;
       
   439 
       
   440 	case VG_SCREEN_LAYOUT:
       
   441 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   442 		break;	//setting read-only values has no effect
       
   443 
       
   444 	case VG_FILTER_FORMAT_LINEAR:
       
   445 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   446 		context->m_filterFormatLinear = ivalue ? VG_TRUE : VG_FALSE;
       
   447 		break;
       
   448 
       
   449 	case VG_FILTER_FORMAT_PREMULTIPLIED:
       
   450 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   451 		context->m_filterFormatPremultiplied = ivalue ? VG_TRUE : VG_FALSE;
       
   452 		break;
       
   453 
       
   454 	case VG_FILTER_CHANNEL_MASK:
       
   455 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   456 		//undefined bits are ignored
       
   457 		context->m_filterChannelMask = (VGbitfield)ivalue;
       
   458 		break;
       
   459 
       
   460 	case VG_MAX_SCISSOR_RECTS:
       
   461 	case VG_MAX_DASH_COUNT:
       
   462 	case VG_MAX_KERNEL_SIZE:
       
   463 	case VG_MAX_SEPARABLE_KERNEL_SIZE:
       
   464 	case VG_MAX_COLOR_RAMP_STOPS:
       
   465 	case VG_MAX_IMAGE_WIDTH:
       
   466 	case VG_MAX_IMAGE_HEIGHT:
       
   467 	case VG_MAX_IMAGE_PIXELS:
       
   468 	case VG_MAX_IMAGE_BYTES:
       
   469 	case VG_MAX_FLOAT:
       
   470 	case VG_MAX_GAUSSIAN_STD_DEVIATION:
       
   471 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   472 		break;	//setting read-only values has no effect
       
   473 
       
   474 	default:
       
   475 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
   476 		break;
       
   477 	}
       
   478 }
       
   479 
       
   480 /*-------------------------------------------------------------------*//*!
       
   481 * \brief	
       
   482 * \param	
       
   483 * \return	
       
   484 * \note		
       
   485 *//*-------------------------------------------------------------------*/
       
   486 
       
   487 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   488 void RI_APIENTRY do_vgSetf(VGParamType type, VGfloat value)
       
   489 #else
       
   490 void RI_APIENTRY vgSetf(VGParamType type, VGfloat value)
       
   491 #endif
       
   492 {
       
   493 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
   494 	RI_IF_ERROR(type == VG_SCISSOR_RECTS || type == VG_STROKE_DASH_PATTERN || type == VG_TILE_FILL_COLOR ||
       
   495 				type == VG_CLEAR_COLOR, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//vector type value
       
   496 	VGfloat values[1] = {value};
       
   497 	setifv(context, type, 1, values, true);
       
   498 	RI_RETURN(RI_NO_RETVAL);
       
   499 }
       
   500 
       
   501 /*-------------------------------------------------------------------*//*!
       
   502 * \brief	
       
   503 * \param	
       
   504 * \return	
       
   505 * \note		
       
   506 *//*-------------------------------------------------------------------*/
       
   507 
       
   508 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   509 void RI_APIENTRY do_vgSeti(VGParamType type, VGint value)
       
   510 #else
       
   511 void RI_APIENTRY vgSeti(VGParamType type, VGint value)
       
   512 #endif
       
   513 {
       
   514 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
   515 	RI_IF_ERROR(type == VG_SCISSOR_RECTS || type == VG_STROKE_DASH_PATTERN || type == VG_TILE_FILL_COLOR ||
       
   516 				type == VG_CLEAR_COLOR, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//vector type value
       
   517 	VGint values[1] = {value};
       
   518 	setifv(context, type, 1, values, false);
       
   519 	RI_RETURN(RI_NO_RETVAL);
       
   520 }
       
   521 
       
   522 /*-------------------------------------------------------------------*//*!
       
   523 * \brief	
       
   524 * \param	
       
   525 * \return	
       
   526 * \note		
       
   527 *//*-------------------------------------------------------------------*/
       
   528 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   529 void RI_APIENTRY do_vgSetiv(VGParamType type, VGint count, const VGint * values)
       
   530 #else 
       
   531 void RI_APIENTRY vgSetiv(VGParamType type, VGint count, const VGint * values)
       
   532 #endif
       
   533 {
       
   534 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
   535 	RI_IF_ERROR(count < 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
   536 	RI_IF_ERROR((!values && count > 0) || (values && !isAligned(values,4)), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
   537 	setifv(context, type, count, values, false);
       
   538 	RI_RETURN(RI_NO_RETVAL);
       
   539 }
       
   540 
       
   541 /*-------------------------------------------------------------------*//*!
       
   542 * \brief	
       
   543 * \param	
       
   544 * \return	
       
   545 * \note		
       
   546 *//*-------------------------------------------------------------------*/
       
   547 
       
   548 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   549 void RI_APIENTRY do_vgSetfv(VGParamType type, VGint count, const VGfloat * values)
       
   550 #else
       
   551 void RI_APIENTRY vgSetfv(VGParamType type, VGint count, const VGfloat * values)
       
   552 #endif
       
   553 {
       
   554 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
   555 	RI_IF_ERROR(count < 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
   556 	RI_IF_ERROR((!values && count > 0) || (values && !isAligned(values,4)), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
   557 	setifv(context, type, count, values, true);
       
   558 	RI_RETURN(RI_NO_RETVAL);
       
   559 }
       
   560 
       
   561 /*-------------------------------------------------------------------*//*!
       
   562 * \brief	
       
   563 * \param	
       
   564 * \return	
       
   565 * \note		
       
   566 *//*-------------------------------------------------------------------*/
       
   567 
       
   568 static void getifv(VGContext* context, VGParamType type, VGint count, void* values, bool floats)
       
   569 {
       
   570 	switch(type)
       
   571 	{
       
   572 	case VG_MATRIX_MODE:
       
   573 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   574 		intToParam(values, floats, count, 0, context->m_matrixMode);
       
   575 		break;
       
   576 
       
   577 	case VG_FILL_RULE:
       
   578 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   579 		intToParam(values, floats, count, 0, context->m_fillRule);
       
   580 		break;
       
   581 
       
   582 	case VG_IMAGE_QUALITY:
       
   583 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   584 		intToParam(values, floats, count, 0, context->m_imageQuality);
       
   585 		break;
       
   586 
       
   587 	case VG_RENDERING_QUALITY:
       
   588 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   589 		intToParam(values, floats, count, 0, context->m_renderingQuality);
       
   590 		break;
       
   591 
       
   592 	case VG_BLEND_MODE:
       
   593 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   594 		intToParam(values, floats, count, 0, context->m_blendMode);
       
   595 		break;
       
   596 
       
   597 	case VG_IMAGE_MODE:
       
   598 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   599 		intToParam(values, floats, count, 0, context->m_imageMode);
       
   600 		break;
       
   601 
       
   602 	case VG_SCISSOR_RECTS:
       
   603 	{
       
   604 		if(count > context->m_scissor.size()*4)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   605 		for(int i=0;i<context->m_scissor.size();i++)
       
   606 		{
       
   607 			intToParam(values, floats, count, i*4+0, context->m_scissor[i].x);
       
   608 			intToParam(values, floats, count, i*4+1, context->m_scissor[i].y);
       
   609 			intToParam(values, floats, count, i*4+2, context->m_scissor[i].width);
       
   610 			intToParam(values, floats, count, i*4+3, context->m_scissor[i].height);
       
   611 		}
       
   612 		break;
       
   613 	}
       
   614 
       
   615 	case VG_COLOR_TRANSFORM:
       
   616 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   617 		intToParam(values, floats, count, 0, context->m_colorTransform);
       
   618 		break;
       
   619 
       
   620 	case VG_COLOR_TRANSFORM_VALUES:
       
   621 		if(count > 8) { context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   622         {
       
   623             for(int i=0;i<count;i++)
       
   624             {
       
   625                 floatToParam(values, floats, count, i, context->m_inputColorTransformValues[i]);
       
   626             }
       
   627         }
       
   628 		break;
       
   629 
       
   630 	case VG_STROKE_LINE_WIDTH:
       
   631 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   632 		floatToParam(values, floats, count, 0, context->m_inputStrokeLineWidth);
       
   633 		break;
       
   634 
       
   635 	case VG_STROKE_CAP_STYLE:
       
   636 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   637 		intToParam(values, floats, count, 0, context->m_strokeCapStyle);
       
   638 		break;
       
   639 
       
   640 	case VG_STROKE_JOIN_STYLE:
       
   641 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   642 		intToParam(values, floats, count, 0, context->m_strokeJoinStyle);
       
   643 		break;
       
   644 
       
   645 	case VG_STROKE_MITER_LIMIT:
       
   646 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   647 		floatToParam(values, floats, count, 0, context->m_inputStrokeMiterLimit);
       
   648 		break;
       
   649 
       
   650 	case VG_STROKE_DASH_PATTERN:
       
   651 	{
       
   652 		if(count > context->m_inputStrokeDashPattern.size())	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   653 		for(int i=0;i<context->m_inputStrokeDashPattern.size();i++)
       
   654 			floatToParam(values, floats, count, i, context->m_inputStrokeDashPattern[i]);
       
   655 		break;
       
   656 	}
       
   657 
       
   658 	case VG_STROKE_DASH_PHASE:
       
   659 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   660 		floatToParam(values, floats, count, 0, context->m_inputStrokeDashPhase);
       
   661 		break;
       
   662 
       
   663 	case VG_STROKE_DASH_PHASE_RESET:
       
   664 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   665 		intToParam(values, floats, count, 0, context->m_strokeDashPhaseReset);
       
   666 		break;
       
   667 
       
   668 	case VG_TILE_FILL_COLOR:
       
   669 		if(count > 4)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   670 		floatToParam(values, floats, count, 0, context->m_inputTileFillColor.r);
       
   671 		floatToParam(values, floats, count, 1, context->m_inputTileFillColor.g);
       
   672 		floatToParam(values, floats, count, 2, context->m_inputTileFillColor.b);
       
   673 		floatToParam(values, floats, count, 3, context->m_inputTileFillColor.a);
       
   674 		break;
       
   675 
       
   676 	case VG_CLEAR_COLOR:
       
   677 		if(count > 4)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   678 		floatToParam(values, floats, count, 0, context->m_inputClearColor.r);
       
   679 		floatToParam(values, floats, count, 1, context->m_inputClearColor.g);
       
   680 		floatToParam(values, floats, count, 2, context->m_inputClearColor.b);
       
   681 		floatToParam(values, floats, count, 3, context->m_inputClearColor.a);
       
   682 		break;
       
   683 
       
   684 	case VG_GLYPH_ORIGIN:
       
   685 		if(count > 2)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   686 		floatToParam(values, floats, count, 0, context->m_inputGlyphOrigin.x);
       
   687 		floatToParam(values, floats, count, 1, context->m_inputGlyphOrigin.y);
       
   688 		break;
       
   689 
       
   690 	case VG_MASKING:
       
   691 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   692 		intToParam(values, floats, count, 0, context->m_masking);
       
   693 		break;
       
   694 
       
   695 	case VG_SCISSORING:
       
   696 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   697 		intToParam(values, floats, count, 0, context->m_scissoring);
       
   698 		break;
       
   699 
       
   700 	case VG_PIXEL_LAYOUT:
       
   701 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   702 		intToParam(values, floats, count, 0, context->m_pixelLayout);
       
   703 		break;
       
   704 
       
   705 	case VG_SCREEN_LAYOUT:
       
   706 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   707 		intToParam(values, floats, count, 0, VG_PIXEL_LAYOUT_UNKNOWN);
       
   708 		break;
       
   709 
       
   710 	case VG_FILTER_FORMAT_LINEAR:
       
   711 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   712 		intToParam(values, floats, count, 0, context->m_filterFormatLinear);
       
   713 		break;
       
   714 
       
   715 	case VG_FILTER_FORMAT_PREMULTIPLIED:
       
   716 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   717 		intToParam(values, floats, count, 0, context->m_filterFormatPremultiplied);
       
   718 		break;
       
   719 
       
   720 	case VG_FILTER_CHANNEL_MASK:
       
   721 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   722 		intToParam(values, floats, count, 0, context->m_filterChannelMask);
       
   723 		break;
       
   724 
       
   725 	case VG_MAX_SCISSOR_RECTS:
       
   726 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   727 		intToParam(values, floats, count, 0, RI_MAX_SCISSOR_RECTANGLES);
       
   728 		break;
       
   729 
       
   730 	case VG_MAX_DASH_COUNT:
       
   731 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   732 		intToParam(values, floats, count, 0, RI_MAX_DASH_COUNT);
       
   733 		break;
       
   734 
       
   735 	case VG_MAX_KERNEL_SIZE:
       
   736 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   737 		intToParam(values, floats, count, 0, RI_MAX_KERNEL_SIZE);
       
   738 		break;
       
   739 
       
   740 	case VG_MAX_SEPARABLE_KERNEL_SIZE:
       
   741 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   742 		intToParam(values, floats, count, 0, RI_MAX_SEPARABLE_KERNEL_SIZE);
       
   743 		break;
       
   744 
       
   745 	case VG_MAX_COLOR_RAMP_STOPS:
       
   746 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   747 		intToParam(values, floats, count, 0, RI_MAX_COLOR_RAMP_STOPS);
       
   748 		break;
       
   749 
       
   750 	case VG_MAX_IMAGE_WIDTH:
       
   751 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   752 		intToParam(values, floats, count, 0, RI_MAX_IMAGE_WIDTH);
       
   753 		break;
       
   754 
       
   755 	case VG_MAX_IMAGE_HEIGHT:
       
   756 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   757 		intToParam(values, floats, count, 0, RI_MAX_IMAGE_HEIGHT);
       
   758 		break;
       
   759 
       
   760 	case VG_MAX_IMAGE_PIXELS:
       
   761 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   762 		intToParam(values, floats, count, 0, RI_MAX_IMAGE_PIXELS);
       
   763 		break;
       
   764 
       
   765 	case VG_MAX_IMAGE_BYTES:
       
   766 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   767 		intToParam(values, floats, count, 0, RI_MAX_IMAGE_BYTES);
       
   768 		break;
       
   769 
       
   770 	case VG_MAX_FLOAT:
       
   771 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   772 		floatToParam(values, floats, count, 0, RI_FLOAT_MAX);
       
   773 		break;
       
   774 
       
   775 	case VG_MAX_GAUSSIAN_STD_DEVIATION:
       
   776 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   777 		floatToParam(values, floats, count, 0, RI_MAX_GAUSSIAN_STD_DEVIATION);
       
   778 		break;
       
   779 
       
   780 	default:
       
   781 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
   782 		break;
       
   783 	}
       
   784 }
       
   785 
       
   786 /*-------------------------------------------------------------------*//*!
       
   787 * \brief	
       
   788 * \param	
       
   789 * \return	
       
   790 * \note		
       
   791 *//*-------------------------------------------------------------------*/
       
   792 
       
   793 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   794 VGfloat RI_APIENTRY do_vgGetf(VGParamType type)
       
   795 #else
       
   796 VGfloat RI_APIENTRY vgGetf(VGParamType type)
       
   797 #endif
       
   798 {
       
   799 	RI_GET_CONTEXT(0.0f);
       
   800 	RI_IF_ERROR(type == VG_SCISSOR_RECTS || type == VG_STROKE_DASH_PATTERN || type == VG_TILE_FILL_COLOR ||
       
   801 				type == VG_CLEAR_COLOR, VG_ILLEGAL_ARGUMENT_ERROR, 0.0f);	//vector type value
       
   802 	RIfloat ret = 0.0f;
       
   803 	getifv(context, type, 1, &ret, true);
       
   804 	RI_RETURN(ret);
       
   805 }
       
   806 
       
   807 /*-------------------------------------------------------------------*//*!
       
   808 * \brief	
       
   809 * \param	
       
   810 * \return	
       
   811 * \note		
       
   812 *//*-------------------------------------------------------------------*/
       
   813 
       
   814 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   815 VGint RI_APIENTRY do_vgGeti(VGParamType type)
       
   816 #else
       
   817 VGint RI_APIENTRY vgGeti(VGParamType type)
       
   818 #endif
       
   819 {
       
   820 	RI_GET_CONTEXT(0);
       
   821 	RI_IF_ERROR(type == VG_SCISSOR_RECTS || type == VG_STROKE_DASH_PATTERN || type == VG_TILE_FILL_COLOR ||
       
   822 				type == VG_CLEAR_COLOR, VG_ILLEGAL_ARGUMENT_ERROR, 0);	//vector type value
       
   823 	VGint ret = 0;
       
   824 	getifv(context, type, 1, &ret, false);
       
   825 	RI_RETURN(ret);
       
   826 }
       
   827 
       
   828 /*-------------------------------------------------------------------*//*!
       
   829 * \brief	
       
   830 * \param	
       
   831 * \return	
       
   832 * \note		
       
   833 *//*-------------------------------------------------------------------*/
       
   834 
       
   835 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   836 void RI_APIENTRY do_vgGetiv(VGParamType type, VGint count, VGint * values)
       
   837 #else
       
   838 void RI_APIENTRY vgGetiv(VGParamType type, VGint count, VGint * values)
       
   839 #endif
       
   840 {
       
   841 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
   842 	RI_IF_ERROR(count <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
   843 	RI_IF_ERROR(!values || !isAligned(values,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
   844 	getifv(context, type, count, values, false);
       
   845 	RI_RETURN(RI_NO_RETVAL);
       
   846 }
       
   847 
       
   848 /*-------------------------------------------------------------------*//*!
       
   849 * \brief	
       
   850 * \param	
       
   851 * \return	
       
   852 * \note		
       
   853 *//*-------------------------------------------------------------------*/
       
   854 
       
   855 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   856 void RI_APIENTRY do_vgGetfv(VGParamType type, VGint count, VGfloat * values)
       
   857 #else
       
   858 void RI_APIENTRY vgGetfv(VGParamType type, VGint count, VGfloat * values)
       
   859 #endif
       
   860 {
       
   861 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
   862 	RI_IF_ERROR(count <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
   863 	RI_IF_ERROR(!values || !isAligned(values,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
   864 	getifv(context, type, count, values, true);
       
   865 	RI_RETURN(RI_NO_RETVAL);
       
   866 }
       
   867 
       
   868 /*-------------------------------------------------------------------*//*!
       
   869 * \brief	
       
   870 * \param	
       
   871 * \return	
       
   872 * \note		
       
   873 *//*-------------------------------------------------------------------*/
       
   874 
       
   875 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
   876 VGint RI_APIENTRY do_vgGetVectorSize(VGParamType type)
       
   877 #else
       
   878 VGint RI_APIENTRY vgGetVectorSize(VGParamType type)
       
   879 #endif
       
   880 {
       
   881 	RI_GET_CONTEXT(0);
       
   882 	VGint ret = 0;
       
   883 	switch(type)
       
   884 	{
       
   885 	case VG_MATRIX_MODE:
       
   886 	case VG_FILL_RULE:
       
   887 	case VG_IMAGE_QUALITY:
       
   888 	case VG_RENDERING_QUALITY:
       
   889 	case VG_BLEND_MODE:
       
   890 	case VG_IMAGE_MODE:
       
   891 		ret = 1;
       
   892 		break;
       
   893 
       
   894 	case VG_SCISSOR_RECTS:
       
   895 		ret = 4*context->m_scissor.size();
       
   896 		break;
       
   897 
       
   898     case VG_COLOR_TRANSFORM:
       
   899         ret = 1;
       
   900         break;
       
   901 
       
   902     case VG_COLOR_TRANSFORM_VALUES:
       
   903         ret = 8;
       
   904         break;
       
   905 
       
   906 	case VG_STROKE_LINE_WIDTH:
       
   907 	case VG_STROKE_CAP_STYLE:
       
   908 	case VG_STROKE_JOIN_STYLE:
       
   909 	case VG_STROKE_MITER_LIMIT:
       
   910 		ret = 1;
       
   911 		break;
       
   912 
       
   913 	case VG_STROKE_DASH_PATTERN:
       
   914 		ret = context->m_inputStrokeDashPattern.size();
       
   915 		break;
       
   916 
       
   917 	case VG_STROKE_DASH_PHASE:
       
   918 	case VG_STROKE_DASH_PHASE_RESET:
       
   919 		ret = 1;
       
   920 		break;
       
   921 
       
   922 	case VG_TILE_FILL_COLOR:
       
   923 	case VG_CLEAR_COLOR:
       
   924 		ret = 4;
       
   925 		break;
       
   926 
       
   927 	case VG_GLYPH_ORIGIN:
       
   928 		ret = 2;
       
   929 		break;
       
   930 
       
   931 	case VG_MASKING:
       
   932 	case VG_SCISSORING:
       
   933 	case VG_PIXEL_LAYOUT:
       
   934 	case VG_SCREEN_LAYOUT:
       
   935 	case VG_FILTER_FORMAT_LINEAR:
       
   936 	case VG_FILTER_FORMAT_PREMULTIPLIED:
       
   937 	case VG_FILTER_CHANNEL_MASK:
       
   938 	case VG_MAX_SCISSOR_RECTS:
       
   939 	case VG_MAX_DASH_COUNT:
       
   940 	case VG_MAX_KERNEL_SIZE:
       
   941 	case VG_MAX_SEPARABLE_KERNEL_SIZE:
       
   942 	case VG_MAX_COLOR_RAMP_STOPS:
       
   943 	case VG_MAX_IMAGE_WIDTH:
       
   944 	case VG_MAX_IMAGE_HEIGHT:
       
   945 	case VG_MAX_IMAGE_PIXELS:
       
   946 	case VG_MAX_IMAGE_BYTES:
       
   947 	case VG_MAX_FLOAT:
       
   948 	case VG_MAX_GAUSSIAN_STD_DEVIATION:
       
   949 		ret = 1;
       
   950 		break;
       
   951 
       
   952 	default:
       
   953 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
   954 		break;
       
   955 	}
       
   956 	RI_RETURN(ret);
       
   957 }
       
   958 
       
   959 /*-------------------------------------------------------------------*//*!
       
   960 * \brief	
       
   961 * \param	
       
   962 * \return	
       
   963 * \note		
       
   964 *//*-------------------------------------------------------------------*/
       
   965 
       
   966 static void setPaintParameterifv(VGContext* context, Paint* paint, VGPaintParamType paramType, VGint count, const void* values, bool floats)
       
   967 {
       
   968 	RI_ASSERT(context);
       
   969 	RI_ASSERT(paint);
       
   970 
       
   971 	int ivalue = paramToInt(values, floats, count, 0);
       
   972 
       
   973 	switch(paramType)
       
   974 	{
       
   975 	case VG_PAINT_TYPE:
       
   976 		if(count != 1 || ivalue < VG_PAINT_TYPE_COLOR || ivalue > VG_PAINT_TYPE_PATTERN)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   977 		paint->m_paintType = (VGPaintType)ivalue;
       
   978 		break;
       
   979 
       
   980 	case VG_PAINT_COLOR:
       
   981 		if(count != 4)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   982 		paint->m_inputPaintColor.set(paramToFloat(values, floats, count, 0),
       
   983 									 paramToFloat(values, floats, count, 1),
       
   984 									 paramToFloat(values, floats, count, 2),
       
   985 									 paramToFloat(values, floats, count, 3),
       
   986 									 Color::sRGBA);
       
   987 		paint->m_paintColor = inputColor(paint->m_inputPaintColor);
       
   988 		paint->m_paintColor.clamp();
       
   989 		paint->m_paintColor.premultiply();
       
   990 		break;
       
   991 
       
   992 	case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
       
   993 		if(count != 1 || ivalue < VG_COLOR_RAMP_SPREAD_PAD || ivalue > VG_COLOR_RAMP_SPREAD_REFLECT)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
   994 		paint->m_colorRampSpreadMode = (VGColorRampSpreadMode)ivalue;
       
   995 		break;
       
   996 
       
   997 	case VG_PAINT_COLOR_RAMP_STOPS:
       
   998 	{
       
   999 		int numStops = count/5;
       
  1000 		if(count != numStops*5)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }	//count must be a multiple of five
       
  1001 		try
       
  1002 		{
       
  1003 			Array<Paint::GradientStop> colorRampStops;
       
  1004 			Array<Paint::GradientStop> inputColorRampStops;
       
  1005 			RIfloat prevOffset = -RI_FLOAT_MAX;
       
  1006 			bool valid = true;
       
  1007 			for(int i=0;i<RI_INT_MIN(numStops, RI_MAX_COLOR_RAMP_STOPS);i++)	//NOTE: ignores the final stop if there is not enough parameters
       
  1008 			{
       
  1009 				Paint::GradientStop gs;
       
  1010 				gs.offset = paramToFloat(values, floats, count, i*5);
       
  1011 				gs.color.set(paramToFloat(values, floats, count, i*5+1),
       
  1012 							 paramToFloat(values, floats, count, i*5+2),
       
  1013 							 paramToFloat(values, floats, count, i*5+3),
       
  1014 							 paramToFloat(values, floats, count, i*5+4),
       
  1015 							 Color::sRGBA);
       
  1016 				inputColorRampStops.push_back(gs);
       
  1017 
       
  1018 				if(gs.offset < prevOffset)
       
  1019 					valid = false;	//decreasing sequence, ignore it
       
  1020 
       
  1021 				if(gs.offset >= 0.0f && gs.offset <= 1.0f)
       
  1022 				{
       
  1023 					gs.color.clamp();
       
  1024 
       
  1025 					if(!colorRampStops.size() && gs.offset > 0.0f)
       
  1026 					{	//the first valid stop is not at 0, replicate the first one
       
  1027 						RIfloat tmp = gs.offset;
       
  1028 						gs.offset = 0.0f;
       
  1029 						colorRampStops.push_back(gs);	//throws bad_alloc
       
  1030 						gs.offset = tmp;
       
  1031 					}
       
  1032 					colorRampStops.push_back(gs);	//throws bad_alloc
       
  1033 				}
       
  1034 				prevOffset = gs.offset;
       
  1035 			}
       
  1036 			if(valid && colorRampStops.size() && colorRampStops[colorRampStops.size()-1].offset < 1.0f)
       
  1037 			{	//there is at least one stop, but the last one is not at 1, replicate the last one
       
  1038 				Paint::GradientStop gs = colorRampStops[colorRampStops.size()-1];
       
  1039 				gs.offset = 1.0f;
       
  1040 				colorRampStops.push_back(gs);	//throws bad_alloc
       
  1041 			}
       
  1042 			if(!valid || !colorRampStops.size())
       
  1043 			{	//there are no valid stops, add implicit stops
       
  1044 				colorRampStops.clear();
       
  1045 				Paint::GradientStop gs;
       
  1046 				gs.offset = 0.0f;
       
  1047 				gs.color.set(0,0,0,1,Color::sRGBA);
       
  1048 				colorRampStops.push_back(gs);	//throws bad_alloc
       
  1049 				gs.offset = 1.0f;
       
  1050 				gs.color.set(1,1,1,1,Color::sRGBA);
       
  1051 				colorRampStops.push_back(gs);	//throws bad_alloc
       
  1052 			}
       
  1053 			RI_ASSERT(colorRampStops.size() >= 2 && colorRampStops.size() <= RI_MAX_COLOR_RAMP_STOPS);
       
  1054 			paint->m_colorRampStops.swap(colorRampStops);	//set paint array
       
  1055 			paint->m_inputColorRampStops.swap(inputColorRampStops);	//set paint array
       
  1056 		}
       
  1057 		catch(std::bad_alloc)
       
  1058 		{
       
  1059 			context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  1060 		}
       
  1061 		break;
       
  1062 	}
       
  1063 
       
  1064 	case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
       
  1065 		if(count != 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1066 		paint->m_colorRampPremultiplied = ivalue ? VG_TRUE : VG_FALSE;
       
  1067 		break;
       
  1068 
       
  1069 	case VG_PAINT_LINEAR_GRADIENT:
       
  1070 		if(count != 4)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1071 		paint->m_inputLinearGradientPoint0.set(paramToFloat(values, floats, count, 0),
       
  1072 										  paramToFloat(values, floats, count, 1));
       
  1073 		paint->m_inputLinearGradientPoint1.set(paramToFloat(values, floats, count, 2),
       
  1074 										  paramToFloat(values, floats, count, 3));
       
  1075         paint->m_linearGradientPoint0 = inputVector2(paint->m_inputLinearGradientPoint0);
       
  1076         paint->m_linearGradientPoint1 = inputVector2(paint->m_inputLinearGradientPoint1);
       
  1077 		break;
       
  1078 
       
  1079 	case VG_PAINT_RADIAL_GRADIENT:
       
  1080 		if(count != 5)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1081 		paint->m_inputRadialGradientCenter.set(paramToFloat(values, floats, count, 0),
       
  1082 										  paramToFloat(values, floats, count, 1));
       
  1083 		paint->m_inputRadialGradientFocalPoint.set(paramToFloat(values, floats, count, 2),
       
  1084 											  paramToFloat(values, floats, count, 3));
       
  1085 		paint->m_inputRadialGradientRadius = paramToFloat(values, floats, count, 4);
       
  1086         paint->m_radialGradientCenter = inputVector2(paint->m_inputRadialGradientCenter);
       
  1087         paint->m_radialGradientFocalPoint = inputVector2(paint->m_inputRadialGradientFocalPoint);
       
  1088         paint->m_radialGradientRadius = inputFloat(paint->m_inputRadialGradientRadius);
       
  1089 		break;
       
  1090 
       
  1091 	case VG_PAINT_PATTERN_TILING_MODE:
       
  1092 		if(count != 1 || ivalue < VG_TILE_FILL || ivalue > VG_TILE_REFLECT)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1093 		paint->m_patternTilingMode = (VGTilingMode)ivalue;
       
  1094 		break;
       
  1095 
       
  1096 	default:
       
  1097 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1098 		break;
       
  1099 	}
       
  1100 }
       
  1101 
       
  1102 /*-------------------------------------------------------------------*//*!
       
  1103 * \brief	
       
  1104 * \param	
       
  1105 * \return	
       
  1106 * \note		
       
  1107 *//*-------------------------------------------------------------------*/
       
  1108 
       
  1109 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1110 void RI_APIENTRY do_vgSetParameterf(VGHandle object, VGint paramType, VGfloat value)
       
  1111 #else
       
  1112 void RI_APIENTRY vgSetParameterf(VGHandle object, VGint paramType, VGfloat value)
       
  1113 #endif
       
  1114 {
       
  1115 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1116 	bool isImage = context->isValidImage(object);
       
  1117 	bool isPath = context->isValidPath(object);
       
  1118 	bool isPaint = context->isValidPaint(object);
       
  1119 	bool isMaskLayer = context->isValidMaskLayer(object);
       
  1120 	bool isFont = context->isValidFont(object);
       
  1121 	RI_IF_ERROR(!isImage && !isPath && !isPaint && !isMaskLayer && !isFont, VG_BAD_HANDLE_ERROR, RI_NO_RETVAL); //invalid object handle
       
  1122 	RI_IF_ERROR(paramType == VG_PAINT_COLOR || paramType == VG_PAINT_COLOR_RAMP_STOPS || paramType == VG_PAINT_LINEAR_GRADIENT ||
       
  1123 				paramType == VG_PAINT_RADIAL_GRADIENT, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL); //vector valued parameter
       
  1124 	VGfloat values[1] = {value};
       
  1125 	if(isImage)
       
  1126 	{	//read only, the function does nothing
       
  1127 		RI_ASSERT(!isPath && !isPaint && !isMaskLayer && !isFont);
       
  1128 		if(paramType < VG_IMAGE_FORMAT || paramType > VG_IMAGE_HEIGHT)
       
  1129 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1130 	}
       
  1131 	else if(isPath)
       
  1132 	{	//read only, the function does nothing
       
  1133 		RI_ASSERT(!isImage && !isPaint && !isMaskLayer && !isFont);
       
  1134 		if(paramType < VG_PATH_FORMAT || paramType > VG_PATH_NUM_COORDS)
       
  1135 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1136 	}
       
  1137 	else if(isPaint)
       
  1138 	{
       
  1139 		RI_ASSERT(!isImage && !isPath && !isMaskLayer && !isFont);
       
  1140 		setPaintParameterifv(context, (Paint*)object, (VGPaintParamType)paramType, 1, values, true);
       
  1141 	}
       
  1142 	else if(isMaskLayer)
       
  1143 	{
       
  1144 		RI_ASSERT(!isImage && !isPath && !isPaint && !isFont);
       
  1145 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1146 	}
       
  1147     else
       
  1148 	{	//read only, the function does nothing
       
  1149 		RI_ASSERT(!isImage && !isPath && !isPaint && !isMaskLayer && isFont);
       
  1150         if (paramType != VG_FONT_NUM_GLYPHS)
       
  1151     		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1152     }
       
  1153 	RI_RETURN(RI_NO_RETVAL);
       
  1154 }
       
  1155 
       
  1156 /*-------------------------------------------------------------------*//*!
       
  1157 * \brief	
       
  1158 * \param	
       
  1159 * \return	
       
  1160 * \note		
       
  1161 *//*-------------------------------------------------------------------*/
       
  1162 
       
  1163 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1164 void RI_APIENTRY do_vgSetParameteri(VGHandle object, VGint paramType, VGint value)
       
  1165 #else
       
  1166 void RI_APIENTRY vgSetParameteri(VGHandle object, VGint paramType, VGint value)
       
  1167 #endif
       
  1168 {
       
  1169 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1170 	bool isImage = context->isValidImage(object);
       
  1171 	bool isPath = context->isValidPath(object);
       
  1172 	bool isPaint = context->isValidPaint(object);
       
  1173 	bool isMaskLayer = context->isValidMaskLayer(object);
       
  1174 	bool isFont = context->isValidFont(object);
       
  1175 	RI_IF_ERROR(!isImage && !isPath && !isPaint && !isMaskLayer && !isFont, VG_BAD_HANDLE_ERROR, RI_NO_RETVAL); //invalid object handle
       
  1176 	RI_IF_ERROR(paramType == VG_PAINT_COLOR || paramType == VG_PAINT_COLOR_RAMP_STOPS || paramType == VG_PAINT_LINEAR_GRADIENT ||
       
  1177 				paramType == VG_PAINT_RADIAL_GRADIENT, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//vector valued parameter
       
  1178 	VGint values[1] = {value};
       
  1179 	if(isImage)
       
  1180 	{	//read only, the function does nothing
       
  1181 		RI_ASSERT(!isPath && !isPaint && !isMaskLayer && !isFont);
       
  1182 		if(paramType < VG_IMAGE_FORMAT || paramType > VG_IMAGE_HEIGHT)
       
  1183 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1184 	}
       
  1185 	else if(isPath)
       
  1186 	{	//read only, the function does nothing
       
  1187 		RI_ASSERT(!isImage && !isPaint && !isMaskLayer && !isFont);
       
  1188 		if(paramType < VG_PATH_FORMAT || paramType > VG_PATH_NUM_COORDS)
       
  1189 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1190 	}
       
  1191 	else if(isPaint)
       
  1192 	{
       
  1193 		RI_ASSERT(!isImage && !isPath && !isMaskLayer && !isFont);
       
  1194 		setPaintParameterifv(context, (Paint*)object, (VGPaintParamType)paramType, 1, values, false);
       
  1195 	}
       
  1196 	else if(isMaskLayer)
       
  1197 	{
       
  1198 		RI_ASSERT(!isImage && !isPath && !isPaint && !isFont);
       
  1199 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1200 	}
       
  1201     else
       
  1202 	{	//read only, the function does nothing
       
  1203 		RI_ASSERT(!isImage && !isPath && !isPaint && !isMaskLayer && isFont);
       
  1204         if (paramType != VG_FONT_NUM_GLYPHS)
       
  1205     		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1206     }
       
  1207 	RI_RETURN(RI_NO_RETVAL);
       
  1208 }
       
  1209 
       
  1210 /*-------------------------------------------------------------------*//*!
       
  1211 * \brief	
       
  1212 * \param	
       
  1213 * \return	
       
  1214 * \note		
       
  1215 *//*-------------------------------------------------------------------*/
       
  1216 
       
  1217 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1218 void RI_APIENTRY do_vgSetParameterfv(VGHandle object, VGint paramType, VGint count, const VGfloat * values)
       
  1219 #else
       
  1220 void RI_APIENTRY vgSetParameterfv(VGHandle object, VGint paramType, VGint count, const VGfloat * values)
       
  1221 #endif
       
  1222 {
       
  1223 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1224 	RI_IF_ERROR(count < 0 || (!values && count > 0) || (values && !isAligned(values,4)), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  1225 	bool isImage = context->isValidImage(object);
       
  1226 	bool isPath = context->isValidPath(object);
       
  1227 	bool isPaint = context->isValidPaint(object);
       
  1228 	bool isMaskLayer = context->isValidMaskLayer(object);
       
  1229 	bool isFont = context->isValidFont(object);
       
  1230 	RI_IF_ERROR(!isImage && !isPath && !isPaint && !isMaskLayer && !isFont, VG_BAD_HANDLE_ERROR, RI_NO_RETVAL); //invalid object handle
       
  1231 	if(isImage)
       
  1232 	{	//read only, the function does nothing
       
  1233 		RI_ASSERT(!isPath && !isPaint && !isMaskLayer && !isFont);
       
  1234 		if(paramType < VG_IMAGE_FORMAT || paramType > VG_IMAGE_HEIGHT)
       
  1235 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1236 	}
       
  1237 	else if(isPath)
       
  1238 	{	//read only, the function does nothing
       
  1239 		RI_ASSERT(!isImage && !isPaint && !isMaskLayer && !isFont);
       
  1240 		if(paramType < VG_PATH_FORMAT || paramType > VG_PATH_NUM_COORDS)
       
  1241 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1242 	}
       
  1243 	else if(isPaint)
       
  1244 	{
       
  1245 		RI_ASSERT(!isImage && !isPath && !isMaskLayer && !isFont);
       
  1246 		setPaintParameterifv(context, (Paint*)object, (VGPaintParamType)paramType, count, values, true);
       
  1247 	}
       
  1248 	else if(isMaskLayer)
       
  1249 	{
       
  1250 		RI_ASSERT(!isImage && !isPath && !isPaint && !isFont);
       
  1251 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1252 	}
       
  1253     else
       
  1254 	{	//read only, the function does nothing
       
  1255 		RI_ASSERT(!isImage && !isPath && !isPaint && !isMaskLayer && isFont);
       
  1256         if (paramType != VG_FONT_NUM_GLYPHS)
       
  1257     		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1258     }
       
  1259 	RI_RETURN(RI_NO_RETVAL);
       
  1260 }
       
  1261 
       
  1262 /*-------------------------------------------------------------------*//*!
       
  1263 * \brief	
       
  1264 * \param	
       
  1265 * \return	
       
  1266 * \note		
       
  1267 *//*-------------------------------------------------------------------*/
       
  1268 
       
  1269 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1270 void RI_APIENTRY do_vgSetParameteriv(VGHandle object, VGint paramType, VGint count, const VGint * values)
       
  1271 #else
       
  1272 void RI_APIENTRY vgSetParameteriv(VGHandle object, VGint paramType, VGint count, const VGint * values)
       
  1273 #endif
       
  1274 {
       
  1275 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1276 	RI_IF_ERROR(count < 0 || (!values && count > 0) || (values && !isAligned(values,4)), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  1277 	bool isImage = context->isValidImage(object);
       
  1278 	bool isPath = context->isValidPath(object);
       
  1279 	bool isPaint = context->isValidPaint(object);
       
  1280 	bool isMaskLayer = context->isValidMaskLayer(object);
       
  1281 	bool isFont = context->isValidFont(object);
       
  1282 	RI_IF_ERROR(!isImage && !isPath && !isPaint && !isMaskLayer && !isFont, VG_BAD_HANDLE_ERROR, RI_NO_RETVAL); //invalid object handle
       
  1283 	if(isImage)
       
  1284 	{	//read only, the function does nothing
       
  1285 		RI_ASSERT(!isPath && !isPaint && !isMaskLayer && !isFont);
       
  1286 		if(paramType < VG_IMAGE_FORMAT || paramType > VG_IMAGE_HEIGHT)
       
  1287 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1288 	}
       
  1289 	else if(isPath)
       
  1290 	{	//read only, the function does nothing
       
  1291 		RI_ASSERT(!isImage && !isPaint && !isMaskLayer && !isFont);
       
  1292 		if(paramType < VG_PATH_FORMAT || paramType > VG_PATH_NUM_COORDS)
       
  1293 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1294 	}
       
  1295 	else if(isPaint)
       
  1296 	{
       
  1297 		RI_ASSERT(!isImage && !isPath && !isMaskLayer && !isFont);
       
  1298 		setPaintParameterifv(context, (Paint*)object, (VGPaintParamType)paramType, count, values, false);
       
  1299 	}
       
  1300 	else if(isMaskLayer)
       
  1301 	{
       
  1302 		RI_ASSERT(!isImage && !isPath && !isPaint && !isFont);
       
  1303 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1304 	}
       
  1305     else
       
  1306 	{	//read only, the function does nothing
       
  1307 		RI_ASSERT(!isImage && !isPath && !isPaint && !isMaskLayer && isFont);
       
  1308         if (paramType != VG_FONT_NUM_GLYPHS)
       
  1309     		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1310     }
       
  1311 	RI_RETURN(RI_NO_RETVAL);
       
  1312 }
       
  1313 
       
  1314 /*-------------------------------------------------------------------*//*!
       
  1315 * \brief	
       
  1316 * \param	
       
  1317 * \return	
       
  1318 * \note		
       
  1319 *//*-------------------------------------------------------------------*/
       
  1320 
       
  1321 static void getPaintParameterifv(VGContext* context, Paint* paint, VGPaintParamType type, VGint count, void* values, bool floats)
       
  1322 {
       
  1323 	switch(type)
       
  1324 	{
       
  1325 	case VG_PAINT_TYPE:
       
  1326 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1327 		intToParam(values, floats, count, 0, paint->m_paintType);
       
  1328 		break;
       
  1329 
       
  1330 	case VG_PAINT_COLOR:
       
  1331 		if(count > 4)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1332 		floatToParam(values, floats, count, 0, paint->m_inputPaintColor.r);
       
  1333 		floatToParam(values, floats, count, 1, paint->m_inputPaintColor.g);
       
  1334 		floatToParam(values, floats, count, 2, paint->m_inputPaintColor.b);
       
  1335 		floatToParam(values, floats, count, 3, paint->m_inputPaintColor.a);
       
  1336 		break;
       
  1337 
       
  1338 	case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
       
  1339 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1340 		intToParam(values, floats, count, 0, paint->m_colorRampSpreadMode);
       
  1341 		break;
       
  1342 
       
  1343 	case VG_PAINT_COLOR_RAMP_STOPS:
       
  1344 		{
       
  1345 			if(count > paint->m_inputColorRampStops.size()*5)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1346 			int j = 0;
       
  1347 			for(int i=0;i<paint->m_inputColorRampStops.size();i++)
       
  1348 			{
       
  1349 				floatToParam(values, floats, count, j++, paint->m_inputColorRampStops[i].offset);
       
  1350 				floatToParam(values, floats, count, j++, paint->m_inputColorRampStops[i].color.r);
       
  1351 				floatToParam(values, floats, count, j++, paint->m_inputColorRampStops[i].color.g);
       
  1352 				floatToParam(values, floats, count, j++, paint->m_inputColorRampStops[i].color.b);
       
  1353 				floatToParam(values, floats, count, j++, paint->m_inputColorRampStops[i].color.a);
       
  1354 			}
       
  1355 			break;
       
  1356 		}
       
  1357 
       
  1358 	case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
       
  1359 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1360 		intToParam(values, floats, count, 0, paint->m_colorRampPremultiplied);
       
  1361 		break;
       
  1362 
       
  1363 	case VG_PAINT_LINEAR_GRADIENT:
       
  1364 		if(count > 4)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1365 		floatToParam(values, floats, count, 0, paint->m_inputLinearGradientPoint0.x);
       
  1366 		floatToParam(values, floats, count, 1, paint->m_inputLinearGradientPoint0.y);
       
  1367 		floatToParam(values, floats, count, 2, paint->m_inputLinearGradientPoint1.x);
       
  1368 		floatToParam(values, floats, count, 3, paint->m_inputLinearGradientPoint1.y);
       
  1369 		break;
       
  1370 
       
  1371 	case VG_PAINT_RADIAL_GRADIENT:
       
  1372 		if(count > 5)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1373 		floatToParam(values, floats, count, 0, paint->m_inputRadialGradientCenter.x);
       
  1374 		floatToParam(values, floats, count, 1, paint->m_inputRadialGradientCenter.y);
       
  1375 		floatToParam(values, floats, count, 2, paint->m_inputRadialGradientFocalPoint.x);
       
  1376 		floatToParam(values, floats, count, 3, paint->m_inputRadialGradientFocalPoint.y);
       
  1377 		floatToParam(values, floats, count, 4, paint->m_inputRadialGradientRadius);
       
  1378 		break;
       
  1379 
       
  1380 	case VG_PAINT_PATTERN_TILING_MODE:
       
  1381 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1382 		intToParam(values, floats, count, 0, paint->m_patternTilingMode);
       
  1383 		break;
       
  1384 
       
  1385 	default:
       
  1386 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1387 		break;
       
  1388 	}
       
  1389 }
       
  1390 
       
  1391 /*-------------------------------------------------------------------*//*!
       
  1392 * \brief	
       
  1393 * \param	
       
  1394 * \return	
       
  1395 * \note		
       
  1396 *//*-------------------------------------------------------------------*/
       
  1397 
       
  1398 static void getPathParameterifv(VGContext* context, Path* path, VGPathParamType type, VGint count, void* values, bool floats)
       
  1399 {
       
  1400 	switch(type)
       
  1401 	{
       
  1402 	case VG_PATH_FORMAT:
       
  1403 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1404 		intToParam(values, floats, count, 0, path->getFormat());
       
  1405 		break;
       
  1406 
       
  1407 	case VG_PATH_DATATYPE:
       
  1408 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1409 		intToParam(values, floats, count, 0, path->getDatatype());
       
  1410 		break;
       
  1411 
       
  1412 	case VG_PATH_SCALE:
       
  1413 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1414 		floatToParam(values, floats, count, 0, path->getScale());
       
  1415 		break;
       
  1416 
       
  1417 	case VG_PATH_BIAS:
       
  1418 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1419 		floatToParam(values, floats, count, 0, path->getBias());
       
  1420 		break;
       
  1421 
       
  1422 	case VG_PATH_NUM_SEGMENTS:
       
  1423 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1424 		intToParam(values, floats, count, 0, path->getNumSegments());
       
  1425 		break;
       
  1426 
       
  1427 	case VG_PATH_NUM_COORDS:
       
  1428 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1429 		intToParam(values, floats, count, 0, path->getNumCoordinates());
       
  1430 		break;
       
  1431 
       
  1432 	default:
       
  1433 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1434 		break;
       
  1435 	}
       
  1436 }
       
  1437 
       
  1438 /*-------------------------------------------------------------------*//*!
       
  1439 * \brief	
       
  1440 * \param	
       
  1441 * \return	
       
  1442 * \note		
       
  1443 *//*-------------------------------------------------------------------*/
       
  1444 
       
  1445 static void getImageParameterifv(VGContext* context, Image* image, VGImageParamType type, VGint count, void* values, bool floats)
       
  1446 {
       
  1447 	switch(type)
       
  1448 	{
       
  1449 	case VG_IMAGE_FORMAT:
       
  1450 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1451 		RI_ASSERT(isValidImageFormat(image->getDescriptor().format));
       
  1452 		intToParam(values, floats, count, 0, image->getDescriptor().format);
       
  1453 		break;
       
  1454 
       
  1455 	case VG_IMAGE_WIDTH:
       
  1456 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1457 		intToParam(values, floats, count, 0, image->getWidth());
       
  1458 		break;
       
  1459 
       
  1460 	case VG_IMAGE_HEIGHT:
       
  1461 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1462 		intToParam(values, floats, count, 0, image->getHeight());
       
  1463 		break;
       
  1464 
       
  1465 	default:
       
  1466 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1467 		break;
       
  1468 	}
       
  1469 }
       
  1470 
       
  1471 /*-------------------------------------------------------------------*//*!
       
  1472 * \brief	
       
  1473 * \param	
       
  1474 * \return	
       
  1475 * \note		
       
  1476 *//*-------------------------------------------------------------------*/
       
  1477 
       
  1478 static void getFontParameterifv(VGContext* context, Font* font, VGFontParamType type, VGint count, void* values, bool floats)
       
  1479 {
       
  1480 	switch(type)
       
  1481 	{
       
  1482 	case VG_FONT_NUM_GLYPHS:
       
  1483 		if(count > 1)	{ context->setError(VG_ILLEGAL_ARGUMENT_ERROR); return; }
       
  1484 		intToParam(values, floats, count, 0, font->getNumGlyphs());
       
  1485 		break;
       
  1486 
       
  1487 	default:
       
  1488 		context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid VGParamType
       
  1489 		break;
       
  1490 	}
       
  1491 }
       
  1492 
       
  1493 /*-------------------------------------------------------------------*//*!
       
  1494 * \brief	
       
  1495 * \param	
       
  1496 * \return	
       
  1497 * \note		
       
  1498 *//*-------------------------------------------------------------------*/
       
  1499 
       
  1500 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1501 VGfloat RI_APIENTRY do_vgGetParameterf(VGHandle object, VGint paramType)
       
  1502 #else
       
  1503 VGfloat RI_APIENTRY vgGetParameterf(VGHandle object, VGint paramType)
       
  1504 #endif
       
  1505 {
       
  1506 	RI_GET_CONTEXT(0.0f);
       
  1507 	RI_IF_ERROR(paramType == VG_PAINT_COLOR || paramType == VG_PAINT_COLOR_RAMP_STOPS || paramType == VG_PAINT_LINEAR_GRADIENT ||
       
  1508 				paramType == VG_PAINT_RADIAL_GRADIENT, VG_ILLEGAL_ARGUMENT_ERROR, 0.0f);	//vector valued parameter
       
  1509 	bool isImage = context->isValidImage(object);
       
  1510 	bool isPath = context->isValidPath(object);
       
  1511 	bool isPaint = context->isValidPaint(object);
       
  1512 	bool isFont = context->isValidFont(object);
       
  1513 	RI_IF_ERROR(!isImage && !isPath && !isPaint && !isFont, VG_BAD_HANDLE_ERROR, 0.0f);	//invalid object handle
       
  1514 	VGfloat ret = 0.0f;
       
  1515 	if(isImage)
       
  1516 	{
       
  1517 		RI_ASSERT(!isPath && !isPaint && !isFont);
       
  1518 		getImageParameterifv(context, (Image*)object, (VGImageParamType)paramType, 1, &ret, true);
       
  1519 	}
       
  1520 	else if(isPath)
       
  1521 	{
       
  1522 		RI_ASSERT(!isImage && !isPaint && !isFont);
       
  1523 		getPathParameterifv(context, (Path*)object, (VGPathParamType)paramType, 1, &ret, true);
       
  1524 	}
       
  1525 	else if(isPaint)
       
  1526 	{
       
  1527 		RI_ASSERT(!isImage && !isPath && !isFont);
       
  1528 		getPaintParameterifv(context, (Paint*)object, (VGPaintParamType)paramType, 1, &ret, true);
       
  1529 	}
       
  1530 	else
       
  1531 	{
       
  1532 		RI_ASSERT(!isImage && !isPath && !isPaint && isFont);
       
  1533 		getFontParameterifv(context, (Font*)object, (VGFontParamType)paramType, 1, &ret, true);
       
  1534 	}
       
  1535 	RI_RETURN(ret);
       
  1536 }
       
  1537 
       
  1538 /*-------------------------------------------------------------------*//*!
       
  1539 * \brief	
       
  1540 * \param	
       
  1541 * \return	
       
  1542 * \note		
       
  1543 *//*-------------------------------------------------------------------*/
       
  1544 
       
  1545 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1546 VGint RI_APIENTRY do_vgGetParameteri(VGHandle object, VGint paramType)
       
  1547 #else
       
  1548 VGint RI_APIENTRY vgGetParameteri(VGHandle object, VGint paramType)
       
  1549 #endif
       
  1550 {
       
  1551 	RI_GET_CONTEXT(0);
       
  1552 	RI_IF_ERROR(paramType == VG_PAINT_COLOR || paramType == VG_PAINT_COLOR_RAMP_STOPS || paramType == VG_PAINT_LINEAR_GRADIENT ||
       
  1553 				paramType == VG_PAINT_RADIAL_GRADIENT, VG_ILLEGAL_ARGUMENT_ERROR, 0);	//vector valued parameter
       
  1554 	bool isImage = context->isValidImage(object);
       
  1555 	bool isPath = context->isValidPath(object);
       
  1556 	bool isPaint = context->isValidPaint(object);
       
  1557 	bool isFont = context->isValidFont(object);
       
  1558 	RI_IF_ERROR(!isImage && !isPath && !isPaint && !isFont, VG_BAD_HANDLE_ERROR, 0);	//invalid object handle
       
  1559 	VGint ret = 0;
       
  1560 	if(isImage)
       
  1561 	{
       
  1562 		RI_ASSERT(!isPath && !isPaint && !isFont);
       
  1563 		getImageParameterifv(context, (Image*)object, (VGImageParamType)paramType, 1, &ret, false);
       
  1564 	}
       
  1565 	else if(isPath)
       
  1566 	{
       
  1567 		RI_ASSERT(!isImage && !isPaint && !isFont);
       
  1568 		getPathParameterifv(context, (Path*)object, (VGPathParamType)paramType, 1, &ret, false);
       
  1569 	}
       
  1570 	else if(isPaint)
       
  1571 	{
       
  1572 		RI_ASSERT(!isImage && !isPath && !isFont);
       
  1573 		getPaintParameterifv(context, (Paint*)object, (VGPaintParamType)paramType, 1, &ret, false);
       
  1574 	}
       
  1575 	else
       
  1576 	{
       
  1577 		RI_ASSERT(!isImage && !isPath && !isPaint && isFont);
       
  1578 		getFontParameterifv(context, (Font*)object, (VGFontParamType)paramType, 1, &ret, false);
       
  1579 	}
       
  1580 	RI_RETURN(ret);
       
  1581 }
       
  1582 
       
  1583 /*-------------------------------------------------------------------*//*!
       
  1584 * \brief	
       
  1585 * \param	
       
  1586 * \return	
       
  1587 * \note		
       
  1588 *//*-------------------------------------------------------------------*/
       
  1589 
       
  1590 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1591 void RI_APIENTRY do_vgGetParameterfv(VGHandle object, VGint paramType, VGint count, VGfloat * values)
       
  1592 #else
       
  1593 void RI_APIENTRY vgGetParameterfv(VGHandle object, VGint paramType, VGint count, VGfloat * values)
       
  1594 #endif
       
  1595 {
       
  1596 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1597 	RI_IF_ERROR(count <= 0 || !values || !isAligned(values,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  1598 	bool isImage = context->isValidImage(object);
       
  1599 	bool isPath = context->isValidPath(object);
       
  1600 	bool isPaint = context->isValidPaint(object);
       
  1601 	bool isFont = context->isValidFont(object);
       
  1602 	RI_IF_ERROR(!isImage && !isPath && !isPaint && !isFont, VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid object handle
       
  1603 	if(isImage)
       
  1604 	{
       
  1605 		RI_ASSERT(!isPath && !isPaint && !isFont);
       
  1606 		getImageParameterifv(context, (Image*)object, (VGImageParamType)paramType, count, values, true);
       
  1607 	}
       
  1608 	else if(isPath)
       
  1609 	{
       
  1610 		RI_ASSERT(!isImage && !isPaint && !isFont);
       
  1611 		getPathParameterifv(context, (Path*)object, (VGPathParamType)paramType, count, values, true);
       
  1612 	}
       
  1613 	else if(isPaint)
       
  1614 	{
       
  1615 		RI_ASSERT(!isImage && !isPath && !isFont);
       
  1616 		getPaintParameterifv(context, (Paint*)object, (VGPaintParamType)paramType, count, values, true);
       
  1617 	}
       
  1618 	else
       
  1619 	{
       
  1620 		RI_ASSERT(!isImage && !isPath && !isPaint && isFont);
       
  1621 		getFontParameterifv(context, (Font*)object, (VGFontParamType)paramType, count, values, true);
       
  1622 	}
       
  1623 	RI_RETURN(RI_NO_RETVAL);
       
  1624 }
       
  1625 
       
  1626 /*-------------------------------------------------------------------*//*!
       
  1627 * \brief	
       
  1628 * \param	
       
  1629 * \return	
       
  1630 * \note		
       
  1631 *//*-------------------------------------------------------------------*/
       
  1632 
       
  1633 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1634 void RI_APIENTRY do_vgGetParameteriv(VGHandle object, VGint paramType, VGint count, VGint * values)
       
  1635 #else
       
  1636 void RI_APIENTRY vgGetParameteriv(VGHandle object, VGint paramType, VGint count, VGint * values)
       
  1637 #endif
       
  1638 {
       
  1639 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1640 	RI_IF_ERROR(count <= 0 || !values || !isAligned(values,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  1641 	bool isImage = context->isValidImage(object);
       
  1642 	bool isPath = context->isValidPath(object);
       
  1643 	bool isPaint = context->isValidPaint(object);
       
  1644 	bool isFont = context->isValidFont(object);
       
  1645 	RI_IF_ERROR(!isImage && !isPath && !isPaint && !isFont, VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid object handle
       
  1646 	if(isImage)
       
  1647 	{
       
  1648 		RI_ASSERT(!isPath && !isPaint && !isFont);
       
  1649 		getImageParameterifv(context, (Image*)object, (VGImageParamType)paramType, count, values, false);
       
  1650 	}
       
  1651 	else if(isPath)
       
  1652 	{
       
  1653 		RI_ASSERT(!isImage && !isPaint && !isFont);
       
  1654 		getPathParameterifv(context, (Path*)object, (VGPathParamType)paramType, count, values, false);
       
  1655 	}
       
  1656 	else if(isPaint)
       
  1657 	{
       
  1658 		RI_ASSERT(!isImage && !isPath && !isFont);
       
  1659 		getPaintParameterifv(context, (Paint*)object, (VGPaintParamType)paramType, count, values, false);
       
  1660 	}
       
  1661 	else
       
  1662 	{
       
  1663 		RI_ASSERT(!isImage && !isPath && !isPaint && isFont);
       
  1664 		getFontParameterifv(context, (Font*)object, (VGFontParamType)paramType, count, values, false);
       
  1665 	}
       
  1666 	RI_RETURN(RI_NO_RETVAL);
       
  1667 }
       
  1668 
       
  1669 /*-------------------------------------------------------------------*//*!
       
  1670 * \brief	
       
  1671 * \param	
       
  1672 * \return	
       
  1673 * \note		
       
  1674 *//*-------------------------------------------------------------------*/
       
  1675 
       
  1676 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1677 VGint RI_APIENTRY do_vgGetParameterVectorSize(VGHandle object, VGint paramType)
       
  1678 #else
       
  1679 VGint RI_APIENTRY vgGetParameterVectorSize(VGHandle object, VGint paramType)
       
  1680 #endif
       
  1681 {
       
  1682 	RI_GET_CONTEXT(0);
       
  1683 	bool isImage = context->isValidImage(object);
       
  1684 	bool isPath = context->isValidPath(object);
       
  1685 	bool isPaint = context->isValidPaint(object);
       
  1686 	bool isFont = context->isValidFont(object);
       
  1687 	RI_IF_ERROR(!isImage && !isPath && !isPaint && !isFont, VG_BAD_HANDLE_ERROR, 0);	//invalid object handle
       
  1688 	int ret = 0;
       
  1689 	if(isImage)
       
  1690 	{
       
  1691 		RI_ASSERT(!isPath && !isPaint && !isFont);
       
  1692 		switch(paramType)
       
  1693 		{
       
  1694 		case VG_IMAGE_FORMAT:
       
  1695 		case VG_IMAGE_WIDTH:
       
  1696 		case VG_IMAGE_HEIGHT:
       
  1697 			ret = 1;
       
  1698 			break;
       
  1699 
       
  1700 		default:
       
  1701 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid paramType
       
  1702 			break;
       
  1703 		}
       
  1704 	}
       
  1705 	else if(isPath)
       
  1706 	{
       
  1707 		RI_ASSERT(!isImage && !isPaint && !isFont);
       
  1708 		switch(paramType)
       
  1709 		{
       
  1710 		case VG_PATH_FORMAT:
       
  1711 		case VG_PATH_DATATYPE:
       
  1712 		case VG_PATH_SCALE:
       
  1713 		case VG_PATH_BIAS:
       
  1714 		case VG_PATH_NUM_SEGMENTS:
       
  1715 		case VG_PATH_NUM_COORDS:
       
  1716 			ret = 1;
       
  1717 			break;
       
  1718 
       
  1719 		default:
       
  1720 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid paramType
       
  1721 			break;
       
  1722 		}
       
  1723 	}
       
  1724 	else if(isPaint)
       
  1725 	{
       
  1726 		RI_ASSERT(!isImage && !isPath && !isFont);
       
  1727 		switch(paramType)
       
  1728 		{
       
  1729 		case VG_PAINT_TYPE:
       
  1730 		case VG_PAINT_COLOR_RAMP_SPREAD_MODE:
       
  1731 		case VG_PAINT_PATTERN_TILING_MODE:
       
  1732 			ret = 1;
       
  1733 			break;
       
  1734 
       
  1735 		case VG_PAINT_COLOR:
       
  1736 		case VG_PAINT_LINEAR_GRADIENT:
       
  1737 			ret = 4;
       
  1738 			break;
       
  1739 
       
  1740 		case VG_PAINT_COLOR_RAMP_STOPS:
       
  1741 			ret = ((Paint*)object)->m_inputColorRampStops.size() * 5;
       
  1742 			break;
       
  1743 
       
  1744 		case VG_PAINT_COLOR_RAMP_PREMULTIPLIED:
       
  1745 			ret = 1;
       
  1746 			break;
       
  1747 
       
  1748 		case VG_PAINT_RADIAL_GRADIENT:
       
  1749 			ret = 5;
       
  1750 			break;
       
  1751 			
       
  1752 		default:
       
  1753 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid paramType
       
  1754 			break;
       
  1755 		}
       
  1756 	}
       
  1757 	else
       
  1758 	{
       
  1759 		RI_ASSERT(!isImage && !isPath && !isPaint && isFont);
       
  1760 		switch(paramType)
       
  1761 		{
       
  1762 		case VG_FONT_NUM_GLYPHS:
       
  1763 			ret = 1;
       
  1764 			break;
       
  1765 
       
  1766 		default:
       
  1767 			context->setError(VG_ILLEGAL_ARGUMENT_ERROR);	//invalid paramType
       
  1768 			break;
       
  1769 		}
       
  1770 	}
       
  1771 	RI_RETURN(ret);
       
  1772 }
       
  1773 
       
  1774 /*-------------------------------------------------------------------*//*!
       
  1775 * \brief	
       
  1776 * \param	
       
  1777 * \return	
       
  1778 * \note		
       
  1779 *//*-------------------------------------------------------------------*/
       
  1780 
       
  1781 static Matrix3x3* getCurrentMatrix(VGContext* context)
       
  1782 {
       
  1783 	RI_ASSERT(context);
       
  1784 	switch(context->m_matrixMode)
       
  1785 	{
       
  1786 	case VG_MATRIX_PATH_USER_TO_SURFACE:
       
  1787 		return &context->m_pathUserToSurface;
       
  1788 
       
  1789 	case VG_MATRIX_IMAGE_USER_TO_SURFACE:
       
  1790 		return &context->m_imageUserToSurface;
       
  1791 
       
  1792 	case VG_MATRIX_FILL_PAINT_TO_USER:
       
  1793 		return &context->m_fillPaintToUser;
       
  1794 
       
  1795 	case VG_MATRIX_STROKE_PAINT_TO_USER:
       
  1796 		return &context->m_strokePaintToUser;
       
  1797 
       
  1798 	default:
       
  1799 		RI_ASSERT(context->m_matrixMode == VG_MATRIX_GLYPH_USER_TO_SURFACE);
       
  1800 		return &context->m_glyphUserToSurface;
       
  1801 	}
       
  1802 }
       
  1803 
       
  1804 /*-------------------------------------------------------------------*//*!
       
  1805 * \brief	
       
  1806 * \param	
       
  1807 * \return	
       
  1808 * \note		
       
  1809 *//*-------------------------------------------------------------------*/
       
  1810 
       
  1811 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1812 void RI_APIENTRY do_vgLoadIdentity(void)
       
  1813 #else
       
  1814 void RI_APIENTRY vgLoadIdentity(void)
       
  1815 #endif
       
  1816 {
       
  1817 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1818 	Matrix3x3* d = getCurrentMatrix(context);
       
  1819 	d->identity();
       
  1820 	RI_RETURN(RI_NO_RETVAL);
       
  1821 }
       
  1822 
       
  1823 /*-------------------------------------------------------------------*//*!
       
  1824 * \brief	
       
  1825 * \param	
       
  1826 * \return	
       
  1827 * \note		
       
  1828 *//*-------------------------------------------------------------------*/
       
  1829 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1830 void RI_APIENTRY do_vgLoadMatrix(const VGfloat * m)
       
  1831 #else
       
  1832 void RI_APIENTRY vgLoadMatrix(const VGfloat * m)
       
  1833 #endif
       
  1834 {
       
  1835 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1836 	RI_IF_ERROR(!m || !isAligned(m,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  1837 	Matrix3x3* d = getCurrentMatrix(context);
       
  1838 	d->set(inputFloat(m[0]), inputFloat(m[3]), inputFloat(m[6]),
       
  1839 		   inputFloat(m[1]), inputFloat(m[4]), inputFloat(m[7]),
       
  1840 		   inputFloat(m[2]), inputFloat(m[5]), inputFloat(m[8]));
       
  1841 	if(context->m_matrixMode != VG_MATRIX_IMAGE_USER_TO_SURFACE)
       
  1842 	{
       
  1843 		(*d)[2].set(0,0,1);
       
  1844 	}
       
  1845 	RI_RETURN(RI_NO_RETVAL);
       
  1846 }
       
  1847 
       
  1848 /*-------------------------------------------------------------------*//*!
       
  1849 * \brief	
       
  1850 * \param	
       
  1851 * \return	
       
  1852 * \note		
       
  1853 *//*-------------------------------------------------------------------*/
       
  1854 
       
  1855 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1856 void RI_APIENTRY do_vgGetMatrix(VGfloat * m)
       
  1857 #else
       
  1858 void RI_APIENTRY vgGetMatrix(VGfloat * m)
       
  1859 #endif
       
  1860 {
       
  1861 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1862 	RI_IF_ERROR(!m || !isAligned(m,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  1863 	Matrix3x3* d = getCurrentMatrix(context);
       
  1864 	m[0] = (*d)[0][0];
       
  1865 	m[1] = (*d)[1][0];
       
  1866 	m[2] = (*d)[2][0];
       
  1867 	m[3] = (*d)[0][1];
       
  1868 	m[4] = (*d)[1][1];
       
  1869 	m[5] = (*d)[2][1];
       
  1870 	m[6] = (*d)[0][2];
       
  1871 	m[7] = (*d)[1][2];
       
  1872 	m[8] = (*d)[2][2];
       
  1873 	RI_RETURN(RI_NO_RETVAL);
       
  1874 }
       
  1875 
       
  1876 /*-------------------------------------------------------------------*//*!
       
  1877 * \brief	
       
  1878 * \param	
       
  1879 * \return	
       
  1880 * \note		
       
  1881 *//*-------------------------------------------------------------------*/
       
  1882 
       
  1883 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1884 void RI_APIENTRY do_vgMultMatrix(const VGfloat * m)
       
  1885 #else
       
  1886 void RI_APIENTRY vgMultMatrix(const VGfloat * m)
       
  1887 #endif
       
  1888 {
       
  1889 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1890 	RI_IF_ERROR(!m || !isAligned(m,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  1891 	Matrix3x3 n(inputFloat(m[0]), inputFloat(m[3]), inputFloat(m[6]),
       
  1892 				inputFloat(m[1]), inputFloat(m[4]), inputFloat(m[7]),
       
  1893 				inputFloat(m[2]), inputFloat(m[5]), inputFloat(m[8]));
       
  1894 	if(context->m_matrixMode != VG_MATRIX_IMAGE_USER_TO_SURFACE)
       
  1895 		n[2].set(0,0,1);
       
  1896 
       
  1897 	Matrix3x3* d = getCurrentMatrix(context);
       
  1898 	*d *= n;
       
  1899 	if(context->m_matrixMode != VG_MATRIX_IMAGE_USER_TO_SURFACE)
       
  1900 	{
       
  1901 		(*d)[2].set(0,0,1);	//force affinity
       
  1902 	}
       
  1903 	RI_RETURN(RI_NO_RETVAL);
       
  1904 }
       
  1905 
       
  1906 /*-------------------------------------------------------------------*//*!
       
  1907 * \brief	
       
  1908 * \param	
       
  1909 * \return	
       
  1910 * \note		
       
  1911 *//*-------------------------------------------------------------------*/
       
  1912 
       
  1913 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1914 void RI_APIENTRY do_vgTranslate(VGfloat tx, VGfloat ty)
       
  1915 #else
       
  1916 void RI_APIENTRY vgTranslate(VGfloat tx, VGfloat ty)
       
  1917 #endif
       
  1918 {
       
  1919 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1920 	Matrix3x3 n(1, 0, inputFloat(tx),
       
  1921 				0, 1, inputFloat(ty),
       
  1922 				0, 0, 1 );
       
  1923 	Matrix3x3* d = getCurrentMatrix(context);
       
  1924 	*d *= n;
       
  1925 	if(context->m_matrixMode != VG_MATRIX_IMAGE_USER_TO_SURFACE)
       
  1926 	{
       
  1927 		(*d)[2].set(0,0,1);	//force affinity
       
  1928 	}
       
  1929 	RI_RETURN(RI_NO_RETVAL);
       
  1930 }
       
  1931 
       
  1932 /*-------------------------------------------------------------------*//*!
       
  1933 * \brief	
       
  1934 * \param	
       
  1935 * \return	
       
  1936 * \note		
       
  1937 *//*-------------------------------------------------------------------*/
       
  1938 
       
  1939 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1940 void RI_APIENTRY do_vgScale(VGfloat sx, VGfloat sy)
       
  1941 #else
       
  1942 void RI_APIENTRY vgScale(VGfloat sx, VGfloat sy)
       
  1943 #endif
       
  1944 {
       
  1945 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1946 	Matrix3x3 n(inputFloat(sx), 0,              0,
       
  1947 				0,              inputFloat(sy), 0,
       
  1948 				0,              0,              1 );
       
  1949 	Matrix3x3* d = getCurrentMatrix(context);
       
  1950 	*d *= n;
       
  1951 	if(context->m_matrixMode != VG_MATRIX_IMAGE_USER_TO_SURFACE)
       
  1952 	{
       
  1953 		(*d)[2].set(0,0,1);	//force affinity
       
  1954 	}
       
  1955 	RI_RETURN(RI_NO_RETVAL);
       
  1956 }
       
  1957 
       
  1958 /*-------------------------------------------------------------------*//*!
       
  1959 * \brief	
       
  1960 * \param	
       
  1961 * \return	
       
  1962 * \note		
       
  1963 *//*-------------------------------------------------------------------*/
       
  1964 
       
  1965 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1966 void RI_APIENTRY do_vgShear(VGfloat shx, VGfloat shy)
       
  1967 #else
       
  1968 void RI_APIENTRY vgShear(VGfloat shx, VGfloat shy)
       
  1969 #endif
       
  1970 {
       
  1971 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1972 	Matrix3x3 n(1,               inputFloat(shx), 0,
       
  1973 				inputFloat(shy), 1,               0,
       
  1974 				0,               0,               1);
       
  1975 	Matrix3x3* d = getCurrentMatrix(context);
       
  1976 	*d *= n;
       
  1977 	if(context->m_matrixMode != VG_MATRIX_IMAGE_USER_TO_SURFACE)
       
  1978 	{
       
  1979 		(*d)[2].set(0,0,1);	//force affinity
       
  1980 	}
       
  1981 	RI_RETURN(RI_NO_RETVAL);
       
  1982 }
       
  1983 
       
  1984 /*-------------------------------------------------------------------*//*!
       
  1985 * \brief	
       
  1986 * \param	
       
  1987 * \return	
       
  1988 * \note		
       
  1989 *//*-------------------------------------------------------------------*/
       
  1990 
       
  1991 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  1992 void RI_APIENTRY do_vgRotate(VGfloat angle)
       
  1993 #else
       
  1994 void RI_APIENTRY vgRotate(VGfloat angle)
       
  1995 #endif
       
  1996 {
       
  1997 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  1998 	RIfloat a = RI_DEG_TO_RAD(inputFloat(angle));
       
  1999 	Matrix3x3 n((RIfloat)cos(a), -(RIfloat)sin(a), 0,
       
  2000 				(RIfloat)sin(a),  (RIfloat)cos(a), 0,
       
  2001 				0,              0,             1 );
       
  2002 	Matrix3x3* d = getCurrentMatrix(context);
       
  2003 	*d *= n;
       
  2004 	if(context->m_matrixMode != VG_MATRIX_IMAGE_USER_TO_SURFACE)
       
  2005 	{
       
  2006 		(*d)[2].set(0,0,1);	//force affinity
       
  2007 	}
       
  2008 	RI_RETURN(RI_NO_RETVAL);
       
  2009 }
       
  2010 
       
  2011 /*-------------------------------------------------------------------*//*!
       
  2012 * \brief	
       
  2013 * \param	
       
  2014 * \return	
       
  2015 * \note		
       
  2016 *//*-------------------------------------------------------------------*/
       
  2017 
       
  2018 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2019 void RI_APIENTRY do_vgMask(VGHandle mask, VGMaskOperation operation, VGint x, VGint y, VGint width, VGint height)
       
  2020 #else
       
  2021 void RI_APIENTRY vgMask(VGHandle mask, VGMaskOperation operation, VGint x, VGint y, VGint width, VGint height)
       
  2022 #endif
       
  2023 {
       
  2024 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2025     bool isImage = context->isValidImage(mask);
       
  2026     bool isMaskLayer = context->isValidMaskLayer(mask);
       
  2027 	RI_IF_ERROR(operation != VG_CLEAR_MASK && operation != VG_FILL_MASK && !isImage && !isMaskLayer, VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  2028 	RI_IF_ERROR(operation != VG_CLEAR_MASK && operation != VG_FILL_MASK && isImage && eglvgIsInUse((Image*)mask), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  2029 	RI_IF_ERROR(operation < VG_CLEAR_MASK || operation > VG_SUBTRACT_MASK, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2030 	RI_IF_ERROR(width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2031     Drawable* drawable = context->getCurrentDrawable();
       
  2032 	RI_IF_ERROR(isMaskLayer && drawable->getNumSamples() != ((Surface*)mask)->getNumSamples(), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2033     if(!drawable || !drawable->getMaskBuffer())
       
  2034     {
       
  2035         RI_RETURN(RI_NO_RETVAL);	//no EGL surface is current at the moment or context has no mask buffer
       
  2036     }
       
  2037     if(isImage)
       
  2038         drawable->getMaskBuffer()->mask((Image*)mask, operation, x, y, width, height);
       
  2039     else
       
  2040         drawable->getMaskBuffer()->mask((Surface*)mask, operation, x, y, width, height);
       
  2041 	RI_RETURN(RI_NO_RETVAL);
       
  2042 }
       
  2043 
       
  2044 /*-------------------------------------------------------------------*//*!
       
  2045 * \brief	
       
  2046 * \param	
       
  2047 * \return	
       
  2048 * \note		
       
  2049 *//*-------------------------------------------------------------------*/
       
  2050 
       
  2051 static void renderStroke(const VGContext* context, int w, int h, int numSamples, Path* path, Rasterizer& rasterizer, const PixelPipe* pixelPipe, const Matrix3x3& userToSurface)
       
  2052 {
       
  2053     RI_ASSERT(context);
       
  2054     RI_ASSERT(w > 0 && h > 0 && numSamples >= 1 && numSamples <= 32);
       
  2055 
       
  2056     RIuint32* covBuffer = RI_NEW_ARRAY(RIuint32, w*h);
       
  2057     memset(covBuffer, 0, w*h*sizeof(RIuint32));
       
  2058 
       
  2059     rasterizer.setup(0, 0, w, h, VG_NON_ZERO, NULL, covBuffer);
       
  2060     path->stroke(userToSurface, rasterizer, context->m_strokeDashPattern, context->m_strokeDashPhase, context->m_strokeDashPhaseReset ? true : false,
       
  2061                  context->m_strokeLineWidth, context->m_strokeCapStyle, context->m_strokeJoinStyle, RI_MAX(context->m_strokeMiterLimit, 1.0f));	//throws bad_alloc
       
  2062 
       
  2063     int sx,sy,ex,ey;
       
  2064     rasterizer.getBBox(sx,sy,ex,ey);
       
  2065     RI_ASSERT(sx >= 0 && sx <= w);
       
  2066     RI_ASSERT(sy >= 0 && sy <= h);
       
  2067     RI_ASSERT(ex >= 0 && ex <= w);
       
  2068     RI_ASSERT(ey >= 0 && ey <= h);
       
  2069 
       
  2070     for(int j=sy;j<ey;j++)
       
  2071     {
       
  2072         for(int i=sx;i<ex;i++)
       
  2073         {
       
  2074             unsigned int c = covBuffer[j*w+i];
       
  2075             if(c)
       
  2076             {
       
  2077                 int coverage = 0;
       
  2078                 for(int k=0;k<numSamples;k++)
       
  2079                 {
       
  2080                     if(c & (1<<k))
       
  2081                         coverage++;
       
  2082                 }
       
  2083                 pixelPipe->pixelPipe(i, j, (RIfloat)coverage/(RIfloat)numSamples, c);
       
  2084             }
       
  2085         }
       
  2086     }
       
  2087     RI_DELETE_ARRAY(covBuffer);
       
  2088 }
       
  2089 
       
  2090 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2091 void RI_APIENTRY do_vgRenderToMask(VGPath path, VGbitfield paintModes, VGMaskOperation operation)
       
  2092 #else
       
  2093 void RI_APIENTRY vgRenderToMask(VGPath path, VGbitfield paintModes, VGMaskOperation operation)
       
  2094 #endif
       
  2095 {
       
  2096 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2097 	RI_IF_ERROR(!context->isValidPath(path), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2098 	RI_IF_ERROR(!paintModes || (paintModes & ~(VG_FILL_PATH | VG_STROKE_PATH)), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//invalid paint mode
       
  2099 	RI_IF_ERROR(operation < VG_CLEAR_MASK || operation > VG_SUBTRACT_MASK, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2100     Drawable* curr = context->getCurrentDrawable();
       
  2101     if(!curr || !curr->getMaskBuffer())
       
  2102     {
       
  2103         RI_RETURN(RI_NO_RETVAL);	//no EGL surface is current at the moment or context has no mask buffer
       
  2104     }
       
  2105 
       
  2106     if(operation == VG_CLEAR_MASK || operation == VG_FILL_MASK)
       
  2107     {
       
  2108         Surface* dummy = NULL;
       
  2109         curr->getMaskBuffer()->mask(dummy, operation, 0, 0, curr->getWidth(), curr->getHeight());
       
  2110         RI_RETURN(RI_NO_RETVAL);
       
  2111     }
       
  2112 
       
  2113 	try
       
  2114 	{
       
  2115         Drawable drawable(Color::formatToDescriptor(VG_A_8), curr->getWidth(), curr->getHeight(), curr->getNumSamples(), 1);    //TODO 0 mask bits (mask buffer is not used)
       
  2116 
       
  2117         Rasterizer rasterizer;
       
  2118         if(context->m_scissoring)
       
  2119             rasterizer.setScissor(context->m_scissor);	//throws bad_alloc
       
  2120         int numSamples = rasterizer.setupSamplingPattern(context->m_renderingQuality, drawable.getNumSamples());
       
  2121 
       
  2122         PixelPipe pixelPipe;
       
  2123         pixelPipe.setDrawable(&drawable);
       
  2124         pixelPipe.setMask(false);
       
  2125         pixelPipe.setPaint(NULL);   //use default paint (solid color alpha = 1)
       
  2126         pixelPipe.setBlendMode(VG_BLEND_SRC);   //write solid color * coverage to dest
       
  2127 
       
  2128         Matrix3x3 userToSurface = context->m_pathUserToSurface;
       
  2129         userToSurface[2].set(0,0,1);	//force affinity
       
  2130 
       
  2131         if(paintModes & VG_FILL_PATH)
       
  2132         {
       
  2133             drawable.getColorBuffer()->clear(Color(0,0,0,0,drawable.getColorBuffer()->getDescriptor().internalFormat), 0, 0, drawable.getWidth(), drawable.getHeight());
       
  2134             ((Path*)path)->fill(userToSurface, rasterizer);	//throws bad_alloc
       
  2135             rasterizer.setup(0, 0, drawable.getWidth(), drawable.getHeight(), context->m_fillRule, &pixelPipe, NULL);
       
  2136             rasterizer.fill();	//throws bad_alloc
       
  2137             curr->getMaskBuffer()->mask(drawable.getColorBuffer(), operation, 0, 0, drawable.getWidth(), drawable.getHeight());
       
  2138         }
       
  2139 
       
  2140         if(paintModes & VG_STROKE_PATH && context->m_strokeLineWidth > 0.0f)
       
  2141         {
       
  2142             drawable.getColorBuffer()->clear(Color(0,0,0,0,drawable.getColorBuffer()->getDescriptor().internalFormat), 0, 0, drawable.getWidth(), drawable.getHeight());
       
  2143             renderStroke(context, drawable.getWidth(), drawable.getHeight(), numSamples, (Path*)path, rasterizer, &pixelPipe, userToSurface);
       
  2144             curr->getMaskBuffer()->mask(drawable.getColorBuffer(), operation, 0, 0, drawable.getWidth(), drawable.getHeight());
       
  2145         }
       
  2146 	}
       
  2147 	catch(std::bad_alloc)
       
  2148 	{
       
  2149 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2150 	}
       
  2151 	RI_RETURN(RI_NO_RETVAL);
       
  2152 }
       
  2153 
       
  2154 /*-------------------------------------------------------------------*//*!
       
  2155 * \brief	
       
  2156 * \param	
       
  2157 * \return	
       
  2158 * \note		
       
  2159 *//*-------------------------------------------------------------------*/
       
  2160 
       
  2161 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2162 VGMaskLayer RI_APIENTRY do_vgCreateMaskLayer(VGint width, VGint height)
       
  2163 #else
       
  2164 VGMaskLayer RI_APIENTRY vgCreateMaskLayer(VGint width, VGint height)
       
  2165 #endif
       
  2166 {
       
  2167 	RI_GET_CONTEXT(VG_INVALID_HANDLE);
       
  2168 	RI_IF_ERROR(width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, VG_INVALID_HANDLE);
       
  2169 	RI_IF_ERROR(width > RI_MAX_IMAGE_WIDTH || height > RI_MAX_IMAGE_HEIGHT || width*height > RI_MAX_IMAGE_PIXELS ||
       
  2170 				width*height > RI_MAX_IMAGE_BYTES, VG_ILLEGAL_ARGUMENT_ERROR, VG_INVALID_HANDLE);
       
  2171     Drawable* curr = context->getCurrentDrawable();
       
  2172     if(!curr || !curr->getMaskBuffer())
       
  2173         RI_RETURN(VG_INVALID_HANDLE);   //no current drawing surface
       
  2174 
       
  2175 	Surface* layer = NULL;
       
  2176 	try
       
  2177 	{
       
  2178 		layer = RI_NEW(Surface, (Color::formatToDescriptor(VG_A_8), width, height, curr->getNumSamples()));	//throws bad_alloc
       
  2179 		RI_ASSERT(layer);
       
  2180 		context->m_maskLayerManager->addResource(layer, context);	//throws bad_alloc
       
  2181         layer->clear(Color(1,1,1,1,Color::sRGBA), 0, 0, width, height);
       
  2182 		RI_RETURN((VGMaskLayer)layer);
       
  2183 	}
       
  2184 	catch(std::bad_alloc)
       
  2185 	{
       
  2186 		RI_DELETE(layer);
       
  2187 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2188 		RI_RETURN(VG_INVALID_HANDLE);
       
  2189 	}
       
  2190 }
       
  2191 
       
  2192 /*-------------------------------------------------------------------*//*!
       
  2193 * \brief	
       
  2194 * \param	
       
  2195 * \return	
       
  2196 * \note		
       
  2197 *//*-------------------------------------------------------------------*/
       
  2198 
       
  2199 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2200 void RI_APIENTRY do_vgDestroyMaskLayer(VGMaskLayer maskLayer)
       
  2201 #else
       
  2202 void RI_APIENTRY vgDestroyMaskLayer(VGMaskLayer maskLayer)
       
  2203 #endif
       
  2204 {
       
  2205 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2206 	RI_IF_ERROR(!context->isValidMaskLayer(maskLayer), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid handle
       
  2207 
       
  2208 	context->m_maskLayerManager->removeResource((Surface*)maskLayer);
       
  2209 	RI_RETURN(RI_NO_RETVAL);
       
  2210 }
       
  2211 
       
  2212 /*-------------------------------------------------------------------*//*!
       
  2213 * \brief	
       
  2214 * \param	
       
  2215 * \return	
       
  2216 * \note		
       
  2217 *//*-------------------------------------------------------------------*/
       
  2218 
       
  2219 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2220 void RI_APIENTRY do_vgFillMaskLayer(VGMaskLayer maskLayer, VGint x, VGint y, VGint width, VGint height, VGfloat value)
       
  2221 #else
       
  2222 void RI_APIENTRY vgFillMaskLayer(VGMaskLayer maskLayer, VGint x, VGint y, VGint width, VGint height, VGfloat value)
       
  2223 #endif
       
  2224 {
       
  2225 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2226 	RI_IF_ERROR(!context->isValidMaskLayer(maskLayer), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid handle
       
  2227     RI_IF_ERROR(value < 0.0f || value > 1.0f, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2228     Surface* layer = (Surface*)maskLayer;
       
  2229     RI_IF_ERROR(width <= 0 || height <= 0 || x < 0 || y < 0 || x > layer->getWidth()-width || y > layer->getHeight()-height, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2230     layer->clear(Color(1,1,1,value,Color::sRGBA), x, y, width, height);
       
  2231 	RI_RETURN(RI_NO_RETVAL);
       
  2232 }
       
  2233 
       
  2234 /*-------------------------------------------------------------------*//*!
       
  2235 * \brief	
       
  2236 * \param	
       
  2237 * \return	
       
  2238 * \note		
       
  2239 *//*-------------------------------------------------------------------*/
       
  2240 
       
  2241 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2242 void RI_APIENTRY do_vgCopyMask(VGMaskLayer maskLayer, VGint dx, VGint dy, VGint sx, VGint sy, VGint width, VGint height)
       
  2243 #else
       
  2244 void RI_APIENTRY vgCopyMask(VGMaskLayer maskLayer, VGint dx, VGint dy, VGint sx, VGint sy, VGint width, VGint height)
       
  2245 #endif
       
  2246 {
       
  2247 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2248 	RI_IF_ERROR(!context->isValidMaskLayer(maskLayer), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid handle
       
  2249     Drawable* drawable = context->getCurrentDrawable();
       
  2250     if(!drawable || !drawable->getMaskBuffer())
       
  2251     {
       
  2252         RI_RETURN(RI_NO_RETVAL);	//no EGL surface is current at the moment or context has no mask buffer
       
  2253     }
       
  2254     Surface* layer = (Surface*)maskLayer;
       
  2255     RI_IF_ERROR(width <= 0 || height <= 0 || drawable->getNumSamples() != layer->getNumSamples(), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2256     try
       
  2257     {   //copy drawing surface mask to mask layer
       
  2258         layer->blit(drawable->getMaskBuffer(), sx, sy, dx, dy, width, height);	//throws bad_alloc
       
  2259     }
       
  2260 	catch(std::bad_alloc)
       
  2261 	{
       
  2262 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2263 	}
       
  2264     RI_RETURN(RI_NO_RETVAL);
       
  2265 }
       
  2266 
       
  2267 /*-------------------------------------------------------------------*//*!
       
  2268 * \brief	
       
  2269 * \param	
       
  2270 * \return	
       
  2271 * \note		
       
  2272 *//*-------------------------------------------------------------------*/
       
  2273 
       
  2274 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2275 void RI_APIENTRY do_vgClear(VGint x, VGint y, VGint width, VGint height)
       
  2276 #else
       
  2277 void RI_APIENTRY vgClear(VGint x, VGint y, VGint width, VGint height)
       
  2278 #endif
       
  2279 {
       
  2280 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2281 	RI_IF_ERROR(width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2282     Drawable* drawable = context->getCurrentDrawable();
       
  2283     if(!drawable)
       
  2284     {
       
  2285         RI_RETURN(RI_NO_RETVAL);	//no EGL surface is current at the moment
       
  2286     }
       
  2287 
       
  2288 	try
       
  2289 	{
       
  2290 		if(context->m_scissoring)
       
  2291 			drawable->getColorBuffer()->clear(context->m_clearColor, x, y, width, height, context->m_scissor);	//throws bad_alloc
       
  2292 		else
       
  2293 			drawable->getColorBuffer()->clear(context->m_clearColor, x, y, width, height);
       
  2294 	}
       
  2295 	catch(std::bad_alloc)
       
  2296 	{
       
  2297 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2298 	}
       
  2299 	RI_RETURN(RI_NO_RETVAL);
       
  2300 }
       
  2301 
       
  2302 /*-------------------------------------------------------------------*//*!
       
  2303 * \brief	
       
  2304 * \param	
       
  2305 * \return	
       
  2306 * \note		
       
  2307 *//*-------------------------------------------------------------------*/
       
  2308 
       
  2309 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2310 VGPath RI_APIENTRY do_vgCreatePath(VGint pathFormat, VGPathDatatype datatype, VGfloat scale, VGfloat bias, VGint segmentCapacityHint, VGint coordCapacityHint, VGbitfield capabilities)
       
  2311 #else
       
  2312 VGPath RI_APIENTRY vgCreatePath(VGint pathFormat, VGPathDatatype datatype, VGfloat scale, VGfloat bias, VGint segmentCapacityHint, VGint coordCapacityHint, VGbitfield capabilities)
       
  2313 #endif
       
  2314 {
       
  2315 	RI_GET_CONTEXT(VG_INVALID_HANDLE);
       
  2316 	RI_IF_ERROR(pathFormat != VG_PATH_FORMAT_STANDARD, VG_UNSUPPORTED_PATH_FORMAT_ERROR, VG_INVALID_HANDLE);
       
  2317 	RI_IF_ERROR(datatype < VG_PATH_DATATYPE_S_8 || datatype > VG_PATH_DATATYPE_F, VG_ILLEGAL_ARGUMENT_ERROR, VG_INVALID_HANDLE);
       
  2318 	RIfloat s = inputFloat(scale);
       
  2319 	RIfloat b = inputFloat(bias);
       
  2320 	RI_IF_ERROR(s == 0.0f, VG_ILLEGAL_ARGUMENT_ERROR, VG_INVALID_HANDLE);
       
  2321 	capabilities &= VG_PATH_CAPABILITY_ALL;	//undefined bits are ignored
       
  2322 
       
  2323 	Path* path = NULL;
       
  2324 	try
       
  2325 	{
       
  2326 		path = RI_NEW(Path, (pathFormat, datatype, s, b, segmentCapacityHint, coordCapacityHint, capabilities));	//throws bad_alloc
       
  2327 		RI_ASSERT(path);
       
  2328 		context->m_pathManager->addResource(path, context);	//throws bad_alloc
       
  2329 		RI_RETURN((VGPath)path);
       
  2330 	}
       
  2331 	catch(std::bad_alloc)
       
  2332 	{
       
  2333 		RI_DELETE(path);
       
  2334 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2335 		RI_RETURN(VG_INVALID_HANDLE);
       
  2336 	}
       
  2337 }
       
  2338 
       
  2339 /*-------------------------------------------------------------------*//*!
       
  2340 * \brief	
       
  2341 * \param	
       
  2342 * \return	
       
  2343 * \note		
       
  2344 *//*-------------------------------------------------------------------*/
       
  2345 
       
  2346 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2347 void RI_APIENTRY do_vgClearPath(VGPath path, VGbitfield capabilities)
       
  2348 #else
       
  2349 void RI_APIENTRY vgClearPath(VGPath path, VGbitfield capabilities)
       
  2350 #endif
       
  2351 {
       
  2352 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2353 	RI_IF_ERROR(!context->isValidPath(path), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2354 	capabilities &= VG_PATH_CAPABILITY_ALL;	//undefined bits are ignored
       
  2355 	((Path*)path)->clear(capabilities);
       
  2356 	RI_RETURN(RI_NO_RETVAL);
       
  2357 }
       
  2358 
       
  2359 /*-------------------------------------------------------------------*//*!
       
  2360 * \brief	
       
  2361 * \param	
       
  2362 * \return	
       
  2363 * \note		
       
  2364 *//*-------------------------------------------------------------------*/
       
  2365 
       
  2366 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2367 void RI_APIENTRY do_vgDestroyPath(VGPath path)
       
  2368 #else
       
  2369 void RI_APIENTRY vgDestroyPath(VGPath path)
       
  2370 #endif
       
  2371 {
       
  2372 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2373 	RI_IF_ERROR(!context->isValidPath(path), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2374 
       
  2375 	context->m_pathManager->removeResource((Path*)path);
       
  2376 
       
  2377 	RI_RETURN(RI_NO_RETVAL);
       
  2378 }
       
  2379 
       
  2380 /*-------------------------------------------------------------------*//*!
       
  2381 * \brief	
       
  2382 * \param	
       
  2383 * \return	
       
  2384 * \note		
       
  2385 *//*-------------------------------------------------------------------*/
       
  2386 
       
  2387 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2388 void RI_APIENTRY do_vgRemovePathCapabilities(VGPath path, VGbitfield capabilities)
       
  2389 #else
       
  2390 void RI_APIENTRY vgRemovePathCapabilities(VGPath path, VGbitfield capabilities)
       
  2391 #endif
       
  2392 {
       
  2393 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2394 	RI_IF_ERROR(!context->isValidPath(path), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2395 	capabilities &= VG_PATH_CAPABILITY_ALL;	//undefined bits are ignored
       
  2396 
       
  2397 	VGbitfield caps = ((Path*)path)->getCapabilities();
       
  2398 	caps &= ~capabilities;
       
  2399 	((Path*)path)->setCapabilities(caps);
       
  2400 	RI_RETURN(RI_NO_RETVAL);
       
  2401 }
       
  2402 
       
  2403 /*-------------------------------------------------------------------*//*!
       
  2404 * \brief	
       
  2405 * \param	
       
  2406 * \return	
       
  2407 * \note		
       
  2408 *//*-------------------------------------------------------------------*/
       
  2409 
       
  2410 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2411 VGbitfield RI_APIENTRY do_vgGetPathCapabilities(VGPath path)
       
  2412 #else
       
  2413 VGbitfield RI_APIENTRY vgGetPathCapabilities(VGPath path)
       
  2414 #endif
       
  2415 {
       
  2416 	RI_GET_CONTEXT(0);
       
  2417 	RI_IF_ERROR(!context->isValidPath(path), VG_BAD_HANDLE_ERROR, 0);	//invalid path handle
       
  2418 	VGbitfield ret = ((Path*)path)->getCapabilities();
       
  2419 	RI_RETURN(ret);
       
  2420 }
       
  2421 
       
  2422 /*-------------------------------------------------------------------*//*!
       
  2423 * \brief	
       
  2424 * \param	
       
  2425 * \return	
       
  2426 * \note		
       
  2427 *//*-------------------------------------------------------------------*/
       
  2428 
       
  2429 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2430 void RI_APIENTRY do_vgAppendPathData(VGPath dstPath, VGint numSegments, const VGubyte * pathSegments, const void * pathData)
       
  2431 #else
       
  2432 void RI_APIENTRY vgAppendPathData(VGPath dstPath, VGint numSegments, const VGubyte * pathSegments, const void * pathData)
       
  2433 #endif
       
  2434 {
       
  2435 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2436 	RI_IF_ERROR(!context->isValidPath(dstPath), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2437 	Path* p = (Path*)dstPath;
       
  2438 	RI_IF_ERROR(!(p->getCapabilities() & VG_PATH_CAPABILITY_APPEND_TO), VG_PATH_CAPABILITY_ERROR, RI_NO_RETVAL);	//no append cap
       
  2439 	RI_IF_ERROR(numSegments <= 0 || !pathSegments || !pathData, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//no segments or data
       
  2440 	RI_IF_ERROR((p->getDatatype() == VG_PATH_DATATYPE_S_16 && !isAligned(pathData,2)) ||
       
  2441 				((p->getDatatype() == VG_PATH_DATATYPE_S_32 || p->getDatatype() == VG_PATH_DATATYPE_F) && !isAligned(pathData,4)),
       
  2442 				VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//invalid alignment
       
  2443 	for(int i=0;i<numSegments;i++)
       
  2444 	{
       
  2445 		VGPathSegment c = (VGPathSegment)(pathSegments[i] & 0x1e);
       
  2446 		RI_IF_ERROR(c < VG_CLOSE_PATH || c > VG_LCWARC_TO, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//invalid segment
       
  2447 		RI_IF_ERROR(c & ~0x1f, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//reserved bits are nonzero
       
  2448 	}
       
  2449 
       
  2450 	try
       
  2451 	{
       
  2452 		p->appendData((const RIuint8*)pathSegments, numSegments, (const RIuint8*)pathData);	//throws bad_alloc
       
  2453 	}
       
  2454 	catch(std::bad_alloc)
       
  2455 	{
       
  2456 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2457 	}
       
  2458 	RI_RETURN(RI_NO_RETVAL);
       
  2459 }
       
  2460 
       
  2461 /*-------------------------------------------------------------------*//*!
       
  2462 * \brief	
       
  2463 * \param	
       
  2464 * \return	
       
  2465 * \note		
       
  2466 *//*-------------------------------------------------------------------*/
       
  2467 
       
  2468 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2469 void RI_APIENTRY do_vgModifyPathCoords(VGPath dstPath, VGint startIndex, VGint numSegments, const void * pathData)
       
  2470 #else
       
  2471 void RI_APIENTRY vgModifyPathCoords(VGPath dstPath, VGint startIndex, VGint numSegments, const void * pathData)
       
  2472 #endif
       
  2473 
       
  2474 {
       
  2475 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2476 	RI_IF_ERROR(!context->isValidPath(dstPath), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2477 	Path* p = (Path*)dstPath;
       
  2478 	RI_IF_ERROR(!(p->getCapabilities() & VG_PATH_CAPABILITY_MODIFY), VG_PATH_CAPABILITY_ERROR, RI_NO_RETVAL);	//no modify cap
       
  2479 	RI_IF_ERROR(!pathData || startIndex < 0 || numSegments <= 0 || RI_INT_ADDSATURATE(startIndex, numSegments) > p->getNumSegments(), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//no segments
       
  2480 	RI_IF_ERROR((p->getDatatype() == VG_PATH_DATATYPE_S_16 && !isAligned(pathData,2)) ||
       
  2481 				((p->getDatatype() == VG_PATH_DATATYPE_S_32 || p->getDatatype() == VG_PATH_DATATYPE_F) && !isAligned(pathData,4)),
       
  2482 				VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//invalid alignment
       
  2483 	p->modifyCoords(startIndex, numSegments, (const RIuint8*)pathData);
       
  2484 	RI_RETURN(RI_NO_RETVAL);
       
  2485 }
       
  2486 
       
  2487 /*-------------------------------------------------------------------*//*!
       
  2488 * \brief	
       
  2489 * \param	
       
  2490 * \return	
       
  2491 * \note		
       
  2492 *//*-------------------------------------------------------------------*/
       
  2493 
       
  2494 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2495 void RI_APIENTRY do_vgAppendPath(VGPath dstPath, VGPath srcPath)
       
  2496 #else
       
  2497 void RI_APIENTRY vgAppendPath(VGPath dstPath, VGPath srcPath)
       
  2498 #endif
       
  2499 
       
  2500 {
       
  2501 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2502 	RI_IF_ERROR(!context->isValidPath(dstPath) || !context->isValidPath(srcPath), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2503 	RI_IF_ERROR(!(((Path*)dstPath)->getCapabilities() & VG_PATH_CAPABILITY_APPEND_TO) ||
       
  2504 				!(((Path*)srcPath)->getCapabilities() & VG_PATH_CAPABILITY_APPEND_FROM), VG_PATH_CAPABILITY_ERROR, RI_NO_RETVAL);	//invalid caps
       
  2505 
       
  2506 	try
       
  2507 	{
       
  2508 		((Path*)dstPath)->append((Path*)srcPath);	//throws bad_alloc
       
  2509 	}
       
  2510 	catch(std::bad_alloc)
       
  2511 	{
       
  2512 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2513 	}
       
  2514 	RI_RETURN(RI_NO_RETVAL);
       
  2515 }
       
  2516 
       
  2517 /*-------------------------------------------------------------------*//*!
       
  2518 * \brief	
       
  2519 * \param	
       
  2520 * \return	
       
  2521 * \note		
       
  2522 *//*-------------------------------------------------------------------*/
       
  2523 
       
  2524 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2525 void RI_APIENTRY do_vgTransformPath(VGPath dstPath, VGPath srcPath)
       
  2526 #else
       
  2527 void RI_APIENTRY vgTransformPath(VGPath dstPath, VGPath srcPath)
       
  2528 #endif
       
  2529 
       
  2530 {
       
  2531 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2532 	RI_IF_ERROR(!context->isValidPath(dstPath) || !context->isValidPath(srcPath), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2533 	RI_IF_ERROR(!(((Path*)dstPath)->getCapabilities() & VG_PATH_CAPABILITY_TRANSFORM_TO) ||
       
  2534 				!(((Path*)srcPath)->getCapabilities() & VG_PATH_CAPABILITY_TRANSFORM_FROM), VG_PATH_CAPABILITY_ERROR, RI_NO_RETVAL);	//invalid caps
       
  2535 	try
       
  2536 	{
       
  2537 		((Path*)dstPath)->transform((Path*)srcPath, context->m_pathUserToSurface);	//throws bad_alloc
       
  2538 	}
       
  2539 	catch(std::bad_alloc)
       
  2540 	{
       
  2541 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2542 	}
       
  2543 	RI_RETURN(RI_NO_RETVAL);
       
  2544 }
       
  2545 
       
  2546 /*-------------------------------------------------------------------*//*!
       
  2547 * \brief	
       
  2548 * \param	
       
  2549 * \return	
       
  2550 * \note		
       
  2551 *//*-------------------------------------------------------------------*/
       
  2552 
       
  2553 static bool drawPath(VGContext* context, VGPath path, const Matrix3x3& userToSurfaceMatrix, VGbitfield paintModes)
       
  2554 {
       
  2555 	//set up rendering surface and mask buffer
       
  2556     Drawable* drawable = context->getCurrentDrawable();
       
  2557     RDebug::Printf(" ***************** In drawPath,Drawable addr is %x  $$$$$$$$$$$$$ ",drawable);
       
  2558     RDebug::Printf(" $$$$$$$$$$$$$ In drawPath,VGContext addr is %x  $$$$$$$$$$$$$ ",context);
       
  2559     RDebug::Printf(" $$$$$$$$$$$$$ In drawPath,Widthis %d  $$$$$$$$$$$$$ ",drawable->getWidth());
       
  2560     RDebug::Printf(" $$$$$$$$$$$$$ In drawPath,Height is %d  $$$$$$$$$$$$$ ",drawable->getHeight());
       
  2561        
       
  2562     if(!drawable)
       
  2563         return false;   //no EGL surface is current at the moment
       
  2564 
       
  2565 	Rasterizer rasterizer;
       
  2566 	if(context->m_scissoring)
       
  2567 		rasterizer.setScissor(context->m_scissor);	//throws bad_alloc
       
  2568 	int numSamples = rasterizer.setupSamplingPattern(context->m_renderingQuality, drawable->getNumSamples());
       
  2569 
       
  2570 	PixelPipe pixelPipe;
       
  2571 	pixelPipe.setDrawable(drawable);
       
  2572 	pixelPipe.setMask(context->m_masking ? true : false);
       
  2573 	pixelPipe.setBlendMode(context->m_blendMode);
       
  2574 	pixelPipe.setTileFillColor(context->m_tileFillColor);
       
  2575 	pixelPipe.setImageQuality(context->m_imageQuality);
       
  2576     pixelPipe.setColorTransform(context->m_colorTransform ? true : false, context->m_colorTransformValues);
       
  2577 
       
  2578 	Matrix3x3 userToSurface = userToSurfaceMatrix;
       
  2579 	userToSurface[2].set(0,0,1);	//force affinity
       
  2580 
       
  2581 	if(paintModes & VG_FILL_PATH)
       
  2582 	{
       
  2583 		pixelPipe.setPaint((Paint*)context->m_fillPaint);
       
  2584 
       
  2585 		Matrix3x3 surfaceToPaintMatrix = userToSurface * context->m_fillPaintToUser;
       
  2586 		if(surfaceToPaintMatrix.invert())
       
  2587 		{
       
  2588 			surfaceToPaintMatrix[2].set(0,0,1);		//force affinity
       
  2589 			pixelPipe.setSurfaceToPaintMatrix(surfaceToPaintMatrix);
       
  2590 
       
  2591             rasterizer.setup(0, 0, drawable->getWidth(), drawable->getHeight(), context->m_fillRule, &pixelPipe, NULL);
       
  2592 			((Path*)path)->fill(userToSurface, rasterizer);	//throws bad_alloc
       
  2593 			rasterizer.fill();	//throws bad_alloc
       
  2594 		}
       
  2595 	}
       
  2596 
       
  2597 	if(paintModes & VG_STROKE_PATH && context->m_strokeLineWidth > 0.0f)
       
  2598 	{
       
  2599 		pixelPipe.setPaint((Paint*)context->m_strokePaint);
       
  2600 
       
  2601 		Matrix3x3 surfaceToPaintMatrix = userToSurface * context->m_strokePaintToUser;
       
  2602 		if(surfaceToPaintMatrix.invert())
       
  2603 		{
       
  2604 			surfaceToPaintMatrix[2].set(0,0,1);		//force affinity
       
  2605 			pixelPipe.setSurfaceToPaintMatrix(surfaceToPaintMatrix);
       
  2606 			RDebug::Printf(" $$$$$$$$$$$$$ In drawPath,Widthis %d  $$$$$$$$$$$$$ ",drawable->getWidth());
       
  2607 			RDebug::Printf(" $$$$$$$$$$$$$ In drawPath,Height is %d  $$$$$$$$$$$$$ ",drawable->getHeight());
       
  2608             renderStroke(context, drawable->getWidth(), drawable->getHeight(), numSamples, (Path*)path, rasterizer, &pixelPipe, userToSurface);
       
  2609 		}
       
  2610 	}
       
  2611 	return true;
       
  2612 }
       
  2613 
       
  2614 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2615 void RI_APIENTRY do_vgDrawPath(VGPath path, VGbitfield paintModes)
       
  2616 #else
       
  2617 void RI_APIENTRY vgDrawPath(VGPath path, VGbitfield paintModes)
       
  2618 #endif
       
  2619 
       
  2620 {
       
  2621 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2622 	RI_IF_ERROR(!context->isValidPath(path), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2623 	RI_IF_ERROR(!paintModes || (paintModes & ~(VG_FILL_PATH | VG_STROKE_PATH)), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//invalid paint mode
       
  2624 
       
  2625 	try
       
  2626 	{
       
  2627 		if(!drawPath(context, path, context->m_pathUserToSurface, paintModes))
       
  2628 		{
       
  2629 			RI_RETURN(RI_NO_RETVAL);
       
  2630 		}
       
  2631 	}
       
  2632 	catch(std::bad_alloc)
       
  2633 	{
       
  2634 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2635 	}
       
  2636 	RI_RETURN(RI_NO_RETVAL);
       
  2637 }
       
  2638 
       
  2639 /*-------------------------------------------------------------------*//*!
       
  2640 * \brief	
       
  2641 * \param	
       
  2642 * \return	
       
  2643 * \note		
       
  2644 *//*-------------------------------------------------------------------*/
       
  2645 
       
  2646 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2647 VGfloat RI_APIENTRY do_vgPathLength(VGPath path, VGint startSegment, VGint numSegments)
       
  2648 #else
       
  2649 VGfloat RI_APIENTRY vgPathLength(VGPath path, VGint startSegment, VGint numSegments)
       
  2650 #endif
       
  2651 
       
  2652 {
       
  2653 	RI_GET_CONTEXT(-1.0f);
       
  2654 	RI_IF_ERROR(!context->isValidPath(path), VG_BAD_HANDLE_ERROR, -1.0f);	//invalid path handle
       
  2655 	Path* p = (Path*)path;
       
  2656 	RI_IF_ERROR(!(p->getCapabilities() & VG_PATH_CAPABILITY_PATH_LENGTH), VG_PATH_CAPABILITY_ERROR, -1.0f);	//invalid caps
       
  2657 	RI_IF_ERROR(startSegment < 0 || numSegments <= 0 || RI_INT_ADDSATURATE(startSegment, numSegments) > p->getNumSegments(), VG_ILLEGAL_ARGUMENT_ERROR, -1.0f);
       
  2658 	RIfloat pathLength = -1.0f;
       
  2659 	try
       
  2660 	{
       
  2661 		pathLength = p->getPathLength(startSegment, numSegments);	//throws bad_alloc
       
  2662 	}
       
  2663 	catch(std::bad_alloc)
       
  2664 	{
       
  2665 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2666 	}
       
  2667 	RI_RETURN(pathLength);
       
  2668 }
       
  2669 
       
  2670 /*-------------------------------------------------------------------*//*!
       
  2671 * \brief	
       
  2672 * \param	
       
  2673 * \return	
       
  2674 * \note		
       
  2675 *//*-------------------------------------------------------------------*/
       
  2676 
       
  2677 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2678 void RI_APIENTRY do_vgPointAlongPath(VGPath path, VGint startSegment, VGint numSegments, VGfloat distance, VGfloat * x, VGfloat * y, VGfloat * tangentX, VGfloat * tangentY)
       
  2679 #else
       
  2680 void RI_APIENTRY vgPointAlongPath(VGPath path, VGint startSegment, VGint numSegments, VGfloat distance, VGfloat * x, VGfloat * y, VGfloat * tangentX, VGfloat * tangentY)
       
  2681 #endif
       
  2682 
       
  2683 {
       
  2684 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2685 	RI_IF_ERROR(!context->isValidPath(path), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2686 	Path* p = (Path*)path;
       
  2687 	RI_IF_ERROR((x && y && !(p->getCapabilities() & VG_PATH_CAPABILITY_POINT_ALONG_PATH)) ||
       
  2688 				(tangentX && tangentY && !(p->getCapabilities() & VG_PATH_CAPABILITY_TANGENT_ALONG_PATH)), VG_PATH_CAPABILITY_ERROR, RI_NO_RETVAL);	//invalid caps
       
  2689 	RI_IF_ERROR(startSegment < 0 || numSegments <= 0 || RI_INT_ADDSATURATE(startSegment, numSegments) > p->getNumSegments(), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2690 	RI_IF_ERROR(!isAligned(x,4) || !isAligned(y,4) || !isAligned(tangentX,4) || !isAligned(tangentY,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2691 	try
       
  2692 	{
       
  2693 		Vector2 point, tangent;
       
  2694 		p->getPointAlong(startSegment, numSegments, distance, point, tangent);	//throws bad_alloc
       
  2695 		if(x && y)
       
  2696 		{
       
  2697 			*x = point.x;
       
  2698 			*y = point.y;
       
  2699 		}
       
  2700 		if(tangentX && tangentY)
       
  2701 		{
       
  2702 			tangent.normalize();
       
  2703 			*tangentX = tangent.x;
       
  2704 			*tangentY = tangent.y;
       
  2705 		}
       
  2706 	}
       
  2707 	catch(std::bad_alloc)
       
  2708 	{
       
  2709 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2710 	}
       
  2711 	RI_RETURN(RI_NO_RETVAL);
       
  2712 }
       
  2713 
       
  2714 /*-------------------------------------------------------------------*//*!
       
  2715 * \brief	
       
  2716 * \param	
       
  2717 * \return	
       
  2718 * \note		
       
  2719 *//*-------------------------------------------------------------------*/
       
  2720 
       
  2721 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2722 void RI_APIENTRY do_vgPathBounds(VGPath path, VGfloat * minx, VGfloat * miny, VGfloat * width, VGfloat * height)
       
  2723 #else
       
  2724 void RI_APIENTRY vgPathBounds(VGPath path, VGfloat * minx, VGfloat * miny, VGfloat * width, VGfloat * height)
       
  2725 #endif
       
  2726 
       
  2727 {
       
  2728 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2729 	RI_IF_ERROR(!context->isValidPath(path), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2730 	RI_IF_ERROR(!(((Path*)path)->getCapabilities() & VG_PATH_CAPABILITY_PATH_BOUNDS), VG_PATH_CAPABILITY_ERROR, RI_NO_RETVAL);	//invalid caps
       
  2731 	RI_IF_ERROR(!minx || !miny || !width || !height, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2732 	RI_IF_ERROR(!isAligned(minx,4) || !isAligned(miny,4) || !isAligned(width,4) || !isAligned(height,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2733 	try
       
  2734 	{
       
  2735 		RIfloat pminx,pminy,pmaxx,pmaxy;
       
  2736 		((Path*)path)->getPathBounds(pminx, pminy, pmaxx, pmaxy);	//throws bad_alloc
       
  2737 		*minx = pminx;
       
  2738 		*miny = pminy;
       
  2739 		*width = pmaxx - pminx;
       
  2740 		*height = pmaxy - pminy;
       
  2741 	}
       
  2742 	catch(std::bad_alloc)
       
  2743 	{
       
  2744 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2745 	}
       
  2746 	RI_RETURN(RI_NO_RETVAL);
       
  2747 }
       
  2748 
       
  2749 /*-------------------------------------------------------------------*//*!
       
  2750 * \brief	
       
  2751 * \param	
       
  2752 * \return	
       
  2753 * \note		
       
  2754 *//*-------------------------------------------------------------------*/
       
  2755 
       
  2756 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2757 void RI_APIENTRY do_vgPathTransformedBounds(VGPath path, VGfloat * minx, VGfloat * miny, VGfloat * width, VGfloat * height)
       
  2758 #else
       
  2759 void RI_APIENTRY vgPathTransformedBounds(VGPath path, VGfloat * minx, VGfloat * miny, VGfloat * width, VGfloat * height)
       
  2760 #endif
       
  2761 
       
  2762 {
       
  2763 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2764 	RI_IF_ERROR(!context->isValidPath(path), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  2765 	RI_IF_ERROR(!(((Path*)path)->getCapabilities() & VG_PATH_CAPABILITY_PATH_TRANSFORMED_BOUNDS), VG_PATH_CAPABILITY_ERROR, RI_NO_RETVAL);	//invalid caps
       
  2766 	RI_IF_ERROR(!minx || !miny || !width || !height, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2767 	RI_IF_ERROR(!isAligned(minx,4) || !isAligned(miny,4) || !isAligned(width,4) || !isAligned(height,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  2768 	try
       
  2769 	{
       
  2770 		RIfloat pminx, pminy, pmaxx, pmaxy;
       
  2771 		((Path*)path)->getPathTransformedBounds(context->m_pathUserToSurface, pminx, pminy, pmaxx, pmaxy);	//throws bad_alloc
       
  2772 		*minx = pminx;
       
  2773 		*miny = pminy;
       
  2774 		*width = pmaxx - pminx;
       
  2775 		*height = pmaxy - pminy;
       
  2776 	}
       
  2777 	catch(std::bad_alloc)
       
  2778 	{
       
  2779 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2780 	}
       
  2781 	RI_RETURN(RI_NO_RETVAL);
       
  2782 }
       
  2783 
       
  2784 /*-------------------------------------------------------------------*//*!
       
  2785 * \brief	
       
  2786 * \param	
       
  2787 * \return	
       
  2788 * \note		
       
  2789 *//*-------------------------------------------------------------------*/
       
  2790 
       
  2791 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2792 VGboolean RI_APIENTRY do_vgInterpolatePath(VGPath dstPath, VGPath startPath, VGPath endPath, VGfloat amount)
       
  2793 #else
       
  2794 VGboolean RI_APIENTRY vgInterpolatePath(VGPath dstPath, VGPath startPath, VGPath endPath, VGfloat amount)
       
  2795 #endif
       
  2796 
       
  2797 {
       
  2798 	RI_GET_CONTEXT(VG_FALSE);
       
  2799 	RI_IF_ERROR(!context->isValidPath(dstPath) || !context->isValidPath(startPath) || !context->isValidPath(endPath), VG_BAD_HANDLE_ERROR, VG_FALSE);	//invalid path handle
       
  2800 	RI_IF_ERROR(!(((Path*)dstPath)->getCapabilities() & VG_PATH_CAPABILITY_INTERPOLATE_TO) ||
       
  2801 				!(((Path*)startPath)->getCapabilities() & VG_PATH_CAPABILITY_INTERPOLATE_FROM) ||
       
  2802 				!(((Path*)endPath)->getCapabilities() & VG_PATH_CAPABILITY_INTERPOLATE_FROM), VG_PATH_CAPABILITY_ERROR, VG_FALSE);	//invalid caps
       
  2803 	VGboolean ret = VG_FALSE;
       
  2804 	try
       
  2805 	{
       
  2806 		if(((Path*)dstPath)->interpolate((const Path*)startPath, (const Path*)endPath, inputFloat(amount)))	//throws bad_alloc
       
  2807 			ret = VG_TRUE;
       
  2808 	}
       
  2809 	catch(std::bad_alloc)
       
  2810 	{
       
  2811 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2812 	}
       
  2813 	RI_RETURN(ret);
       
  2814 }
       
  2815 
       
  2816 /*-------------------------------------------------------------------*//*!
       
  2817 * \brief	
       
  2818 * \param	
       
  2819 * \return	
       
  2820 * \note		
       
  2821 *//*-------------------------------------------------------------------*/
       
  2822 
       
  2823 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2824 VGPaint RI_APIENTRY do_vgCreatePaint(void)
       
  2825 #else
       
  2826 VGPaint RI_APIENTRY vgCreatePaint(void)
       
  2827 #endif
       
  2828 
       
  2829 {
       
  2830 	RI_GET_CONTEXT(VG_INVALID_HANDLE);
       
  2831 	Paint* paint = NULL;
       
  2832 	try
       
  2833 	{
       
  2834 		paint = RI_NEW(Paint, ());	//throws bad_alloc
       
  2835 		RI_ASSERT(paint);
       
  2836 		context->m_paintManager->addResource(paint, context);	//throws bad_alloc
       
  2837 		RI_RETURN((VGPaint)paint);
       
  2838 	}
       
  2839 	catch(std::bad_alloc)
       
  2840 	{
       
  2841 		RI_DELETE(paint);
       
  2842 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  2843 		RI_RETURN(VG_INVALID_HANDLE);
       
  2844 	}
       
  2845 }
       
  2846 
       
  2847 /*-------------------------------------------------------------------*//*!
       
  2848 * \brief	
       
  2849 * \param	
       
  2850 * \return	
       
  2851 * \note		
       
  2852 *//*-------------------------------------------------------------------*/
       
  2853 
       
  2854 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2855 void RI_APIENTRY do_vgDestroyPaint(VGPaint paint)
       
  2856 #else
       
  2857 void RI_APIENTRY vgDestroyPaint(VGPaint paint)
       
  2858 #endif
       
  2859 
       
  2860 {
       
  2861 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2862 	RI_IF_ERROR(!context->isValidPaint(paint), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid paint handle
       
  2863 
       
  2864 	context->m_paintManager->removeResource((Paint*)paint);
       
  2865 
       
  2866 	RI_RETURN(RI_NO_RETVAL);
       
  2867 }
       
  2868 
       
  2869 /*-------------------------------------------------------------------*//*!
       
  2870 * \brief	
       
  2871 * \param	
       
  2872 * \return	
       
  2873 * \note		
       
  2874 *//*-------------------------------------------------------------------*/
       
  2875 
       
  2876 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2877 void RI_APIENTRY do_vgSetPaint(VGPaint paint, VGbitfield paintModes)
       
  2878 #else
       
  2879 void RI_APIENTRY vgSetPaint(VGPaint paint, VGbitfield paintModes)
       
  2880 #endif
       
  2881 
       
  2882 {
       
  2883 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2884 	RI_IF_ERROR(paint && !context->isValidPaint(paint), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid paint handle
       
  2885 	RI_IF_ERROR(!paintModes || paintModes & ~(VG_FILL_PATH | VG_STROKE_PATH), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//invalid paint mode
       
  2886 
       
  2887 	context->releasePaint(paintModes);
       
  2888 
       
  2889 	if(paintModes & VG_FILL_PATH)
       
  2890 	{
       
  2891 		if(paint)
       
  2892 			((Paint*)paint)->addReference();
       
  2893 		context->m_fillPaint = paint;
       
  2894 	}
       
  2895 	if(paintModes & VG_STROKE_PATH)
       
  2896 	{
       
  2897 		if(paint)
       
  2898 			((Paint*)paint)->addReference();
       
  2899 		context->m_strokePaint = paint;
       
  2900 	}
       
  2901 	RI_RETURN(RI_NO_RETVAL);
       
  2902 }
       
  2903 
       
  2904 /*-------------------------------------------------------------------*//*!
       
  2905 * \brief	
       
  2906 * \param	
       
  2907 * \return	
       
  2908 * \note		
       
  2909 *//*-------------------------------------------------------------------*/
       
  2910 
       
  2911 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2912 void RI_APIENTRY do_vgSetColor(VGPaint paint, VGuint rgba)
       
  2913 #else
       
  2914 void RI_APIENTRY vgSetColor(VGPaint paint, VGuint rgba)
       
  2915 #endif
       
  2916 
       
  2917 {
       
  2918 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2919 	RI_IF_ERROR(!context->isValidPaint(paint), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid paint handle
       
  2920 	Paint* p = (Paint*)paint;
       
  2921 	p->m_inputPaintColor.unpack(rgba, Color::formatToDescriptor(VG_sRGBA_8888));
       
  2922 	p->m_paintColor = inputColor(p->m_inputPaintColor);
       
  2923 	p->m_paintColor.clamp();
       
  2924 	p->m_paintColor.premultiply();
       
  2925 	RI_RETURN(RI_NO_RETVAL);
       
  2926 }
       
  2927 
       
  2928 /*-------------------------------------------------------------------*//*!
       
  2929 * \brief	
       
  2930 * \param	
       
  2931 * \return	
       
  2932 * \note		
       
  2933 *//*-------------------------------------------------------------------*/
       
  2934 
       
  2935 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2936 VGuint RI_APIENTRY do_vgGetColor(VGPaint paint)
       
  2937 #else
       
  2938 VGuint RI_APIENTRY vgGetColor(VGPaint paint)
       
  2939 #endif
       
  2940 
       
  2941 {
       
  2942 	RI_GET_CONTEXT(0);
       
  2943 	RI_IF_ERROR(!context->isValidPaint(paint), VG_BAD_HANDLE_ERROR, 0);	//invalid paint handle
       
  2944 	unsigned int ret = ((Paint*)paint)->m_inputPaintColor.pack(Color::formatToDescriptor(VG_sRGBA_8888));
       
  2945 	RI_RETURN(ret);
       
  2946 }
       
  2947 
       
  2948 /*-------------------------------------------------------------------*//*!
       
  2949 * \brief	
       
  2950 * \param	
       
  2951 * \return	
       
  2952 * \note		
       
  2953 *//*-------------------------------------------------------------------*/
       
  2954 
       
  2955 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2956 VGPaint RI_APIENTRY do_vgGetPaint(VGPaintMode paintMode)
       
  2957 #else
       
  2958 VGPaint RI_APIENTRY vgGetPaint(VGPaintMode paintMode)
       
  2959 #endif
       
  2960 
       
  2961 {
       
  2962 	RI_GET_CONTEXT(VG_INVALID_HANDLE);
       
  2963 	RI_IF_ERROR(paintMode != VG_FILL_PATH && paintMode != VG_STROKE_PATH, VG_ILLEGAL_ARGUMENT_ERROR, VG_INVALID_HANDLE);	//invalid paint mode
       
  2964 
       
  2965 	if(paintMode == VG_FILL_PATH)
       
  2966 	{
       
  2967 		RI_RETURN(context->m_fillPaint);
       
  2968 	}
       
  2969 	RI_RETURN(context->m_strokePaint);
       
  2970 }
       
  2971 
       
  2972 /*-------------------------------------------------------------------*//*!
       
  2973 * \brief	
       
  2974 * \param	
       
  2975 * \return	
       
  2976 * \note		
       
  2977 *//*-------------------------------------------------------------------*/
       
  2978 
       
  2979 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  2980 void RI_APIENTRY do_vgPaintPattern(VGPaint paint, VGImage image)
       
  2981 #else
       
  2982 void RI_APIENTRY vgPaintPattern(VGPaint paint, VGImage image)
       
  2983 #endif
       
  2984 {
       
  2985 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  2986 	RI_IF_ERROR(!context->isValidPaint(paint) || (image != VG_INVALID_HANDLE && !context->isValidImage(image)), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid handle
       
  2987 	Image* img = (Image*)image;
       
  2988 	Paint* pnt = (Paint*)paint;
       
  2989 	RI_IF_ERROR(image != VG_INVALID_HANDLE && eglvgIsInUse(img), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  2990 	Image* pattern = pnt->m_pattern;
       
  2991 	if(pattern)
       
  2992 	{
       
  2993 		pattern->removeInUse();
       
  2994 		if(!pattern->removeReference())
       
  2995 			RI_DELETE(pattern);
       
  2996 	}
       
  2997 	pnt->m_pattern = img;
       
  2998 	if(img)
       
  2999 	{
       
  3000 		img->addReference();
       
  3001 		img->addInUse();
       
  3002 	}
       
  3003 	RI_RETURN(RI_NO_RETVAL);
       
  3004 }
       
  3005 
       
  3006 /*-------------------------------------------------------------------*//*!
       
  3007 * \brief	
       
  3008 * \param	
       
  3009 * \return	
       
  3010 * \note		
       
  3011 *//*-------------------------------------------------------------------*/
       
  3012 
       
  3013 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3014 VGImage RI_APIENTRY do_vgCreateImage(VGImageFormat format, VGint width, VGint height, VGbitfield allowedQuality)
       
  3015 #else
       
  3016 VGImage RI_APIENTRY vgCreateImage(VGImageFormat format, VGint width, VGint height, VGbitfield allowedQuality)
       
  3017 #endif
       
  3018 {
       
  3019 	RI_GET_CONTEXT(VG_INVALID_HANDLE);
       
  3020 	RI_IF_ERROR(!isValidImageFormat(format), VG_UNSUPPORTED_IMAGE_FORMAT_ERROR, VG_INVALID_HANDLE);
       
  3021 	RI_IF_ERROR(width <= 0 || height <= 0 || !allowedQuality ||
       
  3022 				(allowedQuality & ~(VG_IMAGE_QUALITY_NONANTIALIASED | VG_IMAGE_QUALITY_FASTER | VG_IMAGE_QUALITY_BETTER)), VG_ILLEGAL_ARGUMENT_ERROR, VG_INVALID_HANDLE);
       
  3023 	RI_IF_ERROR(width > RI_MAX_IMAGE_WIDTH || height > RI_MAX_IMAGE_HEIGHT || width*height > RI_MAX_IMAGE_PIXELS ||
       
  3024 				((width*Color::formatToDescriptor(format).bitsPerPixel+7)/8)*height > RI_MAX_IMAGE_BYTES, VG_ILLEGAL_ARGUMENT_ERROR, VG_INVALID_HANDLE);
       
  3025 
       
  3026 	Image* image = NULL;
       
  3027 	try
       
  3028 	{
       
  3029 		image = RI_NEW(Image, (Color::formatToDescriptor(format), width, height, allowedQuality));	//throws bad_alloc
       
  3030 		RI_ASSERT(image);
       
  3031 		context->m_imageManager->addResource(image, context);	//throws bad_alloc
       
  3032 		RI_RETURN((VGImage)image);
       
  3033 	}
       
  3034 	catch(std::bad_alloc)
       
  3035 	{
       
  3036 		RI_DELETE(image);
       
  3037 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  3038 		RI_RETURN(VG_INVALID_HANDLE);
       
  3039 	}
       
  3040 }
       
  3041 
       
  3042 /*-------------------------------------------------------------------*//*!
       
  3043 * \brief	
       
  3044 * \param	
       
  3045 * \return	
       
  3046 * \note		
       
  3047 *//*-------------------------------------------------------------------*/
       
  3048 
       
  3049 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3050 void RI_APIENTRY do_vgDestroyImage(VGImage image)
       
  3051 #else
       
  3052 void RI_APIENTRY vgDestroyImage(VGImage image)
       
  3053 #endif
       
  3054 {
       
  3055 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3056 	RI_IF_ERROR(!context->isValidImage(image), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid image handle
       
  3057 
       
  3058 	context->m_imageManager->removeResource((Image*)image);
       
  3059 
       
  3060 	RI_RETURN(RI_NO_RETVAL);
       
  3061 }
       
  3062 
       
  3063 /*-------------------------------------------------------------------*//*!
       
  3064 * \brief	
       
  3065 * \param	
       
  3066 * \return	
       
  3067 * \note		
       
  3068 *//*-------------------------------------------------------------------*/
       
  3069 
       
  3070 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3071 void RI_APIENTRY do_vgClearImage(VGImage image, VGint x, VGint y, VGint width, VGint height)
       
  3072 #else
       
  3073 void RI_APIENTRY vgClearImage(VGImage image, VGint x, VGint y, VGint width, VGint height)
       
  3074 #endif
       
  3075 {
       
  3076 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3077 	RI_IF_ERROR(!context->isValidImage(image), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3078 	Image* img = (Image*)image;
       
  3079 	RI_IF_ERROR(eglvgIsInUse(img), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3080 	RI_IF_ERROR(width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3081 	img->clear(context->m_clearColor, x, y, width, height);
       
  3082 	RI_RETURN(RI_NO_RETVAL);
       
  3083 }
       
  3084 
       
  3085 /*-------------------------------------------------------------------*//*!
       
  3086 * \brief	
       
  3087 * \param	
       
  3088 * \return	
       
  3089 * \note		
       
  3090 *//*-------------------------------------------------------------------*/
       
  3091 
       
  3092 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3093 void RI_APIENTRY do_vgImageSubData(VGImage image, const void * data, VGint dataStride, VGImageFormat dataFormat, VGint x, VGint y, VGint width, VGint height)
       
  3094 #else
       
  3095 void RI_APIENTRY vgImageSubData(VGImage image, const void * data, VGint dataStride, VGImageFormat dataFormat, VGint x, VGint y, VGint width, VGint height)
       
  3096 #endif
       
  3097 {
       
  3098 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3099 	RI_IF_ERROR(!context->isValidImage(image), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3100 	Image* img = (Image*)image;
       
  3101 	RI_IF_ERROR(eglvgIsInUse(img), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3102 	RI_IF_ERROR(!isValidImageFormat(dataFormat), VG_UNSUPPORTED_IMAGE_FORMAT_ERROR, RI_NO_RETVAL);
       
  3103 	RI_IF_ERROR(!data || !isAligned(data, dataFormat) || width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3104 	{
       
  3105 		Image input(Color::formatToDescriptor(dataFormat), width, height, dataStride, const_cast<RIuint8*>((const RIuint8*)data));
       
  3106 		input.addReference();
       
  3107 		try
       
  3108 		{
       
  3109 			img->blit(input, 0, 0, x, y, width, height, false);	//throws bad_alloc
       
  3110 		}
       
  3111 		catch(std::bad_alloc)
       
  3112 		{
       
  3113 		}
       
  3114 		input.removeReference();
       
  3115 	}
       
  3116 	RI_RETURN(RI_NO_RETVAL);
       
  3117 }
       
  3118 
       
  3119 /*-------------------------------------------------------------------*//*!
       
  3120 * \brief	
       
  3121 * \param	
       
  3122 * \return	
       
  3123 * \note		
       
  3124 *//*-------------------------------------------------------------------*/
       
  3125 
       
  3126 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3127 void RI_APIENTRY do_vgGetImageSubData(VGImage image, void * data, VGint dataStride, VGImageFormat dataFormat, VGint x, VGint y, VGint width, VGint height)
       
  3128 #else
       
  3129 void RI_APIENTRY vgGetImageSubData(VGImage image, void * data, VGint dataStride, VGImageFormat dataFormat, VGint x, VGint y, VGint width, VGint height)
       
  3130 #endif
       
  3131 {
       
  3132 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3133 	RI_IF_ERROR(!context->isValidImage(image), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3134 	Image* img = (Image*)image;
       
  3135 	RI_IF_ERROR(eglvgIsInUse(img), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3136 	RI_IF_ERROR(!isValidImageFormat(dataFormat), VG_UNSUPPORTED_IMAGE_FORMAT_ERROR, RI_NO_RETVAL);
       
  3137 	RI_IF_ERROR(!data || !isAligned(data, dataFormat) || width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3138 	{
       
  3139 		Image output(Color::formatToDescriptor(dataFormat), width, height, dataStride, (RIuint8*)data);
       
  3140 		output.addReference();
       
  3141 		try
       
  3142 		{
       
  3143 			output.blit(*img, x, y, 0, 0, width, height, false);	//throws bad_alloc
       
  3144 		}
       
  3145 		catch(std::bad_alloc)
       
  3146 		{
       
  3147 		}
       
  3148 		output.removeReference();
       
  3149 	}
       
  3150 	RI_RETURN(RI_NO_RETVAL);
       
  3151 }
       
  3152 
       
  3153 /*-------------------------------------------------------------------*//*!
       
  3154 * \brief	
       
  3155 * \param	
       
  3156 * \return	
       
  3157 * \note		
       
  3158 *//*-------------------------------------------------------------------*/
       
  3159 
       
  3160 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3161 VGImage RI_APIENTRY do_vgChildImage(VGImage parent, VGint x, VGint y, VGint width, VGint height)
       
  3162 #else
       
  3163 VGImage RI_APIENTRY vgChildImage(VGImage parent, VGint x, VGint y, VGint width, VGint height)
       
  3164 #endif
       
  3165 {
       
  3166 	RI_GET_CONTEXT(VG_INVALID_HANDLE);
       
  3167 	RI_IF_ERROR(!context->isValidImage(parent), VG_BAD_HANDLE_ERROR, VG_INVALID_HANDLE);
       
  3168 	Image* p = (Image*)parent;
       
  3169 	RI_IF_ERROR(eglvgIsInUse((Image*)parent), VG_IMAGE_IN_USE_ERROR, VG_INVALID_HANDLE);
       
  3170 	RI_IF_ERROR(x < 0 || x >= p->getWidth() || y < 0 || y >= p->getHeight() ||
       
  3171 				width <= 0 || height <= 0 || RI_INT_ADDSATURATE(x, width) > p->getWidth() || RI_INT_ADDSATURATE(y, height) > p->getHeight(), VG_ILLEGAL_ARGUMENT_ERROR, VG_INVALID_HANDLE);
       
  3172 
       
  3173 	Image* child = NULL;
       
  3174 	try
       
  3175 	{
       
  3176 		child = RI_NEW(Image, (p, x, y, width, height));	//throws bad_alloc
       
  3177 		RI_ASSERT(child);
       
  3178 		context->m_imageManager->addResource(child, context);	//throws bad_alloc
       
  3179 		RI_RETURN((VGImage)child);
       
  3180 	}
       
  3181 	catch(std::bad_alloc)
       
  3182 	{
       
  3183 		RI_DELETE(child);
       
  3184 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  3185 		RI_RETURN(VG_INVALID_HANDLE);
       
  3186 	}
       
  3187 }
       
  3188 
       
  3189 /*-------------------------------------------------------------------*//*!
       
  3190 * \brief	
       
  3191 * \param	
       
  3192 * \return	
       
  3193 * \note		
       
  3194 *//*-------------------------------------------------------------------*/
       
  3195 
       
  3196 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3197 VGImage RI_APIENTRY do_vgGetParent(VGImage image)
       
  3198 #else
       
  3199 VGImage RI_APIENTRY vgGetParent(VGImage image)
       
  3200 #endif
       
  3201 {
       
  3202 	RI_GET_CONTEXT(VG_INVALID_HANDLE);
       
  3203 	RI_IF_ERROR(!context->isValidImage(image), VG_BAD_HANDLE_ERROR, VG_INVALID_HANDLE);
       
  3204 	VGImage ret = image;	//if image has no ancestors, image is returned.
       
  3205 
       
  3206     //The vgGetParent function returns the closest valid ancestor (i.e., one that has not been the target of a vgDestroyImage call)
       
  3207     // of the given image.
       
  3208 	Image* im = ((Image*)image)->getParent();
       
  3209     for(;im;im = im->getParent())
       
  3210     {
       
  3211 		if(context->isValidImage((VGImage)im))
       
  3212 		{	//the parent is valid and alive
       
  3213 			ret = (VGImage)im;
       
  3214             break;
       
  3215 		}
       
  3216 	}
       
  3217 	RI_RETURN(ret);
       
  3218 }
       
  3219 
       
  3220 /*-------------------------------------------------------------------*//*!
       
  3221 * \brief	
       
  3222 * \param	
       
  3223 * \return	
       
  3224 * \note		
       
  3225 *//*-------------------------------------------------------------------*/
       
  3226 
       
  3227 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3228 void RI_APIENTRY do_vgCopyImage(VGImage dst, VGint dx, VGint dy, VGImage src, VGint sx, VGint sy, VGint width, VGint height, VGboolean dither)
       
  3229 #else
       
  3230 void RI_APIENTRY vgCopyImage(VGImage dst, VGint dx, VGint dy, VGImage src, VGint sx, VGint sy, VGint width, VGint height, VGboolean dither)
       
  3231 #endif
       
  3232 {
       
  3233 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3234 	RI_IF_ERROR(!context->isValidImage(dst) || !context->isValidImage(src), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3235 	RI_IF_ERROR(eglvgIsInUse((Image*)dst) || eglvgIsInUse((Image*)src), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3236 	RI_IF_ERROR(width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3237 	try
       
  3238 	{
       
  3239 		((Image*)dst)->blit(*(Image*)src, sx, sy, dx, dy, width, height, dither ? true : false);	//throws bad_alloc
       
  3240 	}
       
  3241 	catch(std::bad_alloc)
       
  3242 	{
       
  3243 	}
       
  3244 	RI_RETURN(RI_NO_RETVAL);
       
  3245 }
       
  3246 
       
  3247 /*-------------------------------------------------------------------*//*!
       
  3248 * \brief	
       
  3249 * \param	
       
  3250 * \return	
       
  3251 * \note		
       
  3252 *//*-------------------------------------------------------------------*/
       
  3253 
       
  3254 static bool drawImage(VGContext* context, VGImage image, const Matrix3x3& userToSurfaceMatrix)
       
  3255 {
       
  3256     Drawable* drawable = context->getCurrentDrawable();
       
  3257     if(!drawable)
       
  3258         return false;   //no EGL surface is current at the moment
       
  3259 
       
  3260 	Image* img = (Image*)image;
       
  3261 	//transform image corners into the surface space
       
  3262 	Vector3 p0(0, 0, 1);
       
  3263 	Vector3 p1(0, (RIfloat)img->getHeight(), 1);
       
  3264 	Vector3 p2((RIfloat)img->getWidth(), (RIfloat)img->getHeight(), 1);
       
  3265 	Vector3 p3((RIfloat)img->getWidth(), 0, 1);
       
  3266 	p0 = userToSurfaceMatrix * p0;
       
  3267 	p1 = userToSurfaceMatrix * p1;
       
  3268 	p2 = userToSurfaceMatrix * p2;
       
  3269 	p3 = userToSurfaceMatrix * p3;
       
  3270 	if(p0.z <= 0.0f || p1.z <= 0.0f || p2.z <= 0.0f || p3.z <= 0.0f)
       
  3271 		return false;
       
  3272 
       
  3273 	//projection
       
  3274 	p0 *= 1.0f/p0.z;
       
  3275 	p1 *= 1.0f/p1.z;
       
  3276 	p2 *= 1.0f/p2.z;
       
  3277 	p3 *= 1.0f/p3.z;
       
  3278 
       
  3279 	Rasterizer rasterizer;
       
  3280 	if(context->m_scissoring)
       
  3281 		rasterizer.setScissor(context->m_scissor);	//throws bad_alloc
       
  3282 	rasterizer.setupSamplingPattern(context->m_renderingQuality, drawable->getNumSamples());
       
  3283 
       
  3284 	PixelPipe pixelPipe;
       
  3285 	pixelPipe.setTileFillColor(context->m_tileFillColor);
       
  3286 	pixelPipe.setPaint((Paint*)context->m_fillPaint);
       
  3287 	pixelPipe.setImageQuality(context->m_imageQuality);
       
  3288 	pixelPipe.setBlendMode(context->m_blendMode);
       
  3289 	pixelPipe.setDrawable(drawable);
       
  3290 	pixelPipe.setMask(context->m_masking ? true : false);
       
  3291     pixelPipe.setColorTransform(context->m_colorTransform ? true : false, context->m_colorTransformValues);
       
  3292 
       
  3293 	Matrix3x3 surfaceToImageMatrix = userToSurfaceMatrix;
       
  3294 	Matrix3x3 surfaceToPaintMatrix = userToSurfaceMatrix * context->m_fillPaintToUser;
       
  3295 	if(surfaceToImageMatrix.invert() && surfaceToPaintMatrix.invert())
       
  3296 	{
       
  3297 		VGImageMode imode = context->m_imageMode;
       
  3298 		if(!surfaceToPaintMatrix.isAffine())
       
  3299 			imode = VG_DRAW_IMAGE_NORMAL;	//if paint matrix is not affine, always use normal image mode
       
  3300 		surfaceToPaintMatrix[2].set(0,0,1);	//force affine
       
  3301 
       
  3302 		pixelPipe.setImage(img, imode);
       
  3303 		pixelPipe.setSurfaceToPaintMatrix(surfaceToPaintMatrix);
       
  3304 		pixelPipe.setSurfaceToImageMatrix(surfaceToImageMatrix);
       
  3305 
       
  3306 		rasterizer.addEdge(Vector2(p0.x,p0.y), Vector2(p1.x,p1.y));	//throws bad_alloc
       
  3307 		rasterizer.addEdge(Vector2(p1.x,p1.y), Vector2(p2.x,p2.y));	//throws bad_alloc
       
  3308 		rasterizer.addEdge(Vector2(p2.x,p2.y), Vector2(p3.x,p3.y));	//throws bad_alloc
       
  3309 		rasterizer.addEdge(Vector2(p3.x,p3.y), Vector2(p0.x,p0.y));	//throws bad_alloc
       
  3310         rasterizer.setup(0, 0, drawable->getWidth(), drawable->getHeight(), VG_EVEN_ODD, &pixelPipe, NULL);
       
  3311 		rasterizer.fill();	//throws bad_alloc
       
  3312 	}
       
  3313 	return true;
       
  3314 }
       
  3315 
       
  3316 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3317 void RI_APIENTRY do_vgDrawImage(VGImage image)
       
  3318 #else
       
  3319 void RI_APIENTRY vgDrawImage(VGImage image)
       
  3320 #endif
       
  3321 {
       
  3322 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3323 	RI_IF_ERROR(!context->isValidImage(image), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3324 	Image* img = (Image*)image;
       
  3325 	RI_IF_ERROR(eglvgIsInUse(img), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3326 
       
  3327 	try
       
  3328 	{
       
  3329 		if(!drawImage(context, image, context->m_imageUserToSurface))
       
  3330 		{
       
  3331 			RI_RETURN(RI_NO_RETVAL);
       
  3332 		}
       
  3333 	}
       
  3334 	catch(std::bad_alloc)
       
  3335 	{
       
  3336 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  3337 	}
       
  3338 	RI_RETURN(RI_NO_RETVAL);
       
  3339 }
       
  3340 
       
  3341 /*-------------------------------------------------------------------*//*!
       
  3342 * \brief	
       
  3343 * \param	
       
  3344 * \return	
       
  3345 * \note		
       
  3346 *//*-------------------------------------------------------------------*/
       
  3347 
       
  3348 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3349 void RI_APIENTRY do_vgSetPixels(VGint dx, VGint dy, VGImage src, VGint sx, VGint sy, VGint width, VGint height)
       
  3350 #else
       
  3351 void RI_APIENTRY vgSetPixels(VGint dx, VGint dy, VGImage src, VGint sx, VGint sy, VGint width, VGint height)
       
  3352 #endif
       
  3353 {
       
  3354 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3355 	RI_IF_ERROR(!context->isValidImage(src), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3356 	RI_IF_ERROR(eglvgIsInUse((Image*)src), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3357 	RI_IF_ERROR(width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3358     Drawable* drawable = context->getCurrentDrawable();
       
  3359     if(!drawable)
       
  3360     {
       
  3361         RI_RETURN(RI_NO_RETVAL);	//no EGL surface is current at the moment
       
  3362     }
       
  3363 	try
       
  3364 	{
       
  3365 		if(context->m_scissoring)
       
  3366 			drawable->getColorBuffer()->blit(*(Image*)src, sx, sy, dx, dy, width, height, context->m_scissor);	//throws bad_alloc
       
  3367 		else
       
  3368 			drawable->getColorBuffer()->blit(*(Image*)src, sx, sy, dx, dy, width, height);	//throws bad_alloc
       
  3369 	}
       
  3370 	catch(std::bad_alloc)
       
  3371 	{
       
  3372 	}
       
  3373 	RI_RETURN(RI_NO_RETVAL);
       
  3374 }
       
  3375 
       
  3376 /*-------------------------------------------------------------------*//*!
       
  3377 * \brief	
       
  3378 * \param	
       
  3379 * \return	
       
  3380 * \note		
       
  3381 *//*-------------------------------------------------------------------*/
       
  3382 
       
  3383 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3384 void RI_APIENTRY do_vgWritePixels(const void * data, VGint dataStride, VGImageFormat dataFormat, VGint dx, VGint dy, VGint width, VGint height)
       
  3385 #else
       
  3386 void RI_APIENTRY vgWritePixels(const void * data, VGint dataStride, VGImageFormat dataFormat, VGint dx, VGint dy, VGint width, VGint height)
       
  3387 #endif
       
  3388 {
       
  3389 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3390 	RI_IF_ERROR(!isValidImageFormat(dataFormat), VG_UNSUPPORTED_IMAGE_FORMAT_ERROR, RI_NO_RETVAL);
       
  3391 	RI_IF_ERROR(!data || !isAligned(data, dataFormat) || width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3392     Drawable* drawable = context->getCurrentDrawable();
       
  3393     if(!drawable)
       
  3394     {
       
  3395         RI_RETURN(RI_NO_RETVAL);	//no EGL surface is current at the moment
       
  3396     }
       
  3397 	{
       
  3398 		Image input(Color::formatToDescriptor(dataFormat), width, height, dataStride, const_cast<RIuint8*>((const RIuint8*)data));
       
  3399 		input.addReference();
       
  3400 		try
       
  3401 		{
       
  3402 			if(context->m_scissoring)
       
  3403 				drawable->getColorBuffer()->blit(input, 0, 0, dx, dy, width, height, context->m_scissor);	//throws bad_alloc
       
  3404 			else
       
  3405 				drawable->getColorBuffer()->blit(input, 0, 0, dx, dy, width, height);	//throws bad_alloc
       
  3406 		}
       
  3407 		catch(std::bad_alloc)
       
  3408 		{
       
  3409 		}
       
  3410 		input.removeReference();
       
  3411 	}
       
  3412 	RI_RETURN(RI_NO_RETVAL);
       
  3413 }
       
  3414 
       
  3415 /*-------------------------------------------------------------------*//*!
       
  3416 * \brief	
       
  3417 * \param	
       
  3418 * \return	
       
  3419 * \note		
       
  3420 *//*-------------------------------------------------------------------*/
       
  3421 
       
  3422 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3423 void RI_APIENTRY do_vgGetPixels(VGImage dst, VGint dx, VGint dy, VGint sx, VGint sy, VGint width, VGint height)
       
  3424 #else
       
  3425 void RI_APIENTRY vgGetPixels(VGImage dst, VGint dx, VGint dy, VGint sx, VGint sy, VGint width, VGint height)
       
  3426 #endif
       
  3427 {
       
  3428 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3429 	RI_IF_ERROR(!context->isValidImage(dst), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3430 	RI_IF_ERROR(eglvgIsInUse((Image*)dst), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3431 	RI_IF_ERROR(width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3432     Drawable* drawable = context->getCurrentDrawable();
       
  3433     if(!drawable)
       
  3434     {
       
  3435         RI_RETURN(RI_NO_RETVAL);	//no EGL surface is current at the moment
       
  3436     }
       
  3437 	try
       
  3438 	{
       
  3439 		((Image*)dst)->blit(drawable->getColorBuffer(), sx, sy, dx, dy, width, height);	//throws bad_alloc
       
  3440 	}
       
  3441 	catch(std::bad_alloc)
       
  3442 	{
       
  3443 	}
       
  3444 	RI_RETURN(RI_NO_RETVAL);
       
  3445 }
       
  3446 
       
  3447 /*-------------------------------------------------------------------*//*!
       
  3448 * \brief	
       
  3449 * \param	
       
  3450 * \return	
       
  3451 * \note		
       
  3452 *//*-------------------------------------------------------------------*/
       
  3453 
       
  3454 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3455 void RI_APIENTRY do_vgReadPixels(void* data, VGint dataStride, VGImageFormat dataFormat, VGint sx, VGint sy, VGint width, VGint height)
       
  3456 #else
       
  3457 void RI_APIENTRY vgReadPixels(void* data, VGint dataStride, VGImageFormat dataFormat, VGint sx, VGint sy, VGint width, VGint height)
       
  3458 #endif
       
  3459 {
       
  3460 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3461 	RI_IF_ERROR(!isValidImageFormat(dataFormat), VG_UNSUPPORTED_IMAGE_FORMAT_ERROR, RI_NO_RETVAL);
       
  3462 	RI_IF_ERROR(!data || !isAligned(data, dataFormat) || width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3463     Drawable* drawable = context->getCurrentDrawable();
       
  3464     if(!drawable)
       
  3465     {
       
  3466         RI_RETURN(RI_NO_RETVAL);	//no EGL surface is current at the moment
       
  3467     }
       
  3468 	{
       
  3469 		Image output(Color::formatToDescriptor(dataFormat), width, height, dataStride, (RIuint8*)data);
       
  3470 		output.addReference();
       
  3471 		try
       
  3472 		{
       
  3473 			output.blit(drawable->getColorBuffer(), sx, sy, 0, 0, width, height);	//throws bad_alloc
       
  3474 		}
       
  3475 		catch(std::bad_alloc)
       
  3476 		{
       
  3477 		}
       
  3478 		output.removeReference();
       
  3479 	}
       
  3480 	RI_RETURN(RI_NO_RETVAL);
       
  3481 }
       
  3482 
       
  3483 /*-------------------------------------------------------------------*//*!
       
  3484 * \brief	
       
  3485 * \param	
       
  3486 * \return	
       
  3487 * \note		
       
  3488 *//*-------------------------------------------------------------------*/
       
  3489 
       
  3490 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3491 void RI_APIENTRY do_vgCopyPixels(VGint dx, VGint dy, VGint sx, VGint sy, VGint width, VGint height)
       
  3492 #else
       
  3493 void RI_APIENTRY vgCopyPixels(VGint dx, VGint dy, VGint sx, VGint sy, VGint width, VGint height)
       
  3494 #endif
       
  3495 {
       
  3496 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3497 	RI_IF_ERROR(width <= 0 || height <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3498     Drawable* drawable = context->getCurrentDrawable();
       
  3499     if(!drawable)
       
  3500     {
       
  3501         RI_RETURN(RI_NO_RETVAL);	//no EGL surface is current at the moment
       
  3502     }
       
  3503 	try
       
  3504 	{
       
  3505 		if(context->m_scissoring)
       
  3506 			drawable->getColorBuffer()->blit(drawable->getColorBuffer(), sx, sy, dx, dy, width, height, context->m_scissor);	//throws bad_alloc
       
  3507 		else
       
  3508 			drawable->getColorBuffer()->blit(drawable->getColorBuffer(), sx, sy, dx, dy, width, height);	//throws bad_alloc
       
  3509 	}
       
  3510 	catch(std::bad_alloc)
       
  3511 	{
       
  3512 	}
       
  3513 	RI_RETURN(RI_NO_RETVAL);
       
  3514 }
       
  3515 
       
  3516 /*-------------------------------------------------------------------*//*!
       
  3517 * \brief	
       
  3518 * \param	
       
  3519 * \return	
       
  3520 * \note		
       
  3521 *//*-------------------------------------------------------------------*/
       
  3522 
       
  3523 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3524 void RI_APIENTRY do_vgColorMatrix(VGImage dst, VGImage src, const VGfloat * matrix)
       
  3525 #else
       
  3526 void RI_APIENTRY vgColorMatrix(VGImage dst, VGImage src, const VGfloat * matrix)
       
  3527 #endif
       
  3528 {
       
  3529 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3530 	RI_IF_ERROR(!context->isValidImage(dst) || !context->isValidImage(src), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3531 	Image* d = (Image*)dst;
       
  3532 	Image* s = (Image*)src;
       
  3533 	RI_IF_ERROR(eglvgIsInUse(d) || eglvgIsInUse(s), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3534 	RI_IF_ERROR(d->overlaps(s), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3535 	RI_IF_ERROR(!matrix || !isAligned(matrix,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3536 	unsigned int channelMask = context->m_filterChannelMask & (VG_RED|VG_GREEN|VG_BLUE|VG_ALPHA);	//undefined bits are ignored
       
  3537 
       
  3538 	RIfloat m[20];
       
  3539 	for(int i=0;i<20;i++)
       
  3540 	{
       
  3541 		m[i] = inputFloat(matrix[i]);
       
  3542 	}
       
  3543 	try
       
  3544 	{
       
  3545 		d->colorMatrix(*s, m, context->m_filterFormatLinear ? true : false, context->m_filterFormatPremultiplied ? true : false, channelMask);
       
  3546 	}
       
  3547 	catch(std::bad_alloc)
       
  3548 	{
       
  3549 	}
       
  3550 	RI_RETURN(RI_NO_RETVAL);
       
  3551 }
       
  3552 
       
  3553 /*-------------------------------------------------------------------*//*!
       
  3554 * \brief	
       
  3555 * \param	
       
  3556 * \return	
       
  3557 * \note		
       
  3558 *//*-------------------------------------------------------------------*/
       
  3559 
       
  3560 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3561 void RI_APIENTRY do_vgConvolve(VGImage dst, VGImage src, VGint kernelWidth, VGint kernelHeight, VGint shiftX, VGint shiftY, const VGshort * kernel, VGfloat scale, VGfloat bias, VGTilingMode tilingMode)
       
  3562 #else
       
  3563 void RI_APIENTRY vgConvolve(VGImage dst, VGImage src, VGint kernelWidth, VGint kernelHeight, VGint shiftX, VGint shiftY, const VGshort * kernel, VGfloat scale, VGfloat bias, VGTilingMode tilingMode)
       
  3564 #endif
       
  3565 {
       
  3566 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3567 	RI_IF_ERROR(!context->isValidImage(dst) || !context->isValidImage(src), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3568 	Image* d = (Image*)dst;
       
  3569 	Image* s = (Image*)src;
       
  3570 	RI_IF_ERROR(eglvgIsInUse(d) || eglvgIsInUse(s), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3571 	RI_IF_ERROR(d->overlaps(s), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3572 	RI_IF_ERROR(!kernel || !isAligned(kernel,2) || kernelWidth <= 0 || kernelHeight <= 0 || kernelWidth > RI_MAX_KERNEL_SIZE || kernelHeight > RI_MAX_KERNEL_SIZE, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3573 	RI_IF_ERROR(tilingMode < VG_TILE_FILL || tilingMode > VG_TILE_REFLECT, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3574 	unsigned int channelMask = context->m_filterChannelMask & (VG_RED|VG_GREEN|VG_BLUE|VG_ALPHA);	//undefined bits are ignored
       
  3575 	try
       
  3576 	{
       
  3577 		d->convolve(*s, kernelWidth, kernelHeight, shiftX, shiftY, (const RIint16*)kernel, inputFloat(scale), inputFloat(bias), tilingMode, context->m_tileFillColor, context->m_filterFormatLinear ? true : false, context->m_filterFormatPremultiplied ? true : false, channelMask);
       
  3578 	}
       
  3579 	catch(std::bad_alloc)
       
  3580 	{
       
  3581 	}
       
  3582 	RI_RETURN(RI_NO_RETVAL);
       
  3583 }
       
  3584 
       
  3585 /*-------------------------------------------------------------------*//*!
       
  3586 * \brief	
       
  3587 * \param	
       
  3588 * \return	
       
  3589 * \note		
       
  3590 *//*-------------------------------------------------------------------*/
       
  3591 
       
  3592 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3593 void RI_APIENTRY do_vgSeparableConvolve(VGImage dst, VGImage src, VGint kernelWidth, VGint kernelHeight, VGint shiftX, VGint shiftY, const VGshort * kernelX, const VGshort * kernelY, VGfloat scale, VGfloat bias, VGTilingMode tilingMode)
       
  3594 #else
       
  3595 void RI_APIENTRY vgSeparableConvolve(VGImage dst, VGImage src, VGint kernelWidth, VGint kernelHeight, VGint shiftX, VGint shiftY, const VGshort * kernelX, const VGshort * kernelY, VGfloat scale, VGfloat bias, VGTilingMode tilingMode)
       
  3596 #endif
       
  3597 {
       
  3598 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3599 	RI_IF_ERROR(!context->isValidImage(dst) || !context->isValidImage(src), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3600 	Image* d = (Image*)dst;
       
  3601 	Image* s = (Image*)src;
       
  3602 	RI_IF_ERROR(eglvgIsInUse(d) || eglvgIsInUse(s), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3603 	RI_IF_ERROR(d->overlaps(s), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3604 	RI_IF_ERROR(!kernelX || !kernelY || !isAligned(kernelX,2) || !isAligned(kernelY,2) || kernelWidth <= 0 || kernelHeight <= 0 || kernelWidth > RI_MAX_SEPARABLE_KERNEL_SIZE || kernelHeight > RI_MAX_SEPARABLE_KERNEL_SIZE, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3605 	RI_IF_ERROR(tilingMode < VG_TILE_FILL || tilingMode > VG_TILE_REFLECT, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3606 	unsigned int channelMask = context->m_filterChannelMask & (VG_RED|VG_GREEN|VG_BLUE|VG_ALPHA);	//undefined bits are ignored
       
  3607 	try
       
  3608 	{
       
  3609 		d->separableConvolve(*s, kernelWidth, kernelHeight, shiftX, shiftY, (const RIint16*)kernelX, (const RIint16*)kernelY,
       
  3610 										 inputFloat(scale), inputFloat(bias), tilingMode, context->m_tileFillColor, context->m_filterFormatLinear ? true : false,
       
  3611 										 context->m_filterFormatPremultiplied ? true : false, channelMask);
       
  3612 	}
       
  3613 	catch(std::bad_alloc)
       
  3614 	{
       
  3615 	}
       
  3616 	RI_RETURN(RI_NO_RETVAL);
       
  3617 }
       
  3618 
       
  3619 /*-------------------------------------------------------------------*//*!
       
  3620 * \brief	
       
  3621 * \param	
       
  3622 * \return	
       
  3623 * \note		
       
  3624 *//*-------------------------------------------------------------------*/
       
  3625 
       
  3626 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3627 void RI_APIENTRY do_vgGaussianBlur(VGImage dst, VGImage src, VGfloat stdDeviationX, VGfloat stdDeviationY, VGTilingMode tilingMode)
       
  3628 #else
       
  3629 void RI_APIENTRY vgGaussianBlur(VGImage dst, VGImage src, VGfloat stdDeviationX, VGfloat stdDeviationY, VGTilingMode tilingMode)
       
  3630 #endif
       
  3631 {
       
  3632 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3633 	RI_IF_ERROR(!context->isValidImage(dst) || !context->isValidImage(src), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3634 	Image* d = (Image*)dst;
       
  3635 	Image* s = (Image*)src;
       
  3636 	RI_IF_ERROR(eglvgIsInUse(d) || eglvgIsInUse(s), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3637 	RI_IF_ERROR(d->overlaps(s), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3638 	RIfloat sx = inputFloat(stdDeviationX);
       
  3639 	RIfloat sy = inputFloat(stdDeviationY);
       
  3640 	RI_IF_ERROR(sx <= 0.0f || sy <= 0.0f || sx > (RIfloat)RI_MAX_GAUSSIAN_STD_DEVIATION || sy > (RIfloat)RI_MAX_GAUSSIAN_STD_DEVIATION, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3641 	RI_IF_ERROR(tilingMode < VG_TILE_FILL || tilingMode > VG_TILE_REFLECT, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3642 	unsigned int channelMask = context->m_filterChannelMask & (VG_RED|VG_GREEN|VG_BLUE|VG_ALPHA);	//undefined bits are ignored
       
  3643 	try
       
  3644 	{
       
  3645 		d->gaussianBlur(*s, sx, sy, tilingMode, context->m_tileFillColor, context->m_filterFormatLinear ? true : false,
       
  3646 						context->m_filterFormatPremultiplied ? true : false, channelMask);
       
  3647 	}
       
  3648 	catch(std::bad_alloc)
       
  3649 	{
       
  3650 	}
       
  3651 	RI_RETURN(RI_NO_RETVAL);
       
  3652 }
       
  3653 
       
  3654 /*-------------------------------------------------------------------*//*!
       
  3655 * \brief	
       
  3656 * \param	
       
  3657 * \return	
       
  3658 * \note		
       
  3659 *//*-------------------------------------------------------------------*/
       
  3660 
       
  3661 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3662 void RI_APIENTRY do_vgLookup(VGImage dst, VGImage src, const VGubyte * redLUT, const VGubyte * greenLUT, const VGubyte * blueLUT, const VGubyte * alphaLUT, VGboolean outputLinear, VGboolean outputPremultiplied)
       
  3663 #else
       
  3664 void RI_APIENTRY vgLookup(VGImage dst, VGImage src, const VGubyte * redLUT, const VGubyte * greenLUT, const VGubyte * blueLUT, const VGubyte * alphaLUT, VGboolean outputLinear, VGboolean outputPremultiplied)
       
  3665 #endif
       
  3666 {
       
  3667 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3668 	RI_IF_ERROR(!context->isValidImage(dst) || !context->isValidImage(src), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3669 	Image* d = (Image*)dst;
       
  3670 	Image* s = (Image*)src;
       
  3671 	RI_IF_ERROR(eglvgIsInUse(d) || eglvgIsInUse(s), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3672 	RI_IF_ERROR(d->overlaps(s), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3673 	RI_IF_ERROR(!redLUT || !greenLUT || !blueLUT || !alphaLUT, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3674 	unsigned int channelMask = context->m_filterChannelMask & (VG_RED|VG_GREEN|VG_BLUE|VG_ALPHA);	//undefined bits are ignored
       
  3675 	try
       
  3676 	{
       
  3677 		d->lookup(*s, (const RIuint8*)redLUT, (const RIuint8*)greenLUT, (const RIuint8*)blueLUT, (const RIuint8*)alphaLUT,
       
  3678 				  outputLinear ? true : false, outputPremultiplied ? true : false, context->m_filterFormatLinear ? true : false,
       
  3679 				  context->m_filterFormatPremultiplied ? true : false, channelMask);
       
  3680 	}
       
  3681 	catch(std::bad_alloc)
       
  3682 	{
       
  3683 	}
       
  3684 	RI_RETURN(RI_NO_RETVAL);
       
  3685 }
       
  3686 
       
  3687 /*-------------------------------------------------------------------*//*!
       
  3688 * \brief	
       
  3689 * \param	
       
  3690 * \return	
       
  3691 * \note		
       
  3692 *//*-------------------------------------------------------------------*/
       
  3693 
       
  3694 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3695 void RI_APIENTRY do_vgLookupSingle(VGImage dst, VGImage src, const VGuint * lookupTable, VGImageChannel sourceChannel, VGboolean outputLinear, VGboolean outputPremultiplied)
       
  3696 #else
       
  3697 void RI_APIENTRY vgLookupSingle(VGImage dst, VGImage src, const VGuint * lookupTable, VGImageChannel sourceChannel, VGboolean outputLinear, VGboolean outputPremultiplied)
       
  3698 #endif
       
  3699 {
       
  3700 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3701 	RI_IF_ERROR(!context->isValidImage(dst) || !context->isValidImage(src), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);
       
  3702 	Image* d = (Image*)dst;
       
  3703 	Image* s = (Image*)src;
       
  3704 	RI_IF_ERROR(eglvgIsInUse(d) || eglvgIsInUse(s), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL);
       
  3705 	RI_IF_ERROR(d->overlaps(s), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3706 	RI_IF_ERROR(!lookupTable || !isAligned(lookupTable,4), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3707 	const Color::Descriptor& desc = s->getDescriptor();
       
  3708 	RI_ASSERT(Color::isValidDescriptor(desc));
       
  3709 	//give an error if src is in rgb format and the source channel is not valid
       
  3710 	RI_IF_ERROR((!desc.isLuminance() && !desc.isAlphaOnly()) && (sourceChannel != VG_RED && sourceChannel != VG_GREEN && sourceChannel != VG_BLUE && sourceChannel != VG_ALPHA), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3711 	unsigned int channelMask = context->m_filterChannelMask & (VG_RED|VG_GREEN|VG_BLUE|VG_ALPHA);	//undefined bits are ignored
       
  3712 	try
       
  3713 	{
       
  3714 		d->lookupSingle(*s, (const RIuint32*)lookupTable, sourceChannel, outputLinear ? true : false, outputPremultiplied ? true : false,
       
  3715 						context->m_filterFormatLinear ? true : false, context->m_filterFormatPremultiplied ? true : false, channelMask);
       
  3716 	}
       
  3717 	catch(std::bad_alloc)
       
  3718 	{
       
  3719 	}
       
  3720 	RI_RETURN(RI_NO_RETVAL);
       
  3721 }
       
  3722 
       
  3723 /*-------------------------------------------------------------------*//*!
       
  3724 * \brief	
       
  3725 * \param	
       
  3726 * \return	
       
  3727 * \note		
       
  3728 *//*-------------------------------------------------------------------*/
       
  3729 
       
  3730 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3731 VGHardwareQueryResult RI_APIENTRY do_vgHardwareQuery(VGHardwareQueryType key, VGint setting)
       
  3732 #else
       
  3733 VGHardwareQueryResult RI_APIENTRY vgHardwareQuery(VGHardwareQueryType key, VGint setting)
       
  3734 #endif
       
  3735 {
       
  3736 	RI_GET_CONTEXT(VG_HARDWARE_UNACCELERATED);
       
  3737 	RI_IF_ERROR(key != VG_IMAGE_FORMAT_QUERY && key != VG_PATH_DATATYPE_QUERY, VG_ILLEGAL_ARGUMENT_ERROR, VG_HARDWARE_UNACCELERATED);
       
  3738 	RI_IF_ERROR(key == VG_IMAGE_FORMAT_QUERY && !isValidImageFormat(setting), VG_ILLEGAL_ARGUMENT_ERROR, VG_HARDWARE_UNACCELERATED);
       
  3739 	RI_IF_ERROR(key == VG_PATH_DATATYPE_QUERY && (setting < VG_PATH_DATATYPE_S_8 || setting > VG_PATH_DATATYPE_F), VG_ILLEGAL_ARGUMENT_ERROR, VG_HARDWARE_UNACCELERATED);
       
  3740 	RI_RETURN(VG_HARDWARE_UNACCELERATED);
       
  3741 }
       
  3742 
       
  3743 /*-------------------------------------------------------------------*//*!
       
  3744 * \brief	
       
  3745 * \param	
       
  3746 * \return	
       
  3747 * \note		
       
  3748 *//*-------------------------------------------------------------------*/
       
  3749 
       
  3750 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3751 RI_APIENTRY const VGubyte * do_vgGetString(VGStringID name)
       
  3752 #else
       
  3753 RI_APIENTRY const VGubyte * vgGetString(VGStringID name)
       
  3754 #endif
       
  3755 {
       
  3756 	static const VGubyte vendor[] = "Khronos Group";
       
  3757 	static const VGubyte renderer[] = {"OpenVG 1.1 Reference Implementation May 13 2008"};
       
  3758 	static const VGubyte version[] = "1.1";
       
  3759 	static const VGubyte extensions[] = "";
       
  3760 	const VGubyte* r = NULL;
       
  3761 	RI_GET_CONTEXT(NULL);
       
  3762 	switch(name)
       
  3763 	{
       
  3764 	case VG_VENDOR:
       
  3765 		r = vendor;
       
  3766 		break;
       
  3767 	case VG_RENDERER:
       
  3768 		r = renderer;
       
  3769 		break;
       
  3770 	case VG_VERSION:
       
  3771 		r = version;
       
  3772 		break;
       
  3773 	case VG_EXTENSIONS:
       
  3774 		r = extensions;
       
  3775 		break;
       
  3776 	default:
       
  3777 		break;
       
  3778 	}
       
  3779 	RI_RETURN(r);
       
  3780 }
       
  3781 
       
  3782 /*-------------------------------------------------------------------*//*!
       
  3783 * \brief	
       
  3784 * \param	
       
  3785 * \return	
       
  3786 * \note		
       
  3787 *//*-------------------------------------------------------------------*/
       
  3788 
       
  3789 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3790 VGFont RI_APIENTRY do_vgCreateFont(VGint glyphCapacityHint)
       
  3791 #else
       
  3792 VGFont RI_APIENTRY vgCreateFont(VGint glyphCapacityHint)
       
  3793 #endif
       
  3794 {
       
  3795 	RI_GET_CONTEXT(VG_INVALID_HANDLE);
       
  3796 	RI_IF_ERROR(glyphCapacityHint < 0, VG_ILLEGAL_ARGUMENT_ERROR, VG_INVALID_HANDLE);
       
  3797 
       
  3798 	Font* font = NULL;
       
  3799 	try
       
  3800 	{
       
  3801 		font = RI_NEW(Font, (glyphCapacityHint));	//throws bad_alloc
       
  3802 		RI_ASSERT(font);
       
  3803 		context->m_fontManager->addResource(font, context);	//throws bad_alloc
       
  3804 		RI_RETURN((VGFont)font);
       
  3805 	}
       
  3806 	catch(std::bad_alloc)
       
  3807 	{
       
  3808 		RI_DELETE(font);
       
  3809 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  3810 		RI_RETURN(VG_INVALID_HANDLE);
       
  3811 	}
       
  3812 }
       
  3813 
       
  3814 /*-------------------------------------------------------------------*//*!
       
  3815 * \brief	
       
  3816 * \param	
       
  3817 * \return	
       
  3818 * \note		
       
  3819 *//*-------------------------------------------------------------------*/
       
  3820 
       
  3821 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3822 void RI_APIENTRY do_vgDestroyFont(VGFont font)
       
  3823 #else
       
  3824 void RI_APIENTRY vgDestroyFont(VGFont font)
       
  3825 #endif
       
  3826 {
       
  3827 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3828 	RI_IF_ERROR(!context->isValidFont(font), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid font handle
       
  3829 
       
  3830 	context->m_fontManager->removeResource((Font*)font);
       
  3831 
       
  3832 	RI_RETURN(RI_NO_RETVAL);
       
  3833 }
       
  3834 
       
  3835 /*-------------------------------------------------------------------*//*!
       
  3836 * \brief	
       
  3837 * \param	
       
  3838 * \return	
       
  3839 * \note		
       
  3840 *//*-------------------------------------------------------------------*/
       
  3841 
       
  3842 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3843 void RI_APIENTRY do_vgSetGlyphToPath(VGFont font, VGuint glyphIndex, VGPath path, VGboolean isHinted, const VGfloat glyphOrigin[2], const VGfloat escapement[2])
       
  3844 #else
       
  3845 void RI_APIENTRY vgSetGlyphToPath(VGFont font, VGuint glyphIndex, VGPath path, VGboolean isHinted, const VGfloat glyphOrigin[2], const VGfloat escapement[2])
       
  3846 #endif
       
  3847 {
       
  3848 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3849 	RI_IF_ERROR(!context->isValidFont(font), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid font handle
       
  3850 	RI_IF_ERROR(path != VG_INVALID_HANDLE && !context->isValidPath(path), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid path handle
       
  3851     RI_IF_ERROR(!glyphOrigin || !escapement || !isAligned(glyphOrigin,sizeof(VGfloat)) || !isAligned(escapement,sizeof(VGfloat)), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3852 	Font* f = (Font*)font;
       
  3853 
       
  3854 	try
       
  3855 	{
       
  3856         f->setGlyphToPath(glyphIndex, path, isHinted ? true : false, Vector2(inputFloat(glyphOrigin[0]), inputFloat(glyphOrigin[1])), Vector2(inputFloat(escapement[0]), inputFloat(escapement[1])));
       
  3857 	}
       
  3858 	catch(std::bad_alloc)
       
  3859 	{
       
  3860 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  3861 	}
       
  3862 	RI_RETURN(RI_NO_RETVAL);
       
  3863 }
       
  3864 
       
  3865 /*-------------------------------------------------------------------*//*!
       
  3866 * \brief	
       
  3867 * \param	
       
  3868 * \return	
       
  3869 * \note		
       
  3870 *//*-------------------------------------------------------------------*/
       
  3871 
       
  3872 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3873 void RI_APIENTRY do_vgSetGlyphToImage(VGFont font, VGuint glyphIndex, VGImage image, const VGfloat glyphOrigin[2], const VGfloat escapement[2])
       
  3874 #else
       
  3875 void RI_APIENTRY vgSetGlyphToImage(VGFont font, VGuint glyphIndex, VGImage image, const VGfloat glyphOrigin[2], const VGfloat escapement[2])
       
  3876 #endif
       
  3877 {
       
  3878 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3879 	RI_IF_ERROR(!context->isValidFont(font), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid font handle
       
  3880     if(image != VG_INVALID_HANDLE)
       
  3881     {
       
  3882         RI_IF_ERROR(!context->isValidImage(image), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid image handle
       
  3883         RI_IF_ERROR(eglvgIsInUse((Image*)image), VG_IMAGE_IN_USE_ERROR, RI_NO_RETVAL); //image in use
       
  3884     }
       
  3885     RI_IF_ERROR(!glyphOrigin || !escapement || !isAligned(glyphOrigin,sizeof(VGfloat)) || !isAligned(escapement,sizeof(VGfloat)), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3886 	Font* f = (Font*)font;
       
  3887 
       
  3888 	try
       
  3889 	{
       
  3890         f->setGlyphToImage(glyphIndex, image, Vector2(inputFloat(glyphOrigin[0]), inputFloat(glyphOrigin[1])), Vector2(inputFloat(escapement[0]), inputFloat(escapement[1])));
       
  3891 	}
       
  3892 	catch(std::bad_alloc)
       
  3893 	{
       
  3894 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  3895 	}
       
  3896 	RI_RETURN(RI_NO_RETVAL);
       
  3897 }
       
  3898 
       
  3899 /*-------------------------------------------------------------------*//*!
       
  3900 * \brief	
       
  3901 * \param	
       
  3902 * \return	
       
  3903 * \note		
       
  3904 *//*-------------------------------------------------------------------*/
       
  3905 
       
  3906 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3907 void RI_APIENTRY do_vgClearGlyph(VGFont font, VGuint glyphIndex)
       
  3908 #else
       
  3909 void RI_APIENTRY vgClearGlyph(VGFont font, VGuint glyphIndex)
       
  3910 #endif
       
  3911 {
       
  3912 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3913 	RI_IF_ERROR(!context->isValidFont(font), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid font handle
       
  3914 	Font* f = (Font*)font;
       
  3915     Font::Glyph* g = f->findGlyph(glyphIndex);
       
  3916     RI_IF_ERROR(!g, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);   //glyphIndex not defined
       
  3917 
       
  3918 	f->clearGlyph(g);
       
  3919 
       
  3920 	RI_RETURN(RI_NO_RETVAL);
       
  3921 }
       
  3922 
       
  3923 /*-------------------------------------------------------------------*//*!
       
  3924 * \brief	
       
  3925 * \param	
       
  3926 * \return	
       
  3927 * \note		
       
  3928 *//*-------------------------------------------------------------------*/
       
  3929 
       
  3930 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3931 void RI_APIENTRY do_vgDrawGlyph(VGFont font, VGuint glyphIndex, VGbitfield paintModes, VGboolean allowAutoHinting)
       
  3932 #else
       
  3933 void RI_APIENTRY vgDrawGlyph(VGFont font, VGuint glyphIndex, VGbitfield paintModes, VGboolean allowAutoHinting)
       
  3934 #endif
       
  3935 {
       
  3936 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3937 	RI_IF_ERROR(!context->isValidFont(font), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid font handle
       
  3938 	RI_IF_ERROR(paintModes & ~(VG_FILL_PATH | VG_STROKE_PATH), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//invalid paint mode
       
  3939 	Font* f = (Font*)font;
       
  3940     Font::Glyph* g = f->findGlyph(glyphIndex);
       
  3941     RI_IF_ERROR(!g, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);   //glyphIndex not defined
       
  3942     RI_UNREF(allowAutoHinting); //RI doesn't implement autohinting
       
  3943 
       
  3944 	try
       
  3945 	{
       
  3946         if(paintModes)
       
  3947         {
       
  3948             Matrix3x3 userToSurfaceMatrix = context->m_glyphUserToSurface;
       
  3949             Vector2 t = context->m_glyphOrigin - g->m_origin;
       
  3950             Matrix3x3 n(1, 0, t.x,
       
  3951                         0, 1, t.y,
       
  3952                         0, 0, 1 );
       
  3953             userToSurfaceMatrix *= n;
       
  3954             userToSurfaceMatrix[2].set(0,0,1);		//force affinity
       
  3955 
       
  3956             bool ret = true;
       
  3957             if(g->m_image != VG_INVALID_HANDLE)
       
  3958                 ret = drawImage(context, g->m_image, userToSurfaceMatrix);
       
  3959             else if(g->m_path != VG_INVALID_HANDLE)
       
  3960                 ret = drawPath(context, g->m_path, userToSurfaceMatrix, paintModes);
       
  3961             if(!ret)
       
  3962             {
       
  3963                 RI_RETURN(RI_NO_RETVAL);
       
  3964             }
       
  3965         }
       
  3966 
       
  3967         context->m_glyphOrigin += g->m_escapement;
       
  3968         context->m_inputGlyphOrigin = context->m_glyphOrigin;
       
  3969 	}
       
  3970 	catch(std::bad_alloc)
       
  3971 	{
       
  3972 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  3973 	}
       
  3974 
       
  3975 	RI_RETURN(RI_NO_RETVAL);
       
  3976 }
       
  3977 
       
  3978 /*-------------------------------------------------------------------*//*!
       
  3979 * \brief	
       
  3980 * \param	
       
  3981 * \return	
       
  3982 * \note		
       
  3983 *//*-------------------------------------------------------------------*/
       
  3984 
       
  3985 #ifdef BUILD_WITH_PRIVATE_OPENVG
       
  3986 void RI_APIENTRY do_vgDrawGlyphs(VGFont font, VGint glyphCount, const VGuint *glyphIndices, const VGfloat *adjustments_x, const VGfloat *adjustments_y, VGbitfield paintModes, VGboolean allowAutoHinting)
       
  3987 #else
       
  3988 void RI_APIENTRY vgDrawGlyphs(VGFont font, VGint glyphCount, const VGuint *glyphIndices, const VGfloat *adjustments_x, const VGfloat *adjustments_y, VGbitfield paintModes, VGboolean allowAutoHinting)
       
  3989 #endif
       
  3990 {
       
  3991 	RI_GET_CONTEXT(RI_NO_RETVAL);
       
  3992 	RI_IF_ERROR(!context->isValidFont(font), VG_BAD_HANDLE_ERROR, RI_NO_RETVAL);	//invalid font handle
       
  3993 	RI_IF_ERROR(!glyphIndices || !isAligned(glyphIndices, sizeof(VGuint)) || glyphCount <= 0, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3994 	RI_IF_ERROR((adjustments_x && !isAligned(adjustments_x, sizeof(VGfloat))) || (adjustments_y && !isAligned(adjustments_y, sizeof(VGfloat))), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);
       
  3995 	RI_IF_ERROR(paintModes & ~(VG_FILL_PATH | VG_STROKE_PATH), VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);	//invalid paint mode
       
  3996 	Font* f = (Font*)font;
       
  3997 	for(int i=0;i<glyphCount;i++)
       
  3998 	{
       
  3999         Font::Glyph* g = f->findGlyph(glyphIndices[i]);
       
  4000         RI_IF_ERROR(!g, VG_ILLEGAL_ARGUMENT_ERROR, RI_NO_RETVAL);   //glyphIndex not defined
       
  4001     }
       
  4002     RI_UNREF(allowAutoHinting); //RI doesn't implement autohinting
       
  4003 
       
  4004 	try
       
  4005 	{
       
  4006 		for(int i=0;i<glyphCount;i++)
       
  4007 		{
       
  4008             Font::Glyph* g = f->findGlyph(glyphIndices[i]);
       
  4009 
       
  4010             if(paintModes)
       
  4011             {
       
  4012                 Matrix3x3 userToSurfaceMatrix = context->m_glyphUserToSurface;
       
  4013                 Vector2 t = context->m_glyphOrigin - g->m_origin;
       
  4014                 Matrix3x3 n(1, 0, t.x,
       
  4015                             0, 1, t.y,
       
  4016                             0, 0, 1 );
       
  4017                 userToSurfaceMatrix *= n;
       
  4018                 userToSurfaceMatrix[2].set(0,0,1);		//force affinity
       
  4019 
       
  4020                 bool ret = true;
       
  4021                 if(g->m_image != VG_INVALID_HANDLE)
       
  4022                     ret = drawImage(context, g->m_image, userToSurfaceMatrix);
       
  4023                 else if(g->m_path != VG_INVALID_HANDLE)
       
  4024                     ret = drawPath(context, g->m_path, userToSurfaceMatrix, paintModes);
       
  4025                 if(!ret)
       
  4026                 {
       
  4027                     RI_RETURN(RI_NO_RETVAL);
       
  4028                 }
       
  4029             }
       
  4030 
       
  4031             context->m_glyphOrigin += g->m_escapement;
       
  4032             if(adjustments_x)
       
  4033                 context->m_glyphOrigin.x += inputFloat(adjustments_x[i]);
       
  4034             if(adjustments_y)
       
  4035                 context->m_glyphOrigin.y += inputFloat(adjustments_y[i]);
       
  4036             context->m_inputGlyphOrigin = context->m_glyphOrigin;
       
  4037 		}
       
  4038 	}
       
  4039 	catch(std::bad_alloc)
       
  4040 	{
       
  4041 		context->setError(VG_OUT_OF_MEMORY_ERROR);
       
  4042 	}
       
  4043 
       
  4044 	RI_RETURN(RI_NO_RETVAL);
       
  4045 }
       
  4046