Core/intf/video/scalers/hq2xs.cpp
/*
 * This effect is derived from the hq2x effect made by Maxim Stepin
 */
This effect is derived from the hq2x effect made by Maxim Stepin
This effect is derived from the hq2x effect made by Maxim Stepin
static void hq2xS_16_def(u16* dst0, u16* dst1, const u16* src0, const u16* src1, const u16* src2, unsigned count)
{
  unsigned i;
  for(i=0;i<count;++i) {
    unsigned char mask;
    u16 c[9];
    c[1] = src0[0];
    c[4] = src1[0];
    c[7] = src2[0];
    c[0] = src0[-1];
    c[3] = src1[-1];
    c[6] = src2[-1];
    c[2] = src0[1];
    c[5] = src1[1];
    c[8] = src2[1];
	mask = 0;
	int brightArray[9];
	int maxBright = 0, minBright = 999999;
	for(int j = 0 ; j < 9 ; j++)
	{
		int r,g,b;
		if (interp_bits_per_pixel == 16) {
			b = (int)((c[j] & 0x1F)) << 3;
			g = (int)((c[j] & 0x7E0)) >> 3;
			r = (int)((c[j] & 0xF800)) >> 8;
		} else {
			b = (int)((c[j] & 0x1F)) << 3;
			g = (int)((c[j] & 0x3E0)) >> 2;
			r = (int)((c[j] & 0x7C00)) >> 7;
		}
		const int bright = r+r+r + g+g+g + b+b;
		if(bright > maxBright) maxBright = bright;
		if(bright < minBright) minBright = bright;
		brightArray[j] = bright;
	}
	int diffBright = ((maxBright - minBright) * 7) >> 4;
	if(diffBright > 7)
	{
		#define ABS(x) ((x) < 0 ? -(x) : (x))
		const int centerBright = brightArray[4];
		if(ABS(brightArray[0] - centerBright) > diffBright)
			mask |= 1 << 0;
		if(ABS(brightArray[1] - centerBright) > diffBright)
			mask |= 1 << 1;
		if(ABS(brightArray[2] - centerBright) > diffBright)
			mask |= 1 << 2;
		if(ABS(brightArray[3] - centerBright) > diffBright)
			mask |= 1 << 3;
		if(ABS(brightArray[5] - centerBright) > diffBright)
			mask |= 1 << 4;
		if(ABS(brightArray[6] - centerBright) > diffBright)
			mask |= 1 << 5;
		if(ABS(brightArray[7] - centerBright) > diffBright)
			mask |= 1 << 6;
		if(ABS(brightArray[8] - centerBright) > diffBright)
			mask |= 1 << 7;
	}
#define P0 dst0[0]
#define P1 dst0[1]
#define P2 dst1[0]
#define P3 dst1[1]
#define MUR false//(ABS(brightArray[1] - brightArray[5]) > diffBright) // top-right
#define MDR false//(ABS(brightArray[5] - brightArray[7]) > diffBright) // bottom-right
#define MDL false//(ABS(brightArray[7] - brightArray[3]) > diffBright) // bottom-left
#define MUL false//(ABS(brightArray[3] - brightArray[1]) > diffBright) // top-left
#define IC(p0) c[p0]
#define I11(p0,p1) interp_16_11(c[p0], c[p1])
#define I211(p0,p1,p2) interp_16_211(c[p0], c[p1], c[p2])
#define I31(p0,p1) interp_16_31(c[p0], c[p1])
#define I332(p0,p1,p2) interp_16_332(c[p0], c[p1], c[p2])
#define I431(p0,p1,p2) interp_16_431(c[p0], c[p1], c[p2])
#define I521(p0,p1,p2) interp_16_521(c[p0], c[p1], c[p2])
#define I53(p0,p1) interp_16_53(c[p0], c[p1])
#define I611(p0,p1,p2) interp_16_611(c[p0], c[p1], c[p2])
#define I71(p0,p1) interp_16_71(c[p0], c[p1])
#define I772(p0,p1,p2) interp_16_772(c[p0], c[p1], c[p2])
#define I97(p0,p1) interp_16_97(c[p0], c[p1])
#define I1411(p0,p1,p2) interp_16_1411(c[p0], c[p1], c[p2])
#define I151(p0,p1) interp_16_151(c[p0], c[p1])
    switch (mask) {
#include "hq2xs.h"
    }
#undef P0
#undef P1
#undef P2
#undef P3
#undef MUR
#undef MDR
#undef MDL
#undef MUL
#undef IC
#undef I11
#undef I211
#undef I31
#undef I332
#undef I431
#undef I521
#undef I53
#undef I611
#undef I71
#undef I772
#undef I97
#undef I1411
#undef I151
    src0 += 1;
    src1 += 1;
    src2 += 1;
    dst0 += 2;
    dst1 += 2;
  }
}
static void hq2xS_16_def ( u16 * dst0 , u16 * dst1 , const u16 * src0 , const u16 * src1 , const u16 * src2 , unsigned count ) { unsigned i ; for ( i = 0 ; i < count ; ++ i ) { unsigned char mask ; u16 c [ 9 ] ; c [ 1 ] = src0 [ 0 ] ; c [ 4 ] = src1 [ 0 ] ; c [ 7 ] = src2 [ 0 ] ; c [ 0 ] = src0 [ -1 ] ; c [ 3 ] = src1 [ -1 ] ; c [ 6 ] = src2 [ -1 ] ; c [ 2 ] = src0 [ 1 ] ; c [ 5 ] = src1 [ 1 ] ; c [ 8 ] = src2 [ 1 ] ; mask = 0 ; int brightArray [ 9 ] ; int maxBright = 0 , minBright = 999999 ; for ( int j = 0 ; j < 9 ; j ++ ) { int r , g , b ; if ( interp_bits_per_pixel == 16 ) { b = ( int ) ( ( c [ j ] & 0x1F ) ) << 3 ; g = ( int ) ( ( c [ j ] & 0x7E0 ) ) >> 3 ; r = ( int ) ( ( c [ j ] & 0xF800 ) ) >> 8 ; } else { b = ( int ) ( ( c [ j ] & 0x1F ) ) << 3 ; g = ( int ) ( ( c [ j ] & 0x3E0 ) ) >> 2 ; r = ( int ) ( ( c [ j ] & 0x7C00 ) ) >> 7 ; } const int bright = r + r + r + g + g + g + b + b ; if ( bright > maxBright ) maxBright = bright ; if ( bright < minBright ) minBright = bright ; brightArray [ j ] = bright ; } int diffBright = ( ( maxBright - minBright ) * 7 ) >> 4 ; if ( diffBright > 7 ) { #define ABS ( x )  ((x) < 0 ? -(x) : (x)) const int centerBright = brightArray [ 4 ] ; if ( ABS ( brightArray [ 0 ] - centerBright ) > diffBright ) mask |= 1 << 0 ; if ( ABS ( brightArray [ 1 ] - centerBright ) > diffBright ) mask |= 1 << 1 ; if ( ABS ( brightArray [ 2 ] - centerBright ) > diffBright ) mask |= 1 << 2 ; if ( ABS ( brightArray [ 3 ] - centerBright ) > diffBright ) mask |= 1 << 3 ; if ( ABS ( brightArray [ 5 ] - centerBright ) > diffBright ) mask |= 1 << 4 ; if ( ABS ( brightArray [ 6 ] - centerBright ) > diffBright ) mask |= 1 << 5 ; if ( ABS ( brightArray [ 7 ] - centerBright ) > diffBright ) mask |= 1 << 6 ; if ( ABS ( brightArray [ 8 ] - centerBright ) > diffBright ) mask |= 1 << 7 ; } #define P0  dst0[0] #define P1  dst0[1] #define P2  dst1[0] #define P3  dst1[1] #define MUR  false//(ABS(brightArray[1] - brightArray[5]) > diffBright) // top-right #define MDR  false//(ABS(brightArray[5] - brightArray[7]) > diffBright) // bottom-right #define MDL  false//(ABS(brightArray[7] - brightArray[3]) > diffBright) // bottom-left #define MUL  false//(ABS(brightArray[3] - brightArray[1]) > diffBright) // top-left #define IC ( p0 )  c[p0] #define I11 ( p0 , p1 )  interp_16_11(c[p0], c[p1]) #define I211 ( p0 , p1 , p2 )  interp_16_211(c[p0], c[p1], c[p2]) #define I31 ( p0 , p1 )  interp_16_31(c[p0], c[p1]) #define I332 ( p0 , p1 , p2 )  interp_16_332(c[p0], c[p1], c[p2]) #define I431 ( p0 , p1 , p2 )  interp_16_431(c[p0], c[p1], c[p2]) #define I521 ( p0 , p1 , p2 )  interp_16_521(c[p0], c[p1], c[p2]) #define I53 ( p0 , p1 )  interp_16_53(c[p0], c[p1]) #define I611 ( p0 , p1 , p2 )  interp_16_611(c[p0], c[p1], c[p2]) #define I71 ( p0 , p1 )  interp_16_71(c[p0], c[p1]) #define I772 ( p0 , p1 , p2 )  interp_16_772(c[p0], c[p1], c[p2]) #define I97 ( p0 , p1 )  interp_16_97(c[p0], c[p1]) #define I1411 ( p0 , p1 , p2 )  interp_16_1411(c[p0], c[p1], c[p2]) #define I151 ( p0 , p1 )  interp_16_151(c[p0], c[p1]) switch ( mask ) { #include " " } #undef  P0 #undef  P1 #undef  P2 #undef  P3 #undef  MUR #undef  MDR #undef  MDL #undef  MUL #undef  IC #undef  I11 #undef  I211 #undef  I31 #undef  I332 #undef  I431 #undef  I521 #undef  I53 #undef  I611 #undef  I71 #undef  I772 #undef  I97 #undef  I1411 #undef  I151 src0 += 1 ; src1 += 1 ; src2 += 1 ; dst0 += 2 ; dst1 += 2 ; } }
This effect is derived from the hq2x effect made by Maxim Stepin
This effect is derived from the hq2x effect made by Maxim Stepin
// hq2xS dynamic edge detection: // simply comparing the center color against its surroundings will give bad results in many cases, // so, instead, compare the center color relative to the max difference in brightness of this 3x3 block