|
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 |