Blame libfreerdp/gdi/test/helpers.c

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