1 /* This is a small demo of the high-performance GUIX graphics framework. */
2 
3 #include <stdio.h>
4 #include "tx_api.h"
5 #include "gx_api.h"
6 #include "gx_validation_utility.h"
7 
8 TEST_PARAM test_parameter = {
9     "guix_radial_progress_bar", /* Test name */
10     50, 100, 300, 350  /* Define the coordinates of the capture area.
11                          In this test, we only need to capture the pixelmap
12                          drawing area.  */
13 };
14 
15 static VOID      control_thread_entry(ULONG);
main(int argc,char ** argv)16 int main(int argc, char ** argv)
17 {
18     /* Parse the command line argument. */
19     gx_validation_setup(argc, argv);
20 
21     /* Start ThreadX system */
22     tx_kernel_enter();
23     return(0);
24 }
25 
tx_application_define(void * first_unused_memory)26 VOID tx_application_define(void *first_unused_memory)
27 {
28 
29     /* Create a dedicated thread to perform various operations
30        on the line drawing example. These operations simulate
31        user input. */
32     gx_validation_control_thread_create(control_thread_entry);
33 
34     /* Termiante the test if it runs for more than 100 ticks */
35     /* This function is not implemented yet. */
36     gx_validation_watchdog_create(100);
37 
38     /* Call the actual line example routine. */
39     gx_validation_application_define(first_unused_memory);
40 
41 }
42 
43 /* Replace the default graphics driver with the validation driver. */
44 #ifdef win32_graphics_driver_setup_24xrgb
45 #undef win32_graphics_driver_setup_24xrgb
46 #endif
47 #define win32_graphics_driver_setup_24xrgb  gx_validation_graphics_driver_setup_24xrgb
48 
49 
50 #ifdef WIN32
51 #undef WIN32
52 #endif
53 
54 #include "gx_validation_wrapper.h"
55 #include "demo_guix_radial_progress_bar.c"
56 
57 char test_comment[255];
58 
59 const char *direction[]={
60 "clockwise",
61 "anti-clockwise"};
62 
63 GX_POINT points_on_track[] = { { 232, 149 }, { 247, 290 }, { 101, 300 }, { 89, 177 } };
64 GX_POINT points_off_track[] = { { 238, 174 }, { 235, 258 }, { 113, 268 }, { 108, 189 } };
65 GX_CONST GX_CHAR *on_track_text[] = { "p1", "p2", "p3", "p4" };
66 GX_CONST GX_CHAR *off_track_text[] = { "pp1", "pp2", "pp3", "pp4" };
67 
test_radial_progress_bar_draw(GX_RADIAL_PROGRESS_BAR * progress_bar)68 VOID test_radial_progress_bar_draw(GX_RADIAL_PROGRESS_BAR *progress_bar)
69 {
70 GX_BRUSH    *brush;
71 INT          index;
72 GX_RECTANGLE rect;
73 
74     gx_context_brush_get(&brush);
75     brush->gx_brush_alpha = radial_progress_bar_alpha;
76 
77     gx_radial_progress_bar_draw(progress_bar);
78 
79     for (index = 0; index < (INT)(sizeof(points_on_track) / sizeof(GX_POINT)); index++)
80     {
81         rect.gx_rectangle_left = points_on_track[index].gx_point_x;
82         rect.gx_rectangle_top = points_on_track[index].gx_point_y;
83         rect.gx_rectangle_right = rect.gx_rectangle_left + 2;
84         rect.gx_rectangle_bottom = rect.gx_rectangle_top + 2;
85 
86         gx_context_brush_width_set(1);
87         gx_context_font_set(GX_FONT_ID_DEFAULT);
88 
89         gx_context_fill_color_set(GX_COLOR_ID_RED);
90         gx_context_line_color_set(GX_COLOR_ID_RED);
91         gx_canvas_rectangle_draw(&rect);
92 
93         gx_context_line_color_set(GX_COLOR_ID_GREEN);
94         gx_canvas_text_draw(rect.gx_rectangle_right + 2, rect.gx_rectangle_top, on_track_text[index], GX_STRLEN(on_track_text[index]));
95 
96         rect.gx_rectangle_left = points_off_track[index].gx_point_x;
97         rect.gx_rectangle_top = points_off_track[index].gx_point_y;
98         rect.gx_rectangle_right = rect.gx_rectangle_left + 2;
99         rect.gx_rectangle_bottom = rect.gx_rectangle_top + 2;
100 
101         gx_context_fill_color_set(GX_COLOR_ID_RED);
102         gx_context_line_color_set(GX_COLOR_ID_RED);
103         gx_canvas_rectangle_draw(&rect);
104 
105         gx_context_line_color_set(GX_COLOR_ID_BTN_BORDER);
106         gx_context_font_set(GX_FONT_ID_DEFAULT);
107         gx_canvas_text_draw(rect.gx_rectangle_right + 2, rect.gx_rectangle_top, off_track_text[index], GX_STRLEN(off_track_text[index]));
108     }
109 }
110 
111 /* This thread simulates user input.  Its priority is lower
112    than the GUIX thread, so that GUIX finishes an operation
113    before this thread is able to issue the next command. */
control_thread_entry(ULONG input)114 static VOID control_thread_entry(ULONG input)
115 {
116 int      frame_id = 1;
117 int      anchor_value;
118 int      value;
119 int      normal_brush_width = 1;
120 int      selected_brush_width = 28;
121 GX_EVENT my_event;
122 int      enable_style;
123 int      index;
124 int      move_direction;
125 
126     gx_widget_draw_set((GX_WIDGET *)progress_bar, test_radial_progress_bar_draw);
127     /* Test enbale style.  */
128 
129     /* Initialize event structure.  */
130     memset(&my_event, 0, sizeof(GX_EVENT));
131     my_event.gx_event_display_handle = 1;
132 
133     for(enable_style = 0; enable_style < 2; enable_style ++)
134     {
135         if(enable_style)
136         {
137             gx_widget_style_add((GX_WIDGET *)progress_bar, GX_STYLE_ENABLED);
138         }
139         else
140         {
141             gx_widget_style_remove((GX_WIDGET *)progress_bar, GX_STYLE_ENABLED);
142         }
143 
144         for(move_direction = 0; move_direction < 2; move_direction++)
145         {
146             if(move_direction == 0)
147             {
148                 /* Radial progress bar move clockwise.  */
149                 gx_radial_progress_bar_value_set(progress_bar, -180);
150             }
151             else
152             {
153                 /* Radial progress bar move anti-clockwise.  */
154                 gx_radial_progress_bar_value_set(progress_bar, 180);
155             }
156 
157             for(index = 0; index < (int)(sizeof(points_on_track)/sizeof(GX_POINT)); index++)
158             {
159                 /* Click on track.  */
160                 my_event.gx_event_type = GX_EVENT_PEN_DOWN;
161                 my_event.gx_event_payload.gx_event_pointdata.gx_point_x = points_on_track[index].gx_point_x;
162                 my_event.gx_event_payload.gx_event_pointdata.gx_point_y = points_on_track[index].gx_point_y;
163                 gx_system_event_send(&my_event);
164 
165                 my_event.gx_event_type = GX_EVENT_PEN_UP;
166                 gx_system_event_send(&my_event);
167 
168                 gx_validation_set_frame_id(frame_id++);
169                 sprintf(test_comment, "Enable style: %d, move %s, click at %s.",
170                     enable_style, direction[move_direction], on_track_text[index]);
171                 gx_validation_set_frame_comment(test_comment);
172                 gx_validation_screen_refresh();
173             }
174 
175             for(index = 0; index < (int)(sizeof(points_off_track)/sizeof(GX_POINT)); index++)
176             {
177                 /* Click off track.  */
178                 my_event.gx_event_type = GX_EVENT_PEN_DOWN;
179                 my_event.gx_event_payload.gx_event_pointdata.gx_point_x = points_off_track[index].gx_point_x;
180                 my_event.gx_event_payload.gx_event_pointdata.gx_point_y = points_off_track[index].gx_point_y;
181                 gx_system_event_send(&my_event);
182 
183                 my_event.gx_event_type = GX_EVENT_PEN_UP;
184                 gx_system_event_send(&my_event);
185 
186                 gx_validation_set_frame_id(frame_id++);
187                 sprintf(test_comment, "Enable style: %d, move %s, click at %s.",
188                     enable_style, direction[move_direction], off_track_text[index]);
189                 gx_validation_set_frame_comment(test_comment);
190                 gx_validation_screen_refresh();
191             }
192 
193             for(index = 0; index < (int)(sizeof(points_off_track)/sizeof(GX_POINT)); index++)
194             {
195                 /* Send drag event.  */
196                 my_event.gx_event_type = GX_EVENT_PEN_DOWN;
197                 my_event.gx_event_payload.gx_event_pointdata.gx_point_x = points_on_track[0].gx_point_x;
198                 my_event.gx_event_payload.gx_event_pointdata.gx_point_y = points_on_track[0].gx_point_y;
199                 gx_system_event_send(&my_event);
200 
201 
202                 my_event.gx_event_type = GX_EVENT_PEN_DRAG;
203                 my_event.gx_event_payload.gx_event_pointdata.gx_point_x = points_off_track[index].gx_point_x;
204                 my_event.gx_event_payload.gx_event_pointdata.gx_point_y = points_off_track[index].gx_point_y;
205                 gx_system_event_send(&my_event);
206 
207                 my_event.gx_event_type = GX_EVENT_PEN_UP;
208                 gx_system_event_send(&my_event);
209 
210                 gx_validation_set_frame_id(frame_id++);
211                 sprintf(test_comment, "Enable style: %d, move %s, drag from %s to %s.",
212                     enable_style, direction[move_direction], on_track_text[0], off_track_text[index]);
213                 gx_validation_set_frame_comment(test_comment);
214                 gx_validation_screen_refresh();
215            }
216         }
217     }
218 
219     /* Test properties. */
220 
221     for(index = 0; index < 8; index++)
222     {
223 
224         switch(index)
225         {
226         case 0:
227             /* Set text color.  */
228             gx_radial_progress_bar_text_color_set(progress_bar, GX_COLOR_ID_SLIDER_NEEDLE_LINE2, GX_COLOR_ID_GREEN, GX_COLOR_ID_SLIDER_NEEDLE_LINE2);
229             sprintf(test_comment, "Set text color");
230             break;
231 
232         case 1:
233             /* Set brush color.  */
234             info->gx_radial_progress_bar_info_normal_brush_color = GX_COLOR_ID_WINDOW_BORDER;
235             info->gx_radial_progress_bar_info_selected_brush_color = GX_COLOR_ID_BTN_BORDER;
236             info->gx_radial_progress_bar_info_anchor_val = -1;
237             gx_radial_progress_bar_info_set(progress_bar, info);
238             sprintf(test_comment, "Set brush color, set anchor value to -1");
239             break;
240         case 2:
241             info->gx_radial_progress_bar_info_anchor_val = 400;
242             gx_radial_progress_bar_info_set(progress_bar, info);
243             sprintf(test_comment, "Set anchor value to 400");
244             break;
245 
246         case 3:
247             /* Set text font.  */
248             gx_radial_progress_bar_font_set(progress_bar, GX_FONT_ID_SYSTEM);
249             sprintf(test_comment, "Set font");
250             break;
251 
252         case 4:
253             /* Hide text.  */
254             gx_widget_style_remove((GX_WIDGET *)progress_bar, GX_STYLE_PROGRESS_TEXT_DRAW);
255             sprintf(test_comment, "Hide text");
256             break;
257 
258         case 5:
259             /* Show text.  */
260             gx_widget_style_add((GX_WIDGET *)progress_bar, GX_STYLE_PROGRESS_TEXT_DRAW);
261             sprintf(test_comment, "Show text");
262             break;
263 
264         case 6:
265             /* Show text without percent flag.  */
266             gx_widget_style_remove((GX_WIDGET *)progress_bar, GX_STYLE_PROGRESS_PERCENT);
267             sprintf(test_comment, "Disable percent flag");
268             break;
269 
270         case 7:
271             /* Show text with percent flag.  */
272             gx_widget_style_add((GX_WIDGET *)progress_bar, GX_STYLE_PROGRESS_PERCENT);
273             sprintf(test_comment, "Enable percent flag");
274             break;
275         }
276 
277         gx_validation_set_frame_id(frame_id++);
278         gx_validation_set_frame_comment(test_comment);
279         gx_validation_screen_refresh();
280     }
281 
282 
283     for(anchor_value = 0; anchor_value < 360; anchor_value += 20)
284     {
285 
286         if(anchor_value > 180)
287         {
288             gx_widget_style_remove((GX_WIDGET *)progress_bar, GX_STYLE_RADIAL_PROGRESS_ALIAS);
289             gx_widget_style_remove((GX_WIDGET *)progress_bar, GX_STYLE_RADIAL_PROGRESS_ROUND);
290 
291             gx_validation_set_frame_id(frame_id++);
292             sprintf(test_comment, "Draw without aliasing, draw with round end");
293             gx_validation_set_frame_comment(test_comment);
294             gx_validation_screen_refresh();
295         }
296 
297         for (value = anchor_value - 380; value <= anchor_value + 360; value += 20)
298         {
299             normal_brush_width ++;
300             if(normal_brush_width > 30)
301             {
302                 normal_brush_width = 1;
303             }
304 
305             selected_brush_width --;
306             if(selected_brush_width < 1)
307             {
308                 selected_brush_width = 20;
309             }
310 
311             /* Set anchor value. */
312             gx_radial_progress_bar_anchor_set(progress_bar, anchor_value);
313 
314             /* Set radial progress bar value.  */
315             gx_radial_progress_bar_value_set(progress_bar, value);
316 
317             /* Set brush width. */
318             info->gx_radial_progress_bar_info_selected_brush_width = selected_brush_width;
319             info->gx_radial_progress_bar_info_normal_brush_width = normal_brush_width;
320             gx_radial_progress_bar_info_set(progress_bar, info);
321 
322             gx_validation_set_frame_id(frame_id++);
323             sprintf(test_comment, "anchor value:%d, value:%d, normal brush width:%d, selected brush width:%d",
324                     anchor_value, value, normal_brush_width, selected_brush_width);
325             gx_validation_set_frame_comment(test_comment);
326             gx_validation_screen_refresh();
327         }
328     }
329 
330     gx_widget_hide(progress_bar);
331     gx_radial_progress_bar_text_color_set(progress_bar, 0, 0, 0);
332     gx_widget_show(progress_bar);
333     gx_validation_set_frame_id(frame_id++);
334     gx_validation_set_frame_comment("Set text_color for a hidden progress bar.");
335     gx_validation_screen_refresh();
336 
337     gx_widget_hide(progress_bar);
338     gx_radial_progress_bar_font_set(progress_bar, 0);
339     gx_widget_show(progress_bar);
340     gx_validation_set_frame_id(frame_id++);
341     gx_validation_set_frame_comment("Set font for a hidden progress bar.");
342     gx_validation_screen_refresh();
343 
344     gx_widget_hide(progress_bar);
345     gx_radial_progress_bar_anchor_set(progress_bar, 0);
346     gx_widget_show(progress_bar);
347     gx_validation_set_frame_id(frame_id++);
348     gx_validation_set_frame_comment("Set anchor for a hidden progress bar.");
349     gx_validation_screen_refresh();
350 
351     gx_widget_hide(progress_bar);
352     gx_radial_progress_bar_value_set(progress_bar, 0);
353     gx_widget_show(progress_bar);
354     gx_validation_set_frame_id(frame_id++);
355     gx_validation_set_frame_comment("Set value for a hidden progress bar.");
356     gx_validation_screen_refresh();
357 
358     gx_widget_style_remove((GX_WIDGET *)progress_bar, GX_STYLE_ENABLED);
359     memset(&my_event, 0, sizeof(my_event));
360     my_event.gx_event_type = GX_EVENT_PEN_DOWN;
361     my_event.gx_event_target = (GX_WIDGET *)progress_bar;
362     gx_system_event_send(&my_event);
363     gx_validation_set_frame_id(frame_id++);
364     gx_validation_set_frame_comment("Set PEN_DOWN event to a progress bar without GX_STYLE_ENABLED.");
365     gx_validation_screen_refresh();
366 
367     gx_widget_status_remove((GX_WIDGET *)progress_bar, GX_STATUS_OWNS_INPUT);
368     memset(&my_event, 0, sizeof(my_event));
369     my_event.gx_event_type = GX_EVENT_PEN_UP;
370     my_event.gx_event_target = (GX_WIDGET *)progress_bar;
371     gx_system_event_send(&my_event);
372     gx_validation_set_frame_id(frame_id++);
373     gx_validation_set_frame_comment("Set PEN_UP event to a progress bar without GX_STATUS_OWNS_INPUT.");
374     gx_validation_screen_refresh();
375 
376     gx_widget_status_remove((GX_WIDGET *)progress_bar, GX_STATUS_OWNS_INPUT);
377     memset(&my_event, 0, sizeof(my_event));
378     my_event.gx_event_type = GX_EVENT_PEN_DRAG;
379     my_event.gx_event_target = (GX_WIDGET *)progress_bar;
380     gx_system_event_send(&my_event);
381     gx_validation_set_frame_id(frame_id++);
382     gx_validation_set_frame_comment("Set PEN_DRAG event to a progress bar without GX_STATUS_OWNS_INPUT.");
383     gx_validation_screen_refresh();
384 
385     /* Signal the end of the test case.  Verify the output. */
386     gx_validation_end();
387 
388     exit(0);
389 }
390