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_332rgb_resources.h"
6 #include "all_widgets_332rgb_specifications.h"
7 
8 
9 #define LINE_LENGTH 100
10 #define LINE_CENTER_X_OFFSET 159
11 #define LINE_CENTER_Y_OFFSET 159
12 
13 GX_WINDOW *pLineWin = &line_screen.line_screen_line_window;
14 int        line_angle = 0;
15 int        line_width = 1;
16 GX_BOOL    rounded = GX_FALSE;
17 GX_BOOL    anti_alised_line = GX_FALSE;
18 int        line_x1;
19 int        line_x2;
20 int        line_y1;
21 int        line_y2;
22 INT        line_pattern;
23 
24 
calculate_line_ends(VOID)25 VOID calculate_line_ends(VOID)
26 {
27     INT scaled_angle;
28     INT x_dist;
29     INT y_dist;
30 
31     INT x_center = pLineWin->gx_widget_size.gx_rectangle_left + LINE_CENTER_X_OFFSET;
32     INT y_center = pLineWin->gx_widget_size.gx_rectangle_top + LINE_CENTER_Y_OFFSET;
33 
34     scaled_angle = GX_FIXED_VAL_MAKE(line_angle);
35     x_dist = GX_FIXED_VAL_TO_INT(gx_utility_math_cos(scaled_angle) * LINE_LENGTH);
36     y_dist = GX_FIXED_VAL_TO_INT(gx_utility_math_sin(scaled_angle) * LINE_LENGTH);
37 
38     line_x1 = x_center - x_dist;
39     line_x2 = x_center + x_dist;
40     line_y1 = y_center - y_dist;
41     line_y2 = y_center + y_dist;
42 }
43 
update_width_prompt(VOID)44 VOID update_width_prompt(VOID)
45 {
46     GX_PROMPT *pp;
47     static GX_CHAR text_buffer[10];
48     GX_STRING text;
49 
50     gx_widget_find((GX_WINDOW *)&line_screen, ID_WIDTH_DISPLAY, 0, &pp);
51 
52     if (pp)
53     {
54         gx_utility_ltoa(line_width, text_buffer, 10);
55         text.gx_string_ptr = text_buffer;
56         text.gx_string_length = strnlen(text_buffer, sizeof(text_buffer));
57         gx_prompt_text_set_ext(pp, &text);
58     }
59 }
60 
update_line_angle_prompt(VOID)61 VOID update_line_angle_prompt(VOID)
62 {
63     GX_PROMPT *pp;
64     static GX_CHAR text_buffer[10];
65     GX_STRING text;
66 
67     gx_widget_find((GX_WINDOW *)&line_screen, ID_ANGLE_PROMPT, 0, &pp);
68 
69     if (pp)
70     {
71         gx_utility_ltoa(line_angle, text_buffer, 10);
72         text.gx_string_ptr = text_buffer;
73         text.gx_string_length = strnlen(text_buffer, sizeof(text_buffer));
74         gx_prompt_text_set_ext(pp, &text);
75     }
76 }
77 
line_screen_event_handler(GX_WINDOW * window,GX_EVENT * myevent)78 UINT line_screen_event_handler(GX_WINDOW *window, GX_EVENT *myevent)
79 {
80     UINT status = 0;
81 
82     switch (myevent->gx_event_type)
83     {
84     case GX_SIGNAL(ID_LINE_WIDTH, GX_EVENT_SLIDER_VALUE):
85         line_width = myevent->gx_event_payload.gx_event_longdata;
86         update_width_prompt();
87         gx_system_dirty_mark(pLineWin);
88         break;
89 
90     case GX_SIGNAL(ID_LINE_ANGLE, GX_EVENT_SLIDER_VALUE):
91         line_angle = myevent->gx_event_payload.gx_event_longdata;
92         update_line_angle_prompt();
93         calculate_line_ends();
94         gx_system_dirty_mark(pLineWin);
95         break;
96 
97     case GX_SIGNAL(ID_ROUNDED, GX_EVENT_TOGGLE_ON):
98         rounded = GX_TRUE;
99         gx_system_dirty_mark(pLineWin);
100         break;
101 
102     case GX_SIGNAL(ID_ROUNDED, GX_EVENT_TOGGLE_OFF):
103         rounded = GX_FALSE;
104         gx_system_dirty_mark(pLineWin);
105         break;
106 
107     case GX_SIGNAL(ID_PATTERN, GX_EVENT_TOGGLE_ON):
108         line_pattern = 0x0f0f0f0f;
109         gx_system_dirty_mark(pLineWin);
110         break;
111 
112     case GX_SIGNAL(ID_PATTERN, GX_EVENT_TOGGLE_OFF):
113         line_pattern = 0;
114         gx_system_dirty_mark(pLineWin);
115         break;
116 
117     case GX_SIGNAL(ID_ANTI_ALIASED_LINE, GX_EVENT_TOGGLE_ON):
118         anti_alised_line = GX_TRUE;
119         gx_system_dirty_mark(pLineWin);
120         break;
121 
122     case GX_SIGNAL(ID_ANTI_ALIASED_LINE, GX_EVENT_TOGGLE_OFF):
123         anti_alised_line = GX_FALSE;
124         gx_system_dirty_mark(pLineWin);
125         break;
126 
127     default:
128         status = next_button_handler(window, myevent);
129         break;
130     }
131     return status;
132 }
133 
134 
135 
line_win_draw(GX_WINDOW * window)136 VOID line_win_draw(GX_WINDOW *window)
137 {
138     ULONG brush_style = 0;
139     GX_BRUSH *brush = GX_NULL;
140 
141     gx_window_draw((GX_WINDOW*)window);
142 
143 
144     if (anti_alised_line)
145     {
146         brush_style |= GX_BRUSH_ALIAS;
147     }
148 
149     if (rounded)
150     {
151         brush_style |= GX_BRUSH_ROUND;
152         gx_context_brush_define(GX_COLOR_ID_WHITE, window->gx_widget_normal_fill_color, brush_style);
153     }
154     else
155     {
156         /* Use different function to set brush color. But color value is same. */
157         gx_context_raw_brush_define(0xffffff, 0x9696ff, brush_style);
158     }
159 
160     gx_context_brush_width_set(line_width);
161     gx_context_brush_get(&brush);
162     if (brush)
163     {
164         brush->gx_brush_line_pattern = line_pattern;
165         gx_context_brush_set(brush);
166     }
167     calculate_line_ends();
168     gx_canvas_line_draw(line_x1, line_y1, line_x2, line_y2);
169 }
170