165 lines
3.5 KiB
C
165 lines
3.5 KiB
C
#ifndef __MASK_H__
|
|
#define __MASK_H__
|
|
|
|
#include "generic/typedef.h"
|
|
#include "ui_draw/ui_type.h"
|
|
#include "ui_draw/ui_math.h"
|
|
|
|
typedef u8(*mask_cb)(u8 *mask_buf, int abs_x, int abs_y, int len, void *p);
|
|
|
|
typedef struct {
|
|
void *param;
|
|
void *custom_id;
|
|
} mask_info;
|
|
|
|
#define MASK_ID_INV (-1)
|
|
#define MASK_MAX_NUM 16
|
|
typedef mask_info mask_info_list[MASK_MAX_NUM];
|
|
|
|
enum {
|
|
MASK_TYPE_LINE, //直线
|
|
MASK_TYPE_ANGLE, //圆形扇区
|
|
MASK_TYPE_RADIUS, //圆角矩形相关
|
|
MASK_TYPE_FADE, //垂直渐变
|
|
MASK_TYPE_MAP, //混合
|
|
};
|
|
|
|
enum {
|
|
MASK_LINE_SIDE_LEFT = 0,
|
|
MASK_LINE_SIDE_RIGHT,
|
|
MASK_LINE_SIDE_TOP,
|
|
MASK_LINE_SIDE_BOTTOM,
|
|
};
|
|
|
|
enum {
|
|
MASK_RES_TRANSP, //全透明,mask_buf没有清0
|
|
MASK_RES_FULL_COVER, //可见,mask_buf不变
|
|
MASK_RES_CHANGED, //每个mask_buf都不一致
|
|
MASK_RES_UNKNOWN //未定义
|
|
};
|
|
|
|
typedef struct {
|
|
mask_cb cb;
|
|
u8 type;
|
|
} mask_common_dsc_t;
|
|
|
|
typedef struct {
|
|
mask_common_dsc_t dsc;
|
|
struct {
|
|
struct draw_area rect;
|
|
int radius;
|
|
u8 outer: 1;
|
|
} cfg;
|
|
int y_prev;
|
|
sqrt_res_t y_prev_x;
|
|
} mask_radius_param_t;
|
|
|
|
typedef struct {
|
|
mask_common_dsc_t dsc;
|
|
struct {
|
|
struct draw_point p1;
|
|
struct draw_point p2;
|
|
u8 side : 2;
|
|
} cfg;
|
|
struct draw_point origo;
|
|
int xy_steep;
|
|
int yx_steep;
|
|
int steep;
|
|
int spx;
|
|
u8 flat : 1;
|
|
u8 inv: 1;
|
|
} mask_line_param_t;
|
|
|
|
typedef struct {
|
|
mask_common_dsc_t dsc;
|
|
struct {
|
|
struct draw_point vertex_p;
|
|
int start_angle;
|
|
int end_angle;
|
|
} cfg;
|
|
mask_line_param_t start_line;
|
|
mask_line_param_t end_line;
|
|
u16 delta_deg;
|
|
} mask_angle_param_t;
|
|
|
|
|
|
void mask_angle_init(mask_angle_param_t *param, int vertex_x, int vertex_y, int start_angle, int end_angle);
|
|
void mask_radius_init(mask_radius_param_t *param, const struct draw_area *rect, int radius, bool inv);
|
|
void mask_line_points_init(mask_line_param_t *param, int p1x, int p1y, int p2x, int p2y, u8 side);
|
|
void mask_line_angle_init(mask_line_param_t *param, int p1x, int py, int angle, u8 side);
|
|
|
|
int mask_add(void *param, void *custom_id);
|
|
u8 mask_get_cnt(void);
|
|
void *mask_remove_id(int id);
|
|
u8 mask_apply(u8 *mask_buf, int abs_x, int abs_y, int len);
|
|
|
|
#define OPA_MIN 2
|
|
#define OPA_MAX 253
|
|
#define MATH_UDIV255(x) ((u32)((u32) (x) * 0x8081) >> 0x17)
|
|
AT_UI_RAM
|
|
static inline u8 mask_mix(u8 mask_act, u8 mask_new)
|
|
{
|
|
if (mask_new >= OPA_MAX) {
|
|
return mask_act;
|
|
}
|
|
if (mask_new <= OPA_MIN) {
|
|
return 0;
|
|
}
|
|
|
|
#if 1
|
|
return (((u32)mask_act * (u32)mask_new) >> 8);
|
|
#else
|
|
return MATH_UDIV255(mask_act * mask_new);// >> 8);
|
|
#endif
|
|
}
|
|
|
|
AT_UI_RAM
|
|
static inline void *memcpy_small(void *dst, const void *src, u32 len)
|
|
{
|
|
|
|
#if 1
|
|
memcpy(dst, src, len);
|
|
return dst;
|
|
#else
|
|
u8 *d8 = (u8 *)dst;
|
|
const u8 *s8 = (const u8 *)src;
|
|
|
|
while (len) {
|
|
*d8 = *s8;
|
|
d8++;
|
|
s8++;
|
|
len--;
|
|
}
|
|
|
|
return dst;
|
|
#endif
|
|
|
|
}
|
|
|
|
AT_UI_RAM
|
|
inline static void draw_area_copy(struct draw_area *dest, const struct draw_area *src)
|
|
{
|
|
memcpy_small(dest, src, sizeof(struct draw_area));
|
|
}
|
|
|
|
AT_UI_RAM
|
|
static inline int draw_area_get_width(const struct draw_area *area_p)
|
|
{
|
|
return (int)(area_p->x2 - area_p->x1 + 1);
|
|
}
|
|
|
|
AT_UI_RAM
|
|
static inline int draw_area_get_height(const struct draw_area *area_p)
|
|
{
|
|
return (int)(area_p->y2 - area_p->y1 + 1);
|
|
}
|
|
|
|
AT_UI_RAM
|
|
static inline int draw_area_get_size(const struct draw_area *area_p)
|
|
{
|
|
return (int)(area_p->x2 - area_p->x1 + 1) * (area_p->y2 - area_p->y1 + 1);
|
|
}
|
|
|
|
#endif
|
|
|