arch(draw): add parallel rendering architecture
BREAKING CHANGE This is a huge update which introduces parallel rendering. lv_conf.h needs to be updated too.
This commit is contained in:
@@ -31,25 +31,31 @@ static void slider_event_cb(lv_event_t * e)
|
||||
if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) {
|
||||
lv_event_set_ext_draw_size(e, 50);
|
||||
}
|
||||
else if(code == LV_EVENT_DRAW_PART_END) {
|
||||
lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);
|
||||
if(dsc->part == LV_PART_INDICATOR) {
|
||||
char buf[16];
|
||||
lv_snprintf(buf, sizeof(buf), "%d - %d", (int)lv_slider_get_left_value(obj), (int)lv_slider_get_value(obj));
|
||||
else if(code == LV_EVENT_DRAW_MAIN_END) {
|
||||
if(!lv_obj_has_state(obj, LV_STATE_PRESSED)) return;
|
||||
|
||||
lv_point_t label_size;
|
||||
lv_txt_get_size(&label_size, buf, LV_FONT_DEFAULT, 0, 0, LV_COORD_MAX, 0);
|
||||
lv_area_t label_area;
|
||||
label_area.x1 = dsc->draw_area->x1 + lv_area_get_width(dsc->draw_area) / 2 - label_size.x / 2;
|
||||
label_area.x2 = label_area.x1 + label_size.x;
|
||||
label_area.y2 = dsc->draw_area->y1 - 10;
|
||||
label_area.y1 = label_area.y2 - label_size.y;
|
||||
lv_slider_t * slider = (lv_slider_t *) obj;
|
||||
const lv_area_t * indic_area = &slider->bar.indic_area;
|
||||
char buf[16];
|
||||
lv_snprintf(buf, sizeof(buf), "%d - %d", (int)lv_slider_get_left_value(obj), (int)lv_slider_get_value(obj));
|
||||
|
||||
lv_draw_label_dsc_t label_draw_dsc;
|
||||
lv_draw_label_dsc_init(&label_draw_dsc);
|
||||
label_draw_dsc.color = lv_color_hex3(0x888);
|
||||
lv_draw_label(dsc->draw_ctx, &label_draw_dsc, &label_area, buf, NULL);
|
||||
}
|
||||
lv_point_t label_size;
|
||||
lv_txt_get_size(&label_size, buf, LV_FONT_DEFAULT, 0, 0, LV_COORD_MAX, 0);
|
||||
lv_area_t label_area;
|
||||
label_area.x1 = 0;
|
||||
label_area.x2 = label_size.x - 1;
|
||||
label_area.y1 = 0;
|
||||
label_area.y2 = label_size.y - 1;
|
||||
|
||||
lv_area_align(indic_area, &label_area, LV_ALIGN_OUT_TOP_MID, 0, -10);
|
||||
|
||||
lv_draw_label_dsc_t label_draw_dsc;
|
||||
lv_draw_label_dsc_init(&label_draw_dsc);
|
||||
label_draw_dsc.color = lv_color_hex3(0x888);
|
||||
label_draw_dsc.text = buf;
|
||||
label_draw_dsc.text_local = true;
|
||||
lv_layer_t * layer = lv_event_get_layer(e);
|
||||
lv_draw_label(layer, &label_draw_dsc, &label_area);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,25 +6,26 @@ def slider_event_cb(e):
|
||||
if code == lv.EVENT.REFR_EXT_DRAW_SIZE:
|
||||
e.set_ext_draw_size(50)
|
||||
|
||||
elif code == lv.EVENT.DRAW_PART_END:
|
||||
# print("DRAW_PART_END")
|
||||
dsc = lv.obj_draw_part_dsc_t.__cast__(e.get_param())
|
||||
# print(dsc)
|
||||
if dsc.part == lv.PART.INDICATOR:
|
||||
elif code == lv.EVENT.DRAW_TASK_ADDED:
|
||||
dsc = e.get_draw_task()
|
||||
base_dsc = lv.draw_dsc_base_t.__cast__(dsc.draw_dsc)
|
||||
if base_dsc.part == lv.PART.INDICATOR:
|
||||
label_text = "{:d} - {:d}".format(obj.get_left_value(),slider.get_value())
|
||||
label_size = lv.point_t()
|
||||
lv.txt_get_size(label_size, label_text, lv.font_default(), 0, 0, lv.COORD.MAX, 0)
|
||||
# print(label_size.x,label_size.y)
|
||||
label_area = lv.area_t()
|
||||
label_area.x1 = dsc.draw_area.x1 + dsc.draw_area.get_width() // 2 - label_size.x // 2
|
||||
label_area.x1 = dsc.area.x1 + dsc.area.get_width() // 2 - label_size.x // 2
|
||||
label_area.x2 = label_area.x1 + label_size.x
|
||||
label_area.y2 = dsc.draw_area.y1 - 10
|
||||
label_area.y2 = dsc.area.y1 - 10
|
||||
label_area.y1 = label_area.y2 - label_size.y
|
||||
|
||||
label_draw_dsc = lv.draw_label_dsc_t()
|
||||
label_draw_dsc.init()
|
||||
label_draw_dsc.text = label_text
|
||||
label_draw_dsc.text_local = 1
|
||||
|
||||
dsc.draw_ctx.label(label_draw_dsc, label_area, label_text, None)
|
||||
lv.draw_label(base_dsc.layer, label_draw_dsc, label_area)
|
||||
#
|
||||
# Show the current value when the slider if pressed by extending the drawer
|
||||
#
|
||||
@@ -39,5 +40,6 @@ slider.set_value(70, lv.ANIM.OFF)
|
||||
slider.set_left_value(20, lv.ANIM.OFF)
|
||||
|
||||
slider.add_event(slider_event_cb, lv.EVENT.ALL, None)
|
||||
slider.add_flag(lv.obj.FLAG.SEND_DRAW_TASK_EVENTS)
|
||||
slider.refresh_ext_draw_size()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user