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 "partial_frame_buffer_16bpp_resources.h"
6 #include "partial_frame_buffer_16bpp_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 
line_screen_event_handler(GX_WINDOW * window,GX_EVENT * myevent)44 UINT line_screen_event_handler(GX_WINDOW *window, GX_EVENT *myevent)
45 {
46     UINT status = 0;
47 
48     switch (myevent->gx_event_type)
49     {
50     case GX_SIGNAL(ID_LINE_WIDTH, GX_EVENT_SLIDER_VALUE):
51         line_width = myevent->gx_event_payload.gx_event_longdata;
52         gx_numeric_prompt_value_set(&line_screen.line_screen_line_width, line_width);
53         gx_system_dirty_mark(pLineWin);
54         break;
55 
56     case GX_SIGNAL(ID_LINE_ANGLE, GX_EVENT_SLIDER_VALUE):
57         line_angle = myevent->gx_event_payload.gx_event_longdata;
58         gx_numeric_prompt_value_set(&line_screen.line_screen_line_angle, line_angle);
59         calculate_line_ends();
60         gx_system_dirty_mark(pLineWin);
61         break;
62 
63     case GX_SIGNAL(ID_ROUNDED, GX_EVENT_TOGGLE_ON):
64         rounded = GX_TRUE;
65         gx_system_dirty_mark(pLineWin);
66         break;
67 
68     case GX_SIGNAL(ID_ROUNDED, GX_EVENT_TOGGLE_OFF):
69         rounded = GX_FALSE;
70         gx_system_dirty_mark(pLineWin);
71         break;
72 
73     case GX_SIGNAL(ID_PATTERN, GX_EVENT_TOGGLE_ON):
74         line_pattern = 0x0f0f0f0f;
75         gx_system_dirty_mark(pLineWin);
76         break;
77 
78     case GX_SIGNAL(ID_PATTERN, GX_EVENT_TOGGLE_OFF):
79         line_pattern = 0;
80         gx_system_dirty_mark(pLineWin);
81         break;
82 
83     case GX_SIGNAL(ID_ANTI_ALIASED_LINE, GX_EVENT_TOGGLE_ON):
84         anti_alised_line = GX_TRUE;
85         gx_system_dirty_mark(pLineWin);
86         break;
87 
88     case GX_SIGNAL(ID_ANTI_ALIASED_LINE, GX_EVENT_TOGGLE_OFF):
89         anti_alised_line = GX_FALSE;
90         gx_system_dirty_mark(pLineWin);
91         break;
92 
93     default:
94         status = gx_window_event_process(window, myevent);
95         break;
96     }
97     return status;
98 }
99 
100 
101 
line_win_draw(GX_WINDOW * window)102 VOID line_win_draw(GX_WINDOW *window)
103 {
104     ULONG brush_style = 0;
105     GX_BRUSH *brush = GX_NULL;
106 
107     gx_window_draw((GX_WINDOW*)window);
108 
109 
110     if (anti_alised_line)
111     {
112         brush_style |= GX_BRUSH_ALIAS;
113     }
114 
115     if (rounded)
116     {
117         brush_style |= GX_BRUSH_ROUND;
118         gx_context_brush_define(GX_COLOR_ID_WHITE, window->gx_widget_normal_fill_color, brush_style);
119     }
120     else
121     {
122         /* Use different function to set brush color. But color value is same. */
123         gx_context_raw_brush_define(0xffffff, 0x9696ff, brush_style);
124     }
125 
126     gx_context_brush_width_set(line_width);
127     gx_context_brush_get(&brush);
128     if (brush)
129     {
130         brush->gx_brush_line_pattern = line_pattern;
131         gx_context_brush_set(brush);
132     }
133     calculate_line_ends();
134     gx_canvas_line_draw(line_x1, line_y1, line_x2, line_y2);
135 }
136