freertos: weekly rls 2024.05.22

- 3ca91b, [fix](rgn):Fixed line drawing issue.

Change-Id: I0e00da67a852e009e49abdf6f8be987654af101b
This commit is contained in:
sophgo-forum-service
2024-05-27 17:16:25 +08:00
committed by carbon
parent 44c84f6ce0
commit 82a1227ce2

View File

@ -142,59 +142,104 @@ int obj_project_on_line(DRAW_OBJ *obj_vec, uint32_t obj_num, dlist_t *slc_list_h
(y > y1) ? obj_attr.rect.y + obj_attr.rect.height : y1); (y > y1) ? obj_attr.rect.y + obj_attr.rect.height : y1);
} }
} else if (obj_attr.type == LINE) { } else if (obj_attr.type == LINE) {
float pt_x0, pt_x1; float pt_x0, pt_x1, width;
if (is_in_range(y, (int)round(obj_attr.line._by[0]), if (obj_attr.line._ey[0] > obj_attr.line._by[1]) {
(int)round(obj_attr.line._by[1]))) { if (is_in_range(y, 0, (int)round(obj_attr.line._by[1]))) {
float delta_x0 = obj_attr.line._mx * (y - obj_attr.line._by[0]); float delta_x0 = obj_attr.line._mx * (y + 0.5 - obj_attr.line._by[0]);
pt_x0 = obj_attr.line._bx[0] + delta_x0; pt_x0 = obj_attr.line._bx[0] + delta_x0;
if (obj_attr.line._bx[0] > obj_attr.line._ex[0])
pt_x0 = clip((int)pt_x0, (int)(obj_attr.line._bx[1] + obj_attr.line.ts_h), (int)obj_attr.line._bx[0]);
else
pt_x0 = clip((int)pt_x0, (int)obj_attr.line._bx[0], (int)(obj_attr.line._bx[1] + obj_attr.line.ts_h));
float width = (y - obj_attr.line._by[0]) *
(obj_attr.line.ts_h / (obj_attr.line._by[1] -
obj_attr.line._by[0]));
pt_x1 = pt_x0 - width; width = (y + 0.5 - obj_attr.line._by[0]) *
if (obj_attr.line._bx[0] > obj_attr.line._ex[0]) (obj_attr.line.ts_h / (obj_attr.line._by[1] -
pt_x1 = clip((int)pt_x1, (int)obj_attr.line._bx[0], (int)obj_attr.line._bx[1]); obj_attr.line._by[0]));
else
pt_x1 = clip((int)pt_x1, (int)obj_attr.line._bx[1], (int)obj_attr.line._bx[0]);
} else if (is_in_range(y, (int)round(obj_attr.line._by[1]),
(int)round(obj_attr.line._ey[0]))) {
float delta_x0 = obj_attr.line._mx * (y - obj_attr.line._by[0]);
pt_x0 = obj_attr.line._bx[0] + delta_x0; if (obj_attr.line._mx > 0) {
if (obj_attr.line._bx[0] > obj_attr.line._ex[0]) pt_x1 = pt_x0 - width;
pt_x0 = clip((int)pt_x0, (int)obj_attr.line._ex[0], (int)(obj_attr.line._bx[1] + obj_attr.line._mx)); } else {
else pt_x1 = pt_x0 + width;
pt_x0 = clip((int)pt_x0, (int)(obj_attr.line._bx[1] + obj_attr.line._mx), (int)obj_attr.line._ex[0]); }
pt_x1 = pt_x0 - obj_attr.line.ts_h;
if (obj_attr.line._bx[0] > obj_attr.line._ex[0])
pt_x1 = clip((int)pt_x1, (int)(obj_attr.line._ex[0] - obj_attr.line._mx), (int)obj_attr.line._bx[1]);
else
pt_x1 = clip((int)pt_x1, (int)obj_attr.line._bx[1], (int)(obj_attr.line._ex[0] - obj_attr.line._mx));
} else {
float delta_x0 = obj_attr.line._mx * (y - obj_attr.line._by[1]);
pt_x0 = obj_attr.line._bx[1] + delta_x0; } else if (is_in_range(y, (int)round(obj_attr.line._by[1]),
if (obj_attr.line._bx[0] > obj_attr.line._ex[0]) (int)round(obj_attr.line._ey[0]))) {
pt_x0 = clip((int)pt_x0, (int)obj_attr.line._ex[1], (int)(obj_attr.line._ex[0] - obj_attr.line.ts_h)); float delta_x0 = obj_attr.line._mx * (y + 0.5 - obj_attr.line._by[0]);
else
pt_x0 = clip((int)pt_x0, (int)(obj_attr.line._ex[0] - obj_attr.line.ts_h), (int)obj_attr.line._ex[1]); pt_x0 = obj_attr.line._bx[0] + delta_x0;
float width = (obj_attr.line._ey[1] - y) *
if (obj_attr.line._mx > 0) {
pt_x1 = pt_x0 - obj_attr.line.ts_h;
} else {
pt_x1 = pt_x0 + obj_attr.line.ts_h;
}
} else {
float delta_x0 = (y + 0.5 - obj_attr.line._ey[0]) / obj_attr.line._mx;
pt_x0 = obj_attr.line._ex[0] - delta_x0;
float width = (obj_attr.line._ey[1] - (y + 0.5)) *
(obj_attr.line.ts_h / (obj_attr.line._ey[1] - obj_attr.line._ey[0])); (obj_attr.line.ts_h / (obj_attr.line._ey[1] - obj_attr.line._ey[0]));
if (obj_attr.line._mx > 0) {
pt_x1 = pt_x0 - width;
} else {
pt_x1 = pt_x0 + width;
}
}
} else {
if (is_in_range(y, 0, (int)round(obj_attr.line._ey[0]))) {
float delta_x0 = obj_attr.line._mx * (y + 0.5 - obj_attr.line._by[0]);
pt_x0 = obj_attr.line._bx[0] + delta_x0;
width = (y + 0.5 - obj_attr.line._by[0]) *
(obj_attr.line.ts_h / (obj_attr.line._by[1] -
obj_attr.line._by[0]));
if (obj_attr.line._mx > 0) {
pt_x1 = pt_x0 - width;
} else {
pt_x1 = pt_x0 + width;
}
} else if (is_in_range(y, (int)round(obj_attr.line._ey[0]),
(int)round(obj_attr.line._by[1]))) {
float delta_x0 = (y + 0.5 - obj_attr.line._ey[0]) / obj_attr.line._mx;
pt_x0 = obj_attr.line._ex[0] - delta_x0;
if (obj_attr.line._mx > 0) {
pt_x1 = pt_x0 - obj_attr.line.ts_h;
} else {
pt_x1 = pt_x0 + obj_attr.line.ts_h;
}
} else {
float delta_x0 = obj_attr.line._mx * (y + 0.5 - obj_attr.line._by[1]);
pt_x0 = obj_attr.line._bx[1] + delta_x0;
float width = (obj_attr.line._ey[1] - (y + 0.5)) *
(obj_attr.line.ts_h / (obj_attr.line._ey[1] - obj_attr.line._by[1]));
if (obj_attr.line._mx > 0) {
pt_x1 = pt_x0 + width;
} else {
pt_x1 = pt_x0 - width;
}
}
pt_x1 = pt_x0 + width;
if (obj_attr.line._bx[0] > obj_attr.line._ex[0])
pt_x1 = clip((int)pt_x1, (int)obj_attr.line._ex[0], (int)obj_attr.line._ex[1]);
else
pt_x1 = clip((int)pt_x1, (int)obj_attr.line._ex[1], (int)obj_attr.line._ex[0]);
} }
slc->slice.x0 = clip((int)round(MIN(pt_x0, pt_x1)), 0, canvas_width-1); slc->slice.x0 = clip((int)round(MIN(pt_x0, pt_x1)), 0, canvas_width-1);
slc->slice.x1 = clip((int)round(MAX(pt_x0, pt_x1)), 0, canvas_width-1); slc->slice.x1 = clip((int)round(MAX(pt_x0, pt_x1)), 0, canvas_width-1);
if (obj_attr.line._mx > 0) {
slc->slice.x0 = clip(slc->slice.x0, obj_attr.line._bx[1], obj_attr.line._ex[0]);
slc->slice.x1 = clip(slc->slice.x1, obj_attr.line._bx[1], obj_attr.line._ex[0]);
} else {
slc->slice.x0 = clip(slc->slice.x0, obj_attr.line._ex[0], obj_attr.line._bx[1]);
slc->slice.x1 = clip(slc->slice.x1, obj_attr.line._ex[0], obj_attr.line._bx[1]);
}
if (slc->slice.x0 == slc->slice.x1) {
slc->slice.x1 = slc->slice.x0 + 1;
}
slc->slice.obj_id = obj_i; slc->slice.obj_id = obj_i;
dlist_add_tail(&slc->item, slc_list_head); dlist_add_tail(&slc->item, slc_list_head);
*slc_num = *slc_num + 1; *slc_num = *slc_num + 1;
@ -820,31 +865,43 @@ void set_line_obj_attr(DRAW_OBJ *obj_attr, Canvas_Attr *canvas,
float thick_offset_y = thick_offset * dy; float thick_offset_y = thick_offset * dy;
for (int side_i = 0; side_i < 2; side_i++) { for (int side_i = 0; side_i < 2; side_i++) {
obj_attr->line._bx[side_i] = obj_attr->line._bx[side_i] = (float)(x[0] + ((dx >= 0) ? thick_offset_y : (-thick_offset_y)));
clip(x[0] + ((dx >= 0) ? thick_offset_y : (-thick_offset_y)),
(float)0., (float)canvas->width); obj_attr->line._by[side_i] = (float)(y[0] + ((dx >= 0) ? (-thick_offset_x) : thick_offset_x));
obj_attr->line._by[side_i] =
clip(y[0] + ((dx >= 0) ? (-thick_offset_x) : thick_offset_x), obj_attr->line._ex[side_i] = (float)(x[1] + ((dx >= 0) ? thick_offset_y : (-thick_offset_y)));
(float)0., (float)canvas->height);
obj_attr->line._ex[side_i] = obj_attr->line._ey[side_i] = (float)(y[1] + ((dx >= 0) ? (-thick_offset_x) : thick_offset_x));
clip(x[1] + ((dx >= 0) ? thick_offset_y : (-thick_offset_y)),
(float)0., (float)canvas->width);
obj_attr->line._ey[side_i] =
clip(y[1] + ((dx >= 0) ? (-thick_offset_x) : thick_offset_x),
(float)0., (float)canvas->height);
thick_offset_x = -thick_offset_x; thick_offset_x = -thick_offset_x;
thick_offset_y = -thick_offset_y; thick_offset_y = -thick_offset_y;
} }
obj_attr->line.ts_h =
(obj_attr->line._bx[0] + if (dx > 0) {
obj_attr->line._mx * (obj_attr->line._by[1] - obj_attr->line._by[0])) - if (obj_attr->line._ey[0] > obj_attr->line._by[1]) {
obj_attr->line._bx[1]; obj_attr->line.ts_h =
if (obj_attr->line.ts_h > 0) (obj_attr->line._bx[0] +
obj_attr->line.ts_h = clip((int)obj_attr->line.ts_h, 0 obj_attr->line._mx * (obj_attr->line._by[1] - obj_attr->line._by[0])) -
, (int)(obj_attr->line._ex[0] - obj_attr->line._bx[0])); obj_attr->line._bx[1];
else } else {
obj_attr->line.ts_h = clip((int)obj_attr->line.ts_h obj_attr->line.ts_h =
, (int)(obj_attr->line._ex[0] - obj_attr->line._bx[0]), 0); obj_attr->line._ex[0] - (obj_attr->line._bx[0] -
(obj_attr->line._ey[0] - obj_attr->line._by[0]) / obj_attr->line._mx);
}
} else {
if (obj_attr->line._ey[0] > obj_attr->line._by[1]) {
obj_attr->line.ts_h =
obj_attr->line._bx[1] -
(obj_attr->line._mx * (obj_attr->line._by[1] - obj_attr->line._by[0]) +
obj_attr->line._bx[0]);
} else {
obj_attr->line.ts_h =
obj_attr->line._bx[0] - ((obj_attr->line._ey[0] -
obj_attr->line._by[0]) / obj_attr->line._mx) - obj_attr->line._ex[0];
}
}
obj_attr->_min_y = obj_attr->_min_y =
(int)round(MIN(obj_attr->line._by[0], obj_attr->line._by[1])); (int)round(MIN(obj_attr->line._by[0], obj_attr->line._by[1]));