1 /**
2  * @file lv_draw_sdl_mask.c
3  *
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 #include "../../lv_conf_internal.h"
10 
11 #if LV_USE_GPU_SDL
12 
13 #include "../../misc/lv_gc.h"
14 #include "lv_draw_sdl_mask.h"
15 #include "lv_draw_sdl_utils.h"
16 
17 /*********************
18  *      DEFINES
19  *********************/
20 #ifndef HAVE_SDL_CUSTOM_BLEND_MODE
21     #define HAVE_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6))
22 #endif
23 
24 /**********************
25  *      TYPEDEFS
26  **********************/
27 
28 /**********************
29  *  STATIC PROTOTYPES
30  **********************/
31 
32 /**********************
33  *  STATIC VARIABLES
34  **********************/
35 
36 /**********************
37  *      MACROS
38  **********************/
39 
40 /**********************
41  *   GLOBAL FUNCTIONS
42  **********************/
43 
lv_draw_sdl_mask_dump_opa(const lv_area_t * coords,const int16_t * ids,int16_t ids_count)44 lv_opa_t * lv_draw_sdl_mask_dump_opa(const lv_area_t * coords, const int16_t * ids, int16_t ids_count)
45 {
46     SDL_assert(coords->x2 >= coords->x1);
47     SDL_assert(coords->y2 >= coords->y1);
48     lv_coord_t w = lv_area_get_width(coords), h = lv_area_get_height(coords);
49     lv_opa_t * mask_buf = lv_mem_buf_get(w * h);
50     for(lv_coord_t y = 0; y < h; y++) {
51         lv_opa_t * line_buf = &mask_buf[y * w];
52         lv_memset_ff(line_buf, w);
53         lv_coord_t abs_x = (lv_coord_t) coords->x1, abs_y = (lv_coord_t)(y + coords->y1), len = (lv_coord_t) w;
54         lv_draw_mask_res_t res;
55         if(ids) {
56             res = lv_draw_mask_apply_ids(line_buf, abs_x, abs_y, len, ids, ids_count);
57         }
58         else {
59             res = lv_draw_mask_apply(line_buf, abs_x, abs_y, len);
60         }
61         if(res == LV_DRAW_MASK_RES_TRANSP) {
62             lv_memset_00(line_buf, w);
63         }
64     }
65     return mask_buf;
66 }
67 
lv_draw_sdl_mask_dump_texture(SDL_Renderer * renderer,const lv_area_t * coords,const int16_t * ids,int16_t ids_count)68 SDL_Texture * lv_draw_sdl_mask_dump_texture(SDL_Renderer * renderer, const lv_area_t * coords, const int16_t * ids,
69                                             int16_t ids_count)
70 {
71     lv_coord_t w = lv_area_get_width(coords), h = lv_area_get_height(coords);
72     lv_opa_t * mask_buf = lv_draw_sdl_mask_dump_opa(coords, ids, ids_count);
73     SDL_Surface * surface = lv_sdl_create_opa_surface(mask_buf, w, h, w);
74     lv_mem_buf_release(mask_buf);
75     SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, surface);
76     SDL_FreeSurface(surface);
77     return texture;
78 }
79 
80 /**********************
81  *   STATIC FUNCTIONS
82  **********************/
83 
84 #endif /*LV_USE_GPU_SDL*/
85