8 #define ELEMENTS(x) (sizeof(x)/sizeof((x)[0]))
20 struct object objects
[32];
23 VGfloat identity_matrix
[] = {1, 0, 0, 0, 1, 0, 0, 0, 1};
25 struct character cartman
;
27 static void add_object_fill(const VGubyte
*segments
, VGint num_segments
,
28 const VGfloat
*coords
,
33 object
.path
= vgCreatePath(VG_PATH_FORMAT_STANDARD
, VG_PATH_DATATYPE_F
,
34 1, 0, 0, 0, VG_PATH_CAPABILITY_ALL
);
35 vgAppendPathData(object
.path
, num_segments
, segments
, coords
);
37 object
.fill
= vgCreatePaint();
38 vgSetColor(object
.fill
, color
);
39 memcpy(object
.matrix
, identity_matrix
, 9 * sizeof(VGfloat
));
40 object
.draw_mode
= VG_FILL_PATH
;
42 cartman
.objects
[cartman
.num_objects
] = object
;
43 ++cartman
.num_objects
;
47 static void add_object_stroke(const VGubyte
*segments
, VGint num_segments
,
48 const VGfloat
*coords
,
49 VGuint color
, VGfloat width
)
53 object
.path
= vgCreatePath(VG_PATH_FORMAT_STANDARD
, VG_PATH_DATATYPE_F
,
54 1, 0, 0, 0, VG_PATH_CAPABILITY_ALL
);
55 vgAppendPathData(object
.path
, num_segments
, segments
, coords
);
57 object
.stroke
= vgCreatePaint();
58 vgSetColor(object
.stroke
, color
);
59 memcpy(object
.matrix
, identity_matrix
, 9 * sizeof(VGfloat
));
60 object
.draw_mode
= VG_STROKE_PATH
;
61 object
.stroke_width
= width
;
63 cartman
.objects
[cartman
.num_objects
] = object
;
64 ++cartman
.num_objects
;
68 static void add_object_fillm(const VGubyte
*segments
, VGint num_segments
,
69 const VGfloat
*coords
,
75 object
.path
= vgCreatePath(VG_PATH_FORMAT_STANDARD
, VG_PATH_DATATYPE_F
,
76 1, 0, 0, 0, VG_PATH_CAPABILITY_ALL
);
77 vgAppendPathData(object
.path
, num_segments
, segments
, coords
);
79 object
.fill
= vgCreatePaint();
80 vgSetColor(object
.fill
, color
);
81 memcpy(object
.matrix
, matrix
, 9 * sizeof(VGfloat
));
82 object
.draw_mode
= VG_FILL_PATH
;
84 cartman
.objects
[cartman
.num_objects
] = object
;
85 ++cartman
.num_objects
;
89 static void add_object_m(const VGubyte
*segments
, VGint num_segments
,
90 const VGfloat
*coords
,
92 VGuint stroke_color
, VGfloat stroke_width
,
97 object
.path
= vgCreatePath(VG_PATH_FORMAT_STANDARD
, VG_PATH_DATATYPE_F
,
98 1, 0, 0, 0, VG_PATH_CAPABILITY_ALL
);
99 vgAppendPathData(object
.path
, num_segments
, segments
, coords
);
100 memcpy(object
.matrix
, matrix
, 9 * sizeof(VGfloat
));
102 object
.fill
= vgCreatePaint();
103 vgSetColor(object
.fill
, fill_color
);
104 object
.draw_mode
= VG_FILL_PATH
| VG_STROKE_PATH
;
106 object
.stroke
= vgCreatePaint();
107 vgSetColor(object
.stroke
, stroke_color
);
108 object
.stroke_width
= stroke_width
;
110 cartman
.objects
[cartman
.num_objects
] = object
;
111 ++cartman
.num_objects
;
114 static void init_character()
117 const VGubyte segments
[] = {VG_MOVE_TO_ABS
,
123 const VGfloat coords
[] = {181.83267, 102.60408,
124 181.83267,102.60408, 185.53793,114.5749, 186.5355,115.00243,
125 187.53306,115.42996, 286.0073,115.00243, 286.0073,115.00243,
126 286.0073,115.00243, 292.70526,103.45914, 290.85263,101.03648,
127 289.00001,98.61381, 181.54765,102.31906, 181.83267,102.60408
129 VGuint color
= 0x7c4e32ff;
130 add_object_fill(segments
, ELEMENTS(segments
),
134 const VGubyte segments
[] = {
147 const VGfloat coords
[] = {188.62208,50.604156,
148 188.62208,50.604156, 176.73127,60.479579, 170.68509,69.548844,
149 164.63892,78.618109, 175.11895,79.827344, 175.11895,79.827344,
151 176.52973,98.368952, 189.83131,110.05823, 208.97754,110.25976,
152 228.12377,110.46131, 244.24691,111.67054, 247.06846,110.25976,
153 249.89,108.849, 258.95927,106.8336, 260.16851,105.01975,
154 261.37774,103.2059, 296.84865,106.43053, 297.05019,91.919698,
155 297.25172,77.408874, 306.11945,64.308824, 282.13628,51.611853,
156 258.15311,38.914882, 189.2267,49.999539, 188.62208,50.604156
159 VGuint color
= 0xe30000ff;
160 add_object_fill(segments
, ELEMENTS(segments
),
164 const VGubyte segments
[] = {
172 const VGfloat coords
[] = {
174 68.25,93.296, 54.642,105, 37.875,105,
175 21.108,105, 7.5,93.296, 7.5,78.875,
176 7.5,64.454, 21.108,52.75, 37.875,52.75,
177 54.642,52.75, 68.25,64.454, 68.25,78.875
180 VGuint color
= 0xffe1c4ff;
186 add_object_fillm(segments
, ELEMENTS(segments
),
187 coords
, color
, matrix
);
190 const VGubyte segments
[] = {
191 VG_MOVE_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
192 VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CLOSE_PATH
194 const VGfloat coords
[] = {
196 173.53626,68.814326, 176.70232,68.971782, 180.55009,71.679467,
197 184.39785,74.387153, 199.19294,80.036105, 191.52334,86.500482,
198 189.02942,88.6025, 183.97032,85.787933, 180.26507,86.928011,
199 178.8737,87.356121, 174.71827,89.783259, 171.8028,87.494856,
200 166.95426,83.689139, 163.51779,76.861986, 170.14687,71.536958
203 VGuint color
= 0xfff200ff;
204 add_object_fill(segments
, ELEMENTS(segments
),
208 const VGubyte segments
[] = {
209 VG_MOVE_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
210 VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
211 VG_CUBIC_TO_ABS
, VG_CLOSE_PATH
213 const VGfloat coords
[] = {
215 299.83075,66.834136, 287.85993,64.69649, 284.15467,72.962055,
216 280.44942,81.227621, 280.1644,78.234916, 280.1644,79.374994,
217 280.1644,80.515072, 278.16927,84.077816, 284.86722,83.792796,
218 291.56518,83.507777, 291.99271,86.785501, 294.84291,86.642991,
219 297.6931,86.500482, 303.536,85.645423, 303.67851,80.657582,
220 303.82102,75.66974, 302.68094,65.551548, 299.83075,66.834136
223 VGuint color
= 0xfff200ff;
224 add_object_fill(segments
, ELEMENTS(segments
),
228 const VGubyte segments
[] = {
229 VG_MOVE_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
231 const VGfloat coords
[] = {
233 240.83171,75.81225, 241.54426,88.495618, 242.25681,91.488323,
234 242.96936,94.481028, 240.6892,108.01945, 240.83171,110.01459,
235 240.97422,112.00973, 240.97422,111.01216, 240.97422,111.01216
237 VGuint color
= 0x000000ff;
238 VGfloat swidth
= 1.14007807;
239 add_object_stroke(segments
, ELEMENTS(segments
), coords
, color
, swidth
);
242 const VGubyte segments
[] = {
243 VG_MOVE_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
244 VG_CUBIC_TO_ABS
, VG_LINE_TO_ABS
, VG_LINE_TO_ABS
, VG_CLOSE_PATH
246 const VGfloat coords
[] = {
248 83.375,96.121, 83.067,96.625, 82.6875,96.625,
249 82.308,96.625, 82,96.121, 82,95.5,
250 82,94.879, 82.308,94.375, 82.6875,94.375,
251 83.066677,94.375, 83.374492,94.878024, 83.374999,95.498494,
255 VGuint fill_color
= 0x000000ff;
256 VGuint stroke_color
= 0x000000ff;
257 VGfloat swidth
= 0.60000002;
258 VGfloat matrix1
[] = {
261 145.4927, -15.10897, 1
263 VGfloat matrix2
[] = {
266 144.2814,-27.93485, 1
268 VGfloat matrix3
[] = {
273 add_object_m(segments
, ELEMENTS(segments
), coords
,
274 fill_color
, stroke_color
, swidth
, matrix1
);
275 add_object_m(segments
, ELEMENTS(segments
), coords
,
276 fill_color
, stroke_color
, swidth
, matrix2
);
277 add_object_m(segments
, ELEMENTS(segments
), coords
,
278 fill_color
, stroke_color
, swidth
, matrix3
);
281 const VGubyte segments
[] = {
283 VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
284 VG_LINE_TO_ABS
, VG_CLOSE_PATH
286 const VGfloat coords
[] = {
288 179.41001,115.28745, 207.48443,109.30204, 236.84144,115.14494,
289 236.84144,115.14494, 274.74903,109.87208, 291.8502,115.42996,
293 VGuint color
= 0x000000ff;
294 add_object_fill(segments
, ELEMENTS(segments
),
298 const VGubyte segments
[] = {
299 VG_MOVE_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
300 VG_CUBIC_TO_ABS
, VG_LINE_TO_ABS
, VG_LINE_TO_ABS
, VG_CLOSE_PATH
302 const VGfloat coords
[] = {
304 83.792156,69.669865, 82.72301,70.897403, 81.40567,70.897403,
305 80.08833,70.897403, 79.019185,69.669865, 79.019185,68.157364,
306 79.019185,66.644862, 80.08833,65.417325, 81.40567,65.417325,
307 82.721887,65.417325, 83.790391,66.642485, 83.792153,68.153696,
311 VGuint fill_color
= 0x000000ff;
312 VGuint stroke_color
= 0x000000ff;
313 VGfloat swidth
= 0.52891117;
314 VGfloat matrix1
[] = {
317 145.2489,-15.58714, 1
319 add_object_m(segments
, ELEMENTS(segments
), coords
,
320 fill_color
, stroke_color
, swidth
, matrix1
);
323 const VGubyte segments
[] = {
324 VG_MOVE_TO_ABS
, VG_CUBIC_TO_ABS
326 const VGfloat coords
[] = {
328 232.28113,66.976646, 237.98152,70.539389, 245.39202,66.549116
330 VGuint color
= 0x000000ff;
331 VGfloat swidth
= 0.60299999;
332 add_object_stroke(segments
, ELEMENTS(segments
), coords
, color
, swidth
);
335 const VGubyte segments
[] = {
336 VG_MOVE_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
337 VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CLOSE_PATH
339 const VGfloat coords
[] = {
341 185.96908,30.061986, 187.76995,14.508377, 203.23909,3.7427917,
342 209.95028,-0.92779696, 219.37764,-4.9841866, 232.1078,-6.00046,
343 246.13578,-7.1203411, 256.92106,-2.8560739, 264.81774,1.9451947,
344 280.60485,11.543934, 284.31582,25.937274, 284.08015,26.526452,
345 283.7266,27.410336, 240.83461,1.9346323, 185.96908,30.061986
347 VGuint color
= 0x8ed8f8ff;
348 add_object_fill(segments
, ELEMENTS(segments
), coords
, color
);
351 const VGubyte segments
[] = {
352 VG_MOVE_TO_ABS
, VG_LINE_TO_ABS
, VG_CUBIC_TO_ABS
,
353 VG_LINE_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CLOSE_PATH
355 const VGfloat coords
[] = {
358 185.82295,29.211562, 234.70379,2.277219, 284.01217,25.078779,
360 284.86722,27.643954, 236.69893,4.5573746, 185.39542,32.061757
362 VGuint color
= 0xfff200ff;
363 add_object_fill(segments
, ELEMENTS(segments
), coords
, color
);
367 const VGubyte segments
[] = {
368 VG_MOVE_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
369 VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
370 VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
371 VG_CUBIC_TO_ABS
, VG_CLOSE_PATH
373 const VGfloat coords
[] = {
375 220.49206,-8.44929, 225.15564,-10.904934, 230.21473,-11.189954,
376 235.27383,-11.474973, 243.27521,-13.287236, 249.21385,-5.724198,
377 249.89961,-4.850868, 249.28247,-4.332166, 248.62298,-3.971398,
378 247.79117,-3.516361, 247.13703,-3.392737, 246.16222,-3.408047,
379 243.63973,-3.447664, 242.54183,-3.850701, 242.54183,-3.850701,
380 242.54183,-3.850701, 238.78367,-1.737343, 236.20014,-3.565682,
381 233.88436,-5.204544, 234.27626,-4.56325, 234.27626,-4.56325,
382 234.27626,-4.56325, 232.33303,-2.975658, 230.85603,-2.995643,
383 228.59433,-3.025282, 227.73672,-4.501857, 227.21966,-4.93027,
384 226.76318,-4.932008, 226.50948,-4.491995, 226.50948,-4.491995,
385 226.50948,-4.491995, 224.53199,-2.085883, 222.51431,-2.467064,
386 221.48814,-2.66093, 218.91968,-3.15318, 219.74027,-5.917093
388 VGuint color
= 0xfff200ff;
389 add_object_fill(segments
, ELEMENTS(segments
), coords
, color
);
392 const VGubyte segments
[] = {
393 VG_MOVE_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
394 VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CLOSE_PATH
396 const VGfloat coords
[] = {
398 178.97347,181.2154, 168.0245,193.51193, 154.53381,193.51193,
399 141.04312,193.51193, 130.09416,181.2154, 130.09416,166.06432,
400 130.09416,150.91323, 141.04312,138.6167, 154.53381,138.6167,
401 168.0245,138.6167, 178.97347,150.91323, 178.97347,166.06432
403 VGuint color
= 0xffffffff;
404 VGfloat matrix1
[] = {
405 0.466614,-0.23492, 0,
406 0.108683,0.436638, 0,
407 134.5504,-0.901632, 1
409 VGfloat matrix2
[] = {
410 -0.466614,-0.23492, 0,
411 -0.108683,0.436638, 0,
412 338.4496,-0.512182, 1
414 add_object_fillm(segments
, ELEMENTS(segments
), coords
, color
, matrix1
);
415 add_object_fillm(segments
, ELEMENTS(segments
), coords
, color
, matrix2
);
418 const VGubyte segments
[] = {
419 VG_MOVE_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
,
420 VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CLOSE_PATH
422 const VGfloat coords
[] = {
424 123.82758,166.79125, 122.59232,168.19497, 121.07029,168.19497,
425 119.54826,168.19497, 118.313,166.79125, 118.313,165.06168,
426 118.313,163.3321, 119.54826,161.92839, 121.07029,161.92839,
427 122.59232,161.92839, 123.82758,163.3321, 123.82758,165.06168
429 VGuint color
= 0x000000ff;
430 VGfloat matrix1
[] = {
435 VGfloat matrix2
[] = {
440 add_object_fillm(segments
, ELEMENTS(segments
), coords
, color
, matrix1
);
441 add_object_fillm(segments
, ELEMENTS(segments
), coords
, color
, matrix2
);
444 const VGubyte segments
[] = {
445 VG_MOVE_TO_ABS
, VG_CUBIC_TO_ABS
, VG_CUBIC_TO_ABS
447 const VGfloat coords
[] = {
449 197.25,54.5, 211.75,71.5, 229.25,71.5,
450 246.75,71.5, 261.74147,71.132714, 277.75,50.75
452 VGuint color
= 0x000000ff;
453 VGfloat swidth
= 0.60299999;
454 add_object_stroke(segments
, ELEMENTS(segments
), coords
, color
, swidth
);
462 float clear_color
[4] = {1.0, 1.0, 1.0, 1.0};
463 vgSetfv(VG_CLEAR_COLOR
, 4, clear_color
);
468 /* new window size or exposure */
470 reshape(int w
, int h
)
478 VGfloat save_matrix
[9];
480 vgClear(0, 0, eglutGetWindowWidth(), eglutGetWindowHeight());
482 vgSeti(VG_MATRIX_MODE
, VG_MATRIX_PATH_USER_TO_SURFACE
);
485 vgTranslate(160, 60);
487 vgTranslate(-160, -100);
488 vgGetMatrix(save_matrix
);
489 for (i
= 0; i
< cartman
.num_objects
; ++i
) {
490 struct object object
= cartman
.objects
[i
];
491 if ((object
.draw_mode
& VG_STROKE_PATH
)) {
492 vgSetf(VG_STROKE_LINE_WIDTH
, object
.stroke_width
);
493 vgSetPaint(object
.stroke
, VG_STROKE_PATH
);
495 if ((object
.draw_mode
& VG_FILL_PATH
))
496 vgSetPaint(object
.fill
, VG_FILL_PATH
);
497 vgMultMatrix(object
.matrix
);
498 vgDrawPath(object
.path
, object
.draw_mode
);
499 vgLoadMatrix(save_matrix
);
506 int main(int argc
, char **argv
)
508 eglutInitWindowSize(400, 400);
509 eglutInitAPIMask(EGLUT_OPENVG_BIT
);
510 eglutInit(argc
, argv
);
512 eglutCreateWindow("sp");
514 eglutReshapeFunc(reshape
);
515 eglutDisplayFunc(draw
);