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 GX_UBYTE          alpha_value = 255;
9 GX_BOOL           sprite_move_down = GX_TRUE;
10 
11 VOID memory_free(VOID *mem);
12 void move_sprite(void);
13 
sprite_event_handler(GX_WINDOW * window,GX_EVENT * event_ptr)14 UINT sprite_event_handler(GX_WINDOW *window, GX_EVENT *event_ptr)
15 {
16     switch (event_ptr->gx_event_type)
17     {
18     case GX_SIGNAL(ID_ALPHA_SLIDER, GX_EVENT_SLIDER_VALUE):
19         alpha_value = (GX_UBYTE)event_ptr->gx_event_payload.gx_event_longdata;
20         gx_system_dirty_mark(&sprite_screen.sprite_screen_apple_window);
21         break;
22 
23     case GX_SIGNAL(ID_BIRD_SPRITE, GX_EVENT_SPRITE_COMPLETE):
24         move_sprite();
25         gx_sprite_start(&sprite_screen.sprite_screen_sprite_1, 0);
26         break;
27 
28     default:
29         return gx_window_event_process(window, event_ptr);
30     }
31 
32     return 0;
33 }
34 
move_sprite(void)35 void move_sprite(void)
36 {
37 GX_RECTANGLE size;
38 GX_SPRITE *sprite = &sprite_screen.sprite_screen_sprite_1;
39 
40     size = sprite->gx_widget_size;
41 
42     if (sprite_move_down)
43     {
44         gx_utility_rectangle_shift(&size, 100, 117);
45         sprite_move_down = GX_FALSE;
46     }
47     else
48     {
49         gx_utility_rectangle_shift(&size, 100, -57);
50         sprite_move_down = GX_TRUE;
51     }
52     if (size.gx_rectangle_bottom > sprite_screen.gx_widget_size.gx_rectangle_bottom)
53     {
54         size.gx_rectangle_top -= sprite_screen.gx_widget_size.gx_rectangle_bottom;
55         size.gx_rectangle_bottom -= sprite_screen.gx_widget_size.gx_rectangle_bottom;
56     }
57     if (size.gx_rectangle_top < sprite_screen.gx_widget_size.gx_rectangle_top)
58     {
59         size.gx_rectangle_top += sprite_screen.gx_widget_size.gx_rectangle_bottom;
60         size.gx_rectangle_bottom += sprite_screen.gx_widget_size.gx_rectangle_bottom;
61     }
62 
63 
64     if (size.gx_rectangle_right > sprite_screen.gx_widget_size.gx_rectangle_right)
65     {
66         size.gx_rectangle_left -= sprite_screen.gx_widget_size.gx_rectangle_right;
67         size.gx_rectangle_right -= sprite_screen.gx_widget_size.gx_rectangle_right;
68     }
69     gx_widget_resize(sprite, &size);
70 }
71 
apple_window_draw(GX_WINDOW * window)72 VOID apple_window_draw(GX_WINDOW *window)
73 {
74 GX_PIXELMAP *map;
75 GX_PIXELMAP scaled_map;
76 int         width;
77 int         height;
78 int         xpos;
79 int         ypos;
80 
81     gx_context_pixelmap_get(GX_PIXELMAP_ID_RED_APPLE, &map);
82 
83     if(map)
84     {
85         width = (alpha_value * map->gx_pixelmap_width) >> 8;
86         height = (alpha_value * map->gx_pixelmap_height) >> 8;
87 
88         if ((width == 0) || (height == 0))
89         {
90             return;
91         }
92 
93         if (gx_utility_pixelmap_resize(map, &scaled_map, width, height) == GX_SUCCESS)
94         {
95             xpos = window->gx_widget_size.gx_rectangle_left;
96             ypos = window->gx_widget_size.gx_rectangle_top;
97 
98             xpos += (map->gx_pixelmap_width - width) >> 1;
99             ypos += (map->gx_pixelmap_height - height) >> 1;
100 
101             gx_canvas_pixelmap_blend(xpos, ypos, &scaled_map, alpha_value);
102 
103             if (scaled_map.gx_pixelmap_data)
104             {
105                 memory_free((VOID *)scaled_map.gx_pixelmap_data);
106             }
107 
108             if (scaled_map.gx_pixelmap_aux_data)
109             {
110                 memory_free((VOID*)scaled_map.gx_pixelmap_aux_data);
111             }
112         }
113     }
114 }