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