add style.body.shadow.offset/spread/opa attributes

This commit is contained in:
Gabor Kiss-Vamosi
2019-09-05 20:52:04 +02:00
parent a51ffce1b4
commit 424ece6628
9 changed files with 47 additions and 37 deletions

View File

@@ -18,9 +18,10 @@
#include "../lv_misc/lv_async.h" #include "../lv_misc/lv_async.h"
#include "../lv_misc/lv_fs.h" #include "../lv_misc/lv_fs.h"
#include "../lv_hal/lv_hal.h" #include "../lv_hal/lv_hal.h"
#include "../lv_misc/lv_gc.h"
#include "../lv_misc/lv_math.h"
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include "../lv_misc/lv_gc.h"
#if defined(LV_GC_INCLUDE) #if defined(LV_GC_INCLUDE)
#include LV_GC_INCLUDE #include LV_GC_INCLUDE
@@ -2186,7 +2187,11 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param)
/*Return 'invalid' if the child change signal is not enabled*/ /*Return 'invalid' if the child change signal is not enabled*/
if(lv_obj_is_protected(obj, LV_PROTECT_CHILD_CHG) != false) res = LV_RES_INV; if(lv_obj_is_protected(obj, LV_PROTECT_CHILD_CHG) != false) res = LV_RES_INV;
} else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) {
if(style->body.shadow.width > obj->ext_draw_pad) obj->ext_draw_pad = style->body.shadow.width; lv_coord_t shadow = (style->body.shadow.width >> 1) + 1;
shadow += style->body.shadow.spread;
shadow += LV_MATH_MAX(style->body.shadow.offset.x, style->body.shadow.offset.y);
if(shadow > obj->ext_draw_pad) obj->ext_draw_pad = shadow;
} else if(sign == LV_SIGNAL_STYLE_CHG) { } else if(sign == LV_SIGNAL_STYLE_CHG) {
lv_obj_refresh_ext_draw_pad(obj); lv_obj_refresh_ext_draw_pad(obj);
} else if(sign == LV_SIGNAL_GET_TYPE) { } else if(sign == LV_SIGNAL_GET_TYPE) {

View File

@@ -87,8 +87,11 @@ void lv_style_init(void)
lv_style_scr.body.border.part = LV_BORDER_FULL; lv_style_scr.body.border.part = LV_BORDER_FULL;
lv_style_scr.body.shadow.color = LV_COLOR_GRAY; lv_style_scr.body.shadow.color = LV_COLOR_GRAY;
lv_style_scr.body.shadow.type = LV_SHADOW_FULL;
lv_style_scr.body.shadow.width = 0; lv_style_scr.body.shadow.width = 0;
lv_style_scr.body.shadow.opa = LV_OPA_COVER;
lv_style_scr.body.shadow.offset.x = 0;
lv_style_scr.body.shadow.offset.y = 0;
lv_style_scr.body.shadow.spread = 0;
lv_style_scr.text.opa = LV_OPA_COVER; lv_style_scr.text.opa = LV_OPA_COVER;
lv_style_scr.text.color = lv_color_make(0x30, 0x30, 0x30); lv_style_scr.text.color = lv_color_make(0x30, 0x30, 0x30);
@@ -163,7 +166,7 @@ void lv_style_init(void)
lv_style_copy(&lv_style_btn_rel, &lv_style_plain); lv_style_copy(&lv_style_btn_rel, &lv_style_plain);
lv_style_btn_rel.body.main_color = lv_color_make(0x76, 0xa2, 0xd0); lv_style_btn_rel.body.main_color = lv_color_make(0x76, 0xa2, 0xd0);
lv_style_btn_rel.body.grad_color = lv_color_make(0x19, 0x3a, 0x5d); lv_style_btn_rel.body.grad_color = lv_color_make(0x19, 0x3a, 0x5d);
lv_style_btn_rel.body.radius = LV_RADIUS_CIRCLE; //LV_DPI / 15; lv_style_btn_rel.body.radius = 5;//LV_RADIUS_CIRCLE; //LV_DPI / 15;
lv_style_btn_rel.body.opa = 200; lv_style_btn_rel.body.opa = 200;
lv_style_btn_rel.body.padding.left = LV_DPI / 4; lv_style_btn_rel.body.padding.left = LV_DPI / 4;
lv_style_btn_rel.body.padding.right = LV_DPI / 4; lv_style_btn_rel.body.padding.right = LV_DPI / 4;
@@ -174,7 +177,10 @@ void lv_style_init(void)
lv_style_btn_rel.body.border.width = 2;//LV_DPI / 50 >= 1 ? LV_DPI / 50 : 1; lv_style_btn_rel.body.border.width = 2;//LV_DPI / 50 >= 1 ? LV_DPI / 50 : 1;
lv_style_btn_rel.body.border.opa = LV_OPA_10; lv_style_btn_rel.body.border.opa = LV_OPA_10;
lv_style_btn_rel.body.shadow.color = LV_COLOR_BLACK; lv_style_btn_rel.body.shadow.color = LV_COLOR_BLACK;
lv_style_btn_rel.body.shadow.width = 40; lv_style_btn_rel.body.shadow.width = 6;
// lv_style_btn_rel.body.shadow.spread = 15;
lv_style_btn_rel.body.shadow.offset.x = -5;
lv_style_btn_rel.body.shadow.offset.y = 5;
lv_style_btn_rel.text.color = lv_color_make(0xff, 0xff, 0xff); lv_style_btn_rel.text.color = lv_color_make(0xff, 0xff, 0xff);
lv_style_btn_rel.image.color = lv_color_make(0xff, 0xff, 0xff); lv_style_btn_rel.image.color = lv_color_make(0xff, 0xff, 0xff);
@@ -237,6 +243,9 @@ void lv_style_mix(const lv_style_t * start, const lv_style_t * end, lv_style_t *
STYLE_ATTR_MIX(body.border.width, ratio); STYLE_ATTR_MIX(body.border.width, ratio);
STYLE_ATTR_MIX(body.border.opa, ratio); STYLE_ATTR_MIX(body.border.opa, ratio);
STYLE_ATTR_MIX(body.shadow.width, ratio); STYLE_ATTR_MIX(body.shadow.width, ratio);
STYLE_ATTR_MIX(body.shadow.offset.x, ratio);
STYLE_ATTR_MIX(body.shadow.offset.y, ratio);
STYLE_ATTR_MIX(body.shadow.spread, ratio);
STYLE_ATTR_MIX(body.padding.left, ratio); STYLE_ATTR_MIX(body.padding.left, ratio);
STYLE_ATTR_MIX(body.padding.right, ratio); STYLE_ATTR_MIX(body.padding.right, ratio);
STYLE_ATTR_MIX(body.padding.top, ratio); STYLE_ATTR_MIX(body.padding.top, ratio);
@@ -264,13 +273,11 @@ void lv_style_mix(const lv_style_t * start, const lv_style_t * end, lv_style_t *
res->body.border.part = start->body.border.part; res->body.border.part = start->body.border.part;
res->glass = start->glass; res->glass = start->glass;
res->text.font = start->text.font; res->text.font = start->text.font;
res->body.shadow.type = start->body.shadow.type;
res->line.rounded = start->line.rounded; res->line.rounded = start->line.rounded;
} else { } else {
res->body.border.part = end->body.border.part; res->body.border.part = end->body.border.part;
res->glass = end->glass; res->glass = end->glass;
res->text.font = end->text.font; res->text.font = end->text.font;
res->body.shadow.type = end->body.shadow.type;
res->line.rounded = end->line.rounded; res->line.rounded = end->line.rounded;
} }
} }

