diff --git a/src/dosbox.cpp b/src/dosbox.cpp index 47c746c6..2c8ae63b 100644 --- a/src/dosbox.cpp +++ b/src/dosbox.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dosbox.cpp,v 1.101 2006-06-29 09:10:10 c2woody Exp $ */ +/* $Id: dosbox.cpp,v 1.102 2006-08-05 09:06:44 qbix79 Exp $ */ #include #include @@ -271,7 +271,9 @@ void DOSBOX_Init(void) { "frameskip -- How many frames dosbox skips before drawing one.\n" "aspect -- Do aspect correction, if your output method doesn't support scaling this can slow things down!.\n" "scaler -- Scaler used to enlarge/enhance low resolution modes.\n" - " Supported are none,normal2x,normal3x,advmame2x,advmame3x,advinterp2x,advinterp3x,tv2x,tv3x,rgb2x,rgb3x,scan2x,scan3x.\n" + " Supported are none,normal2x,normal3x,advmame2x,advmame3x,hq2x,hq3x,\n" + " 2xsai,super2xsai,supereagle,advinterp2x,advinterp3x,\n" + " tv2x,tv3x,rgb2x,rgb3x,scan2x,scan3x.\n" ); secprop=control->AddSection_prop("cpu",&CPU_Init,true);//done diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am index 12695b17..17819379 100644 --- a/src/gui/Makefile.am +++ b/src/gui/Makefile.am @@ -4,5 +4,7 @@ noinst_LIBRARIES = libgui.a libgui_a_SOURCES = sdlmain.cpp sdl_mapper.cpp dosbox_logo.h \ render.cpp render_scalers.cpp render_scalers.h \ render_templates.h render_loops.h render_simple.h \ + render_templates_hq.h render_templates_hq.h \ + render_templates_hq2x.h render_templates_hq3x.h \ midi.cpp midi_win32.h midi_oss.h midi_coreaudio.h midi_alsa.h diff --git a/src/gui/render.cpp b/src/gui/render.cpp index 1800461c..180c0417 100644 --- a/src/gui/render.cpp +++ b/src/gui/render.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: render.cpp,v 1.46 2006-05-27 07:01:33 qbix79 Exp $ */ +/* $Id: render.cpp,v 1.47 2006-08-05 09:06:44 qbix79 Exp $ */ #include #include @@ -238,6 +238,24 @@ void RENDER_CallBack( GFX_CallBackFunctions_t function ) { else if (render.scale.size == 3) complexBlock = &ScaleAdvMame3x; break; + case scalerOpHQ: + if (render.scale.size == 2) + complexBlock = &ScaleHQ2x; + else if (render.scale.size == 3) + complexBlock = &ScaleHQ3x; + break; + case scalerOpSuperSaI: + if (render.scale.size == 2) + complexBlock = &ScaleSuper2xSaI; + break; + case scalerOpSuperEagle: + if (render.scale.size == 2) + complexBlock = &ScaleSuperEagle; + break; + case scalerOpSaI: + if (render.scale.size == 2) + complexBlock = &Scale2xSaI; + break; case scalerOpTV: if (render.scale.size == 2) simpleBlock = &ScaleTV2x; @@ -274,10 +292,12 @@ forcenormal: gfx_flags = complexBlock->gfxFlags; xscale = complexBlock->xscale; yscale = complexBlock->yscale; +// LOG_MSG("Scaler:%s",complexBlock->name); } else { gfx_flags = simpleBlock->gfxFlags; xscale = simpleBlock->xscale; yscale = simpleBlock->yscale; +// LOG_MSG("Scaler:%s",simpleBlock->name); } switch (render.src.bpp) { case 8: @@ -421,6 +441,18 @@ static void DecreaseFrameSkip(bool pressed) { LOG_MSG("Frame Skip at %d",render.frameskip.max); GFX_SetTitle(-1,render.frameskip.max,false); } +/* Disabled as I don't want to waste a keybind for that. Might be used in the future (Qbix) +static void ChangeScaler(bool pressed) { + if (!pressed) + return; + render.scale.op = (scalerOperation)((int)render.scale.op+1); + if((render.scale.op) >= scalerLast || render.scale.size == 1) { + render.scale.op = (scalerOperation)0; + if(++render.scale.size > 3) + render.scale.size = 1; + } + RENDER_CallBack( GFX_CallBackReset ); +} */ void RENDER_Init(Section * sec) { Section_prop * section=static_cast(sec); @@ -448,6 +480,11 @@ void RENDER_Init(Section * sec) { else if (!strcasecmp(scaler,"advmame3x")) { render.scale.op = scalerOpAdvMame;render.scale.size = 3; } else if (!strcasecmp(scaler,"advinterp2x")) { render.scale.op = scalerOpAdvInterp;render.scale.size = 2; } else if (!strcasecmp(scaler,"advinterp3x")) { render.scale.op = scalerOpAdvInterp;render.scale.size = 3; } + else if (!strcasecmp(scaler,"hq2x")) { render.scale.op = scalerOpHQ;render.scale.size = 2; } + else if (!strcasecmp(scaler,"hq3x")) { render.scale.op = scalerOpHQ;render.scale.size = 3; } + else if (!strcasecmp(scaler,"2xsai")) { render.scale.op = scalerOpSaI;render.scale.size = 2; } + else if (!strcasecmp(scaler,"super2xsai")) { render.scale.op = scalerOpSuperSaI;render.scale.size = 2; } + else if (!strcasecmp(scaler,"supereagle")) { render.scale.op = scalerOpSuperEagle;render.scale.size = 2; } else if (!strcasecmp(scaler,"tv2x")) { render.scale.op = scalerOpTV;render.scale.size = 2; } else if (!strcasecmp(scaler,"tv3x")) { render.scale.op = scalerOpTV;render.scale.size = 3; } else if (!strcasecmp(scaler,"rgb2x")){ render.scale.op = scalerOpRGB;render.scale.size = 2; } diff --git a/src/gui/render_scalers.cpp b/src/gui/render_scalers.cpp index dc7d084e..a4bc776c 100644 --- a/src/gui/render_scalers.cpp +++ b/src/gui/render_scalers.cpp @@ -158,6 +158,7 @@ ScalerLineBlock_t ScalerCache = { }; ScalerSimpleBlock_t ScaleNormal1x = { + "Normal", GFX_CAN_8|GFX_CAN_15|GFX_CAN_16|GFX_CAN_32, 1,1, Normal1x_8_8_L, Normal1x_8_15_L, Normal1x_8_16_L, Normal1x_8_32_L, @@ -173,6 +174,7 @@ ScalerSimpleBlock_t ScaleNormal1x = { }; ScalerSimpleBlock_t ScaleNormalDw = { + "Normal", GFX_CAN_8|GFX_CAN_15|GFX_CAN_16|GFX_CAN_32, 2,1, NormalDw_8_8_L, NormalDw_8_15_L, NormalDw_8_16_L, NormalDw_8_32_L, @@ -188,6 +190,7 @@ ScalerSimpleBlock_t ScaleNormalDw = { }; ScalerSimpleBlock_t ScaleNormalDh = { + "Normal", GFX_CAN_8|GFX_CAN_15|GFX_CAN_16|GFX_CAN_32, 1,2, NormalDh_8_8_L, NormalDh_8_15_L, NormalDh_8_16_L, NormalDh_8_32_L, @@ -203,6 +206,7 @@ ScalerSimpleBlock_t ScaleNormalDh = { }; ScalerSimpleBlock_t ScaleNormal2x = { + "Normal2x", GFX_CAN_8|GFX_CAN_15|GFX_CAN_16|GFX_CAN_32, 2,2, Normal2x_8_8_L, Normal2x_8_15_L, Normal2x_8_16_L, Normal2x_8_32_L, @@ -218,6 +222,7 @@ ScalerSimpleBlock_t ScaleNormal2x = { }; ScalerSimpleBlock_t ScaleNormal3x = { + "Normal3x", GFX_CAN_8|GFX_CAN_15|GFX_CAN_16|GFX_CAN_32, 3,3, Normal3x_8_8_L, Normal3x_8_15_L, Normal3x_8_16_L, Normal3x_8_32_L, @@ -233,6 +238,7 @@ ScalerSimpleBlock_t ScaleNormal3x = { }; ScalerSimpleBlock_t ScaleTV2x = { + "TV2x", GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, 2,2, 0, TV2x_8_15_L, TV2x_8_16_L, TV2x_8_32_L, @@ -248,6 +254,7 @@ ScalerSimpleBlock_t ScaleTV2x = { }; ScalerSimpleBlock_t ScaleTV3x = { + "TV3x", GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, 3,3, 0, TV3x_8_15_L, TV3x_8_16_L, TV3x_8_32_L, @@ -263,6 +270,7 @@ ScalerSimpleBlock_t ScaleTV3x = { }; ScalerSimpleBlock_t ScaleScan2x = { + "Scan2x", GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, 2,2, 0, Scan2x_8_15_L, Scan2x_8_16_L, Scan2x_8_32_L, @@ -278,6 +286,7 @@ ScalerSimpleBlock_t ScaleScan2x = { }; ScalerSimpleBlock_t ScaleScan3x = { + "Scan3x", GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, 3,3, 0, Scan3x_8_15_L, Scan3x_8_16_L, Scan3x_8_32_L, @@ -293,6 +302,7 @@ ScalerSimpleBlock_t ScaleScan3x = { }; ScalerSimpleBlock_t ScaleRGB2x = { + "RGB2x", GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, 2,2, 0, RGB2x_8_15_L, RGB2x_8_16_L, RGB2x_8_32_L, @@ -308,6 +318,7 @@ ScalerSimpleBlock_t ScaleRGB2x = { }; ScalerSimpleBlock_t ScaleRGB3x = { + "RGB3x", GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, 3,3, 0, RGB3x_8_15_L, RGB3x_8_16_L, RGB3x_8_32_L, @@ -326,6 +337,7 @@ ScalerSimpleBlock_t ScaleRGB3x = { /* Complex scalers */ ScalerComplexBlock_t ScaleAdvMame2x ={ + "AdvMame2x", GFX_CAN_8|GFX_CAN_15|GFX_CAN_16|GFX_CAN_32, 2,2, AdvMame2x_8_L,AdvMame2x_16_L,AdvMame2x_16_L,AdvMame2x_32_L, @@ -333,6 +345,7 @@ ScalerComplexBlock_t ScaleAdvMame2x ={ }; ScalerComplexBlock_t ScaleAdvMame3x = { + "AdvMame3x", GFX_CAN_8|GFX_CAN_15|GFX_CAN_16|GFX_CAN_32, 3,3, AdvMame3x_8_L,AdvMame3x_16_L,AdvMame3x_16_L,AdvMame3x_32_L, @@ -340,7 +353,48 @@ ScalerComplexBlock_t ScaleAdvMame3x = { }; /* These need specific 15bpp versions */ +ScalerComplexBlock_t ScaleHQ2x ={ + "HQ2x", + GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, + 2,2, + 0,HQ2x_16_L,HQ2x_16_L,HQ2x_32_L, + 0,HQ2x_16_R,HQ2x_16_R,HQ2x_32_R +}; + +ScalerComplexBlock_t ScaleHQ3x ={ + "HQ3x", + GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, + 3,3, + 0,HQ3x_16_L,HQ3x_16_L,HQ3x_32_L, + 0,HQ3x_16_R,HQ3x_16_R,HQ3x_32_R +}; + +ScalerComplexBlock_t ScaleSuper2xSaI ={ + "Super2xSaI", + GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, + 2,2, + 0,Super2xSaI_16_L,Super2xSaI_16_L,Super2xSaI_32_L, + 0,Super2xSaI_16_R,Super2xSaI_16_R,Super2xSaI_32_R +}; + +ScalerComplexBlock_t Scale2xSaI ={ + "2xSaI", + GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, + 2,2, + 0,_2xSaI_16_L,_2xSaI_16_L,_2xSaI_32_L, + 0,_2xSaI_16_R,_2xSaI_16_R,_2xSaI_32_R +}; + +ScalerComplexBlock_t ScaleSuperEagle ={ + "SuperEagle", + GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, + 2,2, + 0,SuperEagle_16_L,SuperEagle_16_L,SuperEagle_32_L, + 0,SuperEagle_16_R,SuperEagle_16_R,SuperEagle_32_R +}; + ScalerComplexBlock_t ScaleAdvInterp2x = { + "AdvInterp2x", GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, 2,2, 0,AdvInterp2x_15_L,AdvInterp2x_16_L,AdvInterp2x_32_L, @@ -348,6 +402,7 @@ ScalerComplexBlock_t ScaleAdvInterp2x = { }; ScalerComplexBlock_t ScaleAdvInterp3x = { + "AdvInterp3x", GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, 3,3, 0,AdvInterp3x_15_L,AdvInterp3x_16_L,AdvInterp3x_32_L, diff --git a/src/gui/render_scalers.h b/src/gui/render_scalers.h index 7cc419b2..81fc0ddc 100644 --- a/src/gui/render_scalers.h +++ b/src/gui/render_scalers.h @@ -33,13 +33,18 @@ typedef enum { scalerMode8, scalerMode15, scalerMode16, scalerMode32 } scalerMode_t; -typedef enum { +typedef enum scalerOperation { scalerOpNormal, scalerOpAdvMame, scalerOpAdvInterp, + scalerOpHQ, + scalerOpSaI, + scalerOpSuperSaI, + scalerOpSuperEagle, scalerOpTV, scalerOpRGB, scalerOpScan, + scalerLast, } scalerOperation_t; typedef void (*ScalerLineHandler_t)(const void *src); @@ -66,6 +71,7 @@ extern scalerChangeCache_t scalerChangeCache; typedef ScalerLineHandler_t ScalerLineBlock_t[5][4]; typedef struct { + char *name; Bitu gfxFlags; Bitu xscale,yscale; ScalerComplexHandler_t Linear[4]; @@ -73,6 +79,7 @@ typedef struct { } ScalerComplexBlock_t; typedef struct { + char *name; Bitu gfxFlags; Bitu xscale,yscale; ScalerLineBlock_t Linear; @@ -97,6 +104,11 @@ extern ScalerSimpleBlock_t ScaleRGB3x; extern ScalerSimpleBlock_t ScaleScan2x; extern ScalerSimpleBlock_t ScaleScan3x; /* Complex scalers */ +extern ScalerComplexBlock_t ScaleHQ2x; +extern ScalerComplexBlock_t ScaleHQ3x; +extern ScalerComplexBlock_t Scale2xSaI; +extern ScalerComplexBlock_t ScaleSuper2xSaI; +extern ScalerComplexBlock_t ScaleSuperEagle; extern ScalerComplexBlock_t ScaleAdvMame2x; extern ScalerComplexBlock_t ScaleAdvMame3x; extern ScalerComplexBlock_t ScaleAdvInterp2x; diff --git a/src/gui/render_templates.h b/src/gui/render_templates.h index ea234529..a5ef8abe 100644 --- a/src/gui/render_templates.h +++ b/src/gui/render_templates.h @@ -25,6 +25,12 @@ #define redMask 0 #define greenMask 0 #define blueMask 0 +#define redBits 0 +#define greenBits 0 +#define blueBits 0 +#define redShift 0 +#define greenShift 0 +#define blueShift 0 #elif DBPP == 15 || DBPP == 16 #define PSIZE 2 #define PTYPE Bit16u @@ -35,10 +41,22 @@ #define redMask 0x7C00 #define greenMask 0x03E0 #define blueMask 0x001F +#define redBits 5 +#define greenBits 5 +#define blueBits 5 +#define redShift 10 +#define greenShift 5 +#define blueShift 0 #elif DBPP == 16 #define redMask 0xF800 #define greenMask 0x07E0 #define blueMask 0x001F +#define redBits 5 +#define greenBits 6 +#define blueBits 5 +#define redShift 11 +#define greenShift 5 +#define blueShift 0 #endif #elif DBPP == 32 #define PSIZE 4 @@ -49,6 +67,12 @@ #define redMask 0xff0000 #define greenMask 0x00ff00 #define blueMask 0x0000ff +#define redBits 8 +#define greenBits 8 +#define blueBits 8 +#define redShift 16 +#define greenShift 8 +#define blueShift 0 #endif #define redblueMask (redMask | blueMask) @@ -104,6 +128,11 @@ #define SRCTYPE Bit32u #endif +// C0 C1 C2 D3 +// C3 C4 C5 D4 +// C6 C7 C8 D5 +// D0 D1 D2 D6 + #define C0 fc[-1 - SCALER_COMPLEXWIDTH] #define C1 fc[+0 - SCALER_COMPLEXWIDTH] #define C2 fc[+1 - SCALER_COMPLEXWIDTH] @@ -114,6 +143,15 @@ #define C7 fc[+0 + SCALER_COMPLEXWIDTH] #define C8 fc[+1 + SCALER_COMPLEXWIDTH] +#define D0 fc[-1 + 2*SCALER_COMPLEXWIDTH] +#define D1 fc[+0 + 2*SCALER_COMPLEXWIDTH] +#define D2 fc[+1 + 2*SCALER_COMPLEXWIDTH] +#define D3 fc[+2 - SCALER_COMPLEXWIDTH] +#define D4 fc[+2] +#define D5 fc[+2 + SCALER_COMPLEXWIDTH] +#define D6 fc[+2 + 2*SCALER_COMPLEXWIDTH] + + static void conc3d(Cache,SBPP,DBPP) (const void * s) { const SRCTYPE * src = (SRCTYPE*)s; PTYPE *fc= &FC[render.scale.inLine+1][1]; @@ -352,6 +390,62 @@ static void conc3d(Cache,SBPP,DBPP) (const void * s) { #if (DBPP > 8) +#include "render_templates_hq.h" + +#define SCALERNAME HQ2x +#define SCALERWIDTH 2 +#define SCALERHEIGHT 2 +#include "render_templates_hq2x.h" +#define SCALERFUNC conc2d(Hq2x,SBPP)(line0, line1, fc) +#include "render_loops.h" +#undef SCALERNAME +#undef SCALERWIDTH +#undef SCALERHEIGHT +#undef SCALERFUNC + +#define SCALERNAME HQ3x +#define SCALERWIDTH 3 +#define SCALERHEIGHT 3 +#include "render_templates_hq3x.h" +#define SCALERFUNC conc2d(Hq3x,SBPP)(line0, line1, line2, fc) +#include "render_loops.h" +#undef SCALERNAME +#undef SCALERWIDTH +#undef SCALERHEIGHT +#undef SCALERFUNC + +#include "render_templates_sai.h" + +#define SCALERNAME Super2xSaI +#define SCALERWIDTH 2 +#define SCALERHEIGHT 2 +#define SCALERFUNC conc2d(Super2xSaI,SBPP)(line0, line1, fc) +#include "render_loops.h" +#undef SCALERNAME +#undef SCALERWIDTH +#undef SCALERHEIGHT +#undef SCALERFUNC + +#define SCALERNAME SuperEagle +#define SCALERWIDTH 2 +#define SCALERHEIGHT 2 +#define SCALERFUNC conc2d(SuperEagle,SBPP)(line0, line1, fc) +#include "render_loops.h" +#undef SCALERNAME +#undef SCALERWIDTH +#undef SCALERHEIGHT +#undef SCALERFUNC + +#define SCALERNAME _2xSaI +#define SCALERWIDTH 2 +#define SCALERHEIGHT 2 +#define SCALERFUNC conc2d(_2xSaI,SBPP)(line0, line1, fc) +#include "render_loops.h" +#undef SCALERNAME +#undef SCALERWIDTH +#undef SCALERHEIGHT +#undef SCALERFUNC + #define SCALERNAME AdvInterp2x #define SCALERWIDTH 2 #define SCALERHEIGHT 2 @@ -458,5 +552,10 @@ static void conc3d(Cache,SBPP,DBPP) (const void * s) { #undef greenMask #undef blueMask #undef redblueMask +#undef redBits +#undef greenBits +#undef blueBits +#undef redShift +#undef greenShift +#undef blueShift #undef SRCTYPE - diff --git a/src/gui/render_templates_hq.h b/src/gui/render_templates_hq.h new file mode 100644 index 00000000..9d884030 --- /dev/null +++ b/src/gui/render_templates_hq.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2002-2006 The DOSBox Team + * + * 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. + */ + +/* + * The HQ3x high quality 3x graphics filter. + * Original author Maxim Stepin (see http://www.hiend3d.com/hq3x.html). + * Adapted for DOSBox from ScummVM and HiEnd3D code by Kronuz. + */ + +#include + +#ifndef RENDER_TEMPLATES_HQNX_TABLE_H +#define RENDER_TEMPLATES_HQNX_TABLE_H + +static Bit32u *_RGBtoYUV = 0; +static inline bool diffYUV(Bit32u yuv1, Bit32u yuv2) +{ + static const Bit32u Ymask = 0x00FF0000; + static const Bit32u Umask = 0x0000FF00; + static const Bit32u Vmask = 0x000000FF; + static const Bit32u trY = 0x00300000; + static const Bit32u trU = 0x00000700; + static const Bit32u trV = 0x00000006; + + Bit32u diff; + Bit32u mask; + + diff = ((yuv1 & Ymask) - (yuv2 & Ymask)); + mask = diff >> 31; // -1 if value < 0, 0 otherwise + diff = (diff ^ mask) - mask; //-1: ~value + 1; 0: value + if (diff > trY) return true; + + diff = ((yuv1 & Umask) - (yuv2 & Umask)); + mask = diff >> 31; // -1 if value < 0, 0 otherwise + diff = (diff ^ mask) - mask; //-1: ~value + 1; 0: value + if (diff > trU) return true; + + diff = ((yuv1 & Vmask) - (yuv2 & Vmask)); + mask = diff >> 31; // -1 if value < 0, 0 otherwise + diff = (diff ^ mask) - mask; //-1: ~value + 1; 0: value + if (diff > trV) return true; + + return false; +} + +#endif + +static inline void conc2d(InitLUTs,SBPP)(void) +{ + int r, g, b; + int Y, u, v; + + _RGBtoYUV = (Bit32u *)malloc(65536 * sizeof(Bit32u)); + + for (int color = 0; color < 65536; ++color) { +#if SBPP == 32 + r = ((color & 0xF800) >> 11) << (8 - 5); + g = ((color & 0x07E0) >> 5) << (8 - 6); + b = ((color & 0x001F) >> 0) << (8 - 5); +#else + r = ((color & redMask) >> redShift) << (8 - redBits); + g = ((color & greenMask) >> greenShift) << (8 - greenBits); + b = ((color & blueMask) >> blueShift) << (8 - blueBits); +#endif + Y = (r + g + b) >> 2; + u = 128 + ((r - b) >> 2); + v = 128 + ((-r + 2 * g - b) >> 3); + _RGBtoYUV[color] = (Y << 16) | (u << 8) | v; + } +} diff --git a/src/gui/render_templates_hq2x.h b/src/gui/render_templates_hq2x.h new file mode 100644 index 00000000..d4deb6fe --- /dev/null +++ b/src/gui/render_templates_hq2x.h @@ -0,0 +1,1896 @@ +/* + * Copyright (C) 2002-2006 The DOSBox Team + * + * 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. + */ + +/* + * The HQ2x high quality 2x graphics filter. + * Original author Maxim Stepin (see http://www.hiend3d.com/hq2x.html). + * Adapted for DOSBox from ScummVM and HiEnd3D code by Kronuz. + */ + +#ifndef RENDER_TEMPLATES_HQ2X_TABLE_H +#define RENDER_TEMPLATES_HQ2X_TABLE_H + +#define PIXEL00_0 line0[0] = C4; +#define PIXEL00_10 line0[0] = interp_w2(C4,C0,3U,1U); +#define PIXEL00_11 line0[0] = interp_w2(C4,C3,3U,1U); +#define PIXEL00_12 line0[0] = interp_w2(C4,C1,3U,1U); +#define PIXEL00_20 line0[0] = interp_w3(C4,C3,C1,2U,1U,1U); +#define PIXEL00_21 line0[0] = interp_w3(C4,C0,C1,2U,1U,1U); +#define PIXEL00_22 line0[0] = interp_w3(C4,C0,C3,2U,1U,1U); +#define PIXEL00_60 line0[0] = interp_w3(C4,C1,C3,5U,2U,1U); +#define PIXEL00_61 line0[0] = interp_w3(C4,C3,C1,5U,2U,1U); +#define PIXEL00_70 line0[0] = interp_w3(C4,C3,C1,6U,1U,1U); +#define PIXEL00_90 line0[0] = interp_w3(C4,C3,C1,2U,3U,3U); +#define PIXEL00_100 line0[0] = interp_w3(C4,C3,C1,14U,1U,1U); + +#define PIXEL01_0 line0[1] = C4; +#define PIXEL01_10 line0[1] = interp_w2(C4,C2,3U,1U); +#define PIXEL01_11 line0[1] = interp_w2(C4,C1,3U,1U); +#define PIXEL01_12 line0[1] = interp_w2(C4,C5,3U,1U); +#define PIXEL01_20 line0[1] = interp_w3(C4,C1,C5,2U,1U,1U); +#define PIXEL01_21 line0[1] = interp_w3(C4,C2,C5,2U,1U,1U); +#define PIXEL01_22 line0[1] = interp_w3(C4,C2,C1,2U,1U,1U); +#define PIXEL01_60 line0[1] = interp_w3(C4,C5,C1,5U,2U,1U); +#define PIXEL01_61 line0[1] = interp_w3(C4,C1,C5,5U,2U,1U); +#define PIXEL01_70 line0[1] = interp_w3(C4,C1,C5,6U,1U,1U); +#define PIXEL01_90 line0[1] = interp_w3(C4,C1,C5,2U,3U,3U); +#define PIXEL01_100 line0[1] = interp_w3(C4,C1,C5,14U,1U,1U); + +#define PIXEL10_0 line1[0] = C4; +#define PIXEL10_10 line1[0] = interp_w2(C4,C6,3U,1U); +#define PIXEL10_11 line1[0] = interp_w2(C4,C7,3U,1U); +#define PIXEL10_12 line1[0] = interp_w2(C4,C3,3U,1U); +#define PIXEL10_20 line1[0] = interp_w3(C4,C7,C3,2U,1U,1U); +#define PIXEL10_21 line1[0] = interp_w3(C4,C6,C3,2U,1U,1U); +#define PIXEL10_22 line1[0] = interp_w3(C4,C6,C7,2U,1U,1U); +#define PIXEL10_60 line1[0] = interp_w3(C4,C3,C7,5U,2U,1U); +#define PIXEL10_61 line1[0] = interp_w3(C4,C7,C3,5U,2U,1U); +#define PIXEL10_70 line1[0] = interp_w3(C4,C7,C3,6U,1U,1U); +#define PIXEL10_90 line1[0] = interp_w3(C4,C7,C3,2U,3U,3U); +#define PIXEL10_100 line1[0] = interp_w3(C4,C7,C3,14U,1U,1U); + +#define PIXEL11_0 line1[1] = C4; +#define PIXEL11_10 line1[1] = interp_w2(C4,C8,3U,1U); +#define PIXEL11_11 line1[1] = interp_w2(C4,C5,3U,1U); +#define PIXEL11_12 line1[1] = interp_w2(C4,C7,3U,1U); +#define PIXEL11_20 line1[1] = interp_w3(C4,C5,C7,2U,1U,1U); +#define PIXEL11_21 line1[1] = interp_w3(C4,C8,C7,2U,1U,1U); +#define PIXEL11_22 line1[1] = interp_w3(C4,C8,C5,2U,1U,1U); +#define PIXEL11_60 line1[1] = interp_w3(C4,C7,C5,5U,2U,1U); +#define PIXEL11_61 line1[1] = interp_w3(C4,C5,C7,5U,2U,1U); +#define PIXEL11_70 line1[1] = interp_w3(C4,C5,C7,6U,1U,1U); +#define PIXEL11_90 line1[1] = interp_w3(C4,C5,C7,2U,3U,3U); +#define PIXEL11_100 line1[1] = interp_w3(C4,C5,C7,14U,1U,1U); + +#endif + +#if SBPP == 32 +#define RGBtoYUV(c) _RGBtoYUV[((c & 0xf80000) >> 8) | ((c & 0x00fc00) >> 12) | ((c & 0x0000f8) >> 3)] +#else +#define RGBtoYUV(c) _RGBtoYUV[c] +#endif + +inline void conc2d(Hq2x,SBPP)(PTYPE * line0, PTYPE * line1, const PTYPE * fc) +{ + if (_RGBtoYUV == 0) conc2d(InitLUTs,SBPP)(); + + Bit32u pattern = 0; + const Bit32u YUV4 = RGBtoYUV(C4); + if (C4 != C0 && diffYUV(YUV4, RGBtoYUV(C0))) pattern |= 0x0001; + if (C4 != C1 && diffYUV(YUV4, RGBtoYUV(C1))) pattern |= 0x0002; + if (C4 != C2 && diffYUV(YUV4, RGBtoYUV(C2))) pattern |= 0x0004; + if (C4 != C3 && diffYUV(YUV4, RGBtoYUV(C3))) pattern |= 0x0008; + if (C4 != C5 && diffYUV(YUV4, RGBtoYUV(C5))) pattern |= 0x0010; + if (C4 != C6 && diffYUV(YUV4, RGBtoYUV(C6))) pattern |= 0x0020; + if (C4 != C7 && diffYUV(YUV4, RGBtoYUV(C7))) pattern |= 0x0040; + if (C4 != C8 && diffYUV(YUV4, RGBtoYUV(C8))) pattern |= 0x0080; + + 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_22 + PIXEL01_21 + PIXEL10_20 + PIXEL11_20 + break; + case 16: + case 17: + case 48: + case 49: + PIXEL00_20 + PIXEL01_22 + PIXEL10_20 + PIXEL11_21 + break; + case 64: + case 65: + case 68: + case 69: + PIXEL00_20 + PIXEL01_20 + PIXEL10_21 + PIXEL11_22 + break; + case 8: + case 12: + case 136: + case 140: + PIXEL00_21 + PIXEL01_20 + PIXEL10_22 + PIXEL11_20 + break; + case 3: + case 35: + case 131: + case 163: + PIXEL00_11 + PIXEL01_21 + PIXEL10_20 + PIXEL11_20 + break; + case 6: + case 38: + case 134: + case 166: + PIXEL00_22 + PIXEL01_12 + PIXEL10_20 + PIXEL11_20 + break; + case 20: + case 21: + case 52: + case 53: + PIXEL00_20 + PIXEL01_11 + PIXEL10_20 + PIXEL11_21 + break; + case 144: + case 145: + case 176: + case 177: + PIXEL00_20 + PIXEL01_22 + PIXEL10_20 + PIXEL11_12 + break; + case 192: + case 193: + case 196: + case 197: + PIXEL00_20 + PIXEL01_20 + PIXEL10_21 + PIXEL11_11 + break; + case 96: + case 97: + case 100: + case 101: + PIXEL00_20 + PIXEL01_20 + PIXEL10_12 + PIXEL11_22 + break; + case 40: + case 44: + case 168: + case 172: + PIXEL00_21 + PIXEL01_20 + PIXEL10_11 + PIXEL11_20 + break; + case 9: + case 13: + case 137: + case 141: + PIXEL00_12 + PIXEL01_20 + PIXEL10_22 + PIXEL11_20 + break; + case 18: + case 50: + PIXEL00_22 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_20 + } + PIXEL10_20 + PIXEL11_21 + break; + case 80: + case 81: + PIXEL00_20 + PIXEL01_22 + PIXEL10_21 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_20 + } + break; + case 72: + case 76: + PIXEL00_21 + PIXEL01_20 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_20 + } + PIXEL11_22 + break; + case 10: + case 138: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_22 + PIXEL11_20 + break; + case 66: + PIXEL00_22 + PIXEL01_21 + PIXEL10_21 + PIXEL11_22 + break; + case 24: + PIXEL00_21 + PIXEL01_22 + PIXEL10_22 + PIXEL11_21 + 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_22 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_20 + PIXEL11_21 + break; + case 208: + case 209: + PIXEL00_20 + PIXEL01_22 + PIXEL10_21 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 104: + case 108: + PIXEL00_21 + PIXEL01_20 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + PIXEL11_22 + break; + case 11: + case 139: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_22 + PIXEL11_20 + break; + case 19: + case 51: + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL00_11 + PIXEL01_10 + } else { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_20 + PIXEL11_21 + break; + case 146: + case 178: + PIXEL00_22 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + PIXEL11_12 + } else { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_20 + break; + case 84: + case 85: + PIXEL00_20 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL01_11 + PIXEL11_10 + } else { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_21 + break; + case 112: + case 113: + PIXEL00_20 + PIXEL01_22 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL10_12 + PIXEL11_10 + } else { + PIXEL10_61 + PIXEL11_90 + } + break; + case 200: + case 204: + PIXEL00_21 + PIXEL01_20 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + PIXEL11_11 + } else { + PIXEL10_90 + PIXEL11_60 + } + break; + case 73: + case 77: + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL00_12 + PIXEL10_10 + } else { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_20 + PIXEL11_22 + break; + case 42: + case 170: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + PIXEL10_11 + } else { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_21 + PIXEL11_20 + break; + case 14: + case 142: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + PIXEL01_12 + } else { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_22 + PIXEL11_20 + break; + case 67: + PIXEL00_11 + PIXEL01_21 + PIXEL10_21 + PIXEL11_22 + break; + case 70: + PIXEL00_22 + PIXEL01_12 + PIXEL10_21 + PIXEL11_22 + break; + case 28: + PIXEL00_21 + PIXEL01_11 + PIXEL10_22 + PIXEL11_21 + break; + case 152: + PIXEL00_21 + PIXEL01_22 + PIXEL10_22 + PIXEL11_12 + break; + case 194: + PIXEL00_22 + PIXEL01_21 + PIXEL10_21 + PIXEL11_11 + break; + case 98: + PIXEL00_22 + PIXEL01_21 + PIXEL10_12 + PIXEL11_22 + break; + case 56: + PIXEL00_21 + PIXEL01_22 + PIXEL10_11 + PIXEL11_21 + break; + case 25: + PIXEL00_12 + PIXEL01_22 + PIXEL10_22 + PIXEL11_21 + break; + case 26: + case 31: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_21 + break; + case 82: + case 214: + PIXEL00_22 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_21 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 88: + case 248: + PIXEL00_21 + PIXEL01_22 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 74: + case 107: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + PIXEL01_21 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + PIXEL11_22 + break; + case 27: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_22 + PIXEL11_21 + break; + case 86: + PIXEL00_22 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_21 + PIXEL11_10 + break; + case 216: + PIXEL00_21 + PIXEL01_22 + PIXEL10_10 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 106: + PIXEL00_10 + PIXEL01_21 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + PIXEL11_22 + break; + case 30: + PIXEL00_10 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_21 + break; + case 210: + PIXEL00_22 + PIXEL01_10 + PIXEL10_21 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 120: + PIXEL00_21 + PIXEL01_22 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + PIXEL11_10 + break; + case 75: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_10 + PIXEL11_22 + break; + case 29: + PIXEL00_12 + PIXEL01_11 + PIXEL10_22 + PIXEL11_21 + break; + case 198: + PIXEL00_22 + PIXEL01_12 + PIXEL10_21 + PIXEL11_11 + break; + case 184: + PIXEL00_21 + PIXEL01_22 + PIXEL10_11 + PIXEL11_12 + break; + case 99: + PIXEL00_11 + PIXEL01_21 + PIXEL10_12 + PIXEL11_22 + break; + case 57: + PIXEL00_12 + PIXEL01_22 + PIXEL10_11 + PIXEL11_21 + break; + case 71: + PIXEL00_11 + PIXEL01_12 + PIXEL10_21 + PIXEL11_22 + break; + case 156: + PIXEL00_21 + PIXEL01_11 + PIXEL10_22 + PIXEL11_12 + break; + case 226: + PIXEL00_22 + PIXEL01_21 + PIXEL10_12 + PIXEL11_11 + break; + case 60: + PIXEL00_21 + PIXEL01_11 + PIXEL10_11 + PIXEL11_21 + break; + case 195: + PIXEL00_11 + PIXEL01_21 + PIXEL10_21 + PIXEL11_11 + break; + case 102: + PIXEL00_22 + PIXEL01_12 + PIXEL10_12 + PIXEL11_22 + break; + case 153: + PIXEL00_12 + PIXEL01_22 + PIXEL10_22 + PIXEL11_12 + break; + case 58: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_21 + break; + case 83: + PIXEL00_11 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + PIXEL10_21 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + break; + case 92: + PIXEL00_21 + PIXEL01_11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + break; + case 202: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + PIXEL01_21 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + PIXEL11_11 + break; + case 78: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + PIXEL01_12 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + PIXEL11_22 + break; + case 154: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + PIXEL10_22 + PIXEL11_12 + break; + case 114: + PIXEL00_22 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + PIXEL10_12 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + break; + case 89: + PIXEL00_12 + PIXEL01_22 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + break; + case 90: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + break; + case 55: + case 23: + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL00_11 + PIXEL01_0 + } else { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_20 + PIXEL11_21 + break; + case 182: + case 150: + PIXEL00_22 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + PIXEL11_12 + } else { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_20 + break; + case 213: + case 212: + PIXEL00_20 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL01_11 + PIXEL11_0 + } else { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_21 + break; + case 241: + case 240: + PIXEL00_20 + PIXEL01_22 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL10_12 + PIXEL11_0 + } else { + PIXEL10_61 + PIXEL11_90 + } + break; + case 236: + case 232: + PIXEL00_21 + PIXEL01_20 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + PIXEL11_11 + } else { + PIXEL10_90 + PIXEL11_60 + } + break; + case 109: + case 105: + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL00_12 + PIXEL10_0 + } else { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_20 + PIXEL11_22 + break; + case 171: + case 43: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + PIXEL10_11 + } else { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_21 + PIXEL11_20 + break; + case 143: + case 15: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + PIXEL01_12 + } else { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_22 + PIXEL11_20 + break; + case 124: + PIXEL00_21 + PIXEL01_11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + PIXEL11_10 + break; + case 203: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_10 + PIXEL11_11 + break; + case 62: + PIXEL00_10 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_11 + PIXEL11_21 + break; + case 211: + PIXEL00_11 + PIXEL01_10 + PIXEL10_21 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 118: + PIXEL00_22 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_12 + PIXEL11_10 + break; + case 217: + PIXEL00_12 + PIXEL01_22 + PIXEL10_10 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 110: + PIXEL00_10 + PIXEL01_12 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + PIXEL11_22 + break; + case 155: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_22 + PIXEL11_12 + break; + case 188: + PIXEL00_21 + PIXEL01_11 + PIXEL10_11 + PIXEL11_12 + break; + case 185: + PIXEL00_12 + PIXEL01_22 + PIXEL10_11 + PIXEL11_12 + break; + case 61: + PIXEL00_12 + PIXEL01_11 + PIXEL10_11 + PIXEL11_21 + break; + case 157: + PIXEL00_12 + PIXEL01_11 + PIXEL10_22 + PIXEL11_12 + break; + case 103: + PIXEL00_11 + PIXEL01_12 + PIXEL10_12 + PIXEL11_22 + break; + case 227: + PIXEL00_11 + PIXEL01_21 + PIXEL10_12 + PIXEL11_11 + break; + case 230: + PIXEL00_22 + PIXEL01_12 + PIXEL10_12 + PIXEL11_11 + break; + case 199: + PIXEL00_11 + PIXEL01_12 + PIXEL10_21 + PIXEL11_11 + break; + case 220: + PIXEL00_21 + PIXEL01_11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 158: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_12 + break; + case 234: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + PIXEL01_21 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + PIXEL11_11 + break; + case 242: + PIXEL00_22 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + PIXEL10_12 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 59: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_21 + break; + case 121: + PIXEL00_12 + PIXEL01_22 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + break; + case 87: + PIXEL00_11 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_21 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + break; + case 79: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + PIXEL01_12 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + PIXEL11_22 + break; + case 122: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + break; + case 94: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + break; + case 218: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 91: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + 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(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_12 + break; + case 115: + PIXEL00_11 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + PIXEL10_12 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + break; + case 93: + PIXEL00_12 + PIXEL01_11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + break; + case 206: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + PIXEL01_12 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + PIXEL11_11 + break; + case 205: + case 201: + PIXEL00_12 + PIXEL01_20 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_10 + } else { + PIXEL10_70 + } + PIXEL11_11 + break; + case 174: + case 46: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_10 + } else { + PIXEL00_70 + } + PIXEL01_12 + PIXEL10_11 + PIXEL11_20 + break; + case 179: + case 147: + PIXEL00_11 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_10 + } else { + PIXEL01_70 + } + PIXEL10_20 + PIXEL11_12 + break; + case 117: + case 116: + PIXEL00_20 + PIXEL01_11 + PIXEL10_12 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_10 + } else { + PIXEL11_70 + } + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + PIXEL11_10 + break; + case 219: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_10 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 125: + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL00_12 + PIXEL10_0 + } else { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_11 + PIXEL11_10 + break; + case 221: + PIXEL00_12 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL01_11 + PIXEL11_0 + } else { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_10 + break; + case 207: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + PIXEL01_12 + } else { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_10 + PIXEL11_11 + break; + case 238: + PIXEL00_10 + PIXEL01_12 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + PIXEL11_11 + } else { + PIXEL10_90 + PIXEL11_60 + } + break; + case 190: + PIXEL00_10 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + PIXEL11_12 + } else { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_11 + break; + case 187: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + PIXEL10_11 + } else { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_10 + PIXEL11_12 + break; + case 243: + PIXEL00_11 + PIXEL01_10 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL10_12 + PIXEL11_0 + } else { + PIXEL10_61 + PIXEL11_90 + } + break; + case 119: + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL00_11 + PIXEL01_0 + } else { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_12 + PIXEL11_10 + break; + case 237: + case 233: + PIXEL00_12 + PIXEL01_20 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_100 + } + PIXEL11_11 + break; + case 175: + case 47: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_100 + } + PIXEL01_12 + PIXEL10_11 + PIXEL11_20 + break; + case 183: + case 151: + PIXEL00_11 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_100 + } + PIXEL10_20 + PIXEL11_12 + break; + case 245: + case 244: + PIXEL00_20 + PIXEL01_11 + PIXEL10_12 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_100 + } + break; + case 250: + PIXEL00_10 + PIXEL01_10 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 123: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + PIXEL01_10 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + PIXEL11_10 + break; + case 95: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_10 + PIXEL11_10 + break; + case 222: + PIXEL00_10 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_10 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 252: + PIXEL00_21 + PIXEL01_11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_100 + } + break; + case 249: + PIXEL00_12 + PIXEL01_22 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_100 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 235: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + PIXEL01_21 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_100 + } + PIXEL11_11 + break; + case 111: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_100 + } + PIXEL01_12 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + PIXEL11_22 + break; + case 63: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_100 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_11 + PIXEL11_21 + break; + case 159: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_100 + } + PIXEL10_22 + PIXEL11_12 + break; + case 215: + PIXEL00_11 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_100 + } + PIXEL10_21 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 246: + PIXEL00_22 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + PIXEL10_12 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_100 + } + break; + case 254: + PIXEL00_10 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_100 + } + break; + case 253: + PIXEL00_12 + PIXEL01_11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_100 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_100 + } + break; + case 251: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + PIXEL01_10 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_100 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 239: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_100 + } + PIXEL01_12 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_100 + } + PIXEL11_11 + break; + case 127: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_100 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_20 + } + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_20 + } + PIXEL11_10 + break; + case 191: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_100 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_100 + } + PIXEL10_11 + PIXEL11_12 + break; + case 223: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_20 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_100 + } + PIXEL10_10 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_20 + } + break; + case 247: + PIXEL00_11 + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_100 + } + PIXEL10_12 + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_100 + } + break; + case 255: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_0 + } else { + PIXEL00_100 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_0 + } else { + PIXEL01_100 + } + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_0 + } else { + PIXEL10_100 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL11_0 + } else { + PIXEL11_100 + } + break; + } +} + +#undef RGBtoYUV diff --git a/src/gui/render_templates_hq3x.h b/src/gui/render_templates_hq3x.h new file mode 100644 index 00000000..9baa4e7d --- /dev/null +++ b/src/gui/render_templates_hq3x.h @@ -0,0 +1,2872 @@ +/* + * Copyright (C) 2002-2006 The DOSBox Team + * + * 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. + */ + +/* + * The HQ3x high quality 3x graphics filter. + * Original author Maxim Stepin (see http://www.hiend3d.com/hq3x.html). + * Adapted for DOSBox from ScummVM and HiEnd3D code by Kronuz. + */ + +#ifndef RENDER_TEMPLATES_HQ3X_TABLE_H +#define RENDER_TEMPLATES_HQ3X_TABLE_H + +#define PIXEL00_1M line0[0] = interp_w2(C4,C0,3U,1U); +#define PIXEL00_1U line0[0] = interp_w2(C4,C1,3U,1U); +#define PIXEL00_1L line0[0] = interp_w2(C4,C3,3U,1U); +#define PIXEL00_2 line0[0] = interp_w3(C4,C3,C1,2U,1U,1U); +#define PIXEL00_4 line0[0] = interp_w3(C4,C3,C1,2U,7U,7U); +#define PIXEL00_5 line0[0] = interp_w2(C3,C1,1U,1U); +#define PIXEL00_C line0[0] = C4; + +#define PIXEL01_1 line0[1] = interp_w2(C4,C1,3U,1U); +#define PIXEL01_3 line0[1] = interp_w2(C4,C1,7U,1U); +#define PIXEL01_6 line0[1] = interp_w2(C1,C4,3U,1U); +#define PIXEL01_C line0[1] = C4; + +#define PIXEL02_1M line0[2] = interp_w2(C4,C2,3U,1U); +#define PIXEL02_1U line0[2] = interp_w2(C4,C1,3U,1U); +#define PIXEL02_1R line0[2] = interp_w2(C4,C5,3U,1U); +#define PIXEL02_2 line0[2] = interp_w3(C4,C1,C5,2U,1U,1U); +#define PIXEL02_4 line0[2] = interp_w3(C4,C1,C5,2U,7U,7U); +#define PIXEL02_5 line0[2] = interp_w2(C1,C5,1U,1U); +#define PIXEL02_C line0[2] = C4; + +#define PIXEL10_1 line1[0] = interp_w2(C4,C3,3U,1U); +#define PIXEL10_3 line1[0] = interp_w2(C4,C3,7U,1U); +#define PIXEL10_6 line1[0] = interp_w2(C3,C4,3U,1U); +#define PIXEL10_C line1[0] = C4; + +#define PIXEL11 line1[1] = C4; + +#define PIXEL12_1 line1[2] = interp_w2(C4,C5,3U,1U); +#define PIXEL12_3 line1[2] = interp_w2(C4,C5,7U,1U); +#define PIXEL12_6 line1[2] = interp_w2(C5,C4,3U,1U); +#define PIXEL12_C line1[2] = C4; + +#define PIXEL20_1M line2[0] = interp_w2(C4,C6,3U,1U); +#define PIXEL20_1D line2[0] = interp_w2(C4,C7,3U,1U); +#define PIXEL20_1L line2[0] = interp_w2(C4,C3,3U,1U); +#define PIXEL20_2 line2[0] = interp_w3(C4,C7,C3,2U,1U,1U); +#define PIXEL20_4 line2[0] = interp_w3(C4,C7,C3,2U,7U,7U); +#define PIXEL20_5 line2[0] = interp_w2(C7,C3,1U,1U); +#define PIXEL20_C line2[0] = C4; + +#define PIXEL21_1 line2[1] = interp_w2(C4,C7,3U,1U); +#define PIXEL21_3 line2[1] = interp_w2(C4,C7,7U,1U); +#define PIXEL21_6 line2[1] = interp_w2(C7,C4,3U,1U); +#define PIXEL21_C line2[1] = C4; + +#define PIXEL22_1M line2[2] = interp_w2(C4,C8,3U,1U); +#define PIXEL22_1D line2[2] = interp_w2(C4,C7,3U,1U); +#define PIXEL22_1R line2[2] = interp_w2(C4,C5,3U,1U); +#define PIXEL22_2 line2[2] = interp_w3(C4,C5,C7,2U,1U,1U); +#define PIXEL22_4 line2[2] = interp_w3(C4,C5,C7,2U,7U,7U); +#define PIXEL22_5 line2[2] = interp_w2(C5,C7,1U,1U); +#define PIXEL22_C line2[2] = C4; + +#endif + +#if SBPP == 32 +#define RGBtoYUV(c) _RGBtoYUV[((c & 0xf80000) >> 8) | ((c & 0x00fc00) >> 12) | ((c & 0x0000f8) >> 3)] +#else +#define RGBtoYUV(c) _RGBtoYUV[c] +#endif + +inline void conc2d(Hq3x,SBPP)(PTYPE * line0, PTYPE * line1, PTYPE * line2, const PTYPE * fc) +{ + if (_RGBtoYUV == 0) conc2d(InitLUTs,SBPP)(); + + Bit32u pattern = 0; + const Bit32u YUV4 = RGBtoYUV(C4); + + if (C4 != C0 && diffYUV(YUV4, RGBtoYUV(C0))) pattern |= 0x0001; + if (C4 != C1 && diffYUV(YUV4, RGBtoYUV(C1))) pattern |= 0x0002; + if (C4 != C2 && diffYUV(YUV4, RGBtoYUV(C2))) pattern |= 0x0004; + if (C4 != C3 && diffYUV(YUV4, RGBtoYUV(C3))) pattern |= 0x0008; + if (C4 != C5 && diffYUV(YUV4, RGBtoYUV(C5))) pattern |= 0x0010; + if (C4 != C6 && diffYUV(YUV4, RGBtoYUV(C6))) pattern |= 0x0020; + if (C4 != C7 && diffYUV(YUV4, RGBtoYUV(C7))) pattern |= 0x0040; + if (C4 != C8 && diffYUV(YUV4, RGBtoYUV(C8))) pattern |= 0x0080; + + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_1M + PIXEL21_C + } else { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + case 10: + case 138: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } else { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + case 11: + case 139: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + 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(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL10_C + } else { + PIXEL00_4 + PIXEL10_3 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_C + PIXEL02_C + } else { + PIXEL01_3 + PIXEL02_4 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1M + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL21_C + PIXEL22_C + } else { + PIXEL21_3 + PIXEL22_4 + } + break; + case 88: + case 248: + PIXEL00_1M + PIXEL01_1 + PIXEL02_1M + PIXEL11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + } else { + PIXEL10_3 + PIXEL20_4 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL12_C + PIXEL22_C + } else { + PIXEL12_3 + PIXEL22_4 + } + break; + case 74: + case 107: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL01_C + } else { + PIXEL00_4 + PIXEL01_3 + } + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_C + PIXEL21_C + } else { + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + case 27: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } else { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + case 30: + PIXEL00_1M + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } else { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + case 75: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_1M + } else { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_1M + } else { + PIXEL22_2 + } + break; + case 92: + PIXEL00_1M + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_1M + } else { + PIXEL22_2 + } + break; + case 202: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1R + break; + case 78: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1R + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1M + break; + case 154: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_1M + } else { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1L + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_1M + } else { + PIXEL22_2 + } + break; + case 89: + PIXEL00_1U + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_1M + } else { + PIXEL22_2 + } + break; + case 90: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_1M + } else { + PIXEL02_2 + } + PIXEL10_C + PIXEL11 + PIXEL12_C + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_1M + } else { + PIXEL22_2 + } + break; + case 55: + case 23: + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + 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(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } else { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + case 203: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } else { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + case 118: + PIXEL00_1M + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } else { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + case 155: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } else { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + case 158: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1M + PIXEL11 + PIXEL12_1 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } else { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1R + break; + case 242: + PIXEL00_1M + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_1M + } else { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL20_1L + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } else { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + case 59: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } else { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } else { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_1M + } else { + PIXEL22_2 + } + break; + case 87: + PIXEL00_1L + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } else { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_1 + PIXEL11 + PIXEL20_1M + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_1M + } else { + PIXEL22_2 + } + break; + case 79: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } else { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + PIXEL02_1R + PIXEL11 + PIXEL12_1 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1M + break; + case 122: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_1M + } else { + PIXEL02_2 + } + PIXEL11 + PIXEL12_C + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } else { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_1M + } else { + PIXEL22_2 + } + break; + case 94: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } else { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_C + PIXEL11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_1M + } else { + PIXEL22_2 + } + break; + case 218: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_1M + } else { + PIXEL02_2 + } + PIXEL10_C + PIXEL11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } else { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + case 91: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } else { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_1M + } else { + PIXEL02_2 + } + PIXEL11 + PIXEL12_C + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_1M + } else { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1L + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_1M + } else { + PIXEL22_2 + } + break; + case 93: + PIXEL00_1U + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_1M + } else { + PIXEL22_2 + } + break; + case 206: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_1M + } else { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1R + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_1M + } else { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1R + break; + case 174: + case 46: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } else { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } else { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + case 219: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } else { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + PIXEL02_1M + PIXEL11 + PIXEL20_1M + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } else { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + case 125: + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_C + } else { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1R + break; + case 175: + case 47: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + 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(RGBtoYUV(C1), RGBtoYUV(C5))) { + 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(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_C + } else { + PIXEL22_2 + } + break; + case 250: + PIXEL00_1M + PIXEL01_C + PIXEL02_1M + PIXEL11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + } else { + PIXEL10_3 + PIXEL20_4 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL12_C + PIXEL22_C + } else { + PIXEL12_3 + PIXEL22_4 + } + break; + case 123: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL01_C + } else { + PIXEL00_4 + PIXEL01_3 + } + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_C + PIXEL21_C + } else { + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + case 95: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL10_C + } else { + PIXEL00_4 + PIXEL10_3 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_C + PIXEL12_C + } else { + PIXEL02_4 + PIXEL12_3 + } + PIXEL11 + PIXEL20_1M + PIXEL21_C + PIXEL22_1M + break; + case 222: + PIXEL00_1M + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_C + PIXEL02_C + } else { + PIXEL01_3 + PIXEL02_4 + } + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1M + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL21_C + PIXEL22_C + } else { + PIXEL21_3 + PIXEL22_4 + } + break; + case 252: + PIXEL00_1M + PIXEL01_1 + PIXEL02_1U + PIXEL11 + PIXEL12_C + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + } else { + PIXEL10_3 + PIXEL20_4 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_C + } else { + PIXEL22_2 + } + break; + case 249: + PIXEL00_1U + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_C + } else { + PIXEL20_2 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL12_C + PIXEL22_C + } else { + PIXEL12_3 + PIXEL22_4 + } + break; + case 235: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL01_C + } else { + PIXEL00_4 + PIXEL01_3 + } + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_C + } else { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1R + break; + case 111: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + } else { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1R + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_C + PIXEL21_C + } else { + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + case 63: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + } else { + PIXEL00_2 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_C + PIXEL12_C + } else { + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_C + PIXEL11 + PIXEL20_1D + PIXEL21_1 + PIXEL22_1M + break; + case 159: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL10_C + } else { + PIXEL00_4 + PIXEL10_3 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_C + } else { + PIXEL02_2 + } + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1D + break; + case 215: + PIXEL00_1L + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_C + } else { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1M + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL21_C + PIXEL22_C + } else { + PIXEL21_3 + PIXEL22_4 + } + break; + case 246: + PIXEL00_1M + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_C + PIXEL02_C + } else { + PIXEL01_3 + PIXEL02_4 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1L + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_C + } else { + PIXEL22_2 + } + break; + case 254: + PIXEL00_1M + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_C + PIXEL02_C + } else { + PIXEL01_3 + PIXEL02_4 + } + PIXEL11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + } else { + PIXEL10_3 + PIXEL20_4 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + 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(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_C + } else { + PIXEL20_2 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_C + } else { + PIXEL22_2 + } + break; + case 251: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL01_C + } else { + PIXEL00_4 + PIXEL01_3 + } + PIXEL02_1M + PIXEL11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } else { + PIXEL10_3 + PIXEL20_2 + PIXEL21_3 + } + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL12_C + PIXEL22_C + } else { + PIXEL12_3 + PIXEL22_4 + } + break; + case 239: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + } else { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1R + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_C + } else { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1R + break; + case 127: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } else { + PIXEL00_2 + PIXEL01_3 + PIXEL10_3 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_C + PIXEL12_C + } else { + PIXEL02_4 + PIXEL12_3 + } + PIXEL11 + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_C + PIXEL21_C + } else { + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + case 191: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + } else { + PIXEL00_2 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_C + } else { + PIXEL02_2 + } + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1D + break; + case 223: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + PIXEL10_C + } else { + PIXEL00_4 + PIXEL10_3 + } + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } else { + PIXEL01_3 + PIXEL02_2 + PIXEL12_3 + } + PIXEL11 + PIXEL20_1M + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL21_C + PIXEL22_C + } else { + PIXEL21_3 + PIXEL22_4 + } + break; + case 247: + PIXEL00_1L + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_C + } else { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1L + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_C + } else { + PIXEL22_2 + } + break; + case 255: + if (diffYUV(RGBtoYUV(C3), RGBtoYUV(C1))) { + PIXEL00_C + } else { + PIXEL00_2 + } + PIXEL01_C + if (diffYUV(RGBtoYUV(C1), RGBtoYUV(C5))) { + PIXEL02_C + } else { + PIXEL02_2 + } + PIXEL10_C + PIXEL11 + PIXEL12_C + if (diffYUV(RGBtoYUV(C7), RGBtoYUV(C3))) { + PIXEL20_C + } else { + PIXEL20_2 + } + PIXEL21_C + if (diffYUV(RGBtoYUV(C5), RGBtoYUV(C7))) { + PIXEL22_C + } else { + PIXEL22_2 + } + break; + } +} + +#undef RGBtoYUV diff --git a/src/gui/render_templates_sai.h b/src/gui/render_templates_sai.h new file mode 100644 index 00000000..8f938571 --- /dev/null +++ b/src/gui/render_templates_sai.h @@ -0,0 +1,229 @@ +/* + * Copyright (C) 2002-2006 The DOSBox Team + * + * 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. + */ + +static inline int conc2d(GetResult,SBPP)(PTYPE A, PTYPE B, PTYPE C, PTYPE 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]; +} + +inline void conc2d(Super2xSaI,SBPP)(PTYPE * line0, PTYPE * line1, const PTYPE * fc) +{ + //-------------------------------------- + if (C7 == C5 && C4 != C8) { + line1[1] = line0[1] = C7; + } else if (C4 == C8 && C7 != C5) { + line1[1] = line0[1] = C4; + } else if (C4 == C8 && C7 == C5) { + register int r = 0; + r += conc2d(GetResult,SBPP)(C5,C4,C6,D1); + r += conc2d(GetResult,SBPP)(C5,C4,C3,C1); + r += conc2d(GetResult,SBPP)(C5,C4,D2,D5); + r += conc2d(GetResult,SBPP)(C5,C4,C2,D4); + + if (r > 0) + line1[1] = line0[1] = C5; + else if (r < 0) + line1[1] = line0[1] = C4; + else { + line1[1] = line0[1] = interp_w2(C4,C5,1U,1U); + } + } else { + if (C5 == C8 && C8 == D1 && C7 != D2 && C8 != D0) + line1[1] = interp_w2(C8,C7,3U,1U); + else if (C4 == C7 && C7 == D2 && D1 != C8 && C7 != D6) + line1[1] = interp_w2(C7,C8,3U,1U); + else + line1[1] = interp_w2(C7,C8,1U,1U); + + if (C5 == C8 && C5 == C1 && C4 != C2 && C5 != C0) + line0[1] = interp_w2(C5,C4,3U,1U); + else if (C4 == C7 && C4 == C2 && C1 != C5 && C4 != D3) + line0[1] = interp_w2(C4,C5,3U,1U); + else + line0[1] = interp_w2(C4,C5,1U,1U); + } + + if (C4 == C8 && C7 != C5 && C3 == C4 && C4 != D2) + line1[0] = interp_w2(C7,C4,1U,1U); + else if (C4 == C6 && C5 == C4 && C3 != C7 && C4 != D0) + line1[0] = interp_w2(C7,C4,1U,1U); + else + line1[0] = C7; + + if (C7 == C5 && C4 != C8 && C6 == C7 && C7 != C2) + line0[0] = interp_w2(C7,C4,1U,1U); + else if (C3 == C7 && C8 == C7 && C6 != C4 && C7 != C0) + line0[0] = interp_w2(C7,C4,1U,1U); + else + line0[0] = C4; +} + +inline void conc2d(SuperEagle,SBPP)(PTYPE * line0, PTYPE * line1, const PTYPE * fc) +{ + // -------------------------------------- + if (C4 != C8) { + if (C7 == C5) { + line0[1] = line1[0] = C7; + if ((C6 == C7) || (C5 == C2)) { + line0[0] = interp_w2(C7,C4,3U,1U); + } else { + line0[0] = interp_w2(C4,C5,1U,1U); + } + + if ((C5 == D4) || (C7 == D1)) { + line1[1] = interp_w2(C7,C8,3U,1U); + } else { + line1[1] = interp_w2(C7,C8,1U,1U); + } + } else { + line1[1] = interp_w3(C8,C7,C5,6U,1U,1U); + line0[0] = interp_w3(C4,C7,C5,6U,1U,1U); + + line1[0] = interp_w3(C7,C4,C8,6U,1U,1U); + line0[1] = interp_w3(C5,C4,C8,6U,1U,1U); + } + } else { + if (C7 != C5) { + line1[1] = line0[0] = C4; + + if ((C1 == C4) || (C8 == D5)) { + line0[1] = interp_w2(C4,C5,3U,1U); + } else { + line0[1] = interp_w2(C4,C5,1U,1U); + } + + if ((C8 == D2) || (C3 == C4)) { + line1[0] = interp_w2(C4,C7,3U,1U); + } else { + line1[0] = interp_w2(C7,C8,1U,1U); + } + } else { + register int r = 0; + r += conc2d(GetResult,SBPP)(C5,C4,C6,D1); + r += conc2d(GetResult,SBPP)(C5,C4,C3,C1); + r += conc2d(GetResult,SBPP)(C5,C4,D2,D5); + r += conc2d(GetResult,SBPP)(C5,C4,C2,D4); + + if (r > 0) { + line0[1] = line1[0] = C7; + line0[0] = line1[1] = interp_w2(C4,C5,1U,1U); + } else if (r < 0) { + line1[1] = line0[0] = C4; + line0[1] = line1[0] = interp_w2(C4,C5,1U,1U); + } else { + line1[1] = line0[0] = C4; + line0[1] = line1[0] = C7; + } + } + } +} + +inline void conc2d(_2xSaI,SBPP)(PTYPE * line0, PTYPE * line1, const PTYPE * fc) +{ + if ((C4 == C8) && (C5 != C7)) { + if (((C4 == C1) && (C5 == D5)) || + ((C4 == C7) && (C4 == C2) && (C5 != C1) && (C5 == D3))) { + line0[1] = C4; + } else { + line0[1] = interp_w2(C4,C5,1U,1U); + } + + if (((C4 == C3) && (C7 == D2)) || + ((C4 == C5) && (C4 == C6) && (C3 != C7) && (C7 == D0))) { + line1[0] = C4; + } else { + line1[0] = interp_w2(C4,C7,1U,1U); + } + line1[1] = C4; + } else if ((C5 == C7) && (C4 != C8)) { + if (((C5 == C2) && (C4 == C6)) || + ((C5 == C1) && (C5 == C8) && (C4 != C2) && (C4 == C0))) { + line0[1] = C5; + } else { + line0[1] = interp_w2(C4,C5,1U,1U); + } + + if (((C7 == C6) && (C4 == C2)) || + ((C7 == C3) && (C7 == C8) && (C4 != C6) && (C4 == C0))) { + line1[0] = C7; + } else { + line1[0] = interp_w2(C4,C7,1U,1U); + } + line1[1] = C5; + } else if ((C4 == C8) && (C5 == C7)) { + if (C4 == C5) { + line0[1] = C4; + line1[0] = C4; + line1[1] = C4; + } else { + register int r = 0; + r += conc2d(GetResult,SBPP)(C4,C5,C3,C1); + r -= conc2d(GetResult,SBPP)(C5,C4,D4,C2); + r -= conc2d(GetResult,SBPP)(C5,C4,C6,D1); + r += conc2d(GetResult,SBPP)(C4,C5,D5,D2); + + if (r > 0) + line1[1] = C4; + else if (r < 0) + line1[1] = C5; + else { + line1[1] = interp_w4(C4,C5,C7,C8,1U,1U,1U,1U); + } + + line1[0] = interp_w2(C4,C7,1U,1U); + line0[1] = interp_w2(C4,C5,1U,1U); + } + } else { + line1[1] = interp_w4(C4,C5,C7,C8,1U,1U,1U,1U); + + if ((C4 == C7) && (C4 == C2) + && (C5 != C1) && (C5 == D3)) { + line0[1] = C4; + } else if ((C5 == C1) && (C5 == C8) + && (C4 != C2) && (C4 == C0)) { + line0[1] = C5; + } else { + line0[1] = interp_w2(C4,C5,1U,1U); + } + + if ((C4 == C5) && (C4 == C6) + && (C3 != C7) && (C7 == D0)) { + line1[0] = C4; + } else if ((C7 == C3) && (C7 == C8) + && (C4 != C6) && (C4 == C0)) { + line1[0] = C7; + } else { + line1[0] = interp_w2(C4,C7,1U,1U); + } + } + line0[0] = C4; +}