Skip to content

Commit 9b67c5b

Browse files
authored
fix(dave2d): fix various smaller issues (#5043)
Co-authored-by: Jeremy Baker <[email protected]> See lvgl/lv_port_renesas_ek-ra8d1_gcc#3
1 parent 1f86e1e commit 9b67c5b

6 files changed

+286
-142
lines changed

src/draw/renesas/dave2d/lv_draw_dave2d.c

+8-8
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,15 @@ static int32_t _dave2d_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t)
267267

268268
case LV_DRAW_TASK_TYPE_IMAGE: {
269269
#if USE_D2
270-
lv_draw_image_dsc_t * draw_dsc = t->draw_dsc;
271-
if(draw_dsc->header.cf != LV_COLOR_FORMAT_RGB565A8) {
272-
t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D;
273-
t->preference_score = 0;
274-
}
270+
lv_draw_image_dsc_t * draw_dsc = t->draw_dsc;
271+
if(draw_dsc->header.cf != LV_COLOR_FORMAT_RGB565A8) {
272+
t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D;
273+
t->preference_score = 0;
274+
}
275275
#endif
276-
ret = 0;
277-
break;
278-
}
276+
ret = 0;
277+
break;
278+
}
279279

280280
case LV_DRAW_TASK_TYPE_BORDER: {
281281
#if USE_D2

src/draw/renesas/dave2d/lv_draw_dave2d_arc.c

+76-30
Original file line numberDiff line numberDiff line change
@@ -95,41 +95,87 @@ void lv_draw_dave2d_arc(lv_draw_dave2d_unit_t * u, const lv_draw_arc_dsc_t * dsc
9595
sin_end = lv_trigo_sin((int16_t)dsc->end_angle);
9696
cos_end = lv_trigo_cos((int16_t)dsc->end_angle);
9797

98-
result = d2_renderwedge(u->d2_handle,
99-
(d2_point)D2_FIX4(arc_centre.x),
100-
(d2_point) D2_FIX4(arc_centre.y),
101-
(d2_width) D2_FIX4(dsc->radius - dsc->width / 2),
102-
(d2_width) D2_FIX4(dsc->width),
103-
-(d2_s32)(sin_start << 1),
104-
(d2_s32)(cos_start << 1),
105-
(d2_s32)(sin_end << 1),
106-
-(d2_s32)(cos_end << 1),
107-
flags);
108-
if(D2_OK != result) {
109-
__BKPT(0);
110-
}
98+
bool draw_arc;
99+
lv_area_t arc_area;
100+
lv_area_t clip_arc;
101+
lv_point_t start_point;
102+
lv_point_t end_point;
103+
104+
start_point.x = arc_centre.x + (int16_t)(((dsc->radius) * cos_start) >> LV_TRIGO_SHIFT);
105+
start_point.y = arc_centre.y + (int16_t)(((dsc->radius) * sin_start) >> LV_TRIGO_SHIFT);
111106

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

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

119-
/** Render a circle. */
120-
d2_rendercircle(u->d2_handle,
121-
(d2_point) D2_FIX4((uint16_t)(start_coord.x)),
122-
(d2_point) D2_FIX4((uint16_t)(start_coord.y)),
123-
(d2_width) D2_FIX4(dsc->width / 2), 0);
113+
arc_area.x2 = LV_MAX3(start_point.x, end_point.x, arc_centre.x);
114+
arc_area.y2 = LV_MAX3(start_point.y, end_point.y, arc_centre.y);
124115

125-
end_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_end) >> LV_TRIGO_SHIFT);
126-
end_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_end) >> LV_TRIGO_SHIFT);
116+
/* 0 degrees */
117+
if((dsc->end_angle < dsc->start_angle) || ((dsc->start_angle < 360) && (dsc->end_angle > 360))) {
118+
arc_area.x2 = arc_centre.x + dsc->radius;
119+
}
120+
121+
/* 90 degrees */
122+
if(((dsc->end_angle > 90) && (dsc->start_angle < 90)) || ((dsc->start_angle < 90) &&
123+
(dsc->end_angle < dsc->start_angle))) {
124+
arc_area.y2 = arc_centre.y + dsc->radius;
125+
}
126+
127+
/* 180 degrees */
128+
if(((dsc->end_angle > 180) && (dsc->start_angle < 180)) || ((dsc->start_angle < 180) &&
129+
(dsc->end_angle < dsc->start_angle))) {
130+
arc_area.x1 = arc_centre.x - dsc->radius;
131+
}
132+
133+
/* 270 degrees */
134+
if(((dsc->end_angle > 270) && (dsc->start_angle < 270)) || ((dsc->start_angle < 270) &&
135+
(dsc->end_angle < dsc->start_angle))) {
136+
arc_area.y1 = arc_centre.y - dsc->radius;
137+
}
127138

