1 /* This is a small demo of the high-performance GUIX graphics framework. */
2
3 #include <stdio.h>
4 #include "gx_api.h"
5
6 /* Define constants for the GUIX Win32 demo. */
7
8 /* Define constants specific to this implemenation. */
9
10 #define DEMO_DISPLAY_WIDTH 320
11 #define DEMO_DISPLAY_HEIGHT 240
12
13 /* User-defined color ID */
14 #define GX_1BPP_BLACK 0x00
15 #define GX_1BPP_WHITE 0x01
16
17
18 /* User-defined color table. */
19 static GX_COLOR demo_color_table[] =
20 {
21 GX_1BPP_BLACK,
22 GX_1BPP_WHITE,
23 };
24
25 extern GX_PIXELMAP pic1_1bpp_nocompressed_pixelmap;
26 extern GX_PIXELMAP pic1_1bpp_compressed_pixelmap;
27 extern GX_PIXELMAP pic1_1bpp_transparent_pixelmap;
28 GX_PIXELMAP *demo_pixelmap_table[] = {
29 NULL,
30 &pic1_1bpp_nocompressed_pixelmap,
31 &pic1_1bpp_compressed_pixelmap,
32 &pic1_1bpp_transparent_pixelmap,
33 };
34
35 enum demo_pixelmaps {
36 PIC_1BPP_RAW = 1,
37 PIC_1BPP_COMPRESSED,
38 PIC_1BPP_TRANSPARENT,
39 NUMBER_OF_PIXELMAPS
40 };
41
42 #define DEFAULT_CANVAS_PIXELS (DEMO_DISPLAY_WIDTH * DEMO_DISPLAY_HEIGHT)
43
44 /* Define the ThreadX demo thread control block and stack. */
45
46 TX_THREAD demo_thread;
47
48 /* Define the stack for the demo thread. */
49 ULONG demo_thread_stack[4096 / sizeof(ULONG)];
50
51 /* Define the GUIX resources for this demo. */
52 GX_CANVAS default_canvas;
53
54 GX_DISPLAY demo_display;
55 GX_WINDOW_ROOT demo_root_window;
56
57 GX_WINDOW pixelmap_window;
58 GX_WINDOW main_window;
59 GX_BOOL compressed = GX_FALSE;
60 GX_BOOL transparent = GX_FALSE;
61 INT xshift;
62 INT yshift;
63 INT horizontal_slider = 0;
64 INT vertical_slider = 0;
65
66 GX_PROMPT width_label;
67 GX_PROMPT height_label;
68 GX_PROMPT width_prompt;
69 GX_PROMPT height_prompt;
70 GX_SLIDER width_slider;
71 GX_SLIDER height_slider;
72 GX_CHECKBOX compressed_box;
73 GX_CHECKBOX transparent_box;
74
75 /* Define GUIX canvas for this demo. */
76
77 ULONG default_canvas_memory[DEFAULT_CANVAS_PIXELS/sizeof(ULONG)];
78
79 /* Define GUIX strings and string IDs for this demo. */
80
81 enum demo_string_ids
82 {
83 SID_WIDTH = 1,
84 SID_HEIGHT,
85 SID_COMPRESSED,
86 SID_TRANSPARENT,
87 STRING_TABLE_MAX
88 };
89
90 char *demo_strings[] = {
91 NULL,
92 "Width",
93 "Height",
94 "Compressed",
95 "Transparent",
96 };
97
98 /* widget id values used by this demo */
99 enum demo_widget_ids {
100 ID_WIDTH_SLIDER = 1,
101 ID_HEIGHT_SLIDER,
102 BID_COMPRESSED,
103 BID_TRANSPARENT,
104 };
105
106 /* Define prototypes. */
107
108 VOID demo_thread_entry(ULONG thread_input);
109
110 UINT pic_win_event_handler(GX_WIDGET *me, GX_EVENT *myevent);
111 VOID pic_win_draw(GX_WINDOW *window);
112 extern UINT win32_graphics_driver_setup_monochrome(GX_DISPLAY *display);
113
main(int argc,char ** argv)114 int main(int argc, char ** argv)
115 {
116 tx_kernel_enter();
117 return(0);
118 }
119
tx_application_define(void * first_unused_memory)120 VOID tx_application_define(void *first_unused_memory)
121 {
122
123 /* Create the main demo thread. */
124 tx_thread_create(&demo_thread, "GUIX Demo Thread", demo_thread_entry, 0,
125 demo_thread_stack, sizeof(demo_thread_stack),
126 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
127 }
128
demo_thread_entry(ULONG thread_input)129 VOID demo_thread_entry(ULONG thread_input)
130 {
131
132 GX_RECTANGLE size;
133 GX_SLIDER_INFO info;
134
135 /* Initialize GUIX. */
136 gx_system_initialize();
137
138 #ifdef WIN32
139 /* Create the demo display and associated driver. */
140 gx_display_create(&demo_display, "demo display", win32_graphics_driver_setup_monochrome,
141 DEMO_DISPLAY_WIDTH, DEMO_DISPLAY_HEIGHT);
142 #endif
143
144 gx_display_color_table_set(&demo_display, demo_color_table, sizeof(demo_color_table) / sizeof(GX_COLOR));
145
146 gx_display_pixelmap_table_set(&demo_display, demo_pixelmap_table, NUMBER_OF_PIXELMAPS);
147
148 /* Create the default canvas, painted on by the graphics driver. */
149 gx_canvas_create(&default_canvas, "demo canvas", &demo_display,
150 GX_CANVAS_MANAGED | GX_CANVAS_VISIBLE,
151 DEMO_DISPLAY_WIDTH, DEMO_DISPLAY_HEIGHT,
152 default_canvas_memory, sizeof(default_canvas_memory));
153
154 /* Create a background root window and attach to the background canvas. */
155
156 gx_utility_rectangle_define(&size, 0, 0, DEMO_DISPLAY_WIDTH - 1, DEMO_DISPLAY_HEIGHT - 1);
157 gx_window_root_create(&demo_root_window, "demo root window", &default_canvas,
158 GX_STYLE_BORDER_NONE, GX_ID_NONE, &size);
159 gx_widget_fill_color_set(&demo_root_window, GX_1BPP_WHITE, GX_1BPP_WHITE, GX_1BPP_WHITE);
160
161
162 /* add width adjustment children */
163 gx_window_create((GX_WINDOW *) &main_window, NULL, &demo_root_window, GX_STYLE_BORDER_THICK, GX_ID_NONE, &size);
164 gx_widget_fill_color_set(&main_window, GX_1BPP_WHITE, GX_1BPP_WHITE, GX_1BPP_WHITE);
165 gx_widget_event_process_set(&main_window, pic_win_event_handler);
166
167 gx_utility_rectangle_define(&size, 55, 155, 214, 172);
168 memset(&info, 0, sizeof(GX_SLIDER_INFO));
169
170 info.gx_slider_info_current_val = 5;
171 info.gx_slider_info_min_val = 1;
172 info.gx_slider_info_max_val = 10;
173 info.gx_slider_info_increment = 1;
174 info.gx_slider_info_needle_inset = 5;
175 info.gx_slider_info_needle_height = 10;
176 info.gx_slider_info_needle_width = 5;
177 info.gx_slider_info_min_travel = 10;
178 info.gx_slider_info_max_travel = 10;
179
180
181 gx_slider_create(&width_slider, NULL, &main_window,
182 10, &info, GX_STYLE_ENABLED|GX_STYLE_SHOW_TICKMARKS|GX_STYLE_SHOW_NEEDLE|GX_STYLE_BORDER_THIN,
183 ID_WIDTH_SLIDER, &size);
184 width_slider.gx_widget_normal_fill_color = GX_1BPP_WHITE;
185 width_slider.gx_widget_selected_fill_color = GX_1BPP_WHITE;
186 width_slider.gx_slider_tick_color = GX_1BPP_BLACK;
187
188 gx_utility_rectangle_define(&size, 268, 25, 283, 174);
189 memset(&info, 0, sizeof(GX_SLIDER_INFO));
190
191 info.gx_slider_info_current_val = 5;
192 info.gx_slider_info_min_val = 1;
193 info.gx_slider_info_max_val = 10;
194 info.gx_slider_info_increment = 1;
195 info.gx_slider_info_needle_inset = 5;
196 info.gx_slider_info_needle_height = 5;
197 info.gx_slider_info_needle_width = 10;
198 info.gx_slider_info_min_travel = 10;
199 info.gx_slider_info_max_travel = 10;
200
201 gx_slider_create(&height_slider, NULL, &main_window,
202 10, &info, GX_STYLE_ENABLED|GX_STYLE_SHOW_TICKMARKS|GX_STYLE_SHOW_NEEDLE|GX_STYLE_BORDER_THIN|GX_STYLE_SLIDER_VERTICAL,
203 ID_HEIGHT_SLIDER, &size);
204 height_slider.gx_widget_normal_fill_color = GX_1BPP_WHITE;
205 height_slider.gx_widget_selected_fill_color = GX_1BPP_WHITE;
206 height_slider.gx_slider_tick_color = GX_1BPP_BLACK;
207
208 gx_utility_rectangle_define(&size, 27, 206, 150, 229);
209 gx_checkbox_create(&compressed_box, NULL, &main_window, SID_COMPRESSED,
210 GX_STYLE_TEXT_LEFT, BID_COMPRESSED, &size);
211
212 gx_utility_rectangle_define(&size, 177, 206, 300, 229);
213 gx_checkbox_create(&transparent_box, NULL, &main_window, SID_TRANSPARENT,
214 GX_STYLE_TEXT_LEFT, BID_TRANSPARENT, &size);
215
216 gx_utility_rectangle_define(&size, 95, 70, 165, 110);
217 gx_window_create(&pixelmap_window, NULL, &main_window, 0, GX_ID_NONE, &size);
218 gx_window_wallpaper_set(&pixelmap_window, PIC_1BPP_RAW, TRUE);
219 gx_widget_fill_color_set(&pixelmap_window, GX_1BPP_WHITE, GX_1BPP_WHITE, GX_1BPP_WHITE);
220 gx_widget_draw_set(&pixelmap_window, pic_win_draw);
221 /* Show the root window. */
222 gx_widget_show(&demo_root_window);
223
224
225 #if defined(GUIX_VALIDATION)
226 /* do_validation(); */
227 #endif
228
229 /* let GUIX run */
230 gx_system_start();
231 }
232
pic_win_event_handler(GX_WIDGET * widget,GX_EVENT * myevent)233 UINT pic_win_event_handler(GX_WIDGET *widget, GX_EVENT *myevent)
234 {
235 UINT status = 0;
236 GX_WINDOW *window = (GX_WINDOW*)widget;
237 GX_SLIDER *slider_w = &width_slider;
238 GX_SLIDER *slider_h = &height_slider;
239
240 switch(myevent -> gx_event_type)
241 {
242 case GX_SIGNAL(ID_WIDTH_SLIDER, GX_EVENT_SLIDER_VALUE):
243
244 /* kgm FIXME- should really just mark the line area as dirty */
245 xshift = myevent ->gx_event_payload.gx_event_longdata;
246
247 if(horizontal_slider == 0)
248 {
249 horizontal_slider = (slider_h ->gx_slider_info.gx_slider_info_max_val + slider_h ->gx_slider_info.gx_slider_info_min_val) >> 1;
250 }
251 gx_widget_shift(&pixelmap_window, xshift - horizontal_slider, 0, GX_TRUE);
252 horizontal_slider = xshift;
253 break;
254
255 case GX_SIGNAL(ID_HEIGHT_SLIDER, GX_EVENT_SLIDER_VALUE):
256 /* kgm FIXME- should really just mark the line area as dirty */
257 yshift = myevent ->gx_event_payload.gx_event_longdata;
258
259 if(vertical_slider == 0)
260 {
261 vertical_slider = (slider_w ->gx_slider_info.gx_slider_info_max_val + slider_w ->gx_slider_info.gx_slider_info_min_val) >> 1;
262 }
263 gx_widget_shift(&pixelmap_window, 0, vertical_slider - yshift, GX_TRUE);
264 vertical_slider = yshift;
265 break;
266
267 case GX_SIGNAL(BID_COMPRESSED, GX_EVENT_TOGGLE_ON):
268 compressed = GX_TRUE;
269 gx_system_dirty_mark(widget);
270 break;
271
272 case GX_SIGNAL(BID_COMPRESSED, GX_EVENT_TOGGLE_OFF):
273 compressed = GX_FALSE;
274 gx_system_dirty_mark(widget);
275 break;
276
277 case GX_SIGNAL(BID_TRANSPARENT, GX_EVENT_TOGGLE_ON):
278 transparent = GX_TRUE;
279 gx_system_dirty_mark(widget);
280 break;
281
282 case GX_SIGNAL(BID_TRANSPARENT, GX_EVENT_TOGGLE_OFF):
283 transparent = GX_FALSE;
284 gx_system_dirty_mark(widget);
285 break;
286
287 default:
288 status = gx_window_event_process(window, myevent);
289 break;
290 }
291 return status;
292 }
293
294
pic_win_draw(GX_WINDOW * window)295 VOID pic_win_draw(GX_WINDOW *window)
296 {
297 if(transparent)
298 {
299 gx_window_wallpaper_set(window, PIC_1BPP_TRANSPARENT, GX_TRUE);
300 }
301 else
302 {
303 if(compressed)
304 {
305 gx_window_wallpaper_set(window, PIC_1BPP_COMPRESSED, GX_TRUE);
306 }
307 else
308 {
309 gx_window_wallpaper_set(window, PIC_1BPP_RAW, GX_TRUE);
310 }
311 }
312 gx_window_draw((GX_WINDOW*) window);
313 }
314
315