85 lines
2.3 KiB
C
85 lines
2.3 KiB
C
|
/**
|
||
|
* @file lv_draw_sdl_mask.c
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/*********************
|
||
|
* INCLUDES
|
||
|
*********************/
|
||
|
#include "../../lv_conf_internal.h"
|
||
|
|
||
|
#if LV_USE_GPU_SDL
|
||
|
|
||
|
#include "../../misc/lv_gc.h"
|
||
|
#include "lv_draw_sdl_mask.h"
|
||
|
#include "lv_draw_sdl_utils.h"
|
||
|
|
||
|
/*********************
|
||
|
* DEFINES
|
||
|
*********************/
|
||
|
#ifndef HAVE_SDL_CUSTOM_BLEND_MODE
|
||
|
#define HAVE_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6))
|
||
|
#endif
|
||
|
|
||
|
/**********************
|
||
|
* TYPEDEFS
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* STATIC PROTOTYPES
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* STATIC VARIABLES
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* MACROS
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* GLOBAL FUNCTIONS
|
||
|
**********************/
|
||
|
|
||
|
lv_opa_t * lv_draw_sdl_mask_dump_opa(const lv_area_t * coords, const int16_t * ids, int16_t ids_count)
|
||
|
{
|
||
|
SDL_assert(coords->x2 >= coords->x1);
|
||
|
SDL_assert(coords->y2 >= coords->y1);
|
||
|
lv_coord_t w = lv_area_get_width(coords), h = lv_area_get_height(coords);
|
||
|
lv_opa_t * mask_buf = lv_mem_buf_get(w * h);
|
||
|
for(lv_coord_t y = 0; y < h; y++) {
|
||
|
lv_opa_t * line_buf = &mask_buf[y * w];
|
||
|
lv_memset_ff(line_buf, w);
|
||
|
lv_coord_t abs_x = (lv_coord_t) coords->x1, abs_y = (lv_coord_t)(y + coords->y1), len = (lv_coord_t) w;
|
||
|
lv_draw_mask_res_t res;
|
||
|
if(ids) {
|
||
|
res = lv_draw_mask_apply_ids(line_buf, abs_x, abs_y, len, ids, ids_count);
|
||
|
}
|
||
|
else {
|
||
|
res = lv_draw_mask_apply(line_buf, abs_x, abs_y, len);
|
||
|
}
|
||
|
if(res == LV_DRAW_MASK_RES_TRANSP) {
|
||
|
lv_memset_00(line_buf, w);
|
||
|
}
|
||
|
}
|
||
|
return mask_buf;
|
||
|
}
|
||
|
|
||
|
SDL_Texture * lv_draw_sdl_mask_dump_texture(SDL_Renderer * renderer, const lv_area_t * coords, const int16_t * ids,
|
||
|
int16_t ids_count)
|
||
|
{
|
||
|
lv_coord_t w = lv_area_get_width(coords), h = lv_area_get_height(coords);
|
||
|
lv_opa_t * mask_buf = lv_draw_sdl_mask_dump_opa(coords, ids, ids_count);
|
||
|
SDL_Surface * surface = lv_sdl_create_opa_surface(mask_buf, w, h, w);
|
||
|
lv_mem_buf_release(mask_buf);
|
||
|
SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, surface);
|
||
|
SDL_FreeSurface(surface);
|
||
|
return texture;
|
||
|
}
|
||
|
|
||
|
/**********************
|
||
|
* STATIC FUNCTIONS
|
||
|
**********************/
|
||
|
|
||
|
#endif /*LV_USE_GPU_SDL*/
|