/* * Copyright © 2003 MaxSt (maxst@hiend3d.com) * * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd) * Copyright © 2002-2006 Fenix Team (Fenix) * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix) * * This file is part of Bennu - Game Development * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source * distribution. * */ /* --------------------------------------------------------------------------- */ #include #include /* --------------------------------------------------------------------------- */ #include "librender.h" /* --------------------------------------------------------------------------- */ #define PIXEL00_0 *(q) = w5; #define PIXEL00_10 *(q) = interpolate16_2(3,1,w5, w1); #define PIXEL00_11 *(q) = interpolate16_2(3,1,w5, w4); #define PIXEL00_12 *(q) = interpolate16_2(3,1,w5, w2); #define PIXEL00_20 *(q) = interpolate16_3(2,1,1,w5, w4, w2); #define PIXEL00_21 *(q) = interpolate16_3(2,1,1,w5, w1, w2); #define PIXEL00_22 *(q) = interpolate16_3(2,1,1,w5, w1, w4); #define PIXEL00_60 *(q) = interpolate16_3(5,2,1,w5, w2, w4); #define PIXEL00_61 *(q) = interpolate16_3(5,2,1,w5, w4, w2); #define PIXEL00_70 *(q) = interpolate16_3(6,1,1,w5, w4, w2); #define PIXEL00_90 *(q) = interpolate16_3(2,3,3,w5, w4, w2); #define PIXEL00_100 *(q) = interpolate16_3(14,1,1,w5, w4, w2); #define PIXEL01_0 *(q+1) = w5; #define PIXEL01_10 *(q+1) = interpolate16_2(3,1,w5, w3); #define PIXEL01_11 *(q+1) = interpolate16_2(3,1,w5, w2); #define PIXEL01_12 *(q+1) = interpolate16_2(3,1,w5, w6); #define PIXEL01_20 *(q+1) = interpolate16_3(2,1,1,w5, w2, w6); #define PIXEL01_21 *(q+1) = interpolate16_3(2,1,1,w5, w3, w6); #define PIXEL01_22 *(q+1) = interpolate16_3(2,1,1,w5, w3, w2); #define PIXEL01_60 *(q+1) = interpolate16_3(5,2,1,w5, w6, w2); #define PIXEL01_61 *(q+1) = interpolate16_3(5,2,1,w5, w2, w6); #define PIXEL01_70 *(q+1) = interpolate16_3(6,1,1,w5, w2, w6); #define PIXEL01_90 *(q+1) = interpolate16_3(2,3,3,w5, w2, w6); #define PIXEL01_100 *(q+1) = interpolate16_3(14,1,1,w5, w2, w6); #define PIXEL10_0 *(q+nextlineDst) = w5; #define PIXEL10_10 *(q+nextlineDst) = interpolate16_2(3,1,w5, w7); #define PIXEL10_11 *(q+nextlineDst) = interpolate16_2(3,1,w5, w8); #define PIXEL10_12 *(q+nextlineDst) = interpolate16_2(3,1,w5, w4); #define PIXEL10_20 *(q+nextlineDst) = interpolate16_3(2,1,1,w5, w8, w4); #define PIXEL10_21 *(q+nextlineDst) = interpolate16_3(2,1,1,w5, w7, w4); #define PIXEL10_22 *(q+nextlineDst) = interpolate16_3(2,1,1,w5, w7, w8); #define PIXEL10_60 *(q+nextlineDst) = interpolate16_3(5,2,1,w5, w4, w8); #define PIXEL10_61 *(q+nextlineDst) = interpolate16_3(5,2,1,w5, w8, w4); #define PIXEL10_70 *(q+nextlineDst) = interpolate16_3(6,1,1,w5, w8, w4); #define PIXEL10_90 *(q+nextlineDst) = interpolate16_3(2,3,3,w5, w8, w4); #define PIXEL10_100 *(q+nextlineDst) = interpolate16_3(14,1,1,w5, w8, w4); #define PIXEL11_0 *(q+1+nextlineDst) = w5; #define PIXEL11_10 *(q+1+nextlineDst) = interpolate16_2(3,1,w5, w9); #define PIXEL11_11 *(q+1+nextlineDst) = interpolate16_2(3,1,w5, w6); #define PIXEL11_12 *(q+1+nextlineDst) = interpolate16_2(3,1,w5, w8); #define PIXEL11_20 *(q+1+nextlineDst) = interpolate16_3(2,1,1,w5, w6, w8); #define PIXEL11_21 *(q+1+nextlineDst) = interpolate16_3(2,1,1,w5, w9, w8); #define PIXEL11_22 *(q+1+nextlineDst) = interpolate16_3(2,1,1,w5, w9, w6); #define PIXEL11_60 *(q+1+nextlineDst) = interpolate16_3(5,2,1,w5, w8, w6); #define PIXEL11_61 *(q+1+nextlineDst) = interpolate16_3(5,2,1,w5, w6, w8); #define PIXEL11_70 *(q+1+nextlineDst) = interpolate16_3(6,1,1,w5, w6, w8); #define PIXEL11_90 *(q+1+nextlineDst) = interpolate16_3(2,3,3,w5, w6, w8); #define PIXEL11_100 *(q+1+nextlineDst) = interpolate16_3(14,1,1,w5, w6, w8); #define YUV(x) RGBtoYUV[w ## x] /* --------------------------------------------------------------------------- */ int hq2xinited = 0; #define RGBtoYUV _RGBtoYUV #define LUT16to32 _LUT16to32 static uint32_t *LUT16to32; static uint32_t *RGBtoYUV; /* --------------------------------------------------------------------------- */ /** * Interpolate two 16 bit pixels with the weights specified in the template * parameters. Used by the hq scaler family. * @note w1 and w2 must sum up to 2, 4, 8 or 16. */ static inline uint16_t interpolate16_2( int w1, int w2, uint16_t p1, uint16_t p2 ) { return (((( p1 & ( sys_pixel_format->Rmask | sys_pixel_format->Bmask ) ) * w1 + ( p2 & ( sys_pixel_format->Rmask | sys_pixel_format->Bmask ) ) * w2 ) / ( w1 + w2 ) ) & ( sys_pixel_format->Rmask | sys_pixel_format->Bmask ) ) | (((( p1 & sys_pixel_format->Gmask ) * w1 + ( p2 & sys_pixel_format->Gmask ) * w2 ) / ( w1 + w2 ) ) & sys_pixel_format->Gmask ); } /* --------------------------------------------------------------------------- */ /** * Interpolate three 16 bit pixels with the weights specified in the template * parameters. Used by the hq scaler family. * @note w1, w2 and w3 must sum up to 2, 4, 8 or 16. */ static inline uint16_t interpolate16_3( int w1, int w2, int w3, uint16_t p1, uint16_t p2, uint16_t p3 ) { return (((( p1 & ( sys_pixel_format->Rmask | sys_pixel_format->Bmask ) ) * w1 + ( p2 & ( sys_pixel_format->Rmask | sys_pixel_format->Bmask ) ) * w2 + ( p3 & ( sys_pixel_format->Rmask | sys_pixel_format->Bmask ) ) * w3 ) / ( w1 + w2 + w3 ) ) & ( sys_pixel_format->Rmask | sys_pixel_format->Bmask ) ) | (((( p1 & sys_pixel_format->Gmask ) * w1 + ( p2 & sys_pixel_format->Gmask ) * w2 + ( p3 & sys_pixel_format->Gmask ) * w3 ) / ( w1 + w2 + w3 ) ) & sys_pixel_format->Gmask ); } /* --------------------------------------------------------------------------- */ /** * Compare two YUV values (encoded 8-8-8) and check if they differ by more than * a certain hard coded threshold. Used by the hq scaler family. */ static inline int diffYUV( int yuv1, int yuv2 ) { static const int Ymask = 0x00FF0000; static const int Umask = 0x0000FF00; static const int Vmask = 0x000000FF; static const int trY = 0x00300000; static const int trU = 0x00000700; static const int trV = 0x00000006; int diff; int 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 -1; 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 -1; 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 -1; return 0; /* return ((ABS((yuv1 & Ymask) - (yuv2 & Ymask)) > trY) || (ABS((yuv1 & Umask) - (yuv2 & Umask)) > trU) || (ABS((yuv1 & Vmask) - (yuv2 & Vmask)) > trV)); */ } /* --------------------------------------------------------------------------- */ static void inline hq2x_main( int w1, int w2, int w3, int w4, int w5, int w6, int w7, int w8, int w9, uint32_t nextlineSrc, uint32_t nextlineDst, uint16_t *p, uint16_t *q, int skiplastline ) { int pattern = 0; const int yuv5 = YUV( 5 ); if ( w5 != w1 && diffYUV( yuv5, YUV( 1 ) ) ) pattern |= 0x0001; if ( w5 != w2 && diffYUV( yuv5, YUV( 2 ) ) ) pattern |= 0x0002; if ( w5 != w3 && diffYUV( yuv5, YUV( 3 ) ) ) pattern |= 0x0004; if ( w5 != w4 && diffYUV( yuv5, YUV( 4 ) ) ) pattern |= 0x0008; if ( w5 != w6 && diffYUV( yuv5, YUV( 6 ) ) ) pattern |= 0x0010; if ( w5 != w7 && diffYUV( yuv5, YUV( 7 ) ) ) pattern |= 0x0020; if ( w5 != w8 && diffYUV( yuv5, YUV( 8 ) ) ) pattern |= 0x0040; if ( w5 != w9 && diffYUV( yuv5, YUV( 9 ) ) ) 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 if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_20 break; case 2: case 34: case 130: case 162: PIXEL00_22 PIXEL01_21 if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_20 break; case 16: case 17: case 48: case 49: PIXEL00_20 PIXEL01_22 if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_21 break; case 64: case 65: case 68: case 69: PIXEL00_20 PIXEL01_20 if ( !skiplastline ) PIXEL10_21 if ( !skiplastline ) PIXEL11_22 break; case 8: case 12: case 136: case 140: PIXEL00_21 PIXEL01_20 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_20 break; case 3: case 35: case 131: case 163: PIXEL00_11 PIXEL01_21 if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_20 break; case 6: case 38: case 134: case 166: PIXEL00_22 PIXEL01_12 if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_20 break; case 20: case 21: case 52: case 53: PIXEL00_20 PIXEL01_11 if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_21 break; case 144: case 145: case 176: case 177: PIXEL00_20 PIXEL01_22 if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_12 break; case 192: case 193: case 196: case 197: PIXEL00_20 PIXEL01_20 if ( !skiplastline ) PIXEL10_21 if ( !skiplastline ) PIXEL11_11 break; case 96: case 97: case 100: case 101: PIXEL00_20 PIXEL01_20 if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_22 break; case 40: case 44: case 168: case 172: PIXEL00_21 PIXEL01_20 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_20 break; case 9: case 13: case 137: case 141: PIXEL00_12 PIXEL01_20 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_20 break; case 18: case 50: PIXEL00_22 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_21 break; case 80: case 81: PIXEL00_20 PIXEL01_22 if ( !skiplastline ) PIXEL10_21 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_20 } break; case 72: case 76: PIXEL00_21 PIXEL01_20 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_22 break; case 10: case 138: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_20 } PIXEL01_21 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_20 break; case 66: PIXEL00_22 PIXEL01_21 if ( !skiplastline ) PIXEL10_21 if ( !skiplastline ) PIXEL11_22 break; case 24: PIXEL00_21 PIXEL01_22 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_21 break; case 7: case 39: case 135: PIXEL00_11 PIXEL01_12 if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_20 break; case 148: case 149: case 180: PIXEL00_20 PIXEL01_11 if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_12 break; case 224: case 228: case 225: PIXEL00_20 PIXEL01_20 if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_11 break; case 41: case 169: case 45: PIXEL00_12 PIXEL01_20 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_20 break; case 22: case 54: PIXEL00_22 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_21 break; case 208: case 209: PIXEL00_20 PIXEL01_22 if ( !skiplastline ) PIXEL10_21 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 104: case 108: PIXEL00_21 PIXEL01_20 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_22 break; case 11: case 139: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } PIXEL01_21 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_20 break; case 19: case 51: if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL00_11 PIXEL01_10 } else { PIXEL00_60 PIXEL01_90 } if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_21 break; case 146: case 178: PIXEL00_22 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 if ( !skiplastline ) PIXEL11_12 } else { PIXEL01_90 if ( !skiplastline ) PIXEL11_61 } if ( !skiplastline ) PIXEL10_20 break; case 84: case 85: PIXEL00_20 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { PIXEL01_11 if ( !skiplastline ) PIXEL11_10 } else { PIXEL01_60 if ( !skiplastline ) PIXEL11_90 } if ( !skiplastline ) PIXEL10_21 break; case 112: case 113: PIXEL00_20 PIXEL01_22 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL10_61 if ( !skiplastline ) PIXEL11_90 } break; case 200: case 204: PIXEL00_21 PIXEL01_20 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 if ( !skiplastline ) PIXEL11_11 } else { if ( !skiplastline ) PIXEL10_90 if ( !skiplastline ) PIXEL11_60 } break; case 73: case 77: if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { PIXEL00_12 if ( !skiplastline ) PIXEL10_10 } else { PIXEL00_61 if ( !skiplastline ) PIXEL10_90 } PIXEL01_20 if ( !skiplastline ) PIXEL11_22 break; case 42: case 170: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 if ( !skiplastline ) PIXEL10_11 } else { PIXEL00_90 if ( !skiplastline ) PIXEL10_60 } PIXEL01_21 if ( !skiplastline ) PIXEL11_20 break; case 14: case 142: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 PIXEL01_12 } else { PIXEL00_90 PIXEL01_61 } if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_20 break; case 67: PIXEL00_11 PIXEL01_21 if ( !skiplastline ) PIXEL10_21 if ( !skiplastline ) PIXEL11_22 break; case 70: PIXEL00_22 PIXEL01_12 if ( !skiplastline ) PIXEL10_21 if ( !skiplastline ) PIXEL11_22 break; case 28: PIXEL00_21 PIXEL01_11 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_21 break; case 152: PIXEL00_21 PIXEL01_22 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_12 break; case 194: PIXEL00_22 PIXEL01_21 if ( !skiplastline ) PIXEL10_21 if ( !skiplastline ) PIXEL11_11 break; case 98: PIXEL00_22 PIXEL01_21 if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_22 break; case 56: PIXEL00_21 PIXEL01_22 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_21 break; case 25: PIXEL00_12 PIXEL01_22 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_21 break; case 26: case 31: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_21 break; case 82: case 214: PIXEL00_22 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_21 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 88: case 248: PIXEL00_21 PIXEL01_22 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 74: case 107: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } PIXEL01_21 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_22 break; case 27: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } PIXEL01_10 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_21 break; case 86: PIXEL00_22 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_21 if ( !skiplastline ) PIXEL11_10 break; case 216: PIXEL00_21 PIXEL01_22 if ( !skiplastline ) PIXEL10_10 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 106: PIXEL00_10 PIXEL01_21 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_22 break; case 30: PIXEL00_10 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_21 break; case 210: PIXEL00_22 PIXEL01_10 if ( !skiplastline ) PIXEL10_21 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 120: PIXEL00_21 PIXEL01_22 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_10 break; case 75: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } PIXEL01_21 if ( !skiplastline ) PIXEL10_10 if ( !skiplastline ) PIXEL11_22 break; case 29: PIXEL00_12 PIXEL01_11 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_21 break; case 198: PIXEL00_22 PIXEL01_12 if ( !skiplastline ) PIXEL10_21 if ( !skiplastline ) PIXEL11_11 break; case 184: PIXEL00_21 PIXEL01_22 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_12 break; case 99: PIXEL00_11 PIXEL01_21 if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_22 break; case 57: PIXEL00_12 PIXEL01_22 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_21 break; case 71: PIXEL00_11 PIXEL01_12 if ( !skiplastline ) PIXEL10_21 if ( !skiplastline ) PIXEL11_22 break; case 156: PIXEL00_21 PIXEL01_11 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_12 break; case 226: PIXEL00_22 PIXEL01_21 if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_11 break; case 60: PIXEL00_21 PIXEL01_11 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_21 break; case 195: PIXEL00_11 PIXEL01_21 if ( !skiplastline ) PIXEL10_21 if ( !skiplastline ) PIXEL11_11 break; case 102: PIXEL00_22 PIXEL01_12 if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_22 break; case 153: PIXEL00_12 PIXEL01_22 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_12 break; case 58: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_21 break; case 83: PIXEL00_11 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( !skiplastline ) PIXEL10_21 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 92: PIXEL00_21 PIXEL01_11 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 202: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } PIXEL01_21 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( !skiplastline ) PIXEL11_11 break; case 78: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } PIXEL01_12 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( !skiplastline ) PIXEL11_22 break; case 154: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_12 break; case 114: PIXEL00_22 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( !skiplastline ) PIXEL10_12 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 89: PIXEL00_12 PIXEL01_22 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 90: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 55: case 23: if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL00_11 PIXEL01_0 } else { PIXEL00_60 PIXEL01_90 } if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_21 break; case 182: case 150: PIXEL00_22 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 if ( !skiplastline ) PIXEL11_12 } else { PIXEL01_90 if ( !skiplastline ) PIXEL11_61 } if ( !skiplastline ) PIXEL10_20 break; case 213: case 212: PIXEL00_20 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { PIXEL01_11 if ( !skiplastline ) PIXEL11_0 } else { PIXEL01_60 if ( !skiplastline ) PIXEL11_90 } if ( !skiplastline ) PIXEL10_21 break; case 241: case 240: PIXEL00_20 PIXEL01_22 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL10_61 if ( !skiplastline ) PIXEL11_90 } break; case 236: case 232: PIXEL00_21 PIXEL01_20 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 if ( !skiplastline ) PIXEL11_11 } else { if ( !skiplastline ) PIXEL10_90 if ( !skiplastline ) PIXEL11_60 } break; case 109: case 105: if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { PIXEL00_12 if ( !skiplastline ) PIXEL10_0 } else { PIXEL00_61 if ( !skiplastline ) PIXEL10_90 } PIXEL01_20 if ( !skiplastline ) PIXEL11_22 break; case 171: case 43: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 if ( !skiplastline ) PIXEL10_11 } else { PIXEL00_90 if ( !skiplastline ) PIXEL10_60 } PIXEL01_21 if ( !skiplastline ) PIXEL11_20 break; case 143: case 15: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 PIXEL01_12 } else { PIXEL00_90 PIXEL01_61 } if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_20 break; case 124: PIXEL00_21 PIXEL01_11 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_10 break; case 203: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } PIXEL01_21 if ( !skiplastline ) PIXEL10_10 if ( !skiplastline ) PIXEL11_11 break; case 62: PIXEL00_10 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_21 break; case 211: PIXEL00_11 PIXEL01_10 if ( !skiplastline ) PIXEL10_21 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 118: PIXEL00_22 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_10 break; case 217: PIXEL00_12 PIXEL01_22 if ( !skiplastline ) PIXEL10_10 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 110: PIXEL00_10 PIXEL01_12 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_22 break; case 155: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } PIXEL01_10 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_12 break; case 188: PIXEL00_21 PIXEL01_11 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_12 break; case 185: PIXEL00_12 PIXEL01_22 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_12 break; case 61: PIXEL00_12 PIXEL01_11 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_21 break; case 157: PIXEL00_12 PIXEL01_11 if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_12 break; case 103: PIXEL00_11 PIXEL01_12 if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_22 break; case 227: PIXEL00_11 PIXEL01_21 if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_11 break; case 230: PIXEL00_22 PIXEL01_12 if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_11 break; case 199: PIXEL00_11 PIXEL01_12 if ( !skiplastline ) PIXEL10_21 if ( !skiplastline ) PIXEL11_11 break; case 220: PIXEL00_21 PIXEL01_11 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 158: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_12 break; case 234: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } PIXEL01_21 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_11 break; case 242: PIXEL00_22 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( !skiplastline ) PIXEL10_12 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 59: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_21 break; case 121: PIXEL00_12 PIXEL01_22 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 87: PIXEL00_11 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_21 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 79: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } PIXEL01_12 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( !skiplastline ) PIXEL11_22 break; case 122: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 94: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 218: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 91: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 229: PIXEL00_20 PIXEL01_20 if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_11 break; case 167: PIXEL00_11 PIXEL01_12 if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_20 break; case 173: PIXEL00_12 PIXEL01_20 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_20 break; case 181: PIXEL00_20 PIXEL01_11 if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_12 break; case 186: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_12 break; case 115: PIXEL00_11 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( !skiplastline ) PIXEL10_12 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 93: PIXEL00_12 PIXEL01_11 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 206: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } PIXEL01_12 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( !skiplastline ) PIXEL11_11 break; case 205: case 201: PIXEL00_12 PIXEL01_20 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_10 } else { if ( !skiplastline ) PIXEL10_70 } if ( !skiplastline ) PIXEL11_11 break; case 174: case 46: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_10 } else { PIXEL00_70 } PIXEL01_12 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_20 break; case 179: case 147: PIXEL00_11 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_10 } else { PIXEL01_70 } if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_12 break; case 117: case 116: PIXEL00_20 PIXEL01_11 if ( !skiplastline ) PIXEL10_12 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_10 } else { if ( !skiplastline ) PIXEL11_70 } break; case 189: PIXEL00_12 PIXEL01_11 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_12 break; case 231: PIXEL00_11 PIXEL01_12 if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_11 break; case 126: PIXEL00_10 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_10 break; case 219: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } PIXEL01_10 if ( !skiplastline ) PIXEL10_10 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 125: if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { PIXEL00_12 if ( !skiplastline ) PIXEL10_0 } else { PIXEL00_61 if ( !skiplastline ) PIXEL10_90 } PIXEL01_11 if ( !skiplastline ) PIXEL11_10 break; case 221: PIXEL00_12 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { PIXEL01_11 if ( !skiplastline ) PIXEL11_0 } else { PIXEL01_60 if ( !skiplastline ) PIXEL11_90 } if ( !skiplastline ) PIXEL10_10 break; case 207: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 PIXEL01_12 } else { PIXEL00_90 PIXEL01_61 } if ( !skiplastline ) PIXEL10_10 if ( !skiplastline ) PIXEL11_11 break; case 238: PIXEL00_10 PIXEL01_12 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 if ( !skiplastline ) PIXEL11_11 } else { if ( !skiplastline ) PIXEL10_90 if ( !skiplastline ) PIXEL11_60 } break; case 190: PIXEL00_10 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 if ( !skiplastline ) PIXEL11_12 } else { PIXEL01_90 if ( !skiplastline ) PIXEL11_61 } if ( !skiplastline ) PIXEL10_11 break; case 187: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 if ( !skiplastline ) PIXEL10_11 } else { PIXEL00_90 if ( !skiplastline ) PIXEL10_60 } PIXEL01_10 if ( !skiplastline ) PIXEL11_12 break; case 243: PIXEL00_11 PIXEL01_10 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL10_61 if ( !skiplastline ) PIXEL11_90 } break; case 119: if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL00_11 PIXEL01_0 } else { PIXEL00_60 PIXEL01_90 } if ( !skiplastline ) PIXEL10_12 if ( !skiplastline ) PIXEL11_10 break; case 237: case 233: PIXEL00_12 PIXEL01_20 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_100 } if ( !skiplastline ) PIXEL11_11 break; case 175: case 47: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_100 } PIXEL01_12 if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_20 break; case 183: case 151: PIXEL00_11 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_100 } if ( !skiplastline ) PIXEL10_20 if ( !skiplastline ) PIXEL11_12 break; case 245: case 244: PIXEL00_20 PIXEL01_11 if ( !skiplastline ) PIXEL10_12 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_100 } break; case 250: PIXEL00_10 PIXEL01_10 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 123: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } PIXEL01_10 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_10 break; case 95: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_10 if ( !skiplastline ) PIXEL11_10 break; case 222: PIXEL00_10 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_10 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 252: PIXEL00_21 PIXEL01_11 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_100 } break; case 249: PIXEL00_12 PIXEL01_22 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_100 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 235: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } PIXEL01_21 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_100 } if ( !skiplastline ) PIXEL11_11 break; case 111: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_100 } PIXEL01_12 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_22 break; case 63: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_100 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_21 break; case 159: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_100 } if ( !skiplastline ) PIXEL10_22 if ( !skiplastline ) PIXEL11_12 break; case 215: PIXEL00_11 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_100 } if ( !skiplastline ) PIXEL10_21 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 246: PIXEL00_22 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( !skiplastline ) PIXEL10_12 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_100 } break; case 254: PIXEL00_10 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_100 } break; case 253: PIXEL00_12 PIXEL01_11 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_100 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_100 } break; case 251: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } PIXEL01_10 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_100 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 239: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_100 } PIXEL01_12 if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_100 } if ( !skiplastline ) PIXEL11_11 break; case 127: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_100 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_20 } if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_20 } if ( !skiplastline ) PIXEL11_10 break; case 191: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_100 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_100 } if ( !skiplastline ) PIXEL10_11 if ( !skiplastline ) PIXEL11_12 break; case 223: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_20 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_100 } if ( !skiplastline ) PIXEL10_10 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_20 } break; case 247: PIXEL00_11 if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_100 } if ( !skiplastline ) PIXEL10_12 if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_100 } break; case 255: if ( diffYUV( YUV( 4 ), YUV( 2 ) ) ) { PIXEL00_0 } else { PIXEL00_100 } if ( diffYUV( YUV( 2 ), YUV( 6 ) ) ) { PIXEL01_0 } else { PIXEL01_100 } if ( diffYUV( YUV( 8 ), YUV( 4 ) ) ) { if ( !skiplastline ) PIXEL10_0 } else { if ( !skiplastline ) PIXEL10_100 } if ( diffYUV( YUV( 6 ), YUV( 8 ) ) ) { if ( !skiplastline ) PIXEL11_0 } else { if ( !skiplastline ) PIXEL11_100 } break; } } /* --------------------------------------------------------------------------- */ void InitLUT() { int r, g, b; int Y, u, v; int color; // Allocate the YUV/LUT buffers on the fly if needed. if ( RGBtoYUV == 0 ) RGBtoYUV = ( uint32_t * )malloc( 65536 * sizeof( uint32_t ) ); if ( LUT16to32 == 0 ) LUT16to32 = ( uint32_t * )malloc( 65536 * sizeof( uint32_t ) ); for ( color = 0; color < 65536; ++color ) { r = (( color & sys_pixel_format->Rmask ) >> sys_pixel_format->Rshift ) << sys_pixel_format->Rloss; g = (( color & sys_pixel_format->Gmask ) >> sys_pixel_format->Gshift ) << sys_pixel_format->Gloss; b = (( color & sys_pixel_format->Bmask ) >> sys_pixel_format->Bshift ) << sys_pixel_format->Bloss; LUT16to32[color] = ( r << 16 ) | ( g << 8 ) | b; Y = ( r + g + b ) >> 2; u = 128 + (( r - b ) >> 2 ); v = 128 + (( -r + 2 * g - b ) >> 3 ); RGBtoYUV[color] = ( Y << 16 ) | ( u << 8 ) | v; } } /* --------------------------------------------------------------------------- */ void hq2x( uint8_t *srcPtr, uint32_t srcPitch, uint8_t *dstPtr, uint32_t dstPitch, int width, int height ) { register int w1, w2, w3, w4, w5, w6, w7, w8, w9; const uint32_t nextlineSrc = srcPitch / sizeof( uint16_t ); uint16_t *p = ( uint16_t * )srcPtr; const uint32_t nextlineDst = dstPitch / sizeof( uint16_t ); uint16_t *q = ( uint16_t * )dstPtr; int tmpWidth; if ( !hq2xinited ) { InitLUT(); hq2xinited = 1; } // +----+----+----+ // | | | | // | w1 | w2 | w3 | // +----+----+----+ // | | | | // | w4 | w5 | w6 | // +----+----+----+ // | | | | // | w7 | w8 | w9 | // +----+----+----+ /********************* Primera fila **************************/ w1 = 0; w4 = 0; w7 = 0; w2 = 0; w5 = *( p ); w8 = *( p + nextlineSrc ); tmpWidth = width - 1; while ( tmpWidth-- ) { p++; w3 = 0; w6 = *( p ); w9 = *( p + nextlineSrc ); hq2x_main( w1, w2, w3, w4, w5, w6, w7, w8, w9, nextlineSrc, nextlineDst, p, q, 0 ); w1 = w2; w4 = w5; w7 = w8; w2 = w3; w5 = w6; w8 = w9; q += 2; } /* Ultima columna de la primera fila */ p++; w3 = 0; w6 = 0; w9 = 0; hq2x_main( w1, w2, w3, w4, w5, w6, w7, w8, w9, nextlineSrc, nextlineDst, p, q, 0 ); w1 = w2; w4 = w5; w7 = w8; w2 = w3; w5 = w6; w8 = w9; q += 2; /* Proxima linea */ p += nextlineSrc - width; q += ( nextlineDst - width ) * 2; height -= 2; /********************* cuerpo principal **************************/ while ( height-- ) { // w1 = *(p - 1 - nextlineSrc); w4 = *(p - 1); w7 = *(p - 1 + nextlineSrc); w1 = 0; w4 = 0; w7 = 0; w2 = *( p - nextlineSrc ); w5 = *( p ); w8 = *( p + nextlineSrc ); tmpWidth = width - 1; while ( tmpWidth-- ) { p++; w3 = *( p - nextlineSrc ); w6 = *( p ); w9 = *( p + nextlineSrc ); hq2x_main( w1, w2, w3, w4, w5, w6, w7, w8, w9, nextlineSrc, nextlineDst, p, q, 0 ); w1 = w2; w4 = w5; w7 = w8; w2 = w3; w5 = w6; w8 = w9; q += 2; } /* Ultima columna de la fila N */ p++; w3 = 0; w6 = 0; w9 = 0; hq2x_main( w1, w2, w3, w4, w5, w6, w7, w8, w9, nextlineSrc, nextlineDst, p, q, 0 ); w1 = w2; w4 = w5; w7 = w8; w2 = w3; w5 = w6; w8 = w9; q += 2; p += nextlineSrc - width; q += ( nextlineDst - width ) * 2; } /********************* ultima linea **************************/ w1 = 0; w4 = 0; w7 = 0; w2 = *( p - nextlineSrc ); w5 = *( p ); w8 = 0; tmpWidth = width - 1; while ( tmpWidth-- ) { p++; w3 = *( p - nextlineSrc ); w6 = *( p ); w9 = 0; hq2x_main( w1, w2, w3, w4, w5, w6, w7, w8, w9, nextlineSrc, nextlineDst, p, q, 0 ); w1 = w2; w4 = w5; w7 = w8; w2 = w3; w5 = w6; w8 = w9; q += 2; } /* Ultima columna de la utima fila */ p++; w3 = 0; w6 = 0; w9 = 0; hq2x_main( w1, w2, w3, w4, w5, w6, w7, w8, w9, nextlineSrc, nextlineDst, p, q, 1 ); } /* --------------------------------------------------------------------------- */