Skip to content

Commit

Permalink
fix(dave2d): fix various smaller issues (#5043)
Browse files Browse the repository at this point in the history
Co-authored-by: Jeremy Baker <jeremy.baker@renesas.com>

See lvgl/lv_port_renesas_ek-ra8d1_gcc#3
  • Loading branch information
kisvegabor authored Dec 18, 2023
1 parent 1f86e1e commit 9b67c5b
Show file tree
Hide file tree
Showing 6 changed files with 286 additions and 142 deletions.
16 changes: 8 additions & 8 deletions src/draw/renesas/dave2d/lv_draw_dave2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,15 +267,15 @@ static int32_t _dave2d_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t)

case LV_DRAW_TASK_TYPE_IMAGE: {
#if USE_D2
lv_draw_image_dsc_t * draw_dsc = t->draw_dsc;
if(draw_dsc->header.cf != LV_COLOR_FORMAT_RGB565A8) {
t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D;
t->preference_score = 0;
}
lv_draw_image_dsc_t * draw_dsc = t->draw_dsc;
if(draw_dsc->header.cf != LV_COLOR_FORMAT_RGB565A8) {
t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D;
t->preference_score = 0;
}
#endif
ret = 0;
break;
}
ret = 0;
break;
}

case LV_DRAW_TASK_TYPE_BORDER: {
#if USE_D2
Expand Down
106 changes: 76 additions & 30 deletions src/draw/renesas/dave2d/lv_draw_dave2d_arc.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,41 +95,87 @@ void lv_draw_dave2d_arc(lv_draw_dave2d_unit_t * u, const lv_draw_arc_dsc_t * dsc
sin_end = lv_trigo_sin((int16_t)dsc->end_angle);
cos_end = lv_trigo_cos((int16_t)dsc->end_angle);

result = d2_renderwedge(u->d2_handle,
(d2_point)D2_FIX4(arc_centre.x),
(d2_point) D2_FIX4(arc_centre.y),
(d2_width) D2_FIX4(dsc->radius - dsc->width / 2),
(d2_width) D2_FIX4(dsc->width),
-(d2_s32)(sin_start << 1),
(d2_s32)(cos_start << 1),
(d2_s32)(sin_end << 1),
-(d2_s32)(cos_end << 1),
flags);
if(D2_OK != result) {
__BKPT(0);
}
bool draw_arc;
lv_area_t arc_area;
lv_area_t clip_arc;
lv_point_t start_point;
lv_point_t end_point;

start_point.x = arc_centre.x + (int16_t)(((dsc->radius) * cos_start) >> LV_TRIGO_SHIFT);
start_point.y = arc_centre.y + (int16_t)(((dsc->radius) * sin_start) >> LV_TRIGO_SHIFT);

if(dsc->rounded) {
lv_point_t start_coord;
lv_point_t end_coord;
end_point.x = arc_centre.x + (int16_t)(((dsc->radius) * cos_end) >> LV_TRIGO_SHIFT);
end_point.y = arc_centre.y + (int16_t)(((dsc->radius) * sin_end) >> LV_TRIGO_SHIFT);

start_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_start) >> LV_TRIGO_SHIFT);
start_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_start) >> LV_TRIGO_SHIFT);
arc_area.x1 = LV_MIN3(start_point.x, end_point.x, arc_centre.x);
arc_area.y1 = LV_MIN3(start_point.y, end_point.y, arc_centre.y);

/** Render a circle. */
d2_rendercircle(u->d2_handle,
(d2_point) D2_FIX4((uint16_t)(start_coord.x)),
(d2_point) D2_FIX4((uint16_t)(start_coord.y)),
(d2_width) D2_FIX4(dsc->width / 2), 0);
arc_area.x2 = LV_MAX3(start_point.x, end_point.x, arc_centre.x);
arc_area.y2 = LV_MAX3(start_point.y, end_point.y, arc_centre.y);

end_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_end) >> LV_TRIGO_SHIFT);
end_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_end) >> LV_TRIGO_SHIFT);
/* 0 degrees */
if((dsc->end_angle < dsc->start_angle) || ((dsc->start_angle < 360) && (dsc->end_angle > 360))) {
arc_area.x2 = arc_centre.x + dsc->radius;
}

/* 90 degrees */
if(((dsc->end_angle > 90) && (dsc->start_angle < 90)) || ((dsc->start_angle < 90) &&
(dsc->end_angle < dsc->start_angle))) {
arc_area.y2 = arc_centre.y + dsc->radius;
}

