feat(draw): add non uniform scale (scale_x and scale_y)
@ -155,7 +155,8 @@ static void slider_event_cb(lv_event_t * e)
|
||||
{
|
||||
lv_obj_t * slider = lv_event_get_target(e);
|
||||
int32_t v = lv_slider_get_value(slider);
|
||||
lv_obj_set_style_transform_scale(card_to_transform, v, 0);
|
||||
lv_obj_set_style_transform_scale_x(card_to_transform, v, 0);
|
||||
lv_obj_set_style_transform_scale_y(card_to_transform, v, 0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -120,8 +120,17 @@ Move the object with this value in Y direction. Applied after layouts, aligns an
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Ext. draw</strong> No</li>
|
||||
</ul>
|
||||
|
||||
### transform_scale
|
||||
Zoom an objects. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 half size, 512 double size, and so on
|
||||
### transform_scale_x
|
||||
Zoom an objects horizontally. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 half size, 512 double size, and so on
|
||||
<ul>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Default</strong> 0</li>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Inherited</strong> No</li>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Layout</strong> Yes</li>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Ext. draw</strong> Yes</li>
|
||||
</ul>
|
||||
|
||||
### transform_scale_y
|
||||
Zoom an objects vertically. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 half size, 512 double size, and so on
|
||||
<ul>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Default</strong> 0</li>
|
||||
<li style='display:inline; margin-right: 20px; margin-left: 0px'><strong>Inherited</strong> No</li>
|
||||
|
@ -58,9 +58,13 @@ props = [
|
||||
'style_type': 'num', 'var_type': 'lv_coord_t', 'default':0, 'inherited': 0, 'layout': 1, 'ext_draw': 0,
|
||||
'dsc': "Move the object with this value in Y direction. Applied after layouts, aligns and other positioning. Pixel and percentage (with `lv_pct(x)`) values can be used. Percentage values are relative to the object's height." },
|
||||
|
||||
{'name': 'TRANSFORM_SCALE',
|
||||
{'name': 'TRANSFORM_SCALE_X',
|
||||
'style_type': 'num', 'var_type': 'lv_coord_t', 'default':0, 'inherited': 0, 'layout': 1, 'ext_draw': 1,
|
||||
'dsc': "Zoom an objects. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 half size, 512 double size, and so on" },
|
||||
'dsc': "Zoom an objects horizontally. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 half size, 512 double size, and so on" },
|
||||
|
||||
{'name': 'TRANSFORM_SCALE_Y',
|
||||
'style_type': 'num', 'var_type': 'lv_coord_t', 'default':0, 'inherited': 0, 'layout': 1, 'ext_draw': 1,
|
||||
'dsc': "Zoom an objects vertically. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 half size, 512 double size, and so on" },
|
||||
|
||||
{'name': 'TRANSFORM_ROTATION',
|
||||
'style_type': 'num', 'var_type': 'lv_coord_t', 'default':0, 'inherited': 0, 'layout': 1, 'ext_draw': 1,
|
||||
|
@ -187,7 +187,8 @@ void lv_obj_init_draw_image_dsc(lv_obj_t * obj, uint32_t part, lv_draw_image_dsc
|
||||
if(draw_dsc->opa <= LV_OPA_MIN) return;
|
||||
|
||||
draw_dsc->rotation = 0;
|
||||
draw_dsc->zoom = LV_SCALE_NONE;
|
||||
draw_dsc->zoom_x = LV_SCALE_NONE;
|
||||
draw_dsc->zoom_y = LV_SCALE_NONE;
|
||||
draw_dsc->pivot.x = lv_area_get_width(&obj->coords) / 2;
|
||||
draw_dsc->pivot.y = lv_area_get_height(&obj->coords) / 2;
|
||||
|
||||
|
@ -1118,9 +1118,10 @@ static void layout_update_core(lv_obj_t * obj)
|
||||
static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv)
|
||||
{
|
||||
lv_coord_t angle = lv_obj_get_style_transform_rotation(obj, 0);
|
||||
lv_coord_t zoom = lv_obj_get_style_transform_scale_safe(obj, 0);
|
||||
lv_coord_t zoom_x = lv_obj_get_style_transform_scale_x_safe(obj, 0);
|
||||
lv_coord_t zoom_y = lv_obj_get_style_transform_scale_y_safe(obj, 0);
|
||||
|
||||
if(angle == 0 && zoom == LV_SCALE_NONE) return;
|
||||
if(angle == 0 && zoom_x == LV_SCALE_NONE && zoom_y == LV_SCALE_NONE) return;
|
||||
|
||||
lv_point_t pivot = {
|
||||
.x = lv_obj_get_style_transform_pivot_x(obj, 0),
|
||||
@ -1139,8 +1140,9 @@ static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv)
|
||||
|
||||
if(inv) {
|
||||
angle = -angle;
|
||||
zoom = (256 * 256) / zoom;
|
||||
zoom_x = (256 * 256) / zoom_x;
|
||||
zoom_y = (256 * 256) / zoom_y;
|
||||
}
|
||||
|
||||
lv_point_transform(p, angle, zoom, &pivot);
|
||||
lv_point_transform(p, angle, zoom_x, zoom_y, &pivot, !inv);
|
||||
}
|
||||
|
@ -319,7 +319,8 @@ static inline lv_style_value_t lv_style_prop_get_default_inlined(lv_style_prop_t
|
||||
const lv_color_t black = LV_COLOR_MAKE(0x00, 0x00, 0x00);
|
||||
const lv_color_t white = LV_COLOR_MAKE(0xff, 0xff, 0xff);
|
||||
switch(prop) {
|
||||
case LV_STYLE_TRANSFORM_SCALE:
|
||||
case LV_STYLE_TRANSFORM_SCALE_X:
|
||||
case LV_STYLE_TRANSFORM_SCALE_Y:
|
||||
return (lv_style_value_t) {
|
||||
.num = LV_SCALE_NONE
|
||||
};
|
||||
@ -606,8 +607,6 @@ _lv_style_state_cmp_t _lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t sta
|
||||
else if(lv_style_get_prop(style, LV_STYLE_MIN_HEIGHT, &v)) layout_diff = true;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_MAX_HEIGHT, &v)) layout_diff = true;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_BORDER_WIDTH, &v)) layout_diff = true;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ROTATION, &v)) layout_diff = true;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE, &v)) layout_diff = true;
|
||||
|
||||
if(layout_diff) {
|
||||
return _LV_STYLE_STATE_CMP_DIFF_LAYOUT;
|
||||
@ -617,7 +616,8 @@ _lv_style_state_cmp_t _lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t sta
|
||||
if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_HEIGHT, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ROTATION, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_X, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_Y, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_OPA, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_PAD, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD;
|
||||
else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_WIDTH, &v)) res = _LV_STYLE_STATE_CMP_DIFF_DRAW_PAD;
|
||||
@ -1043,7 +1043,8 @@ static void trans_anim_ready_cb(lv_anim_t * a)
|
||||
static lv_layer_type_t calculate_layer_type(lv_obj_t * obj)
|
||||
{
|
||||
if(lv_obj_get_style_transform_rotation(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM;
|
||||
if(lv_obj_get_style_transform_scale(obj, 0) != 256) return LV_LAYER_TYPE_TRANSFORM;
|
||||
if(lv_obj_get_style_transform_scale_x(obj, 0) != 256) return LV_LAYER_TYPE_TRANSFORM;
|
||||
if(lv_obj_get_style_transform_scale_y(obj, 0) != 256) return LV_LAYER_TYPE_TRANSFORM;
|
||||
if(lv_obj_get_style_opa_layered(obj, 0) != LV_OPA_COVER) return LV_LAYER_TYPE_SIMPLE;
|
||||
if(lv_obj_get_style_blend_mode(obj, 0) != LV_BLEND_MODE_NORMAL) return LV_LAYER_TYPE_SIMPLE;
|
||||
return LV_LAYER_TYPE_NONE;
|
||||
|
@ -279,6 +279,13 @@ static inline void lv_obj_set_style_size(struct _lv_obj_t * obj, lv_coord_t widt
|
||||
lv_obj_set_style_height(obj, height, selector);
|
||||
}
|
||||
|
||||
static inline void lv_obj_set_style_transform_scale(struct _lv_obj_t * obj, lv_coord_t value,
|
||||
lv_style_selector_t selector)
|
||||
{
|
||||
lv_obj_set_style_transform_scale_x(obj, value, selector);
|
||||
lv_obj_set_style_transform_scale_y(obj, value, selector);
|
||||
}
|
||||
|
||||
static inline lv_coord_t lv_obj_get_style_space_left(const struct _lv_obj_t * obj, uint32_t part)
|
||||
{
|
||||
lv_coord_t padding = lv_obj_get_style_pad_left(obj, part);
|
||||
@ -313,9 +320,15 @@ static inline lv_coord_t lv_obj_get_style_space_bottom(const struct _lv_obj_t *
|
||||
|
||||
lv_text_align_t lv_obj_calculate_style_text_align(const struct _lv_obj_t * obj, lv_part_t part, const char * txt);
|
||||
|
||||
static inline lv_coord_t lv_obj_get_style_transform_scale_safe(const struct _lv_obj_t * obj, uint32_t part)
|
||||
static inline lv_coord_t lv_obj_get_style_transform_scale_x_safe(const struct _lv_obj_t * obj, uint32_t part)
|
||||
{
|
||||
int16_t zoom = lv_obj_get_style_transform_scale(obj, part);
|
||||
int16_t zoom = lv_obj_get_style_transform_scale_x(obj, part);
|
||||
return zoom != 0 ? zoom : 1;
|
||||
}
|
||||
|
||||
static inline lv_coord_t lv_obj_get_style_transform_scale_y_safe(const struct _lv_obj_t * obj, uint32_t part)
|
||||
{
|
||||
int16_t zoom = lv_obj_get_style_transform_scale_y(obj, part);
|
||||
return zoom != 0 ? zoom : 1;
|
||||
}
|
||||
|
||||
|
@ -114,12 +114,20 @@ void lv_obj_set_style_translate_y(struct _lv_obj_t * obj, lv_coord_t value, lv_s
|
||||
lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSLATE_Y, v, selector);
|
||||
}
|
||||
|
||||
void lv_obj_set_style_transform_scale(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector)
|
||||
void lv_obj_set_style_transform_scale_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector)
|
||||
{
|
||||
lv_style_value_t v = {
|
||||
.num = (int32_t)value
|
||||
};
|
||||
lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SCALE, v, selector);
|
||||
lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SCALE_X, v, selector);
|
||||
}
|
||||
|
||||
void lv_obj_set_style_transform_scale_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector)
|
||||
{
|
||||
lv_style_value_t v = {
|
||||
.num = (int32_t)value
|
||||
};
|
||||
lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SCALE_Y, v, selector);
|
||||
}
|
||||
|
||||
void lv_obj_set_style_transform_rotation(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector)
|
||||
|
@ -92,9 +92,15 @@ static inline lv_coord_t lv_obj_get_style_translate_y(const struct _lv_obj_t * o
|
||||
return (lv_coord_t)v.num;
|
||||
}
|
||||
|
||||
static inline lv_coord_t lv_obj_get_style_transform_scale(const struct _lv_obj_t * obj, uint32_t part)
|
||||
static inline lv_coord_t lv_obj_get_style_transform_scale_x(const struct _lv_obj_t * obj, uint32_t part)
|
||||
{
|
||||
lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SCALE);
|
||||
lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SCALE_X);
|
||||
return (lv_coord_t)v.num;
|
||||
}
|
||||
|
||||
static inline lv_coord_t lv_obj_get_style_transform_scale_y(const struct _lv_obj_t * obj, uint32_t part)
|
||||
{
|
||||
lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SCALE_Y);
|
||||
return (lv_coord_t)v.num;
|
||||
}
|
||||
|
||||
@ -718,7 +724,8 @@ void lv_obj_set_style_transform_width(struct _lv_obj_t * obj, lv_coord_t value,
|
||||
void lv_obj_set_style_transform_height(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
|
||||
void lv_obj_set_style_translate_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
|
||||
void lv_obj_set_style_translate_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
|
||||
void lv_obj_set_style_transform_scale(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
|
||||
void lv_obj_set_style_transform_scale_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
|
||||
void lv_obj_set_style_transform_scale_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
|
||||
void lv_obj_set_style_transform_rotation(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
|
||||
void lv_obj_set_style_transform_pivot_x(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
|
||||
void lv_obj_set_style_transform_pivot_y(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);
|
||||
|
@ -911,7 +911,8 @@ void refr_obj(lv_layer_t * layer, lv_obj_t * obj)
|
||||
layer_draw_dsc.rotation = lv_obj_get_style_transform_rotation(obj, 0);
|
||||
while(layer_draw_dsc.rotation > 3600) layer_draw_dsc.rotation -= 3600;
|
||||
while(layer_draw_dsc.rotation < 0) layer_draw_dsc.rotation += 3600;
|
||||
layer_draw_dsc.zoom = lv_obj_get_style_transform_scale(obj, 0);
|
||||
layer_draw_dsc.zoom_x = lv_obj_get_style_transform_scale_x(obj, 0);
|
||||
layer_draw_dsc.zoom_y = lv_obj_get_style_transform_scale_y(obj, 0);
|
||||
layer_draw_dsc.blend_mode = lv_obj_get_style_blend_mode(obj, 0);
|
||||
layer_draw_dsc.antialias = disp_refr->antialiasing;
|
||||
layer_draw_dsc.src = new_layer;
|
||||
|
@ -43,7 +43,8 @@ void lv_draw_image_dsc_init(lv_draw_image_dsc_t * dsc)
|
||||
lv_memzero(dsc, sizeof(lv_draw_image_dsc_t));
|
||||
dsc->recolor = lv_color_black();
|
||||
dsc->opa = LV_OPA_COVER;
|
||||
dsc->zoom = LV_SCALE_NONE;
|
||||
dsc->zoom_x = LV_SCALE_NONE;
|
||||
dsc->zoom_y = LV_SCALE_NONE;
|
||||
dsc->antialias = LV_COLOR_DEPTH > 8 ? 1 : 0;
|
||||
}
|
||||
|
||||
|
@ -44,7 +44,8 @@ typedef struct _lv_draw_image_dsc_t {
|
||||
|
||||
|
||||
lv_coord_t rotation;
|
||||
lv_coord_t zoom;
|
||||
lv_coord_t zoom_x;
|
||||
lv_coord_t zoom_y;
|
||||
lv_point_t pivot;
|
||||
|
||||
lv_color_t recolor;
|
||||
|
@ -59,10 +59,11 @@ void lv_image_buf_free(lv_image_dsc_t * dsc)
|
||||
}
|
||||
}
|
||||
|
||||
void _lv_image_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t h, lv_coord_t angle, uint16_t zoom,
|
||||
void _lv_image_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t h, lv_coord_t angle, uint16_t zoom_x,
|
||||
uint16_t zoom_y,
|
||||
const lv_point_t * pivot)
|
||||
{
|
||||
if(angle == 0 && zoom == LV_SCALE_NONE) {
|
||||
if(angle == 0 && zoom_x == LV_SCALE_NONE && zoom_y == LV_SCALE_NONE) {
|
||||
res->x1 = 0;
|
||||
res->y1 = 0;
|
||||
res->x2 = w - 1;
|
||||
@ -76,10 +77,10 @@ void _lv_image_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_
|
||||
{0, h - 1},
|
||||
{w - 1, h - 1},
|
||||
};
|
||||
lv_point_transform(&p[0], angle, zoom, pivot);
|
||||
lv_point_transform(&p[1], angle, zoom, pivot);
|
||||
lv_point_transform(&p[2], angle, zoom, pivot);
|
||||
lv_point_transform(&p[3], angle, zoom, pivot);
|
||||
lv_point_transform(&p[0], angle, zoom_x, zoom_y, pivot, true);
|
||||
lv_point_transform(&p[1], angle, zoom_x, zoom_y, pivot, true);
|
||||
lv_point_transform(&p[2], angle, zoom_x, zoom_y, pivot, true);
|
||||
lv_point_transform(&p[3], angle, zoom_x, zoom_y, pivot, true);
|
||||
res->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x);
|
||||
res->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x);
|
||||
res->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y);
|
||||
|
@ -115,7 +115,8 @@ void lv_image_buf_free(lv_image_dsc_t * dsc);
|
||||
* @param zoom zoom, (256 no zoom)
|
||||
* @param pivot x,y pivot coordinates of rotation
|
||||
*/
|
||||
void _lv_image_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t h, lv_coord_t angle, uint16_t zoom,
|
||||
void _lv_image_buf_get_transformed_area(lv_area_t * res, lv_coord_t w, lv_coord_t h, lv_coord_t angle, uint16_t zoom_x,
|
||||
uint16_t zoom_y,
|
||||
const lv_point_t * pivot);
|
||||
|
||||
/**********************
|
||||
|
@ -151,11 +151,12 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_image(lv_draw_unit_t * draw_unit, const lv
|
||||
{
|
||||
lv_area_t transformed_area;
|
||||
lv_area_copy(&transformed_area, coords);
|
||||
if(draw_dsc->rotation || draw_dsc->zoom != LV_SCALE_NONE) {
|
||||
if(draw_dsc->rotation || draw_dsc->zoom_x != LV_SCALE_NONE || draw_dsc->zoom_y != LV_SCALE_NONE) {
|
||||
int32_t w = lv_area_get_width(coords);
|
||||
int32_t h = lv_area_get_height(coords);
|
||||
|
||||
_lv_image_buf_get_transformed_area(&transformed_area, w, h, draw_dsc->rotation, draw_dsc->zoom, &draw_dsc->pivot);
|
||||
_lv_image_buf_get_transformed_area(&transformed_area, w, h, draw_dsc->rotation, draw_dsc->zoom_x, draw_dsc->zoom_y,
|
||||
&draw_dsc->pivot);
|
||||
|
||||
transformed_area.x1 += coords->x1;
|
||||
transformed_area.y1 += coords->y1;
|
||||
@ -220,7 +221,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_image(lv_draw_unit_t * draw_unit, const lv
|
||||
static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * draw_area,
|
||||
const lv_image_decoder_dsc_t * src, lv_draw_image_sup_t * sup, const lv_area_t * img_coords)
|
||||
{
|
||||
bool transformed = draw_dsc->rotation != 0 || draw_dsc->zoom != LV_SCALE_NONE ? true : false;
|
||||
bool transformed = draw_dsc->rotation != 0 || draw_dsc->zoom_x != LV_SCALE_NONE ||
|
||||
draw_dsc->zoom_y != LV_SCALE_NONE ? true : false;
|
||||
|
||||
lv_draw_sw_blend_dsc_t blend_dsc;
|
||||
const uint8_t * src_buf = src->img_data;
|
||||
|
@ -94,7 +94,8 @@ LV_ATTRIBUTE_FAST_MEM static void draw_letter_cb(lv_draw_unit_t * draw_unit, lv_
|
||||
lv_draw_image_dsc_t img_dsc;
|
||||
lv_draw_image_dsc_init(&img_dsc);
|
||||
img_dsc.rotation = 0;
|
||||
img_dsc.zoom = LV_SCALE_NONE;
|
||||
img_dsc.zoom_x = LV_SCALE_NONE;
|
||||
img_dsc.zoom_y = LV_SCALE_NONE;
|
||||
img_dsc.opa = glyph_draw_dsc->opa;
|
||||
img_dsc.src = glyph_draw_dsc->bitmap;
|
||||
lv_draw_sw_image(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords);
|
||||
|
@ -28,7 +28,8 @@ typedef struct {
|
||||
int32_t y_out;
|
||||
int32_t sinma;
|
||||
int32_t cosma;
|
||||
int32_t zoom;
|
||||
int32_t zoom_x;
|
||||
int32_t zoom_y;
|
||||
int32_t angle;
|
||||
int32_t pivot_x_256;
|
||||
int32_t pivot_y_256;
|
||||
@ -87,7 +88,8 @@ void lv_draw_sw_transform(lv_draw_unit_t * draw_unit, const lv_area_t * dest_are
|
||||
|
||||
point_transform_dsc_t tr_dsc;
|
||||
tr_dsc.angle = -draw_dsc->rotation;
|
||||
tr_dsc.zoom = (256 * 256) / draw_dsc->zoom;
|
||||
tr_dsc.zoom_x = (256 * 256) / draw_dsc->zoom_x;
|
||||
tr_dsc.zoom_y = (256 * 256) / draw_dsc->zoom_y;
|
||||
tr_dsc.pivot = draw_dsc->pivot;
|
||||
|
||||
int32_t angle_low = tr_dsc.angle / 10;
|
||||
@ -581,7 +583,7 @@ static void transform_a8(const uint8_t * src, lv_coord_t src_w, lv_coord_t src_h
|
||||
static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout,
|
||||
int32_t * yout)
|
||||
{
|
||||
if(t->angle == 0 && t->zoom == LV_SCALE_NONE) {
|
||||
if(t->angle == 0 && t->zoom_x == LV_SCALE_NONE && t->zoom_y == LV_SCALE_NONE) {
|
||||
*xout = xin * 256;
|
||||
*yout = yin * 256;
|
||||
return;
|
||||
@ -591,16 +593,16 @@ static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int
|
||||
yin -= t->pivot.y;
|
||||
|
||||
if(t->angle == 0) {
|
||||
*xout = ((int32_t)(xin * t->zoom)) + (t->pivot_x_256);
|
||||
*yout = ((int32_t)(yin * t->zoom)) + (t->pivot_y_256);
|
||||
*xout = ((int32_t)(xin * t->zoom_x)) + (t->pivot_x_256);
|
||||
*yout = ((int32_t)(yin * t->zoom_y)) + (t->pivot_y_256);
|
||||
}
|
||||
else if(t->zoom == LV_SCALE_NONE) {
|
||||
else if(t->zoom_x == LV_SCALE_NONE && t->zoom_y == LV_SCALE_NONE) {
|
||||
*xout = ((t->cosma * xin - t->sinma * yin) >> 2) + (t->pivot_x_256);
|
||||
*yout = ((t->sinma * xin + t->cosma * yin) >> 2) + (t->pivot_y_256);
|
||||
}
|
||||
else {
|
||||
*xout = (((t->cosma * xin - t->sinma * yin) * t->zoom) >> 10) + (t->pivot_x_256);
|
||||
*yout = (((t->sinma * xin + t->cosma * yin) * t->zoom) >> 10) + (t->pivot_y_256);
|
||||
*xout = (((t->cosma * xin - t->sinma * yin) * t->zoom_x) >> 10) + (t->pivot_x_256);
|
||||
*yout = (((t->sinma * xin + t->cosma * yin) * t->zoom_y) >> 10) + (t->pivot_y_256);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1166,21 +1166,25 @@ static void indev_proc_release(lv_indev_t * indev)
|
||||
/*Get the transformed vector with this object*/
|
||||
if(scroll_obj) {
|
||||
int16_t angle = 0;
|
||||
int16_t zoom = 256;
|
||||
int16_t zoom_x = 256;
|
||||
int16_t zoom_y = 256;
|
||||
lv_point_t pivot = { 0, 0 };
|
||||
lv_obj_t * parent = scroll_obj;
|
||||
while(parent) {
|
||||
angle += lv_obj_get_style_transform_rotation(parent, 0);
|
||||
int32_t zoom_act = lv_obj_get_style_transform_scale_safe(parent, 0);
|
||||
zoom = (zoom * zoom_act) >> 8;
|
||||
int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0);
|
||||
int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0);
|
||||
zoom_x = (zoom_x * zoom_act_x) >> 8;
|
||||
zoom_y = (zoom_x * zoom_act_y) >> 8;
|
||||
parent = lv_obj_get_parent(parent);
|
||||
}
|
||||
|
||||
if(angle != 0 || zoom != LV_SCALE_NONE) {
|
||||
if(angle != 0 || zoom_y != LV_SCALE_NONE || zoom_x != LV_SCALE_NONE) {
|
||||
angle = -angle;
|
||||
zoom = (256 * 256) / zoom;
|
||||
lv_point_transform(&indev->pointer.scroll_throw_vect, angle, zoom, &pivot);
|
||||
lv_point_transform(&indev->pointer.scroll_throw_vect_ori, angle, zoom, &pivot);
|
||||
zoom_x = (256 * 256) / zoom_x;
|
||||
zoom_y = (256 * 256) / zoom_y;
|
||||
lv_point_transform(&indev->pointer.scroll_throw_vect, angle, zoom_x, zoom_y, &pivot, false);
|
||||
lv_point_transform(&indev->pointer.scroll_throw_vect_ori, angle, zoom_x, zoom_y, &pivot, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -64,20 +64,24 @@ void _lv_indev_scroll_handler(lv_indev_t * indev)
|
||||
|
||||
/*Set new position or scroll if the vector is not zero*/
|
||||
int16_t angle = 0;
|
||||
int16_t zoom = 256;
|
||||
int16_t zoom_x = 256;
|
||||
int16_t zoom_y = 256;
|
||||
lv_obj_t * parent = scroll_obj;
|
||||
while(parent) {
|
||||
angle += lv_obj_get_style_transform_rotation(parent, 0);
|
||||
int32_t zoom_act = lv_obj_get_style_transform_scale_safe(parent, 0);
|
||||
zoom = (zoom * zoom_act) >> 8;
|
||||
int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0);
|
||||
int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0);
|
||||
zoom_x = (zoom_x * zoom_act_x) >> 8;
|
||||
zoom_y = (zoom_y * zoom_act_y) >> 8;
|
||||
parent = lv_obj_get_parent(parent);
|
||||
}
|
||||
|
||||
if(angle != 0 || zoom != LV_SCALE_NONE) {
|
||||
if(angle != 0 || zoom_x != LV_SCALE_NONE || zoom_y != LV_SCALE_NONE) {
|
||||
angle = -angle;
|
||||
zoom = (256 * 256) / zoom;
|
||||
zoom_x = (256 * 256) / zoom_x;
|
||||
zoom_y = (256 * 256) / zoom_y;
|
||||
lv_point_t pivot = { 0, 0 };
|
||||
lv_point_transform(&indev->pointer.vect, angle, zoom, &pivot);
|
||||
lv_point_transform(&indev->pointer.vect, angle, zoom_x, zoom_y, &pivot, false);
|
||||
}
|
||||
|
||||
|
||||
@ -289,21 +293,25 @@ static lv_obj_t * find_scroll_obj(lv_indev_t * indev)
|
||||
while(obj_act) {
|
||||
/*Get the transformed scroll_sum with this object*/
|
||||
int16_t angle = 0;
|
||||
int32_t zoom = 256;
|
||||
int32_t zoom_x = 256;
|
||||
int32_t zoom_y = 256;
|
||||
lv_point_t pivot = { 0, 0 };
|
||||
lv_obj_t * parent = obj_act;
|
||||
while(parent) {
|
||||
angle += lv_obj_get_style_transform_rotation(parent, 0);
|
||||
int32_t zoom_act = lv_obj_get_style_transform_scale_safe(parent, 0);
|
||||
zoom = (zoom * zoom_act) >> 8;
|
||||
int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0);
|
||||
int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0);
|
||||
zoom_x = (zoom_x * zoom_act_x) >> 8;
|
||||
zoom_y = (zoom_y * zoom_act_y) >> 8;
|
||||
parent = lv_obj_get_parent(parent);
|
||||
}
|
||||
|
||||
lv_point_t obj_scroll_sum = indev->pointer.scroll_sum;
|
||||
if(angle != 0 || zoom != LV_SCALE_NONE) {
|
||||
if(angle != 0 || zoom_x != LV_SCALE_NONE || zoom_y != LV_SCALE_NONE) {
|
||||
angle = -angle;
|
||||
zoom = (256 * 256) / zoom;
|
||||
lv_point_transform(&obj_scroll_sum, angle, zoom, &pivot);
|
||||
zoom_x = (256 * 256) / zoom_x;
|
||||
zoom_y = (256 * 256) / zoom_y;
|
||||
lv_point_transform(&obj_scroll_sum, angle, zoom_x, zoom_y, &pivot, false);
|
||||
}
|
||||
|
||||
if(LV_ABS(obj_scroll_sum.x) > LV_ABS(obj_scroll_sum.y)) {
|
||||
|
@ -531,9 +531,10 @@ void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t alig
|
||||
}
|
||||
|
||||
#define _LV_TRANSFORM_TRIGO_SHIFT 10
|
||||
void lv_point_transform(lv_point_t * p, int32_t angle, int32_t zoom, const lv_point_t * pivot)
|
||||
void lv_point_transform(lv_point_t * p, int32_t angle, int32_t zoom_x, int32_t zoom_y, const lv_point_t * pivot,
|
||||
bool zoom_first)
|
||||
{
|
||||
if(angle == 0 && zoom == 256) {
|
||||
if(angle == 0 && zoom_x == 256 && zoom_y == 256) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -541,8 +542,8 @@ void lv_point_transform(lv_point_t * p, int32_t angle, int32_t zoom, const lv_po
|
||||
p->y -= pivot->y;
|
||||
|
||||
if(angle == 0) {
|
||||
p->x = (((int32_t)(p->x) * zoom) >> 8) + pivot->x;
|
||||
p->y = (((int32_t)(p->y) * zoom) >> 8) + pivot->y;
|
||||
p->x = (((int32_t)(p->x) * zoom_x) >> 8) + pivot->x;
|
||||
p->y = (((int32_t)(p->y) * zoom_y) >> 8) + pivot->y;
|
||||
return;
|
||||
}
|
||||
lv_area_transform_cache_t * cache = &trans_cache;
|
||||
@ -569,13 +570,22 @@ void lv_point_transform(lv_point_t * p, int32_t angle, int32_t zoom, const lv_po
|
||||
}
|
||||
int32_t x = p->x;
|
||||
int32_t y = p->y;
|
||||
if(zoom == 256) {
|
||||
if(zoom_x == 256 && zoom_y == 256) {
|
||||
p->x = ((cache->cosma * x - cache->sinma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->x;
|
||||
p->y = ((cache->sinma * x + cache->cosma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->y;
|
||||
}
|
||||
else {
|
||||
p->x = (((cache->cosma * x - cache->sinma * y) * zoom) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x;
|
||||
p->y = (((cache->sinma * x + cache->cosma * y) * zoom) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y;
|
||||
if(zoom_first) {
|
||||
x *= zoom_x;
|
||||
y *= zoom_y;
|
||||
p->x = (((cache->cosma * x - cache->sinma * y)) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x;
|
||||
p->y = (((cache->sinma * x + cache->cosma * y)) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y;
|
||||
}
|
||||
else {
|
||||
p->x = (((cache->cosma * x - cache->sinma * y) * zoom_x) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x;
|
||||
p->y = (((cache->sinma * x + cache->cosma * y) * zoom_y) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -264,7 +264,8 @@ bool _lv_area_is_equal(const lv_area_t * a, const lv_area_t * b);
|
||||
*/
|
||||
void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, lv_coord_t ofs_x, lv_coord_t ofs_y);
|
||||
|
||||
void lv_point_transform(lv_point_t * p, int32_t angle, int32_t zoom, const lv_point_t * pivot);
|
||||
void lv_point_transform(lv_point_t * p, int32_t angle, int32_t zoom_x, int32_t zoom_y, const lv_point_t * pivot,
|
||||
bool zoom_first);
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
|
@ -48,7 +48,8 @@ const uint8_t _lv_style_builtin_prop_flag_lookup_table[_LV_STYLE_NUM_BUILT_IN_PR
|
||||
[LV_STYLE_TRANSFORM_HEIGHT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
|
||||
[LV_STYLE_TRANSLATE_X] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE | LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE,
|
||||
[LV_STYLE_TRANSLATE_Y] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE | LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE,
|
||||
[LV_STYLE_TRANSFORM_SCALE] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
|
||||
[LV_STYLE_TRANSFORM_SCALE_X] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
|
||||
[LV_STYLE_TRANSFORM_SCALE_Y] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
|
||||
[LV_STYLE_TRANSFORM_ROTATION] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM,
|
||||
|
||||
[LV_STYLE_PAD_TOP] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
|
||||
@ -345,7 +346,8 @@ lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop)
|
||||
const lv_color_t black = LV_COLOR_MAKE(0x00, 0x00, 0x00);
|
||||
const lv_color_t white = LV_COLOR_MAKE(0xff, 0xff, 0xff);
|
||||
switch(prop) {
|
||||
case LV_STYLE_TRANSFORM_SCALE:
|
||||
case LV_STYLE_TRANSFORM_SCALE_X:
|
||||
case LV_STYLE_TRANSFORM_SCALE_Y:
|
||||
return (lv_style_value_t) {
|
||||
.num = LV_SCALE_NONE
|
||||
};
|
||||
|
@ -296,25 +296,26 @@ enum _lv_style_prop_t {
|
||||
LV_STYLE_TEXT_OPA = 89,
|
||||
LV_STYLE_TEXT_FONT = 90,
|
||||
|
||||
LV_STYLE_TEXT_LETTER_SPACE = 92,
|
||||
LV_STYLE_TEXT_LINE_SPACE = 93,
|
||||
LV_STYLE_TEXT_DECOR = 94,
|
||||
LV_STYLE_TEXT_ALIGN = 95,
|
||||
LV_STYLE_TEXT_LETTER_SPACE = 91,
|
||||
LV_STYLE_TEXT_LINE_SPACE = 92,
|
||||
LV_STYLE_TEXT_DECOR = 93,
|
||||
LV_STYLE_TEXT_ALIGN = 94,
|
||||
|
||||
LV_STYLE_OPA = 96,
|
||||
LV_STYLE_OPA_LAYERED = 97,
|
||||
LV_STYLE_COLOR_FILTER_DSC = 98,
|
||||
LV_STYLE_COLOR_FILTER_OPA = 99,
|
||||
LV_STYLE_ANIM = 100,
|
||||
LV_STYLE_ANIM_TIME = 101,
|
||||
LV_STYLE_ANIM_SPEED = 102,
|
||||
LV_STYLE_TRANSITION = 103,
|
||||
LV_STYLE_BLEND_MODE = 104,
|
||||
LV_STYLE_TRANSFORM_WIDTH = 105,
|
||||
LV_STYLE_TRANSFORM_HEIGHT = 106,
|
||||
LV_STYLE_TRANSLATE_X = 107,
|
||||
LV_STYLE_TRANSLATE_Y = 108,
|
||||
LV_STYLE_TRANSFORM_SCALE = 109,
|
||||
LV_STYLE_OPA = 95,
|
||||
LV_STYLE_OPA_LAYERED = 96,
|
||||
LV_STYLE_COLOR_FILTER_DSC = 97,
|
||||
LV_STYLE_COLOR_FILTER_OPA = 98,
|
||||
LV_STYLE_ANIM = 99,
|
||||
LV_STYLE_ANIM_TIME = 100,
|
||||
LV_STYLE_ANIM_SPEED = 101,
|
||||
LV_STYLE_TRANSITION = 102,
|
||||
LV_STYLE_BLEND_MODE = 103,
|
||||
LV_STYLE_TRANSFORM_WIDTH = 104,
|
||||
LV_STYLE_TRANSFORM_HEIGHT = 105,
|
||||
LV_STYLE_TRANSLATE_X = 106,
|
||||
LV_STYLE_TRANSLATE_Y = 107,
|
||||
LV_STYLE_TRANSFORM_SCALE_X = 108,
|
||||
LV_STYLE_TRANSFORM_SCALE_Y = 109,
|
||||
LV_STYLE_TRANSFORM_ROTATION = 110,
|
||||
LV_STYLE_TRANSFORM_PIVOT_X = 111,
|
||||
LV_STYLE_TRANSFORM_PIVOT_Y = 112,
|
||||
@ -605,6 +606,12 @@ static inline void lv_style_set_pad_gap(lv_style_t * style, lv_coord_t value)
|
||||
lv_style_set_pad_column(style, value);
|
||||
}
|
||||
|
||||
static inline void lv_style_set_transform_scale(lv_style_t * style, lv_coord_t value)
|
||||
{
|
||||
lv_style_set_transform_scale_x(style, value);
|
||||
lv_style_set_transform_scale_y(style, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Check if the style property has a specified behavioral flag.
|
||||
*
|
||||
|
@ -140,15 +140,25 @@ void lv_style_set_translate_y(lv_style_t * style, lv_coord_t value)
|
||||
|
||||
const lv_style_prop_t _lv_style_const_prop_id_TRANSLATE_Y = LV_STYLE_TRANSLATE_Y;
|
||||
|
||||
void lv_style_set_transform_scale(lv_style_t * style, lv_coord_t value)
|
||||
void lv_style_set_transform_scale_x(lv_style_t * style, lv_coord_t value)
|
||||
{
|
||||
lv_style_value_t v = {
|
||||
.num = (int32_t)value
|
||||
};
|
||||
lv_style_set_prop(style, LV_STYLE_TRANSFORM_SCALE, v);
|
||||
lv_style_set_prop(style, LV_STYLE_TRANSFORM_SCALE_X, v);
|
||||
}
|
||||
|
||||
const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE = LV_STYLE_TRANSFORM_SCALE;
|
||||
const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_X = LV_STYLE_TRANSFORM_SCALE_X;
|
||||
|
||||
void lv_style_set_transform_scale_y(lv_style_t * style, lv_coord_t value)
|
||||
{
|
||||
lv_style_value_t v = {
|
||||
.num = (int32_t)value
|
||||
};
|
||||
lv_style_set_prop(style, LV_STYLE_TRANSFORM_SCALE_Y, v);
|
||||
}
|
||||
|
||||
const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_Y = LV_STYLE_TRANSFORM_SCALE_Y;
|
||||
|
||||
void lv_style_set_transform_rotation(lv_style_t * style, lv_coord_t value)
|
||||
{
|
||||
|
@ -36,8 +36,10 @@ void lv_style_set_translate_x(lv_style_t * style, lv_coord_t value);
|
||||
extern const lv_style_prop_t _lv_style_const_prop_id_TRANSLATE_X;
|
||||
void lv_style_set_translate_y(lv_style_t * style, lv_coord_t value);
|
||||
extern const lv_style_prop_t _lv_style_const_prop_id_TRANSLATE_Y;
|
||||
void lv_style_set_transform_scale(lv_style_t * style, lv_coord_t value);
|
||||
extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE;
|
||||
void lv_style_set_transform_scale_x(lv_style_t * style, lv_coord_t value);
|
||||
extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_X;
|
||||
void lv_style_set_transform_scale_y(lv_style_t * style, lv_coord_t value);
|
||||
extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_SCALE_Y;
|
||||
void lv_style_set_transform_rotation(lv_style_t * style, lv_coord_t value);
|
||||
extern const lv_style_prop_t _lv_style_const_prop_id_TRANSFORM_ROTATION;
|
||||
void lv_style_set_transform_pivot_x(lv_style_t * style, lv_coord_t value);
|
||||
@ -284,9 +286,14 @@ extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_SPAN;
|
||||
.prop_ptr = &_lv_style_const_prop_id_TRANSLATE_Y, .value = { .num = (int32_t)val } \
|
||||
}
|
||||
|
||||
#define LV_STYLE_CONST_TRANSFORM_SCALE(val) \
|
||||
#define LV_STYLE_CONST_TRANSFORM_SCALE_X(val) \
|
||||
{ \
|
||||
.prop_ptr = &_lv_style_const_prop_id_TRANSFORM_SCALE, .value = { .num = (int32_t)val } \
|
||||
.prop_ptr = &_lv_style_const_prop_id_TRANSFORM_SCALE_X, .value = { .num = (int32_t)val } \
|
||||
}
|
||||
|
||||
#define LV_STYLE_CONST_TRANSFORM_SCALE_Y(val) \
|
||||
{ \
|
||||
.prop_ptr = &_lv_style_const_prop_id_TRANSFORM_SCALE_Y, .value = { .num = (int32_t)val } \
|
||||
}
|
||||
|
||||
#define LV_STYLE_CONST_TRANSFORM_ROTATION(val) \
|
||||
|
@ -219,7 +219,8 @@ static void style_init(struct _my_theme_t * theme)
|
||||
LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR,
|
||||
LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT,
|
||||
LV_STYLE_TRANSLATE_Y, LV_STYLE_TRANSLATE_X,
|
||||
LV_STYLE_TRANSFORM_SCALE, LV_STYLE_TRANSFORM_ROTATION,
|
||||
LV_STYLE_TRANSFORM_ROTATION,
|
||||
LV_STYLE_TRANSFORM_SCALE_X, LV_STYLE_TRANSFORM_SCALE_Y,
|
||||
LV_STYLE_COLOR_FILTER_OPA, LV_STYLE_COLOR_FILTER_DSC,
|
||||
0
|
||||
};
|
||||
|
@ -192,7 +192,7 @@ void lv_image_set_rotation(lv_obj_t * obj, int32_t angle)
|
||||
lv_area_t a;
|
||||
lv_point_t pivot_px;
|
||||
lv_image_get_pivot(obj, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, img->zoom, &pivot_px);
|
||||
a.x1 += obj->coords.x1;
|
||||
a.y1 += obj->coords.y1;
|
||||
a.x2 += obj->coords.x1;
|
||||
@ -208,7 +208,7 @@ void lv_image_set_rotation(lv_obj_t * obj, int32_t angle)
|
||||
lv_obj_refresh_ext_draw_size(obj);
|
||||
lv_display_enable_invalidation(disp, true);
|
||||
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, img->zoom, &pivot_px);
|
||||
a.x1 += obj->coords.x1;
|
||||
a.y1 += obj->coords.y1;
|
||||
a.x2 += obj->coords.x1;
|
||||
@ -234,7 +234,7 @@ void lv_image_set_pivot(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
|
||||
lv_area_t a;
|
||||
lv_point_t pivot_px;
|
||||
lv_image_get_pivot(obj, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, img->zoom, &pivot_px);
|
||||
a.x1 += obj->coords.x1;
|
||||
a.y1 += obj->coords.y1;
|
||||
a.x2 += obj->coords.x1;
|
||||
@ -252,7 +252,7 @@ void lv_image_set_pivot(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
|
||||
lv_display_enable_invalidation(disp, true);
|
||||
|
||||
lv_image_get_pivot(obj, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, img->zoom, &pivot_px);
|
||||
a.x1 += obj->coords.x1;
|
||||
a.y1 += obj->coords.y1;
|
||||
a.x2 += obj->coords.x1;
|
||||
@ -279,7 +279,7 @@ void lv_image_set_scale(lv_obj_t * obj, uint32_t zoom)
|
||||
lv_area_t a;
|
||||
lv_point_t pivot_px;
|
||||
lv_image_get_pivot(obj, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, img->zoom, &pivot_px);
|
||||
a.x1 += obj->coords.x1 - 1;
|
||||
a.y1 += obj->coords.y1 - 1;
|
||||
a.x2 += obj->coords.x1 + 1;
|
||||
@ -295,7 +295,7 @@ void lv_image_set_scale(lv_obj_t * obj, uint32_t zoom)
|
||||
lv_obj_refresh_ext_draw_size(obj);
|
||||
lv_display_enable_invalidation(disp, true);
|
||||
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, img->zoom, &pivot_px);
|
||||
a.x1 += obj->coords.x1 - 1;
|
||||
a.y1 += obj->coords.y1 - 1;
|
||||
a.x2 += obj->coords.x1 + 1;
|
||||
@ -449,7 +449,7 @@ static lv_point_t lv_image_get_transformed_size(lv_obj_t * obj)
|
||||
lv_point_t pivot_px;
|
||||
lv_image_get_pivot(obj, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&area_transform, img->w, img->h,
|
||||
img->rotation, img->zoom, &pivot_px);
|
||||
img->rotation, img->zoom, img->zoom, &pivot_px);
|
||||
|
||||
return (lv_point_t) {
|
||||
lv_area_get_width(&area_transform), lv_area_get_height(&area_transform)
|
||||
@ -493,7 +493,7 @@ static void lv_image_event(const lv_obj_class_t * class_p, lv_event_t * e)
|
||||
lv_area_t a;
|
||||
lv_coord_t w = lv_obj_get_width(obj);
|
||||
lv_coord_t h = lv_obj_get_height(obj);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->zoom, img->zoom, &pivot_px);
|
||||
*s = LV_MAX(*s, -a.x1);
|
||||
*s = LV_MAX(*s, -a.y1);
|
||||
*s = LV_MAX(*s, a.x2 - w);
|
||||
@ -511,7 +511,7 @@ static void lv_image_event(const lv_obj_class_t * class_p, lv_event_t * e)
|
||||
lv_coord_t w = lv_obj_get_width(obj);
|
||||
lv_coord_t h = lv_obj_get_height(obj);
|
||||
lv_area_t coords;
|
||||
_lv_image_buf_get_transformed_area(&coords, w, h, img->rotation, img->zoom, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&coords, w, h, img->rotation, img->zoom, img->zoom, &pivot_px);
|
||||
coords.x1 += obj->coords.x1;
|
||||
coords.y1 += obj->coords.y1;
|
||||
coords.x2 += obj->coords.x1;
|
||||
@ -581,7 +581,8 @@ static void draw_image(lv_event_t * e)
|
||||
lv_area_t a;
|
||||
lv_point_t pivot_px;
|
||||
lv_image_get_pivot(obj, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, lv_obj_get_width(obj), lv_obj_get_height(obj), 0, img->zoom, &pivot_px);
|
||||
_lv_image_buf_get_transformed_area(&a, lv_obj_get_width(obj), lv_obj_get_height(obj), 0, img->zoom, img->zoom,
|
||||
&pivot_px);
|
||||
a.x1 += obj->coords.x1;
|
||||
a.y1 += obj->coords.y1;
|
||||
a.x2 += obj->coords.x1;
|
||||
@ -618,7 +619,7 @@ static void draw_image(lv_event_t * e)
|
||||
}
|
||||
else {
|
||||
_lv_image_buf_get_transformed_area(&bg_coords, obj_w, obj_h,
|
||||
img->rotation, img->zoom, &bg_pivot);
|
||||
img->rotation, img->zoom, img->zoom, &bg_pivot);
|
||||
|
||||
/*Modify the coordinates to draw the background for the rotated and scaled coordinates*/
|
||||
bg_coords.x1 += obj->coords.x1;
|
||||
@ -668,7 +669,8 @@ static void draw_image(lv_event_t * e)
|
||||
lv_draw_image_dsc_init(&img_dsc);
|
||||
lv_obj_init_draw_image_dsc(obj, LV_PART_MAIN, &img_dsc);
|
||||
|
||||
img_dsc.zoom = img->zoom;
|
||||
img_dsc.zoom_x = img->zoom;
|
||||
img_dsc.zoom_y = img->zoom;
|
||||
img_dsc.rotation = img->rotation;
|
||||
img_dsc.pivot.x = pivot_px.x;
|
||||
img_dsc.pivot.y = pivot_px.y;
|
||||
|
@ -44,7 +44,7 @@ typedef struct {
|
||||
lv_coord_t w; /*Width of the image (Handled by the library)*/
|
||||
lv_coord_t h; /*Height of the image (Handled by the library)*/
|
||||
uint32_t rotation; /*rotation angle of the image*/
|
||||
uint32_t zoom; /*256 means no zoom, 512 double size, 128 half size*/
|
||||
uint32_t zoom; /*256 means no zoom, 512 double size, 128 half size*/
|
||||
lv_point_t pivot; /*rotation center of the image*/
|
||||
uint8_t src_type : 2; /*See: lv_image_src_t*/
|
||||
uint8_t cf : 5; /*Color format from `lv_color_format_t`*/
|
||||
|
@ -823,17 +823,22 @@ static void set_y_anim(void * obj, int32_t v)
|
||||
static void transform_vect_recursive(lv_obj_t * roller, lv_point_t * vect)
|
||||
{
|
||||
int16_t angle = 0;
|
||||
int32_t zoom = 256;
|
||||
int32_t zoom_x = 256;
|
||||
int32_t zoom_y = 256;
|
||||
lv_obj_t * parent = roller;
|
||||
while(parent) {
|
||||
angle += lv_obj_get_style_transform_rotation(parent, 0);
|
||||
int32_t zoom_act = lv_obj_get_style_transform_scale_safe(parent, 0);
|
||||
zoom = (zoom * zoom_act) >> 8;
|
||||
int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, 0);
|
||||
int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, 0);
|
||||
zoom_x = (zoom_y * zoom_act_x) >> 8;
|
||||
zoom_y = (zoom_y * zoom_act_y) >> 8;
|
||||
parent = lv_obj_get_parent(parent);
|
||||
}
|
||||
lv_point_t pivot = { 0, 0 };
|
||||
|
||||
lv_point_transform(vect, -angle, 256 * 256 / zoom, &pivot);
|
||||
zoom_x = 256 * 256 / zoom_x;
|
||||
zoom_y = 256 * 256 / zoom_y;
|
||||
lv_point_transform(vect, -angle, zoom_x, zoom_y, &pivot, false);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -543,7 +543,7 @@ static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event)
|
||||
lv_point_t point;
|
||||
point.x = center_point.x + radius_text;
|
||||
point.y = center_point.y;
|
||||
lv_point_transform(&point, angle_upscale, LV_SCALE_NONE, ¢er_point);
|
||||
lv_point_transform(&point, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false);
|
||||
scale_get_label_coords(obj, &label_dsc, &point, &label_coords);
|
||||
|
||||
lv_draw_label(layer, &label_dsc, &label_coords);
|
||||
@ -907,11 +907,11 @@ static void scale_get_tick_points(lv_obj_t * obj, const uint32_t tick_idx, bool
|
||||
|
||||
tick_point_a->x = center_point.x + point_closer_to_arc;
|
||||
tick_point_a->y = center_point.y;
|
||||
lv_point_transform(tick_point_a, angle_upscale, LV_SCALE_NONE, ¢er_point);
|
||||
lv_point_transform(tick_point_a, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false);
|
||||
|
||||
tick_point_b->x = center_point.x + adjusted_radio_with_tick_len;
|
||||
tick_point_b->y = center_point.y;
|
||||
lv_point_transform(tick_point_b, angle_upscale, LV_SCALE_NONE, ¢er_point);
|
||||
lv_point_transform(tick_point_b, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false);
|
||||
}
|
||||
else { /* Nothing to do */ }
|
||||
}
|
||||
|
@ -194,11 +194,9 @@ static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e)
|
||||
lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB);
|
||||
|
||||
/*The smaller size is the knob diameter*/
|
||||
lv_coord_t zoom = lv_obj_get_style_transform_scale(obj, LV_PART_KNOB);
|
||||
lv_coord_t trans_w = lv_obj_get_style_transform_width(obj, LV_PART_KNOB);
|
||||
lv_coord_t trans_h = lv_obj_get_style_transform_height(obj, LV_PART_KNOB);
|
||||
lv_coord_t knob_size = LV_MIN(lv_obj_get_width(obj) + 2 * trans_w, lv_obj_get_height(obj) + 2 * trans_h) >> 1;
|
||||
knob_size = (knob_size * zoom) >> 8;
|
||||
knob_size += LV_MAX(LV_MAX(knob_left, knob_right), LV_MAX(knob_bottom, knob_top));
|
||||
knob_size += 2; /*For rounding error*/
|
||||
knob_size += lv_obj_calculate_ext_draw_size(obj, LV_PART_KNOB);
|
||||
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 48 KiB |
@ -28,8 +28,8 @@ static void radial_lines_create(lv_style_t * style, uint32_t line_index)
|
||||
p[i][1].x = 100 + length;
|
||||
p[i][1].y = 100;
|
||||
|
||||
lv_point_transform(&p[i][0], i * 150, 256, &pivot);
|
||||
lv_point_transform(&p[i][1], i * 150, 256, &pivot);
|
||||
lv_point_transform(&p[i][0], i * 150, LV_SCALE_NONE, LV_SCALE_NONE, &pivot, false);
|
||||
lv_point_transform(&p[i][1], i * 150, LV_SCALE_NONE, LV_SCALE_NONE, &pivot, false);
|
||||
|
||||
lv_line_set_points(line, p[i], 2);
|
||||
lv_obj_set_pos(line, line_index % 4 * 200, line_index / 4 * 200);
|
||||
|
@ -88,29 +88,43 @@ static void draw_images(lv_layer_t * layer, lv_draw_image_dsc_t * dsc)
|
||||
dsc->pivot.x = 50;
|
||||
dsc->pivot.y = 50;
|
||||
dsc->rotation = 0;
|
||||
dsc->zoom = 128;
|
||||
dsc->zoom_x = 128;
|
||||
dsc->zoom_y = 128;
|
||||
lv_draw_image(layer, dsc, &area);
|
||||
|
||||
lv_area_move(&area, 110, 0);
|
||||
dsc->zoom = 300;
|
||||
dsc->zoom_x = 300;
|
||||
dsc->zoom_y = 300;
|
||||
lv_draw_image(layer, dsc, &area);
|
||||
|
||||
lv_area_move(&area, 110, 0);
|
||||
dsc->pivot.x = 0;
|
||||
dsc->pivot.y = 0;
|
||||
dsc->zoom = 128;
|
||||
dsc->zoom_x = 128;
|
||||
dsc->zoom_y = 128;
|
||||
lv_draw_image(layer, dsc, &area);
|
||||
|
||||
lv_area_move(&area, 110, 0);
|
||||
dsc->zoom = 300;
|
||||
dsc->zoom_x = 300;
|
||||
dsc->zoom_y = 300;
|
||||
lv_draw_image(layer, dsc, &area);
|
||||
|
||||
/* Zoom + Angle*/
|
||||
dsc->rotation = 650;
|
||||
dsc->zoom = 200;
|
||||
dsc->zoom_x = 200;
|
||||
dsc->zoom_y = 200;
|
||||
lv_area_move(&area, 200, 0);
|
||||
lv_draw_image(layer, dsc, &area);
|
||||
|
||||
/* Zoom non uniform + Angle*/
|
||||
dsc->rotation = 750;
|
||||
dsc->zoom_x = 128;
|
||||
dsc->zoom_y = 350;
|
||||
dsc->pivot.x = 40;
|
||||
dsc->pivot.y = 40;
|
||||
lv_area_move(&area, 100, 0);
|
||||
lv_draw_image(layer, dsc, &area);
|
||||
|
||||
/*Edge color bleeding test*/
|
||||
lv_draw_rect_dsc_t rect_dsc;
|
||||
lv_draw_rect_dsc_init(&rect_dsc);
|
||||
@ -128,22 +142,32 @@ static void draw_images(lv_layer_t * layer, lv_draw_image_dsc_t * dsc)
|
||||
dsc->pivot.x = 50;
|
||||
dsc->pivot.y = 50;
|
||||
dsc->rotation = 0;
|
||||
dsc->zoom = 256;
|
||||
dsc->zoom_x = 256;
|
||||
dsc->zoom_y = 256;
|
||||
lv_draw_image(layer, dsc, &area);
|
||||
|
||||
lv_area_move(&area, 180, 0);
|
||||
dsc->rotation = 300;
|
||||
dsc->zoom = 200;
|
||||
dsc->zoom_x = 200;
|
||||
dsc->zoom_y = 200;
|
||||
lv_draw_image(layer, dsc, &area);
|
||||
|
||||
lv_area_move(&area, 150, 0);
|
||||
dsc->rotation = 1400;
|
||||
dsc->zoom = 150;
|
||||
dsc->zoom_x = 150;
|
||||
dsc->zoom_y = 150;
|
||||
lv_draw_image(layer, dsc, &area);
|
||||
|
||||
lv_area_move(&area, 120, 0);
|
||||
dsc->rotation = 2000;
|
||||
dsc->zoom = 100;
|
||||
dsc->zoom_x = 100;
|
||||
dsc->zoom_y = 100;
|
||||
lv_draw_image(layer, dsc, &area);
|
||||
|
||||
lv_area_move(&area, 120, 0);
|
||||
dsc->rotation = 2000;
|
||||
dsc->zoom_x = 350;
|
||||
dsc->zoom_y = 100;
|
||||
lv_draw_image(layer, dsc, &area);
|
||||
}
|
||||
|
||||
|