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, size_t len, size_t width, const char* name)
57 {
58  unsigned char* line = p;
59  const size_t stride = (width > 0) ? len / width : 1;
60  size_t offset = 0;
61  printf("\n%s[%" PRIuz "][%" PRIuz "]:\n", name, stride, width);
62 
63  while (offset < len)
64  {
65  size_t i = 0;
66  printf("%04" PRIxz " ", offset);
67  size_t 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  const size_t stride =
90  WINPR_ASSERTING_INT_CAST(size_t, hBmp->width) * FreeRDPGetBytesPerPixel(hBmp->format);
91  test_dump_data(hBmp->data, stride * WINPR_ASSERTING_INT_CAST(uint32_t, hBmp->height), stride,
92  name);
93 }
94 
95 static BOOL CompareBitmaps(HGDI_BITMAP hBmp1, HGDI_BITMAP hBmp2, const gdiPalette* palette)
96 {
97  const BYTE* p1 = hBmp1->data;
98  const BYTE* p2 = hBmp2->data;
99  const UINT32 minw = WINPR_ASSERTING_INT_CAST(
100  uint32_t, (hBmp1->width < hBmp2->width) ? hBmp1->width : hBmp2->width);
101  const UINT32 minh = WINPR_ASSERTING_INT_CAST(
102  uint32_t, (hBmp1->height < hBmp2->height) ? hBmp1->height : hBmp2->height);
103 
104  for (UINT32 y = 0; y < minh; y++)
105  {
106  for (UINT32 x = 0; x < minw; x++)
107  {
108  UINT32 colorA = FreeRDPReadColor(p1, hBmp1->format);
109  UINT32 colorB = FreeRDPReadColor(p2, hBmp2->format);
110  p1 += FreeRDPGetBytesPerPixel(hBmp1->format);
111  p2 += FreeRDPGetBytesPerPixel(hBmp2->format);
112 
113  if (hBmp1->format != hBmp2->format)
114  colorB = FreeRDPConvertColor(colorB, hBmp2->format, hBmp1->format, palette);
115 
116  if (colorA != colorB)
117  return FALSE;
118  }
119  }
120 
121  return TRUE;
122 }
123 
124 BOOL test_assert_bitmaps_equal(HGDI_BITMAP hBmpActual, HGDI_BITMAP hBmpExpected, const char* name,
125  const gdiPalette* palette)
126 {
127  BOOL bitmapsEqual = CompareBitmaps(hBmpActual, hBmpExpected, palette);
128 
129  if (!bitmapsEqual)
130  {
131  printf("Testing ROP %s [%s|%s]\n", name, FreeRDPGetColorFormatName(hBmpActual->format),
132  FreeRDPGetColorFormatName(hBmpExpected->format));
133  test_dump_bitmap(hBmpActual, "Actual");
134  test_dump_bitmap(hBmpExpected, "Expected");
135  (void)fflush(stdout);
136  (void)fflush(stderr);
137  return TRUE; // TODO: Fix test cases
138  }
139 
140  return bitmapsEqual;
141 }