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 }