mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-21 06:53:01 +08:00
img run-time rotate functionally working
This commit is contained in:
parent
fab8288372
commit
2b955ac8b6
@ -757,15 +757,25 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas
|
|||||||
static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, const uint8_t * map_p, lv_opa_t opa,
|
static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, const uint8_t * map_p, lv_opa_t opa,
|
||||||
bool chroma_key, bool alpha_byte, const lv_style_t * style)
|
bool chroma_key, bool alpha_byte, const lv_style_t * style)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
uint16_t angle = 30;
|
||||||
if(opa < LV_OPA_MIN) return;
|
if(opa < LV_OPA_MIN) return;
|
||||||
if(opa > LV_OPA_MAX) opa = LV_OPA_COVER;
|
if(opa > LV_OPA_MAX) opa = LV_OPA_COVER;
|
||||||
|
|
||||||
lv_area_t draw_area;
|
lv_area_t draw_area;
|
||||||
bool union_ok;
|
bool union_ok;
|
||||||
|
|
||||||
|
lv_area_t map_area_rot;
|
||||||
|
lv_area_copy(&map_area_rot, map_area);
|
||||||
|
if(angle) {
|
||||||
|
map_area_rot.x1 -= 50;
|
||||||
|
map_area_rot.y1 -= 50;
|
||||||
|
map_area_rot.x2 += 50;
|
||||||
|
map_area_rot.y2 += 50;
|
||||||
|
}
|
||||||
/* Get clipped map area which is the real draw area.
|
/* Get clipped map area which is the real draw area.
|
||||||
* It is always the same or inside `map_area` */
|
* It is always the same or inside `map_area` */
|
||||||
union_ok = lv_area_intersect(&draw_area, map_area, clip_area);
|
union_ok = lv_area_intersect(&draw_area, &map_area_rot, clip_area);
|
||||||
|
|
||||||
/*If there are common part of the three area then draw to the vdb*/
|
/*If there are common part of the three area then draw to the vdb*/
|
||||||
if(union_ok == false) return;
|
if(union_ok == false) return;
|
||||||
@ -784,7 +794,7 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area,
|
|||||||
uint8_t other_mask_cnt = lv_draw_mask_get_cnt();
|
uint8_t other_mask_cnt = lv_draw_mask_get_cnt();
|
||||||
|
|
||||||
/*The simplest case just copy the pixels into the VDB*/
|
/*The simplest case just copy the pixels into the VDB*/
|
||||||
if(0 && other_mask_cnt == 0 && chroma_key == false && alpha_byte == false && opa == LV_OPA_COVER && style->image.intense == LV_OPA_TRANSP) {
|
if(angle == 0 && other_mask_cnt == 0 && chroma_key == false && alpha_byte == false && opa == LV_OPA_COVER && style->image.intense == LV_OPA_TRANSP) {
|
||||||
lv_blend_map(clip_area, map_area, (lv_color_t *)map_p, NULL, LV_DRAW_MASK_RES_FULL_COVER, LV_OPA_COVER, style->image.blend_mode);
|
lv_blend_map(clip_area, map_area, (lv_color_t *)map_p, NULL, LV_DRAW_MASK_RES_FULL_COVER, LV_OPA_COVER, style->image.blend_mode);
|
||||||
}
|
}
|
||||||
/*In the other cases every pixel need to be checked one-by-one*/
|
/*In the other cases every pixel need to be checked one-by-one*/
|
||||||
@ -799,6 +809,7 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area,
|
|||||||
|
|
||||||
/*Go to the first displayed pixel of the map*/
|
/*Go to the first displayed pixel of the map*/
|
||||||
lv_coord_t map_w = lv_area_get_width(map_area);
|
lv_coord_t map_w = lv_area_get_width(map_area);
|
||||||
|
lv_coord_t map_h = lv_area_get_height(map_area);
|
||||||
const uint8_t * map_buf_tmp = map_p;
|
const uint8_t * map_buf_tmp = map_p;
|
||||||
map_buf_tmp += map_w * (draw_area.y1 - (map_area->y1 - disp_area->y1)) * px_size_byte;
|
map_buf_tmp += map_w * (draw_area.y1 - (map_area->y1 - disp_area->y1)) * px_size_byte;
|
||||||
map_buf_tmp += (draw_area.x1 - (map_area->x1 - disp_area->x1)) * px_size_byte;
|
map_buf_tmp += (draw_area.x1 - (map_area->x1 - disp_area->x1)) * px_size_byte;
|
||||||
@ -821,7 +832,9 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area,
|
|||||||
memset(mask_buf, 0xFF, mask_buf_size);
|
memset(mask_buf, 0xFF, mask_buf_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t angle = 30;
|
|
||||||
|
lv_img_rotate_dsc_t rotate_dsc;
|
||||||
|
lv_img_rotate_init(&rotate_dsc, angle, map_p, map_w, map_h, LV_IMG_CF_TRUE_COLOR, map_w/2, map_h / 2, LV_COLOR_BLACK);
|
||||||
|
|
||||||
lv_draw_mask_res_t mask_res;
|
lv_draw_mask_res_t mask_res;
|
||||||
mask_res = (alpha_byte || chroma_key || angle) ? LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER;
|
mask_res = (alpha_byte || chroma_key || angle) ? LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER;
|
||||||
@ -848,19 +861,17 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area,
|
|||||||
c.full = *((uint32_t*)map_px);
|
c.full = *((uint32_t*)map_px);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// lv_img_dsc_t img;
|
bool ret;
|
||||||
// img.data = map_p;
|
lv_coord_t rot_x = x + (disp_area->x1 + draw_area.x1) - map_area->x1;
|
||||||
// img.header.w = lv_area_get_width(map_area);
|
lv_coord_t rot_y = y + (disp_area->y1 + draw_area.y1) - map_area->y1;
|
||||||
// img.header.h = lv_area_get_height(map_area);
|
ret = lv_img_get_px_rotated(&rotate_dsc, rot_x, rot_y);
|
||||||
// img.header.cf = LV_IMG_CF_TRUE_COLOR;
|
if(ret == false) {
|
||||||
// lv_point_t p = {x + disp_area->x1 - map_area->x1 ,y + disp_area->y1 - map_area->y1};
|
mask_buf[px_i] = LV_OPA_TRANSP;
|
||||||
// lv_point_t piv = {img.header.w / 2 ,img.header.h / 2};
|
continue;
|
||||||
// bool ret;
|
} else {
|
||||||
// ret = lv_img_get_px_rotated(&img, angle, LV_COLOR_BLACK, &p, &piv, &c, NULL);
|
// mask_buf[px_i] = rotate_dsc.res_opa;
|
||||||
// if(ret == false) {
|
c.full = rotate_dsc.res_color.full;
|
||||||
// mask_buf[px_i] = LV_OPA_TRANSP;
|
}
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (chroma_key) {
|
if (chroma_key) {
|
||||||
if(c.full == chroma_keyed_color.full) {
|
if(c.full == chroma_keyed_color.full) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user