From db96f7a0b60d664a7eee642eda8e50b6ce253bb8 Mon Sep 17 00:00:00 2001 From: rogerman Date: Fri, 28 Dec 2012 03:25:20 +0000 Subject: [PATCH] Video Filters: - Fix off-by-one line bug in HQ4x filter. - Add new HQ4xS filter. --- desmume/src/filter/filter.h | 5 +- desmume/src/filter/hq4x.cpp | 205 ++++++++++++++++++++++++++++++++---- 2 files changed, 189 insertions(+), 21 deletions(-) diff --git a/desmume/src/filter/filter.h b/desmume/src/filter/filter.h index a3900f563..1d33b8d77 100644 --- a/desmume/src/filter/filter.h +++ b/desmume/src/filter/filter.h @@ -1,5 +1,5 @@ /* -Copyright (C) 2009-2011 DeSmuME team +Copyright (C) 2009-2012 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -13,7 +13,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . -*/ +*/ typedef struct { @@ -28,6 +28,7 @@ void RenderLQ2X (SSurface Src, SSurface Dst); void RenderLQ2XS (SSurface Src, SSurface Dst); void RenderHQ2X (SSurface Src, SSurface Dst); void RenderHQ4X (SSurface Src, SSurface Dst); +void RenderHQ4XS (SSurface Src, SSurface Dst); void RenderHQ2XS (SSurface Src, SSurface Dst); void Render2xSaI (SSurface Src, SSurface Dst); void RenderSuper2xSaI (SSurface Src, SSurface Dst); diff --git a/desmume/src/filter/hq4x.cpp b/desmume/src/filter/hq4x.cpp index 967902934..857ec48d1 100644 --- a/desmume/src/filter/hq4x.cpp +++ b/desmume/src/filter/hq4x.cpp @@ -39,7 +39,9 @@ */ -void hq4x_32_def(u32* dst0, u32* dst1, u32* dst2, u32* dst3, const u32* src0, const u32* src1, const u32* src2, unsigned count, unsigned flag) +void hq4x_32_def(u32* dst0, u32* dst1, u32* dst2, u32* dst3, + const u32* src0, const u32* src1, const u32* src2, + unsigned count, unsigned flag) { unsigned i; @@ -111,25 +113,190 @@ void hq4x_32_def(u32* dst0, u32* dst1, u32* dst2, u32* dst3, const u32* src0, co } } +void hq4xS_32_def(u32* dst0, u32* dst1, u32* dst2, u32* dst3, + const u32* src0, const u32* src1, const u32* src2, + unsigned count, unsigned flag) +{ + unsigned i; + + for(i=0;i> 8; + const int r = (int)((c[j] & 0xF80000)) >> 16; + const int bright = r+r+r + g+g+g + b+b; + if(bright > maxBright) maxBright = bright; + if(bright < minBright) minBright = bright; + + brightArray[j] = bright; + } + unsigned int diffBright = ((maxBright - minBright) * 7) >> 4; + if(diffBright > 7) + { + 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 P(a, b) dst##b[a] +#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 I1(p0) c[p0] +#define I2(i0, i1, p0, p1) interp_32_##i0##i1(c[p0], c[p1]) +#define I3(i0, i1, i2, p0, p1, p2) interp_32_##i0##i1##i2(c[p0], c[p1], c[p2]) + + switch (mask) { +#include "hq4x.dat" + } + +#undef P +#undef MUR +#undef MDR +#undef MDL +#undef MUL +#undef I1 +#undef I2 +#undef I3 + + src0 += 1; + src1 += 1; + src2 += 1; + dst0 += 4; + dst1 += 4; + dst2 += 4; + dst3 += 4; + } +} + +void hq4x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, + u8 *dstPtr, u32 dstPitch, int width, int height) +{ + u32 *dst0 = (u32 *)dstPtr; + u32 *dst1 = dst0 + (dstPitch >> 2); + u32 *dst2 = dst1 + (dstPitch >> 2); + u32 *dst3 = dst2 + (dstPitch >> 2); + + u32 *src0 = (u32 *)srcPtr; + u32 *src1 = src0 + (srcPitch >> 2); + u32 *src2 = src1 + (srcPitch >> 2); + hq4x_32_def(dst0, dst1, dst2, dst3, src0, src0, src1, width, 0); + + int count = height; + + count -= 2; + while(count) { + dst0 += dstPitch; + dst1 += dstPitch; + dst2 += dstPitch; + dst3 += dstPitch; + hq4x_32_def(dst0, dst1, dst2, dst3, src0, src1, src2, width, 0); + src0 = src1; + src1 = src2; + src2 += srcPitch >> 2; + --count; + } + + dst0 += dstPitch; + dst1 += dstPitch; + dst2 += dstPitch; + dst3 += dstPitch; + hq4x_32_def(dst0, dst1, dst2, dst3, src0, src1, src1, width, 0); +} + +void hq4x32S(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, + u8 *dstPtr, u32 dstPitch, int width, int height) +{ + u32 *dst0 = (u32 *)dstPtr; + u32 *dst1 = dst0 + (dstPitch >> 2); + u32 *dst2 = dst1 + (dstPitch >> 2); + u32 *dst3 = dst2 + (dstPitch >> 2); + + u32 *src0 = (u32 *)srcPtr; + u32 *src1 = src0 + (srcPitch >> 2); + u32 *src2 = src1 + (srcPitch >> 2); + hq4xS_32_def(dst0, dst1, dst2, dst3, src0, src0, src1, width, 0); + + int count = height; + + count -= 2; + while(count) { + dst0 += dstPitch; + dst1 += dstPitch; + dst2 += dstPitch; + dst3 += dstPitch; + hq4xS_32_def(dst0, dst1, dst2, dst3, src0, src1, src2, width, 0); + src0 = src1; + src1 = src2; + src2 += srcPitch >> 2; + --count; + } + + dst0 += dstPitch; + dst1 += dstPitch; + dst2 += dstPitch; + dst3 += dstPitch; + hq4xS_32_def(dst0, dst1, dst2, dst3, src0, src1, src1, width, 0); +} void RenderHQ4X (SSurface Src, SSurface Dst) { - - u32 *lpSrc, *lpDst; - - lpSrc = (u32*)Src.Surface; - lpDst = (u32*)Dst.Surface; - - int dp = Dst.Pitch/2; - int sp = Src.Pitch/2; - for(int i=0;i