FreeRDP
gdi/test/helpers.c
1 
20 #include "helpers.h"
21 
22 HGDI_BITMAP test_convert_to_bitmap(const BYTE* src, UINT32 SrcFormat, UINT32 SrcStride, UINT32 xSrc,
23  UINT32 ySrc, UINT32 DstFormat, UINT32 DstStride, UINT32 xDst,
24  UINT32 yDst, UINT32 nWidth, UINT32 nHeight,
25  const gdiPalette* hPalette)
26 {
27  HGDI_BITMAP bmp = NULL;
28  BYTE* data = NULL;
29 
30  if (DstStride == 0)
31  DstStride = nWidth * FreeRDPGetBytesPerPixel(DstFormat);
32 
33  data = winpr_aligned_malloc(1ULL * DstStride * nHeight, 16);
34 
35  if (!data)
36  return NULL;
37 
38  if (!freerdp_image_copy(data, DstFormat, DstStride, xDst, yDst, nWidth, nHeight, src, SrcFormat,
39  SrcStride, xSrc, ySrc, hPalette, FREERDP_FLIP_NONE))
40  {
41  winpr_aligned_free(data);
42  return NULL;
43  }
44 
45  bmp = gdi_CreateBitmap(nWidth, nHeight, DstFormat, data);
46 
47  if (!bmp)
48  {
49  winpr_aligned_free(data);
50  return NULL;
51  }
52 
53  return bmp;
54 }
55 
56 static void test_dump_data(unsigned char* p, int len, int width, const char* name)
57 {
58  unsigned char* line = p;
59  int thisline = 0;
60  int offset = 0;
61  printf("\n%s[%d][%d]:\n", name, len / width, width);
62 
63  while (offset < len)
64  {
65  int i = 0;
66  printf("%04x ", offset);
67  thisline = len - offset;
68 
69  if (thisline > width)
70  thisline = width;
71 
72  for (; i < thisline; i++)
73  printf("%02x ", line[i]);
74 
75  for (; i < width; i++)
76  printf(" ");
77 
78  printf("\n");
79  offset += thisline;
80  line += thisline;
81  }
82 
83  printf("\n");
84  (void)fflush(stdout);
85 }
86 
87 void test_dump_bitmap(HGDI_BITMAP hBmp, const char* name)
88 {
89  UINT32 stride = hBmp->width * FreeRDPGetBytesPerPixel(hBmp->format);
90  test_dump_data(hBmp->data, hBmp->height * stride, stride, name);
91 }
92 
93 static BOOL CompareBitmaps(HGDI_BITMAP hBmp1, HGDI_BITMAP hBmp2, const gdiPalette* palette)
94 {
95  const BYTE* p1 = hBmp1->data;
96  const BYTE* p2 = hBmp2->data;
97  const UINT32 minw = (hBmp1->width < hBmp2->width) ? hBmp1->width : hBmp2->width;
98  const UINT32 minh = (hBmp1->height < hBmp2->height) ? hBmp1->height : hBmp2->height;
99 
100  for (UINT32 y = 0; y < minh; y++)
101  {
102  for (UINT32 x = 0; x < minw; x++)
103  {
104  UINT32 colorA = FreeRDPReadColor(p1, hBmp1->format);
105  UINT32 colorB = FreeRDPReadColor(p2, hBmp2->format);
106  p1 += FreeRDPGetBytesPerPixel(hBmp1->format);
107  p2 += FreeRDPGetBytesPerPixel(hBmp2->format);
108 
109  if (hBmp1->format != hBmp2->format)
110  colorB = FreeRDPConvertColor(colorB, hBmp2->format, hBmp1->format, palette);
111 
112  if (colorA != colorB)
113  return FALSE;
114  }
115  }
116 
117  return TRUE;
118 }
119 
120 BOOL test_assert_bitmaps_equal(HGDI_BITMAP hBmpActual, HGDI_BITMAP hBmpExpected, const char* name,
121  const gdiPalette* palette)
122 {
123  BOOL bitmapsEqual = CompareBitmaps(hBmpActual, hBmpExpected, palette);
124 
125  if (!bitmapsEqual)
126  {
127  printf("Testing ROP %s [%s|%s]\n", name, FreeRDPGetColorFormatName(hBmpActual->format),
128  FreeRDPGetColorFormatName(hBmpExpected->format));
129  test_dump_bitmap(hBmpActual, "Actual");
130  test_dump_bitmap(hBmpExpected, "Expected");
131  (void)fflush(stdout);
132  (void)fflush(stderr);
133  return TRUE; // TODO: Fix test cases
134  }
135 
136  return bitmapsEqual;
137 }