22 #ifndef GRAPHICS_SCALER_INTERN_H 23 #define GRAPHICS_SCALER_INTERN_H 25 #include "common/scummsys.h" 26 #include "graphics/colormasks.h" 36 template<
typename ColorMask>
37 static inline uint32 interpolate32_1_1(uint32 p1, uint32 p2) {
42 return (((p1 & ColorMask::kHighBitsMask) >> 1) +
43 ((p2 & ColorMask::kHighBitsMask) >> 1) +
44 (p1 & p2 & ColorMask::kLowBitsMask));
54 template<
typename ColorMask>
55 static inline uint32 interpolate32_3_1(uint32 p1, uint32 p2) {
59 uint32 x = ((p1 & ColorMask::qhighBits) >> 2) * 3 + ((p2 & ColorMask::qhighBits) >> 2);
62 uint32 y = ((p1 & ColorMask::qlowBits) * 3 + (p2 & ColorMask::qlowBits)) >> 2;
65 y &= ColorMask::qlowBits;
72 template<
typename ColorMask>
73 uint32 interpolate32_2_1(uint32 pixel1, uint32 pixel2) {
74 uint32 rsum, gsum, bsum, asum;
76 rsum = ((pixel1 & ColorMask::kRedMask) >> ColorMask::kRedShift) << 1;
77 rsum += ((pixel2 & ColorMask::kRedMask) >> ColorMask::kRedShift);
79 rsum <<= ColorMask::kRedShift;
81 gsum = ((pixel1 & ColorMask::kGreenMask) >> ColorMask::kGreenShift) << 1;
82 gsum += ((pixel2 & ColorMask::kGreenMask) >> ColorMask::kGreenShift);
84 gsum <<= ColorMask::kGreenShift;
86 bsum = ((pixel1 & ColorMask::kBlueMask) >> ColorMask::kBlueShift) << 1;
87 bsum += ((pixel2 & ColorMask::kBlueMask) >> ColorMask::kBlueShift);
89 bsum <<= ColorMask::kBlueShift;
91 asum = ((pixel1 & ColorMask::kAlphaMask) >> ColorMask::kAlphaShift) << 1;
92 asum += ((pixel2 & ColorMask::kAlphaMask) >> ColorMask::kAlphaShift);
94 asum <<= ColorMask::kAlphaShift;
96 return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask) | (asum & ColorMask::kAlphaMask);
103 template<
typename ColorMask>
104 static inline uint32 interpolate32_5_3(uint32 p1, uint32 p2) {
105 uint32 x = ((p1 & ~ColorMask::kLow3Bits) >> 3) * 5 + ((p2 & ~ColorMask::kLow3Bits) >> 3) * 3;
106 uint32 y = ((p1 & ColorMask::kLow3Bits) * 5 + (p2 & ColorMask::kLow3Bits) * 3) >> 3;
108 y &= ColorMask::kLow3Bits;
117 template<
typename ColorMask>
118 static inline uint32 interpolate32_7_1(uint32 p1, uint32 p2) {
119 uint32 x = ((p1 & ~ColorMask::kLow3Bits) >> 3) * 7 + ((p2 & ~ColorMask::kLow3Bits) >> 3);
120 uint32 y = ((p1 & ColorMask::kLow3Bits) * 7 + (p2 & ColorMask::kLow3Bits)) >> 3;
122 y &= ColorMask::kLow3Bits;
131 template<
typename ColorMask>
132 static inline uint32 interpolate32_2_1_1(uint32 p1, uint32 p2, uint32 p3) {
133 uint32 x = ((p1 & ColorMask::qhighBits) >> 1)
134 + ((p2 & ColorMask::qhighBits) >> 2)
135 + ((p3 & ColorMask::qhighBits) >> 2);
136 uint32 y = ((p1 & ColorMask::qlowBits) << 1)
137 + (p2 & ColorMask::qlowBits)
138 + (p2 & ColorMask::qlowBits);
140 y &= ColorMask::qlowBits;
149 template<
typename ColorMask>
150 static inline uint32 interpolate32_5_2_1(uint32 p1, uint32 p2, uint32 p3) {
151 uint32 x = ((p1 & ~ColorMask::kLow3Bits) >> 3) * 5
152 + ((p2 & ~ColorMask::kLow3Bits) >> 3) * 2
153 + ((p3 & ~ColorMask::kLow3Bits) >> 3);
154 uint32 y = (p1 & ColorMask::kLow3Bits) * 5
155 + (p2 & ColorMask::kLow3Bits) * 2
156 + (p2 & ColorMask::kLow3Bits);
158 y &= ColorMask::kLow3Bits;
167 template<
typename ColorMask>
168 static inline uint32 interpolate32_6_1_1(uint32 p1, uint32 p2, uint32 p3) {
169 uint32 x = ((p1 & ~ColorMask::kLow3Bits) >> 3) * 6
170 + ((p2 & ~ColorMask::kLow3Bits) >> 3)
171 + ((p3 & ~ColorMask::kLow3Bits) >> 3);
172 uint32 y = (p1 & ColorMask::kLow3Bits) * 6
173 + (p2 & ColorMask::kLow3Bits)
174 + (p2 & ColorMask::kLow3Bits);
176 y &= ColorMask::kLow3Bits;
185 template<
typename ColorMask>
186 static inline uint32 interpolate32_2_3_3(uint32 p1, uint32 p2, uint32 p3) {
187 uint32 x = ((p1 & ~ColorMask::kLow3Bits) >> 2)
188 + (((p2 & ~ColorMask::kLow3Bits) >> 3)
189 + ((p3 & ~ColorMask::kLow3Bits) >> 3)) * 3;
190 uint32 y = (p1 & ColorMask::kLow3Bits) * 2
191 + ((p2 & ColorMask::kLow3Bits)
192 + (p2 & ColorMask::kLow3Bits)) * 3;
194 y &= ColorMask::kLow3Bits;
203 template<
typename ColorMask>
204 inline uint32 interpolate32_2_7_7(uint32 p1, uint32 p2, uint32 p3) {
205 uint32 x = ((p1 & ~ColorMask::kLow4Bits) >> 3)
206 + (((p2 & ~ColorMask::kLow4Bits) >> 4)
207 + ((p3 & ~ColorMask::kLow4Bits) >> 4)) * 7;
208 uint32 y = (p1 & ColorMask::kLow4Bits) * 2
209 + ((p2 & ColorMask::kLow4Bits)
210 + (p2 & ColorMask::kLow4Bits)) * 7;
212 y &= ColorMask::kLow4Bits;
218 inline uint32 interpolate32_2_7_7<Graphics::ColorMasks<555> >(uint32 p1, uint32 p2, uint32 p3) {
224 inline uint32 interpolate32_2_7_7<Graphics::ColorMasks<565> >(uint32 p1, uint32 p2, uint32 p3) {
234 template<
typename ColorMask>
235 inline uint32 interpolate32_14_1_1(uint32 p1, uint32 p2, uint32 p3) {
236 uint32 x = ((p1 & ~ColorMask::kLow4Bits) >> 4) * 14
237 + ((p2 & ~ColorMask::kLow4Bits) >> 4)
238 + ((p3 & ~ColorMask::kLow4Bits) >> 4);
239 uint32 y = (p1 & ColorMask::kLow4Bits) * 14
240 + (p2 & ColorMask::kLow4Bits)
241 + (p2 & ColorMask::kLow4Bits);
243 y &= ColorMask::kLow4Bits;
250 inline uint32 interpolate32_14_1_1<Graphics::ColorMasks<555> >(uint32 p1, uint32 p2, uint32 p3) {
256 inline uint32 interpolate32_14_1_1<Graphics::ColorMasks<565> >(uint32 p1, uint32 p2, uint32 p3) {
265 template<
typename ColorMask>
266 uint32 interpolate32_1_1_1(uint32 pixel1, uint32 pixel2, uint32 pixel3) {
267 uint32 rsum, gsum, bsum;
269 rsum = ((pixel1 & ColorMask::kRedMask) >> ColorMask::kRedShift);
270 rsum += ((pixel2 & ColorMask::kRedMask) >> ColorMask::kRedShift);
271 rsum += ((pixel3 & ColorMask::kRedMask) >> ColorMask::kRedShift);
273 rsum <<= ColorMask::kRedShift;
275 gsum = ((pixel1 & ColorMask::kGreenMask) >> ColorMask::kGreenShift);
276 gsum += ((pixel2 & ColorMask::kGreenMask) >> ColorMask::kGreenShift);
277 gsum += ((pixel3 & ColorMask::kGreenMask) >> ColorMask::kGreenShift);
279 gsum <<= ColorMask::kGreenShift;
281 bsum = ((pixel1 & ColorMask::kBlueMask) >> ColorMask::kBlueShift);
282 bsum += ((pixel2 & ColorMask::kBlueMask) >> ColorMask::kBlueShift);
283 bsum += ((pixel3 & ColorMask::kBlueMask) >> ColorMask::kBlueShift);
285 bsum <<= ColorMask::kBlueShift;
287 return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask);
295 template<
typename ColorMask>
296 static inline uint32 interpolate32_1_1_1_1(uint32 p1, uint32 p2, uint32 p3, uint32 p4) {
297 uint32 x = ((p1 & ~ColorMask::kLow2Bits) >> 2)
298 + ((p2 & ~ColorMask::kLow2Bits) >> 2)
299 + ((p3 & ~ColorMask::kLow2Bits) >> 2)
300 + ((p4 & ~ColorMask::kLow2Bits) >> 2);
301 uint32 y = (p1 & ColorMask::kLow2Bits)
302 + (p2 & ColorMask::kLow2Bits)
303 + (p3 & ColorMask::kLow2Bits)
304 + (p4 & ColorMask::kLow2Bits);
306 y &= ColorMask::kLow2Bits;
315 template<
typename ColorMask>
316 static inline unsigned interpolate16_1_1(
unsigned p1,
unsigned p2) {
317 const unsigned lowbits = (p1 ^ p2) & ColorMask::kLowBits;
318 return ((p1 + p2) - lowbits) >> 1;
324 template<
typename ColorMask>
325 static inline unsigned interpolate16_3_1(
unsigned p1,
unsigned p2) {
326 const unsigned lowbits = (((p1 & ColorMask::kLowBits) << 1) + (p1 & ColorMask::kLow2Bits)
327 + (p2 & ColorMask::kLow2Bits)) & ColorMask::kLow2Bits;
328 return ((p1*3 + p2) - lowbits) >> 2;
334 template<
typename ColorMask>
335 uint16 interpolate16_2_1(uint16 pixel1, uint16 pixel2) {
339 rsum = (pixel1 & ColorMask::kRedMask) << 1;
340 rsum += (pixel2 & ColorMask::kRedMask);
343 gsum = (pixel1 & ColorMask::kGreenMask) << 1;
344 gsum += (pixel2 & ColorMask::kGreenMask);
347 bsum = (pixel1 & ColorMask::kBlueMask) << 1;
348 bsum += (pixel2 & ColorMask::kBlueMask);
351 return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask);
357 template<
typename ColorMask>
358 static inline unsigned interpolate16_5_3(
unsigned p1,
unsigned p2) {
359 const unsigned lowbits = (((p1 & ColorMask::kLowBits) << 2) + (p1 & ColorMask::kLow3Bits)
360 + ((p2 & ColorMask::kLow2Bits) << 1) + (p2 & ColorMask::kLow3Bits)) & ColorMask::kLow3Bits;
361 return ((p1*5 + p2*3) - lowbits) >> 3;
367 template<
typename ColorMask>
368 static inline unsigned interpolate16_7_1(
unsigned p1,
unsigned p2) {
369 const unsigned lowbits = (((p1 & ColorMask::kLowBits) << 2) + ((p1 & ColorMask::kLow2Bits) << 1) + (p1 & ColorMask::kLow3Bits)
370 + (p2 & ColorMask::kLow3Bits)) & ColorMask::kLow3Bits;
371 return ((p1*7+p2) - lowbits) >> 3;
377 template<
typename ColorMask>
378 static inline unsigned interpolate16_2_1_1(
unsigned p1,
unsigned p2,
unsigned p3) {
380 const unsigned lowbits = ((p1 & (ColorMask::kLowBits << 1))
381 + (p2 & ColorMask::kLow2Bits)
382 + (p3 & ColorMask::kLow2Bits)) & ColorMask::kLow2Bits;
383 return ((p1+p2+p3) - lowbits) >> 2;
389 template<
typename ColorMask>
390 static inline unsigned interpolate16_5_2_1(
unsigned p1,
unsigned p2,
unsigned p3) {
392 const unsigned lowbits = (((p1 & ColorMask::kLowBits) << 2) + (p1 & ColorMask::kLow3Bits)
393 + (p2 & (ColorMask::kLow2Bits << 1))
394 + (p3 & ColorMask::kLow3Bits)) & ColorMask::kLow3Bits;
395 return ((p1*5 + p2 + p3) - lowbits) >> 3;
401 template<
typename ColorMask>
402 static inline unsigned interpolate16_6_1_1(
unsigned p1,
unsigned p2,
unsigned p3) {
403 const unsigned lowbits = (((((p1 & ColorMask::kLowBits) << 1) + (p1 & ColorMask::kLow2Bits)) << 1)
404 + (p2 & ColorMask::kLow3Bits)
405 + (p3 & ColorMask::kLow3Bits)) & ColorMask::kLow3Bits;
406 return ((p1*6 + p2 + p3) - lowbits) >> 3;
412 template<
typename ColorMask>
413 static inline unsigned interpolate16_2_3_3(
unsigned p1,
unsigned p2,
unsigned p3) {
415 const unsigned rb = (p1 & (ColorMask::kRedBlueMask<<1))
416 + ((p2 & ColorMask::kRedBlueMask) + (p3 & ColorMask::kRedBlueMask))*3;
417 const unsigned g = (p1 & (ColorMask::kGreenMask<<1))
418 + ((p2 & ColorMask::kGreenMask) + (p3 & ColorMask::kGreenMask))*3;
419 return ((rb & (ColorMask::kRedBlueMask<<3)) | (g & (ColorMask::kGreenMask<<3))) >> 3;
425 template<
typename ColorMask>
426 static inline unsigned interpolate16_2_7_7(
unsigned p1,
unsigned p2,
unsigned p3) {
428 const unsigned rb = (p1 & (ColorMask::kRedBlueMask<<1))
429 + ((p2 & ColorMask::kRedBlueMask) + (p3 & ColorMask::kRedBlueMask))*7;
430 const unsigned g = (p1 & (ColorMask::kGreenMask<<1))
431 + ((p2 & ColorMask::kGreenMask) + (p3 & ColorMask::kGreenMask))*7;
432 return ((rb & (ColorMask::kRedBlueMask<<4)) | (g & (ColorMask::kGreenMask<<4))) >> 4;
438 template<
typename ColorMask>
439 static inline unsigned interpolate16_14_1_1(
unsigned p1,
unsigned p2,
unsigned p3) {
440 const unsigned rb = (p1&ColorMask::kRedBlueMask)*14
441 + (p2&ColorMask::kRedBlueMask)
442 + (p3&ColorMask::kRedBlueMask);
443 const unsigned g = (p1&ColorMask::kGreenMask)*14
444 + (p2&ColorMask::kGreenMask) + (p3&ColorMask::kGreenMask);
445 return ((rb&(ColorMask::kRedBlueMask<<4)) | (g&(ColorMask::kGreenMask<<4))) >> 4;
451 template<
typename ColorMask>
452 uint16 interpolate16_1_1_1(uint16 pixel1, uint16 pixel2, uint16 pixel3)
457 rsum = (pixel1 & ColorMask::kRedMask);
458 rsum += (pixel2 & ColorMask::kRedMask);
459 rsum += (pixel3 & ColorMask::kRedMask);
462 gsum = (pixel1 & ColorMask::kGreenMask);
463 gsum += (pixel2 & ColorMask::kGreenMask);
464 gsum += (pixel3 & ColorMask::kGreenMask);
467 bsum = (pixel1 & ColorMask::kBlueMask);
468 bsum += (pixel2 & ColorMask::kBlueMask);
469 bsum += (pixel3 & ColorMask::kBlueMask);
472 return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask);
478 template<
typename ColorMask>
479 static inline unsigned interpolate16_1_1_1_1(
unsigned p1,
unsigned p2,
unsigned p3,
unsigned p4) {
480 const unsigned lowbits = ((p1 & ColorMask::kLow2Bits)
481 + (p2 & ColorMask::kLow2Bits)
482 + (p3 & ColorMask::kLow2Bits)
483 + (p4 & ColorMask::kLow2Bits)) & ColorMask::kLow2Bits;
484 return ((p1+p2+p3+p4) - lowbits) >> 2;
491 static inline bool diffYUV(
int yuv1,
int yuv2) {
492 static const int Ymask = 0x00FF0000;
493 static const int Umask = 0x0000FF00;
494 static const int Vmask = 0x000000FF;
495 static const int trY = 0x00300000;
496 static const int trU = 0x00000700;
497 static const int trV = 0x00000006;
502 diff = ((yuv1 & Umask) - (yuv2 & Umask));
504 diff = (diff ^ mask) - mask;
505 if (diff > trU)
return true;
507 diff = ((yuv1 & Vmask) - (yuv2 & Vmask));
509 diff = (diff ^ mask) - mask;
510 if (diff > trV)
return true;
512 diff = ((yuv1 & Ymask) - (yuv2 & Ymask));
514 diff = (diff ^ mask) - mask;
515 if (diff > trY)
return true;