diff options
Diffstat (limited to 'winpr/libwinpr/utils/test/TestImage.c')
-rw-r--r-- | winpr/libwinpr/utils/test/TestImage.c | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/winpr/libwinpr/utils/test/TestImage.c b/winpr/libwinpr/utils/test/TestImage.c new file mode 100644 index 0000000..8635fa1 --- /dev/null +++ b/winpr/libwinpr/utils/test/TestImage.c @@ -0,0 +1,232 @@ +#include <stdio.h> +#include <winpr/string.h> +#include <winpr/assert.h> +#include <winpr/file.h> +#include <winpr/path.h> +#include <winpr/image.h> + +static const char test_src_filename[] = TEST_SOURCE_PATH "/rgb"; +static const char test_bin_filename[] = TEST_BINARY_PATH "/rgb"; + +static BOOL test_image_equal(const wImage* imageA, const wImage* imageB) +{ + return winpr_image_equal(imageA, imageB, + WINPR_IMAGE_CMP_IGNORE_DEPTH | WINPR_IMAGE_CMP_IGNORE_ALPHA | + WINPR_IMAGE_CMP_FUZZY); +} + +static BOOL test_equal_to(const wImage* bmp, const char* name, UINT32 format) +{ + BOOL rc = FALSE; + wImage* cmp = winpr_image_new(); + if (!cmp) + goto fail; + + char path[MAX_PATH] = { 0 }; + _snprintf(path, sizeof(path), "%s.%s", name, winpr_image_format_extension(format)); + const int cmpSize = winpr_image_read(cmp, path); + if (cmpSize <= 0) + { + fprintf(stderr, "[%s] winpr_image_read failed for %s", __func__, path); + goto fail; + } + + rc = test_image_equal(bmp, cmp); + if (!rc) + fprintf(stderr, "[%s] winpr_image_eqal failed", __func__); + +fail: + winpr_image_free(cmp, TRUE); + return rc; +} + +static BOOL test_equal(void) +{ + BOOL rc = FALSE; + wImage* bmp = winpr_image_new(); + + if (!bmp) + goto fail; + + char path[MAX_PATH] = { 0 }; + _snprintf(path, sizeof(path), "%s.bmp", test_src_filename); + PathCchConvertStyleA(path, sizeof(path), PATH_STYLE_NATIVE); + + const int bmpSize = winpr_image_read(bmp, path); + if (bmpSize <= 0) + { + fprintf(stderr, "[%s] winpr_image_read failed for %s", __func__, path); + goto fail; + } + + for (UINT32 x = 0; x < UINT8_MAX; x++) + { + if (!winpr_image_format_is_supported(x)) + continue; + if (!test_equal_to(bmp, test_src_filename, x)) + goto fail; + } + + rc = TRUE; +fail: + winpr_image_free(bmp, TRUE); + + return rc; +} + +static BOOL test_read_write_compare(const char* tname, const char* tdst, UINT32 format) +{ + BOOL rc = FALSE; + wImage* bmp1 = winpr_image_new(); + wImage* bmp2 = winpr_image_new(); + wImage* bmp3 = winpr_image_new(); + if (!bmp1 || !bmp2 || !bmp3) + goto fail; + + char spath[MAX_PATH] = { 0 }; + char dpath[MAX_PATH] = { 0 }; + char bpath1[MAX_PATH] = { 0 }; + char bpath2[MAX_PATH] = { 0 }; + _snprintf(spath, sizeof(spath), "%s.%s", tname, winpr_image_format_extension(format)); + _snprintf(dpath, sizeof(dpath), "%s.%s", tdst, winpr_image_format_extension(format)); + _snprintf(bpath1, sizeof(bpath1), "%s.src.%s", dpath, + winpr_image_format_extension(WINPR_IMAGE_BITMAP)); + _snprintf(bpath2, sizeof(bpath2), "%s.bin.%s", dpath, + winpr_image_format_extension(WINPR_IMAGE_BITMAP)); + PathCchConvertStyleA(spath, sizeof(spath), PATH_STYLE_NATIVE); + PathCchConvertStyleA(dpath, sizeof(dpath), PATH_STYLE_NATIVE); + PathCchConvertStyleA(bpath1, sizeof(bpath1), PATH_STYLE_NATIVE); + PathCchConvertStyleA(bpath2, sizeof(bpath2), PATH_STYLE_NATIVE); + + const int bmpRSize = winpr_image_read(bmp1, spath); + if (bmpRSize <= 0) + { + fprintf(stderr, "[%s] winpr_image_read failed for %s", __func__, spath); + goto fail; + } + + const int bmpWSize = winpr_image_write(bmp1, dpath); + if (bmpWSize <= 0) + { + fprintf(stderr, "[%s] winpr_image_write failed for %s", __func__, dpath); + goto fail; + } + + const int bmp2RSize = winpr_image_read(bmp2, dpath); + if (bmp2RSize <= 0) + { + fprintf(stderr, "[%s] winpr_image_read failed for %s", __func__, dpath); + goto fail; + } + + const int bmpSrcWSize = winpr_image_write_ex(bmp1, WINPR_IMAGE_BITMAP, bpath1); + if (bmpSrcWSize <= 0) + { + fprintf(stderr, "[%s] winpr_image_write_ex failed for %s", __func__, bpath1); + goto fail; + } + + /* write a bitmap and read it back. + * this tests if we have the proper internal format */ + const int bmpBinWSize = winpr_image_write_ex(bmp2, WINPR_IMAGE_BITMAP, bpath2); + if (bmpBinWSize <= 0) + { + fprintf(stderr, "[%s] winpr_image_write_ex failed for %s", __func__, bpath2); + goto fail; + } + + const int bmp3RSize = winpr_image_read(bmp3, bpath2); + if (bmp3RSize <= 0) + { + fprintf(stderr, "[%s] winpr_image_read failed for %s", __func__, bpath2); + goto fail; + } + + if (!winpr_image_equal(bmp1, bmp2, + WINPR_IMAGE_CMP_IGNORE_DEPTH | WINPR_IMAGE_CMP_IGNORE_ALPHA | + WINPR_IMAGE_CMP_FUZZY)) + { + fprintf(stderr, "[%s] winpr_image_eqal failed bmp1 bmp2", __func__); + goto fail; + } + + rc = winpr_image_equal(bmp3, bmp2, + WINPR_IMAGE_CMP_IGNORE_DEPTH | WINPR_IMAGE_CMP_IGNORE_ALPHA | + WINPR_IMAGE_CMP_FUZZY); + if (!rc) + fprintf(stderr, "[%s] winpr_image_eqal failed bmp3 bmp2", __func__); +fail: + winpr_image_free(bmp1, TRUE); + winpr_image_free(bmp2, TRUE); + winpr_image_free(bmp3, TRUE); + return rc; +} + +static BOOL test_read_write(void) +{ + BOOL rc = TRUE; + for (UINT32 x = 0; x < UINT8_MAX; x++) + { + if (!winpr_image_format_is_supported(x)) + continue; + if (!test_read_write_compare(test_src_filename, test_bin_filename, x)) + rc = FALSE; + } + return rc; +} + +static BOOL test_load_file(const char* name) +{ + BOOL rc = FALSE; + wImage* image = winpr_image_new(); + if (!image || !name) + goto fail; + + const int res = winpr_image_read(image, name); + rc = (res > 0) ? TRUE : FALSE; + +fail: + winpr_image_free(image, TRUE); + return rc; +} + +static BOOL test_load(void) +{ + const char* names[] = { + "rgb.16a.bmp", "rgb.16a.nocolor.bmp", "rgb.16.bmp", "rgb.16.nocolor.bmp", + "rgb.16x.bmp", "rgb.16x.nocolor.bmp", "rgb.24.bmp", "rgb.24.nocolor.bmp", + "rgb.32.bmp", "rgb.32.nocolor.bmp", "rgb.32x.bmp", "rgb.32x.nocolor.bmp", + "rgb.bmp" + }; + + for (size_t x = 0; x < ARRAYSIZE(names); x++) + { + const char* name = names[x]; + char* fname = GetCombinedPath(TEST_SOURCE_PATH, name); + const BOOL res = test_load_file(fname); + free(fname); + if (!res) + return FALSE; + } + + return TRUE; +} + +int TestImage(int argc, char* argv[]) +{ + int rc = 0; + + WINPR_UNUSED(argc); + WINPR_UNUSED(argv); + + if (!test_equal()) + rc -= 1; + + if (!test_read_write()) + rc -= 2; + + if (!test_load()) + rc -= 4; + + return rc; +} |