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