View File

@@ -40,15 +40,8 @@ enum {
}; };
typedef uint8_t lv_border_part_t; typedef uint8_t lv_border_part_t;
/*Shadow types*/
enum {
LV_SHADOW_BOTTOM = 0, /**< Only draw bottom shadow */
LV_SHADOW_FULL, /**< Draw shadow on all sides */
};
typedef uint8_t lv_shadow_type_t;
/** /**
* Objects in LittlevGL can be assigned a style - which holds information about * Styles can be assigned to objects - which holds information about
* how the object should be drawn. * how the object should be drawn.
* *
* This allows for easy customization without having to modify the object's design * This allows for easy customization without having to modify the object's design
@@ -79,7 +72,9 @@ typedef struct
{ {
lv_color_t color; lv_color_t color;
lv_coord_t width; lv_coord_t width;
lv_shadow_type_t type; /**< Which parts of the shadow to draw */ lv_coord_t spread;
lv_point_t offset;
lv_opa_t opa;
} shadow; } shadow;
struct struct

View File

@@ -344,18 +344,19 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s
static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale) static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale)
{ {
if(style->body.shadow.width == 0) return; /*Check whether the shadow is visible*/
if(style->body.shadow.width == 0 && style->body.shadow.offset.x == 0 &&
style->body.shadow.offset.y == 0 && style->body.shadow.spread <= 0) {
return;
}
lv_coord_t sw = style->body.shadow.width; lv_coord_t sw = style->body.shadow.width;
lv_coord_t x_ofs = 0;
lv_coord_t y_ofs = 0;
lv_area_t sh_area; lv_area_t sh_area;
sh_area.x1 = coords->x1 - sw / 2 - 1 + x_ofs; sh_area.x1 = coords->x1 - sw / 2 - 1 + style->body.shadow.offset.x - style->body.shadow.spread;
sh_area.x2 = coords->x2 + sw / 2 + 1 + x_ofs; sh_area.x2 = coords->x2 + sw / 2 + 1 + style->body.shadow.offset.x + style->body.shadow.spread;
sh_area.y1 = coords->y1 - sw / 2 - 1 + y_ofs; sh_area.y1 = coords->y1 - sw / 2 - 1 + style->body.shadow.offset.y - style->body.shadow.spread;
sh_area.y2 = coords->y2 + sw / 2 + 1 + y_ofs; sh_area.y2 = coords->y2 + sw / 2 + 1 + style->body.shadow.offset.y + style->body.shadow.spread;
lv_opa_t opa = style->body.opa; lv_opa_t opa = style->body.opa;
@@ -540,7 +541,7 @@ static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const
} }
first_px = 0; first_px = 0;
if(disp_area->x1 > a.x1) { if(disp_area->x1 >= a.x1) {
first_px = disp_area->x1 - a.x1; first_px = disp_area->x1 - a.x1;
a.x1 += first_px; a.x1 += first_px;
} }
@@ -621,7 +622,7 @@ static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const
sh_buf_tmp = sh_buf + corner_size - 1; sh_buf_tmp = sh_buf + corner_size - 1;
y_max = corner_size; y_max = corner_size;
if(other_mask_cnt == 0) y_max = sw / 2 + 1 - y_ofs; if(other_mask_cnt == 0) y_max = sw / 2 + 1 - style->body.shadow.offset.y;
for(y = 0; y < y_max; y++) { for(y = 0; y < y_max; y++) {
if(other_mask_cnt != 0) { if(other_mask_cnt != 0) {
@@ -672,10 +673,13 @@ static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const
} }
#define SHADOW_UPSACALE_SHIFT 6 #define SHADOW_UPSACALE_SHIFT 6
#define SHADOW_ENHANCE 0 #define SHADOW_ENHANCE 1
static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, lv_coord_t sw, lv_coord_t r) static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, lv_coord_t sw, lv_coord_t r)
{ {
if(sw == 0) sw = 1;
lv_coord_t size = sw + r; lv_coord_t size = sw + r;
lv_area_t sh_area; lv_area_t sh_area;
@@ -692,6 +696,7 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf,
#if SHADOW_ENHANCE #if SHADOW_ENHANCE
sw = sw/2; sw = sw/2;
if(sw == 0) sw = 1;
#endif #endif
lv_mask_res_t mask_res; lv_mask_res_t mask_res;
@@ -727,6 +732,14 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf,
// return; // return;
if(sw == 1) {
lv_coord_t i;
for(i = 0; i < size * size; i++) {
sh_buf[i] = (sh_ups_buf[i] >> SHADOW_UPSACALE_SHIFT);
}
return;
}
shadow_blur_corner(size, sw, sh_buf, sh_ups_buf); shadow_blur_corner(size, sw, sh_buf, sh_ups_buf);

View File

@@ -85,7 +85,6 @@ static void basic_init(void)
def.body.border.opa = LV_OPA_COVER; def.body.border.opa = LV_OPA_COVER;
def.body.shadow.color = LV_COLOR_SILVER; def.body.shadow.color = LV_COLOR_SILVER;
def.body.shadow.width = 0; def.body.shadow.width = 0;
def.body.shadow.type = LV_SHADOW_FULL;
def.text.color = lv_color_hex3(0xDDD); def.text.color = lv_color_hex3(0xDDD);
def.text.font = _font; def.text.font = _font;

View File

@@ -72,7 +72,6 @@ static void basic_init(void)
panel.body.border.color = lv_color_hex3(0xbbb); panel.body.border.color = lv_color_hex3(0xbbb);
panel.body.border.opa = LV_OPA_COVER; panel.body.border.opa = LV_OPA_COVER;
panel.body.shadow.color = DEF_SHADOW_COLOR; panel.body.shadow.color = DEF_SHADOW_COLOR;
panel.body.shadow.type = LV_SHADOW_BOTTOM;
panel.body.shadow.width = 4; panel.body.shadow.width = 4;
panel.body.padding.left = LV_DPI / 8; panel.body.padding.left = LV_DPI / 8;
panel.body.padding.right = LV_DPI / 8; panel.body.padding.right = LV_DPI / 8;
@@ -117,7 +116,6 @@ static void btn_init(void)
rel.body.padding.bottom = LV_DPI / 8; rel.body.padding.bottom = LV_DPI / 8;
rel.body.padding.inner = LV_DPI / 10; rel.body.padding.inner = LV_DPI / 10;
rel.body.shadow.color = DEF_SHADOW_COLOR; rel.body.shadow.color = DEF_SHADOW_COLOR;
rel.body.shadow.type = LV_SHADOW_BOTTOM;
rel.body.shadow.width = 6; rel.body.shadow.width = 6;
rel.text.color = lv_color_hsv_to_rgb(_hue, 5, 95); rel.text.color = lv_color_hsv_to_rgb(_hue, 5, 95);
rel.image.color = lv_color_hsv_to_rgb(_hue, 5, 95); rel.image.color = lv_color_hsv_to_rgb(_hue, 5, 95);
@@ -273,7 +271,6 @@ static void sw_init(void)
lv_style_copy(&sw_knob_on, theme.style.slider.knob); lv_style_copy(&sw_knob_on, theme.style.slider.knob);
sw_knob_on.body.shadow.width = 3; sw_knob_on.body.shadow.width = 3;
sw_knob_on.body.shadow.type = LV_SHADOW_BOTTOM;
sw_knob_on.body.shadow.color = DEF_SHADOW_COLOR; sw_knob_on.body.shadow.color = DEF_SHADOW_COLOR;
lv_style_copy(&sw_knob_off, &sw_knob_on); lv_style_copy(&sw_knob_off, &sw_knob_on);
@@ -406,7 +403,6 @@ static void cb_init(void)
#if LV_USE_CB != 0 #if LV_USE_CB != 0
static lv_style_t rel, pr, tgl_rel, tgl_pr, ina; static lv_style_t rel, pr, tgl_rel, tgl_pr, ina;
lv_style_copy(&rel, theme.style.panel); lv_style_copy(&rel, theme.style.panel);
rel.body.shadow.type = LV_SHADOW_BOTTOM;
rel.body.shadow.width = 3; rel.body.shadow.width = 3;
lv_style_copy(&pr, &rel); lv_style_copy(&pr, &rel);
@@ -417,7 +413,6 @@ static void cb_init(void)
lv_style_copy(&tgl_rel, &rel); lv_style_copy(&tgl_rel, &rel);
tgl_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 75, 85); tgl_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 75, 85);
tgl_rel.body.grad_color = tgl_rel.body.main_color; tgl_rel.body.grad_color = tgl_rel.body.main_color;
tgl_rel.body.shadow.type = LV_SHADOW_FULL;
tgl_rel.body.shadow.width = 0; tgl_rel.body.shadow.width = 0;
lv_style_copy(&tgl_pr, &tgl_rel); lv_style_copy(&tgl_pr, &tgl_rel);
@@ -688,7 +683,6 @@ static void tabview_init(void)
btn_bg.body.border.opa = LV_OPA_COVER; btn_bg.body.border.opa = LV_OPA_COVER;
btn_bg.body.shadow.width = 5; btn_bg.body.shadow.width = 5;
btn_bg.body.shadow.color = DEF_SHADOW_COLOR; btn_bg.body.shadow.color = DEF_SHADOW_COLOR;
btn_bg.body.shadow.type = LV_SHADOW_BOTTOM;
btn_bg.body.padding.inner = 0; btn_bg.body.padding.inner = 0;
btn_bg.body.padding.left = 0; btn_bg.body.padding.left = 0;
btn_bg.body.padding.right = 0; btn_bg.body.padding.right = 0;

