1 /**
2  * @file lv_draw_mask.c
3  *
4  */
5 
6 /*********************
7  *      INCLUDES
8  *********************/
9 #include "lv_draw_mask_private.h"
10 #include "lv_draw_private.h"
11 #include "../core/lv_refr.h"
12 #include "../misc/lv_math.h"
13 #include "../misc/lv_types.h"
14 #include "../stdlib/lv_string.h"
15 
16 /*********************
17  *      DEFINES
18  *********************/
19 
20 /**********************
21  *      TYPEDEFS
22  **********************/
23 
24 /**********************
25  *  STATIC PROTOTYPES
26  **********************/
27 
28 /**********************
29  *  STATIC VARIABLES
30  **********************/
31 
32 /**********************
33  *      MACROS
34  **********************/
35 
36 /**********************
37  *   GLOBAL FUNCTIONS
38  **********************/
39 
lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc)40 void LV_ATTRIBUTE_FAST_MEM lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc)
41 {
42     lv_memzero(dsc, sizeof(lv_draw_mask_rect_dsc_t));
43 }
44 
lv_draw_task_get_mask_rect_dsc(lv_draw_task_t * task)45 lv_draw_mask_rect_dsc_t * lv_draw_task_get_mask_rect_dsc(lv_draw_task_t * task)
46 {
47     return task->type == LV_DRAW_TASK_TYPE_MASK_RECTANGLE ? (lv_draw_mask_rect_dsc_t *)task->draw_dsc : NULL;
48 }
49 
lv_draw_mask_rect(lv_layer_t * layer,const lv_draw_mask_rect_dsc_t * dsc)50 void LV_ATTRIBUTE_FAST_MEM lv_draw_mask_rect(lv_layer_t * layer, const lv_draw_mask_rect_dsc_t * dsc)
51 {
52     if(!lv_color_format_has_alpha(layer->color_format)) {
53         LV_LOG_WARN("Only layers with alpha channel can be masked");
54         return;
55     }
56     LV_PROFILER_DRAW_BEGIN;
57 
58     lv_draw_task_t * t = lv_draw_add_task(layer, &layer->buf_area);
59 
60     t->draw_dsc = lv_malloc(sizeof(*dsc));
61     LV_ASSERT_MALLOC(t->draw_dsc);
62     lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc));
63     t->type = LV_DRAW_TASK_TYPE_MASK_RECTANGLE;
64 
65     lv_draw_dsc_base_t * base_dsc = t->draw_dsc;
66     base_dsc->layer = layer;
67 
68     if(base_dsc->obj && lv_obj_has_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS)) {
69         /*Disable sending LV_EVENT_DRAW_TASK_ADDED first to avoid triggering recursive
70          *event calls due draw task adds in the event*/
71         lv_obj_remove_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS);
72         lv_obj_send_event(dsc->base.obj, LV_EVENT_DRAW_TASK_ADDED, t);
73         lv_obj_add_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS);
74     }
75 
76     lv_draw_finalize_task_creation(layer, t);
77     LV_PROFILER_DRAW_END;
78 }
79 
80 /**********************
81  *   STATIC FUNCTIONS
82  **********************/
83