aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2003-09-29 16:02:47 +0000
committerMax Horn2003-09-29 16:02:47 +0000
commit4a7385b4e742b283045021b1760a1fbf4d6979ac (patch)
tree94f5727c5e4870016ee11a2945ebffd59d5b60fc
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
-rw-r--r--common/module.mk6
-rw-r--r--common/scaler.cpp5542
-rw-r--r--common/scaler/.cvsignore1
-rw-r--r--common/scaler/2xsai.cpp401
-rw-r--r--common/scaler/aspect.cpp183
-rw-r--r--common/scaler/hq2x.cpp1937
-rw-r--r--common/scaler/hq3x.cpp2935
-rw-r--r--common/scaler/intern.h100
8 files changed, 5658 insertions, 5447 deletions
diff --git a/common/module.mk b/common/module.mk
index 059abd5dbe..359c9cf4e5 100644
--- a/common/module.mk
+++ b/common/module.mk
@@ -7,7 +7,11 @@ MODULE_OBJS := \
common/str.o \
common/timer.o \
common/util.o \
- common/savefile.o
+ common/savefile.o \
+ common/scaler/2xsai.o \
+ common/scaler/aspect.o \
+ common/scaler/hq2x.o \
+ common/scaler/hq3x.o
MODULE_DIRS += \
common
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;
-}
diff --git a/common/scaler/.cvsignore b/common/scaler/.cvsignore
new file mode 100644
index 0000000000..39a06683b7
--- /dev/null
+++ b/common/scaler/.cvsignore
@@ -0,0 +1 @@
+.deps
diff --git a/common/scaler/2xsai.cpp b/common/scaler/2xsai.cpp
new file mode 100644
index 0000000000..c40c08ffcc
--- /dev/null
+++ b/common/scaler/2xsai.cpp
@@ -0,0 +1,401 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001 Ludvig Strigeus
+ * Copyright (C) 2001-2003 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+#include "common/scaler/intern.h"
+
+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) {
+ return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask));
+}
+
+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);
+
+ 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);
+ }
+
+ 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;
+ }
+
+ srcPtr += srcPitch;
+ dstPtr += dstPitch * 2;
+ }
+}
+
+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;
+
+ 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;
+
+ bP += 1;
+ dP += 2;
+ }
+
+ srcPtr += srcPitch;
+ dstPtr += dstPitch * 2;
+ }
+}
+
+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;
+
+ 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;
+
+ bP += 1;
+ dP += 2;
+ }
+
+ srcPtr += srcPitch;
+ dstPtr += dstPitch * 2;
+ }
+}
diff --git a/common/scaler/aspect.cpp b/common/scaler/aspect.cpp
new file mode 100644
index 0000000000..f337a7fb47
--- /dev/null
+++ b/common/scaler/aspect.cpp
@@ -0,0 +1,183 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001 Ludvig Strigeus
+ * Copyright (C) 2001-2003 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+#include "common/scaler/intern.h"
+
+
+#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
+
+static inline uint32 INTERPOLATE_1_1(uint32 A, uint32 B) {
+ return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask));
+}
+
+static inline uint32 INTERPOLATE_1_3(uint32 A, uint32 B) {
+ register uint32 x = ((A & qcolorMask) >> 2) + ((B & qcolorMask) >> 2) * 3;
+ register uint32 y = ((A & qlowpixelMask) + (B & qlowpixelMask) * 3) >> 2;
+
+ y &= qlowpixelMask;
+ return x + y;
+}
+
+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--) {
+ *d++ = INTERPOLATE_1_3(*sA++, *sB++);
+ }
+ } else {
+ while (width--) {
+ *d++ = INTERPOLATE_1_1(*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;
+}
diff --git a/common/scaler/hq2x.cpp b/common/scaler/hq2x.cpp
new file mode 100644
index 0000000000..2505914c26
--- /dev/null
+++ b/common/scaler/hq2x.cpp
@@ -0,0 +1,1937 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001 Ludvig Strigeus
+ * Copyright (C) 2001-2003 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+#include "common/scaler/intern.h"
+
+#define PIXEL00_0 *(q) = w[5];
+#define PIXEL00_10 *(q) = interpolate16_2<bitFormat,3,1>(w[5], w[1]);
+#define PIXEL00_11 *(q) = interpolate16_2<bitFormat,3,1>(w[5], w[4]);
+#define PIXEL00_12 *(q) = interpolate16_2<bitFormat,3,1>(w[5], w[2]);
+#define PIXEL00_20 *(q) = interpolate16_3<bitFormat,2,1,1>(w[5], w[4], w[2]);
+#define PIXEL00_30 *(q) = interpolate16_3<bitFormat,6,1,1>(w[5], w[4], w[2]);
+#define PIXEL00_40 *(q) = interpolate16_3<bitFormat,14,1,1>(w[5], w[4], w[2]);
+#define PIXEL00_50 *(q) = interpolate16_3<bitFormat,5,2,1>(w[5], w[2], w[4]);
+#define PIXEL00_51 *(q) = interpolate16_3<bitFormat,5,2,1>(w[5], w[4], w[2]);
+#define PIXEL00_60 *(q) = interpolate16_3<bitFormat,2,3,3>(w[5], w[4], w[2]);
+
+#define PIXEL01_0 *(q+1) = w[5];
+#define PIXEL01_10 *(q+1) = interpolate16_2<bitFormat,3,1>(w[5], w[3]);
+#define PIXEL01_11 *(q+1) = interpolate16_2<bitFormat,3,1>(w[5], w[2]);
+#define PIXEL01_12 *(q+1) = interpolate16_2<bitFormat,3,1>(w[5], w[6]);
+#define PIXEL01_20 *(q+1) = interpolate16_3<bitFormat,2,1,1>(w[5], w[2], w[6]);
+#define PIXEL01_30 *(q+1) = interpolate16_3<bitFormat,6,1,1>(w[5], w[2], w[6]);
+#define PIXEL01_40 *(q+1) = interpolate16_3<bitFormat,14,1,1>(w[5], w[2], w[6]);
+#define PIXEL01_50 *(q+1) = interpolate16_3<bitFormat,5,2,1>(w[5], w[6], w[2]);
+#define PIXEL01_51 *(q+1) = interpolate16_3<bitFormat,5,2,1>(w[5], w[2], w[6]);
+#define PIXEL01_60 *(q+1) = interpolate16_3<bitFormat,2,3,3>(w[5], w[2], w[6]);
+
+#define PIXEL10_0 *(q+nextlineDst) = w[5];
+#define PIXEL10_10 *(q+nextlineDst) = interpolate16_2<bitFormat,3,1>(w[5], w[7]);
+#define PIXEL10_11 *(q+nextlineDst) = interpolate16_2<bitFormat,3,1>(w[5], w[8]);
+#define PIXEL10_12 *(q+nextlineDst) = interpolate16_2<bitFormat,3,1>(w[5], w[4]);
+#define PIXEL10_20 *(q+nextlineDst) = interpolate16_3<bitFormat,2,1,1>(w[5], w[8], w[4]);
+#define PIXEL10_30 *(q+nextlineDst) = interpolate16_3<bitFormat,6,1,1>(w[5], w[8], w[4]);
+#define PIXEL10_40 *(q+nextlineDst) = interpolate16_3<bitFormat,14,1,1>(w[5], w[8], w[4]);
+#define PIXEL10_50 *(q+nextlineDst) = interpolate16_3<bitFormat,5,2,1>(w[5], w[4], w[8]);
+#define PIXEL10_51 *(q+nextlineDst) = interpolate16_3<bitFormat,5,2,1>(w[5], w[8], w[4]);
+#define PIXEL10_60 *(q+nextlineDst) = interpolate16_3<bitFormat,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<bitFormat,3,1>(w[5], w[9]);
+#define PIXEL11_11 *(q+1+nextlineDst) = interpolate16_2<bitFormat,3,1>(w[5], w[6]);
+#define PIXEL11_12 *(q+1+nextlineDst) = interpolate16_2<bitFormat,3,1>(w[5], w[8]);
+#define PIXEL11_20 *(q+1+nextlineDst) = interpolate16_3<bitFormat,2,1,1>(w[5], w[6], w[8]);
+#define PIXEL11_30 *(q+1+nextlineDst) = interpolate16_3<bitFormat,6,1,1>(w[5], w[6], w[8]);
+#define PIXEL11_40 *(q+1+nextlineDst) = interpolate16_3<bitFormat,14,1,1>(w[5], w[6], w[8]);
+#define PIXEL11_50 *(q+1+nextlineDst) = interpolate16_3<bitFormat,5,2,1>(w[5], w[8], w[6]);
+#define PIXEL11_51 *(q+1+nextlineDst) = interpolate16_3<bitFormat,5,2,1>(w[5], w[6], w[8]);
+#define PIXEL11_60 *(q+1+nextlineDst) = interpolate16_3<bitFormat,2,3,3>(w[5], w[6], w[8]);
+
+/**
+ * The HQ2x high quality 2x graphics filter.
+ * Original author Maxim Stepin (see http://www.hiend3d.com/hq2x.html).
+ * Adapted for ScummVM to 16 bit output and optimized by Max Horn.
+ */
+template<int bitFormat>
+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;
+ }
+}
+
+void HQ2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
+ if (gBitFormat == 565)
+ HQ2x<565>(srcPtr, srcPitch, dstPtr, dstPitch, width, height);
+ else // gBitFormat == 555
+ HQ2x<555>(srcPtr, srcPitch, dstPtr, dstPitch, width, height);
+}
diff --git a/common/scaler/hq3x.cpp b/common/scaler/hq3x.cpp
new file mode 100644
index 0000000000..f484e2eabb
--- /dev/null
+++ b/common/scaler/hq3x.cpp
@@ -0,0 +1,2935 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001 Ludvig Strigeus
+ * Copyright (C) 2001-2003 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+#include "common/scaler/intern.h"
+
+
+#define PIXEL00_1M *(q) = interpolate16_2<bitFormat,3,1>(w[5], w[1]);
+#define PIXEL00_1U *(q) = interpolate16_2<bitFormat,3,1>(w[5], w[2]);
+#define PIXEL00_1L *(q) = interpolate16_2<bitFormat,3,1>(w[5], w[4]);
+#define PIXEL00_2 *(q) = interpolate16_3<bitFormat,2,1,1>(w[5], w[4], w[2]);
+#define PIXEL00_4 *(q) = interpolate16_3<bitFormat,2,7,7>(w[5], w[4], w[2]);
+#define PIXEL00_5 *(q) = interpolate16_2<bitFormat,1,1>(w[4], w[2]);
+#define PIXEL00_C *(q) = w[5];
+
+#define PIXEL01_1 *(q+1) = interpolate16_2<bitFormat,3,1>(w[5], w[2]);
+#define PIXEL01_3 *(q+1) = interpolate16_2<bitFormat,7,1>(w[5], w[2]);
+#define PIXEL01_6 *(q+1) = interpolate16_2<bitFormat,3,1>(w[2], w[5]);
+#define PIXEL01_C *(q+1) = w[5];
+
+#define PIXEL02_1M *(q+2) = interpolate16_2<bitFormat,3,1>(w[5], w[3]);
+#define PIXEL02_1U *(q+2) = interpolate16_2<bitFormat,3,1>(w[5], w[2]);
+#define PIXEL02_1R *(q+2) = interpolate16_2<bitFormat,3,1>(w[5], w[6]);
+#define PIXEL02_2 *(q+2) = interpolate16_3<bitFormat,2,1,1>(w[5], w[2], w[6]);
+#define PIXEL02_4 *(q+2) = interpolate16_3<bitFormat,2,7,7>(w[5], w[2], w[6]);
+#define PIXEL02_5 *(q+2) = interpolate16_2<bitFormat,1,1>(w[2], w[6]);
+#define PIXEL02_C *(q+2) = w[5];
+
+#define PIXEL10_1 *(q+nextlineDst) = interpolate16_2<bitFormat,3,1>(w[5], w[4]);
+#define PIXEL10_3 *(q+nextlineDst) = interpolate16_2<bitFormat,7,1>(w[5], w[4]);
+#define PIXEL10_6 *(q+nextlineDst) = interpolate16_2<bitFormat,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<bitFormat,3,1>(w[5], w[6]);
+#define PIXEL12_3 *(q+2+nextlineDst) = interpolate16_2<bitFormat,7,1>(w[5], w[6]);
+#define PIXEL12_6 *(q+2+nextlineDst) = interpolate16_2<bitFormat,3,1>(w[6], w[5]);
+#define PIXEL12_C *(q+2+nextlineDst) = w[5];
+
+#define PIXEL20_1M *(q+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w[5], w[7]);
+#define PIXEL20_1D *(q+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w[5], w[8]);
+#define PIXEL20_1L *(q+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w[5], w[4]);
+#define PIXEL20_2 *(q+nextlineDst2) = interpolate16_3<bitFormat,2,1,1>(w[5], w[8], w[4]);
+#define PIXEL20_4 *(q+nextlineDst2) = interpolate16_3<bitFormat,2,7,7>(w[5], w[8], w[4]);
+#define PIXEL20_5 *(q+nextlineDst2) = interpolate16_2<bitFormat,1,1>(w[8], w[4]);
+#define PIXEL20_C *(q+nextlineDst2) = w[5];
+
+#define PIXEL21_1 *(q+1+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w[5], w[8]);
+#define PIXEL21_3 *(q+1+nextlineDst2) = interpolate16_2<bitFormat,7,1>(w[5], w[8]);
+#define PIXEL21_6 *(q+1+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w[8], w[5]);
+#define PIXEL21_C *(q+1+nextlineDst2) = w[5];
+
+#define PIXEL22_1M *(q+2+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w[5], w[9]);
+#define PIXEL22_1D *(q+2+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w[5], w[8]);
+#define PIXEL22_1R *(q+2+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w[5], w[6]);
+#define PIXEL22_2 *(q+2+nextlineDst2) = interpolate16_3<bitFormat,2,1,1>(w[5], w[6], w[8]);
+#define PIXEL22_4 *(q+2+nextlineDst2) = interpolate16_3<bitFormat,2,7,7>(w[5], w[6], w[8]);
+#define PIXEL22_5 *(q+2+nextlineDst2) = interpolate16_2<bitFormat,1,1>(w[6], w[8]);
+#define PIXEL22_C *(q+2+nextlineDst2) = w[5];
+
+/**
+ * The HQ3x high quality 3x graphics filter.
+ * Original author Maxim Stepin (see http://www.hiend3d.com/hq3x.html).
+ * Adapted for ScummVM to 16 bit output and optimized by Max Horn.
+ */
+template<int bitFormat>
+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 HQ3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
+ if (gBitFormat == 565)
+ HQ3x<565>(srcPtr, srcPitch, dstPtr, dstPitch, width, height);
+ else // gBitFormat == 555
+ HQ3x<555>(srcPtr, srcPitch, dstPtr, dstPitch, width, height);
+}
diff --git a/common/scaler/intern.h b/common/scaler/intern.h
new file mode 100644
index 0000000000..5c24a2ce53
--- /dev/null
+++ b/common/scaler/intern.h
@@ -0,0 +1,100 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001 Ludvig Strigeus
+ * Copyright (C) 2001-2003 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+
+#ifndef COMMON_SCALER_INTERN_H
+#define COMMON_SCALER_INTERN_H
+
+#include "stdafx.h"
+#include "common/scummsys.h"
+#include "common/scaler.h"
+#include "common/util.h"
+
+
+static const uint32 redblueMask_565 = 0xF81F;
+static const uint32 greenMask_565 = 0x07E0;
+static const uint32 redblueMask_555 = 0x7C1F;
+static const uint32 greenMask_555 = 0x03E0;
+
+
+extern uint32 colorMask;
+extern uint32 lowPixelMask;
+extern uint32 qcolorMask;
+extern uint32 qlowpixelMask;
+
+extern int gBitFormat;
+
+
+/**
+ * Interpolate two 16 bit pixels with the weights specified in the template
+ * parameters. Used by the hq scaler family.
+ */
+template<int bitFormat, int w1, int w2>
+static inline uint16 interpolate16_2(uint16 p1, uint16 p2) {
+ if (bitFormat == 565)
+ return ((((p1 & redblueMask_565) * w1 + (p2 & redblueMask_565) * w2) / (w1 + w2)) & redblueMask_565) |
+ ((((p1 & greenMask_565) * w1 + (p2 & greenMask_565) * w2) / (w1 + w2)) & greenMask_565);
+ else // bitFormat == 555
+ return ((((p1 & redblueMask_555) * w1 + (p2 & redblueMask_555) * w2) / (w1 + w2)) & redblueMask_555) |
+ ((((p1 & greenMask_555) * w1 + (p2 & greenMask_555) * w2) / (w1 + w2)) & greenMask_555);
+}
+
+/**
+ * Interpolate three 16 bit pixels with the weights specified in the template
+ * parameters. Used by the hq scaler family.
+ */
+template<int bitFormat, int w1, int w2, int w3>
+static inline uint16 interpolate16_3(uint16 p1, uint16 p2, uint16 p3) {
+ if (bitFormat == 565)
+ return ((((p1 & redblueMask_565) * w1 + (p2 & redblueMask_565) * w2 + (p3 & redblueMask_565) * w3) / (w1 + w2 + w3)) & redblueMask_565) |
+ ((((p1 & greenMask_565) * w1 + (p2 & greenMask_565) * w2 + (p3 & greenMask_565) * w3) / (w1 + w2 + w3)) & greenMask_565);
+ else // bitFormat == 555
+ return ((((p1 & redblueMask_555) * w1 + (p2 & redblueMask_555) * w2 + (p3 & redblueMask_555) * w3) / (w1 + w2 + w3)) & redblueMask_555) |
+ ((((p1 & greenMask_555) * w1 + (p2 & greenMask_555) * w2 + (p3 & greenMask_555) * w3) / (w1 + w2 + w3)) & greenMask_555);
+}
+
+
+/**
+ * Compare two YUV values (encoded 8-8-8) and check if they differ by more than
+ * a certain hard coded threshold. Used by the hq scaler family.
+ */
+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 ) );
+}
+
+/**
+ * 16bit RGB to YUV conversion table. This table is setup by InitLUT().
+ * Used by the hq scaler family.
+ */
+extern int RGBtoYUV[65536];
+
+#endif