integrate ddlist, roller + add LV_STYLE_PATTERN
This commit is contained in:
@@ -32,6 +32,7 @@ static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, lv_dra
|
||||
static lv_color_t grad_get(lv_draw_rect_dsc_t * dsc, lv_coord_t s, lv_coord_t i);
|
||||
static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, lv_coord_t s, lv_coord_t r);
|
||||
static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_buf, uint16_t * sh_ups_buf);
|
||||
static void draw_img(const lv_area_t * coords, const lv_area_t * clip, lv_draw_rect_dsc_t * dsc);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
@@ -51,6 +52,8 @@ void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc)
|
||||
dsc->bg_opa = LV_OPA_COVER;
|
||||
dsc->bg_grad_color_stop = 0xFF;
|
||||
dsc->border_opa = LV_OPA_COVER;
|
||||
dsc->overlay_opa = LV_OPA_TRANSP;
|
||||
dsc->pattern_font = LV_FONT_DEFAULT;
|
||||
|
||||
}
|
||||
|
||||
@@ -66,6 +69,7 @@ void lv_draw_rect(const lv_area_t * coords, const lv_area_t * clip, lv_draw_rect
|
||||
|
||||
draw_shadow(coords, clip, dsc);
|
||||
draw_bg(coords, clip, dsc);
|
||||
draw_img(coords, clip, dsc);
|
||||
draw_border(coords, clip, dsc);
|
||||
}
|
||||
|
||||
@@ -912,12 +916,6 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf,
|
||||
}
|
||||
lv_mem_buf_release(mask_line);
|
||||
|
||||
// uint32_t k;
|
||||
// for(k = 0; k < size * size; k++) {
|
||||
// sh_buf[k] = (sh_ups_buf[k] * sw) >> SHADOW_UPSACALE_SHIFT ;
|
||||
// }
|
||||
// return;
|
||||
|
||||
if(sw == 1) {
|
||||
lv_coord_t i;
|
||||
for(i = 0; i < size * size; i++) {
|
||||
@@ -981,8 +979,8 @@ static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_bu
|
||||
if(x - s_left - 1 < 0) left_val = sh_ups_tmp_buf[0];
|
||||
else left_val = sh_ups_tmp_buf[x - s_left - 1];
|
||||
v += left_val;
|
||||
|
||||
}
|
||||
|
||||
sh_ups_tmp_buf += size;
|
||||
sh_ups_hor_buf_tmp += size;
|
||||
}
|
||||
@@ -1021,3 +1019,89 @@ static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_bu
|
||||
lv_mem_buf_release(sh_ups_hor_buf);
|
||||
}
|
||||
|
||||
static void draw_img(const lv_area_t * coords, const lv_area_t * clip, lv_draw_rect_dsc_t * dsc)
|
||||
{
|
||||
if(dsc->pattern_src == NULL) return;
|
||||
if(dsc->pattern_opa <= LV_OPA_MIN) return;
|
||||
|
||||
lv_img_src_t src_type = lv_img_src_get_type(dsc->pattern_src);
|
||||
|
||||
lv_draw_img_dsc_t img_dsc;
|
||||
lv_draw_label_dsc_t label_dsc;
|
||||
lv_coord_t img_w;
|
||||
lv_coord_t img_h;
|
||||
|
||||
if(src_type == LV_IMG_SRC_FILE || src_type == LV_IMG_SRC_VARIABLE) {
|
||||
lv_img_header_t header;
|
||||
lv_res_t res = lv_img_decoder_get_info(dsc->pattern_src, &header);
|
||||
if(res!= LV_RES_OK) {
|
||||
LV_LOG_WARN("draw_img: can't get image info");
|
||||
return;
|
||||
}
|
||||
|
||||
img_w = header.w;
|
||||
img_h = header.h;
|
||||
|
||||
lv_draw_img_dsc_init(&img_dsc);
|
||||
img_dsc.opa = dsc->pattern_opa;
|
||||
img_dsc.recolor_opa = dsc->pattern_recolor_opa;
|
||||
img_dsc.recolor = dsc->pattern_recolor;
|
||||
} else if(src_type == LV_IMG_SRC_SYMBOL) {
|
||||
lv_draw_label_dsc_init(&label_dsc);
|
||||
label_dsc.color = dsc->pattern_recolor;
|
||||
label_dsc.font = dsc->pattern_font;
|
||||
lv_point_t s;
|
||||
lv_txt_get_size(&s, dsc->pattern_src, label_dsc.font, label_dsc.letter_space, label_dsc.line_space, LV_COORD_MAX, LV_TXT_FLAG_NONE);
|
||||
img_w = s.x;
|
||||
img_h = s.y;
|
||||
|
||||
} else {
|
||||
/*Trigger the error handler of image drawer*/
|
||||
LV_LOG_WARN("lv_img_design: image source type is unknown");
|
||||
lv_draw_img(coords, clip, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
lv_area_t coords_tmp;
|
||||
|
||||
if(dsc->pattern_repeate) {
|
||||
lv_draw_mask_radius_param_t radius_mask_param;
|
||||
lv_draw_mask_radius_init(&radius_mask_param, coords, dsc->radius, false);
|
||||
int16_t radius_mask_id = lv_draw_mask_add(&radius_mask_param, NULL);
|
||||
|
||||
/*Align the pattern to the middle*/
|
||||
lv_coord_t ofs_x = (lv_area_get_width(coords) - (lv_area_get_width(coords) / img_w) * img_w) / 2;
|
||||
lv_coord_t ofs_y = (lv_area_get_height(coords) - (lv_area_get_height(coords) / img_h) * img_h) / 2;
|
||||
|
||||
coords_tmp.y1 = coords->y1 - ofs_y;
|
||||
coords_tmp.y2 = coords_tmp.y1 + img_h - 1;
|
||||
for(; coords_tmp.y1 <= coords->y2; coords_tmp.y1 += img_h, coords_tmp.y2 += img_h) {
|
||||
coords_tmp.x1 = coords->x1 - ofs_x;
|
||||
coords_tmp.x2 = coords_tmp.x1 + img_w - 1;
|
||||
for(; coords_tmp.x1 <= coords->x2; coords_tmp.x1 += img_w, coords_tmp.x2 += img_w) {
|
||||
if(src_type == LV_IMG_SRC_SYMBOL) lv_draw_label(&coords_tmp, clip, &label_dsc, dsc->pattern_src, NULL);
|
||||
else lv_draw_img(&coords_tmp, clip, dsc->pattern_src, &img_dsc);
|
||||
}
|
||||
}
|
||||
lv_draw_mask_remove_id(radius_mask_id);
|
||||
} else {
|
||||
coords_tmp.x1 = coords->x1 + lv_area_get_width(coords) / 2 - img_w / 2;
|
||||
coords_tmp.y1 = coords->y1 + lv_area_get_height(coords) / 2 - img_h / 2;
|
||||
coords_tmp.x2 = coords_tmp.x1 + img_w - 1;
|
||||
coords_tmp.y2 = coords_tmp.y1 + img_h - 1;
|
||||
|
||||
int16_t radius_mask_id = LV_MASK_ID_INV;
|
||||
if(lv_area_is_in(&coords_tmp, coords, dsc->radius) == false) {
|
||||
lv_draw_mask_radius_param_t radius_mask_param;
|
||||
lv_draw_mask_radius_init(&radius_mask_param, coords, dsc->radius, false);
|
||||
radius_mask_id = lv_draw_mask_add(&radius_mask_param, NULL);
|
||||
}
|
||||
|
||||
if(src_type == LV_IMG_SRC_SYMBOL) lv_draw_label(&coords_tmp, clip, &label_dsc, dsc->pattern_src, NULL);
|
||||
else lv_draw_img(&coords_tmp, clip, dsc->pattern_src, &img_dsc);
|
||||
|
||||
lv_draw_mask_remove_id(radius_mask_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user