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)
42 switch (FreeRDPGetBitsPerPixel(format))
45 dst[0] = (BYTE)(color >> 24);
46 dst[1] = (BYTE)(color >> 16);
47 dst[2] = (BYTE)(color >> 8);
52 dst[0] = (BYTE)(color >> 16);
53 dst[1] = (BYTE)(color >> 8);
58 dst[1] = (BYTE)(color >> 8);
63 if (!FreeRDPColorHasAlpha(format))
64 color = color & 0x7FFF;
66 dst[1] = (BYTE)(color >> 8);
75 WLog_ERR(INT_COLOR_TAG,
"Unsupported format %s", FreeRDPGetColorFormatName(format));
83static inline BOOL FreeRDPWriteColorIgnoreAlpha_int(BYTE* WINPR_RESTRICT dst, UINT32 format,
89 case PIXEL_FORMAT_XBGR32:
90 case PIXEL_FORMAT_XRGB32:
91 case PIXEL_FORMAT_ABGR32:
92 case PIXEL_FORMAT_ARGB32:
94 const UINT32 tmp = ((UINT32)dst[0] << 24ULL) | (color & 0x00FFFFFFULL);
95 return FreeRDPWriteColor_int(dst, format, tmp);
97 case PIXEL_FORMAT_BGRX32:
98 case PIXEL_FORMAT_RGBX32:
99 case PIXEL_FORMAT_BGRA32:
100 case PIXEL_FORMAT_RGBA32:
102 const UINT32 tmp = ((UINT32)dst[3]) | (color & 0xFFFFFF00ULL);
103 return FreeRDPWriteColor_int(dst, format, tmp);
106 return FreeRDPWriteColor_int(dst, format, color);
111static inline UINT32 FreeRDPReadColor_int(
const BYTE* WINPR_RESTRICT src, UINT32 format)
117 switch (FreeRDPGetBitsPerPixel(format))
121 ((UINT32)src[0] << 24) | ((UINT32)src[1] << 16) | ((UINT32)src[2] << 8) | src[3];
125 color = ((UINT32)src[0] << 16) | ((UINT32)src[1] << 8) | src[2];
129 color = ((UINT32)src[1] << 8) | src[0];
133 color = ((UINT32)src[1] << 8) | src[0];
135 if (!FreeRDPColorHasAlpha(format))
136 color = color & 0x7FFF;
147 WLog_ERR(INT_COLOR_TAG,
"Unsupported format %s", FreeRDPGetColorFormatName(format));