Blame winpr/libwinpr/utils/test/TestImage.c

Packit 1fb8d4
#include <winpr/wtypes.h>
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/path.h>
Packit 1fb8d4
#include <winpr/print.h>
Packit 1fb8d4
#include <winpr/image.h>
Packit 1fb8d4
#include <winpr/environment.h>
Packit 1fb8d4
Packit 1fb8d4
#ifndef PATH_MAX
Packit 1fb8d4
#define PATH_MAX 4096
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
static void* read_image(const char* src, size_t* size)
Packit 1fb8d4
{
Packit 1fb8d4
	int success = 0;
Packit 1fb8d4
	void* a = NULL;
Packit 1fb8d4
	INT64 src_size;
Packit 1fb8d4
	FILE* fsrc = fopen(src, "rb");
Packit 1fb8d4
Packit 1fb8d4
	if (!fsrc)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Failed to open file %s\n", src);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (_fseeki64(fsrc, 0, SEEK_END))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Failed to seek to file end\n");
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	src_size = _ftelli64(fsrc);
Packit Service 5a9772
	if (src_size < 0)
Packit Service 5a9772
	{
Packit Service 5a9772
		fprintf(stderr, "Invalid file position %" PRId64 "\n", src_size);
Packit Service 5a9772
		goto cleanup;
Packit Service 5a9772
	}
Packit 1fb8d4
	if (_fseeki64(fsrc, 0, SEEK_SET))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Failed to seek to SEEK_SET\n");
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit Service 5a9772
	a = malloc((size_t)src_size);
Packit 1fb8d4
Packit 1fb8d4
	if (!a)
