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