feat(draw): add comments and unify struct names (#7878)
@@ -360,17 +360,17 @@ static void chart_draw_task_event_cb(lv_event_t * e)
|
||||
tri_dsc.p[1].y = draw_line_dsc->p2.y;
|
||||
tri_dsc.p[2].x = draw_line_dsc->p1.y < draw_line_dsc->p2.y ? draw_line_dsc->p1.x : draw_line_dsc->p2.x;
|
||||
tri_dsc.p[2].y = LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y);
|
||||
tri_dsc.bg_grad.dir = LV_GRAD_DIR_VER;
|
||||
tri_dsc.grad.dir = LV_GRAD_DIR_VER;
|
||||
|
||||
int32_t full_h = lv_obj_get_height(obj);
|
||||
int32_t fract_upper = (int32_t)(LV_MIN(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - obj->coords.y1) * 255 / full_h;
|
||||
int32_t fract_lower = (int32_t)(LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - obj->coords.y1) * 255 / full_h;
|
||||
tri_dsc.bg_grad.stops[0].color = lv_color_hex(0x3987CF);
|
||||
tri_dsc.bg_grad.stops[0].opa = 200 * (255 - fract_upper) / 256;
|
||||
tri_dsc.bg_grad.stops[0].frac = 0;
|
||||
tri_dsc.bg_grad.stops[1].color = lv_color_hex(0x3987CF);
|
||||
tri_dsc.bg_grad.stops[1].opa = 200 * (255 - fract_lower) / 256;
|
||||
tri_dsc.bg_grad.stops[1].frac = 255;
|
||||
tri_dsc.grad.stops[0].color = lv_color_hex(0x3987CF);
|
||||
tri_dsc.grad.stops[0].opa = 200 * (255 - fract_upper) / 256;
|
||||
tri_dsc.grad.stops[0].frac = 0;
|
||||
tri_dsc.grad.stops[1].color = lv_color_hex(0x3987CF);
|
||||
tri_dsc.grad.stops[1].opa = 200 * (255 - fract_lower) / 256;
|
||||
tri_dsc.grad.stops[1].frac = 255;
|
||||
|
||||
lv_draw_triangle(base_dsc->layer, &tri_dsc);
|
||||
|
||||
|
||||
@@ -809,7 +809,7 @@ static void spectrum_draw_event_cb(lv_event_t * e)
|
||||
|
||||
lv_draw_triangle_dsc_t draw_dsc;
|
||||
lv_draw_triangle_dsc_init(&draw_dsc);
|
||||
draw_dsc.bg_opa = LV_OPA_COVER;
|
||||
draw_dsc.opa = LV_OPA_COVER;
|
||||
|
||||
uint16_t r[64];
|
||||
uint32_t i;
|
||||
@@ -865,12 +865,12 @@ static void spectrum_draw_event_cb(lv_event_t * e)
|
||||
v = (r[k] * animv + r[j] * (amax - animv)) / amax;
|
||||
}
|
||||
|
||||
if(v < BAR_COLOR1_STOP) draw_dsc.bg_color = BAR_COLOR1;
|
||||
else if(v > (uint32_t)BAR_COLOR3_STOP) draw_dsc.bg_color = BAR_COLOR3;
|
||||
else if(v > BAR_COLOR2_STOP) draw_dsc.bg_color = lv_color_mix(BAR_COLOR3, BAR_COLOR2,
|
||||
((v - BAR_COLOR2_STOP) * 255) / (BAR_COLOR3_STOP - BAR_COLOR2_STOP));
|
||||
else draw_dsc.bg_color = lv_color_mix(BAR_COLOR2, BAR_COLOR1,
|
||||
((v - BAR_COLOR1_STOP) * 255) / (BAR_COLOR2_STOP - BAR_COLOR1_STOP));
|
||||
if(v < BAR_COLOR1_STOP) draw_dsc.color = BAR_COLOR1;
|
||||
else if(v > (uint32_t)BAR_COLOR3_STOP) draw_dsc.color = BAR_COLOR3;
|
||||
else if(v > BAR_COLOR2_STOP) draw_dsc.color = lv_color_mix(BAR_COLOR3, BAR_COLOR2,
|
||||
((v - BAR_COLOR2_STOP) * 255) / (BAR_COLOR3_STOP - BAR_COLOR2_STOP));
|
||||
else draw_dsc.color = lv_color_mix(BAR_COLOR2, BAR_COLOR1,
|
||||
((v - BAR_COLOR1_STOP) * 255) / (BAR_COLOR2_STOP - BAR_COLOR1_STOP));
|
||||
|
||||
uint32_t di = deg + deg_space;
|
||||
|
||||
|
||||
@@ -543,17 +543,17 @@ static void triangle_draw_event_cb(lv_event_t * e)
|
||||
dsc.p[2].y = p_rel[2].y + coords.y1 + 2;
|
||||
|
||||
lv_opa_t opa = lv_obj_get_style_opa(obj, 0);
|
||||
dsc.bg_grad.dir = lv_obj_get_style_bg_grad_dir(obj, 0);
|
||||
dsc.bg_grad.stops[0].color = lv_obj_get_style_bg_color(obj, 0);
|
||||
dsc.bg_grad.stops[0].frac = lv_obj_get_style_bg_main_stop(obj, 0);
|
||||
dsc.bg_grad.stops[0].opa = LV_OPA_MIX2(lv_obj_get_style_bg_main_opa(obj, 0), opa);
|
||||
dsc.bg_grad.stops[1].color = lv_obj_get_style_bg_grad_color(obj, 0);
|
||||
dsc.bg_grad.stops[1].frac = lv_obj_get_style_bg_grad_stop(obj, 0);
|
||||
dsc.bg_grad.stops[1].opa = LV_OPA_MIX2(lv_obj_get_style_bg_grad_opa(obj, 0), opa);
|
||||
dsc.bg_grad.stops_count = 2;
|
||||
dsc.grad.dir = lv_obj_get_style_bg_grad_dir(obj, 0);
|
||||
dsc.grad.stops[0].color = lv_obj_get_style_bg_color(obj, 0);
|
||||
dsc.grad.stops[0].frac = lv_obj_get_style_bg_main_stop(obj, 0);
|
||||
dsc.grad.stops[0].opa = LV_OPA_MIX2(lv_obj_get_style_bg_main_opa(obj, 0), opa);
|
||||
dsc.grad.stops[1].color = lv_obj_get_style_bg_grad_color(obj, 0);
|
||||
dsc.grad.stops[1].frac = lv_obj_get_style_bg_grad_stop(obj, 0);
|
||||
dsc.grad.stops[1].opa = LV_OPA_MIX2(lv_obj_get_style_bg_grad_opa(obj, 0), opa);
|
||||
dsc.grad.stops_count = 2;
|
||||
|
||||
dsc.bg_color = dsc.bg_grad.stops[0].color;
|
||||
dsc.bg_opa = dsc.bg_grad.stops[0].opa;
|
||||
dsc.color = dsc.grad.stops[0].color;
|
||||
dsc.opa = dsc.grad.stops[0].opa;
|
||||
|
||||
lv_draw_triangle(lv_event_get_layer(e), &dsc);
|
||||
}
|
||||
|
||||
@@ -1427,17 +1427,17 @@ static void chart_event_cb(lv_event_t * e)
|
||||
tri_dsc.p[1].y = (int32_t)draw_line_dsc->p2.y;
|
||||
tri_dsc.p[2].x = (int32_t)(draw_line_dsc->p1.y < draw_line_dsc->p2.y ? draw_line_dsc->p1.x : draw_line_dsc->p2.x);
|
||||
tri_dsc.p[2].y = (int32_t)LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y);
|
||||
tri_dsc.bg_grad.dir = LV_GRAD_DIR_VER;
|
||||
tri_dsc.grad.dir = LV_GRAD_DIR_VER;
|
||||
|
||||
int32_t full_h = lv_obj_get_height(obj);
|
||||
int32_t fract_uppter = (int32_t)(LV_MIN(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - obj_coords.y1) * 255 / full_h;
|
||||
int32_t fract_lower = (int32_t)(LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - obj_coords.y1) * 255 / full_h;
|
||||
tri_dsc.bg_grad.stops[0].color = lv_chart_get_series_color(obj, ser);
|
||||
tri_dsc.bg_grad.stops[0].opa = 255 - fract_uppter;
|
||||
tri_dsc.bg_grad.stops[0].frac = 0;
|
||||
tri_dsc.bg_grad.stops[1].color = lv_chart_get_series_color(obj, ser);
|
||||
tri_dsc.bg_grad.stops[1].opa = 255 - fract_lower;
|
||||
tri_dsc.bg_grad.stops[1].frac = 255;
|
||||
tri_dsc.grad.stops[0].color = lv_chart_get_series_color(obj, ser);
|
||||
tri_dsc.grad.stops[0].opa = 255 - fract_uppter;
|
||||
tri_dsc.grad.stops[0].frac = 0;
|
||||
tri_dsc.grad.stops[1].color = lv_chart_get_series_color(obj, ser);
|
||||
tri_dsc.grad.stops[1].opa = 255 - fract_lower;
|
||||
tri_dsc.grad.stops[1].frac = 255;
|
||||
|
||||
lv_draw_triangle(base_dsc->layer, &tri_dsc);
|
||||
|
||||
|
||||
@@ -52,14 +52,20 @@ Draw a vector graphic to the canvas
|
||||
.. lv_example:: widgets/canvas/lv_example_canvas_8
|
||||
:language: c
|
||||
|
||||
Draw Fancy Letter Effects
|
||||
-------------------------
|
||||
Draw a triangle to the canvas
|
||||
-----------------------------
|
||||
|
||||
.. lv_example:: widgets/canvas/lv_example_canvas_9
|
||||
:language: c
|
||||
|
||||
Draw Fancy Letter Effects 2
|
||||
---------------------------
|
||||
Draw Fancy Letter Effects
|
||||
-------------------------
|
||||
|
||||
.. lv_example:: widgets/canvas/lv_example_canvas_10
|
||||
:language: c
|
||||
:language: c
|
||||
|
||||
|
||||
Draw Fancy Letter Effects 2
|
||||
---------------------------
|
||||
.. lv_example:: widgets/canvas/lv_example_canvas_11
|
||||
:language: c
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
static void timer_cb(lv_timer_t * timer)
|
||||
{
|
||||
static int16_t counter = 0;
|
||||
const char * string = "windstorrrrrrrrrrrrrrrrm~>>>";
|
||||
const int16_t string_len = (int16_t)lv_strlen(string);
|
||||
const char * string = "lol~ I'm wavvvvvvving~>>>";
|
||||
const int16_t string_len = lv_strlen(string);
|
||||
|
||||
lv_obj_t * canvas = (lv_obj_t *)lv_timer_get_user_data(timer);
|
||||
lv_layer_t layer;
|
||||
@@ -22,15 +22,15 @@ static void timer_cb(lv_timer_t * timer)
|
||||
letter_dsc.font = lv_font_get_default();
|
||||
|
||||
{
|
||||
#define CURVE2_X(t) ((t) * 2 + lv_trigo_cos((t) * 5) * 40 / 32767 - 10)
|
||||
#define CURVE2_Y(t, T) ((t) * lv_trigo_sin(((t) + (T)) * 5) * 40 / 32767 / 80 + CANVAS_HEIGHT / 2)
|
||||
#define CURVE2_X(t) (t * 2 + 10)
|
||||
#define CURVE2_Y(t) (lv_trigo_sin((t) * 5) * 40 / 32767 + CANVAS_HEIGHT / 2)
|
||||
|
||||
int32_t pre_x = CURVE2_X(-1);
|
||||
int32_t pre_y = CURVE2_Y(-1, 0);
|
||||
int32_t pre_y = CURVE2_Y(-1);
|
||||
for(int16_t i = 0; i < string_len; i++) {
|
||||
const int16_t angle = (int16_t)(i * 5);
|
||||
const int32_t x = CURVE2_X(angle);
|
||||
const int32_t y = CURVE2_Y(angle + 30, counter / 2);
|
||||
const int32_t y = CURVE2_Y(angle + counter / 2);
|
||||
const lv_point_t point = { .x = x, .y = y };
|
||||
|
||||
letter_dsc.unicode = (uint32_t)string[i % string_len];
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
#include "../../lv_examples.h"
|
||||
#if LV_USE_CANVAS && LV_BUILD_EXAMPLES
|
||||
|
||||
#define CANVAS_WIDTH 300
|
||||
#define CANVAS_HEIGHT 200
|
||||
|
||||
static void timer_cb(lv_timer_t * timer)
|
||||
{
|
||||
static int32_t counter = 0;
|
||||
const char * string = "windstorrrrrrrrrrrrrrrrm~>>>";
|
||||
const int16_t string_len = lv_strlen(string);
|
||||
|
||||
lv_obj_t * canvas = (lv_obj_t *) lv_timer_get_user_data(timer);
|
||||
lv_layer_t layer;
|
||||
lv_canvas_init_layer(canvas, &layer);
|
||||
|
||||
lv_canvas_fill_bg(canvas, lv_color_white(), LV_OPA_COVER);
|
||||
|
||||
lv_draw_letter_dsc_t letter_dsc;
|
||||
lv_draw_letter_dsc_init(&letter_dsc);
|
||||
letter_dsc.color = lv_color_hex(0xff0000);
|
||||
letter_dsc.font = lv_font_get_default();
|
||||
|
||||
{
|
||||
#define CURVE2_X(t) ((t) * 2 + lv_trigo_cos((t) * 5) * 40 / 32767 - 10)
|
||||
#define CURVE2_Y(t, T) ((t) * lv_trigo_sin(((t) + (T)) * 5) * 40 / 32767 / 80 + CANVAS_HEIGHT / 2)
|
||||
|
||||
int32_t pre_x = CURVE2_X(-1);
|
||||
int32_t pre_y = CURVE2_Y(-1, 0);
|
||||
for(int16_t i = 0; i < string_len; i++) {
|
||||
const int32_t angle = i * 5;
|
||||
const int32_t x = CURVE2_X(angle);
|
||||
const int32_t y = CURVE2_Y(angle + 30, counter / 2);
|
||||
|
||||
letter_dsc.unicode = (uint32_t)string[i % string_len];
|
||||
letter_dsc.rotation = lv_atan2(y - pre_y, x - pre_x) * 10;
|
||||
letter_dsc.color = lv_color_hsv_to_rgb(i * 10, 100, 100);
|
||||
lv_draw_letter(&layer, &letter_dsc, &(lv_point_t) {
|
||||
.x = x, .y = y
|
||||
});
|
||||
|
||||
pre_x = x;
|
||||
pre_y = y;
|
||||
}
|
||||
}
|
||||
|
||||
lv_canvas_finish_layer(canvas, &layer);
|
||||
|
||||
counter++;
|
||||
}
|
||||
|
||||
void lv_example_canvas_11(void)
|
||||
{
|
||||
/*Create a buffer for the canvas*/
|
||||
LV_DRAW_BUF_DEFINE_STATIC(draw_buf, CANVAS_WIDTH, CANVAS_HEIGHT, LV_COLOR_FORMAT_ARGB8888);
|
||||
LV_DRAW_BUF_INIT_STATIC(draw_buf);
|
||||
|
||||
lv_obj_t * canvas = lv_canvas_create(lv_screen_active());
|
||||
lv_obj_set_size(canvas, CANVAS_WIDTH, CANVAS_HEIGHT);
|
||||
|
||||
lv_obj_center(canvas);
|
||||
|
||||
lv_canvas_set_draw_buf(canvas, &draw_buf);
|
||||
|
||||
lv_timer_create(timer_cb, 16, canvas);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,67 +1,51 @@
|
||||
#include "../../lv_examples.h"
|
||||
#if LV_USE_CANVAS && LV_BUILD_EXAMPLES
|
||||
|
||||
#define CANVAS_WIDTH 300
|
||||
#define CANVAS_HEIGHT 200
|
||||
|
||||
static void timer_cb(lv_timer_t * timer)
|
||||
{
|
||||
static int16_t counter = 0;
|
||||
const char * string = "lol~ I'm wavvvvvvving~>>>";
|
||||
const int16_t string_len = (int16_t)lv_strlen(string);
|
||||
|
||||
lv_obj_t * canvas = (lv_obj_t *)lv_timer_get_user_data(timer);
|
||||
lv_layer_t layer;
|
||||
lv_canvas_init_layer(canvas, &layer);
|
||||
|
||||
lv_canvas_fill_bg(canvas, lv_color_white(), LV_OPA_COVER);
|
||||
|
||||
lv_draw_letter_dsc_t letter_dsc;
|
||||
lv_draw_letter_dsc_init(&letter_dsc);
|
||||
letter_dsc.color = lv_color_hex(0xff0000);
|
||||
letter_dsc.font = lv_font_get_default();
|
||||
|
||||
{
|
||||
#define CURVE2_X(t) (t * 2 + 10)
|
||||
#define CURVE2_Y(t) (lv_trigo_sin((t) * 5) * 40 / 32767 + CANVAS_HEIGHT / 2)
|
||||
|
||||
int32_t pre_x = CURVE2_X(-1);
|
||||
int32_t pre_y = CURVE2_Y(-1);
|
||||
for(int16_t i = 0; i < string_len; i++) {
|
||||
const int16_t angle = (int16_t)(i * 5);
|
||||
const int32_t x = CURVE2_X(angle);
|
||||
const int32_t y = CURVE2_Y(angle + counter / 2);
|
||||
const lv_point_t point = { .x = x, .y = y };
|
||||
|
||||
letter_dsc.unicode = (uint32_t)string[i % string_len];
|
||||
letter_dsc.rotation = lv_atan2(y - pre_y, x - pre_x) * 10;
|
||||
letter_dsc.color = lv_color_hsv_to_rgb(i * 10, 100, 100);
|
||||
lv_draw_letter(&layer, &letter_dsc, &point);
|
||||
|
||||
pre_x = x;
|
||||
pre_y = y;
|
||||
}
|
||||
}
|
||||
|
||||
lv_canvas_finish_layer(canvas, &layer);
|
||||
|
||||
counter++;
|
||||
}
|
||||
#define CANVAS_WIDTH 150
|
||||
#define CANVAS_HEIGHT 150
|
||||
|
||||
/**
|
||||
* Draw a triangle to the canvas
|
||||
*/
|
||||
void lv_example_canvas_9(void)
|
||||
{
|
||||
/*Create a buffer for the canvas*/
|
||||
LV_DRAW_BUF_DEFINE_STATIC(draw_buf, CANVAS_WIDTH, CANVAS_HEIGHT, LV_COLOR_FORMAT_ARGB8888);
|
||||
LV_DRAW_BUF_INIT_STATIC(draw_buf);
|
||||
|
||||
/*Create a canvas and initialize its palette*/
|
||||
lv_obj_t * canvas = lv_canvas_create(lv_screen_active());
|
||||
lv_obj_set_size(canvas, CANVAS_WIDTH, CANVAS_HEIGHT);
|
||||
|
||||
lv_canvas_set_draw_buf(canvas, &draw_buf);
|
||||
lv_canvas_fill_bg(canvas, lv_color_hex3(0xccc), LV_OPA_COVER);
|
||||
lv_obj_center(canvas);
|
||||
|
||||
lv_canvas_set_draw_buf(canvas, &draw_buf);
|
||||
lv_layer_t layer;
|
||||
lv_canvas_init_layer(canvas, &layer);
|
||||
|
||||
lv_timer_create(timer_cb, 16, canvas);
|
||||
lv_draw_triangle_dsc_t tri_dsc;
|
||||
lv_draw_triangle_dsc_init(&tri_dsc);
|
||||
tri_dsc.p[0].x = 10;
|
||||
tri_dsc.p[0].y = 10;
|
||||
tri_dsc.p[1].x = 100;
|
||||
tri_dsc.p[1].y = 30;
|
||||
tri_dsc.p[2].x = 50;
|
||||
tri_dsc.p[2].y = 100;
|
||||
|
||||
tri_dsc.grad.stops_count = 2;
|
||||
tri_dsc.grad.dir = LV_GRAD_DIR_VER;
|
||||
tri_dsc.grad.stops[0].color = lv_color_hex(0xff0000);
|
||||
tri_dsc.grad.stops[0].frac = 64; /*Start at 25%*/
|
||||
tri_dsc.grad.stops[0].opa = LV_OPA_COVER;
|
||||
tri_dsc.grad.stops[1].color = lv_color_hex(0x0000ff);
|
||||
tri_dsc.grad.stops[1].opa = LV_OPA_TRANSP;
|
||||
tri_dsc.grad.stops[1].frac = 3 * 64; /*End at 75%*/
|
||||
|
||||
tri_dsc.opa = 128; /*Set the overall opacity to 50%*/
|
||||
|
||||
lv_draw_triangle(&layer, &tri_dsc);
|
||||
|
||||
lv_canvas_finish_layer(canvas, &layer);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -71,17 +71,18 @@ static void add_faded_area(lv_event_t * e)
|
||||
tri_dsc.p[1].y = draw_line_dsc->p2.y;
|
||||
tri_dsc.p[2].x = draw_line_dsc->p1.y < draw_line_dsc->p2.y ? draw_line_dsc->p1.x : draw_line_dsc->p2.x;
|
||||
tri_dsc.p[2].y = LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y);
|
||||
tri_dsc.bg_grad.dir = LV_GRAD_DIR_VER;
|
||||
tri_dsc.grad.dir = LV_GRAD_DIR_VER;
|
||||
|
||||
int32_t full_h = lv_obj_get_height(obj);
|
||||
int32_t fract_uppter = (int32_t)(LV_MIN(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - coords.y1) * 255 / full_h;
|
||||
int32_t fract_lower = (int32_t)(LV_MAX(draw_line_dsc->p1.y, draw_line_dsc->p2.y) - coords.y1) * 255 / full_h;
|
||||
tri_dsc.bg_grad.stops[0].color = ser_color;
|
||||
tri_dsc.bg_grad.stops[0].opa = (lv_opa_t)(255 - fract_uppter);
|
||||
tri_dsc.bg_grad.stops[0].frac = 0;
|
||||
tri_dsc.bg_grad.stops[1].color = ser_color;
|
||||
tri_dsc.bg_grad.stops[1].opa = (lv_opa_t)(255 - fract_lower);
|
||||
tri_dsc.bg_grad.stops[1].frac = 255;
|
||||
tri_dsc.grad.stops[0].color = ser_color;
|
||||
tri_dsc.grad.stops[0].opa = (lv_opa_t)(255 - fract_uppter);
|
||||
tri_dsc.grad.stops[0].opa = 255 - fract_uppter;
|
||||
tri_dsc.grad.stops[0].frac = 0;
|
||||
tri_dsc.grad.stops[1].color = ser_color;
|
||||
tri_dsc.grad.stops[1].opa = (lv_opa_t)(255 - fract_lower);
|
||||
tri_dsc.grad.stops[1].frac = 255;
|
||||
|
||||
lv_draw_triangle(base_dsc->layer, &tri_dsc);
|
||||
|
||||
|
||||
@@ -32,4 +32,5 @@ void lv_example_dropdown_1(void)
|
||||
lv_obj_add_event_cb(dd, event_handler, LV_EVENT_ALL, NULL);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -59,6 +59,7 @@ void lv_example_canvas_7(void);
|
||||
void lv_example_canvas_8(void);
|
||||
void lv_example_canvas_9(void);
|
||||
void lv_example_canvas_10(void);
|
||||
void lv_example_canvas_11(void);
|
||||
|
||||
void lv_example_chart_1(void);
|
||||
void lv_example_chart_2(void);
|
||||
|
||||
@@ -189,7 +189,6 @@ void lv_obj_init_draw_label_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_label_ds
|
||||
draw_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, part);
|
||||
draw_dsc->line_space = lv_obj_get_style_text_line_space(obj, part);
|
||||
draw_dsc->decor = lv_obj_get_style_text_decor(obj, part);
|
||||
if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
|
||||
|
||||
draw_dsc->font = lv_obj_get_style_text_font(obj, part);
|
||||
|
||||
@@ -278,7 +277,6 @@ void lv_obj_init_draw_line_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_line_dsc_
|
||||
draw_dsc->round_start = lv_obj_get_style_line_rounded(obj, part);
|
||||
draw_dsc->round_end = draw_dsc->round_start;
|
||||
|
||||
if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part);
|
||||
LV_PROFILER_DRAW_END;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ extern "C" {
|
||||
#include "../draw/lv_draw_image.h"
|
||||
#include "../draw/lv_draw_line.h"
|
||||
#include "../draw/lv_draw_arc.h"
|
||||
#include "../draw/lv_draw_triangle.h"
|
||||
|
||||
/*********************
|
||||
* DEFINES
|
||||
@@ -28,9 +29,23 @@ extern "C" {
|
||||
* TYPEDEFS
|
||||
**********************/
|
||||
|
||||
/** Store the type of layer required to render a widget.*/
|
||||
typedef enum {
|
||||
/**No layer is needed. */
|
||||
LV_LAYER_TYPE_NONE,
|
||||
|
||||
/**Simple layer means that the layer can be rendered in chunks.
|
||||
* For example with opa_layered = 140 it's possible to render only 10 lines
|
||||
* from the layer. When it's ready go the the next 10 lines.
|
||||
* It avoids large memory allocations for the layer buffer.
|
||||
* The buffer size for a chunk can be set by `LV_DRAW_LAYER_SIMPLE_BUF_SIZE` in lv_conf.h.*/
|
||||
LV_LAYER_TYPE_SIMPLE,
|
||||
|
||||
/**The widget is transformed and cannot be rendered in chunks.
|
||||
* It's because - due to the transformations - pixel outside of
|
||||
* a given area will also contribute to the final image.
|
||||
* In this case there is no limitation on the buffer size.
|
||||
* LVGL will allocate as large buffer as needed to render the transformed area.*/
|
||||
LV_LAYER_TYPE_TRANSFORM,
|
||||
} lv_layer_type_t;
|
||||
|
||||
|
||||
@@ -117,12 +117,25 @@ struct _lv_layer_t {
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
/**The widget for which draw descriptor was created */
|
||||
lv_obj_t * obj;
|
||||
|
||||
/**The widget part for which draw descriptor was created */
|
||||
lv_part_t part;
|
||||
|
||||
/**A widget type specific ID (e.g. table row index). See the docs of the given widget.*/
|
||||
uint32_t id1;
|
||||
|
||||
/**A widget type specific ID (e.g. table column index). See the docs of the given widget.*/
|
||||
uint32_t id2;
|
||||
|
||||
/**The target layer */
|
||||
lv_layer_t * layer;
|
||||
|
||||
/**Size of the specific draw descriptor into which this base descriptor is embedded*/
|
||||
size_t dsc_size;
|
||||
|
||||
/**Any custom user data*/
|
||||
void * user_data;
|
||||
} lv_draw_dsc_base_t;
|
||||
|
||||
|
||||
@@ -29,14 +29,33 @@ extern "C" {
|
||||
typedef struct {
|
||||
lv_draw_dsc_base_t base;
|
||||
|
||||
/**The color of the arc*/
|
||||
lv_color_t color;
|
||||
|
||||
/**The width (thickness) of the arc */
|
||||
int32_t width;
|
||||
|
||||
/**The start angle in 1 degree units (if `LV_USE_FLOAT` is enabled a float number can be also used)
|
||||
* 0° is the 3 o'clock position, 90° is the 6 o'clock, etc. */
|
||||
lv_value_precise_t start_angle;
|
||||
|
||||
/**The end angle, similarly to start_angle. */
|
||||
lv_value_precise_t end_angle;
|
||||
|
||||
/**The center point of the arc. */
|
||||
lv_point_t center;
|
||||
|
||||
/**The outer radius of the arc*/
|
||||
uint16_t radius;
|
||||
|
||||
/**An image source to be used instead of `color`. `NULL` if unused*/
|
||||
const void * img_src;
|
||||
|
||||
/**Opacity of the arc in 0...255 range.
|
||||
* LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/
|
||||
lv_opa_t opa;
|
||||
|
||||
/**1: Make the arc ends rounded*/
|
||||
uint8_t rounded : 1;
|
||||
} lv_draw_arc_dsc_t;
|
||||
|
||||
|
||||
@@ -75,8 +75,9 @@ void lv_draw_layer(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv
|
||||
|
||||
lv_draw_task_t * t = lv_draw_add_task(layer, coords);
|
||||
|
||||
t->draw_dsc = lv_malloc(sizeof(*dsc));
|
||||
LV_ASSERT_MALLOC(t->draw_dsc);
|
||||
lv_draw_image_dsc_t * new_image_dsc = lv_malloc(sizeof(*dsc));
|
||||
LV_ASSERT_MALLOC(new_image_dsc);
|
||||
t->draw_dsc = new_image_dsc;
|
||||
lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc));
|
||||
t->type = LV_DRAW_TASK_TYPE_LAYER;
|
||||
t->state = LV_DRAW_TASK_STATE_WAITING;
|
||||
@@ -85,6 +86,11 @@ void lv_draw_layer(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv
|
||||
dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot);
|
||||
lv_area_move(&t->_real_area, coords->x1, coords->y1);
|
||||
|
||||
/*If the image_area is not set assume that it's the same as the rendering area */
|
||||
if(new_image_dsc->image_area.x2 == LV_COORD_MIN) {
|
||||
new_image_dsc->image_area = *coords;
|
||||
}
|
||||
|
||||
lv_layer_t * layer_to_draw = (lv_layer_t *)dsc->src;
|
||||
layer_to_draw->all_tasks_added = true;
|
||||
|
||||
@@ -119,6 +125,11 @@ void lv_draw_image(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv
|
||||
return;
|
||||
}
|
||||
|
||||
/*If the image_area is not set assume that it's the same as the rendering area */
|
||||
if(new_image_dsc->image_area.x2 == LV_COORD_MIN) {
|
||||
new_image_dsc->image_area = *image_coords;
|
||||
}
|
||||
|
||||
/*Typical case, draw the image as bitmap*/
|
||||
if(!(new_image_dsc->header.flags & LV_IMAGE_FLAGS_CUSTOM_DRAW)) {
|
||||
lv_draw_task_t * t = lv_draw_add_task(layer, image_coords);
|
||||
@@ -179,7 +190,6 @@ void lv_draw_image(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv
|
||||
lv_free(new_image_dsc);
|
||||
}
|
||||
|
||||
|
||||
LV_PROFILER_DRAW_END;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,35 +29,71 @@ extern "C" {
|
||||
struct _lv_draw_image_dsc_t {
|
||||
lv_draw_dsc_base_t base;
|
||||
|
||||
/**The image source: pointer to `lv_image_dsc_t` or a path to a file*/
|
||||
const void * src;
|
||||
|
||||
/**The header of the image. Initialized internally in `lv_draw_image` */
|
||||
lv_image_header_t header;
|
||||
|
||||
/**Clip the corner of the image with this radius. Use `LV_RADIUS_CIRCLE` for max. radius */
|
||||
int32_t clip_radius;
|
||||
|
||||
/**The rotation of the image in 0.1 degree unit. E.g. 234 means 23.4° */
|
||||
int32_t rotation;
|
||||
|
||||
/**Horizontal scale (zoom) of the image.
|
||||
* 256 (LV_SCALE_NONE): means no zoom, 512 double size, 128 half size.*/
|
||||
int32_t scale_x;
|
||||
|
||||
/**Same as `scale_y` but vertically*/
|
||||
int32_t scale_y;
|
||||
|
||||
/**Parallelogram like transformation of the image horizontally in 0.1 degree unit. E.g. 456 means 45.6°.*/
|
||||
int32_t skew_x;
|
||||
|
||||
/**Same as `skew_x` but vertically*/
|
||||
int32_t skew_y;
|
||||
|
||||
/**The pivot point of transformation (scale and rotation).
|
||||
* 0;0 is the top left corner of the image. Can be outside of the image too.*/
|
||||
lv_point_t pivot;
|
||||
|
||||
/**Mix this color to the images. In case of `LV_COLOR_FORMAT_A8` it will be the color of the visible pixels*/
|
||||
lv_color_t recolor;
|
||||
|
||||
/**The intensity of recoloring. 0 means, no recolor, 255 means full cover (transparent pixels remain transparent)*/
|
||||
lv_opa_t recolor_opa;
|
||||
|
||||
/**Opacity in 0...255 range.
|
||||
* LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/
|
||||
lv_opa_t opa;
|
||||
|
||||
/**Describes how to blend the pixels of the image to the background.
|
||||
* See `lv_blend_mode_t` for more details.
|
||||
*/
|
||||
lv_blend_mode_t blend_mode : 3;
|
||||
|
||||
/**1: perform the transformation with anti-alaising */
|
||||
uint16_t antialias : 1;
|
||||
|
||||
/**If the image is smaller than the `image_area` field of `lv_draw_image_dsc_t`
|
||||
* tile the image (repeat is both horizontally and vertically) to fill the
|
||||
* `image_area` area*/
|
||||
uint16_t tile : 1;
|
||||
|
||||
/**Used internally to store some information about the palette or the color of A8 images*/
|
||||
lv_draw_image_sup_t * sup;
|
||||
|
||||
/** Used to indicate the entire original, non-clipped area where the image is to be drawn.
|
||||
* This is important for:
|
||||
* 1. Layer rendering, where it might happen that only a smaller area of the layer is rendered.
|
||||
* 1. Layer rendering, where it might happen that only a smaller area of the layer is rendered and e.g.
|
||||
* `clip_radius` needs to know what the original image was.
|
||||
* 2. Tiled images, where the target draw area is larger than the image to be tiled.
|
||||
*/
|
||||
lv_area_t image_area;
|
||||
|
||||
int32_t clip_radius;
|
||||
|
||||
/**Pointer to an A8 or L8 image descriptor to mask the image with.
|
||||
* The mask is always center aligned. */
|
||||
const lv_image_dsc_t * bitmap_mask_src;
|
||||
};
|
||||
|
||||
@@ -105,7 +141,7 @@ void lv_draw_image(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv
|
||||
/**
|
||||
* Create a draw task to blend a layer to another layer
|
||||
* @param layer pointer to a layer
|
||||
* @param dsc pointer to an initialized draw descriptor
|
||||
* @param dsc pointer to an initialized draw descriptor. `src` must be set to the layer to blend
|
||||
* @param coords the coordinates of the layer.
|
||||
* @note `coords` can be small than the total widget area from which the layer is created
|
||||
* (if only a part of the widget was rendered to a layer)
|
||||
|
||||
@@ -32,39 +32,73 @@ extern "C" {
|
||||
typedef struct {
|
||||
lv_draw_dsc_base_t base;
|
||||
|
||||
/**The text to draw*/
|
||||
const char * text;
|
||||
uint32_t text_length;
|
||||
|
||||
/**The font to use. Fallback fonts are also handled.*/
|
||||
const lv_font_t * font;
|
||||
uint32_t sel_start;
|
||||
uint32_t sel_end;
|
||||
|
||||
/**Color of the text*/
|
||||
lv_color_t color;
|
||||
lv_color_t sel_color;
|
||||
lv_color_t sel_bg_color;
|
||||
|
||||
/**Extra space between the lines*/
|
||||
int32_t line_space;
|
||||
|
||||
/**Extra space between the characters*/
|
||||
int32_t letter_space;
|
||||
|
||||
/**Offset the text with this value horizontally*/
|
||||
int32_t ofs_x;
|
||||
|
||||
/**Offset the text with this value vertically*/
|
||||
int32_t ofs_y;
|
||||
|
||||
/**Rotation of the letters in 0.1 degree unit*/
|
||||
int32_t rotation;
|
||||
|
||||
/**The first characters index for selection (not byte index). `LV_DRAW_LABEL_NO_TXT_SEL` for no selection*/
|
||||
uint32_t sel_start;
|
||||
|
||||
/**The last characters's index for selection (not byte index). `LV_DRAW_LABEL_NO_TXT_SEL` for no selection*/
|
||||
uint32_t sel_end;
|
||||
|
||||
/**Color of the selected characters*/
|
||||
lv_color_t sel_color;
|
||||
|
||||
/**Background color of the selected characters*/
|
||||
lv_color_t sel_bg_color;
|
||||
|
||||
/**The number of characters to render. 0: means render until reaching the `\0` termination.*/
|
||||
uint32_t text_length;
|
||||
|
||||
/**Opacity of the text in 0...255 range.
|
||||
* LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/
|
||||
lv_opa_t opa;
|
||||
lv_base_dir_t bidi_dir;
|
||||
|
||||
/**The alignment of the text `LV_TEXT_ALIGN_LEFT/RIGHT/CENTER`*/
|
||||
lv_text_align_t align;
|
||||
lv_text_flag_t flag;
|
||||
|
||||
/**The base direction. Used when type setting Right-to-left (e.g. Arabic) texts*/
|
||||
lv_base_dir_t bidi_dir;
|
||||
|
||||
/**Text decoration, e.g. underline*/
|
||||
lv_text_decor_t decor : 3;
|
||||
lv_blend_mode_t blend_mode : 3;
|
||||
/**
|
||||
* < 1: malloc buffer and copy `text` there.
|
||||
* 0: `text` is const and it's pointer will be valid during rendering.*/
|
||||
|
||||
/**Some flags to control type setting*/
|
||||
lv_text_flag_t flag : 5;
|
||||
|
||||
/**1: malloc a buffer and copy `text` there.
|
||||
* 0: `text` will be valid during rendering.*/
|
||||
uint8_t text_local : 1;
|
||||
|
||||
/**
|
||||
* Indicate that the text is constant and its pointer can be safely saved e.g. in a cache.
|
||||
*/
|
||||
/**Indicate that the text is constant and its pointer can be safely saved e.g. in a cache.*/
|
||||
uint8_t text_static : 1;
|
||||
|
||||
/**
|
||||
* 1: already executed lv_bidi_process_paragraph.
|
||||
/**1: already executed lv_bidi_process_paragraph.
|
||||
* 0: has not been executed lv_bidi_process_paragraph.*/
|
||||
uint8_t has_bided : 1;
|
||||
|
||||
/**Pointer to an externally stored struct where some data can be cached to speed up rendering*/
|
||||
lv_draw_label_hint_t * hint;
|
||||
} lv_draw_label_dsc_t;
|
||||
|
||||
|
||||
@@ -28,17 +28,36 @@ extern "C" {
|
||||
typedef struct {
|
||||
lv_draw_dsc_base_t base;
|
||||
|
||||
/**The first point of the line. If `LV_USE_FLOAT` is enabled float number can be also used*/
|
||||
lv_point_precise_t p1;
|
||||
|
||||
/**The second point of the line. If `LV_USE_FLOAT` is enabled float number can be also used*/
|
||||
lv_point_precise_t p2;
|
||||
|
||||
/**The color of the line*/
|
||||
lv_color_t color;
|
||||
|
||||
/**The width (thickness) of the line*/
|
||||
int32_t width;
|
||||
|
||||
/** The length of a dash (0: don't dash)*/
|
||||
int32_t dash_width;
|
||||
|
||||
/** The length of the gaps between dashes (0: don't dash)*/
|
||||
int32_t dash_gap;
|
||||
|
||||
/**Opacity of the line in 0...255 range.
|
||||
* LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/
|
||||
lv_opa_t opa;
|
||||
lv_blend_mode_t blend_mode : 3;
|
||||
|
||||
/**Make the line start rounded*/
|
||||
uint8_t round_start : 1;
|
||||
|
||||
/**Make the line end rounded*/
|
||||
uint8_t round_end : 1;
|
||||
uint8_t raw_end : 1; /**< Do not bother with perpendicular line ending if it's not visible for any reason */
|
||||
|
||||
/**1: Do not bother with line ending (if it's not visible for any reason) */
|
||||
uint8_t raw_end : 1;
|
||||
} lv_draw_line_dsc_t;
|
||||
|
||||
/**********************
|
||||
|
||||
@@ -31,8 +31,15 @@ extern "C" {
|
||||
struct _lv_draw_mask_rect_dsc_t {
|
||||
lv_draw_dsc_base_t base;
|
||||
|
||||
/**The area t mask.*/
|
||||
lv_area_t area;
|
||||
|
||||
/**The radius of masking*/
|
||||
int32_t radius;
|
||||
|
||||
/**0: clear the content out of the `area`.
|
||||
* 1: don't touch the area out of `area`*/
|
||||
uint32_t keep_outside : 1;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -63,11 +63,29 @@ void lv_draw_fill_dsc_init(lv_draw_fill_dsc_t * dsc)
|
||||
dsc->base.dsc_size = sizeof(lv_draw_fill_dsc_t);
|
||||
}
|
||||
|
||||
|
||||
|
||||
lv_draw_fill_dsc_t * lv_draw_task_get_fill_dsc(lv_draw_task_t * task)
|
||||
{
|
||||
return task->type == LV_DRAW_TASK_TYPE_FILL ? (lv_draw_fill_dsc_t *)task->draw_dsc : NULL;
|
||||
}
|
||||
|
||||
void lv_draw_fill(lv_layer_t * layer, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords)
|
||||
{
|
||||
if(dsc->opa <= LV_OPA_MIN) return;
|
||||
|
||||
LV_PROFILER_DRAW_BEGIN;
|
||||
lv_draw_task_t * t = lv_draw_add_task(layer, coords);
|
||||
|
||||
t->draw_dsc = lv_malloc(sizeof(*dsc));
|
||||
LV_ASSERT_MALLOC(t->draw_dsc);
|
||||
lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc));
|
||||
t->type = LV_DRAW_TASK_TYPE_FILL;
|
||||
|
||||
lv_draw_finalize_task_creation(layer, t);
|
||||
LV_PROFILER_DRAW_END;
|
||||
}
|
||||
|
||||
void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc)
|
||||
{
|
||||
lv_memzero(dsc, sizeof(*dsc));
|
||||
@@ -81,6 +99,22 @@ lv_draw_border_dsc_t * lv_draw_task_get_border_dsc(lv_draw_task_t * task)
|
||||
return task->type == LV_DRAW_TASK_TYPE_BORDER ? (lv_draw_border_dsc_t *)task->draw_dsc : NULL;
|
||||
}
|
||||
|
||||
void lv_draw_border(lv_layer_t * layer, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords)
|
||||
{
|
||||
if(dsc->opa <= LV_OPA_MIN) return;
|
||||
|
||||
LV_PROFILER_DRAW_BEGIN;
|
||||
lv_draw_task_t * t = lv_draw_add_task(layer, coords);
|
||||
|
||||
t->draw_dsc = lv_malloc(sizeof(*dsc));
|
||||
LV_ASSERT_MALLOC(t->draw_dsc);
|
||||
lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc));
|
||||
t->type = LV_DRAW_TASK_TYPE_BORDER;
|
||||
|
||||
lv_draw_finalize_task_creation(layer, t);
|
||||
LV_PROFILER_DRAW_END;
|
||||
}
|
||||
|
||||
void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc)
|
||||
{
|
||||
lv_memzero(dsc, sizeof(*dsc));
|
||||
@@ -93,6 +127,22 @@ lv_draw_box_shadow_dsc_t * lv_draw_task_get_box_shadow_dsc(lv_draw_task_t * task
|
||||
return task->type == LV_DRAW_TASK_TYPE_BOX_SHADOW ? (lv_draw_box_shadow_dsc_t *)task->draw_dsc : NULL;
|
||||
}
|
||||
|
||||
void lv_draw_box_shadow(lv_layer_t * layer, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords)
|
||||
{
|
||||
if(dsc->opa <= LV_OPA_MIN) return;
|
||||
|
||||
LV_PROFILER_DRAW_BEGIN;
|
||||
lv_draw_task_t * t = lv_draw_add_task(layer, coords);
|
||||
|
||||
t->draw_dsc = lv_malloc(sizeof(*dsc));
|
||||
LV_ASSERT_MALLOC(t->draw_dsc);
|
||||
lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc));
|
||||
t->type = LV_DRAW_TASK_TYPE_BOX_SHADOW;
|
||||
|
||||
lv_draw_finalize_task_creation(layer, t);
|
||||
LV_PROFILER_DRAW_END;
|
||||
}
|
||||
|
||||
void lv_draw_rect(lv_layer_t * layer, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords)
|
||||
{
|
||||
|
||||
|
||||
@@ -71,21 +71,41 @@ typedef struct {
|
||||
typedef struct {
|
||||
lv_draw_dsc_base_t base;
|
||||
|
||||
/**Radius, LV_RADIUS_CIRCLE for max. radius */
|
||||
int32_t radius;
|
||||
|
||||
/**Opacity in 0...255 range.
|
||||
* LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/
|
||||
lv_opa_t opa;
|
||||
|
||||
/**The color of the rectangle.
|
||||
* If the gradient is set (grad.dir!=LV_GRAD_DIR_NONE) it's ignored. */
|
||||
lv_color_t color;
|
||||
|
||||
/**Describe a gradient. If `grad.dir` is not `LV_GRAD_DIR_NONE` `color` will be ignored*/
|
||||
lv_grad_dsc_t grad;
|
||||
} lv_draw_fill_dsc_t;
|
||||
|
||||
typedef struct {
|
||||
lv_draw_dsc_base_t base;
|
||||
|
||||
/**Radius, LV_RADIUS_CIRCLE for max. radius */
|
||||
int32_t radius;
|
||||
|
||||
/**The color of the border. */
|
||||
lv_color_t color;
|
||||
|
||||
|
||||
/**The width of the border in pixels */
|
||||
int32_t width;
|
||||
|
||||
/**Opacity in 0...255 range.
|
||||
* LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/
|
||||
lv_opa_t opa;
|
||||
|
||||
/**LV_BORDER_SIDE_NONE/LEFT/RIGHT/TOP/BOTTOM/FULL.
|
||||
* LV_BORDER_SIDE_INTERNAL is an information for upper layers
|
||||
* and shouldn't be used here. */
|
||||
lv_border_side_t side : 5;
|
||||
|
||||
} lv_draw_border_dsc_t;
|
||||
@@ -93,14 +113,30 @@ typedef struct {
|
||||
typedef struct {
|
||||
lv_draw_dsc_base_t base;
|
||||
|
||||
/**Radius, LV_RADIUS_CIRCLE for max. radius */
|
||||
int32_t radius;
|
||||
|
||||
/**Color of the the shadow */
|
||||
lv_color_t color;
|
||||
|
||||
/**Width of the shadow. (radius of the blur)*/
|
||||
int32_t width;
|
||||
|
||||
/**Make the rectangle larger with this value in all directions. Can be negative too. */
|
||||
int32_t spread;
|
||||
|
||||
/**Offset the rectangle horizontally.*/
|
||||
int32_t ofs_x;
|
||||
|
||||
/**Offset the rectangle vertically.*/
|
||||
int32_t ofs_y;
|
||||
|
||||
/**Opacity in 0...255 range.
|
||||
* LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/
|
||||
lv_opa_t opa;
|
||||
|
||||
/**Set `bg_cover` to 1 if the background will cover the shadow.
|
||||
* It's a hint to the renderer about it might skip some masking.*/
|
||||
uint8_t bg_cover : 1;
|
||||
} lv_draw_box_shadow_dsc_t;
|
||||
|
||||
@@ -127,6 +163,14 @@ void lv_draw_fill_dsc_init(lv_draw_fill_dsc_t * dsc);
|
||||
*/
|
||||
lv_draw_fill_dsc_t * lv_draw_task_get_fill_dsc(lv_draw_task_t * task);
|
||||
|
||||
/**
|
||||
* Fill an area
|
||||
* @param layer pointer to a layer
|
||||
* @param dsc pointer to an initialized draw descriptor variable
|
||||
* @param coords the coordinates of the rectangle
|
||||
*/
|
||||
void lv_draw_fill(lv_layer_t * layer, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords);
|
||||
|
||||
/**
|
||||
* Initialize a border draw descriptor.
|
||||
* @param dsc pointer to a draw descriptor
|
||||
@@ -140,6 +184,14 @@ void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc);
|
||||
*/
|
||||
lv_draw_border_dsc_t * lv_draw_task_get_border_dsc(lv_draw_task_t * task);
|
||||
|
||||
/**
|
||||
* Draw a border
|
||||
* @param layer pointer to a layer
|
||||
* @param dsc pointer to an initialized draw descriptor variable
|
||||
* @param coords the coordinates of the rectangle
|
||||
*/
|
||||
void lv_draw_border(lv_layer_t * layer, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords);
|
||||
|
||||
/**
|
||||
* Initialize a box shadow draw descriptor.
|
||||
* @param dsc pointer to a draw descriptor
|
||||
@@ -153,6 +205,14 @@ void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc);
|
||||
*/
|
||||
lv_draw_box_shadow_dsc_t * lv_draw_task_get_box_shadow_dsc(lv_draw_task_t * task);
|
||||
|
||||
/**
|
||||
* Draw a box shadow
|
||||
* @param layer pointer to a layer
|
||||
* @param dsc pointer to an initialized draw descriptor variable
|
||||
* @param coords the coordinates of the rectangle
|
||||
*/
|
||||
void lv_draw_box_shadow(lv_layer_t * layer, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords);
|
||||
|
||||
/**
|
||||
* The rectangle is a wrapper for fill, border, bg. image and box shadow.
|
||||
* Internally fill, border, image and box shadow draw tasks will be created.
|
||||
|
||||
@@ -42,12 +42,12 @@ void lv_draw_triangle_dsc_init(lv_draw_triangle_dsc_t * dsc)
|
||||
{
|
||||
LV_PROFILER_DRAW_BEGIN;
|
||||
lv_memzero(dsc, sizeof(lv_draw_triangle_dsc_t));
|
||||
dsc->bg_color = lv_color_white();
|
||||
dsc->bg_grad.stops[0].color = lv_color_white();
|
||||
dsc->bg_grad.stops[1].color = lv_color_black();
|
||||
dsc->bg_grad.stops[1].frac = 0xFF;
|
||||
dsc->bg_grad.stops_count = 2;
|
||||
dsc->bg_opa = LV_OPA_COVER;
|
||||
dsc->color = lv_color_white();
|
||||
dsc->grad.stops[0].color = lv_color_white();
|
||||
dsc->grad.stops[1].color = lv_color_black();
|
||||
dsc->grad.stops[1].frac = 0xFF;
|
||||
dsc->grad.stops_count = 2;
|
||||
dsc->opa = LV_OPA_COVER;
|
||||
dsc->base.dsc_size = sizeof(lv_draw_triangle_dsc_t);
|
||||
LV_PROFILER_DRAW_END;
|
||||
}
|
||||
@@ -59,7 +59,7 @@ lv_draw_triangle_dsc_t * lv_draw_task_get_triangle_dsc(lv_draw_task_t * task)
|
||||
|
||||
void lv_draw_triangle(lv_layer_t * layer, const lv_draw_triangle_dsc_t * dsc)
|
||||
{
|
||||
if(dsc->bg_opa <= LV_OPA_MIN) return;
|
||||
if(dsc->opa <= LV_OPA_MIN) return;
|
||||
|
||||
LV_PROFILER_DRAW_BEGIN;
|
||||
|
||||
|
||||
@@ -25,11 +25,19 @@ extern "C" {
|
||||
typedef struct {
|
||||
lv_draw_dsc_base_t base;
|
||||
|
||||
lv_opa_t bg_opa;
|
||||
lv_color_t bg_color;
|
||||
lv_grad_dsc_t bg_grad;
|
||||
|
||||
/**Points of the triangle. If `LV_USE_FLOAT` is enabled floats can be used here*/
|
||||
lv_point_precise_t p[3];
|
||||
|
||||
/**Color of the triangle*/
|
||||
lv_color_t color;
|
||||
|
||||
/**Opacity of the arc in 0...255 range.
|
||||
* LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/
|
||||
lv_opa_t opa;
|
||||
|
||||
/**Describe a gradient. If `grad.dir` is not `LV_GRAD_DIR_NONE` `color` will be ignored*/
|
||||
lv_grad_dsc_t grad;
|
||||
|
||||
} lv_draw_triangle_dsc_t;
|
||||
|
||||
/**********************
|
||||
|
||||
@@ -56,27 +56,29 @@ void lv_draw_sw_mask_rect(lv_draw_task_t * t, const lv_draw_mask_rect_dsc_t * ds
|
||||
|
||||
void * draw_buf = target_layer->draw_buf;
|
||||
|
||||
/*Clear the top part*/
|
||||
lv_area_set(&clear_area, t->clip_area.x1, t->clip_area.y1, t->clip_area.x2,
|
||||
dsc->area.y1 - 1);
|
||||
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
|
||||
lv_draw_buf_clear(draw_buf, &clear_area);
|
||||
if(dsc->keep_outside == 0) {
|
||||
/*Clear the top part*/
|
||||
lv_area_set(&clear_area, t->clip_area.x1, t->clip_area.y1, t->clip_area.x2,
|
||||
dsc->area.y1 - 1);
|
||||
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
|
||||
lv_draw_buf_clear(draw_buf, &clear_area);
|
||||
|
||||
/*Clear the bottom part*/
|
||||
lv_area_set(&clear_area, t->clip_area.x1, dsc->area.y2 + 1, t->clip_area.x2,
|
||||
t->clip_area.y2);
|
||||
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
|
||||
lv_draw_buf_clear(draw_buf, &clear_area);
|
||||
/*Clear the bottom part*/
|
||||
lv_area_set(&clear_area, t->clip_area.x1, dsc->area.y2 + 1, t->clip_area.x2,
|
||||
t->clip_area.y2);
|
||||
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
|
||||
lv_draw_buf_clear(draw_buf, &clear_area);
|
||||
|
||||
/*Clear the left part*/
|
||||
lv_area_set(&clear_area, t->clip_area.x1, dsc->area.y1, dsc->area.x1 - 1, dsc->area.y2);
|
||||
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
|
||||
lv_draw_buf_clear(draw_buf, &clear_area);
|
||||
/*Clear the left part*/
|
||||
lv_area_set(&clear_area, t->clip_area.x1, dsc->area.y1, dsc->area.x1 - 1, dsc->area.y2);
|
||||
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
|
||||
lv_draw_buf_clear(draw_buf, &clear_area);
|
||||
|
||||
/*Clear the right part*/
|
||||
lv_area_set(&clear_area, dsc->area.x2 + 1, dsc->area.y1, t->clip_area.x2, dsc->area.y2);
|
||||
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
|
||||
lv_draw_buf_clear(draw_buf, &clear_area);
|
||||
/*Clear the right part*/
|
||||
lv_area_set(&clear_area, dsc->area.x2 + 1, dsc->area.y1, t->clip_area.x2, dsc->area.y2);
|
||||
lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1);
|
||||
lv_draw_buf_clear(draw_buf, &clear_area);
|
||||
}
|
||||
|
||||
lv_draw_sw_mask_radius_param_t param;
|
||||
lv_draw_sw_mask_radius_init(¶m, &dsc->area, dsc->radius, false);
|
||||
|
||||
@@ -126,17 +126,17 @@ void lv_draw_sw_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc)
|
||||
lv_area_t blend_area = draw_area;
|
||||
blend_area.y2 = blend_area.y1;
|
||||
lv_draw_sw_blend_dsc_t blend_dsc;
|
||||
blend_dsc.color = dsc->bg_color;
|
||||
blend_dsc.opa = dsc->bg_opa;
|
||||
blend_dsc.color = dsc->color;
|
||||
blend_dsc.opa = dsc->opa;
|
||||
blend_dsc.mask_buf = mask_buf;
|
||||
blend_dsc.blend_area = &blend_area;
|
||||
blend_dsc.mask_area = &blend_area;
|
||||
blend_dsc.blend_mode = LV_BLEND_MODE_NORMAL;
|
||||
blend_dsc.src_buf = NULL;
|
||||
|
||||
lv_grad_dir_t grad_dir = dsc->bg_grad.dir;
|
||||
lv_grad_dir_t grad_dir = dsc->grad.dir;
|
||||
|
||||
lv_draw_sw_grad_calc_t * grad = lv_draw_sw_grad_get(&dsc->bg_grad, lv_area_get_width(&tri_area),
|
||||
lv_draw_sw_grad_calc_t * grad = lv_draw_sw_grad_get(&dsc->grad, lv_area_get_width(&tri_area),
|
||||
lv_area_get_height(&tri_area));
|
||||
lv_opa_t * grad_opa_map = NULL;
|
||||
if(grad && grad_dir == LV_GRAD_DIR_HOR) {
|
||||
@@ -156,7 +156,7 @@ void lv_draw_sw_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc)
|
||||
LV_ASSERT_NULL(grad);
|
||||
blend_dsc.color = grad->color_map[y - tri_area.y1];
|
||||
blend_dsc.opa = grad->opa_map[y - tri_area.y1];
|
||||
if(dsc->bg_opa < LV_OPA_MAX) blend_dsc.opa = LV_OPA_MIX2(blend_dsc.opa, dsc->bg_opa);
|
||||
if(dsc->opa < LV_OPA_MAX) blend_dsc.opa = LV_OPA_MIX2(blend_dsc.opa, dsc->opa);
|
||||
}
|
||||
else if(grad_dir == LV_GRAD_DIR_HOR) {
|
||||
if(grad_opa_map) {
|
||||
|
||||
@@ -131,7 +131,7 @@ void lv_draw_vg_lite_img(lv_draw_task_t * t, const lv_draw_image_dsc_t * dsc,
|
||||
lv_vg_lite_path_append_rect(
|
||||
path,
|
||||
0, 0,
|
||||
lv_area_get_width(coords), lv_area_get_height(coords),
|
||||
lv_area_get_width(&dsc->image_area), lv_area_get_height(&dsc->image_area),
|
||||
dsc->clip_radius);
|
||||
lv_vg_lite_path_set_transform(path, NULL);
|
||||
}
|
||||
|
||||
@@ -67,14 +67,14 @@ void lv_draw_vg_lite_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t *
|
||||
|
||||
vg_lite_matrix_t matrix = u->global_matrix;
|
||||
|
||||
if(dsc->bg_grad.dir != LV_GRAD_DIR_NONE) {
|
||||
if(dsc->grad.dir != LV_GRAD_DIR_NONE) {
|
||||
#if LV_USE_VECTOR_GRAPHIC
|
||||
lv_vg_lite_draw_grad_helper(
|
||||
u,
|
||||
&u->target_buffer,
|
||||
lv_vg_lite_path_get_path(path),
|
||||
&tri_area,
|
||||
&dsc->bg_grad,
|
||||
&dsc->grad,
|
||||
&matrix,
|
||||
VG_LITE_FILL_EVEN_ODD,
|
||||
VG_LITE_BLEND_SRC_OVER);
|
||||
@@ -89,7 +89,7 @@ void lv_draw_vg_lite_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t *
|
||||
VG_LITE_FILL_EVEN_ODD,
|
||||
&matrix,
|
||||
VG_LITE_BLEND_SRC_OVER,
|
||||
lv_vg_lite_color(dsc->bg_color, dsc->bg_opa, true));
|
||||
lv_vg_lite_color(dsc->color, dsc->opa, true));
|
||||
}
|
||||
|
||||
lv_vg_lite_path_drop(u, path);
|
||||
|
||||
@@ -70,7 +70,7 @@ typedef enum {
|
||||
LV_EVENT_DRAW_POST_BEGIN, /**< Starting the post draw phase (when all children are drawn)*/
|
||||
LV_EVENT_DRAW_POST, /**< Perform the post draw phase (when all children are drawn)*/
|
||||
LV_EVENT_DRAW_POST_END, /**< Finishing the post draw phase (when all children are drawn)*/
|
||||
LV_EVENT_DRAW_TASK_ADDED, /**< Adding a draw task */
|
||||
LV_EVENT_DRAW_TASK_ADDED, /**< Adding a draw task. The `LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS` flag needs to be set */
|
||||
|
||||
/** Special events */
|
||||
LV_EVENT_VALUE_CHANGED, /**< Widget's value has changed (i.e. slider moved)*/
|
||||
|
||||
@@ -55,7 +55,6 @@ static const lv_font_t * lv_span_get_style_text_font(lv_obj_t * par, lv_span_t *
|
||||
static int32_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * span);
|
||||
static lv_color_t lv_span_get_style_text_color(lv_obj_t * par, lv_span_t * span);
|
||||
static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span);
|
||||
static lv_blend_mode_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span_t * span);
|
||||
static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span);
|
||||
|
||||
static inline void span_text_check(const char ** text);
|
||||
@@ -880,20 +879,6 @@ static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span)
|
||||
return opa;
|
||||
}
|
||||
|
||||
static lv_blend_mode_t lv_span_get_style_text_blend_mode(lv_obj_t * par, lv_span_t * span)
|
||||
{
|
||||
lv_blend_mode_t mode;
|
||||
lv_style_value_t value;
|
||||
lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_BLEND_MODE, &value);
|
||||
if(res != LV_STYLE_RES_FOUND) {
|
||||
mode = (lv_blend_mode_t)lv_obj_get_style_blend_mode(par, LV_PART_MAIN);
|
||||
}
|
||||
else {
|
||||
mode = (lv_blend_mode_t)value.num;
|
||||
}
|
||||
return mode;
|
||||
}
|
||||
|
||||
static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span)
|
||||
{
|
||||
int32_t decor;
|
||||
@@ -1183,7 +1168,6 @@ static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer)
|
||||
label_draw_dsc.color = lv_span_get_style_text_color(obj, pinfo->span);
|
||||
label_draw_dsc.opa = lv_span_get_style_text_opa(obj, pinfo->span);
|
||||
label_draw_dsc.font = lv_span_get_style_text_font(obj, pinfo->span);
|
||||
label_draw_dsc.blend_mode = lv_span_get_style_text_blend_mode(obj, pinfo->span);
|
||||
if(obj_opa < LV_OPA_MAX) {
|
||||
label_draw_dsc.opa = LV_OPA_MIX2(label_draw_dsc.opa, obj_opa);
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 155 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 54 KiB |