17#ifndef FREERDP_LIB_PRIM_INTERNAL_H 
   18#define FREERDP_LIB_PRIM_INTERNAL_H 
   20#include <winpr/platform.h> 
   21#include <freerdp/config.h> 
   23#include <freerdp/primitives.h> 
   24#include <freerdp/api.h> 
   26#include "../core/simd.h" 
   29#define PRIM_ALIGN_128 __attribute__((aligned(16))) 
   32#define PRIM_ALIGN_128 __declspec(align(16)) 
   36#if defined(SSE_AVX_INTRINSICS_ENABLED) || defined(NEON_INTRINSICS_ENABLED) || defined(WITH_OPENCL) 
   37#define HAVE_OPTIMIZED_PRIMITIVES 1 
   40#if defined(SSE_AVX_INTRINSICS_ENABLED) || defined(NEON_INTRINSICS_ENABLED) 
   41#define HAVE_CPU_OPTIMIZED_PRIMITIVES 1 
   44static inline BYTE* writePixelBGRA(BYTE* dst, DWORD formatSize, UINT32 format, BYTE R, BYTE G,
 
   47  WINPR_UNUSED(formatSize);
 
   57static inline BYTE* writePixelBGRX(BYTE* dst, DWORD formatSize, UINT32 format, BYTE R, BYTE G,
 
   60  WINPR_UNUSED(formatSize);
 
   72static inline BYTE* writePixelRGBA(BYTE* dst, DWORD formatSize, UINT32 format, BYTE R, BYTE G,
 
   75  WINPR_UNUSED(formatSize);
 
   85static inline BYTE* writePixelRGBX(BYTE* dst, DWORD formatSize, UINT32 format, BYTE R, BYTE G,
 
   88  WINPR_UNUSED(formatSize);
 
  100static inline BYTE* writePixelABGR(BYTE* dst, DWORD formatSize, UINT32 format, BYTE R, BYTE G,
 
  103  WINPR_UNUSED(formatSize);
 
  104  WINPR_UNUSED(format);
 
  113static inline BYTE* writePixelXBGR(BYTE* dst, DWORD formatSize, UINT32 format, BYTE R, BYTE G,
 
  116  WINPR_UNUSED(formatSize);
 
  117  WINPR_UNUSED(format);
 
  127static inline BYTE* writePixelARGB(BYTE* dst, DWORD formatSize, UINT32 format, BYTE R, BYTE G,
 
  130  WINPR_UNUSED(formatSize);
 
  131  WINPR_UNUSED(format);
 
  140static inline BYTE* writePixelXRGB(BYTE* dst, DWORD formatSize, UINT32 format, BYTE R, BYTE G,
 
  143  WINPR_UNUSED(formatSize);
 
  144  WINPR_UNUSED(format);
 
  154static inline BYTE* writePixelGenericAlpha(BYTE* dst, DWORD formatSize, UINT32 format, BYTE R,
 
  155                                           BYTE G, BYTE B, BYTE A)
 
  157  UINT32 color = FreeRDPGetColor(format, R, G, B, A);
 
  158  FreeRDPWriteColor(dst, format, color);
 
  159  return dst + formatSize;
 
  162static inline BYTE* writePixelGeneric(BYTE* dst, DWORD formatSize, UINT32 format, BYTE R, BYTE G,
 
  165  UINT32 color = FreeRDPGetColor(format, R, G, B, A);
 
  166  FreeRDPWriteColorIgnoreAlpha(dst, format, color);
 
  167  return dst + formatSize;
 
  170typedef BYTE* (*fkt_writePixel)(BYTE*, DWORD, UINT32, BYTE, BYTE, BYTE, BYTE);
 
  172static inline fkt_writePixel getPixelWriteFunction(DWORD format, BOOL useAlpha)
 
  176    case PIXEL_FORMAT_ARGB32:
 
  177    case PIXEL_FORMAT_XRGB32:
 
  178      return useAlpha ? writePixelARGB : writePixelXRGB;
 
  180    case PIXEL_FORMAT_ABGR32:
 
  181    case PIXEL_FORMAT_XBGR32:
 
  182      return useAlpha ? writePixelABGR : writePixelXBGR;
 
  184    case PIXEL_FORMAT_RGBA32:
 
  185    case PIXEL_FORMAT_RGBX32:
 
  186      return useAlpha ? writePixelRGBA : writePixelRGBX;
 
  188    case PIXEL_FORMAT_BGRA32:
 
  189    case PIXEL_FORMAT_BGRX32:
 
  190      return useAlpha ? writePixelBGRA : writePixelBGRX;
 
  193      return useAlpha ? writePixelGenericAlpha : writePixelGeneric;
 
  197static inline BYTE CLIP(INT64 X)
 
  208static inline BYTE CONDITIONAL_CLIP(INT32 in, BYTE original)
 
  213    diff = out - original;
 
  215    diff = original - out;
 
  226static inline INT32 C(INT32 Y)
 
  231static inline INT32 D(INT32 U)
 
  236static inline INT32 E(INT32 V)
 
  241static inline BYTE YUV2R(INT32 Y, INT32 U, INT32 V)
 
  243  const INT32 r = (256 * C(Y) + 0 * D(U) + 403 * E(V));
 
  244  const INT32 r8 = r >> 8;
 
  248static inline BYTE YUV2G(INT32 Y, INT32 U, INT32 V)
 
  250  const INT32 g = (256 * C(Y) - 48 * D(U) - 120 * E(V));
 
  251  const INT32 g8 = g >> 8;
 
  255static inline BYTE YUV2B(INT32 Y, INT32 U, INT32 V)
 
  257  const INT32 b = (256 * C(Y) + 475 * D(U) + 0 * E(V));
 
  258  const INT32 b8 = b >> 8;
 
  267static inline BYTE RGB2Y(INT32 R, INT32 G, INT32 B)
 
  269  const INT32 val = ((54 * R + 183 * G + 18 * B) >> 8);
 
  270  return WINPR_ASSERTING_INT_CAST(BYTE, val);
 
  273static inline BYTE RGB2U(INT32 R, INT32 G, INT32 B)
 
  275  const INT32 val = (((-29 * R - 99 * G + 128 * B) >> 8) + 128);
 
  276  return WINPR_ASSERTING_INT_CAST(BYTE, val);
 
  279static inline BYTE RGB2V(INT32 R, INT32 G, INT32 B)
 
  281  const INT32 val = (((128 * R - 116 * G - 12 * B) >> 8) + 128);
 
  282  return WINPR_ASSERTING_INT_CAST(BYTE, val);
 
  285static inline BYTE* writeYUVPixel(BYTE* dst, UINT32 DstFormat, INT32 y, INT32 u, INT32 v,
 
  289  const BYTE r = YUV2R(y, u, v);
 
  290  const BYTE g = YUV2G(y, u, v);
 
  291  const BYTE b = YUV2B(y, u, v);
 
  292  const DWORD formatSize = FreeRDPGetBytesPerPixel(DstFormat);
 
  293  return fkt(dst, formatSize, DstFormat, r, g, b, 0);
 
  296FREERDP_LOCAL 
void general_RGBToAVC444YUV_BGRX_DOUBLE_ROW(
 
  297    size_t offset, 
const BYTE* WINPR_RESTRICT srcEven, 
const BYTE* WINPR_RESTRICT srcOdd,
 
  298    BYTE* WINPR_RESTRICT b1Even, BYTE* WINPR_RESTRICT b1Odd, BYTE* WINPR_RESTRICT b2,
 
  299    BYTE* WINPR_RESTRICT b3, BYTE* WINPR_RESTRICT b4, BYTE* WINPR_RESTRICT b5,
 
  300    BYTE* WINPR_RESTRICT b6, BYTE* WINPR_RESTRICT b7, UINT32 width);
 
  302FREERDP_LOCAL 
void general_RGBToAVC444YUVv2_BGRX_DOUBLE_ROW(
 
  303    size_t offset, 
const BYTE* WINPR_RESTRICT pSrcEven, 
const BYTE* WINPR_RESTRICT pSrcOdd,
 
  304    BYTE* WINPR_RESTRICT yLumaDstEven, BYTE* WINPR_RESTRICT yLumaDstOdd,
 
  305    BYTE* WINPR_RESTRICT uLumaDst, BYTE* WINPR_RESTRICT vLumaDst,
 
  306    BYTE* WINPR_RESTRICT yEvenChromaDst1, BYTE* WINPR_RESTRICT yEvenChromaDst2,
 
  307    BYTE* WINPR_RESTRICT yOddChromaDst1, BYTE* WINPR_RESTRICT yOddChromaDst2,
 
  308    BYTE* WINPR_RESTRICT uChromaDst1, BYTE* WINPR_RESTRICT uChromaDst2,
 
  309    BYTE* WINPR_RESTRICT vChromaDst1, BYTE* WINPR_RESTRICT vChromaDst2, UINT32 width);
 
  312FREERDP_LOCAL 
void primitives_init_copy(
primitives_t* WINPR_RESTRICT prims);
 
  313FREERDP_LOCAL 
void primitives_init_set(
primitives_t* WINPR_RESTRICT prims);
 
  314FREERDP_LOCAL 
void primitives_init_add(
primitives_t* WINPR_RESTRICT prims);
 
  315FREERDP_LOCAL 
void primitives_init_andor(
primitives_t* WINPR_RESTRICT prims);
 
  316FREERDP_LOCAL 
void primitives_init_shift(
primitives_t* WINPR_RESTRICT prims);
 
  317FREERDP_LOCAL 
void primitives_init_sign(
primitives_t* WINPR_RESTRICT prims);
 
  318FREERDP_LOCAL 
void primitives_init_alphaComp(
primitives_t* WINPR_RESTRICT prims);
 
  319FREERDP_LOCAL 
void primitives_init_colors(
primitives_t* WINPR_RESTRICT prims);
 
  320FREERDP_LOCAL 
void primitives_init_YCoCg(
primitives_t* WINPR_RESTRICT prims);
 
  321FREERDP_LOCAL 
void primitives_init_YUV(
primitives_t* WINPR_RESTRICT prims);
 
  323FREERDP_LOCAL 
void primitives_init_copy_opt(
primitives_t* WINPR_RESTRICT prims);
 
  324FREERDP_LOCAL 
void primitives_init_set_opt(
primitives_t* WINPR_RESTRICT prims);
 
  325FREERDP_LOCAL 
void primitives_init_add_opt(
primitives_t* WINPR_RESTRICT prims);
 
  326FREERDP_LOCAL 
void primitives_init_andor_opt(
primitives_t* WINPR_RESTRICT prims);
 
  327FREERDP_LOCAL 
void primitives_init_shift_opt(
primitives_t* WINPR_RESTRICT prims);
 
  328FREERDP_LOCAL 
void primitives_init_sign_opt(
primitives_t* WINPR_RESTRICT prims);
 
  329FREERDP_LOCAL 
void primitives_init_alphaComp_opt(
primitives_t* WINPR_RESTRICT prims);
 
  330FREERDP_LOCAL 
void primitives_init_colors_opt(
primitives_t* WINPR_RESTRICT prims);
 
  331FREERDP_LOCAL 
void primitives_init_YCoCg_opt(
primitives_t* WINPR_RESTRICT prims);
 
  332FREERDP_LOCAL 
void primitives_init_YUV_opt(
primitives_t* WINPR_RESTRICT prims);
 
  334#if defined(WITH_OPENCL) 
  335FREERDP_LOCAL BOOL primitives_init_opencl(
primitives_t* WINPR_RESTRICT prims);