View File

@@ -157,7 +157,6 @@ static void led_init(void)
led.body.radius = LV_RADIUS_CIRCLE; led.body.radius = LV_RADIUS_CIRCLE;
led.body.shadow.width = LV_DPI / 8; led.body.shadow.width = LV_DPI / 8;
led.body.shadow.color = LV_COLOR_BLACK; led.body.shadow.color = LV_COLOR_BLACK;
led.body.shadow.type = LV_SHADOW_FULL;
theme.style.led = &led; theme.style.led = &led;
#endif #endif

View File

@@ -87,7 +87,6 @@ static void basic_init(void)
def.body.border.opa = LV_OPA_COVER; def.body.border.opa = LV_OPA_COVER;
def.body.shadow.color = LV_COLOR_SILVER; def.body.shadow.color = LV_COLOR_SILVER;
def.body.shadow.width = 0; def.body.shadow.width = 0;
def.body.shadow.type = LV_SHADOW_FULL;
def.text.color = lv_color_hex3(0xDDD); def.text.color = lv_color_hex3(0xDDD);
def.text.font = _font; def.text.font = _font;

View File

@@ -115,7 +115,6 @@ static void btn_init(void)
btn_rel.body.padding.right = LV_DPI / 4; btn_rel.body.padding.right = LV_DPI / 4;
btn_rel.body.padding.top = LV_DPI / 8; btn_rel.body.padding.top = LV_DPI / 8;
btn_rel.body.padding.bottom = LV_DPI / 8; btn_rel.body.padding.bottom = LV_DPI / 8;
btn_rel.body.shadow.type = LV_SHADOW_BOTTOM;
btn_rel.body.shadow.color = lv_color_hex3(0x111); btn_rel.body.shadow.color = lv_color_hex3(0x111);
btn_rel.body.shadow.width = LV_DPI / 30; btn_rel.body.shadow.width = LV_DPI / 30;
btn_rel.text.color = lv_color_hex3(0xeee); btn_rel.text.color = lv_color_hex3(0xeee);