1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include <stdio.h>
4 #include "gx_api.h"
5 #include "all_widgets_8bpp_rotated_cw_binary_resources.h"
6 #include "all_widgets_8bpp_rotated_cw_binary_specifications.h"
7 
8 
9 GX_WINDOW     *pLineWin = &lines_screen.lines_screen_line_window;
10 int            lines_screen_line_angle = 0;
11 int            lines_screen_line_width = 1;
12 GX_BOOL        lines_screen_rounded = GX_FALSE;
13 GX_RESOURCE_ID lines_screen_line_color = GX_COLOR_ID_BLACK;
14 GX_UBYTE       lines_screen_brush_alpha = 255;
15 int            line_x1;
16 int            line_x2;
17 int            line_y1;
18 int            line_y2;
19 int            lines_screen_line_length = 100;
20 
21 /* Define prototypes.   */
22 VOID  PopulateDropList(void);
23 
calculate_line_ends(VOID)24 VOID calculate_line_ends(VOID)
25 {
26     INT scaled_angle;
27     INT x_dist;
28     INT y_dist;
29 
30     INT x_center = (pLineWin->gx_widget_size.gx_rectangle_left + pLineWin->gx_widget_size.gx_rectangle_right) / 2;
31     INT y_center = (pLineWin->gx_widget_size.gx_rectangle_top + pLineWin->gx_widget_size.gx_rectangle_bottom) / 2;
32 
33     scaled_angle = GX_FIXED_VAL_MAKE(lines_screen_line_angle);
34     x_dist = GX_FIXED_VAL_TO_INT(gx_utility_math_cos(scaled_angle) * lines_screen_line_length);
35     y_dist = GX_FIXED_VAL_TO_INT(gx_utility_math_sin(scaled_angle) * lines_screen_line_length);
36 
37     line_x1 = x_center - x_dist;
38     line_x2 = x_center + x_dist;
39     line_y1 = y_center - y_dist;
40     line_y2 = y_center + y_dist;
41 }
42 
update_prompt(GX_RESOURCE_ID id,INT value)43 VOID update_prompt(GX_RESOURCE_ID id, INT value)
44 {
45 GX_PROMPT *pp;
46 static GX_CHAR val[10];
47 
48     gx_widget_find((GX_WIDGET *)&lines_screen, (USHORT)id, 0, &pp);
49 
50     if (pp)
51     {
52         gx_utility_ltoa(value, val, 10);
53         gx_prompt_text_set(pp, val);
54     }
55 }
56 
main_event_handler(GX_WINDOW * window,GX_EVENT * myevent)57 UINT main_event_handler(GX_WINDOW *window, GX_EVENT *myevent)
58 {
59     UINT status = 0;
60 
61     switch(myevent -> gx_event_type)
62     {
63     case GX_SIGNAL(ID_BRUSH_ALPHA_SLIDER, GX_EVENT_SLIDER_VALUE):
64         lines_screen_brush_alpha = (GX_UBYTE)myevent->gx_event_payload.gx_event_longdata;
65         update_prompt(ID_BRUSH_ALPHA_PROMPT, lines_screen_brush_alpha);
66         gx_system_dirty_mark(pLineWin);
67         break;
68 
69     case GX_SIGNAL(ID_LINE_WIDTH, GX_EVENT_SLIDER_VALUE):
70         lines_screen_line_width = myevent ->gx_event_payload.gx_event_longdata;
71         update_prompt(ID_WIDTH_DISPLAY, lines_screen_line_width);
72         gx_system_dirty_mark(pLineWin);
73         break;
74 
75     case GX_SIGNAL(ID_LINE_ANGLE, GX_EVENT_SLIDER_VALUE):
76         lines_screen_line_angle = myevent ->gx_event_payload.gx_event_longdata;
77         update_prompt(ID_ANGLE_DISPLAY, lines_screen_line_angle);
78         calculate_line_ends();
79         gx_system_dirty_mark(pLineWin);
80         break;
81 
82     case GX_SIGNAL(ID_ROUNDED, GX_EVENT_TOGGLE_ON):
83         lines_screen_rounded = GX_TRUE;
84         gx_system_dirty_mark(pLineWin);
85         break;
86 
87     case GX_SIGNAL(ID_ROUNDED, GX_EVENT_TOGGLE_OFF):
88         lines_screen_rounded = GX_FALSE;
89         gx_system_dirty_mark(pLineWin);
90         break;
91 
92     case GX_SIGNAL(ID_COLOR_BLACK, GX_EVENT_RADIO_SELECT):
93         lines_screen_line_color = GX_COLOR_ID_BLACK;
94         gx_system_dirty_mark(pLineWin);
95         break;
96 
97     case GX_SIGNAL(ID_COLOR_WHITE, GX_EVENT_RADIO_SELECT):
98         lines_screen_line_color = GX_COLOR_ID_WHITE;
99         gx_system_dirty_mark(pLineWin);
100         break;
101 
102     case GX_SIGNAL(ID_COLOR_ORANGE, GX_EVENT_RADIO_SELECT):
103         lines_screen_line_color = GX_COLOR_ID_ORANGE;
104         gx_system_dirty_mark(pLineWin);
105         break;
106 
107     default:
108         status = next_button_handler(window, myevent);
109         break;
110     }
111     return status;
112 }
113 
line_win_draw(GX_WINDOW * window)114 VOID line_win_draw(GX_WINDOW *window)
115 {
116 ULONG brush_style = 0;
117 GX_BRUSH *brush;
118 GX_RECTANGLE *size;
119 
120     gx_window_draw((GX_WINDOW*) window);
121 
122     gx_context_brush_get(&brush);
123     brush -> gx_brush_alpha = lines_screen_brush_alpha;
124 
125     if (lines_screen_rounded)
126     {
127         brush_style |= GX_BRUSH_ROUND;
128     }
129     gx_context_brush_define(lines_screen_line_color, window ->gx_widget_normal_fill_color, brush_style);
130     gx_context_brush_width_set(lines_screen_line_width);
131 
132     /* Draw pattern lines. */
133     size = &window->gx_widget_size;
134 
135     gx_context_brush_pattern_set(0xf8fcfeff);
136     gx_canvas_line_draw(size->gx_rectangle_left + 5, size->gx_rectangle_top + 5, size->gx_rectangle_left + 5, size->gx_rectangle_bottom - 5);
137     gx_context_brush_pattern_set(0xf0f0f0f0);
138     gx_canvas_line_draw(size->gx_rectangle_left + 5, size->gx_rectangle_top + 5, size->gx_rectangle_right - 5, size->gx_rectangle_top + 5);
139     gx_context_brush_pattern_set(0xaaaaaaaa);
140     gx_canvas_line_draw(size->gx_rectangle_left + 5, size->gx_rectangle_bottom - 5, size->gx_rectangle_right - 5, size->gx_rectangle_bottom - 5);
141     gx_context_brush_pattern_set(0x33333333);
142     gx_canvas_line_draw(size->gx_rectangle_right - 5, size->gx_rectangle_top + 5, size->gx_rectangle_right - 5, size->gx_rectangle_bottom - 5);
143 
144     gx_context_brush_pattern_set(0);
145     calculate_line_ends();
146     gx_canvas_line_draw(line_x1, line_y1, line_x2, line_y2);
147 }
148