mirror of
https://github.com/lvgl/lvgl.git
synced 2026-06-02 17:47:28 +08:00
feat(barcode): add vertical display mode (#4564)
Signed-off-by: liujp <liujp@xiaomi.com> Co-authored-by: liujp <liujp@xiaomi.com>
This commit is contained in:
@@ -15,8 +15,9 @@ Use :c:expr:`lv_barcode_create()` to create a barcode object, and use
|
|||||||
:c:expr:`lv_barcode_update()` to generate a barcode.
|
:c:expr:`lv_barcode_update()` to generate a barcode.
|
||||||
|
|
||||||
Call :c:expr:`lv_barcode_set_scale()` or :c:expr:`lv_barcode_set_dark/light_color()`
|
Call :c:expr:`lv_barcode_set_scale()` or :c:expr:`lv_barcode_set_dark/light_color()`
|
||||||
to adjust scaling and color, and call :c:expr:`lv_barcode_update()` again to
|
to adjust scaling and color, call :c:expr:`lv_barcode_set_direction()` will set
|
||||||
regenerate the barcode.
|
direction to display, and call :c:expr:`lv_barcode_update()` again to regenerate
|
||||||
|
the barcode.
|
||||||
|
|
||||||
Notes
|
Notes
|
||||||
-----
|
-----
|
||||||
@@ -26,6 +27,7 @@ Notes
|
|||||||
display will be incomplete due to truncation.
|
display will be incomplete due to truncation.
|
||||||
- The scale adjustment can only be an integer multiple, for example,
|
- The scale adjustment can only be an integer multiple, for example,
|
||||||
:c:expr:`lv_barcode_set_scale(barcode, 2)` means 2x scaling.
|
:c:expr:`lv_barcode_set_scale(barcode, 2)` means 2x scaling.
|
||||||
|
- The direction adjustment can be `LV_DIR_HOR` or `LV_DIR_VER`
|
||||||
|
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
**********************/
|
**********************/
|
||||||
static void lv_barcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
|
static void lv_barcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
|
||||||
static void lv_barcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
|
static void lv_barcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj);
|
||||||
static bool lv_barcode_change_buf_size(lv_obj_t * obj, lv_coord_t w);
|
static bool lv_barcode_change_buf_size(lv_obj_t * obj, lv_coord_t w, lv_coord_t h);
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* STATIC VARIABLES
|
* STATIC VARIABLES
|
||||||
@@ -83,6 +83,14 @@ void lv_barcode_set_scale(lv_obj_t * obj, uint16_t scale)
|
|||||||
barcode->scale = scale;
|
barcode->scale = scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lv_barcode_set_direction(lv_obj_t * obj, lv_dir_t direction)
|
||||||
|
{
|
||||||
|
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||||
|
|
||||||
|
lv_barcode_t * barcode = (lv_barcode_t *)obj;
|
||||||
|
barcode->direction = direction;
|
||||||
|
}
|
||||||
|
|
||||||
lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data)
|
lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data)
|
||||||
{
|
{
|
||||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||||
@@ -112,7 +120,10 @@ lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data)
|
|||||||
LV_ASSERT(barcode->scale > 0);
|
LV_ASSERT(barcode->scale > 0);
|
||||||
uint16_t scale = barcode->scale;
|
uint16_t scale = barcode->scale;
|
||||||
|
|
||||||
if(!lv_barcode_change_buf_size(obj, barcode_w * scale)) {
|
lv_coord_t buf_w = (barcode->direction == LV_DIR_HOR) ? barcode_w * scale : 1;
|
||||||
|
lv_coord_t buf_h = (barcode->direction == LV_DIR_VER) ? barcode_w * scale : 1;
|
||||||
|
|
||||||
|
if(!lv_barcode_change_buf_size(obj, buf_w, buf_h)) {
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,7 +134,12 @@ lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data)
|
|||||||
lv_color_t color;
|
lv_color_t color;
|
||||||
color = lv_color_from_int(out_buf[x] ? 0 : 1);
|
color = lv_color_from_int(out_buf[x] ? 0 : 1);
|
||||||
for(uint16_t i = 0; i < scale; i++) {
|
for(uint16_t i = 0; i < scale; i++) {
|
||||||
lv_canvas_set_px(obj, x * scale + i, 0, color, LV_OPA_COVER);
|
if(barcode->direction == LV_DIR_HOR) {
|
||||||
|
lv_canvas_set_px(obj, x * scale + i, 0, color, LV_OPA_COVER);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lv_canvas_set_px(obj, 0, x * scale + i, color, LV_OPA_COVER);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,6 +186,7 @@ static void lv_barcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * ob
|
|||||||
barcode->dark_color = lv_color_black();
|
barcode->dark_color = lv_color_black();
|
||||||
barcode->light_color = lv_color_white();
|
barcode->light_color = lv_color_white();
|
||||||
barcode->scale = 1;
|
barcode->scale = 1;
|
||||||
|
barcode->direction = LV_DIR_HOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lv_barcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
|
static void lv_barcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj)
|
||||||
@@ -192,7 +209,7 @@ static void lv_barcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj
|
|||||||
img->data = NULL;
|
img->data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool lv_barcode_change_buf_size(lv_obj_t * obj, lv_coord_t w)
|
static bool lv_barcode_change_buf_size(lv_obj_t * obj, lv_coord_t w, lv_coord_t h)
|
||||||
{
|
{
|
||||||
LV_ASSERT_NULL(obj);
|
LV_ASSERT_NULL(obj);
|
||||||
LV_ASSERT(w > 0);
|
LV_ASSERT(w > 0);
|
||||||
@@ -200,7 +217,7 @@ static bool lv_barcode_change_buf_size(lv_obj_t * obj, lv_coord_t w)
|
|||||||
lv_image_dsc_t * img = lv_canvas_get_image(obj);
|
lv_image_dsc_t * img = lv_canvas_get_image(obj);
|
||||||
void * buf = (void *)img->data;
|
void * buf = (void *)img->data;
|
||||||
|
|
||||||
uint32_t buf_size = LV_CANVAS_BUF_SIZE_INDEXED_1BIT(w, 1);
|
uint32_t buf_size = LV_CANVAS_BUF_SIZE_INDEXED_1BIT(w, h);
|
||||||
buf = lv_realloc(buf, buf_size);
|
buf = lv_realloc(buf, buf_size);
|
||||||
LV_ASSERT_MALLOC(buf);
|
LV_ASSERT_MALLOC(buf);
|
||||||
|
|
||||||
@@ -209,7 +226,7 @@ static bool lv_barcode_change_buf_size(lv_obj_t * obj, lv_coord_t w)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
lv_canvas_set_buffer(obj, buf, w, 1, LV_COLOR_FORMAT_I1);
|
lv_canvas_set_buffer(obj, buf, w, h, LV_COLOR_FORMAT_I1);
|
||||||
LV_LOG_INFO("set canvas buffer: %p, width = %d", buf, (int)w);
|
LV_LOG_INFO("set canvas buffer: %p, width = %d", buf, (int)w);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ typedef struct {
|
|||||||
lv_color_t dark_color;
|
lv_color_t dark_color;
|
||||||
lv_color_t light_color;
|
lv_color_t light_color;
|
||||||
uint16_t scale;
|
uint16_t scale;
|
||||||
|
lv_dir_t direction;
|
||||||
} lv_barcode_t;
|
} lv_barcode_t;
|
||||||
|
|
||||||
extern const lv_obj_class_t lv_barcode_class;
|
extern const lv_obj_class_t lv_barcode_class;
|
||||||
@@ -66,6 +67,13 @@ void lv_barcode_set_light_color(lv_obj_t * obj, lv_color_t color);
|
|||||||
*/
|
*/
|
||||||
void lv_barcode_set_scale(lv_obj_t * obj, uint16_t scale);
|
void lv_barcode_set_scale(lv_obj_t * obj, uint16_t scale);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the direction of a barcode object
|
||||||
|
* @param obj pointer to barcode object
|
||||||
|
* @param direction draw direction (`LV_DIR_HOR` or `LB_DIR_VER`)
|
||||||
|
*/
|
||||||
|
void lv_barcode_set_direction(lv_obj_t * obj, lv_dir_t direction);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the data of a barcode object
|
* Set the data of a barcode object
|
||||||
* @param obj pointer to barcode object
|
* @param obj pointer to barcode object
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 2.7 KiB |
@@ -22,7 +22,6 @@ void test_barcode_normal(void)
|
|||||||
lv_obj_t * barcode = lv_barcode_create(active_screen);
|
lv_obj_t * barcode = lv_barcode_create(active_screen);
|
||||||
TEST_ASSERT_NOT_NULL(barcode);
|
TEST_ASSERT_NOT_NULL(barcode);
|
||||||
|
|
||||||
lv_obj_set_height(barcode, 50);
|
|
||||||
lv_obj_center(barcode);
|
lv_obj_center(barcode);
|
||||||
|
|
||||||
lv_color_t dark_color = lv_color_black();
|
lv_color_t dark_color = lv_color_black();
|
||||||
@@ -37,9 +36,26 @@ void test_barcode_normal(void)
|
|||||||
TEST_ASSERT_EQUAL_COLOR(lv_barcode_get_light_color(barcode), light_color);
|
TEST_ASSERT_EQUAL_COLOR(lv_barcode_get_light_color(barcode), light_color);
|
||||||
TEST_ASSERT_EQUAL(lv_barcode_get_scale(barcode), scale);
|
TEST_ASSERT_EQUAL(lv_barcode_get_scale(barcode), scale);
|
||||||
|
|
||||||
|
lv_barcode_set_direction(barcode, LV_DIR_HOR);
|
||||||
lv_result_t res = lv_barcode_update(barcode, "https://lvgl.io");
|
lv_result_t res = lv_barcode_update(barcode, "https://lvgl.io");
|
||||||
TEST_ASSERT_EQUAL(res, LV_RESULT_OK);
|
TEST_ASSERT_EQUAL(res, LV_RESULT_OK);
|
||||||
|
|
||||||
|
lv_image_dsc_t * image_dsc = lv_canvas_get_image(barcode);
|
||||||
|
TEST_ASSERT_NOT_NULL(image_dsc);
|
||||||
|
|
||||||
|
lv_obj_set_size(barcode, image_dsc->header.w, 50);
|
||||||
TEST_ASSERT_EQUAL_SCREENSHOT("barcode_1.png");
|
TEST_ASSERT_EQUAL_SCREENSHOT("barcode_1.png");
|
||||||
|
|
||||||
|
lv_barcode_set_direction(barcode, LV_DIR_VER);
|
||||||
|
res = lv_barcode_update(barcode, "https://lvgl.io");
|
||||||
|
TEST_ASSERT_EQUAL(res, LV_RESULT_OK);
|
||||||
|
|
||||||
|
image_dsc = lv_canvas_get_image(barcode);
|
||||||
|
TEST_ASSERT_NOT_NULL(image_dsc);
|
||||||
|
|
||||||
|
lv_obj_set_size(barcode, 50, image_dsc->header.h);
|
||||||
|
TEST_ASSERT_EQUAL_SCREENSHOT("barcode_2.png");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|||||||
Reference in New Issue
Block a user