1 /****************************************************************/
2 /* This file tests gx_utility_332rgb_roate and                  */
3 /*                 _gx_display_driver_332rgb_pixelmap_rotate    */
4 /*                                                              */
5 /****************************************************************/
6 #include <stdio.h>
7 #include "gx_api.h"
8 #include "all_widgets_332rgb_resources.h"
9 #include "all_widgets_332rgb_specifications.h"
10 
11 extern GX_CONST GX_PIXELMAP *display_1_theme_1_pixelmap_table[];
12 extern VOID                  memory_free(VOID *mem);
13 
14 extern GX_WINDOW     *pRotateScreen;
15 extern GX_WINDOW     *pRotateWin;
16 INT                   angle = 30;
17 GX_RESOURCE_ID        pixelmap_id = GX_PIXELMAP_ID_ROTATE_FOOT;
18 GX_BOOL               direct = GX_FALSE;
19 
update_angle_prompt()20 VOID update_angle_prompt()
21 {
22     GX_PROMPT *pp;
23     static GX_CHAR angle_text_buffer[10];
24     GX_STRING angle_text;
25 
26     gx_widget_find(pRotateScreen, ID_ANGLE_DISPLAY, 0, &pp);
27 
28     if (pp)
29     {
30         gx_utility_ltoa(angle, angle_text_buffer, 10);
31         angle_text.gx_string_ptr = angle_text_buffer;
32         angle_text.gx_string_length = strnlen(angle_text_buffer, sizeof(angle_text_buffer));
33         gx_prompt_text_set_ext(pp, &angle_text);
34     }
35 }
36 
rotate_event_handler(GX_WINDOW * window,GX_EVENT * myevent)37 UINT rotate_event_handler(GX_WINDOW *window, GX_EVENT *myevent)
38 {
39     UINT status = 0;
40 
41     switch (myevent->gx_event_type)
42     {
43     case GX_SIGNAL(ID_SLIDER_ANGLE, GX_EVENT_SLIDER_VALUE):
44         angle = myevent->gx_event_payload.gx_event_longdata;
45         update_angle_prompt();
46         gx_system_dirty_mark(pRotateScreen);
47         break;
48 
49     case GX_SIGNAL(ID_RADIO_FOOT, GX_EVENT_RADIO_SELECT):
50         pixelmap_id = GX_PIXELMAP_ID_ROTATE_FOOT;
51         gx_system_dirty_mark(pRotateScreen);
52         break;
53 
54     case GX_SIGNAL(ID_RADIO_APPLE, GX_EVENT_RADIO_SELECT):
55         pixelmap_id = GX_PIXELMAP_ID_ROTATE_APPLE;
56         gx_system_dirty_mark(pRotateScreen);
57         break;
58 
59     case GX_SIGNAL(ID_RADIO_FISH, GX_EVENT_RADIO_SELECT):
60         pixelmap_id = GX_PIXELMAP_ID_ROTATE_FISH;
61         gx_system_dirty_mark(pRotateScreen);
62         break;
63 
64     case GX_SIGNAL(ID_DIRECT_ROTATE, GX_EVENT_TOGGLE_ON):
65         direct = GX_TRUE;
66         gx_system_dirty_mark(pRotateScreen);
67         break;
68 
69     case GX_SIGNAL(ID_DIRECT_ROTATE, GX_EVENT_TOGGLE_OFF):
70         direct = GX_FALSE;
71         gx_system_dirty_mark(pRotateScreen);
72         break;
73 
74     default:
75         return next_button_handler(window, myevent);
76         break;
77     }
78     return status;
79 }
80 
pixelmap_draw(GX_WINDOW * window)81 VOID pixelmap_draw(GX_WINDOW *window)
82 {
83 INT              xpos;
84 INT              ypos;
85 GX_PIXELMAP     *pixelmap;
86 GX_RECTANGLE     win_size;
87 GX_PIXELMAP      destination;
88 INT             x_axis_old;
89 INT             y_axis_old;
90 INT             x_axis;
91 INT             y_axis;
92 UINT             status = GX_FAILURE;
93 
94     gx_window_draw((GX_WINDOW*)window);
95 
96     gx_context_pixelmap_get(pixelmap_id, &pixelmap);
97 
98     win_size = pRotateWin->gx_widget_size;
99 
100     xpos = (win_size.gx_rectangle_right + win_size.gx_rectangle_left - pixelmap->gx_pixelmap_width) >> 1;
101     ypos = (win_size.gx_rectangle_top + win_size.gx_rectangle_bottom - pixelmap->gx_pixelmap_height) >> 1;
102 
103     if (direct)
104     {
105         gx_canvas_pixelmap_rotate(xpos, ypos, pixelmap, angle, -1, -1);
106     }
107     else
108     {
109         x_axis_old = (pixelmap->gx_pixelmap_width >> 1);
110         y_axis_old = (pixelmap->gx_pixelmap_height >> 1);
111 
112         x_axis = x_axis_old;
113         y_axis = y_axis_old;
114         if (angle == 0)
115         {
116             xpos += x_axis_old - x_axis;
117             ypos += y_axis_old - y_axis;
118             gx_canvas_pixelmap_draw(xpos, ypos, pixelmap);
119             return;
120         }
121         else if (angle % 90 == 0)
122         {
123             status = gx_utility_pixelmap_simple_rotate(pixelmap, angle, &destination, &x_axis, &y_axis);
124         }
125         else
126         {
127             status = gx_utility_pixelmap_rotate(pixelmap, angle, &destination, &x_axis, &y_axis);
128         }
129 
130         if (status == GX_SUCCESS)
131         {
132             xpos += x_axis_old - x_axis;
133             ypos += y_axis_old - y_axis;
134 
135             /* Draw rotated pixelmap.  */
136             gx_canvas_pixelmap_draw(xpos, ypos, &destination);
137 
138             /* free memory of the rotated pixelmap */
139             if (destination.gx_pixelmap_data)
140             {
141                 memory_free((VOID *)destination.gx_pixelmap_data);
142             }
143             /* free memory of the rotated pixelmap */
144             if (destination.gx_pixelmap_aux_data)
145             {
146                 memory_free((VOID *)destination.gx_pixelmap_aux_data);
147             }
148         }
149     }
150 }
151