… | |
… | |
66 | int w = w1 + w2 + w3; |
66 | int w = w1 + w2 + w3; |
67 | |
67 | |
68 | return ((((c1 >> shift) & Cmask) * w1 + ((c2 >> shift) & Cmask) * w2 + ((c3 >> shift) & Cmask) * w3 + w / 2) / w) << shift; |
68 | return ((((c1 >> shift) & Cmask) * w1 + ((c2 >> shift) & Cmask) * w2 + ((c3 >> shift) & Cmask) * w3 + w / 2) / w) << shift; |
69 | } |
69 | } |
70 | |
70 | |
71 | inline void lerp (unsigned char *pc, pixel c1, int w1, pixel c2, int w2, pixel c3 = 0, int w3 = 0) |
71 | static inline void lerp (unsigned char *pc, pixel c1, int w1, pixel c2, int w2, pixel c3 = 0, int w3 = 0) |
72 | { |
72 | { |
73 | *(pixel *)pc = lerp (c1, w1, c2, w2, c3, w3, Rshift) |
73 | *(pixel *)pc = lerp (c1, w1, c2, w2, c3, w3, Rshift) |
74 | | lerp (c1, w1, c2, w2, c3, w3, Gshift) |
74 | | lerp (c1, w1, c2, w2, c3, w3, Gshift) |
75 | | lerp (c1, w1, c2, w2, c3, w3, Bshift) |
75 | | lerp (c1, w1, c2, w2, c3, w3, Bshift) |
76 | | lerp (c1, w1, c2, w2, c3, w3, Ashift); |
76 | | lerp (c1, w1, c2, w2, c3, w3, Ashift); |
77 | } |
77 | } |
78 | |
78 | |
79 | inline void Interp1 (unsigned char *pc, pixel c1, pixel c2) |
79 | static inline void Interp1 (unsigned char *pc, pixel c1, pixel c2) |
80 | { |
80 | { |
81 | lerp (pc, c1, 3, c2, 1); |
81 | lerp (pc, c1, 3, c2, 1); |
82 | } |
82 | } |
83 | |
83 | |
84 | inline void Interp2 (unsigned char *pc, pixel c1, pixel c2, pixel c3) |
84 | static inline void Interp2 (unsigned char *pc, pixel c1, pixel c2, pixel c3) |
85 | { |
85 | { |
86 | lerp (pc, c1, 2, c2, 1, c3, 1); |
86 | lerp (pc, c1, 2, c2, 1, c3, 1); |
87 | } |
87 | } |
88 | |
88 | |
89 | inline void Interp5 (unsigned char *pc, pixel c1, pixel c2) |
89 | static inline void Interp5 (unsigned char *pc, pixel c1, pixel c2) |
90 | { |
90 | { |
91 | lerp (pc, c1, 1, c2, 1); |
91 | lerp (pc, c1, 1, c2, 1); |
92 | } |
92 | } |
93 | |
93 | |
94 | inline void Interp6 (unsigned char *pc, pixel c1, pixel c2, pixel c3) |
94 | static inline void Interp6 (unsigned char *pc, pixel c1, pixel c2, pixel c3) |
95 | { |
95 | { |
96 | lerp (pc, c1, 5, c2, 2, c3, 1); |
96 | lerp (pc, c1, 5, c2, 2, c3, 1); |
97 | } |
97 | } |
98 | |
98 | |
99 | inline void Interp7 (unsigned char *pc, pixel c1, pixel c2, pixel c3) |
99 | static inline void Interp7 (unsigned char *pc, pixel c1, pixel c2, pixel c3) |
100 | { |
100 | { |
101 | lerp (pc, c1, 6, c2, 1, c3, 1); |
101 | lerp (pc, c1, 6, c2, 1, c3, 1); |
102 | } |
102 | } |
103 | |
103 | |
104 | inline void Interp9 (unsigned char *pc, pixel c1, pixel c2, pixel c3) |
104 | static inline void Interp9 (unsigned char *pc, pixel c1, pixel c2, pixel c3) |
105 | { |
105 | { |
106 | lerp (pc, c1, 2, c2, 3, c2, 3); |
106 | lerp (pc, c1, 2, c2, 3, c2, 3); |
107 | } |
107 | } |
108 | |
108 | |
109 | inline void Interp10 (unsigned char *pc, pixel c1, pixel c2, pixel c3) |
109 | static inline void Interp10 (unsigned char *pc, pixel c1, pixel c2, pixel c3) |
110 | { |
110 | { |
111 | lerp (pc, c1, 14, c2, 1, c3, 1); |
111 | lerp (pc, c1, 14, c2, 1, c3, 1); |
112 | } |
112 | } |
113 | |
113 | |
114 | #define PIXEL00_0 *((pixel *)(pOut)) = w[5]; |
114 | #define PIXEL00_0 *((pixel *)(pOut)) = w[5]; |
… | |
… | |
158 | #define PIXEL11_61 Interp6(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); |
158 | #define PIXEL11_61 Interp6(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); |
159 | #define PIXEL11_70 Interp7(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); |
159 | #define PIXEL11_70 Interp7(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); |
160 | #define PIXEL11_90 Interp9(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); |
160 | #define PIXEL11_90 Interp9(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); |
161 | #define PIXEL11_100 Interp10(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); |
161 | #define PIXEL11_100 Interp10(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); |
162 | |
162 | |
163 | inline pixel RGBAtoYUVA (pixel w) |
163 | static inline pixel RGBAtoYUVA (pixel w) |
164 | { |
164 | { |
165 | int r = (w >> Rshift) & Cmask; |
165 | int r = (w >> Rshift) & Cmask; |
166 | int g = (w >> Gshift) & Cmask; |
166 | int g = (w >> Gshift) & Cmask; |
167 | int b = (w >> Bshift) & Cmask; |
167 | int b = (w >> Bshift) & Cmask; |
168 | int a = (w >> Ashift) & Cmask; |
168 | int a = (w >> Ashift) & Cmask; |
… | |
… | |
175 | | (u << Gshift) |
175 | | (u << Gshift) |
176 | | (v << Bshift) |
176 | | (v << Bshift) |
177 | | (a << Ashift); |
177 | | (a << Ashift); |
178 | } |
178 | } |
179 | |
179 | |
180 | inline bool Diff (pixel w1, pixel w2) |
180 | static inline bool Diff (pixel w1, pixel w2) |
181 | { |
181 | { |
182 | pixel YUV1 = RGBAtoYUVA (w1); |
182 | pixel YUV1 = RGBAtoYUVA (w1); |
183 | pixel YUV2 = RGBAtoYUVA (w2); |
183 | pixel YUV2 = RGBAtoYUVA (w2); |
184 | |
184 | |
185 | return ((abs (((YUV1 >> Rshift) & Cmask) - ((YUV2 >> Rshift) & Cmask)) > trY) || |
185 | return ((abs (((YUV1 >> Rshift) & Cmask) - ((YUV2 >> Rshift) & Cmask)) > trY) || |