acid-drop

- Hacking the planet from a LilyGo T-Deck using custom firmware
git clone git://git.acid.vegas/acid-drop.git
Log | Files | Refs | Archive | README | LICENSE

lv_draw_mask.h (12918B)

      1 /**
      2  * @file lv_draw_mask.h
      3  *
      4  */
      5 
      6 #ifndef LV_DRAW_MASK_H
      7 #define LV_DRAW_MASK_H
      8 
      9 #ifdef __cplusplus
     10 extern "C" {
     11 #endif
     12 
     13 
     14 /*********************
     15  *      INCLUDES
     16  *********************/
     17 #include <stdbool.h>
     18 #include "../misc/lv_area.h"
     19 #include "../misc/lv_color.h"
     20 #include "../misc/lv_math.h"
     21 
     22 /*********************
     23  *      DEFINES
     24  *********************/
     25 #define LV_MASK_ID_INV  (-1)
     26 #if LV_DRAW_COMPLEX
     27 # define _LV_MASK_MAX_NUM     16
     28 #else
     29 # define _LV_MASK_MAX_NUM     1
     30 #endif
     31 
     32 /**********************
     33  *      TYPEDEFS
     34  **********************/
     35 
     36 enum {
     37     LV_DRAW_MASK_RES_TRANSP,
     38     LV_DRAW_MASK_RES_FULL_COVER,
     39     LV_DRAW_MASK_RES_CHANGED,
     40     LV_DRAW_MASK_RES_UNKNOWN
     41 };
     42 
     43 typedef uint8_t lv_draw_mask_res_t;
     44 
     45 typedef struct {
     46     void * param;
     47     void * custom_id;
     48 } _lv_draw_mask_saved_t;
     49 
     50 typedef _lv_draw_mask_saved_t _lv_draw_mask_saved_arr_t[_LV_MASK_MAX_NUM];
     51 
     52 
     53 
     54 #if LV_DRAW_COMPLEX == 0
     55 static inline  uint8_t lv_draw_mask_get_cnt(void)
     56 {
     57     return 0;
     58 }
     59 
     60 static inline bool lv_draw_mask_is_any(const lv_area_t * a)
     61 {
     62     LV_UNUSED(a);
     63     return false;
     64 }
     65 
     66 #endif
     67 
     68 #if LV_DRAW_COMPLEX
     69 
     70 enum {
     71     LV_DRAW_MASK_TYPE_LINE,
     72     LV_DRAW_MASK_TYPE_ANGLE,
     73     LV_DRAW_MASK_TYPE_RADIUS,
     74     LV_DRAW_MASK_TYPE_FADE,
     75     LV_DRAW_MASK_TYPE_MAP,
     76     LV_DRAW_MASK_TYPE_POLYGON,
     77 };
     78 
     79 typedef uint8_t lv_draw_mask_type_t;
     80 
     81 enum {
     82     LV_DRAW_MASK_LINE_SIDE_LEFT = 0,
     83     LV_DRAW_MASK_LINE_SIDE_RIGHT,
     84     LV_DRAW_MASK_LINE_SIDE_TOP,
     85     LV_DRAW_MASK_LINE_SIDE_BOTTOM,
     86 };
     87 
     88 /**
     89  * A common callback type for every mask type.
     90  * Used internally by the library.
     91  */
     92 typedef lv_draw_mask_res_t (*lv_draw_mask_xcb_t)(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
     93                                                  lv_coord_t len,
     94                                                  void * p);
     95 
     96 typedef uint8_t lv_draw_mask_line_side_t;
     97 
     98 typedef struct {
     99     lv_draw_mask_xcb_t cb;
    100     lv_draw_mask_type_t type;
    101 } _lv_draw_mask_common_dsc_t;
    102 
    103 typedef struct {
    104     /*The first element must be the common descriptor*/
    105     _lv_draw_mask_common_dsc_t dsc;
    106 
    107     struct {
    108         /*First point*/
    109         lv_point_t p1;
    110 
    111         /*Second point*/
    112         lv_point_t p2;
    113 
    114         /*Which side to keep?*/
    115         lv_draw_mask_line_side_t side : 2;
    116     } cfg;
    117 
    118     /*A point of the line*/
    119     lv_point_t origo;
    120 
    121     /*X / (1024*Y) steepness (X is 0..1023 range). What is the change of X in 1024 Y?*/
    122     int32_t xy_steep;
    123 
    124     /*Y / (1024*X) steepness (Y is 0..1023 range). What is the change of Y in 1024 X?*/
    125     int32_t yx_steep;
    126 
    127     /*Helper which stores yx_steep for flat lines and xy_steep for steep (non flat) lines*/
    128     int32_t steep;
    129 
    130     /*Steepness in 1 px in 0..255 range. Used only by flat lines.*/
    131     int32_t spx;
    132 
    133     /*1: It's a flat line? (Near to horizontal)*/
    134     uint8_t flat : 1;
    135 
    136     /*Invert the mask. The default is: Keep the left part.
    137      *It is used to select left/right/top/bottom*/
    138     uint8_t inv: 1;
    139 } lv_draw_mask_line_param_t;
    140 
    141 typedef struct {
    142     /*The first element must be the common descriptor*/
    143     _lv_draw_mask_common_dsc_t dsc;
    144 
    145     struct {
    146         lv_point_t vertex_p;
    147         lv_coord_t start_angle;
    148         lv_coord_t end_angle;
    149     } cfg;
    150 
    151     lv_draw_mask_line_param_t start_line;
    152     lv_draw_mask_line_param_t end_line;
    153     uint16_t delta_deg;
    154 } lv_draw_mask_angle_param_t;
    155 
    156 typedef struct  {
    157     uint8_t * buf;
    158     lv_opa_t * cir_opa;         /*Opacity of values on the circumference of an 1/4 circle*/
    159     uint16_t * x_start_on_y;        /*The x coordinate of the circle for each y value*/
    160     uint16_t * opa_start_on_y;      /*The index of `cir_opa` for each y value*/
    161     int32_t life;               /*How many times the entry way used*/
    162     uint32_t used_cnt;          /*Like a semaphore to count the referencing masks*/
    163     lv_coord_t radius;          /*The radius of the entry*/
    164 } _lv_draw_mask_radius_circle_dsc_t;
    165 
    166 typedef _lv_draw_mask_radius_circle_dsc_t _lv_draw_mask_radius_circle_dsc_arr_t[LV_CIRCLE_CACHE_SIZE];
    167 
    168 typedef struct {
    169     /*The first element must be the common descriptor*/
    170     _lv_draw_mask_common_dsc_t dsc;
    171 
    172     struct {
    173         lv_area_t rect;
    174         lv_coord_t radius;
    175         /*Invert the mask. 0: Keep the pixels inside.*/
    176         uint8_t outer: 1;
    177     } cfg;
    178 
    179     _lv_draw_mask_radius_circle_dsc_t * circle;
    180 } lv_draw_mask_radius_param_t;
    181 
    182 
    183 typedef struct {
    184     /*The first element must be the common descriptor*/
    185     _lv_draw_mask_common_dsc_t dsc;
    186 
    187     struct {
    188         lv_area_t coords;
    189         lv_coord_t y_top;
    190         lv_coord_t y_bottom;
    191         lv_opa_t opa_top;
    192         lv_opa_t opa_bottom;
    193     } cfg;
    194 
    195 } lv_draw_mask_fade_param_t;
    196 
    197 
    198 typedef struct _lv_draw_mask_map_param_t {
    199     /*The first element must be the common descriptor*/
    200     _lv_draw_mask_common_dsc_t dsc;
    201 
    202     struct {
    203         lv_area_t coords;
    204         const lv_opa_t * map;
    205     } cfg;
    206 } lv_draw_mask_map_param_t;
    207 
    208 typedef struct {
    209     /*The first element must be the common descriptor*/
    210     _lv_draw_mask_common_dsc_t dsc;
    211 
    212     struct {
    213         lv_point_t * points;
    214         uint16_t point_cnt;
    215     } cfg;
    216 } lv_draw_mask_polygon_param_t;
    217 
    218 
    219 /**********************
    220  * GLOBAL PROTOTYPES
    221  **********************/
    222 
    223 /**
    224  * Add a draw mask. Everything drawn after it (until removing the mask) will be affected by the mask.
    225  * @param param an initialized mask parameter. Only the pointer is saved.
    226  * @param custom_id a custom pointer to identify the mask. Used in `lv_draw_mask_remove_custom`.
    227  * @return the an integer, the ID of the mask. Can be used in `lv_draw_mask_remove_id`.
    228  */
    229 int16_t lv_draw_mask_add(void * param, void * custom_id);
    230 
    231 //! @cond Doxygen_Suppress
    232 
    233 /**
    234  * Apply the added buffers on a line. Used internally by the library's drawing routines.
    235  * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`.
    236  * @param abs_x absolute X coordinate where the line to calculate start
    237  * @param abs_y absolute Y coordinate where the line to calculate start
    238  * @param len length of the line to calculate (in pixel count)
    239  * @return One of these values:
    240  * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero
    241  * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged
    242  * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line
    243  */
    244 LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
    245                                                             lv_coord_t len);
    246 
    247 /**
    248  * Apply the specified buffers on a line. Used internally by the library's drawing routines.
    249  * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`.
    250  * @param abs_x absolute X coordinate where the line to calculate start
    251  * @param abs_y absolute Y coordinate where the line to calculate start
    252  * @param len length of the line to calculate (in pixel count)
    253  * @param ids ID array of added buffers
    254  * @param ids_count number of ID array
    255  * @return One of these values:
    256  * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero
    257  * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged
    258  * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line
    259  */
    260 LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
    261                                                                 lv_coord_t len, const int16_t * ids, int16_t ids_count);
    262 
    263 //! @endcond
    264 
    265 /**
    266  * Remove a mask with a given ID
    267  * @param id the ID of the mask.  Returned by `lv_draw_mask_add`
    268  * @return the parameter of the removed mask.
    269  * If more masks have `custom_id` ID then the last mask's parameter will be returned
    270  */
    271 void * lv_draw_mask_remove_id(int16_t id);
    272 
    273 /**
    274  * Remove all mask with a given custom ID
    275  * @param custom_id a pointer used in `lv_draw_mask_add`
    276  * @return return the parameter of the removed mask.
    277  * If more masks have `custom_id` ID then the last mask's parameter will be returned
    278  */
    279 void * lv_draw_mask_remove_custom(void * custom_id);
    280 
    281 /**
    282  * Free the data from the parameter.
    283  * It's called inside `lv_draw_mask_remove_id` and `lv_draw_mask_remove_custom`
    284  * Needs to be called only in special cases when the mask is not added by `lv_draw_mask_add`
    285  * and not removed by `lv_draw_mask_remove_id` or `lv_draw_mask_remove_custom`
    286  * @param p pointer to a mask parameter
    287  */
    288 void lv_draw_mask_free_param(void * p);
    289 
    290 /**
    291  * Called by LVGL the rendering of a screen is ready to clean up
    292  * the temporal (cache) data of the masks
    293  */
    294 void _lv_draw_mask_cleanup(void);
    295 
    296 //! @cond Doxygen_Suppress
    297 
    298 /**
    299  * Count the currently added masks
    300  * @return number of active masks
    301  */
    302 LV_ATTRIBUTE_FAST_MEM uint8_t lv_draw_mask_get_cnt(void);
    303 
    304 
    305 /**
    306  * Check if there is any added draw mask
    307  * @param a     an area to test for affecting masks.
    308  * @return true: there is t least 1 draw mask; false: there are no draw masks
    309  */
    310 bool lv_draw_mask_is_any(const lv_area_t * a);
    311 
    312 //! @endcond
    313 
    314 /**
    315  *Initialize a line mask from two points.
    316  * @param param pointer to a `lv_draw_mask_param_t` to initialize
    317  * @param p1x X coordinate of the first point of the line
    318  * @param p1y Y coordinate of the first point of the line
    319  * @param p2x X coordinate of the second point of the line
    320  * @param p2y y coordinate of the second point of the line
    321  * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep.
    322  * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept
    323  * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept
    324  */
    325 void lv_draw_mask_line_points_init(lv_draw_mask_line_param_t * param, lv_coord_t p1x, lv_coord_t p1y, lv_coord_t p2x,
    326                                    lv_coord_t p2y, lv_draw_mask_line_side_t side);
    327 
    328 /**
    329  *Initialize a line mask from a point and an angle.
    330  * @param param pointer to a `lv_draw_mask_param_t` to initialize
    331  * @param px X coordinate of a point of the line
    332  * @param py X coordinate of a point of the line
    333  * @param angle right 0 deg, bottom: 90
    334  * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep.
    335  * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept
    336  * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept
    337  */
    338 void lv_draw_mask_line_angle_init(lv_draw_mask_line_param_t * param, lv_coord_t p1x, lv_coord_t py, int16_t angle,
    339                                   lv_draw_mask_line_side_t side);
    340 
    341 /**
    342  * Initialize an angle mask.
    343  * @param param pointer to a `lv_draw_mask_param_t` to initialize
    344  * @param vertex_x X coordinate of the angle vertex (absolute coordinates)
    345  * @param vertex_y Y coordinate of the angle vertex (absolute coordinates)
    346  * @param start_angle start angle in degrees. 0 deg on the right, 90 deg, on the bottom
    347  * @param end_angle end angle
    348  */
    349 void lv_draw_mask_angle_init(lv_draw_mask_angle_param_t * param, lv_coord_t vertex_x, lv_coord_t vertex_y,
    350                              lv_coord_t start_angle, lv_coord_t end_angle);
    351 
    352 /**
    353  * Initialize a fade mask.
    354  * @param param pointer to an `lv_draw_mask_radius_param_t` to initialize
    355  * @param rect coordinates of the rectangle to affect (absolute coordinates)
    356  * @param radius radius of the rectangle
    357  * @param inv true: keep the pixels inside the rectangle; keep the pixels outside of the rectangle
    358  */
    359 void lv_draw_mask_radius_init(lv_draw_mask_radius_param_t * param, const lv_area_t * rect, lv_coord_t radius, bool inv);
    360 
    361 /**
    362  * Initialize a fade mask.
    363  * @param param pointer to a `lv_draw_mask_param_t` to initialize
    364  * @param coords coordinates of the area to affect (absolute coordinates)
    365  * @param opa_top opacity on the top
    366  * @param y_top at which coordinate start to change to opacity to `opa_bottom`
    367  * @param opa_bottom opacity at the bottom
    368  * @param y_bottom at which coordinate reach `opa_bottom`.
    369  */
    370 void lv_draw_mask_fade_init(lv_draw_mask_fade_param_t * param, const lv_area_t * coords, lv_opa_t opa_top,
    371                             lv_coord_t y_top,
    372                             lv_opa_t opa_bottom, lv_coord_t y_bottom);
    373 
    374 /**
    375  * Initialize a map mask.
    376  * @param param pointer to a `lv_draw_mask_param_t` to initialize
    377  * @param coords coordinates of the map (absolute coordinates)
    378  * @param map array of bytes with the mask values
    379  */
    380 void lv_draw_mask_map_init(lv_draw_mask_map_param_t * param, const lv_area_t * coords, const lv_opa_t * map);
    381 
    382 void lv_draw_mask_polygon_init(lv_draw_mask_polygon_param_t * param, const lv_point_t * points, uint16_t point_cnt);
    383 
    384 #endif /*LV_DRAW_COMPLEX*/
    385 
    386 /**********************
    387  *      MACROS
    388  **********************/
    389 
    390 #ifdef __cplusplus
    391 } /*extern "C"*/
    392 #endif
    393 
    394 #endif /*LV_DRAW_MASK_H*/