/* 180 degrees */
if(((dsc->end_angle > 180) && (dsc->start_angle < 180)) || ((dsc->start_angle < 180) &&
(dsc->end_angle < dsc->start_angle))) {
arc_area.x1 = arc_centre.x - dsc->radius;
}

/* 270 degrees */
if(((dsc->end_angle > 270) && (dsc->start_angle < 270)) || ((dsc->start_angle < 270) &&
(dsc->end_angle < dsc->start_angle))) {
arc_area.y1 = arc_centre.y - dsc->radius;
}

/** Render a circle. */
d2_rendercircle(u->d2_handle,
(d2_point) D2_FIX4((uint16_t)(end_coord.x)),
(d2_point) D2_FIX4((uint16_t)(end_coord.y)),
(d2_width) D2_FIX4(dsc->width / 2), 0);
draw_arc = _lv_area_intersect(&clip_arc, &arc_area, &clipped_area);

if(draw_arc) {

result = d2_renderwedge(u->d2_handle,
(d2_point)D2_FIX4(arc_centre.x),
(d2_point) D2_FIX4(arc_centre.y),
(d2_width) D2_FIX4(dsc->radius - dsc->width / 2),
(d2_width) D2_FIX4(dsc->width),
-(d2_s32)(sin_start << 1),
(d2_s32)(cos_start << 1),
(d2_s32)(sin_end << 1),
-(d2_s32)(cos_end << 1),
flags);
if(D2_OK != result) {
__BKPT(0);
}

if(dsc->rounded) {
lv_point_t start_coord;
lv_point_t end_coord;

start_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_start) >> LV_TRIGO_SHIFT);
start_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_start) >> LV_TRIGO_SHIFT);

/** Render a circle. */
d2_rendercircle(u->d2_handle,
(d2_point) D2_FIX4((uint16_t)(start_coord.x)),
(d2_point) D2_FIX4((uint16_t)(start_coord.y)),
(d2_width) D2_FIX4(dsc->width / 2), 0);

end_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_end) >> LV_TRIGO_SHIFT);
end_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_end) >> LV_TRIGO_SHIFT);

/** Render a circle. */
d2_rendercircle(u->d2_handle,
(d2_point) D2_FIX4((uint16_t)(end_coord.x)),
(d2_point) D2_FIX4((uint16_t)(end_coord.y)),
(d2_width) D2_FIX4(dsc->width / 2), 0);
}
}
}

Expand Down
149 changes: 100 additions & 49 deletions src/draw/renesas/dave2d/lv_draw_dave2d_border.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,6 @@ static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_
inner_area = *orig_inner_area;

if(!_lv_area_intersect(&draw_area, &outer_area, u->base_unit.clip_area)) return;
int32_t draw_area_w = lv_area_get_width(&draw_area);

#if LV_USE_OS
lv_result_t status;
Expand Down Expand Up @@ -296,35 +295,60 @@ static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_

if(blend_w > 0) {
if(left_side || top_side) {
result = d2_renderwedge(u->d2_handle,
(d2_point)D2_FIX4(core_area.x1),
(d2_point) D2_FIX4(core_area.y1),
(d2_width) D2_FIX4(rout),
(d2_width) D2_FIX4((rout - rin)),
(d2_s32) D2_FIX16(0), // 180 Degrees
(d2_s32) D2_FIX16((int16_t) -1),
(d2_s32) D2_FIX16((int16_t) -1),//( 270 Degrees
(d2_s32) D2_FIX16(0),
flags);
if(D2_OK != result) {
__BKPT(0);
lv_area_t arc_area;
lv_area_t clip_arc;

arc_area.x1 = core_area.x1 - rout;
arc_area.y1 = core_area.y1 - rout;
arc_area.x2 = core_area.x1;
arc_area.y2 = core_area.y1;

if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) {
d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2,
(d2_border)clip_arc.y2);
result = d2_renderwedge(u->d2_handle,
(d2_point)D2_FIX4(core_area.x1),
(d2_point) D2_FIX4(core_area.y1),
(d2_width) D2_FIX4(rout),
(d2_width) D2_FIX4((rout - rin)),
(d2_s32) D2_FIX16(0), // 180 Degrees
(d2_s32) D2_FIX16((int16_t) -1),
(d2_s32) D2_FIX16((int16_t) -1),//( 270 Degrees
(d2_s32) D2_FIX16(0),
flags);
if(D2_OK != result) {
__BKPT(0);
}
}

}

