aboutsummaryrefslogtreecommitdiff
path: root/common/scaler.cpp
diff options
context:
space:
mode:
authorMax Horn2003-09-29 16:02:47 +0000
committerMax Horn2003-09-29 16:02:47 +0000
commit4a7385b4e742b283045021b1760a1fbf4d6979ac (patch)
tree94f5727c5e4870016ee11a2945ebffd59d5b60fc /common/scaler.cpp
parent7fff8b0134356b200a9e21982a0436b3e8068d6f (diff)
downloadscummvm-rg350-4a7385b4e742b283045021b1760a1fbf4d6979ac.tar.gz
scummvm-rg350-4a7385b4e742b283045021b1760a1fbf4d6979ac.tar.bz2
scummvm-rg350-4a7385b4e742b283045021b1760a1fbf4d6979ac.zip
split out scalers into separate source files in common/scaler; some optimizations (in particular, the hq2x/hq3x scalers now are compiled into two versions, one for 555 and one for 565 mode)
svn-id: r10488
Diffstat (limited to 'common/scaler.cpp')
-rw-r--r--common/scaler.cpp5542
1 files changed, 96 insertions, 5446 deletions
diff --git a/common/scaler.cpp b/common/scaler.cpp
index e0f17e22ea..8f618c472c 100644
--- a/common/scaler.cpp
+++ b/common/scaler.cpp
@@ -20,10 +20,7 @@
*
*/
-#include "stdafx.h"
-#include "common/scummsys.h"
-#include "common/scaler.h"
-#include "common/util.h"
+#include "common/scaler/intern.h"
// TODO: get rid of the colorMask etc. variables and instead use templates.
@@ -34,12 +31,18 @@
// once for 555, resulting in the object file being twice as big (but thanks to
// templates, no source code would be duplicated.
-static uint32 colorMask = 0xF7DEF7DE;
-static uint32 lowPixelMask = 0x08210821;
-static uint32 qcolorMask = 0xE79CE79C;
-static uint32 qlowpixelMask = 0x18631863;
-static uint32 redblueMask = 0xF81F;
-static uint32 greenMask = 0x07E0;
+
+int gBitFormat = 565;
+
+uint32 colorMask = 0xF7DEF7DE;
+uint32 lowPixelMask = 0x08210821;
+uint32 qcolorMask = 0xE79CE79C;
+uint32 qlowpixelMask = 0x18631863;
+static uint32 redblueMask = redblueMask_565;
+static uint32 greenMask = greenMask_565;
+
+// RGB-to-YUV lookup table
+int RGBtoYUV[65536];
static const uint16 dotmatrix_565[16] = {
0x01E0, 0x0007, 0x3800, 0x0000,
@@ -63,413 +66,118 @@ void InitScalers(uint32 BitFormat) {
lowPixelMask = 0x08210821;
qcolorMask = 0xE79CE79C;
qlowpixelMask = 0x18631863;
- redblueMask = 0xF81F;
- greenMask = 0x07E0;
+ redblueMask = redblueMask_565;
+ greenMask = greenMask_565;
dotmatrix = dotmatrix_565;
} else if (BitFormat == 555) {
colorMask = 0x7BDE7BDE;
lowPixelMask = 0x04210421;
qcolorMask = 0x739C739C;
qlowpixelMask = 0x0C630C63;
- redblueMask = 0x7C1F;
- greenMask = 0x03E0;
+ redblueMask = redblueMask_555;
+ greenMask = greenMask_555;
dotmatrix = dotmatrix_555;
} else {
error("Unknwon bit format %d\n", BitFormat);
}
+ gBitFormat = BitFormat;
InitLUT(BitFormat);
}
-static inline int GetResult(uint32 A, uint32 B, uint32 C, uint32 D) {
- const bool ac = (A==C);
- const bool bc = (B==C);
- const int x1 = ac;
- const int y1 = (bc & !ac);
- const bool ad = (A==D);
- const bool bd = (B==D);
- const int x2 = ad;
- const int y2 = (bd & !ad);
- const int x = x1+x2;
- const int y = y1+y2;
- static const int rmap[3][3] = {
- {0, 0, -1},
- {0, 0, -1},
- {1, 1, 0}
- };
- return rmap[y][x];
-}
-
-static inline uint32 INTERPOLATE(uint32 A, uint32 B) {
- // FIXME: Is an "if" (and thus introducing a conditional (even hard to predict)
- // jump inside a hot code section really good for a speed improvement?
- // Maybe it would actually be faster to remove it. This would remove the jump
- // at the expense of 4 ANDs, 2 shifts and 2 additions. But if that means
- // avoiding a pipeline flush (and don't forget, those instructions might be
- // interleaved, thus "free")...
- // Answering this will require some careful analysis, and could actually vary
- // when running on different processors.
- if (A != B) {
- return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask));
- } else
- return A;
-}
-
-static inline uint32 Q_INTERPOLATE(uint32 A, uint32 B, uint32 C, uint32 D) {
- register uint32 x = ((A & qcolorMask) >> 2) + ((B & qcolorMask) >> 2) + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2);
- register uint32 y = ((A & qlowpixelMask) + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask)) >> 2;
-
- y &= qlowpixelMask;
- return x + y;
-}
-
-void Super2xSaI(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
- const uint16 *bP;
- uint16 *dP;
- const uint32 nextlineSrc = srcPitch >> 1;
-
- while (height--) {
- bP = (const uint16 *)srcPtr;
- dP = (uint16 *)dstPtr;
-
- for (int i = 0; i < width; ++i) {
- uint32 color4, color5, color6;
- uint32 color1, color2, color3;
- uint32 colorA0, colorA1, colorA2, colorA3;
- uint32 colorB0, colorB1, colorB2, colorB3;
- uint32 colorS1, colorS2;
- uint32 product1a, product1b, product2a, product2b;
-
-//--------------------------------------- B1 B2
-// 4 5 6 S2
-// 1 2 3 S1
-// A1 A2
-
- colorB0 = *(bP - nextlineSrc - 1);
- colorB1 = *(bP - nextlineSrc);
- colorB2 = *(bP - nextlineSrc + 1);
- colorB3 = *(bP - nextlineSrc + 2);
-
- color4 = *(bP - 1);
- color5 = *(bP);
- color6 = *(bP + 1);
- colorS2 = *(bP + 2);
-
- color1 = *(bP + nextlineSrc - 1);
- color2 = *(bP + nextlineSrc);
- color3 = *(bP + nextlineSrc + 1);
- colorS1 = *(bP + nextlineSrc + 2);
-
- colorA0 = *(bP + 2 * nextlineSrc - 1);
- colorA1 = *(bP + 2 * nextlineSrc);
- colorA2 = *(bP + 2 * nextlineSrc + 1);
- colorA3 = *(bP + 2 * nextlineSrc + 2);
-
-//--------------------------------------
- if (color2 == color6 && color5 != color3) {
- product2b = product1b = color2;
- } else if (color5 == color3 && color2 != color6) {
- product2b = product1b = color5;
- } else if (color5 == color3 && color2 == color6) {
- register int r = 0;
-
- r += GetResult(color6, color5, color1, colorA1);
- r += GetResult(color6, color5, color4, colorB1);
- r += GetResult(color6, color5, colorA2, colorS1);
- r += GetResult(color6, color5, colorB2, colorS2);
-
- if (r > 0)
- product2b = product1b = color6;
- else if (r < 0)
- product2b = product1b = color5;
- else {
- product2b = product1b = INTERPOLATE(color5, color6);
- }
- } else {
- if (color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0)
- product2b = Q_INTERPOLATE(color3, color3, color3, color2);
- else if (color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3)
- product2b = Q_INTERPOLATE(color2, color2, color2, color3);
- else
- product2b = INTERPOLATE(color2, color3);
+void InitLUT(uint32 BitFormat) {
+ int r, g, b;
+ int Y, u, v;
+ int gInc, gShift;
+
+ if (BitFormat == 565) {
+ gInc = 256 >> 6;
+ gShift = 6 - 3;
+ } else {
+ gInc = 256 >> 5;
+ gShift = 5 - 3;
+ }
- if (color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0)
- product1b = Q_INTERPOLATE(color6, color6, color6, color5);
- else if (color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3)
- product1b = Q_INTERPOLATE(color6, color5, color5, color5);
- else
- product1b = INTERPOLATE(color5, color6);
+ for (r = 0; r < 256; r += 8) {
+ for (g = 0; g < 256; g += gInc) {
+ for (b = 0; b < 256; b += 8) {
+ Y = (r + g + b) >> 2;
+ u = 128 + ((r - b) >> 2);
+ v = 128 + ((-r + 2 * g -b) >> 3);
+ RGBtoYUV[ (r << (5+gShift)) + (g << gShift) + (b >> 3) ] = (Y << 16) + (u << 8) + v;
}
-
- if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2)
- product2a = INTERPOLATE(color2, color5);
- else if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0)
- product2a = INTERPOLATE(color2, color5);
- else
- product2a = color2;
-
- if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2)
- product1a = INTERPOLATE(color2, color5);
- else if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0)
- product1a = INTERPOLATE(color2, color5);
- else
- product1a = color5;
-
- *(dP + 0) = (uint16) product1a;
- *(dP + 1) = (uint16) product1b;
- *(dP + dstPitch/2 + 0) = (uint16) product2a;
- *(dP + dstPitch/2 + 1) = (uint16) product2b;
-
- bP += 1;
- dP += 2;
}
+ }
+}
+/**
+ * Trivial 'scaler' - in fact it doesn't do any scaling but just copies the
+ * source to the destionation.
+ */
+void Normal1x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
+ int width, int height) {
+ while (height--) {
+ memcpy(dstPtr, srcPtr, 2 * width);
srcPtr += srcPitch;
- dstPtr += dstPitch * 2;
+ dstPtr += dstPitch;
}
}
-void SuperEagle(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
- const uint16 *bP;
- uint16 *dP;
- const uint32 nextlineSrc = srcPitch >> 1;
+/**
+ * Trivial nearest-neighbour 2x scaler.
+ */
+void Normal2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
+ int width, int height) {
+ uint8 *r;
while (height--) {
- bP = (const uint16 *)srcPtr;
- dP = (uint16 *)dstPtr;
- for (int i = 0; i < width; ++i) {
- uint32 color4, color5, color6;
- uint32 color1, color2, color3;
- uint32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2;
- uint32 product1a, product1b, product2a, product2b;
-
- colorB1 = *(bP - nextlineSrc);
- colorB2 = *(bP - nextlineSrc + 1);
-
- color4 = *(bP - 1);
- color5 = *(bP);
- color6 = *(bP + 1);
- colorS2 = *(bP + 2);
-
- color1 = *(bP + nextlineSrc - 1);
- color2 = *(bP + nextlineSrc);
- color3 = *(bP + nextlineSrc + 1);
- colorS1 = *(bP + nextlineSrc + 2);
-
- colorA1 = *(bP + 2 * nextlineSrc);
- colorA2 = *(bP + 2 * nextlineSrc + 1);
-
- // --------------------------------------
- if (color5 != color3) {
- if (color2 == color6) {
- product1b = product2a = color2;
- if ((color1 == color2) || (color6 == colorB2)) {
- product1a = INTERPOLATE(color2, color5);
- product1a = INTERPOLATE(color2, product1a);
- } else {
- product1a = INTERPOLATE(color5, color6);
- }
-
- if ((color6 == colorS2) || (color2 == colorA1)) {
- product2b = INTERPOLATE(color2, color3);
- product2b = INTERPOLATE(color2, product2b);
- } else {
- product2b = INTERPOLATE(color2, color3);
- }
- } else {
- product2b = product1a = INTERPOLATE(color2, color6);
- product2b = Q_INTERPOLATE(color3, color3, color3, product2b);
- product1a = Q_INTERPOLATE(color5, color5, color5, product1a);
-
- product2a = product1b = INTERPOLATE(color5, color3);
- product2a = Q_INTERPOLATE(color2, color2, color2, product2a);
- product1b = Q_INTERPOLATE(color6, color6, color6, product1b);
- }
- } else {
- if (color2 != color6) {
- product2b = product1a = color5;
-
- if ((colorB1 == color5) || (color3 == colorS1)) {
- product1b = INTERPOLATE(color5, color6);
- product1b = INTERPOLATE(color5, product1b);
- } else {
- product1b = INTERPOLATE(color5, color6);
- }
-
- if ((color3 == colorA2) || (color4 == color5)) {
- product2a = INTERPOLATE(color5, color2);
- product2a = INTERPOLATE(color5, product2a);
- } else {
- product2a = INTERPOLATE(color2, color3);
- }
- } else {
- register int r = 0;
-
- r += GetResult(color6, color5, color1, colorA1);
- r += GetResult(color6, color5, color4, colorB1);
- r += GetResult(color6, color5, colorA2, colorS1);
- r += GetResult(color6, color5, colorB2, colorS2);
-
- if (r > 0) {
- product1b = product2a = color2;
- product1a = product2b = INTERPOLATE(color5, color6);
- } else if (r < 0) {
- product2b = product1a = color5;
- product1b = product2a = INTERPOLATE(color5, color6);
- } else {
- product2b = product1a = color5;
- product1b = product2a = color2;
- }
- }
- }
-
- *(dP + 0) = (uint16) product1a;
- *(dP + 1) = (uint16) product1b;
- *(dP + dstPitch/2 + 0) = (uint16) product2a;
- *(dP + dstPitch/2 + 1) = (uint16) product2b;
+ r = dstPtr;
+ for (int i = 0; i < width; ++i, r += 4) {
+ uint16 color = *(((const uint16 *)srcPtr) + i);
- bP += 1;
- dP += 2;
+ *(uint16 *)(r + 0) = color;
+ *(uint16 *)(r + 2) = color;
+ *(uint16 *)(r + 0 + dstPitch) = color;
+ *(uint16 *)(r + 2 + dstPitch) = color;
}
-
srcPtr += srcPitch;
- dstPtr += dstPitch * 2;
+ dstPtr += dstPitch << 1;
}
}
-void _2xSaI(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
- const uint16 *bP;
- uint16 *dP;
- const uint32 nextlineSrc = srcPitch >> 1;
+/**
+ * Trivial nearest-neighbour 3x scaler.
+ */
+void Normal3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
+ int width, int height) {
+ uint8 *r;
+ uint32 dstPitch2 = dstPitch * 2;
+ uint32 dstPitch3 = dstPitch * 3;
while (height--) {
- bP = (const uint16 *)srcPtr;
- dP = (uint16 *)dstPtr;
-
- for (int i = 0; i < width; ++i) {
-
- register uint32 colorA, colorB;
- uint32 colorC, colorD,
- colorE, colorF, colorG, colorH, colorI, colorJ, colorK, colorL, colorM, colorN, colorO, colorP;
- uint32 product, product1, product2;
-
-//---------------------------------------
-// Map of the pixels: I|E F|J
-// G|A B|K
-// H|C D|L
-// M|N O|P
- colorI = *(bP - nextlineSrc - 1);
- colorE = *(bP - nextlineSrc);
- colorF = *(bP - nextlineSrc + 1);
- colorJ = *(bP - nextlineSrc + 2);
-
- colorG = *(bP - 1);
- colorA = *(bP);
- colorB = *(bP + 1);
- colorK = *(bP + 2);
-
- colorH = *(bP + nextlineSrc - 1);
- colorC = *(bP + nextlineSrc);
- colorD = *(bP + nextlineSrc + 1);
- colorL = *(bP + nextlineSrc + 2);
-
- colorM = *(bP + 2 * nextlineSrc - 1);
- colorN = *(bP + 2 * nextlineSrc);
- colorO = *(bP + 2 * nextlineSrc + 1);
- colorP = *(bP + 2 * nextlineSrc + 2);
-
- if ((colorA == colorD) && (colorB != colorC)) {
- if (((colorA == colorE) && (colorB == colorL)) ||
- ((colorA == colorC) && (colorA == colorF) && (colorB != colorE) && (colorB == colorJ))) {
- product = colorA;
- } else {
- product = INTERPOLATE(colorA, colorB);
- }
-
- if (((colorA == colorG) && (colorC == colorO)) ||
- ((colorA == colorB) && (colorA == colorH) && (colorG != colorC) && (colorC == colorM))) {
- product1 = colorA;
- } else {
- product1 = INTERPOLATE(colorA, colorC);
- }
- product2 = colorA;
- } else if ((colorB == colorC) && (colorA != colorD)) {
- if (((colorB == colorF) && (colorA == colorH)) ||
- ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI))) {
- product = colorB;
- } else {
- product = INTERPOLATE(colorA, colorB);
- }
-
- if (((colorC == colorH) && (colorA == colorF)) ||
- ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI))) {
- product1 = colorC;
- } else {
- product1 = INTERPOLATE(colorA, colorC);
- }
- product2 = colorB;
- } else if ((colorA == colorD) && (colorB == colorC)) {
- if (colorA == colorB) {
- product = colorA;
- product1 = colorA;
- product2 = colorA;
- } else {
- register int r = 0;
-
- product1 = INTERPOLATE(colorA, colorC);
- product = INTERPOLATE(colorA, colorB);
-
- r += GetResult(colorA, colorB, colorG, colorE);
- r -= GetResult(colorB, colorA, colorK, colorF);
- r -= GetResult(colorB, colorA, colorH, colorN);
- r += GetResult(colorA, colorB, colorL, colorO);
-
- if (r > 0)
- product2 = colorA;
- else if (r < 0)
- product2 = colorB;
- else {
- product2 = Q_INTERPOLATE(colorA, colorB, colorC, colorD);
- }
- }
- } else {
- product2 = Q_INTERPOLATE(colorA, colorB, colorC, colorD);
-
- if ((colorA == colorC) && (colorA == colorF)
- && (colorB != colorE) && (colorB == colorJ)) {
- product = colorA;
- } else if ((colorB == colorE) && (colorB == colorD)
- && (colorA != colorF) && (colorA == colorI)) {
- product = colorB;
- } else {
- product = INTERPOLATE(colorA, colorB);
- }
-
- if ((colorA == colorB) && (colorA == colorH)
- && (colorG != colorC) && (colorC == colorM)) {
- product1 = colorA;
- } else if ((colorC == colorG) && (colorC == colorD)
- && (colorA != colorH) && (colorA == colorI)) {
- product1 = colorC;
- } else {
- product1 = INTERPOLATE(colorA, colorC);
- }
- }
-
- *(dP + 0) = (uint16) colorA;
- *(dP + 1) = (uint16) product;
- *(dP + dstPitch/2 + 0) = (uint16) product1;
- *(dP + dstPitch/2 + 1) = (uint16) product2;
+ r = dstPtr;
+ for (int i = 0; i < width; ++i, r += 6) {
+ uint16 color = *(((const uint16 *)srcPtr) + i);
- bP += 1;
- dP += 2;
+ *(uint16 *)(r + 0) = color;
+ *(uint16 *)(r + 2) = color;
+ *(uint16 *)(r + 4) = color;
+ *(uint16 *)(r + 0 + dstPitch) = color;
+ *(uint16 *)(r + 2 + dstPitch) = color;
+ *(uint16 *)(r + 4 + dstPitch) = color;
+ *(uint16 *)(r + 0 + dstPitch2) = color;
+ *(uint16 *)(r + 2 + dstPitch2) = color;
+ *(uint16 *)(r + 4 + dstPitch2) = color;
}
-
srcPtr += srcPitch;
- dstPtr += dstPitch * 2;
+ dstPtr += dstPitch3;
}
}
+/**
+ * The Scale2x filter, also known as AdvMame2x.
+ * See also http://scale2x.sourceforge.net
+ */
void AdvMame2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
int width, int height) {
const uint32 nextlineSrc = srcPitch / sizeof(uint16);
@@ -489,7 +197,8 @@ void AdvMame2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPi
C = *(p - nextlineSrc);
F = *(p);
I = *(p + nextlineSrc);
- for (int i = 0; i < width; ++i) {
+ int tmpWidth = width;
+ while (tmpWidth--) {
p++;
A = B; B = C; C = *(p - nextlineSrc);
D = E; E = F; F = *(p);
@@ -506,6 +215,10 @@ void AdvMame2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPi
}
}
+/**
+ * The Scale3x filter, also known as AdvMame3x.
+ * See also http://scale2x.sourceforge.net
+ */
void AdvMame3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
int width, int height) {
const uint32 nextlineSrc = srcPitch / sizeof(uint16);
@@ -525,7 +238,8 @@ void AdvMame3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPi
C = *(p - nextlineSrc);
F = *(p);
I = *(p + nextlineSrc);
- for (int i = 0; i < width; ++i) {
+ int tmpWidth = width;
+ while (tmpWidth--) {
p++;
A = B; B = C; C = *(p - nextlineSrc);
D = E; E = F; F = *(p);
@@ -547,60 +261,6 @@ void AdvMame3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPi
}
}
-void Normal1x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
- int width, int height) {
- while (height--) {
- memcpy(dstPtr, srcPtr, 2 * width);
- srcPtr += srcPitch;
- dstPtr += dstPitch;
- }
-}
-
-void Normal2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
- int width, int height) {
- uint8 *r;
-
- while (height--) {
- r = dstPtr;
- for (int i = 0; i < width; ++i, r += 4) {
- uint16 color = *(((const uint16 *)srcPtr) + i);
-
- *(uint16 *)(r + 0) = color;
- *(uint16 *)(r + 2) = color;
- *(uint16 *)(r + 0 + dstPitch) = color;
- *(uint16 *)(r + 2 + dstPitch) = color;
- }
- srcPtr += srcPitch;
- dstPtr += dstPitch << 1;
- }
-}
-
-void Normal3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
- int width, int height) {
- uint8 *r;
- uint32 dstPitch2 = dstPitch * 2;
- uint32 dstPitch3 = dstPitch * 3;
-
- while (height--) {
- r = dstPtr;
- for (int i = 0; i < width; ++i, r += 6) {
- uint16 color = *(((const uint16 *)srcPtr) + i);
-
- *(uint16 *)(r + 0) = color;
- *(uint16 *)(r + 2) = color;
- *(uint16 *)(r + 4) = color;
- *(uint16 *)(r + 0 + dstPitch) = color;
- *(uint16 *)(r + 2 + dstPitch) = color;
- *(uint16 *)(r + 4 + dstPitch) = color;
- *(uint16 *)(r + 0 + dstPitch2) = color;
- *(uint16 *)(r + 2 + dstPitch2) = color;
- *(uint16 *)(r + 4 + dstPitch2) = color;
- }
- srcPtr += srcPitch;
- dstPtr += dstPitch3;
- }
-}
-
void TV2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
int width, int height) {
const uint32 nextlineSrc = srcPitch / sizeof(uint16);
@@ -609,7 +269,7 @@ void TV2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
const uint32 nextlineDst = dstPitch / sizeof(uint16);
uint16 *q = (uint16 *)dstPtr;
- while(height--) {
+ while (height--) {
for (int i = 0, j = 0; i < width; ++i, j += 2) {
uint16 p1 = *(p + i);
uint32 pi;
@@ -653,5013 +313,3 @@ void DotMatrix(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPi
}
}
-//
-// The HQ3x filter (C++ version) by Maxim Stepin (see http://www.hiend3d.com/hq3x.html).
-// Adapted to 16 bit output and optimized by Max Horn
-//
-
-static int RGBtoYUV[65536];
-
-/** Interpolate two 16 bit pixels with the weights specified in the template parameters. */
-template<int w1, int w2>
-static inline uint16 interpolate16_2(uint16 p1, uint16 p2) {
- return ((((p1 & redblueMask) * w1 + (p2 & redblueMask) * w2) / (w1 + w2)) & redblueMask) |
- ((((p1 & greenMask) * w1 + (p2 & greenMask) * w2) / (w1 + w2)) & greenMask);
-}
-
-/** Interpolate three 16 bit pixels with the weights specified in the template parameters. */
-template<int w1, int w2, int w3>
-static inline uint16 interpolate16_3(uint16 p1, uint16 p2, uint16 p3) {
- return ((((p1 & redblueMask) * w1 + (p2 & redblueMask) * w2 + (p3 & redblueMask) * w3) / (w1 + w2 + w3)) & redblueMask) |
- ((((p1 & greenMask) * w1 + (p2 & greenMask) * w2 + (p3 & greenMask) * w3) / (w1 + w2 + w3)) & greenMask);
-}
-
-static inline bool diffYUV(int yuv1, int yuv2) {
- static const int Ymask = 0x00FF0000;
- static const int Umask = 0x0000FF00;
- static const int Vmask = 0x000000FF;
- static const int trY = 0x00300000;
- static const int trU = 0x00000700;
- static const int trV = 0x00000006;
-
- return
- ( ( ABS((yuv1 & Ymask) - (yuv2 & Ymask)) > trY ) ||
- ( ABS((yuv1 & Umask) - (yuv2 & Umask)) > trU ) ||
- ( ABS((yuv1 & Vmask) - (yuv2 & Vmask)) > trV ) );
-}
-
-#define PIXEL00_0 *(q) = w[5];
-#define PIXEL00_10 *(q) = interpolate16_2<3,1>(w[5], w[1]);
-#define PIXEL00_11 *(q) = interpolate16_2<3,1>(w[5], w[4]);
-#define PIXEL00_12 *(q) = interpolate16_2<3,1>(w[5], w[2]);
-#define PIXEL00_20 *(q) = interpolate16_3<2,1,1>(w[5], w[4], w[2]);
-#define PIXEL00_30 *(q) = interpolate16_3<6,1,1>(w[5], w[4], w[2]);
-#define PIXEL00_40 *(q) = interpolate16_3<14,1,1>(w[5], w[4], w[2]);
-#define PIXEL00_50 *(q) = interpolate16_3<5,2,1>(w[5], w[2], w[4]);
-#define PIXEL00_51 *(q) = interpolate16_3<5,2,1>(w[5], w[4], w[2]);
-#define PIXEL00_60 *(q) = interpolate16_3<2,3,3>(w[5], w[4], w[2]);
-
-#define PIXEL01_0 *(q+1) = w[5];
-#define PIXEL01_10 *(q+1) = interpolate16_2<3,1>(w[5], w[3]);
-#define PIXEL01_11 *(q+1) = interpolate16_2<3,1>(w[5], w[2]);
-#define PIXEL01_12 *(q+1) = interpolate16_2<3,1>(w[5], w[6]);
-#define PIXEL01_20 *(q+1) = interpolate16_3<2,1,1>(w[5], w[2], w[6]);
-#define PIXEL01_30 *(q+1) = interpolate16_3<6,1,1>(w[5], w[2], w[6]);
-#define PIXEL01_40 *(q+1) = interpolate16_3<14,1,1>(w[5], w[2], w[6]);
-#define PIXEL01_50 *(q+1) = interpolate16_3<5,2,1>(w[5], w[6], w[2]);
-#define PIXEL01_51 *(q+1) = interpolate16_3<5,2,1>(w[5], w[2], w[6]);
-#define PIXEL01_60 *(q+1) = interpolate16_3<2,3,3>(w[5], w[2], w[6]);
-
-#define PIXEL10_0 *(q+nextlineDst) = w[5];
-#define PIXEL10_10 *(q+nextlineDst) = interpolate16_2<3,1>(w[5], w[7]);
-#define PIXEL10_11 *(q+nextlineDst) = interpolate16_2<3,1>(w[5], w[8]);
-#define PIXEL10_12 *(q+nextlineDst) = interpolate16_2<3,1>(w[5], w[4]);
-#define PIXEL10_20 *(q+nextlineDst) = interpolate16_3<2,1,1>(w[5], w[8], w[4]);
-#define PIXEL10_30 *(q+nextlineDst) = interpolate16_3<6,1,1>(w[5], w[8], w[4]);
-#define PIXEL10_40 *(q+nextlineDst) = interpolate16_3<14,1,1>(w[5], w[8], w[4]);
-#define PIXEL10_50 *(q+nextlineDst) = interpolate16_3<5,2,1>(w[5], w[4], w[8]);
-#define PIXEL10_51 *(q+nextlineDst) = interpolate16_3<5,2,1>(w[5], w[8], w[4]);
-#define PIXEL10_60 *(q+nextlineDst) = interpolate16_3<2,3,3>(w[5], w[8], w[4]);
-
-#define PIXEL11_0 *(q+1+nextlineDst) = w[5];
-#define PIXEL11_10 *(q+1+nextlineDst) = interpolate16_2<3,1>(w[5], w[9]);
-#define PIXEL11_11 *(q+1+nextlineDst) = interpolate16_2<3,1>(w[5], w[6]);
-#define PIXEL11_12 *(q+1+nextlineDst) = interpolate16_2<3,1>(w[5], w[8]);
-#define PIXEL11_20 *(q+1+nextlineDst) = interpolate16_3<2,1,1>(w[5], w[6], w[8]);
-#define PIXEL11_30 *(q+1+nextlineDst) = interpolate16_3<6,1,1>(w[5], w[6], w[8]);
-#define PIXEL11_40 *(q+1+nextlineDst) = interpolate16_3<14,1,1>(w[5], w[6], w[8]);
-#define PIXEL11_50 *(q+1+nextlineDst) = interpolate16_3<5,2,1>(w[5], w[8], w[6]);
-#define PIXEL11_51 *(q+1+nextlineDst) = interpolate16_3<5,2,1>(w[5], w[6], w[8]);
-#define PIXEL11_60 *(q+1+nextlineDst) = interpolate16_3<2,3,3>(w[5], w[6], w[8]);
-
-void HQ2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
- int w[10];
- int yuv[10];
-
- const uint32 nextlineSrc = srcPitch / sizeof(uint16);
- const uint16 *p = (const uint16 *)srcPtr;
-
- const uint32 nextlineDst = dstPitch / sizeof(uint16);
- uint16 *q = (uint16 *)dstPtr;
-
- // +----+----+----+
- // | | | |
- // | w1 | w2 | w3 |
- // +----+----+----+
- // | | | |
- // | w4 | w5 | w6 |
- // +----+----+----+
- // | | | |
- // | w7 | w8 | w9 |
- // +----+----+----+
-
- while (height--) {
- w[2] = *(p - 1 - nextlineSrc); yuv[2] = RGBtoYUV[w[2]];
- w[5] = *(p - 1); yuv[5] = RGBtoYUV[w[5]];
- w[8] = *(p - 1 + nextlineSrc); yuv[8] = RGBtoYUV[w[8]];
-
- w[3] = *(p - nextlineSrc); yuv[3] = RGBtoYUV[w[3]];
- w[6] = *(p); yuv[6] = RGBtoYUV[w[6]];
- w[9] = *(p + nextlineSrc); yuv[9] = RGBtoYUV[w[9]];
-
- int tmpWidth = width;
- while (tmpWidth--) {
- p++;
-
- w[1] = w[2]; yuv[1] = yuv[2];
- w[4] = w[5]; yuv[4] = yuv[5];
- w[7] = w[8]; yuv[7] = yuv[8];
-
- w[2] = w[3]; yuv[2] = yuv[3];
- w[5] = w[6]; yuv[5] = yuv[6];
- w[8] = w[9]; yuv[8] = yuv[9];
-
- w[3] = *(p - nextlineSrc); yuv[3] = RGBtoYUV[w[3]];
- w[6] = *(p); yuv[6] = RGBtoYUV[w[6]];
- w[9] = *(p + nextlineSrc); yuv[9] = RGBtoYUV[w[9]];
-
- int pattern = 0;
- int flag = 1;
-
- for (int k = 1; k <= 9; k++) {
- if (k == 5) continue;
-
- if (w[k] != w[5]) {
- if (diffYUV(yuv[5], yuv[k]))
- pattern |= flag;
- }
- flag <<= 1;
- }
-
- switch (pattern) {
- case 0:
- case 1:
- case 4:
- case 32:
- case 128:
- case 5:
- case 132:
- case 160:
- case 33:
- case 129:
- case 36:
- case 133:
- case 164:
- case 161:
- case 37:
- case 165:
- PIXEL00_20
- PIXEL01_20
- PIXEL10_20
- PIXEL11_20
- break;
- case 2:
- case 34:
- case 130:
- case 162:
- PIXEL00_10
- PIXEL01_10
- PIXEL10_20
- PIXEL11_20
- break;
- case 16:
- case 17:
- case 48:
- case 49:
- PIXEL00_20
- PIXEL01_10
- PIXEL10_20
- PIXEL11_10
- break;
- case 64:
- case 65:
- case 68:
- case 69:
- PIXEL00_20
- PIXEL01_20
- PIXEL10_10
- PIXEL11_10
- break;
- case 8:
- case 12:
- case 136:
- case 140:
- PIXEL00_10
- PIXEL01_20
- PIXEL10_10
- PIXEL11_20
- break;
- case 3:
- case 35:
- case 131:
- case 163:
- PIXEL00_11
- PIXEL01_10
- PIXEL10_20
- PIXEL11_20
- break;
- case 6:
- case 38:
- case 134:
- case 166:
- PIXEL00_10
- PIXEL01_12
- PIXEL10_20
- PIXEL11_20
- break;
- case 20:
- case 21:
- case 52:
- case 53:
- PIXEL00_20
- PIXEL01_11
- PIXEL10_20
- PIXEL11_10
- break;
- case 144:
- case 145:
- case 176:
- case 177:
- PIXEL00_20
- PIXEL01_10
- PIXEL10_20
- PIXEL11_12
- break;
- case 192:
- case 193:
- case 196:
- case 197:
- PIXEL00_20
- PIXEL01_20
- PIXEL10_10
- PIXEL11_11
- break;
- case 96:
- case 97:
- case 100:
- case 101:
- PIXEL00_20
- PIXEL01_20
- PIXEL10_12
- PIXEL11_10
- break;
- case 40:
- case 44:
- case 168:
- case 172:
- PIXEL00_10
- PIXEL01_20
- PIXEL10_11
- PIXEL11_20
- break;
- case 9:
- case 13:
- case 137:
- case 141:
- PIXEL00_12
- PIXEL01_20
- PIXEL10_10
- PIXEL11_20
- break;
- case 18:
- case 50:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_20
- }
- PIXEL10_20
- PIXEL11_10
- break;
- case 80:
- case 81:
- PIXEL00_20
- PIXEL01_10
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_20
- }
- break;
- case 72:
- case 76:
- PIXEL00_10
- PIXEL01_20
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_20
- }
- PIXEL11_10
- break;
- case 10:
- case 138:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_20
- }
- PIXEL01_10
- PIXEL10_10
- PIXEL11_20
- break;
- case 66:
- PIXEL00_10
- PIXEL01_10
- PIXEL10_10
- PIXEL11_10
- break;
- case 24:
- PIXEL00_10
- PIXEL01_10
- PIXEL10_10
- PIXEL11_10
- break;
- case 7:
- case 39:
- case 135:
- PIXEL00_11
- PIXEL01_12
- PIXEL10_20
- PIXEL11_20
- break;
- case 148:
- case 149:
- case 180:
- PIXEL00_20
- PIXEL01_11
- PIXEL10_20
- PIXEL11_12
- break;
- case 224:
- case 228:
- case 225:
- PIXEL00_20
- PIXEL01_20
- PIXEL10_12
- PIXEL11_11
- break;
- case 41:
- case 169:
- case 45:
- PIXEL00_12
- PIXEL01_20
- PIXEL10_11
- PIXEL11_20
- break;
- case 22:
- case 54:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_20
- PIXEL11_10
- break;
- case 208:
- case 209:
- PIXEL00_20
- PIXEL01_10
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 104:
- case 108:
- PIXEL00_10
- PIXEL01_20
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- PIXEL11_10
- break;
- case 11:
- case 139:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- PIXEL01_10
- PIXEL10_10
- PIXEL11_20
- break;
- case 19:
- case 51:
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL00_11
- PIXEL01_10
- } else {
- PIXEL00_50
- PIXEL01_60
- }
- PIXEL10_20
- PIXEL11_10
- break;
- case 146:
- case 178:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- PIXEL11_12
- } else {
- PIXEL01_60
- PIXEL11_51
- }
- PIXEL10_20
- break;
- case 84:
- case 85:
- PIXEL00_20
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL01_11
- PIXEL11_10
- } else {
- PIXEL01_50
- PIXEL11_60
- }
- PIXEL10_10
- break;
- case 112:
- case 113:
- PIXEL00_20
- PIXEL01_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL10_12
- PIXEL11_10
- } else {
- PIXEL10_51
- PIXEL11_60
- }
- break;
- case 200:
- case 204:
- PIXEL00_10
- PIXEL01_20
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- PIXEL11_11
- } else {
- PIXEL10_60
- PIXEL11_50
- }
- break;
- case 73:
- case 77:
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL00_12
- PIXEL10_10
- } else {
- PIXEL00_51
- PIXEL10_60
- }
- PIXEL01_20
- PIXEL11_10
- break;
- case 42:
- case 170:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- PIXEL10_11
- } else {
- PIXEL00_60
- PIXEL10_50
- }
- PIXEL01_10
- PIXEL11_20
- break;
- case 14:
- case 142:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- PIXEL01_12
- } else {
- PIXEL00_60
- PIXEL01_51
- }
- PIXEL10_10
- PIXEL11_20
- break;
- case 67:
- PIXEL00_11
- PIXEL01_10
- PIXEL10_10
- PIXEL11_10
- break;
- case 70:
- PIXEL00_10
- PIXEL01_12
- PIXEL10_10
- PIXEL11_10
- break;
- case 28:
- PIXEL00_10
- PIXEL01_11
- PIXEL10_10
- PIXEL11_10
- break;
- case 152:
- PIXEL00_10
- PIXEL01_10
- PIXEL10_10
- PIXEL11_12
- break;
- case 194:
- PIXEL00_10
- PIXEL01_10
- PIXEL10_10
- PIXEL11_11
- break;
- case 98:
- PIXEL00_10
- PIXEL01_10
- PIXEL10_12
- PIXEL11_10
- break;
- case 56:
- PIXEL00_10
- PIXEL01_10
- PIXEL10_11
- PIXEL11_10
- break;
- case 25:
- PIXEL00_12
- PIXEL01_10
- PIXEL10_10
- PIXEL11_10
- break;
- case 26:
- case 31:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_10
- PIXEL11_10
- break;
- case 82:
- case 214:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 88:
- case 248:
- PIXEL00_10
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 74:
- case 107:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- PIXEL11_10
- break;
- case 27:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- PIXEL01_10
- PIXEL10_10
- PIXEL11_10
- break;
- case 86:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_10
- PIXEL11_10
- break;
- case 216:
- PIXEL00_10
- PIXEL01_10
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 106:
- PIXEL00_10
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- PIXEL11_10
- break;
- case 30:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_10
- PIXEL11_10
- break;
- case 210:
- PIXEL00_10
- PIXEL01_10
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 120:
- PIXEL00_10
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- PIXEL11_10
- break;
- case 75:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- PIXEL01_10
- PIXEL10_10
- PIXEL11_10
- break;
- case 29:
- PIXEL00_12
- PIXEL01_11
- PIXEL10_10
- PIXEL11_10
- break;
- case 198:
- PIXEL00_10
- PIXEL01_12
- PIXEL10_10
- PIXEL11_11
- break;
- case 184:
- PIXEL00_10
- PIXEL01_10
- PIXEL10_11
- PIXEL11_12
- break;
- case 99:
- PIXEL00_11
- PIXEL01_10
- PIXEL10_12
- PIXEL11_10
- break;
- case 57:
- PIXEL00_12
- PIXEL01_10
- PIXEL10_11
- PIXEL11_10
- break;
- case 71:
- PIXEL00_11
- PIXEL01_12
- PIXEL10_10
- PIXEL11_10
- break;
- case 156:
- PIXEL00_10
- PIXEL01_11
- PIXEL10_10
- PIXEL11_12
- break;
- case 226:
- PIXEL00_10
- PIXEL01_10
- PIXEL10_12
- PIXEL11_11
- break;
- case 60:
- PIXEL00_10
- PIXEL01_11
- PIXEL10_11
- PIXEL11_10
- break;
- case 195:
- PIXEL00_11
- PIXEL01_10
- PIXEL10_10
- PIXEL11_11
- break;
- case 102:
- PIXEL00_10
- PIXEL01_12
- PIXEL10_12
- PIXEL11_10
- break;
- case 153:
- PIXEL00_12
- PIXEL01_10
- PIXEL10_10
- PIXEL11_12
- break;
- case 58:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- PIXEL10_11
- PIXEL11_10
- break;
- case 83:
- PIXEL00_11
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 92:
- PIXEL00_10
- PIXEL01_11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 202:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- PIXEL11_11
- break;
- case 78:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- PIXEL01_12
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- PIXEL11_10
- break;
- case 154:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- PIXEL10_10
- PIXEL11_12
- break;
- case 114:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- PIXEL10_12
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 89:
- PIXEL00_12
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 90:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 55:
- case 23:
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL00_11
- PIXEL01_0
- } else {
- PIXEL00_50
- PIXEL01_60
- }
- PIXEL10_20
- PIXEL11_10
- break;
- case 182:
- case 150:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- PIXEL11_12
- } else {
- PIXEL01_60
- PIXEL11_51
- }
- PIXEL10_20
- break;
- case 213:
- case 212:
- PIXEL00_20
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL01_11
- PIXEL11_0
- } else {
- PIXEL01_50
- PIXEL11_60
- }
- PIXEL10_10
- break;
- case 241:
- case 240:
- PIXEL00_20
- PIXEL01_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL10_12
- PIXEL11_0
- } else {
- PIXEL10_51
- PIXEL11_60
- }
- break;
- case 236:
- case 232:
- PIXEL00_10
- PIXEL01_20
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- PIXEL11_11
- } else {
- PIXEL10_60
- PIXEL11_50
- }
- break;
- case 109:
- case 105:
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL00_12
- PIXEL10_0
- } else {
- PIXEL00_51
- PIXEL10_60
- }
- PIXEL01_20
- PIXEL11_10
- break;
- case 171:
- case 43:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- PIXEL10_11
- } else {
- PIXEL00_60
- PIXEL10_50
- }
- PIXEL01_10
- PIXEL11_20
- break;
- case 143:
- case 15:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- PIXEL01_12
- } else {
- PIXEL00_60
- PIXEL01_51
- }
- PIXEL10_10
- PIXEL11_20
- break;
- case 124:
- PIXEL00_10
- PIXEL01_11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- PIXEL11_10
- break;
- case 203:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- PIXEL01_10
- PIXEL10_10
- PIXEL11_11
- break;
- case 62:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_11
- PIXEL11_10
- break;
- case 211:
- PIXEL00_11
- PIXEL01_10
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 118:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_12
- PIXEL11_10
- break;
- case 217:
- PIXEL00_12
- PIXEL01_10
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 110:
- PIXEL00_10
- PIXEL01_12
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- PIXEL11_10
- break;
- case 155:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- PIXEL01_10
- PIXEL10_10
- PIXEL11_12
- break;
- case 188:
- PIXEL00_10
- PIXEL01_11
- PIXEL10_11
- PIXEL11_12
- break;
- case 185:
- PIXEL00_12
- PIXEL01_10
- PIXEL10_11
- PIXEL11_12
- break;
- case 61:
- PIXEL00_12
- PIXEL01_11
- PIXEL10_11
- PIXEL11_10
- break;
- case 157:
- PIXEL00_12
- PIXEL01_11
- PIXEL10_10
- PIXEL11_12
- break;
- case 103:
- PIXEL00_11
- PIXEL01_12
- PIXEL10_12
- PIXEL11_10
- break;
- case 227:
- PIXEL00_11
- PIXEL01_10
- PIXEL10_12
- PIXEL11_11
- break;
- case 230:
- PIXEL00_10
- PIXEL01_12
- PIXEL10_12
- PIXEL11_11
- break;
- case 199:
- PIXEL00_11
- PIXEL01_12
- PIXEL10_10
- PIXEL11_11
- break;
- case 220:
- PIXEL00_10
- PIXEL01_11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 158:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_10
- PIXEL11_12
- break;
- case 234:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- PIXEL11_11
- break;
- case 242:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- PIXEL10_12
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 59:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- PIXEL10_11
- PIXEL11_10
- break;
- case 121:
- PIXEL00_12
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 87:
- PIXEL00_11
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 79:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- PIXEL01_12
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- PIXEL11_10
- break;
- case 122:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 94:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 218:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 91:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 229:
- PIXEL00_20
- PIXEL01_20
- PIXEL10_12
- PIXEL11_11
- break;
- case 167:
- PIXEL00_11
- PIXEL01_12
- PIXEL10_20
- PIXEL11_20
- break;
- case 173:
- PIXEL00_12
- PIXEL01_20
- PIXEL10_11
- PIXEL11_20
- break;
- case 181:
- PIXEL00_20
- PIXEL01_11
- PIXEL10_20
- PIXEL11_12
- break;
- case 186:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- PIXEL10_11
- PIXEL11_12
- break;
- case 115:
- PIXEL00_11
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- PIXEL10_12
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 93:
- PIXEL00_12
- PIXEL01_11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 206:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- PIXEL01_12
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- PIXEL11_11
- break;
- case 205:
- case 201:
- PIXEL00_12
- PIXEL01_20
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_10
- } else {
- PIXEL10_30
- }
- PIXEL11_11
- break;
- case 174:
- case 46:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_10
- } else {
- PIXEL00_30
- }
- PIXEL01_12
- PIXEL10_11
- PIXEL11_20
- break;
- case 179:
- case 147:
- PIXEL00_11
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_10
- } else {
- PIXEL01_30
- }
- PIXEL10_20
- PIXEL11_12
- break;
- case 117:
- case 116:
- PIXEL00_20
- PIXEL01_11
- PIXEL10_12
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_10
- } else {
- PIXEL11_30
- }
- break;
- case 189:
- PIXEL00_12
- PIXEL01_11
- PIXEL10_11
- PIXEL11_12
- break;
- case 231:
- PIXEL00_11
- PIXEL01_12
- PIXEL10_12
- PIXEL11_11
- break;
- case 126:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- PIXEL11_10
- break;
- case 219:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- PIXEL01_10
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 125:
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL00_12
- PIXEL10_0
- } else {
- PIXEL00_51
- PIXEL10_60
- }
- PIXEL01_11
- PIXEL11_10
- break;
- case 221:
- PIXEL00_12
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL01_11
- PIXEL11_0
- } else {
- PIXEL01_50
- PIXEL11_60
- }
- PIXEL10_10
- break;
- case 207:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- PIXEL01_12
- } else {
- PIXEL00_60
- PIXEL01_51
- }
- PIXEL10_10
- PIXEL11_11
- break;
- case 238:
- PIXEL00_10
- PIXEL01_12
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- PIXEL11_11
- } else {
- PIXEL10_60
- PIXEL11_50
- }
- break;
- case 190:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- PIXEL11_12
- } else {
- PIXEL01_60
- PIXEL11_51
- }
- PIXEL10_11
- break;
- case 187:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- PIXEL10_11
- } else {
- PIXEL00_60
- PIXEL10_50
- }
- PIXEL01_10
- PIXEL11_12
- break;
- case 243:
- PIXEL00_11
- PIXEL01_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL10_12
- PIXEL11_0
- } else {
- PIXEL10_51
- PIXEL11_60
- }
- break;
- case 119:
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL00_11
- PIXEL01_0
- } else {
- PIXEL00_50
- PIXEL01_60
- }
- PIXEL10_12
- PIXEL11_10
- break;
- case 237:
- case 233:
- PIXEL00_12
- PIXEL01_20
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_40
- }
- PIXEL11_11
- break;
- case 175:
- case 47:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_40
- }
- PIXEL01_12
- PIXEL10_11
- PIXEL11_20
- break;
- case 183:
- case 151:
- PIXEL00_11
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_40
- }
- PIXEL10_20
- PIXEL11_12
- break;
- case 245:
- case 244:
- PIXEL00_20
- PIXEL01_11
- PIXEL10_12
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_40
- }
- break;
- case 250:
- PIXEL00_10
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 123:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- PIXEL11_10
- break;
- case 95:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_10
- PIXEL11_10
- break;
- case 222:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 252:
- PIXEL00_10
- PIXEL01_11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_40
- }
- break;
- case 249:
- PIXEL00_12
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_40
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 235:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_40
- }
- PIXEL11_11
- break;
- case 111:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_40
- }
- PIXEL01_12
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- PIXEL11_10
- break;
- case 63:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_40
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_11
- PIXEL11_10
- break;
- case 159:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_40
- }
- PIXEL10_10
- PIXEL11_12
- break;
- case 215:
- PIXEL00_11
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_40
- }
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 246:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- PIXEL10_12
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_40
- }
- break;
- case 254:
- PIXEL00_10
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_40
- }
- break;
- case 253:
- PIXEL00_12
- PIXEL01_11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_40
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_40
- }
- break;
- case 251:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- PIXEL01_10
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_40
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 239:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_40
- }
- PIXEL01_12
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_40
- }
- PIXEL11_11
- break;
- case 127:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_40
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_20
- }
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_20
- }
- PIXEL11_10
- break;
- case 191:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_40
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_40
- }
- PIXEL10_11
- PIXEL11_12
- break;
- case 223:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_20
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_40
- }
- PIXEL10_10
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_20
- }
- break;
- case 247:
- PIXEL00_11
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_40
- }
- PIXEL10_12
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_40
- }
- break;
- case 255:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_0
- } else {
- PIXEL00_40
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_0
- } else {
- PIXEL01_40
- }
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_0
- } else {
- PIXEL10_40
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL11_0
- } else {
- PIXEL11_40
- }
- break;
- }
- q += 2;
- }
- p += nextlineSrc - width;
- q += (nextlineDst - width) * 2;
- }
-}
-
-
-#define PIXEL00_1M *(q) = interpolate16_2<3,1>(w[5], w[1]);
-#define PIXEL00_1U *(q) = interpolate16_2<3,1>(w[5], w[2]);
-#define PIXEL00_1L *(q) = interpolate16_2<3,1>(w[5], w[4]);
-#define PIXEL00_2 *(q) = interpolate16_3<2,1,1>(w[5], w[4], w[2]);
-#define PIXEL00_4 *(q) = interpolate16_3<2,7,7>(w[5], w[4], w[2]);
-#define PIXEL00_5 *(q) = interpolate16_2<1,1>(w[4], w[2]);
-#define PIXEL00_C *(q) = w[5];
-
-#define PIXEL01_1 *(q+1) = interpolate16_2<3,1>(w[5], w[2]);
-#define PIXEL01_3 *(q+1) = interpolate16_2<7,1>(w[5], w[2]);
-#define PIXEL01_6 *(q+1) = interpolate16_2<3,1>(w[2], w[5]);
-#define PIXEL01_C *(q+1) = w[5];
-
-#define PIXEL02_1M *(q+2) = interpolate16_2<3,1>(w[5], w[3]);
-#define PIXEL02_1U *(q+2) = interpolate16_2<3,1>(w[5], w[2]);
-#define PIXEL02_1R *(q+2) = interpolate16_2<3,1>(w[5], w[6]);
-#define PIXEL02_2 *(q+2) = interpolate16_3<2,1,1>(w[5], w[2], w[6]);
-#define PIXEL02_4 *(q+2) = interpolate16_3<2,7,7>(w[5], w[2], w[6]);
-#define PIXEL02_5 *(q+2) = interpolate16_2<1,1>(w[2], w[6]);
-#define PIXEL02_C *(q+2) = w[5];
-
-#define PIXEL10_1 *(q+nextlineDst) = interpolate16_2<3,1>(w[5], w[4]);
-#define PIXEL10_3 *(q+nextlineDst) = interpolate16_2<7,1>(w[5], w[4]);
-#define PIXEL10_6 *(q+nextlineDst) = interpolate16_2<3,1>(w[4], w[5]);
-#define PIXEL10_C *(q+nextlineDst) = w[5];
-
-#define PIXEL11 *(q+1+nextlineDst) = w[5];
-
-#define PIXEL12_1 *(q+2+nextlineDst) = interpolate16_2<3,1>(w[5], w[6]);
-#define PIXEL12_3 *(q+2+nextlineDst) = interpolate16_2<7,1>(w[5], w[6]);
-#define PIXEL12_6 *(q+2+nextlineDst) = interpolate16_2<3,1>(w[6], w[5]);
-#define PIXEL12_C *(q+2+nextlineDst) = w[5];
-
-#define PIXEL20_1M *(q+nextlineDst2) = interpolate16_2<3,1>(w[5], w[7]);
-#define PIXEL20_1D *(q+nextlineDst2) = interpolate16_2<3,1>(w[5], w[8]);
-#define PIXEL20_1L *(q+nextlineDst2) = interpolate16_2<3,1>(w[5], w[4]);
-#define PIXEL20_2 *(q+nextlineDst2) = interpolate16_3<2,1,1>(w[5], w[8], w[4]);
-#define PIXEL20_4 *(q+nextlineDst2) = interpolate16_3<2,7,7>(w[5], w[8], w[4]);
-#define PIXEL20_5 *(q+nextlineDst2) = interpolate16_2<1,1>(w[8], w[4]);
-#define PIXEL20_C *(q+nextlineDst2) = w[5];
-
-#define PIXEL21_1 *(q+1+nextlineDst2) = interpolate16_2<3,1>(w[5], w[8]);
-#define PIXEL21_3 *(q+1+nextlineDst2) = interpolate16_2<7,1>(w[5], w[8]);
-#define PIXEL21_6 *(q+1+nextlineDst2) = interpolate16_2<3,1>(w[8], w[5]);
-#define PIXEL21_C *(q+1+nextlineDst2) = w[5];
-
-#define PIXEL22_1M *(q+2+nextlineDst2) = interpolate16_2<3,1>(w[5], w[9]);
-#define PIXEL22_1D *(q+2+nextlineDst2) = interpolate16_2<3,1>(w[5], w[8]);
-#define PIXEL22_1R *(q+2+nextlineDst2) = interpolate16_2<3,1>(w[5], w[6]);
-#define PIXEL22_2 *(q+2+nextlineDst2) = interpolate16_3<2,1,1>(w[5], w[6], w[8]);
-#define PIXEL22_4 *(q+2+nextlineDst2) = interpolate16_3<2,7,7>(w[5], w[6], w[8]);
-#define PIXEL22_5 *(q+2+nextlineDst2) = interpolate16_2<1,1>(w[6], w[8]);
-#define PIXEL22_C *(q+2+nextlineDst2) = w[5];
-
-void HQ3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
- int w[10];
- int yuv[10];
-
- const uint32 nextlineSrc = srcPitch / sizeof(uint16);
- const uint16 *p = (const uint16 *)srcPtr;
-
- const uint32 nextlineDst = dstPitch / sizeof(uint16);
- const uint32 nextlineDst2 = 2 * nextlineDst;
- uint16 *q = (uint16 *)dstPtr;
-
- // TODO: The YUV access could be finetuned and optimized; depending on the
- // target processor, various different courses could prove to be "best".
- // For example, it might be better to get rid of the RGBtoYUV table - it
- // is 256kb big, which is be a problem for processors with a small cache.
- // For those, doing the YUV conversion on the fly might be faster. On the
- // other end of spectrum, for procs with large cache, getting rid of yuv[]
- // might better - just always write RGBtoYUV[w[idx]].
- //
- // Maybe we can reduce the size of RGBtoYUV to half its size since
- // diffYUV doesn't need full 8 bits for each component
-
-
-
- // +----+----+----+
- // | | | |
- // | w1 | w2 | w3 |
- // +----+----+----+
- // | | | |
- // | w4 | w5 | w6 |
- // +----+----+----+
- // | | | |
- // | w7 | w8 | w9 |
- // +----+----+----+
-
- while (height--) {
- w[2] = *(p - 1 - nextlineSrc); yuv[2] = RGBtoYUV[w[2]];
- w[5] = *(p - 1); yuv[5] = RGBtoYUV[w[5]];
- w[8] = *(p - 1 + nextlineSrc); yuv[8] = RGBtoYUV[w[8]];
-
- w[3] = *(p - nextlineSrc); yuv[3] = RGBtoYUV[w[3]];
- w[6] = *(p); yuv[6] = RGBtoYUV[w[6]];
- w[9] = *(p + nextlineSrc); yuv[9] = RGBtoYUV[w[9]];
-
- int tmpWidth = width;
- while (tmpWidth--) {
- p++;
-
- w[1] = w[2]; yuv[1] = yuv[2];
- w[4] = w[5]; yuv[4] = yuv[5];
- w[7] = w[8]; yuv[7] = yuv[8];
-
- w[2] = w[3]; yuv[2] = yuv[3];
- w[5] = w[6]; yuv[5] = yuv[6];
- w[8] = w[9]; yuv[8] = yuv[9];
-
- w[3] = *(p - nextlineSrc); yuv[3] = RGBtoYUV[w[3]];
- w[6] = *(p); yuv[6] = RGBtoYUV[w[6]];
- w[9] = *(p + nextlineSrc); yuv[9] = RGBtoYUV[w[9]];
-
- int pattern = 0;
- int flag = 1;
-
- for (int k = 1; k <= 9; k++) {
- if (k == 5) continue;
-
- if (w[k] != w[5]) {
- if (diffYUV(yuv[5], yuv[k]))
- pattern |= flag;
- }
- flag <<= 1;
- }
-
- switch (pattern) {
- case 0:
- case 1:
- case 4:
- case 32:
- case 128:
- case 5:
- case 132:
- case 160:
- case 33:
- case 129:
- case 36:
- case 133:
- case 164:
- case 161:
- case 37:
- case 165:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_2
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_2
- PIXEL21_1
- PIXEL22_2
- break;
- case 2:
- case 34:
- case 130:
- case 162:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_2
- PIXEL21_1
- PIXEL22_2
- break;
- case 16:
- case 17:
- case 48:
- case 49:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_2
- PIXEL21_1
- PIXEL22_1M
- break;
- case 64:
- case 65:
- case 68:
- case 69:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_2
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1M
- break;
- case 8:
- case 12:
- case 136:
- case 140:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_2
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_2
- break;
- case 3:
- case 35:
- case 131:
- case 163:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_2
- PIXEL21_1
- PIXEL22_2
- break;
- case 6:
- case 38:
- case 134:
- case 166:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_2
- PIXEL21_1
- PIXEL22_2
- break;
- case 20:
- case 21:
- case 52:
- case 53:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_2
- PIXEL21_1
- PIXEL22_1M
- break;
- case 144:
- case 145:
- case 176:
- case 177:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_2
- PIXEL21_1
- PIXEL22_1D
- break;
- case 192:
- case 193:
- case 196:
- case 197:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_2
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1R
- break;
- case 96:
- case 97:
- case 100:
- case 101:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_2
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1M
- break;
- case 40:
- case 44:
- case 168:
- case 172:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_2
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_2
- break;
- case 9:
- case 13:
- case 137:
- case 141:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_2
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_2
- break;
- case 18:
- case 50:
- PIXEL00_1M
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_1M
- PIXEL12_C
- } else {
- PIXEL01_3
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL10_1
- PIXEL11
- PIXEL20_2
- PIXEL21_1
- PIXEL22_1M
- break;
- case 80:
- case 81:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL20_1M
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL21_C
- PIXEL22_1M
- } else {
- PIXEL12_3
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 72:
- case 76:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_2
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_1M
- PIXEL21_C
- } else {
- PIXEL10_3
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1M
- break;
- case 10:
- case 138:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- PIXEL01_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL01_3
- PIXEL10_3
- }
- PIXEL02_1M
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_2
- break;
- case 66:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1M
- break;
- case 24:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1M
- break;
- case 7:
- case 39:
- case 135:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_2
- PIXEL21_1
- PIXEL22_2
- break;
- case 148:
- case 149:
- case 180:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_2
- PIXEL21_1
- PIXEL22_1D
- break;
- case 224:
- case 228:
- case 225:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_2
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1R
- break;
- case 41:
- case 169:
- case 45:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_2
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_2
- break;
- case 22:
- case 54:
- PIXEL00_1M
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL01_3
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL10_1
- PIXEL11
- PIXEL20_2
- PIXEL21_1
- PIXEL22_1M
- break;
- case 208:
- case 209:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL20_1M
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 104:
- case 108:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_2
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL10_3
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1M
- break;
- case 11:
- case 139:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL01_3
- PIXEL10_3
- }
- PIXEL02_1M
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_2
- break;
- case 19:
- case 51:
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1M
- PIXEL12_C
- } else {
- PIXEL00_2
- PIXEL01_6
- PIXEL02_5
- PIXEL12_1
- }
- PIXEL10_1
- PIXEL11
- PIXEL20_2
- PIXEL21_1
- PIXEL22_1M
- break;
- case 146:
- case 178:
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_1M
- PIXEL12_C
- PIXEL22_1D
- } else {
- PIXEL01_1
- PIXEL02_5
- PIXEL12_6
- PIXEL22_2
- }
- PIXEL00_1M
- PIXEL10_1
- PIXEL11
- PIXEL20_2
- PIXEL21_1
- break;
- case 84:
- case 85:
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL02_1U
- PIXEL12_C
- PIXEL21_C
- PIXEL22_1M
- } else {
- PIXEL02_2
- PIXEL12_6
- PIXEL21_1
- PIXEL22_5
- }
- PIXEL00_2
- PIXEL01_1
- PIXEL10_1
- PIXEL11
- PIXEL20_1M
- break;
- case 112:
- case 113:
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1M
- } else {
- PIXEL12_1
- PIXEL20_2
- PIXEL21_6
- PIXEL22_5
- }
- PIXEL00_2
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- break;
- case 200:
- case 204:
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1R
- } else {
- PIXEL10_1
- PIXEL20_5
- PIXEL21_6
- PIXEL22_2
- }
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_2
- PIXEL11
- PIXEL12_1
- break;
- case 73:
- case 77:
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL00_1U
- PIXEL10_C
- PIXEL20_1M
- PIXEL21_C
- } else {
- PIXEL00_2
- PIXEL10_6
- PIXEL20_5
- PIXEL21_1
- }
- PIXEL01_1
- PIXEL02_2
- PIXEL11
- PIXEL12_1
- PIXEL22_1M
- break;
- case 42:
- case 170:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- PIXEL01_C
- PIXEL10_C
- PIXEL20_1D
- } else {
- PIXEL00_5
- PIXEL01_1
- PIXEL10_6
- PIXEL20_2
- }
- PIXEL02_1M
- PIXEL11
- PIXEL12_1
- PIXEL21_1
- PIXEL22_2
- break;
- case 14:
- case 142:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_C
- } else {
- PIXEL00_5
- PIXEL01_6
- PIXEL02_2
- PIXEL10_1
- }
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_2
- break;
- case 67:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1M
- break;
- case 70:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1M
- break;
- case 28:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1M
- break;
- case 152:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1D
- break;
- case 194:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1R
- break;
- case 98:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1M
- break;
- case 56:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1M
- break;
- case 25:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1M
- break;
- case 26:
- case 31:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL10_3
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL11
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1M
- break;
- case 82:
- case 214:
- PIXEL00_1M
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- } else {
- PIXEL01_3
- PIXEL02_4
- }
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 88:
- case 248:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1M
- PIXEL11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- } else {
- PIXEL10_3
- PIXEL20_4
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL22_4
- }
- break;
- case 74:
- case 107:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- } else {
- PIXEL00_4
- PIXEL01_3
- }
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1M
- break;
- case 27:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL01_3
- PIXEL10_3
- }
- PIXEL02_1M
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1M
- break;
- case 86:
- PIXEL00_1M
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL01_3
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL10_1
- PIXEL11
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1M
- break;
- case 216:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL20_1M
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 106:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1M
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL10_3
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1M
- break;
- case 30:
- PIXEL00_1M
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL01_3
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL10_C
- PIXEL11
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1M
- break;
- case 210:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL20_1M
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 120:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1M
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL10_3
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1M
- break;
- case 75:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL01_3
- PIXEL10_3
- }
- PIXEL02_1M
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1M
- break;
- case 29:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1M
- break;
- case 198:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1R
- break;
- case 184:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1D
- break;
- case 99:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1M
- break;
- case 57:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1M
- break;
- case 71:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1M
- break;
- case 156:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1D
- break;
- case 226:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1R
- break;
- case 60:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1M
- break;
- case 195:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1R
- break;
- case 102:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1M
- break;
- case 153:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1D
- break;
- case 58:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1M
- break;
- case 83:
- PIXEL00_1L
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 92:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 202:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- PIXEL22_1R
- break;
- case 78:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- PIXEL22_1M
- break;
- case 154:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1D
- break;
- case 114:
- PIXEL00_1M
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_1L
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 89:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 90:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 55:
- case 23:
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL00_2
- PIXEL01_6
- PIXEL02_5
- PIXEL12_1
- }
- PIXEL10_1
- PIXEL11
- PIXEL20_2
- PIXEL21_1
- PIXEL22_1M
- break;
- case 182:
- case 150:
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- PIXEL22_1D
- } else {
- PIXEL01_1
- PIXEL02_5
- PIXEL12_6
- PIXEL22_2
- }
- PIXEL00_1M
- PIXEL10_1
- PIXEL11
- PIXEL20_2
- PIXEL21_1
- break;
- case 213:
- case 212:
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL02_1U
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL02_2
- PIXEL12_6
- PIXEL21_1
- PIXEL22_5
- }
- PIXEL00_2
- PIXEL01_1
- PIXEL10_1
- PIXEL11
- PIXEL20_1M
- break;
- case 241:
- case 240:
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_1
- PIXEL20_2
- PIXEL21_6
- PIXEL22_5
- }
- PIXEL00_2
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- break;
- case 236:
- case 232:
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- PIXEL22_1R
- } else {
- PIXEL10_1
- PIXEL20_5
- PIXEL21_6
- PIXEL22_2
- }
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_2
- PIXEL11
- PIXEL12_1
- break;
- case 109:
- case 105:
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL00_1U
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL00_2
- PIXEL10_6
- PIXEL20_5
- PIXEL21_1
- }
- PIXEL01_1
- PIXEL02_2
- PIXEL11
- PIXEL12_1
- PIXEL22_1M
- break;
- case 171:
- case 43:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- PIXEL20_1D
- } else {
- PIXEL00_5
- PIXEL01_1
- PIXEL10_6
- PIXEL20_2
- }
- PIXEL02_1M
- PIXEL11
- PIXEL12_1
- PIXEL21_1
- PIXEL22_2
- break;
- case 143:
- case 15:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_C
- } else {
- PIXEL00_5
- PIXEL01_6
- PIXEL02_2
- PIXEL10_1
- }
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_2
- break;
- case 124:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1U
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL10_3
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1M
- break;
- case 203:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL01_3
- PIXEL10_3
- }
- PIXEL02_1M
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1R
- break;
- case 62:
- PIXEL00_1M
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL01_3
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL10_C
- PIXEL11
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1M
- break;
- case 211:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL20_1M
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 118:
- PIXEL00_1M
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL01_3
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL10_1
- PIXEL11
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1M
- break;
- case 217:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL20_1M
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 110:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1R
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL10_3
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1M
- break;
- case 155:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL01_3
- PIXEL10_3
- }
- PIXEL02_1M
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1D
- break;
- case 188:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1D
- break;
- case 185:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1D
- break;
- case 61:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1M
- break;
- case 157:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1D
- break;
- case 103:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1M
- break;
- case 227:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1R
- break;
- case 230:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1R
- break;
- case 199:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1R
- break;
- case 220:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 158:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL01_3
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL10_C
- PIXEL11
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1D
- break;
- case 234:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- PIXEL02_1M
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL10_3
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1R
- break;
- case 242:
- PIXEL00_1M
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL10_1
- PIXEL11
- PIXEL20_1L
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 59:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL01_3
- PIXEL10_3
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1M
- break;
- case 121:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1M
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL10_3
- PIXEL20_4
- PIXEL21_3
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 87:
- PIXEL00_1L
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL01_3
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL10_1
- PIXEL11
- PIXEL20_1M
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 79:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL01_3
- PIXEL10_3
- }
- PIXEL02_1R
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- PIXEL22_1M
- break;
- case 122:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL10_3
- PIXEL20_4
- PIXEL21_3
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 94:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL01_3
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL10_C
- PIXEL11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 218:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL10_C
- PIXEL11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 91:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL01_3
- PIXEL10_3
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 229:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_2
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1R
- break;
- case 167:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_2
- PIXEL21_1
- PIXEL22_2
- break;
- case 173:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_2
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_2
- break;
- case 181:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_2
- PIXEL21_1
- PIXEL22_1D
- break;
- case 186:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1D
- break;
- case 115:
- PIXEL00_1L
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_1L
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 93:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 206:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- PIXEL22_1R
- break;
- case 205:
- case 201:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_2
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_1M
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- PIXEL22_1R
- break;
- case 174:
- case 46:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_1M
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_2
- break;
- case 179:
- case 147:
- PIXEL00_1L
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_1M
- } else {
- PIXEL02_2
- }
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_2
- PIXEL21_1
- PIXEL22_1D
- break;
- case 117:
- case 116:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_1L
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_1M
- } else {
- PIXEL22_2
- }
- break;
- case 189:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1D
- break;
- case 231:
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_1
- PIXEL11
- PIXEL12_1
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1R
- break;
- case 126:
- PIXEL00_1M
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL01_3
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL10_3
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1M
- break;
- case 219:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL01_3
- PIXEL10_3
- }
- PIXEL02_1M
- PIXEL11
- PIXEL20_1M
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 125:
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL00_1U
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL00_2
- PIXEL10_6
- PIXEL20_5
- PIXEL21_1
- }
- PIXEL01_1
- PIXEL02_1U
- PIXEL11
- PIXEL12_C
- PIXEL22_1M
- break;
- case 221:
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL02_1U
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL02_2
- PIXEL12_6
- PIXEL21_1
- PIXEL22_5
- }
- PIXEL00_1U
- PIXEL01_1
- PIXEL10_C
- PIXEL11
- PIXEL20_1M
- break;
- case 207:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_C
- } else {
- PIXEL00_5
- PIXEL01_6
- PIXEL02_2
- PIXEL10_1
- }
- PIXEL11
- PIXEL12_1
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1R
- break;
- case 238:
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- PIXEL22_1R
- } else {
- PIXEL10_1
- PIXEL20_5
- PIXEL21_6
- PIXEL22_2
- }
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1R
- PIXEL11
- PIXEL12_1
- break;
- case 190:
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- PIXEL22_1D
- } else {
- PIXEL01_1
- PIXEL02_5
- PIXEL12_6
- PIXEL22_2
- }
- PIXEL00_1M
- PIXEL10_C
- PIXEL11
- PIXEL20_1D
- PIXEL21_1
- break;
- case 187:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- PIXEL20_1D
- } else {
- PIXEL00_5
- PIXEL01_1
- PIXEL10_6
- PIXEL20_2
- }
- PIXEL02_1M
- PIXEL11
- PIXEL12_C
- PIXEL21_1
- PIXEL22_1D
- break;
- case 243:
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_1
- PIXEL20_2
- PIXEL21_6
- PIXEL22_5
- }
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_1M
- PIXEL10_1
- PIXEL11
- break;
- case 119:
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL00_1L
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL00_2
- PIXEL01_6
- PIXEL02_5
- PIXEL12_1
- }
- PIXEL10_1
- PIXEL11
- PIXEL20_1L
- PIXEL21_C
- PIXEL22_1M
- break;
- case 237:
- case 233:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_2
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_C
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- PIXEL22_1R
- break;
- case 175:
- case 47:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_2
- break;
- case 183:
- case 151:
- PIXEL00_1L
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_C
- } else {
- PIXEL02_2
- }
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_2
- PIXEL21_1
- PIXEL22_1D
- break;
- case 245:
- case 244:
- PIXEL00_2
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_1L
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_C
- } else {
- PIXEL22_2
- }
- break;
- case 250:
- PIXEL00_1M
- PIXEL01_C
- PIXEL02_1M
- PIXEL11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- } else {
- PIXEL10_3
- PIXEL20_4
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL22_4
- }
- break;
- case 123:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- } else {
- PIXEL00_4
- PIXEL01_3
- }
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1M
- break;
- case 95:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL10_3
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL11
- PIXEL20_1M
- PIXEL21_C
- PIXEL22_1M
- break;
- case 222:
- PIXEL00_1M
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- } else {
- PIXEL01_3
- PIXEL02_4
- }
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 252:
- PIXEL00_1M
- PIXEL01_1
- PIXEL02_1U
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- } else {
- PIXEL10_3
- PIXEL20_4
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_C
- } else {
- PIXEL22_2
- }
- break;
- case 249:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_C
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL22_4
- }
- break;
- case 235:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- } else {
- PIXEL00_4
- PIXEL01_3
- }
- PIXEL02_1M
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_C
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- PIXEL22_1R
- break;
- case 111:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1M
- break;
- case 63:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL10_C
- PIXEL11
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1M
- break;
- case 159:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL10_3
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_C
- } else {
- PIXEL02_2
- }
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- PIXEL21_1
- PIXEL22_1D
- break;
- case 215:
- PIXEL00_1L
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_C
- } else {
- PIXEL02_2
- }
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_1M
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 246:
- PIXEL00_1M
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- } else {
- PIXEL01_3
- PIXEL02_4
- }
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_1L
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_C
- } else {
- PIXEL22_2
- }
- break;
- case 254:
- PIXEL00_1M
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- } else {
- PIXEL01_3
- PIXEL02_4
- }
- PIXEL11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- } else {
- PIXEL10_3
- PIXEL20_4
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL21_3
- PIXEL22_2
- }
- break;
- case 253:
- PIXEL00_1U
- PIXEL01_1
- PIXEL02_1U
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_C
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_C
- } else {
- PIXEL22_2
- }
- break;
- case 251:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- } else {
- PIXEL00_4
- PIXEL01_3
- }
- PIXEL02_1M
- PIXEL11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL10_C
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL10_3
- PIXEL20_2
- PIXEL21_3
- }
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL12_C
- PIXEL22_C
- } else {
- PIXEL12_3
- PIXEL22_4
- }
- break;
- case 239:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- PIXEL02_1R
- PIXEL10_C
- PIXEL11
- PIXEL12_1
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_C
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- PIXEL22_1R
- break;
- case 127:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL01_C
- PIXEL10_C
- } else {
- PIXEL00_2
- PIXEL01_3
- PIXEL10_3
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL02_4
- PIXEL12_3
- }
- PIXEL11
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_C
- PIXEL21_C
- } else {
- PIXEL20_4
- PIXEL21_3
- }
- PIXEL22_1M
- break;
- case 191:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_C
- } else {
- PIXEL02_2
- }
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- PIXEL20_1D
- PIXEL21_1
- PIXEL22_1D
- break;
- case 223:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- PIXEL10_C
- } else {
- PIXEL00_4
- PIXEL10_3
- }
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL01_C
- PIXEL02_C
- PIXEL12_C
- } else {
- PIXEL01_3
- PIXEL02_2
- PIXEL12_3
- }
- PIXEL11
- PIXEL20_1M
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL21_C
- PIXEL22_C
- } else {
- PIXEL21_3
- PIXEL22_4
- }
- break;
- case 247:
- PIXEL00_1L
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_C
- } else {
- PIXEL02_2
- }
- PIXEL10_1
- PIXEL11
- PIXEL12_C
- PIXEL20_1L
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_C
- } else {
- PIXEL22_2
- }
- break;
- case 255:
- if (diffYUV(yuv[4], yuv[2])) {
- PIXEL00_C
- } else {
- PIXEL00_2
- }
- PIXEL01_C
- if (diffYUV(yuv[2], yuv[6])) {
- PIXEL02_C
- } else {
- PIXEL02_2
- }
- PIXEL10_C
- PIXEL11
- PIXEL12_C
- if (diffYUV(yuv[8], yuv[4])) {
- PIXEL20_C
- } else {
- PIXEL20_2
- }
- PIXEL21_C
- if (diffYUV(yuv[6], yuv[8])) {
- PIXEL22_C
- } else {
- PIXEL22_2
- }
- break;
- }
- q += 3;
- }
- p += nextlineSrc - width;
- q += (nextlineDst - width) * 3;
- }
-}
-
-void InitLUT(uint32 BitFormat) {
- int r, g, b;
- int Y, u, v;
- int gInc, gShift;
-
- if (BitFormat == 565) {
- gInc = 256 >> 6;
- gShift = 6 - 3;
- } else {
- gInc = 256 >> 5;
- gShift = 5 - 3;
- }
-
- for (r = 0; r < 256; r += 8) {
- for (g = 0; g < 256; g += gInc) {
- for (b = 0; b < 256; b += 8) {
- Y = (r + g + b) >> 2;
- u = 128 + ((r - b) >> 2);
- v = 128 + ((-r + 2 * g -b) >> 3);
- RGBtoYUV[ (r << (5+gShift)) + (g << gShift) + (b >> 3) ] = (Y << 16) + (u << 8) + v;
- }
- }
- }
-}
-
-
-#pragma mark -
-
-
-#define kVeryFastAndUglyAspectMode 0 // No interpolation at all, but super-fast
-#define kFastAndNiceAspectMode 1 // Quite good quality with good speed
-#define kSlowAndPerfectAspectMode 2 // Accurate but slow code
-
-#define ASPECT_MODE kFastAndNiceAspectMode
-
-
-#if ASPECT_MODE == kSlowAndPerfectAspectMode
-
-template<int scale>
-static inline uint16 interpolate5(uint16 A, uint16 B) {
- uint16 r = (uint16)(((A & redblueMask & 0xFF00) * scale + (B & redblueMask & 0xFF00) * (5 - scale)) / 5);
- uint16 g = (uint16)(((A & greenMask) * scale + (B & greenMask) * (5 - scale)) / 5);
- uint16 b = (uint16)(((A & redblueMask & 0x00FF) * scale + (B & redblueMask & 0x00FF) * (5 - scale)) / 5);
-
- return (uint16)((r & redblueMask & 0xFF00) | (g & greenMask) | (b & redblueMask & 0x00FF));
-}
-
-
-template<int scale>
-static inline void interpolate5Line(uint16 *dst, const uint16 *srcA, const uint16 *srcB, int width) {
- // Accurate but slightly slower code
- while (width--) {
- *dst++ = interpolate5<scale>(*srcA++, *srcB++);
- }
-}
-#endif
-
-#if ASPECT_MODE == kFastAndNiceAspectMode
-template<int scale>
-static inline void interpolate5Line(uint16 *dst, const uint16 *srcA, const uint16 *srcB, int width) {
- // For efficiency reasons we blit two pixels at a time, so it is important
- // that makeRectStretchable() guarantees that the width is even and that
- // the rect starts on a well-aligned address. (Even where unaligned memory
- // access is allowed there may be a speed penalty for it.)
-
- // These asserts are disabled for maximal speed; but I leave them in here
- // in case other people want to test if the memory alignment (to an
- // address divisible by 4) is really working properly.
- //assert(((int)dst & 3) == 0);
- //assert(((int)srcA & 3) == 0);
- //assert(((int)srcB & 3) == 0);
- //assert((width & 1) == 0);
-
- width /= 2;
- const uint32 *sA = (const uint32 *)srcA;
- const uint32 *sB = (const uint32 *)srcB;
- uint32 *d = (uint32 *)dst;
- if (scale == 1) {
- while (width--) {
- uint32 B = *sB++;
- *d++ = Q_INTERPOLATE(*sA++, B, B, B);
- }
- } else {
- while (width--) {
- *d++ = INTERPOLATE(*sA++, *sB++);
- }
- }
-}
-#endif
-
-void makeRectStretchable(int &x, int &y, int &w, int &h) {
-#if ASPECT_MODE != kVeryFastAndUglyAspectMode
- int m = real2Aspect(y) % 6;
-
- // Ensure that the rect will start on a line that won't have its
- // colours changed by the stretching function.
- if (m != 0 && m != 5) {
- y -= m;
- h += m;
- }
-
- #if ASPECT_MODE == kFastAndNiceAspectMode
- // Force x to be even, to ensure aligned memory access (this assumes
- // that each line starts at an even memory location, but that should
- // be the case on every target anyway).
- if (x & 1) {
- x--;
- w++;
- }
-
- // Finally force the width to be even, since we blit 2 pixels at a time.
- // While this means we may sometimes blit one column more than necessary,
- // this should actually be faster than having the check for the
- if (w & 1)
- w++;
- #endif
-#endif
-}
-
-/**
- * Stretch a 16bpp image vertically by factor 1.2. Used to correct the
- * aspect-ratio in games using 320x200 pixel graphics with non-qudratic
- * pixels. Applying this method effectively turns that into 320x240, which
- * provides the correct aspect-ratio on modern displays.
- *
- * The image would normally have occupied y coordinates origSrcY through
- * origSrcY + height - 1.
- *
- * However, we have already placed it at srcY - the aspect-corrected y
- * coordinate - to allow in-place stretching.
- *
- * Therefore, the source image now occupies Y coordinates srcY through
- * srcY + height - 1, and it should be stretched to Y coordinates srcY
- * through real2Aspect(srcY + height - 1).
- */
-int stretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY) {
- int maxDstY = real2Aspect(origSrcY + height - 1);
- int y;
- const uint8 *startSrcPtr = buf + srcX * 2 + (srcY - origSrcY) * pitch;
- uint8 *dstPtr = buf + srcX * 2 + maxDstY * pitch;
-
- for (y = maxDstY; y >= srcY; y--) {
- const uint8 *srcPtr = startSrcPtr + aspect2Real(y) * pitch;
-
-#if ASPECT_MODE == kVeryFastAndUglyAspectMode
- if (srcPtr == dstPtr)
- break;
- memcpy(dstPtr, srcPtr, width * 2);
-#else
- // Bilinear filter
- switch (y % 6) {
- case 0:
- case 5:
- if (srcPtr != dstPtr)
- memcpy(dstPtr, srcPtr, width * 2);
- break;
- case 1:
- interpolate5Line<1>((uint16 *)dstPtr, (const uint16 *)(srcPtr - pitch), (const uint16 *)srcPtr, width);
- break;
- case 2:
- interpolate5Line<2>((uint16 *)dstPtr, (const uint16 *)(srcPtr - pitch), (const uint16 *)srcPtr, width);
- break;
- case 3:
- interpolate5Line<2>((uint16 *)dstPtr, (const uint16 *)srcPtr, (const uint16 *)(srcPtr - pitch), width);
- break;
- case 4:
- interpolate5Line<1>((uint16 *)dstPtr, (const uint16 *)srcPtr, (const uint16 *)(srcPtr - pitch), width);
- break;
- }
-#endif
- dstPtr -= pitch;
- }
-
- return 1 + maxDstY - srcY;
-}