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