I am using lv_port_linux with version 9.
I am making a “background indicator” for a progress bar. The idea is that there is a second indicator that goes between the actual indicator of the bar and an arbrtrary set point. I am implementing this by creating a canvas, making a layer from that canvas, drawing a rectangle to it, and then masking the canvas layer and finalizing the layer.
static lv_obj_t *rectangle_canvas;
LV_DRAW_BUF_DEFINE(draw_buf_rectangle, BAR_RECT_WIDTH, BAR_RECT_HEIGHT, LV_COLOR_FORMAT_ARGB8888); /* necessary to have alpha channel in draw buffer for masking */
lv_draw_rect_dsc_t rectangle_desc;
lv_layer_t rectangle_layer;
lv_draw_mask_rect_dsc_t mask_rect_desc;
// variables are statically defined at top of source file.
pr_dbg("creating canvas");
rectangle_canvas = lv_canvas_create(charging_scr);
if(!rectangle_canvas) {
pr_err("failed to create rectangle canvas");
return -errno;
}
pr_dbg("setting draw buf");
lv_canvas_set_draw_buf(rectangle_canvas, &draw_buf_rectangle);
lv_draw_rect_dsc_init(&rectangle_desc);
rectangle_desc.radius = 15;
rectangle_desc.bg_opa = LV_OPA_COVER;
rectangle_desc.bg_color = lv_color_hex(0x676767);
rectangle_desc.bg_grad.stops_count = 0;
/* everything else is zeroed */
lv_obj_set_pos(rectangle_canvas, LEFT_BAR_MARGIN, TOP_BAR_MARGIN); /* same as rectangle, may need to adjust because of padding & such */
lv_canvas_fill_bg(rectangle_canvas, lv_color_hex(HEX_BLACK), LV_OPA_COVER);
pr_dbg("init layer");
lv_canvas_init_layer(rectangle_canvas, &rectangle_layer);
lv_area_t rect_area = {0, 0, BAR_RECT_WIDTH, BAR_RECT_HEIGHT};
lv_draw_rect(&rectangle_layer, &rectangle_desc, &rect_area);
lv_draw_mask_rect_dsc_init(&mask_rect_desc);
mask_rect_desc.radius = 0;
/* TODO: set area and maybe draw descriptor */
mask_rect_desc.area.x1 = 10;
mask_rect_desc.area.x2 = 30;
mask_rect_desc.area.y1 = 0;
mask_rect_desc.area.y2 = BAR_RECT_HEIGHT;
pr_dbg("masking");
lv_draw_mask_rect(&rectangle_layer, &mask_rect_desc);
pr_dbg("finishing layer");
lv_canvas_finish_layer(rectangle_canvas, &rectangle_layer);
it is currently segmentation faulting after calling lv_canvas_finish_layer, but it has been hard to track down exactly where, it may be in an asynchronous or scheduled function. Thank you for any guidance.