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