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