128-
/** Render a circle. */
129-
d2_rendercircle(u->d2_handle,
130-
(d2_point) D2_FIX4((uint16_t)(end_coord.x)),
131-
(d2_point) D2_FIX4((uint16_t)(end_coord.y)),
132-
(d2_width) D2_FIX4(dsc->width / 2), 0);
139+
draw_arc = _lv_area_intersect(&clip_arc, &arc_area, &clipped_area);
140+
141+
if(draw_arc) {
142+
143+
result = d2_renderwedge(u->d2_handle,
144+
(d2_point)D2_FIX4(arc_centre.x),
145+
(d2_point) D2_FIX4(arc_centre.y),
146+
(d2_width) D2_FIX4(dsc->radius - dsc->width / 2),
147+
(d2_width) D2_FIX4(dsc->width),
148+
-(d2_s32)(sin_start << 1),
149+
(d2_s32)(cos_start << 1),
150+
(d2_s32)(sin_end << 1),
151+
-(d2_s32)(cos_end << 1),
152+
flags);
153+
if(D2_OK != result) {
154+
__BKPT(0);
155+
}
156+
157+
if(dsc->rounded) {
158+
lv_point_t start_coord;
159+
lv_point_t end_coord;
160+
161+
start_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_start) >> LV_TRIGO_SHIFT);
162+
start_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_start) >> LV_TRIGO_SHIFT);
163+
164+
/** Render a circle. */
165+
d2_rendercircle(u->d2_handle,
166+
(d2_point) D2_FIX4((uint16_t)(start_coord.x)),
167+
(d2_point) D2_FIX4((uint16_t)(start_coord.y)),
168+
(d2_width) D2_FIX4(dsc->width / 2), 0);
169+
170+
end_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_end) >> LV_TRIGO_SHIFT);
171+
end_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_end) >> LV_TRIGO_SHIFT);
172+
173+
/** Render a circle. */
174+
d2_rendercircle(u->d2_handle,
175+
(d2_point) D2_FIX4((uint16_t)(end_coord.x)),
176+
(d2_point) D2_FIX4((uint16_t)(end_coord.y)),
177+
(d2_width) D2_FIX4(dsc->width / 2), 0);
178+
}
133179
}
134180
}
135181

src/draw/renesas/dave2d/lv_draw_dave2d_border.c

+100-49
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,6 @@ static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_
184184
inner_area = *orig_inner_area;
185185

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

189188
#if LV_USE_OS
190189
lv_result_t status;
@@ -296,35 +295,60 @@ static void dave2d_draw_border_complex(lv_draw_dave2d_unit_t * u, const lv_area_
296295

297296
if(blend_w > 0) {
298297
if(left_side || top_side) {
299-
result = d2_renderwedge(u->d2_handle,
300-
(d2_point)D2_FIX4(core_area.x1),
301-
(d2_point) D2_FIX4(core_area.y1),
302-
(d2_width) D2_FIX4(rout),
303-
(d2_width) D2_FIX4((rout - rin)),
304-
(d2_s32) D2_FIX16(0), // 180 Degrees
305-
(d2_s32) D2_FIX16((int16_t) -1),
306-
(d2_s32) D2_FIX16((int16_t) -1),//( 270 Degrees
307-
(d2_s32) D2_FIX16(0),
308-
flags);
309-
if(D2_OK != result) {
310-
__BKPT(0);
298+
lv_area_t arc_area;
299+
lv_area_t clip_arc;
300+
301+
arc_area.x1 = core_area.x1 - rout;
302+
arc_area.y1 = core_area.y1 - rout;
303+
arc_area.x2 = core_area.x1;
304+
arc_area.y2 = core_area.y1;
305+
306+
if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) {
307+
d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2,
308+
(d2_border)clip_arc.y2);
309+
result = d2_renderwedge(u->d2_handle,
310+
(d2_point)D2_FIX4(core_area.x1),
311+
(d2_point) D2_FIX4(core_area.y1),
312+
(d2_width) D2_FIX4(rout),
313+
(d2_width) D2_FIX4((rout - rin)),
314+
(d2_s32) D2_FIX16(0), // 180 Degrees
315+
(d2_s32) D2_FIX16((int16_t) -1),
316+
(d2_s32) D2_FIX16((int16_t) -1),//( 270 Degrees
317+
(d2_s32) D2_FIX16(0),
318+
flags);
319+
if(D2_OK != result) {
320+
__BKPT(0);
321+
}
311322
}
312323

313324
}
314325

315326
if(left_side || bottom_side) {
316-
result = d2_renderwedge(u->d2_handle,
317-
(d2_point)D2_FIX4(core_area.x1),
318-
(d2_point) D2_FIX4(core_area.y2),
319-
(d2_width) D2_FIX4(rout),
320-
(d2_width) D2_FIX4((rout - rin)),
321-
(d2_s32) D2_FIX16((int16_t) -1), //90 degrees
322-
(d2_s32) D2_FIX16(0),
323-
(d2_s32) D2_FIX16(0), //180 degrees
324-
(d2_s32) D2_FIX16(1),
325-
flags);
326-
if(D2_OK != result) {
327-
__BKPT(0);
327+
lv_area_t arc_area;
328+
lv_area_t clip_arc;
329+
330+
arc_area.x1 = core_area.x1 - rout;
331+
arc_area.y1 = core_area.y2;
332+
arc_area.x2 = core_area.x1;
333+
arc_area.y2 = core_area.y2 + rout;
334+
335+
if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) {
336+
337+
d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2,
338+
(d2_border)clip_arc.y2);
339+
result = d2_renderwedge(u->d2_handle,
340+
(d2_point)D2_FIX4(core_area.x1),
341+
(d2_point) D2_FIX4(core_area.y2),
342+
(d2_width) D2_FIX4(rout),
343+
(d2_width) D2_FIX4((rout - rin)),
344+
(d2_s32) D2_FIX16((int16_t) -1), //90 degrees
345+
(d2_s32) D2_FIX16(0),
346+
(d2_s32) D2_FIX16(0), //180 degrees
347+
(d2_s32) D2_FIX16(1),
348+
flags);
349+
if(D2_OK != result) {
350+
__BKPT(0);
351+
}
328352
}
329353
}
330354

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

