diff --git a/src/libs/lodepng/lodepng.c b/src/libs/lodepng/lodepng.c index 7e37636a20..b339538e53 100644 --- a/src/libs/lodepng/lodepng.c +++ b/src/libs/lodepng/lodepng.c @@ -4668,6 +4668,8 @@ unsigned lodepng_inspect(unsigned * w, unsigned * h, LodePNGState * state, if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); /*error: only interlace methods 0 and 1 exist in the specification*/ if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); + /*error: bitdepths > 8 bits per channel are not supported*/ + if(info->color.bitdepth > 8) CERROR_RETURN_ERROR(state->error, 116); if(!state->decoder.ignore_crc) { unsigned CRC = lodepng_read32bitInt(&in[29]); @@ -7432,6 +7434,8 @@ const char * lodepng_error_text(unsigned code) return "sBIT chunk has wrong size for the color type of the image"; case 115: return "sBIT value out of range"; + case 116: + return "bitdepths > 8 bits per channel are not supported"; } return "unknown error code"; } diff --git a/src/libs/lodepng/lv_lodepng.c b/src/libs/lodepng/lv_lodepng.c index 4ec0b1d137..f61db5bd6f 100644 --- a/src/libs/lodepng/lv_lodepng.c +++ b/src/libs/lodepng/lv_lodepng.c @@ -246,6 +246,7 @@ static lv_draw_buf_t * decode_png_data(const void * png_data, size_t png_data_si /*Decode the image in ARGB8888 */ unsigned error = lodepng_decode32((unsigned char **)&decoded, &png_width, &png_height, png_data, png_data_size); if(error) { + LV_LOG_WARN("error %u: %s", error, lodepng_error_text(error)); if(decoded != NULL) lv_draw_buf_destroy(decoded); return NULL; } diff --git a/tests/src/test_assets/test_16bit_per_channel.png b/tests/src/test_assets/test_16bit_per_channel.png new file mode 100644 index 0000000000..2a9c9587b2 Binary files /dev/null and b/tests/src/test_assets/test_16bit_per_channel.png differ diff --git a/tests/src/test_cases/libs/test_libjpeg_turbo.c b/tests/src/test_cases/libs/test_libjpeg_turbo.c index dad12c9372..7d410fd816 100644 --- a/tests/src/test_cases/libs/test_libjpeg_turbo.c +++ b/tests/src/test_cases/libs/test_libjpeg_turbo.c @@ -8,6 +8,11 @@ void setUp(void) { /* Function run before every test */ + /* Temporarily remove other JPEG decoders to make sure libjpeg is used */ + lv_tjpgd_deinit(); +#if LV_USE_FFMPEG + lv_ffmpeg_deinit(); +#endif } void tearDown(void) @@ -59,9 +64,6 @@ static void create_images(void) void test_jpg_2(void) { - /* Temporarily remove tjpgd decoder */ - lv_tjpgd_deinit(); - create_images(); TEST_ASSERT_EQUAL_SCREENSHOT("libs/jpg_2.png"); @@ -77,25 +79,16 @@ void test_jpg_2(void) TEST_ASSERT_EQUAL_SCREENSHOT("libs/jpg_2.png"); TEST_ASSERT_MEM_LEAK_LESS_THAN(mem_before, 64); - - /* Re-add tjpgd decoder */ - lv_tjpgd_init(); } void test_jpg_cmyk(void) { - /* Temporarily remove tjpgd decoder */ - lv_tjpgd_deinit(); - lv_obj_clean(lv_screen_active()); lv_obj_t * img = lv_image_create(lv_screen_active()); lv_image_set_src(img, "A:src/test_assets/test_img_lvgl_logo_cmyk.jpg"); lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); TEST_ASSERT_EQUAL_SCREENSHOT("libs/jpg_cmyk.png"); - - /* Re-add tjpgd decoder */ - lv_tjpgd_init(); } void test_jpg_sign_error(void) @@ -109,16 +102,10 @@ void test_jpg_sign_error(void) lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); TEST_ASSERT_EQUAL_SCREENSHOT("libs/jpg_sign_error.png"); - - /* Re-add tjpgd decoder */ - lv_tjpgd_init(); } void test_jpg_decode_failed(void) { - /* Temporarily remove tjpgd decoder */ - lv_tjpgd_deinit(); - lv_image_decoder_dsc_t decoder_dsc; const char * image_path = "A:src/test_assets/test_img_lvgl_logo_with_decode_failed.jpg"; @@ -127,9 +114,6 @@ void test_jpg_decode_failed(void) /* Should fail when decoder is removed */ TEST_ASSERT_EQUAL(LV_RESULT_INVALID, res); - - /* Re-add tjpgd decoder */ - lv_tjpgd_init(); } #endif diff --git a/tests/src/test_cases/libs/test_libpng.c b/tests/src/test_cases/libs/test_libpng.c index 5eca0e02ad..a8c922e10b 100644 --- a/tests/src/test_cases/libs/test_libpng.c +++ b/tests/src/test_cases/libs/test_libpng.c @@ -8,6 +8,11 @@ void setUp(void) { /* Function run before every test */ + /* Temporarily remove other PNG-capable decoders (lodepng/ffmpeg) to make sure libpng is used */ + lv_lodepng_deinit(); +#if LV_USE_FFMPEG + lv_ffmpeg_deinit(); +#endif } void tearDown(void) diff --git a/tests/src/test_cases/libs/test_lodepng.c b/tests/src/test_cases/libs/test_lodepng.c index fbd5b22cd3..5b1cb3b391 100644 --- a/tests/src/test_cases/libs/test_lodepng.c +++ b/tests/src/test_cases/libs/test_lodepng.c @@ -8,6 +8,11 @@ void setUp(void) { /* Function run before every test */ + /* Temporarily remove other PNG decoders to make sure lodepng is used */ + lv_libpng_deinit(); +#if LV_USE_FFMPEG + lv_ffmpeg_deinit(); +#endif } void tearDown(void) @@ -76,4 +81,14 @@ void test_lodepng_1(void) lv_libpng_init(); } +void test_lodepng_no_crash_with_16bit(void) +{ + /*LodePNG should return a custom error code (116) as it's crash with 16 bit/channel images. + *(Consider upstreaming the changes)*/ + lv_obj_t * img = lv_image_create(lv_screen_active()); + lv_image_set_src(img, "A:src/test_assets/test_16bit_per_channel.png"); + lv_refr_now(NULL); +} + + #endif diff --git a/tests/src/test_cases/libs/test_tjpgd.c b/tests/src/test_cases/libs/test_tjpgd.c index 01dd297ac4..98908f7421 100644 --- a/tests/src/test_cases/libs/test_tjpgd.c +++ b/tests/src/test_cases/libs/test_tjpgd.c @@ -8,6 +8,11 @@ void setUp(void) { /* Function run before every test */ + /* Temporarily remove other JPEG decoders to make sure tjpegd is used */ + lv_libjpeg_turbo_deinit(); +#if LV_USE_FFMPEG + lv_ffmpeg_deinit(); +#endif } void tearDown(void)