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 #include "guix_sprite_resources.h"
7 #include "guix_sprite_specifications.h"
8 
9 /* Define the ThreadX demo thread control block and stack.  */
10 MAIN_WINDOW_CONTROL_BLOCK *pMainWin;
11 GX_WINDOW *pAppleWin;
12 
13 GX_WINDOW_ROOT    *root;
14 GX_PIXELMAP       scaled_map;
15 GX_UBYTE          alpha_value = 255;
16 int               scale = 100;
17 GX_BOOL           sprite_move_down = GX_TRUE;
18 
19 TX_THREAD         demo_thread;
20 UCHAR             demo_thread_stack[4096];
21 TX_BYTE_POOL      resize_pool;
22 
23 /* Memroy should be a little larger than the resize image. */
24 #define           SCRATCHPAD_PIXELS (DISPLAY_1_X_RESOLUTION * (DISPLAY_1_Y_RESOLUTION + 1))
25 GX_COLOR          scratchpad[SCRATCHPAD_PIXELS];
26 
27 /* Define prototypes.   */
28 VOID  start_guix(VOID);
29 extern UINT win32_graphics_driver_setup_24xrgb(GX_DISPLAY *display);
30 
resize_memory_allocate(ULONG size)31 VOID *resize_memory_allocate(ULONG size)
32 {
33     VOID *memptr;
34 
35     if (tx_byte_allocate(&resize_pool, &memptr, size, TX_NO_WAIT) == TX_SUCCESS)
36     {
37         return memptr;
38     }
39     return NULL;
40 }
41 
resize_memory_free(VOID * mem)42 void resize_memory_free(VOID *mem)
43 {
44     tx_byte_release(mem);
45 }
46 
main(int argc,char ** argv)47 int main(int argc, char ** argv)
48 {
49     tx_kernel_enter();
50     return(0);
51 }
52 
tx_application_define(void * first_unused_memory)53 VOID tx_application_define(void *first_unused_memory)
54 {
55     /* create byte pool for resize to use */
56     tx_byte_pool_create(&resize_pool, "scratchpad", scratchpad,
57         SCRATCHPAD_PIXELS * sizeof(GX_COLOR));
58 
59     start_guix();
60 
61     /* install our memory allocator and de-allocator */
62     gx_system_memory_allocator_set(resize_memory_allocate, resize_memory_free);
63 }
64 
65 
start_guix(VOID)66 VOID  start_guix(VOID)
67 {
68     /* Initialize GUIX.  */
69     gx_system_initialize();
70 
71     gx_studio_display_configure(DISPLAY_1, win32_graphics_driver_setup_24xrgb,
72                                 LANGUAGE_ENGLISH, DISPLAY_1_DEFAULT_THEME, &root);
73 
74     scaled_map.gx_pixelmap_data = GX_NULL;
75 
76     /* create the main screen */
77     gx_studio_named_widget_create("main_window", (GX_WIDGET *) root, (GX_WIDGET **) &pMainWin);
78 
79     gx_widget_show(root);
80 
81     /* start GUIX thread */
82     gx_system_start();
83 }
84 
MoveSprite(void)85 void MoveSprite(void)
86 {
87     GX_RECTANGLE size;
88     GX_SPRITE *sprite = &main_window.main_window_bird_sprite;
89 
90     size = sprite -> gx_widget_size;
91 
92     if (sprite_move_down)
93     {
94         gx_utility_rectangle_shift(&size, -120, 57);
95     }
96     else
97     {
98         gx_utility_rectangle_shift(&size, 80, -157);
99     }
100 
101     if (size.gx_rectangle_bottom > pMainWin -> gx_widget_size.gx_rectangle_bottom)
102     {
103         sprite_move_down = GX_FALSE;
104     }
105     if (size.gx_rectangle_top < pMainWin -> gx_widget_size.gx_rectangle_top)
106     {
107         sprite_move_down = GX_TRUE;
108     }
109 
110     if (size.gx_rectangle_right < pMainWin -> gx_widget_size.gx_rectangle_left)
111     {
112         size.gx_rectangle_right += pMainWin -> gx_widget_size.gx_rectangle_right;
113         size.gx_rectangle_left += pMainWin -> gx_widget_size.gx_rectangle_right;
114     }
115     gx_widget_resize(sprite, &size);
116 }
117 
create_scaled_map()118 void create_scaled_map()
119 {
120     int width;
121     int height;
122     GX_PIXELMAP *map = GX_NULL;
123 
124     if (scaled_map.gx_pixelmap_data)
125     {
126         resize_memory_free((VOID *)scaled_map.gx_pixelmap_data);
127         scaled_map.gx_pixelmap_data = GX_NULL;
128     }
129 
130     gx_widget_pixelmap_get(pMainWin, GX_PIXELMAP_ID_SKY, &map);
131 
132     if (map)
133     {
134         width = (scale * DISPLAY_1_X_RESOLUTION) / 100;
135         height = (scale * DISPLAY_1_Y_RESOLUTION) / 100;
136 
137         if ((width <= 0) || (height <= 0))
138         {
139             return;
140         }
141         gx_utility_pixelmap_resize(map, &scaled_map, width, height);
142     }
143 
144 }
145 
MainWindowEventProcess(GX_WINDOW * window,GX_EVENT * myevent)146 UINT MainWindowEventProcess(GX_WINDOW *window, GX_EVENT *myevent)
147 {
148     UINT status = 0;
149 
150     switch(myevent -> gx_event_type)
151     {
152     case GX_SIGNAL(ID_ALPHA_SLIDER, GX_EVENT_SLIDER_VALUE):
153         alpha_value = (GX_UBYTE)  myevent -> gx_event_payload.gx_event_longdata;
154         gx_system_dirty_mark(window);
155         break;
156 
157     case GX_SIGNAL(ID_BACKGROUND_SIZE, GX_EVENT_SLIDER_VALUE):
158         scale = (int)  myevent -> gx_event_payload.gx_event_longdata;
159         gx_system_dirty_mark(window);
160         break;
161 
162     case GX_SIGNAL(ID_BIRD_SPRITE, GX_EVENT_SPRITE_COMPLETE):
163         MoveSprite();
164         gx_sprite_start(&main_window.main_window_bird_sprite, 0);
165         break;
166 
167     default:
168         status = gx_window_event_process(window, myevent);
169         break;
170     }
171     return status;
172 }
173 
MainWindowDraw(GX_WINDOW * window)174 VOID MainWindowDraw(GX_WINDOW *window)
175 {
176 GX_PIXELMAP *map = GX_NULL;
177 int          win_width;
178 int          win_height;
179 int          xpos;
180 int          ypos;
181 
182     gx_window_draw(window);
183 
184     gx_widget_pixelmap_get(pMainWin, GX_PIXELMAP_ID_SKY, &map);
185 
186     if (map)
187     {
188         if (map -> gx_pixelmap_width != (scale * DISPLAY_1_X_RESOLUTION) / 100)
189         {
190             create_scaled_map();
191 
192             if (scaled_map.gx_pixelmap_data)
193             {
194                 map = &scaled_map;
195             }
196         }
197 
198         if (map)
199         {
200             win_width = window->gx_widget_size.gx_rectangle_right - window->gx_widget_size.gx_rectangle_left + 1;
201             win_height = window->gx_widget_size.gx_rectangle_bottom - window->gx_widget_size.gx_rectangle_top + 1;
202 
203             xpos = window->gx_widget_size.gx_rectangle_left;
204             ypos = window->gx_widget_size.gx_rectangle_top;
205 
206             xpos += (win_width - map->gx_pixelmap_width) >> 1;
207             ypos += (win_height - map->gx_pixelmap_height) >> 1;
208 
209             if (alpha_value < 255)
210             {
211                 gx_canvas_pixelmap_blend(xpos, ypos, map, alpha_value);
212             }
213             else
214             {
215                 gx_canvas_pixelmap_draw(xpos, ypos, map);
216             }
217         }
218     }
219 
220     gx_widget_children_draw(window);
221 }
222 
223 
224