FreeRDP
libfreerdp/codec/color.h
1 
20 #ifndef FREERDP_LIB_CODEC_COLOR_H
21 #define FREERDP_LIB_CODEC_COLOR_H
22 
23 #include <winpr/winpr.h>
24 #include <winpr/wtypes.h>
25 
26 #include <freerdp/codec/color.h>
27 #include <freerdp/log.h>
28 
29 #define INT_COLOR_TAG FREERDP_TAG("codec.color.h")
30 
31 static INLINE DWORD FreeRDPAreColorFormatsEqualNoAlpha_int(DWORD first, DWORD second)
32 {
33  const DWORD mask = (DWORD) ~(8UL << 12UL);
34  return (first & mask) == (second & mask);
35 }
36 
37 static INLINE BOOL FreeRDPWriteColor_int(BYTE* WINPR_RESTRICT dst, UINT32 format, UINT32 color)
38 {
39  switch (FreeRDPGetBitsPerPixel(format))
40  {
41  case 32:
42  dst[0] = (BYTE)(color >> 24);
43  dst[1] = (BYTE)(color >> 16);
44  dst[2] = (BYTE)(color >> 8);
45  dst[3] = (BYTE)color;
46  break;
47 
48  case 24:
49  dst[0] = (BYTE)(color >> 16);
50  dst[1] = (BYTE)(color >> 8);
51  dst[2] = (BYTE)color;
52  break;
53 
54  case 16:
55  dst[1] = (BYTE)(color >> 8);
56  dst[0] = (BYTE)color;
57  break;
58 
59  case 15:
60  if (!FreeRDPColorHasAlpha(format))
61  color = color & 0x7FFF;
62 
63  dst[1] = (BYTE)(color >> 8);
64  dst[0] = (BYTE)color;
65  break;
66 
67  case 8:
68  dst[0] = (BYTE)color;
69  break;
70 
71  default:
72  WLog_ERR(INT_COLOR_TAG, "Unsupported format %s", FreeRDPGetColorFormatName(format));
73  return FALSE;
74  }
75 
76  return TRUE;
77 }
78 
79 static INLINE BOOL FreeRDPWriteColorIgnoreAlpha_int(BYTE* WINPR_RESTRICT dst, UINT32 format,
80  UINT32 color)
81 {
82  switch (format)
83  {
84  case PIXEL_FORMAT_XBGR32:
85  case PIXEL_FORMAT_XRGB32:
86  case PIXEL_FORMAT_ABGR32:
87  case PIXEL_FORMAT_ARGB32:
88  {
89  const UINT32 tmp = ((UINT32)dst[0] << 24ULL) | (color & 0x00FFFFFFULL);
90  return FreeRDPWriteColor_int(dst, format, tmp);
91  }
92  case PIXEL_FORMAT_BGRX32:
93  case PIXEL_FORMAT_RGBX32:
94  case PIXEL_FORMAT_BGRA32:
95  case PIXEL_FORMAT_RGBA32:
96  {
97  const UINT32 tmp = ((UINT32)dst[3]) | (color & 0xFFFFFF00ULL);
98  return FreeRDPWriteColor_int(dst, format, tmp);
99  }
100  default:
101  return FreeRDPWriteColor_int(dst, format, color);
102  }
103 }
104 
105 static INLINE UINT32 FreeRDPReadColor_int(const BYTE* WINPR_RESTRICT src, UINT32 format)
106 {
107  UINT32 color = 0;
108 
109  switch (FreeRDPGetBitsPerPixel(format))
110  {
111  case 32:
112  color =
113  ((UINT32)src[0] << 24) | ((UINT32)src[1] << 16) | ((UINT32)src[2] << 8) | src[3];
114  break;
115 
116  case 24:
117  color = ((UINT32)src[0] << 16) | ((UINT32)src[1] << 8) | src[2];
118  break;
119 
120  case 16:
121  color = ((UINT32)src[1] << 8) | src[0];
122  break;
123 
124  case 15:
125  color = ((UINT32)src[1] << 8) | src[0];
126 
127  if (!FreeRDPColorHasAlpha(format))
128  color = color & 0x7FFF;
129 
130  break;
131 
132  case 8:
133  case 4:
134  case 1:
135  color = *src;
136  break;
137 
138  default:
139  WLog_ERR(INT_COLOR_TAG, "Unsupported format %s", FreeRDPGetColorFormatName(format));
140  color = 0;
141  break;
142  }
143 
144  return color;
145 }
146 
147 #endif