1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00
lvgl/src/lv_draw/lv_mask.h

132 lines
3.5 KiB
C
Raw Normal View History

2019-08-13 06:14:38 +02:00
/**
* @file lv_mask.h
*
*/
#ifndef LV_MASK_H
#define LV_MASK_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#include "../lv_misc/lv_area.h"
#include "../lv_misc/lv_color.h"
/*********************
* DEFINES
*********************/
2019-08-21 15:44:35 +02:00
#define LV_MASK_ID_INV (-1)
2019-08-13 06:14:38 +02:00
/**********************
* TYPEDEFS
**********************/
2019-08-21 15:44:35 +02:00
enum {
LV_MASK_RES_FULL_TRANSP,
2019-08-28 09:46:56 +02:00
LV_MASK_RES_FULL_COVER,
2019-08-21 15:44:35 +02:00
LV_MASK_RES_CHANGED,
2019-08-28 09:46:56 +02:00
LV_MASK_RES_UNKNOWN
2019-08-21 15:44:35 +02:00
};
typedef uint8_t lv_mask_res_t;
enum {
LV_LINE_MASK_SIDE_LEFT = 0,
LV_LINE_MASK_SIDE_RIGHT,
LV_LINE_MASK_SIDE_TOP,
LV_LINE_MASK_SIDE_BOTTOM,
};
typedef uint8_t lv_line_mask_side_t;
2019-08-13 06:14:38 +02:00
typedef struct {
lv_point_t origo;
/* X / (1024*Y) steepness (X is 0..1023 range). What is the change of X in 1024 Y?*/
2019-08-21 15:44:35 +02:00
int32_t xy_steep;
/* Y / (1024*X) steepness (Y is 0..1023 range). What is the change of Y in 1024 X?*/
2019-08-21 15:44:35 +02:00
int32_t yx_steep;
/*Helper which stores yx_steep for flat lines and xy_steep for steep (non flat) lines */
2019-08-21 15:44:35 +02:00
int32_t steep;
/*Steepness in 1 px in 0..255 range. Used only by flat lines. */
int32_t spx;
/*1: It's a flat line? (Neare to horizontal)*/
2019-08-13 06:14:38 +02:00
uint8_t flat :1;
/*Which side to keep?*/
lv_line_mask_side_t side :2;
/* Invert the mask. The default is: Keep the left part.
* It is used to select left/right/top/bottom*/
uint8_t inv:1;
2019-08-13 06:14:38 +02:00
}lv_mask_line_param_t;
2019-08-16 07:54:32 +02:00
typedef struct {
lv_point_t origo;
lv_coord_t start_angle;
lv_coord_t end_angle;
lv_mask_line_param_t start_line;
lv_mask_line_param_t end_line;
uint16_t delta_deg;
}lv_mask_angle_param_t;
typedef struct {
lv_area_t rect;
lv_coord_t radius;
2019-08-14 22:09:56 +02:00
/* Invert the mask. The default is: Keep the are inside.*/
uint8_t inv:1;
}lv_mask_radius_param_t;
2019-08-21 15:44:35 +02:00
typedef union {
lv_mask_line_param_t line;
lv_mask_radius_param_t radius;
lv_mask_angle_param_t angle;
}lv_mask_param_t;
typedef lv_mask_res_t (*lv_mask_cb_t)(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_mask_param_t * p);
2019-08-13 06:14:38 +02:00
/**********************
* GLOBAL PROTOTYPES
**********************/
2019-08-21 15:44:35 +02:00
int16_t lv_mask_add(lv_mask_cb_t mask_cb, lv_mask_param_t * param, void * custom_id);
void lv_mask_remove_id(int16_t id);
void lv_mask_remove_custom(void * custom_id);
2019-08-22 15:23:53 +02:00
uint8_t lv_mask_get_cnt(void);
2019-08-21 15:44:35 +02:00
lv_mask_res_t lv_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len);
void lv_mask_line_points_init(lv_mask_param_t * param, lv_coord_t p1x, lv_coord_t p1y, lv_coord_t p2x, lv_coord_t p2y, lv_line_mask_side_t side);
void lv_mask_line_angle_init(lv_mask_param_t * param, lv_coord_t p1x, lv_coord_t p1y, int16_t deg, lv_line_mask_side_t side);
lv_mask_res_t lv_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_mask_param_t * param);
2019-08-23 10:53:38 +02:00
void lv_mask_radius_init(lv_mask_param_t * param, const lv_area_t * rect, lv_coord_t radius, bool inv);
2019-08-21 15:44:35 +02:00
lv_mask_res_t lv_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_mask_param_t * param);
2019-08-13 06:14:38 +02:00
2019-08-21 15:44:35 +02:00
void lv_mask_angle_init(lv_mask_param_t * param, lv_coord_t origio_x, lv_coord_t origo_y, lv_coord_t start_angle, lv_coord_t end_angle);
lv_mask_res_t lv_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_mask_param_t * param);
2019-08-16 07:54:32 +02:00
2019-08-13 06:14:38 +02:00
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*LV_MASK_H*/