if(left_side || bottom_side) {
result = d2_renderwedge(u->d2_handle,
(d2_point)D2_FIX4(core_area.x1),
(d2_point) D2_FIX4(core_area.y2),
(d2_width) D2_FIX4(rout),
(d2_width) D2_FIX4((rout - rin)),
(d2_s32) D2_FIX16((int16_t) -1), //90 degrees
(d2_s32) D2_FIX16(0),
(d2_s32) D2_FIX16(0), //180 degrees
(d2_s32) D2_FIX16(1),
flags);
if(D2_OK != result) {
__BKPT(0);
lv_area_t arc_area;
lv_area_t clip_arc;

arc_area.x1 = core_area.x1 - rout;
arc_area.y1 = core_area.y2;
arc_area.x2 = core_area.x1;
arc_area.y2 = core_area.y2 + rout;

if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) {

d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2,
(d2_border)clip_arc.y2);
result = d2_renderwedge(u->d2_handle,
(d2_point)D2_FIX4(core_area.x1),
(d2_point) D2_FIX4(core_area.y2),
(d2_width) D2_FIX4(rout),
(d2_width) D2_FIX4((rout - rin)),
(d2_s32) D2_FIX16((int16_t) -1), //90 degrees
(d2_s32) D2_FIX16(0),
(d2_s32) D2_FIX16(0), //180 degrees
(d2_s32) D2_FIX16(1),
flags);
if(D2_OK != result) {
__BKPT(0);
}
}
}

Expand All @@ -337,35 +361,62 @@ static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_

if(blend_w > 0) {
if(right_side || top_side) {
result = d2_renderwedge(u->d2_handle,
(d2_point)D2_FIX4(core_area.x2),
(d2_point) D2_FIX4(core_area.y1),
(d2_width) D2_FIX4(rout),
(d2_width) D2_FIX4((rout - rin)),
(d2_s32) D2_FIX16((int16_t)1), // 270 Degrees
(d2_s32) D2_FIX16(0),
(d2_s32) D2_FIX16(0),// 0 degrees
(d2_s32) D2_FIX16(-1),
flags);
if(D2_OK != result) {
__BKPT(0);

lv_area_t arc_area;
lv_area_t clip_arc;

arc_area.x1 = core_area.x2;
arc_area.y1 = core_area.y1 - rout;
arc_area.x2 = core_area.x2 + rout;
arc_area.y2 = core_area.y1;

if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) {

d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2,
(d2_border)clip_arc.y2);
result = d2_renderwedge(u->d2_handle,
(d2_point)D2_FIX4(core_area.x2),
(d2_point) D2_FIX4(core_area.y1),
(d2_width) D2_FIX4(rout),
(d2_width) D2_FIX4((rout - rin)),
(d2_s32) D2_FIX16((int16_t)1), // 270 Degrees
(d2_s32) D2_FIX16(0),
(d2_s32) D2_FIX16(0),// 0 degrees
(d2_s32) D2_FIX16(-1),
flags);
if(D2_OK != result) {
__BKPT(0);
}
}

}

if(right_side || bottom_side) {
result = d2_renderwedge(u->d2_handle,
(d2_point)D2_FIX4(core_area.x2),
(d2_point) D2_FIX4(core_area.y2),
(d2_width) D2_FIX4(rout),
(d2_width) D2_FIX4((rout - rin)),
(d2_s32) D2_FIX16(0),// 0 degrees
(d2_s32) D2_FIX16(1),
(d2_s32) D2_FIX16(1),// 90 degrees
(d2_s32) D2_FIX16(0),
flags);
if(D2_OK != result) {
__BKPT(0);
lv_area_t arc_area;
lv_area_t clip_arc;

arc_area.x1 = core_area.x2;
arc_area.y1 = core_area.y2;
arc_area.x2 = core_area.x2 + rout;
arc_area.y2 = core_area.y2 + rout;

if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) {

d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2,
(d2_border)clip_arc.y2);
result = d2_renderwedge(u->d2_handle,
(d2_point)D2_FIX4(core_area.x2),
(d2_point) D2_FIX4(core_area.y2),
(d2_width) D2_FIX4(rout),
(d2_width) D2_FIX4((rout - rin)),
(d2_s32) D2_FIX16(0),// 0 degrees
(d2_s32) D2_FIX16(1),
(d2_s32) D2_FIX16(1),// 90 degrees
(d2_s32) D2_FIX16(0),
flags);
if(D2_OK != result) {
__BKPT(0);
}
}
}
}
Expand Down
Loading

0 comments on commit 9b67c5b

Please sign in to comment.