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