1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include <stdio.h>
4 #include "gx_api.h"
5 #include "gx_canvas.h"
6 
7 #include "all_widgets_16bpp_rotated_resources.h"
8 #include "all_widgets_16bpp_rotated_specifications.h"
9 
10 extern VOID dynamic_memory_free(VOID *mem);
11 
12 float            x_ratio = 1;
13 float            y_ratio = 1;
14 GX_RESOURCE_ID   resize_pixelmap_id = GX_PIXELMAP_ID_ROTATE_FOOT;
15 
update_prompt_text(GX_RESOURCE_ID id,float value)16 VOID update_prompt_text(GX_RESOURCE_ID id, float value)
17 {
18     GX_PROMPT *pp;
19     static GX_CHAR text[10];
20 
21     gx_widget_find((GX_WIDGET *)&resize_screen, (USHORT)id, 0, &pp);
22 
23     if (pp)
24     {
25         /* Transfer float value to string. */
26         text[0] = '0' + (int)(value);
27         text[1] = '.';
28         text[2] = '0' + (int)(value * 10) % 10;
29         text[3] = '0' + (int)(value * 100) % 10;
30         text[4] = '\0';
31 
32         /* Reset prompt text. */
33         gx_prompt_text_set(pp, text);
34     }
35 }
36 
resize_screen_event_handler(GX_WINDOW * window,GX_EVENT * myevent)37 UINT resize_screen_event_handler(GX_WINDOW *window, GX_EVENT *myevent)
38 {
39     UINT status = 0;
40     INT  value;
41 
42     switch (myevent->gx_event_type)
43     {
44     case GX_SIGNAL(ID_SLIDER_WIDTH, GX_EVENT_SLIDER_VALUE):
45         value = myevent->gx_event_payload.gx_event_longdata;
46         value -= 50;
47         x_ratio = 1 + (float)value / 100;
48         update_prompt_text(ID_WIDTH_DISPLAY, x_ratio);
49         gx_system_dirty_mark((GX_WIDGET *)&resize_screen.resize_screen_resize_window);
50         break;
51 
52     case GX_SIGNAL(ID_SLIDER_HEIGHT, GX_EVENT_SLIDER_VALUE):
53         value = myevent->gx_event_payload.gx_event_longdata;
54         value -= 50;
55         y_ratio = 1 + (float)value / 100;
56         update_prompt_text(ID_HEIGHT_DISPLAY, y_ratio);
57         gx_system_dirty_mark((GX_WIDGET *)&resize_screen.resize_screen_resize_window);
58         break;
59 
60     case GX_SIGNAL(ID_RADIO_FOOT, GX_EVENT_RADIO_SELECT):
61         resize_pixelmap_id = GX_PIXELMAP_ID_ROTATE_FOOT;
62         gx_system_dirty_mark((GX_WIDGET *)&resize_screen.resize_screen_resize_window);
63         break;
64 
65     case GX_SIGNAL(ID_RADIO_FOOT_ALPHA, GX_EVENT_RADIO_SELECT):
66         resize_pixelmap_id = GX_PIXELMAP_ID_ROTATE_APPLE;
67         gx_system_dirty_mark((GX_WIDGET *)&resize_screen.resize_screen_resize_window);
68         break;
69 
70     case GX_SIGNAL(ID_RADIO_FISH, GX_EVENT_RADIO_SELECT):
71         resize_pixelmap_id = GX_PIXELMAP_ID_ROTATE_FISH;
72         gx_system_dirty_mark((GX_WIDGET *)&resize_screen.resize_screen_resize_window);
73         break;
74 
75     default:
76         status = next_button_handler(window, myevent);
77         break;
78     }
79     return status;
80 }
81 
resize_window_draw(GX_WINDOW * window)82 VOID resize_window_draw(GX_WINDOW *window)
83 {
84     INT  xpos;
85     INT  ypos;
86     GX_PIXELMAP *pixelmap;
87     GX_RECTANGLE win_size;
88     GX_PIXELMAP destination;
89     INT width, height;
90 
91     gx_window_draw((GX_WINDOW*)window);
92 
93     gx_context_pixelmap_get(resize_pixelmap_id, &pixelmap);
94     win_size = resize_screen.resize_screen_resize_window.gx_widget_size;
95 
96     xpos = (win_size.gx_rectangle_right + win_size.gx_rectangle_left -pixelmap->gx_pixelmap_width) >> 1;
97     ypos = (win_size.gx_rectangle_top + win_size.gx_rectangle_bottom - pixelmap->gx_pixelmap_height) >> 1;
98 
99     width = (int)(pixelmap->gx_pixelmap_width * x_ratio);
100     height = (int)(pixelmap->gx_pixelmap_height * y_ratio);
101 
102     if (x_ratio == 1 && y_ratio == 1)
103     {
104         /* Draw source pixelmap.  */
105         gx_canvas_pixelmap_draw(xpos, ypos, pixelmap);
106     }
107     else if (gx_utility_pixelmap_resize(pixelmap, &destination, width, height) == GX_SUCCESS)
108     {
109         xpos += (pixelmap->gx_pixelmap_width - destination.gx_pixelmap_width) >> 1;
110         ypos += (pixelmap->gx_pixelmap_height - destination.gx_pixelmap_height) >> 1;
111 
112         /* Draw resized pixelmap.  */
113         gx_canvas_pixelmap_draw(xpos, ypos, &destination);
114 
115         if (destination.gx_pixelmap_data)
116         {
117             dynamic_memory_free((VOID *)destination.gx_pixelmap_data);
118         }
119 
120         if (destination.gx_pixelmap_aux_data)
121         {
122             dynamic_memory_free((VOID *)destination.gx_pixelmap_aux_data);
123         }
124     }
125 }
126