From 2f67d804ce7fccab691e2703083f927e1601fedf Mon Sep 17 00:00:00 2001 From: Lemon <31126787+liujp-arch@users.noreply.github.com> Date: Mon, 25 Sep 2023 03:41:24 +0800 Subject: [PATCH] feat(barcode): add vertical display mode (#4564) Signed-off-by: liujp Co-authored-by: liujp --- docs/libs/barcode.rst | 6 +++-- src/libs/barcode/lv_barcode.c | 29 ++++++++++++++++++----- src/libs/barcode/lv_barcode.h | 8 +++++++ tests/ref_imgs/barcode_2.png | Bin 0 -> 2762 bytes tests/src/test_cases/libs/test_barcode.c | 18 +++++++++++++- 5 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 tests/ref_imgs/barcode_2.png diff --git a/docs/libs/barcode.rst b/docs/libs/barcode.rst index 54ecd9870..2ffd6c73f 100644 --- a/docs/libs/barcode.rst +++ b/docs/libs/barcode.rst @@ -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. 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 -regenerate the barcode. +to adjust scaling and color, call :c:expr:`lv_barcode_set_direction()` will set +direction to display, and call :c:expr:`lv_barcode_update()` again to regenerate +the barcode. Notes ----- @@ -26,6 +27,7 @@ Notes display will be incomplete due to truncation. - The scale adjustment can only be an integer multiple, for example, :c:expr:`lv_barcode_set_scale(barcode, 2)` means 2x scaling. +- The direction adjustment can be `LV_DIR_HOR` or `LV_DIR_VER` Example ------- diff --git a/src/libs/barcode/lv_barcode.c b/src/libs/barcode/lv_barcode.c index 208008a47..eb44ebe2f 100644 --- a/src/libs/barcode/lv_barcode.c +++ b/src/libs/barcode/lv_barcode.c @@ -25,7 +25,7 @@ **********************/ 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 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 @@ -83,6 +83,14 @@ void lv_barcode_set_scale(lv_obj_t * obj, uint16_t 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_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); 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; } @@ -123,7 +134,12 @@ lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data) lv_color_t color; color = lv_color_from_int(out_buf[x] ? 0 : 1); 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->light_color = lv_color_white(); barcode->scale = 1; + barcode->direction = LV_DIR_HOR; } 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; } -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(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); 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); 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; } - 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); return true; } diff --git a/src/libs/barcode/lv_barcode.h b/src/libs/barcode/lv_barcode.h index d6075ae48..864eafd0e 100644 --- a/src/libs/barcode/lv_barcode.h +++ b/src/libs/barcode/lv_barcode.h @@ -30,6 +30,7 @@ typedef struct { lv_color_t dark_color; lv_color_t light_color; uint16_t scale; + lv_dir_t direction; } lv_barcode_t; 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); +/** + * 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 * @param obj pointer to barcode object diff --git a/tests/ref_imgs/barcode_2.png b/tests/ref_imgs/barcode_2.png new file mode 100644 index 0000000000000000000000000000000000000000..dee29fc13058abfe5efa83a77f07ad2fa58ff9e7 GIT binary patch literal 2762 zcmcImT}V@L6hFIeZaN)?biqorf_m8y=_OGzbz)LTNDs=OMpV8?h6XiQY<@fxLSGNr z!2e9H zK{G4XDEflp;TsQiMkv3AkKkjb7hK@t5pB|IZu38}4fyLsGq|7n1-P51Y~1p>EfteF z`gR|{WzlSZdv-Z9=!9Y_=EdOt1h{QFv0~TQ;*EwwS7s1Id*<6p%uD5r>DfMAXH~y0 z`4mA#Pv>MRmb|>-&>QF1D(aED6`YrTCS$f5X>g^dBK~y7`R-g}5(de&Cl|egMG`m}jQ_xfgp^e@ZRkxlOkGX9 z?5D6BM69eL8TWj{RN9CE+44TFmIP1ICS+_rB zl7#`&R^EiZn9xE6IIyK@@+Mx`5Oidp9E5AZp;3_R#csXA$Y+76SCZb^PGK^=q^P43 zc_UP+xIy^+gPUV)F1((xZ`l?ge)nW_SwQ?_eOzu(h=KxvJM1NpBXY_>bH$&c9)(A`}(`I?C?(1YL+(NvE#nW cjC^>cOgy?Aw%-YS!EaP(ZfvnWtGD<41?58*6#xJL literal 0 HcmV?d00001 diff --git a/tests/src/test_cases/libs/test_barcode.c b/tests/src/test_cases/libs/test_barcode.c index 1eb036de8..3c04ac952 100644 --- a/tests/src/test_cases/libs/test_barcode.c +++ b/tests/src/test_cases/libs/test_barcode.c @@ -22,7 +22,6 @@ void test_barcode_normal(void) lv_obj_t * barcode = lv_barcode_create(active_screen); TEST_ASSERT_NOT_NULL(barcode); - lv_obj_set_height(barcode, 50); lv_obj_center(barcode); 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(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"); 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"); + + 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