55#include "nomlib/config.hpp"
56#include "nomlib/math/math_helpers.hpp"
58#define MASK_2 0x0000FF00
59#define MASK_13 0x00FF00FF
60#define MASK_RGB 0x00FFFFFF
61#define MASK_ALPHA 0xFF000000
63#define Ymask 0x00FF0000
64#define Umask 0x0000FF00
65#define Vmask 0x000000FF
74extern uint32 RGBtoYUV[16777216];
76static inline uint32 rgb_to_yuv(uint32 c)
79 return RGBtoYUV[MASK_RGB & c];
90static inline int yuv_diff(
int yuv1,
int yuv2) {
91 return (( abs((yuv1 & Ymask) - (yuv2 & Ymask)) > trY ) ||
92 ( abs((yuv1 & Umask) - (yuv2 & Umask)) > trU ) ||
93 ( abs((yuv1 & Vmask) - (yuv2 & Vmask)) > trV ) );
96static inline int32 Diff(uint32 c1, uint32 c2)
98 return yuv_diff(rgb_to_yuv(c1), rgb_to_yuv(c2));
102static inline uint32 Interpolate_2(uint32 c1,
int w1, uint32 c2, int32 w2, int32 s)
108 (((((c1 & MASK_ALPHA) >> 24) * w1 + ((c2 & MASK_ALPHA) >> 24) * w2) << (24-s)) & MASK_ALPHA) +
109 ((((c1 & MASK_2) * w1 + (c2 & MASK_2) * w2) >> s) & MASK_2) +
110 ((((c1 & MASK_13) * w1 + (c2 & MASK_13) * w2) >> s) & MASK_13);
113static inline uint32 Interpolate_3(uint32 c1, int32 w1, uint32 c2, int32 w2, uint32 c3, int32 w3, int32 s)
116 (((((c1 & MASK_ALPHA) >> 24) * w1 + ((c2 & MASK_ALPHA) >> 24) * w2 + ((c3 & MASK_ALPHA) >> 24) * w3) << (24-s)) & MASK_ALPHA) +
117 ((((c1 & MASK_2) * w1 + (c2 & MASK_2) * w2 + (c3 & MASK_2) * w3) >> s) & MASK_2) +
118 ((((c1 & MASK_13) * w1 + (c2 & MASK_13) * w2 + (c3 & MASK_13) * w3) >> s) & MASK_13);
121static inline uint32 Interp1(uint32 c1, uint32 c2)
124 return Interpolate_2(c1, 3, c2, 1, 2);
127static inline uint32 Interp2(uint32 c1, uint32 c2, uint32 c3)
130 return Interpolate_3(c1, 2, c2, 1, c3, 1, 2);
133static inline uint32 Interp3(uint32 c1, uint32 c2)
136 return Interpolate_2(c1, 7, c2, 1, 3);
139static inline uint32 Interp4(uint32 c1, uint32 c2, uint32 c3)
142 return Interpolate_3(c1, 2, c2, 7, c3, 7, 4);
145static inline uint32 Interp5(uint32 c1, uint32 c2)
148 return Interpolate_2(c1, 1, c2, 1, 1);
151static inline uint32 Interp6(uint32 c1, uint32 c2, uint32 c3)
154 return Interpolate_3(c1, 5, c2, 2, c3, 1, 3);
157static inline uint32 Interp7(uint32 c1, uint32 c2, uint32 c3)
160 return Interpolate_3(c1, 6, c2, 1, c3, 1, 3);
163static inline uint32 Interp8(uint32 c1, uint32 c2)
166 return Interpolate_2(c1, 5, c2, 3, 3);
169static inline uint32 Interp9(uint32 c1, uint32 c2, uint32 c3)
172 return Interpolate_3(c1, 2, c2, 3, c3, 3, 3);
175static inline uint32 Interp10(uint32 c1, uint32 c2, uint32 c3)
178 return Interpolate_3(c1, 14, c2, 1, c3, 1, 4);
182void hq2x_32_rb( uint32* sp, uint32 srb, uint32* dp, uint32 drb, int32 Xres, int32 Yres );
185void hq3x_32_rb( uint32* sp, uint32 srb, uint32* dp, uint32 drb, int32 Xres, int32 Yres );
188void hq4x_32_rb( uint32* sp, uint32 srb, uint32* dp, uint32 drb, int32 Xres, int32 Yres );
191void hqxInit (
void );
196void hq2x_32 ( uint32* src, uint32* dest, int32 width, int32 height );
201void hq3x_32 ( uint32* src, uint32* dest, int32 width, int32 height );
206void hq4x_32 ( uint32* src, uint32* dest, int32 width, int32 height );