1 /* This is a demo of the high-performance GUIX graphics framework. */
2
3 #include <stdio.h>
4 #include "gx_api.h"
5 #include "partial_frame_buffer_16bpp_resources.h"
6 #include "partial_frame_buffer_16bpp_specifications.h"
7
8 GX_RESOURCE_ID line_color = GX_COLOR_ID_GRAY;
9 GX_RESOURCE_ID fill_color = GX_COLOR_ID_PURPLE;
10 INT radius = 160;
11 GX_BOOL anti_aliased = GX_TRUE;
12 GX_BOOL round_end = GX_TRUE;
13 GX_BOOL solid_fill = GX_TRUE;
14 GX_BOOL pixelmap_fill = GX_FALSE;
15 INT brush_width = 2;
16 INT start_angle = 60;
17 INT end_angle = 90;
18 INT angle_off = 0;
19 INT ellipse_b = 100;
20 GX_UBYTE brush_alpha = 255;
21 INT shape_screen_alpha = 0;
22 INT shape_screen_compress = 0;
23 INT fill_pixelmap_index = 0;
24
25 GX_RESOURCE_ID fill_pixelmap_id[4] = {GX_PIXELMAP_ID__565RGB, GX_PIXELMAP_ID__565RGB_COMPRESS, GX_PIXELMAP_ID__565RGB_ALPHA, GX_PIXELMAP_ID__565RGB_COMPRESS_ALPHA};
26
27 #define CIRCLE 0
28 #define ARC 1
29 #define PIE 2
30 #define POLYGON 3
31 #define ELLIPSE 4
32 #define RECTANGLE 5
33
34 #define ARC_TIMER 5
35 #define PIE_TIMER 6
36
37 #define ARC_TICKS 2
38 #define PIE_TICKS 10
39
40 INT draw_shape = CIRCLE;
41 INT pre_shape;
42
shapesscreen_event_handler(GX_WINDOW * window,GX_EVENT * myevent)43 UINT shapesscreen_event_handler(GX_WINDOW *window, GX_EVENT *myevent)
44 {
45 GX_WINDOW *pGraphicsWin = &shapes_screen.shapes_screen_graphics_window;
46
47 switch (myevent->gx_event_type)
48 {
49 case GX_EVENT_SHOW:
50 gx_window_event_process(window, myevent);
51 break;
52
53 case GX_SIGNAL(ID_BRUSH_ALPHA, GX_EVENT_SLIDER_VALUE):
54 brush_alpha = (GX_UBYTE)myevent->gx_event_payload.gx_event_longdata;
55 gx_numeric_prompt_value_set(&shapes_screen.shapes_screen_brush_alpha, brush_alpha);
56 gx_system_dirty_mark(pGraphicsWin);
57 break;
58
59 case GX_SIGNAL(ID_RADIUS_SLIDER, GX_EVENT_SLIDER_VALUE):
60 radius = myevent->gx_event_payload.gx_event_longdata;
61 gx_numeric_prompt_value_set(&shapes_screen.shapes_screen_radius, radius);
62 gx_system_dirty_mark(pGraphicsWin);
63 break;
64
65 case GX_SIGNAL(ID_BRUSH_WIDTH, GX_EVENT_SLIDER_VALUE):
66 brush_width = myevent->gx_event_payload.gx_event_longdata;
67 gx_numeric_prompt_value_set(&shapes_screen.shapes_screen_brush_width, brush_width);
68 gx_system_dirty_mark(pGraphicsWin);
69 break;
70
71 case GX_SIGNAL(ID_ANTI_ALIASED, GX_EVENT_TOGGLE_ON):
72 anti_aliased = GX_TRUE;
73 gx_system_dirty_mark(pGraphicsWin);
74 break;
75
76 case GX_SIGNAL(ID_ANTI_ALIASED, GX_EVENT_TOGGLE_OFF):
77 anti_aliased = GX_FALSE;
78 gx_system_dirty_mark(pGraphicsWin);
79 break;
80
81 case GX_SIGNAL(ID_ROUND_END, GX_EVENT_TOGGLE_ON):
82 round_end = GX_TRUE;
83 gx_system_dirty_mark(pGraphicsWin);
84 break;
85
86 case GX_SIGNAL(ID_ROUND_END, GX_EVENT_TOGGLE_OFF):
87 round_end = GX_FALSE;
88 gx_system_dirty_mark(pGraphicsWin);
89 break;
90
91 case GX_SIGNAL(ID_SOLID_FILL, GX_EVENT_TOGGLE_ON):
92 solid_fill = GX_TRUE;
93 gx_system_dirty_mark(pGraphicsWin);
94 break;
95
96 case GX_SIGNAL(ID_SOLID_FILL, GX_EVENT_TOGGLE_OFF):
97 solid_fill = GX_FALSE;
98 gx_system_dirty_mark(pGraphicsWin);
99 break;
100
101 case GX_SIGNAL(ID_PIXELMAP_FILL, GX_EVENT_TOGGLE_ON):
102 pixelmap_fill = GX_TRUE;
103 gx_system_dirty_mark(pGraphicsWin);
104 break;
105
106 case GX_SIGNAL(ID_PIXELMAP_FILL, GX_EVENT_TOGGLE_OFF):
107 pixelmap_fill = GX_FALSE;
108 gx_system_dirty_mark(pGraphicsWin);
109 break;
110
111 case GX_SIGNAL(ID_ALPHA, GX_EVENT_TOGGLE_ON):
112 shape_screen_alpha = 2;
113 gx_system_dirty_mark(pGraphicsWin);
114 break;
115
116 case GX_SIGNAL(ID_ALPHA, GX_EVENT_TOGGLE_OFF):
117 shape_screen_alpha = 0;
118 gx_system_dirty_mark(pGraphicsWin);
119 break;
120
121 case GX_SIGNAL(ID_COMPRESS, GX_EVENT_TOGGLE_ON):
122 shape_screen_compress = 1;
123 gx_system_dirty_mark(pGraphicsWin);
124 break;
125
126 case GX_SIGNAL(ID_COMPRESS, GX_EVENT_TOGGLE_OFF):
127 shape_screen_compress = 0;
128 gx_system_dirty_mark(pGraphicsWin);
129 break;
130
131 case GX_SIGNAL(ID_CIRCLE, GX_EVENT_RADIO_SELECT):
132 draw_shape = CIRCLE;
133 gx_system_dirty_mark(pGraphicsWin);
134 break;
135
136 case GX_SIGNAL(ID_ELLIPSE, GX_EVENT_RADIO_SELECT):
137 draw_shape = ELLIPSE;
138 gx_system_dirty_mark(pGraphicsWin);
139 break;
140
141 case GX_SIGNAL(ID_ARC, GX_EVENT_RADIO_SELECT):
142 draw_shape = ARC;
143 end_angle = start_angle;
144 gx_system_timer_start(pGraphicsWin, ARC_TIMER, ARC_TICKS, ARC_TICKS);
145 gx_system_dirty_mark(pGraphicsWin);
146 break;
147
148 case GX_SIGNAL(ID_PIE, GX_EVENT_RADIO_SELECT):
149 draw_shape = PIE;
150 gx_system_timer_start(pGraphicsWin, PIE_TIMER, PIE_TICKS, PIE_TICKS);
151 gx_system_dirty_mark(pGraphicsWin);
152 break;
153
154 case GX_SIGNAL(ID_POLYGON, GX_EVENT_RADIO_SELECT):
155 draw_shape = POLYGON;
156 gx_system_dirty_mark(pGraphicsWin);
157 break;
158
159 case GX_SIGNAL(ID_RECTANGLE, GX_EVENT_RADIO_SELECT):
160 draw_shape = RECTANGLE;
161 gx_system_dirty_mark(pGraphicsWin);
162 break;
163
164 case GX_EVENT_TIMER:
165 if (myevent->gx_event_payload.gx_event_timer_id == ARC_TIMER)
166 {
167 /* Update arc parameter. */
168 end_angle += 2;
169 if (end_angle == 360)
170 {
171 gx_system_timer_stop(pGraphicsWin, ARC_TIMER);
172 }
173 }
174 else if (myevent->gx_event_payload.gx_event_timer_id == PIE_TIMER)
175 {
176 /* Update pie parameter. */
177 angle_off += 2;
178 if (angle_off >= 360)
179 {
180 angle_off = 0;
181 }
182 gx_system_dirty_mark(pGraphicsWin);
183 }
184 break;
185
186 default:
187 return gx_window_event_process(window, myevent);
188 break;
189 }
190 fill_pixelmap_index = shape_screen_alpha + shape_screen_compress;
191 return 0;
192 }
193
graphics_draw(GX_WINDOW * window)194 VOID graphics_draw(GX_WINDOW *window)
195 {
196 ULONG brush_style = 0;
197 GX_RECTANGLE rect;
198 GX_POINT rectangle[4] = { { 188, 50 },{ 254, 50 },{ 254, 150 },{ 188, 150 } };
199 GX_POINT pentagon[5] = { { 290, 90 },{ 335, 50 },{ 380, 90 },{ 360, 150 },{ 310, 150 } };
200 GX_POINT concave[6] = { { 50, 50 },{ 90, 80 },{ 130, 50 },{ 130, 150 },{ 90, 110 },{ 50, 150 } };
201 GX_POINT star[10] = { { 173, 227 },{ 212, 227 },{ 223, 187 },{ 237, 227 },{ 273, 227 },{ 244, 253 },{ 256, 294 },{ 226, 270 },{ 192, 293 },{ 203, 253 } };
202 GX_POINT self_intersection[8] = { { 110, 321 },{ 189, 415 },{ 266, 321 },{ 334, 415 },{ 334, 321 },{ 264, 415 },{ 189, 321 },{ 110, 415 } };
203 INT xcenter = 213;
204 INT ycenter = 230;
205 GX_BRUSH *brush;
206
207 gx_context_brush_get(&brush);
208 gx_window_background_draw((GX_WINDOW*)window);
209 brush -> gx_brush_alpha = brush_alpha;
210 gx_widget_children_draw((GX_WIDGET *)window);
211
212 if (anti_aliased)
213 {
214 brush_style |= GX_BRUSH_ALIAS;
215 }
216
217 if (solid_fill)
218 {
219 brush_style |= GX_BRUSH_SOLID_FILL;
220 }
221
222 if (pixelmap_fill)
223 {
224 brush_style |= GX_BRUSH_PIXELMAP_FILL;
225 gx_context_pixelmap_set(fill_pixelmap_id[fill_pixelmap_index]);
226 }
227
228 if (round_end)
229 {
230 brush_style |= GX_BRUSH_ROUND;
231 }
232
233 gx_context_brush_define(line_color, fill_color, brush_style);
234 gx_context_brush_width_set(brush_width);
235
236
237 switch (draw_shape)
238 {
239
240 case CIRCLE:
241 gx_canvas_circle_draw(xcenter, ycenter, radius);
242 break;
243
244 case ARC:
245
246 gx_canvas_arc_draw(xcenter, ycenter, radius, start_angle, end_angle);
247 break;
248
249 case PIE:
250 gx_context_brush_define(GX_COLOR_ID_GRAY, GX_COLOR_ID_RED, brush_style);
251 gx_canvas_pie_draw(xcenter, ycenter, radius, 60 + angle_off, 150 + angle_off);
252
253 gx_context_brush_define(GX_COLOR_ID_GRAY, GX_COLOR_ID_YELLOW, brush_style);
254 gx_canvas_pie_draw(xcenter, ycenter, radius, 150 + angle_off, 200 + angle_off);
255
256 gx_context_brush_define(GX_COLOR_ID_GRAY, GX_COLOR_ID_PINK, brush_style);
257 gx_canvas_pie_draw(xcenter, ycenter, radius, 200 + angle_off, 280 + angle_off);
258
259 gx_context_brush_define(GX_COLOR_ID_GRAY, GX_COLOR_ID_PURPLE, brush_style);
260 gx_canvas_pie_draw(xcenter, ycenter, radius, 280 + angle_off, 60 + angle_off);
261 break;
262
263 case RECTANGLE:
264 gx_context_line_color_set(GX_COLOR_ID_RED);
265 gx_context_fill_color_set(GX_COLOR_ID_YELLOW);
266 rect = window->gx_widget_size;
267 gx_utility_rectangle_resize(&rect, -10);
268 gx_canvas_rectangle_draw(&rect);
269
270 gx_utility_rectangle_resize(&rect, -30);
271 gx_context_fill_color_set(GX_COLOR_ID_BROWN);
272 gx_canvas_rectangle_draw(&rect);
273
274 gx_utility_rectangle_resize(&rect, -30);
275 gx_context_line_color_set(GX_COLOR_ID_WHITE);
276 gx_context_fill_color_set(GX_COLOR_ID_BLACK);
277 gx_canvas_rectangle_draw(&rect);
278 break;
279
280 case POLYGON:
281 gx_context_brush_define(GX_COLOR_ID_GREEN, fill_color, brush_style);
282 gx_canvas_polygon_draw(rectangle, 4);
283 gx_canvas_polygon_draw(pentagon, 5);
284 gx_canvas_polygon_draw(concave, 6);
285 gx_canvas_polygon_draw(star, 10);
286 gx_canvas_polygon_draw(self_intersection, 8);
287 break;
288
289 case ELLIPSE:
290 gx_context_brush_define(GX_COLOR_ID_BROWN, GX_COLOR_ID_YELLOW, brush_style);
291 gx_canvas_ellipse_draw(xcenter, ycenter, radius, ellipse_b);
292
293 if (radius > 50)
294 {
295 gx_context_brush_define(GX_COLOR_ID_BROWN, GX_COLOR_ID_WHITE, brush_style);
296 gx_canvas_ellipse_draw(xcenter, ycenter, radius - 50, ellipse_b);
297 }
298
299 if (radius > 100)
300 {
301 gx_context_brush_define(GX_COLOR_ID_BROWN, GX_COLOR_ID_YELLOW, brush_style);
302 gx_canvas_ellipse_draw(xcenter, ycenter, radius - 100, ellipse_b);
303 }
304 break;
305 }
306
307 }