diff options
Diffstat (limited to 'externals/gridflow/bundled/Base/GemPixConvert.h')
-rw-r--r-- | externals/gridflow/bundled/Base/GemPixConvert.h | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/externals/gridflow/bundled/Base/GemPixConvert.h b/externals/gridflow/bundled/Base/GemPixConvert.h new file mode 100644 index 00000000..e1cd5a3d --- /dev/null +++ b/externals/gridflow/bundled/Base/GemPixConvert.h @@ -0,0 +1,160 @@ +/*----------------------------------------------------------------- +LOG + GEM - Graphics Environment for Multimedia + + GemPixConvertSIMD.h + - header-file for color conversion + - this is mainly for (SIMD-)optimized routines + - part of GEM + + Copyright (c) 2006 IOhannes m zmoelnig. forum::für::umläute. IEM. zmoelnig@iem.kug.ac.at + For information on usage and redistribution, and for a DISCLAIMER OF ALL + WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution. + +-----------------------------------------------------------------*/ + + +#ifndef INCLUDE_GEMPIXCONVERT_SIMD_H_ +#define INCLUDE_GEMPIXCONVERT_SIMD_H_ + +#include "GemPixUtil.h" +#include "GemSIMD.h" + +// use formulae from http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC30 +/* + * [Y] 1 [ 65.738 129.075 25.064 ] [R] [ 16] + * [U] = --- * [ -37.945 -74.494 112.439 ] * [G]+[128] + * [V] = 256 [ 112.439 -94.154 -18.285 ] [B] [128] + * + * [R] 1 [ 298.082 0.0 408.583 ] [Y] [ 16] + * [G] = --- * [ 298.082 -100.291 -208.120 ] * ([U]-[128]) + * [B] = 256 [ 298.082 516.411 0.0 ] [V] [128] + */ + +#define YUV_POYNTON +// here comes something to be afraid of: +// (probably it would be better to define the matrices as real constant-value matrices) +// (instead of element-wise) + +#ifdef YUV_POYNTON +# define Y_OFFSET 16 +# define UV_OFFSET 128 + +// RGB2YUV +// poynton-values rounded +# define RGB2YUV_11 66 +# define RGB2YUV_12 129 +# define RGB2YUV_13 25 +# define RGB2YUV_21 -38 +# define RGB2YUV_22 -74 +# define RGB2YUV_23 112 +# define RGB2YUV_31 112 +# define RGB2YUV_32 -94 +# define RGB2YUV_33 -18 + +// YUV2RGB +// (we skip _21 and _31 as they are equal to _11) +#if 0 +// poynton-values rounded +# define YUV2RGB_11 298 +# define YUV2RGB_12 0 +# define YUV2RGB_13 409 +# define YUV2RGB_22 -100 +# define YUV2RGB_23 -208 +# define YUV2RGB_32 516 +# define YUV2RGB_33 0 +#else + +// this is round(256*inv(rgb2yuv/256)) +// so the general error should be smaller +# define YUV2RGB_11 298 +# define YUV2RGB_12 -1 +# define YUV2RGB_13 409 +# define YUV2RGB_22 -100 +# define YUV2RGB_23 -210 +# define YUV2RGB_32 519 +# define YUV2RGB_33 0 +#endif + +#else +/* the old ones: */ +# define Y_OFFSET 0 +# define UV_OFFSET 128 +// RGB2YUV +# define RGB2YUV_11 77 +# define RGB2YUV_12 150 +# define RGB2YUV_13 29 +# define RGB2YUV_21 -43 +# define RGB2YUV_22 -85 +# define RGB2YUV_23 128 +# define RGB2YUV_31 128 +# define RGB2YUV_32 -107 +# define RGB2YUV_33 -21 +// YUV2RGB +# define YUV2RGB_11 256 +# define YUV2RGB_12 0 +# define YUV2RGB_13 359 +# define YUV2RGB_22 -88 +# define YUV2RGB_23 -183 +# define YUV2RGB_32 454 +# define YUV2RGB_33 0 + +#endif /* POYNTON */ + +/* AltiVec */ +#ifdef __VEC__ + +/* there are problems on OSX10.3 with older versions of gcc, since the intrinsic code + * below freely changes between signed and unsigned short vectors + * newer versions of gcc accept this... + * LATER: fix the code (GemPixConvertAltivec:750..800) + */ +# ifdef __GNUC__ +/* according to hcs it does NOT work with gcc-3.3 + * for simplicity, i disable everything below gcc4 + * JMZ: 20061114 + */ +# if __GNUC__ < 4 +# warning disabling AltiVec for older gcc: please fix me +# define NO_VECTORINT_TO_VECTORUNSIGNEDINT +# endif +# endif /* GNUC */ + + + void RGB_to_YCbCr_altivec(unsigned char *rgbdata, size_t RGB_size, + unsigned char *pixels); + void RGBA_to_YCbCr_altivec(unsigned char *rgbadata, size_t RGBA_size, + unsigned char *pixels); + void BGR_to_YCbCr_altivec(unsigned char *bgrdata, size_t BGR_size, + unsigned char *pixels); + void BGRA_to_YCbCr_altivec(unsigned char *bgradata, size_t BGRA_size, + unsigned char *pixels); + void YUV422_to_BGRA_altivec(unsigned char *yuvdata, size_t pixelnum, + unsigned char *pixels); + void YV12_to_YUV422_altivec(short*Y, short*U, short*V, + unsigned char *data, int xsize, int ysize); +# ifndef NO_VECTORINT_TO_VECTORUNSIGNEDINT + void YUV422_to_YV12_altivec(short*pY, short*pY2, short*pU, short*pV, + unsigned char *gem_image, int xsize, int ysize); +# endif +#endif /* AltiVec */ + +/* SSE2 */ +#ifdef __SSE2__ +void RGBA_to_UYVY_SSE2(unsigned char *rgbadata, + size_t size, + unsigned char *yuvdata); +void UYVY_to_RGBA_SSE2(unsigned char *yuvdata, + size_t size, + unsigned char *rgbadata); +void UYVY_to_RGB_SSE2(unsigned char *yuvdata, + size_t size, + unsigned char *rgbadata); +#endif /* SSE2 */ + +/* in case somebody has an old machine... */ +#ifdef __MMX__ + +#endif /* MMX */ + +#endif /* INCLUDE_GEMPIXCONVERT_SIMD_H_ */ |