Blame libfreerdp/gdi/test/helpers.c

Packit Service fa4841
/**
Packit Service fa4841
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit Service fa4841
 * GDI Library Tests
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2016 Armin Novak <armin.novak@thincast.com>
Packit Service fa4841
 * Copyright 2016 Thincast Technologies GmbH
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *	 http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
#include "helpers.h"
Packit Service fa4841
Packit Service b1ea74
HGDI_BITMAP test_convert_to_bitmap(const BYTE* src, UINT32 SrcFormat, UINT32 SrcStride, UINT32 xSrc,
Packit Service b1ea74
                                   UINT32 ySrc, UINT32 DstFormat, UINT32 DstStride, UINT32 xDst,
Packit Service b1ea74
                                   UINT32 yDst, UINT32 nWidth, UINT32 nHeight,
Packit Service fa4841
                                   const gdiPalette* hPalette)
Packit Service fa4841
{
Packit Service fa4841
	HGDI_BITMAP bmp;
Packit Service fa4841
	BYTE* data;
Packit Service fa4841
Packit Service fa4841
	if (DstStride == 0)
Packit Service fa4841
		DstStride = nWidth * GetBytesPerPixel(DstFormat);
Packit Service fa4841
Packit Service fa4841
	data = _aligned_malloc(DstStride * nHeight, 16);
Packit Service fa4841
Packit Service fa4841
	if (!data)
Packit Service fa4841
		return NULL;
Packit Service fa4841
Packit Service b1ea74
	if (!freerdp_image_copy(data, DstFormat, DstStride, xDst, yDst, nWidth, nHeight, src, SrcFormat,
Packit Service b1ea74
	                        SrcStride, xSrc, ySrc, hPalette, FREERDP_FLIP_NONE))
Packit Service fa4841
	{
Packit Service fa4841
		_aligned_free(data);
Packit Service fa4841
		return NULL;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	bmp = gdi_CreateBitmap(nWidth, nHeight, DstFormat, data);
Packit Service fa4841
Packit Service fa4841
	if (!bmp)
Packit Service fa4841
	{
Packit Service fa4841
		_aligned_free(data);
Packit Service fa4841
		return NULL;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return bmp;
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
static void test_dump_data(unsigned char* p, int len, int width, const char* name)
Packit Service fa4841
{
Packit Service fa4841
	unsigned char* line = p;
Packit Service fa4841
	int i, thisline, offset = 0;
Packit Service fa4841
	printf("\n%s[%d][%d]:\n", name, len / width, width);
Packit Service fa4841
Packit Service fa4841
	while (offset < len)
Packit Service fa4841
	{
Packit Service fa4841
		printf("%04x ", offset);
Packit Service fa4841
		thisline = len - offset;
Packit Service fa4841
Packit Service fa4841
		if (thisline > width)
Packit Service fa4841
			thisline = width;
Packit Service fa4841
Packit Service fa4841
		for (i = 0; i < thisline; i++)
Packit Service fa4841
			printf("%02x ", line[i]);
Packit Service fa4841
Packit Service fa4841
		for (; i < width; i++)
Packit Service fa4841
			printf("   ");
Packit Service fa4841
Packit Service fa4841
		printf("\n");
Packit Service fa4841
		offset += thisline;
Packit Service fa4841
		line += thisline;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	printf("\n");
Packit Service fa4841
	fflush(stdout);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
void test_dump_bitmap(HGDI_BITMAP hBmp, const char* name)
Packit Service fa4841
{
Packit Service fa4841
	UINT32 stride = hBmp->width * GetBytesPerPixel(hBmp->format);
Packit Service fa4841
	test_dump_data(hBmp->data, hBmp->height * stride, stride, name);
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
static BOOL CompareBitmaps(HGDI_BITMAP hBmp1, HGDI_BITMAP hBmp2, const gdiPalette* palette)
Packit Service fa4841
{
Packit Service fa4841
	UINT32 x, y;
Packit Service fa4841
	const BYTE* p1 = hBmp1->data;
Packit Service fa4841
	const BYTE* p2 = hBmp2->data;
Packit Service fa4841
	UINT32 colorA, colorB;
Packit Service fa4841
	UINT32 minw = (hBmp1->width < hBmp2->width) ? hBmp1->width : hBmp2->width;
Packit Service fa4841
	UINT32 minh = (hBmp1->height < hBmp2->height) ? hBmp1->height : hBmp2->height;
Packit Service fa4841
Packit Service fa4841
	for (y = 0; y < minh; y++)
Packit Service fa4841
	{
Packit Service fa4841
		for (x = 0; x < minw; x++)
Packit Service fa4841
		{
Packit Service fa4841
			colorA = ReadColor(p1, hBmp1->format);
Packit Service fa4841
			colorB = ReadColor(p2, hBmp2->format);
Packit Service fa4841
			p1 += GetBytesPerPixel(hBmp1->format);
Packit Service fa4841
			p2 += GetBytesPerPixel(hBmp2->format);
Packit Service fa4841
Packit Service fa4841
			if (hBmp1->format != hBmp2->format)
Packit Service fa4841
				colorB = FreeRDPConvertColor(colorB, hBmp2->format, hBmp1->format, palette);
Packit Service fa4841
Packit Service fa4841
			if (colorA != colorB)
Packit Service fa4841
				return FALSE;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
BOOL test_assert_bitmaps_equal(HGDI_BITMAP hBmpActual, HGDI_BITMAP hBmpExpected, const char* name,
Packit Service fa4841
                               const gdiPalette* palette)
Packit Service fa4841
{
Packit Service fa4841
	BOOL bitmapsEqual = CompareBitmaps(hBmpActual, hBmpExpected, palette);
Packit Service fa4841
Packit Service fa4841
	if (!bitmapsEqual)
Packit Service fa4841
	{
Packit Service b1ea74
		printf("Testing ROP %s [%s|%s]\n", name, FreeRDPGetColorFormatName(hBmpActual->format),
Packit Service fa4841
		       FreeRDPGetColorFormatName(hBmpExpected->format));
Packit Service fa4841
		test_dump_bitmap(hBmpActual, "Actual");
Packit Service fa4841
		test_dump_bitmap(hBmpExpected, "Expected");
Packit Service fa4841
		fflush(stdout);
Packit Service fa4841
		fflush(stderr);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return bitmapsEqual;
Packit Service fa4841
}