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