1 #include "eglcommon.h"
2
3 #include <VG/openvg.h>
4
5 #include <stdio.h>
6 #include <string.h>
7
8 static const VGfloat white_color[4] = {1.0, 1.0, 1.0, 1.0};
9
10 static VGPath path;
11 static VGPaint lingrad, radgrad, pattern;
12
13 VGColorRampSpreadMode spread = VG_COLOR_RAMP_SPREAD_PAD;
14
15 static void
init_linear_gradient(VGPaint paint)16 init_linear_gradient(VGPaint paint)
17 {
18 VGfloat rampStop[] = {0.00f, 1.0f, 1.0f, 1.0f, 1.0f,
19 0.33f, 1.0f, 0.0f, 0.0f, 1.0f,
20 0.66f, 0.0f, 1.0f, 0.0f, 1.0f,
21 1.00f, 0.0f, 0.0f, 1.0f, 1.0f};
22 VGfloat linearGradient[4] = {25.0f, 25.0f, 75.0f, 75.0f};
23
24 vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_LINEAR_GRADIENT);
25 vgSetParameteri(paint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, spread);
26 vgSetParameterfv(paint, VG_PAINT_LINEAR_GRADIENT, 4, linearGradient);
27 vgSetParameterfv(paint, VG_PAINT_COLOR_RAMP_STOPS, 20, rampStop);
28 }
29
30 static void
init_radial_gradient(VGPaint paint,VGboolean centered)31 init_radial_gradient(VGPaint paint, VGboolean centered)
32 {
33 VGfloat centeredGradient[5] = {50.0f, 50.0f, 50.0f, 50.0f, 50};
34 VGfloat noncenteredGradient[5] = {50.0f, 50.0f, 62.5f, 62.5f, 50};
35 VGfloat rampStop[] = {0.00f, 1.0f, 1.0f, 1.0f, 1.0f,
36 0.33f, 1.0f, 0.0f, 0.0f, 1.0f,
37 0.66f, 0.0f, 1.0f, 0.0f, 1.0f,
38 1.00f, 0.0f, 0.0f, 1.0f, 1.0f};
39 VGfloat *radialGradient =
40 (centered) ? centeredGradient : noncenteredGradient;
41
42 vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_RADIAL_GRADIENT);
43 vgSetParameteri(paint, VG_PAINT_COLOR_RAMP_SPREAD_MODE, spread);
44 vgSetParameterfv(paint, VG_PAINT_RADIAL_GRADIENT, 5, radialGradient);
45 vgSetParameterfv(paint, VG_PAINT_COLOR_RAMP_STOPS, 20, rampStop);
46 }
47
48 static void
init_pattern(VGPaint paint)49 init_pattern(VGPaint paint)
50 {
51 const VGfloat red[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
52 const VGfloat green[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
53 const VGfloat blue[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
54 const VGfloat white[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
55 VGImage img;
56
57 img = vgCreateImage(VG_sRGBA_8888, 32, 32,
58 VG_IMAGE_QUALITY_NONANTIALIASED);
59
60 vgSetfv(VG_CLEAR_COLOR, 4, red);
61 vgClearImage(img, 0, 0, 16, 16);
62 vgSetfv(VG_CLEAR_COLOR, 4, green);
63 vgClearImage(img, 16, 0, 16, 16);
64 vgSetfv(VG_CLEAR_COLOR, 4, blue);
65 vgClearImage(img, 0, 16, 16, 16);
66 vgSetfv(VG_CLEAR_COLOR, 4, white);
67 vgClearImage(img, 16, 16, 16, 16);
68
69 vgSetParameteri(paint, VG_PAINT_TYPE, VG_PAINT_TYPE_PATTERN);
70 vgSetParameteri(paint, VG_PAINT_PATTERN_TILING_MODE, VG_TILE_REPEAT);
71 vgPaintPattern(paint, img);
72 }
73
74 static void
init(void)75 init(void)
76 {
77 static const VGubyte sqrCmds[5] = {VG_MOVE_TO_ABS, VG_HLINE_TO_ABS, VG_VLINE_TO_ABS, VG_HLINE_TO_ABS, VG_CLOSE_PATH};
78 static const VGfloat sqrCoords[5] = {0.0f, 0.0f, 100.0f, 100.0f, 0.0f};
79
80 path = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1, 0, 0, 0,
81 VG_PATH_CAPABILITY_APPEND_TO);
82 vgAppendPathData(path, 5, sqrCmds, sqrCoords);
83
84 lingrad = vgCreatePaint();
85 init_linear_gradient(lingrad);
86
87 radgrad = vgCreatePaint();
88 init_radial_gradient(radgrad, VG_TRUE);
89
90 pattern = vgCreatePaint();
91 init_pattern(pattern);
92
93 vgSetfv(VG_CLEAR_COLOR, 4, white_color);
94 vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_NONANTIALIASED);
95 }
96
97 /* new window size or exposure */
98 static void
reshape(int w,int h)99 reshape(int w, int h)
100 {
101 vgLoadIdentity();
102 }
103
104 static void
draw_with_paint(VGPaint paint,VGint x,VGint y)105 draw_with_paint(VGPaint paint, VGint x, VGint y)
106 {
107 vgSetPaint(paint, VG_FILL_PATH | VG_STROKE_PATH);
108
109 /*
110 * The paint and the path are both 100x100. Scale the paint by 2
111 * horizontally and draw the path twice to cover the scaled paint.
112 */
113
114 /* scale the paint */
115 vgSeti(VG_MATRIX_MODE, VG_MATRIX_FILL_PAINT_TO_USER);
116 vgLoadIdentity();
117 vgScale(2.0f, 1);
118 vgSeti(VG_MATRIX_MODE, VG_MATRIX_STROKE_PAINT_TO_USER);
119 vgLoadIdentity();
120 vgScale(2.0f, 1);
121
122 /* draw the left half */
123 vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
124 vgLoadIdentity();
125 vgTranslate(x, y);
126 vgDrawPath(path, VG_FILL_PATH | VG_STROKE_PATH);
127
128 /* draw the right half */
129 vgTranslate(100, 0);
130 vgSeti(VG_MATRIX_MODE, VG_MATRIX_FILL_PAINT_TO_USER);
131 vgTranslate(-50, 0);
132 vgSeti(VG_MATRIX_MODE, VG_MATRIX_STROKE_PAINT_TO_USER);
133 vgTranslate(-50, 0);
134
135 vgDrawPath(path, VG_FILL_PATH | VG_STROKE_PATH);
136 }
137
138 static void
draw(void)139 draw(void)
140 {
141 vgClear(0, 0, window_width(), window_height());
142
143 draw_with_paint(lingrad, 100, 25);
144 draw_with_paint(radgrad, 100, 150);
145 draw_with_paint(pattern, 100, 275);
146 }
147
148
main(int argc,char ** argv)149 int main(int argc, char **argv)
150 {
151 set_window_size(400, 400);
152
153 return run(argc, argv, init, reshape,
154 draw, 0);
155 }
156