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