20#ifndef FREERDP_LIB_CODEC_COLOR_H
21#define FREERDP_LIB_CODEC_COLOR_H
23#include <winpr/winpr.h>
24#include <winpr/wtypes.h>
26#include <freerdp/codec/color.h>
27#include <freerdp/log.h>
29#define INT_COLOR_TAG FREERDP_TAG("codec.color.h")
32static inline DWORD FreeRDPAreColorFormatsEqualNoAlpha_int(DWORD first, DWORD second)
34 const DWORD mask = (DWORD) ~(8UL << 12UL);
35 return (first & mask) == (second & mask);
39static inline BOOL FreeRDPWriteColor_int(BYTE* WINPR_RESTRICT dst, UINT32 format, UINT32 color)
41 switch (FreeRDPGetBitsPerPixel(format))
44 dst[0] = (BYTE)(color >> 24);
45 dst[1] = (BYTE)(color >> 16);
46 dst[2] = (BYTE)(color >> 8);
51 dst[0] = (BYTE)(color >> 16);
52 dst[1] = (BYTE)(color >> 8);
57 dst[1] = (BYTE)(color >> 8);
62 if (!FreeRDPColorHasAlpha(format))
63 color = color & 0x7FFF;
65 dst[1] = (BYTE)(color >> 8);
74 WLog_ERR(INT_COLOR_TAG,
"Unsupported format %s", FreeRDPGetColorFormatName(format));
82static inline BOOL FreeRDPWriteColorIgnoreAlpha_int(BYTE* WINPR_RESTRICT dst, UINT32 format,
87 case PIXEL_FORMAT_XBGR32:
88 case PIXEL_FORMAT_XRGB32:
89 case PIXEL_FORMAT_ABGR32:
90 case PIXEL_FORMAT_ARGB32:
92 const UINT32 tmp = ((UINT32)dst[0] << 24ULL) | (color & 0x00FFFFFFULL);
93 return FreeRDPWriteColor_int(dst, format, tmp);
95 case PIXEL_FORMAT_BGRX32:
96 case PIXEL_FORMAT_RGBX32:
97 case PIXEL_FORMAT_BGRA32:
98 case PIXEL_FORMAT_RGBA32:
100 const UINT32 tmp = ((UINT32)dst[3]) | (color & 0xFFFFFF00ULL);
101 return FreeRDPWriteColor_int(dst, format, tmp);
104 return FreeRDPWriteColor_int(dst, format, color);
109static inline UINT32 FreeRDPReadColor_int(
const BYTE* WINPR_RESTRICT src, UINT32 format)
113 switch (FreeRDPGetBitsPerPixel(format))
117 ((UINT32)src[0] << 24) | ((UINT32)src[1] << 16) | ((UINT32)src[2] << 8) | src[3];
121 color = ((UINT32)src[0] << 16) | ((UINT32)src[1] << 8) | src[2];
125 color = ((UINT32)src[1] << 8) | src[0];
129 color = ((UINT32)src[1] << 8) | src[0];
131 if (!FreeRDPColorHasAlpha(format))
132 color = color & 0x7FFF;
143 WLog_ERR(INT_COLOR_TAG,
"Unsupported format %s", FreeRDPGetColorFormatName(format));