Packit 1fb8d4
	{
Packit Service 5a9772
		fprintf(stderr, "Failed malloc %" PRId64 " bytes\n", src_size);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit Service 5a9772
	if (fread(a, sizeof(char), (size_t)src_size, fsrc) != (size_t)src_size)
Packit 1fb8d4
	{
Packit Service 5a9772
		fprintf(stderr, "Failed read %" PRId64 " bytes\n", src_size);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	success = 1;
Packit 1fb8d4
	*size = src_size;
Packit 1fb8d4
cleanup:
Packit 1fb8d4
Packit 1fb8d4
	if (a && !success)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(a);
Packit 1fb8d4
		a = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (fsrc)
Packit 1fb8d4
		fclose(fsrc);
Packit 1fb8d4
Packit 1fb8d4
	return a;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int img_compare(wImage* image, wImage* image2, BOOL ignoreType)
Packit 1fb8d4
{
Packit 1fb8d4
	int rc = -1;
Packit 1fb8d4
Packit 1fb8d4
	if ((image->type != image2->type) && !ignoreType)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Image type mismatch %d:%d\n", image->type, image2->type);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (image->width != image2->width)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Image width mismatch %d:%d\n", image->width, image2->width);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (image->height != image2->height)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Image height mismatch %d:%d\n", image->height, image2->height);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (image->scanline != image2->scanline)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Image scanline mismatch %d:%d\n", image->scanline, image2->scanline);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (image->bitsPerPixel != image2->bitsPerPixel)
Packit 1fb8d4
	{
Packit Service 5a9772
		fprintf(stderr, "Image bitsPerPixel mismatch %d:%d\n", image->bitsPerPixel,
Packit Service 5a9772
		        image2->bitsPerPixel);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (image->bytesPerPixel != image2->bytesPerPixel)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Image bytesPerPixel mismatch %d:%d\n", image->bytesPerPixel,
Packit 1fb8d4
		        image2->bytesPerPixel);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	rc = memcmp(image->data, image2->data, image->scanline * image->height);
Packit 1fb8d4
Packit 1fb8d4
	if (rc)
Packit 1fb8d4
		fprintf(stderr, "Image data mismatch!\n");
Packit 1fb8d4
Packit 1fb8d4
cleanup:
Packit 1fb8d4
	return rc;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static wImage* get_image(const char* src)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit 1fb8d4
	wImage* image = NULL;
Packit 1fb8d4
	image = winpr_image_new();
Packit 1fb8d4
Packit 1fb8d4
	if (!image)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Failed to create image!");
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	status = winpr_image_read(image, src);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Failed to read image %s!", src);
Packit 1fb8d4
		winpr_image_free(image, TRUE);
Packit 1fb8d4
		image = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
cleanup:
Packit 1fb8d4
	return image;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int create_test(const char* src, const char* dst_png, const char* dst_bmp)
Packit 1fb8d4
{
Packit 1fb8d4
	int rc = -1;
Packit 1fb8d4
	int ret = -1;
Packit 1fb8d4
	int status;
Packit 1fb8d4
	size_t bsize;
Packit 1fb8d4
	void* buffer = NULL;
Packit Service 5a9772
	wImage *image = NULL, *image2 = NULL, *image3 = NULL, *image4 = NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (!PathFileExistsA(src))
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "File %s does not exist!", src);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	image = get_image(src);
Packit 1fb8d4
Packit 1fb8d4
	/* Read from file using image methods. */
Packit 1fb8d4
	if (!image)
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
Packit 1fb8d4
	/* Write different formats to tmp. */
Packit 1fb8d4
	image->type = WINPR_IMAGE_BITMAP;
Packit 1fb8d4
	status = winpr_image_write(image, dst_bmp);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Failed to write image %s!\n", dst_bmp);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	image->type = WINPR_IMAGE_PNG;
Packit 1fb8d4
	status = winpr_image_write(image, dst_png);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Failed to write image %s!\n", dst_png);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/* Read image from buffer, compare. */
Packit 1fb8d4
	buffer = read_image(src, &bsize);
Packit 1fb8d4
Packit 1fb8d4
	if (!buffer)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Failed to read image %s!\n", src);
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	image2 = winpr_image_new();
Packit 1fb8d4
Packit 1fb8d4
	if (!image2)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Failed to create image!\n");
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	status = winpr_image_read_buffer(image2, buffer, bsize);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		fprintf(stderr, "Failed to read buffer!\n");
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	rc = img_compare(image, image2, TRUE);
Packit 1fb8d4
Packit 1fb8d4
	if (rc)
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
Packit 1fb8d4
	image3 = get_image(dst_png);
Packit 1fb8d4
Packit 1fb8d4
	if (!image3)
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
Packit 1fb8d4
	rc = img_compare(image, image3, TRUE);
Packit 1fb8d4
Packit 1fb8d4
	if (rc)
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
Packit 1fb8d4
	image4 = get_image(dst_bmp);
Packit 1fb8d4
Packit 1fb8d4
	if (!image4)
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
Packit 1fb8d4
	rc = img_compare(image, image4, TRUE);
Packit 1fb8d4
Packit 1fb8d4
	if (rc)
Packit 1fb8d4
		goto cleanup;
Packit 1fb8d4
Packit 1fb8d4
	ret = 0;
Packit 1fb8d4
cleanup:
Packit 1fb8d4
Packit 1fb8d4
	if (image)
Packit 1fb8d4
		winpr_image_free(image, TRUE);
Packit 1fb8d4
Packit 1fb8d4
	if (image2)
Packit 1fb8d4
		winpr_image_free(image2, TRUE);
Packit 1fb8d4
Packit 1fb8d4
	if (image3)
Packit 1fb8d4
		winpr_image_free(image3, TRUE);
Packit 1fb8d4
Packit 1fb8d4
	if (image4)
Packit 1fb8d4
		winpr_image_free(image4, TRUE);
Packit 1fb8d4
Packit 1fb8d4
	free(buffer);
Packit 1fb8d4
	return ret;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int test_image_png_to_bmp(void)
Packit 1fb8d4
{
Packit 1fb8d4
	char* buffer = TEST_SOURCE_PATH;
Packit 1fb8d4
	char src_png[PATH_MAX];
Packit 1fb8d4
	char src_bmp[PATH_MAX];
Packit 1fb8d4
	char dst_png[PATH_MAX];
Packit 1fb8d4
	char dst_bmp[PATH_MAX];
Packit 1fb8d4
	char dst_png2[PATH_MAX];
Packit 1fb8d4
	char dst_bmp2[PATH_MAX];
Packit 1fb8d4
	char* tmp = GetKnownPath(KNOWN_PATH_TEMP);
Packit 1fb8d4
Packit 1fb8d4
	if (!tmp)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (!buffer)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(tmp);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	sprintf_s(src_png, sizeof(src_png), "%s/lodepng_32bit.png", buffer);
Packit 1fb8d4
	sprintf_s(src_bmp, sizeof(src_bmp), "%s/lodepng_32bit.bmp", buffer);
Packit 1fb8d4
	sprintf_s(dst_png, sizeof(dst_png), "%s/lodepng_32bit.png", tmp);
Packit 1fb8d4
	sprintf_s(dst_bmp, sizeof(dst_bmp), "%s/lodepng_32bit.bmp", tmp);
Packit 1fb8d4
	sprintf_s(dst_png2, sizeof(dst_png2), "%s/lodepng_32bit-2.png", tmp);
Packit 1fb8d4
	sprintf_s(dst_bmp2, sizeof(dst_bmp2), "%s/lodepng_32bit-2.bmp", tmp);
Packit 1fb8d4
	free(tmp);
Packit 1fb8d4
Packit 1fb8d4
	if (create_test(src_png, dst_png, dst_bmp))
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	if (create_test(src_bmp, dst_png2, dst_bmp2))
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int TestImage(int argc, char* argv[])
Packit 1fb8d4
{
Packit 1fb8d4
	int rc = test_image_png_to_bmp();
Packit 1fb8d4
	return rc;
Packit 1fb8d4
}