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