diff options
author | Max Horn | 2003-09-29 16:02:47 +0000 |
---|---|---|
committer | Max Horn | 2003-09-29 16:02:47 +0000 |
commit | 4a7385b4e742b283045021b1760a1fbf4d6979ac (patch) | |
tree | 94f5727c5e4870016ee11a2945ebffd59d5b60fc /common | |
parent | 7fff8b0134356b200a9e21982a0436b3e8068d6f (diff) | |
download | scummvm-rg350-4a7385b4e742b283045021b1760a1fbf4d6979ac.tar.gz scummvm-rg350-4a7385b4e742b283045021b1760a1fbf4d6979ac.tar.bz2 scummvm-rg350-4a7385b4e742b283045021b1760a1fbf4d6979ac.zip |
split out scalers into separate source files in common/scaler; some optimizations (in particular, the hq2x/hq3x scalers now are compiled into two versions, one for 555 and one for 565 mode)
svn-id: r10488
Diffstat (limited to 'common')
-rw-r--r-- | common/module.mk | 6 | ||||
-rw-r--r-- | common/scaler.cpp | 5542 | ||||
-rw-r--r-- | common/scaler/.cvsignore | 1 | ||||
-rw-r--r-- | common/scaler/2xsai.cpp | 401 | ||||
-rw-r--r-- | common/scaler/aspect.cpp | 183 | ||||
-rw-r--r-- | common/scaler/hq2x.cpp | 1937 | ||||
-rw-r--r-- | common/scaler/hq3x.cpp | 2935 | ||||
-rw-r--r-- | common/scaler/intern.h | 100 |
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 |