338362
if(blend_w > 0) {
339363
if(right_side || top_side) {
340-
result = d2_renderwedge(u->d2_handle,
341-
(d2_point)D2_FIX4(core_area.x2),
342-
(d2_point) D2_FIX4(core_area.y1),
343-
(d2_width) D2_FIX4(rout),
344-
(d2_width) D2_FIX4((rout - rin)),
345-
(d2_s32) D2_FIX16((int16_t)1), // 270 Degrees
346-
(d2_s32) D2_FIX16(0),
347-
(d2_s32) D2_FIX16(0),// 0 degrees
348-
(d2_s32) D2_FIX16(-1),
349-
flags);
350-
if(D2_OK != result) {
351-
__BKPT(0);
364+
365+
lv_area_t arc_area;
366+
lv_area_t clip_arc;
367+
368+
arc_area.x1 = core_area.x2;
369+
arc_area.y1 = core_area.y1 - rout;
370+
arc_area.x2 = core_area.x2 + rout;
371+
arc_area.y2 = core_area.y1;
372+
373+
if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) {
374+
375+
d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2,
376+
(d2_border)clip_arc.y2);
377+
result = d2_renderwedge(u->d2_handle,
378+
(d2_point)D2_FIX4(core_area.x2),
379+
(d2_point) D2_FIX4(core_area.y1),
380+
(d2_width) D2_FIX4(rout),
381+
(d2_width) D2_FIX4((rout - rin)),
382+
(d2_s32) D2_FIX16((int16_t)1), // 270 Degrees
383+
(d2_s32) D2_FIX16(0),
384+
(d2_s32) D2_FIX16(0),// 0 degrees
385+
(d2_s32) D2_FIX16(-1),
386+
flags);
387+
if(D2_OK != result) {
388+
__BKPT(0);
389+
}
352390
}
353391

354392
}
355393

356394
if(right_side || bottom_side) {
357-
result = d2_renderwedge(u->d2_handle,
358-
(d2_point)D2_FIX4(core_area.x2),
359-
(d2_point) D2_FIX4(core_area.y2),
360-
(d2_width) D2_FIX4(rout),
361-
(d2_width) D2_FIX4((rout - rin)),
362-
(d2_s32) D2_FIX16(0),// 0 degrees
363-
(d2_s32) D2_FIX16(1),
364-
(d2_s32) D2_FIX16(1),// 90 degrees
365-
(d2_s32) D2_FIX16(0),
366-
flags);
367-
if(D2_OK != result) {
368-
__BKPT(0);
395+
lv_area_t arc_area;
396+
lv_area_t clip_arc;
397+
398+
arc_area.x1 = core_area.x2;
399+
arc_area.y1 = core_area.y2;
400+
arc_area.x2 = core_area.x2 + rout;
401+
arc_area.y2 = core_area.y2 + rout;
402+
403+
if(_lv_area_intersect(&clip_arc, &arc_area, &draw_area)) {
404+
405+
d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2,
406+
(d2_border)clip_arc.y2);
407+
result = d2_renderwedge(u->d2_handle,
408+
(d2_point)D2_FIX4(core_area.x2),
409+
(d2_point) D2_FIX4(core_area.y2),
410+
(d2_width) D2_FIX4(rout),
411+
(d2_width) D2_FIX4((rout - rin)),
412+
(d2_s32) D2_FIX16(0),// 0 degrees
413+
(d2_s32) D2_FIX16(1),
414+
(d2_s32) D2_FIX16(1),// 90 degrees
415+
(d2_s32) D2_FIX16(0),
416+
flags);
417+
if(D2_OK != result) {
418+
__BKPT(0);
419+
}
369420
}
370421
}
371422
}

0 commit comments

Comments
 (0)