From 628f65b639ee9357935d8f141d43d46825506082 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 1 Oct 2003 16:47:49 +0000 Subject: move INTERPOLATE / Q_INTERPOLATE to intern.h; remove some jumps (pipelin trashers I call 'em :-) from diffYUV svn-id: r10523 --- common/scaler/2xsai.cpp | 15 --------------- common/scaler/hq2x.cpp | 16 ---------------- common/scaler/intern.h | 41 ++++++++++++++++++++++++++++++++++++++--- 3 files changed, 38 insertions(+), 34 deletions(-) (limited to 'common') diff --git a/common/scaler/2xsai.cpp b/common/scaler/2xsai.cpp index 7cf02bba47..1c99168e63 100644 --- a/common/scaler/2xsai.cpp +++ b/common/scaler/2xsai.cpp @@ -43,21 +43,6 @@ static inline int GetResult(uint32 A, uint32 B, uint32 C, uint32 D) { return rmap[y][x]; } -template -static inline uint32 INTERPOLATE(uint32 A, uint32 B) { - - return (((A & highBits) >> 1) + ((B & highBits) >> 1) + (A & B & lowBits)); -} - -template -static inline uint32 Q_INTERPOLATE(uint32 A, uint32 B, uint32 C, uint32 D) { - register uint32 x = ((A & qhighBits) >> 2) + ((B & qhighBits) >> 2) + ((C & qhighBits) >> 2) + ((D & qhighBits) >> 2); - register uint32 y = ((A & qlowBits) + (B & qlowBits) + (C & qlowBits) + (D & qlowBits)) >> 2; - - y &= qlowBits; - return x + y; -} - #define INTERPOLATE INTERPOLATE #define Q_INTERPOLATE Q_INTERPOLATE diff --git a/common/scaler/hq2x.cpp b/common/scaler/hq2x.cpp index 92a80f5e6c..cd461f7be9 100644 --- a/common/scaler/hq2x.cpp +++ b/common/scaler/hq2x.cpp @@ -83,7 +83,6 @@ */ template void HQ2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { -// int w[10]; register int w1, w2, w3, w4, w5, w6, w7, w8, w9; const uint32 nextlineSrc = srcPitch / sizeof(uint16); @@ -130,23 +129,8 @@ void HQ2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, vector signed char vecYUV5555; vector signed char vecYUV1234; vector signed char vecYUV6789; -/* - // The pixel vectors. - // TODO: Keep the pixels up-to-date in this, just like for the YUV data. - // But instead of just keeping the 16 bit pixel values in them, keep - // them convert to 32 bit RGB in there! This way, we avoid converting - // the same pixels to 32 bit repeatedly (which may be expensive, esp. - // when reading 16 bit pixels in 565 format). - // The Altivec enhanced interpolation functions (to be written :-) - // then can directly make use of these vectors. - vector signed char vecRGB5555; - vector signed char vecRGB1234; - vector signed char vecRGB6789; -*/ #endif - - while (height--) { w1 = *(p - 1 - nextlineSrc); w4 = *(p - 1); diff --git a/common/scaler/intern.h b/common/scaler/intern.h index 02773bca93..69af4a2230 100644 --- a/common/scaler/intern.h +++ b/common/scaler/intern.h @@ -29,6 +29,11 @@ #include "common/scaler.h" #include "common/util.h" +// HACK HACK HACK +// Enable *experimental* AltiVec support. +// This will produce code crashing on any machine *without* Altivec +// +#define USE_ALTIVEC 0 template struct ColorMasks { @@ -63,6 +68,32 @@ struct ColorMasks<555> { extern int gBitFormat; +/** + * Interpolate two 16 bit pixel pairs at once with equal weights 1. + * In particular, A and B can contain two pixels/each in the upper + * and lower halves. + */ +template +static inline uint32 INTERPOLATE(uint32 A, uint32 B) { + + return (((A & highBits) >> 1) + ((B & highBits) >> 1) + (A & B & lowBits)); +} + +/** + * Interpolate four 16 bit pixel pairs at once with equal weights 1. + * In particular, A and B can contain two pixels/each in the upper + * and lower halves. + */ +template +static inline uint32 Q_INTERPOLATE(uint32 A, uint32 B, uint32 C, uint32 D) { + register uint32 x = ((A & qhighBits) >> 2) + ((B & qhighBits) >> 2) + ((C & qhighBits) >> 2) + ((D & qhighBits) >> 2); + register uint32 y = ((A & qlowBits) + (B & qlowBits) + (C & qlowBits) + (D & qlowBits)) >> 2; + + y &= qlowBits; + return x + y; +} + + /** * Interpolate two 16 bit pixels with the weights specified in the template * parameters. Used by the hq scaler family. @@ -97,17 +128,21 @@ static inline bool diffYUV(int yuv1, int yuv2) { static const int trV = 0x00000006; int diff; + int mask; diff = ((yuv1 & Ymask) - (yuv2 & Ymask)); - if (diff < 0) diff = - diff; + mask = diff >> 31; // -1 if value < 0, 0 otherwise + diff = (diff ^ mask) - mask; //-1: ~value + 1; 0: value if (diff > trY) return true; diff = ((yuv1 & Umask) - (yuv2 & Umask)); - if (diff < 0) diff = - diff; + mask = diff >> 31; // -1 if value < 0, 0 otherwise + diff = (diff ^ mask) - mask; //-1: ~value + 1; 0: value if (diff > trU) return true; diff = ((yuv1 & Vmask) - (yuv2 & Vmask)); - if (diff < 0) diff = - diff; + mask = diff >> 31; // -1 if value < 0, 0 otherwise + diff = (diff ^ mask) - mask; //-1: ~value + 1; 0: value if (diff > trV) return true; return false; -- cgit v1.2.3