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