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