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
31static INLINE DWORD FreeRDPAreColorFormatsEqualNoAlpha_int(DWORD first, DWORD second)
32{
33 const DWORD mask = (DWORD) ~(8UL << 12UL);
34 return (first & mask) == (second & mask);
35}
36
37static 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
79static 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
105static 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