ImagingUtils.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #ifdef WORDS_BIGENDIAN
  2. #define MAKE_UINT32(u0, u1, u2, u3) ((UINT32)(u3) | ((UINT32)(u2)<<8) | ((UINT32)(u1)<<16) | ((UINT32)(u0)<<24))
  3. #define MASK_UINT32_CHANNEL_0 0xff000000
  4. #define MASK_UINT32_CHANNEL_1 0x00ff0000
  5. #define MASK_UINT32_CHANNEL_2 0x0000ff00
  6. #define MASK_UINT32_CHANNEL_3 0x000000ff
  7. #else
  8. #define MAKE_UINT32(u0, u1, u2, u3) ((UINT32)(u0) | ((UINT32)(u1)<<8) | ((UINT32)(u2)<<16) | ((UINT32)(u3)<<24))
  9. #define MASK_UINT32_CHANNEL_0 0x000000ff
  10. #define MASK_UINT32_CHANNEL_1 0x0000ff00
  11. #define MASK_UINT32_CHANNEL_2 0x00ff0000
  12. #define MASK_UINT32_CHANNEL_3 0xff000000
  13. #endif
  14. #define SHIFTFORDIV255(a)\
  15. ((((a) >> 8) + a) >> 8)
  16. /* like (a * b + 127) / 255), but much faster on most platforms */
  17. #define MULDIV255(a, b, tmp)\
  18. (tmp = (a) * (b) + 128, SHIFTFORDIV255(tmp))
  19. #define DIV255(a, tmp)\
  20. (tmp = (a) + 128, SHIFTFORDIV255(tmp))
  21. #define BLEND(mask, in1, in2, tmp1)\
  22. DIV255(in1 * (255 - mask) + in2 * mask, tmp1)
  23. #define PREBLEND(mask, in1, in2, tmp1)\
  24. (MULDIV255(in1, (255 - mask), tmp1) + in2)
  25. #define CLIP8(v) ((v) <= 0 ? 0 : (v) < 256 ? (v) : 255)
  26. /* This is to work around a bug in GCC prior 4.9 in 64 bit mode.
  27. GCC generates code with partial dependency which is 3 times slower.
  28. See: http://stackoverflow.com/a/26588074/253146 */
  29. #if defined(__x86_64__) && defined(__SSE__) && ! defined(__NO_INLINE__) && \
  30. ! defined(__clang__) && defined(GCC_VERSION) && (GCC_VERSION < 40900)
  31. static float __attribute__((always_inline)) inline _i2f(int v) {
  32. float x;
  33. __asm__("xorps %0, %0; cvtsi2ss %1, %0" : "=x"(x) : "r"(v) );
  34. return x;
  35. }
  36. #else
  37. static float inline _i2f(int v) { return (float) v; }
  38. #endif