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 "multi_themes_16bpp_resources.h"
7 #include "multi_themes_16bpp_specifications.h"
8 
9 #define MAX_PATH_LENGTH 255
10 
11 GX_WINDOW *pHelloScreen;
12 
13 GX_WINDOW_ROOT    *root;
14 
15 TX_BYTE_POOL       memory_pool;
16 #define            SCRATCHPAD_PIXELS 300 * 1024
17 GX_COLOR           scratchpad[SCRATCHPAD_PIXELS];
18 
19 /* Define prototypes.   */
20 VOID  start_guix(VOID);
21 extern UINT win32_graphics_driver_setup_565rgb(GX_DISPLAY *display);
22 
23 UINT load_binary_resource_data_to_ram();
24 UINT load_binres_theme(GX_UBYTE *root_address, INT theme_id);
25 UINT load_binres_language_table(GX_UBYTE *root_address);
26 
27 extern GX_STUDIO_DISPLAY_INFO multi_themes_16bpp_display_table[];
28 extern GX_CONST GX_THEME *main_display_theme_table[];
29 extern GX_CONST GX_STRING *main_display_language_table[];
30 
31 GX_THEME *theme = GX_NULL;
32 GX_STRING **language_table = GX_NULL;
33 
34 GX_UBYTE *binres_root_address = GX_NULL;
35 GX_UBYTE *Japanese_root_address = GX_NULL;
36 
37 GX_CHAR binres_pathname[] = "multi_themes_16bpp_resources.bin";
38 GX_CHAR Japanese_pathname[] = "Japanese.bin";
39 
memory_allocate(ULONG size)40 VOID *memory_allocate(ULONG size)
41 {
42     VOID *memptr;
43 
44     if (tx_byte_allocate(&memory_pool, &memptr, size, TX_NO_WAIT) == TX_SUCCESS)
45     {
46         return memptr;
47     }
48     return NULL;
49 }
50 
51 //////////////////////////////////////////////////////////////////////////////////////
memory_free(VOID * mem)52 void memory_free(VOID *mem)
53 {
54     tx_byte_release(mem);
55 }
56 
57 //////////////////////////////////////////////////////////////////////////////////////
main(int argc,char ** argv)58 int main(int argc, char ** argv)
59 {
60   tx_kernel_enter();
61   return(0);
62 }
63 
64 //////////////////////////////////////////////////////////////////////////////////////
tx_application_define(void * first_unused_memory)65 VOID tx_application_define(void *first_unused_memory)
66 {
67     /* create byte pool*/
68     tx_byte_pool_create(&memory_pool, "scratchpad", scratchpad,
69         SCRATCHPAD_PIXELS * sizeof(GX_COLOR));
70 
71 
72     /* Initialize GUIX.  */
73     gx_system_initialize();
74 
75     gx_system_memory_allocator_set(memory_allocate, memory_free);
76     load_binary_resource_data_to_ram();
77 
78     gx_studio_display_configure(MAIN_DISPLAY, win32_graphics_driver_setup_565rgb,
79         LANGUAGE_ENGLISH, MAIN_DISPLAY_THEME_1, &root);
80 
81 
82     /* create the hello world screen */
83     gx_studio_named_widget_create("simple_window", (GX_WIDGET *)root, (GX_WIDGET **)&pHelloScreen);
84 
85     /* Show the root window to make it and patients screen visible.  */
86     gx_widget_show(root);
87 
88     /* start GUIX thread */
89     gx_system_start();
90 }
91 
92 //////////////////////////////////////////////////////////////////////////////////////
simple_window_event_handler(GX_WINDOW * widget,GX_EVENT * event_ptr)93 UINT simple_window_event_handler(GX_WINDOW *widget, GX_EVENT *event_ptr)
94 {
95     switch (event_ptr->gx_event_type)
96     {
97     case GX_EVENT_SHOW:
98         gx_window_event_process(widget, event_ptr);
99         gx_window_client_scroll(&simple_window.simple_window_scroll_frame, 0, 1);
100         break;
101 
102     case GX_SIGNAL(ID_THEME_1, GX_EVENT_RADIO_SELECT):
103         gx_display_theme_install(multi_themes_16bpp_display_table[MAIN_DISPLAY].display, main_display_theme_table[MAIN_DISPLAY_THEME_1]);
104         break;
105 
106     case GX_SIGNAL(ID_THEME_2, GX_EVENT_RADIO_SELECT):
107         gx_display_theme_install(multi_themes_16bpp_display_table[MAIN_DISPLAY].display, main_display_theme_table[MAIN_DISPLAY_THEME_2]);
108         break;
109 
110     case GX_SIGNAL(ID_THEME_3, GX_EVENT_RADIO_SELECT):
111         gx_display_theme_install(multi_themes_16bpp_display_table[MAIN_DISPLAY].display, main_display_theme_table[MAIN_DISPLAY_THEME_3]);
112         break;
113 
114     case GX_SIGNAL(ID_THEME_4, GX_EVENT_RADIO_SELECT):
115         load_binres_theme(binres_root_address, 0);
116         break;
117 
118     case GX_SIGNAL(ID_THEME_5, GX_EVENT_RADIO_SELECT):
119         load_binres_theme(binres_root_address, 1);
120         break;
121 
122     case GX_SIGNAL(ID_ENGLISH, GX_EVENT_RADIO_SELECT):
123         gx_display_language_table_set_ext(root->gx_window_root_canvas->gx_canvas_display, main_display_language_table, MAIN_DISPLAY_LANGUAGE_TABLE_SIZE, MAIN_DISPLAY_STRING_TABLE_SIZE);
124         gx_system_active_language_set(LANGUAGE_ENGLISH);
125         break;
126 
127     case GX_SIGNAL(ID_CHINESE, GX_EVENT_RADIO_SELECT):
128         gx_display_language_table_set_ext(root->gx_window_root_canvas->gx_canvas_display, main_display_language_table, MAIN_DISPLAY_LANGUAGE_TABLE_SIZE, MAIN_DISPLAY_STRING_TABLE_SIZE);
129         gx_system_active_language_set(LANGUAGE_CHINESE);
130 
131         break;
132 
133     case GX_SIGNAL(ID_JAPANESE, GX_EVENT_RADIO_SELECT):
134         load_binres_language_table(Japanese_root_address);
135         break;
136 
137     case GX_SIGNAL(ID_SPANISH, GX_EVENT_RADIO_SELECT):
138         load_binres_language_table(binres_root_address);
139         break;
140     }
141 
142     return gx_window_event_process(widget, event_ptr);
143 }
144 
string_length_get(GX_CONST GX_CHAR * input_string,UINT max_string_length)145 static UINT string_length_get(GX_CONST GX_CHAR* input_string, UINT max_string_length)
146 {
147     UINT length = 0;
148 
149     if (input_string)
150     {
151         /* Traverse the string.  */
152         for (length = 0; input_string[length]; length++)
153         {
154             /* Check if the string length is bigger than the max string length.  */
155             if (length >= max_string_length)
156             {
157                 break;
158             }
159         }
160     }
161 
162     return length;
163 }
164 
165 //////////////////////////////////////////////////////////////////////////////////////
extract_path(char * pathname,char * path)166 static int extract_path(char *pathname, char *path)
167 {
168     int len = string_length_get(pathname, MAX_PATH_LENGTH) - 1;
169 
170     while (len >= 0)
171     {
172         if ((pathname[len] == '/') || pathname[len] == '\\')
173         {
174             memcpy(path, pathname, len + 1);
175             len++;
176             path[len] = '\0';
177             break;
178         }
179         len--;
180     }
181 
182     return len;
183 }
184 
185 
186 //////////////////////////////////////////////////////////////////////////////////////
load_binary_resource_data_to_ram()187 UINT load_binary_resource_data_to_ram()
188 {
189     FILE *p_file;
190     size_t total_length;
191     size_t result;
192     char pathname[MAX_PATH_LENGTH + 1];
193     int len;
194 
195     len = extract_path(__FILE__, pathname);
196 
197     memcpy(pathname + len, binres_pathname, sizeof(binres_pathname));
198     p_file = fopen(pathname, "rb");
199 
200     if (!p_file)
201     {
202         printf("Cannot open file: %s\n", pathname);
203         return GX_FAILURE;
204     }
205 
206     fseek(p_file, 0, SEEK_END);
207     total_length = ftell(p_file);
208     fseek(p_file, SEEK_SET, SEEK_SET);
209 
210     binres_root_address = memory_allocate(total_length);
211     result = fread(binres_root_address, 1, total_length, p_file);
212 
213     fclose(p_file);
214 
215     if (result != total_length)
216     {
217         return GX_FAILURE;
218     }
219 
220     memcpy(pathname + len, Japanese_pathname, sizeof(Japanese_pathname));
221     p_file = fopen(pathname, "rb");
222 
223     if (!p_file)
224     {
225         printf("Cannot open file: %s\n", pathname);
226         return GX_FAILURE;
227     }
228 
229     fseek(p_file, 0, SEEK_END);
230     total_length = ftell(p_file);
231     fseek(p_file, SEEK_SET, SEEK_SET);
232 
233     Japanese_root_address = memory_allocate(total_length);
234     result = fread(Japanese_root_address, 1, total_length, p_file);
235 
236     fclose(p_file);
237 
238     if (result != total_length)
239     {
240         return GX_FAILURE;
241     }
242 
243     return GX_SUCCESS;
244 }
245 
246 //////////////////////////////////////////////////////////////////////////////////////
load_binres_theme(GX_UBYTE * root_address,INT theme_id)247 UINT load_binres_theme(GX_UBYTE *root_address, INT theme_id)
248 {
249 UINT      status = GX_SUCCESS;
250 GX_THEME *new_theme = GX_NULL;
251 
252 
253     status = gx_binres_theme_load(root_address, theme_id, &new_theme);
254 
255     if (status == GX_SUCCESS)
256     {
257         if (theme)
258         {
259             memory_free(theme);
260         }
261 
262         gx_display_theme_install(multi_themes_16bpp_display_table[MAIN_DISPLAY].display, new_theme);
263 
264         theme = new_theme;
265     }
266 
267     return status;
268 }
269 
load_binres_language_table(GX_UBYTE * root_address)270 UINT load_binres_language_table(GX_UBYTE *root_address)
271 {
272 UINT        status = GX_SUCCESS;
273 GX_STRING **new_table = GX_NULL;
274 
275 
276     status = gx_binres_language_table_load_ext(root_address, &new_table);
277 
278     if (status == GX_SUCCESS)
279     {
280         if (language_table)
281         {
282             memory_free(language_table);
283         }
284 
285         gx_display_language_table_set_ext(root->gx_window_root_canvas->gx_canvas_display, (GX_CONST GX_STRING **)new_table, 1, MAIN_DISPLAY_STRING_TABLE_SIZE);
286         gx_system_active_language_set(0);
287         language_table = new_table;
288     }
289     return status;
290 }
291