add that lq2x and hx2xs patch #2852221 and also fix a bug in the new ioregview which prevented it from compiling on older windows sdks
This commit is contained in:
parent
91f19f2521
commit
d3d573d777
|
@ -32,9 +32,11 @@ Graphics:
|
|||
|
||||
Windows:
|
||||
bug: improve map view tool to support more modes
|
||||
enh: added 2x resizing filters (hq2x, 2xsai, supereagle, scanlines)
|
||||
enh: added 2x resizing filters (hq2x, hq2xs, lq2x, lq2xs, 2xsai, supereagle)
|
||||
(scanlines, nearest, bilinear)
|
||||
enh: soundview can now mute channels
|
||||
enh: multicore optimization for filters, rotation, OSD
|
||||
enh: new ioregview
|
||||
|
||||
Linux:
|
||||
enh: alsa microphone support
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<?xml version="1.0" encoding="shift_jis"?>
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
|
@ -922,6 +922,22 @@
|
|||
RelativePath=".\filter\hq2x.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\filter\hq2x.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\filter\interp.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\filter\lq2x.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\filter\lq2x.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\filter\scanline.cpp"
|
||||
>
|
||||
|
|
|
@ -1243,6 +1243,10 @@
|
|||
RelativePath=".\filter\hq2x.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\filter\lq2x.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\filter\scanline.cpp"
|
||||
>
|
||||
|
|
|
@ -27,6 +27,12 @@
|
|||
#include "../MMU.h"
|
||||
#include "../armcpu.h"
|
||||
|
||||
//this message is only supported in vista so folks sdk might not have it.
|
||||
//therefore we shall declare it here
|
||||
#ifndef RB_SETBANDWIDTH
|
||||
#define RB_SETBANDWIDTH (WM_USER + 44) // set width for docked band
|
||||
#endif
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
enum EIORegType
|
||||
|
|
|
@ -15,17 +15,20 @@
|
|||
You should have received a copy of the GNU General Public License
|
||||
along with DeSmuME; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
struct SSurface {
|
||||
unsigned char *Surface;
|
||||
|
||||
unsigned int Pitch;
|
||||
*/
|
||||
|
||||
struct SSurface {
|
||||
unsigned char *Surface;
|
||||
|
||||
unsigned int Pitch;
|
||||
unsigned int Width, Height;
|
||||
};
|
||||
|
||||
void RenderNearest2X (SSurface Src, SSurface Dst);
|
||||
void RenderLQ2X (SSurface Src, SSurface Dst);
|
||||
void RenderLQ2XS (SSurface Src, SSurface Dst);
|
||||
void RenderHQ2X (SSurface Src, SSurface Dst);
|
||||
void RenderHQ2XS (SSurface Src, SSurface Dst);
|
||||
void Render2xSaI (SSurface Src, SSurface Dst);
|
||||
void RenderSuper2xSaI (SSurface Src, SSurface Dst);
|
||||
void RenderSuperEagle (SSurface Src, SSurface Dst);
|
||||
|
|
|
@ -273,21 +273,33 @@ static void hq2xS_16_def(u16* dst0, u16* dst1, const u16* src0, const u16* src1,
|
|||
unsigned i;
|
||||
|
||||
for(i=0;i<count;++i) {
|
||||
unsigned char mask;
|
||||
unsigned char mask;
|
||||
|
||||
u16 c[9];
|
||||
u16 c[9];
|
||||
|
||||
c[1] = src0[0];
|
||||
c[4] = src1[0];
|
||||
c[7] = src2[0];
|
||||
c[1] = src0[0];
|
||||
c[4] = src1[0];
|
||||
c[7] = src2[0];
|
||||
|
||||
c[0] = src0[-1];
|
||||
c[3] = src1[-1];
|
||||
c[6] = src2[-1];
|
||||
if (i>0) {
|
||||
c[0] = src0[-1];
|
||||
c[3] = src1[-1];
|
||||
c[6] = src2[-1];
|
||||
} else {
|
||||
c[0] = c[1];
|
||||
c[3] = c[4];
|
||||
c[6] = c[7];
|
||||
}
|
||||
|
||||
c[2] = src0[1];
|
||||
c[5] = src1[1];
|
||||
c[8] = src2[1];
|
||||
if (i<count-1) {
|
||||
c[2] = src0[1];
|
||||
c[5] = src1[1];
|
||||
c[8] = src2[1];
|
||||
} else {
|
||||
c[2] = c[1];
|
||||
c[5] = c[4];
|
||||
c[8] = c[7];
|
||||
}
|
||||
|
||||
mask = 0;
|
||||
|
||||
|
@ -400,25 +412,36 @@ static void hq2xS_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1,
|
|||
{
|
||||
unsigned i;
|
||||
|
||||
for(i=0;i<count;++i) {
|
||||
unsigned char mask;
|
||||
for(i=0;i<count;++i) {
|
||||
unsigned char mask;
|
||||
|
||||
u32 c[9];
|
||||
u32 c[9];
|
||||
|
||||
c[1] = src0[0];
|
||||
c[4] = src1[0];
|
||||
c[7] = src2[0];
|
||||
c[1] = src0[0];
|
||||
c[4] = src1[0];
|
||||
c[7] = src2[0];
|
||||
|
||||
c[0] = src0[-1];
|
||||
c[3] = src1[-1];
|
||||
c[6] = src2[-1];
|
||||
if (i>0) {
|
||||
c[0] = src0[-1];
|
||||
c[3] = src1[-1];
|
||||
c[6] = src2[-1];
|
||||
} else {
|
||||
c[0] = src0[0];
|
||||
c[3] = src1[0];
|
||||
c[6] = src2[0];
|
||||
}
|
||||
|
||||
c[2] = src0[1];
|
||||
c[5] = src1[1];
|
||||
c[8] = src2[1];
|
||||
if (i<count-1) {
|
||||
c[2] = src0[1];
|
||||
c[5] = src1[1];
|
||||
c[8] = src2[1];
|
||||
} else {
|
||||
c[2] = src0[0];
|
||||
c[5] = src1[0];
|
||||
c[8] = src2[0];
|
||||
}
|
||||
|
||||
mask = 0;
|
||||
|
||||
// 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
|
||||
|
@ -458,7 +481,6 @@ static void hq2xS_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1,
|
|||
if(ABS(brightArray[8] - centerBright) > diffBright)
|
||||
mask |= 1 << 7;
|
||||
}
|
||||
|
||||
#define P0 dst0[0]
|
||||
#define P1 dst0[1]
|
||||
#define P2 dst1[0]
|
||||
|
@ -648,3 +670,16 @@ void RenderHQ2X (SSurface Src, SSurface Dst)
|
|||
lpSrc,
|
||||
lpDst, Dst.Pitch*2 , Src.Width, Src.Height);
|
||||
}
|
||||
|
||||
void RenderHQ2XS (SSurface Src, SSurface Dst)
|
||||
{
|
||||
|
||||
unsigned char *lpSrc, *lpDst;
|
||||
|
||||
lpSrc = Src.Surface;
|
||||
lpDst = Dst.Surface;
|
||||
|
||||
hq2xS32 (lpSrc, Src.Pitch*2,
|
||||
lpSrc,
|
||||
lpDst, Dst.Pitch*2 , Src.Width, Src.Height);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,667 @@
|
|||
/*
|
||||
* This file is part of the Advance project.
|
||||
*
|
||||
* Copyright (C) 2003 Andrea Mazzoleni
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* In addition, as a special exception, Andrea Mazzoleni
|
||||
* gives permission to link the code of this program with
|
||||
* the MAME library (or with modified versions of MAME that use the
|
||||
* same license as MAME), and distribute linked combinations including
|
||||
* the two. You must obey the GNU General Public License in all
|
||||
* respects for all of the code used other than MAME. If you modify
|
||||
* this file, you may extend this exception to your version of the
|
||||
* file, but you are not obligated to do so. If you do not wish to
|
||||
* do so, delete this exception statement from your version.
|
||||
*/
|
||||
|
||||
#include "filter.h"
|
||||
#include "interp.h"
|
||||
|
||||
static void lq2x_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];
|
||||
|
||||
if (i>0) {
|
||||
c[0] = src0[-1];
|
||||
c[3] = src1[-1];
|
||||
c[6] = src2[-1];
|
||||
} else {
|
||||
c[0] = c[1];
|
||||
c[3] = c[4];
|
||||
c[6] = c[7];
|
||||
}
|
||||
|
||||
if (i<count-1) {
|
||||
c[2] = src0[1];
|
||||
c[5] = src1[1];
|
||||
c[8] = src2[1];
|
||||
} else {
|
||||
c[2] = c[1];
|
||||
c[5] = c[4];
|
||||
c[8] = c[7];
|
||||
}
|
||||
|
||||
mask = 0;
|
||||
|
||||
if (c[0] != c[4])
|
||||
mask |= 1 << 0;
|
||||
if (c[1] != c[4])
|
||||
mask |= 1 << 1;
|
||||
if (c[2] != c[4])
|
||||
mask |= 1 << 2;
|
||||
if (c[3] != c[4])
|
||||
mask |= 1 << 3;
|
||||
if (c[5] != c[4])
|
||||
mask |= 1 << 4;
|
||||
if (c[6] != c[4])
|
||||
mask |= 1 << 5;
|
||||
if (c[7] != c[4])
|
||||
mask |= 1 << 6;
|
||||
if (c[8] != c[4])
|
||||
mask |= 1 << 7;
|
||||
|
||||
#define P0 dst0[0]
|
||||
#define P1 dst0[1]
|
||||
#define P2 dst1[0]
|
||||
#define P3 dst1[1]
|
||||
#define MUR (c[1] != c[5])
|
||||
#define MDR (c[5] != c[7])
|
||||
#define MDL (c[7] != c[3])
|
||||
#define MUL (c[3] != c[1])
|
||||
#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 "lq2x.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 lq2xS_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];
|
||||
|
||||
if (i>0) {
|
||||
c[0] = src0[-1];
|
||||
c[3] = src1[-1];
|
||||
c[6] = src2[-1];
|
||||
} else {
|
||||
c[0] = c[1];
|
||||
c[3] = c[4];
|
||||
c[6] = c[7];
|
||||
}
|
||||
|
||||
if (i<count-1) {
|
||||
c[2] = src0[1];
|
||||
c[5] = src1[1];
|
||||
c[8] = src2[1];
|
||||
} else {
|
||||
c[2] = c[1];
|
||||
c[5] = c[4];
|
||||
c[8] = c[7];
|
||||
}
|
||||
|
||||
// lq2xS 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
|
||||
int brightArray[9];
|
||||
int maxBright = 0, minBright = 999999;
|
||||
for(int j = 0 ; j < 9 ; j++)
|
||||
{
|
||||
const int b = (int)((c[j] & 0xF8));
|
||||
const int g = (int)((c[j] & 0xF800)) >> 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;
|
||||
}
|
||||
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
|
||||
#define MDR false
|
||||
#define MDL false
|
||||
#define MUL false
|
||||
#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 "lq2x.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 lq2x_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1, const u32* src2, unsigned count)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for(i=0;i<count;++i) {
|
||||
unsigned char mask;
|
||||
|
||||
u32 c[9];
|
||||
|
||||
c[1] = src0[0];
|
||||
c[4] = src1[0];
|
||||
c[7] = src2[0];
|
||||
|
||||
if (i>0) {
|
||||
c[0] = src0[-1];
|
||||
c[3] = src1[-1];
|
||||
c[6] = src2[-1];
|
||||
} else {
|
||||
c[0] = c[1];
|
||||
c[3] = c[4];
|
||||
c[6] = c[7];
|
||||
}
|
||||
|
||||
if (i<count-1) {
|
||||
c[2] = src0[1];
|
||||
c[5] = src1[1];
|
||||
c[8] = src2[1];
|
||||
} else {
|
||||
c[2] = c[1];
|
||||
c[5] = c[4];
|
||||
c[8] = c[7];
|
||||
}
|
||||
|
||||
mask = 0;
|
||||
|
||||
if (c[0] != c[4])
|
||||
mask |= 1 << 0;
|
||||
if (c[1] != c[4])
|
||||
mask |= 1 << 1;
|
||||
if (c[2] != c[4])
|
||||
mask |= 1 << 2;
|
||||
if (c[3] != c[4])
|
||||
mask |= 1 << 3;
|
||||
if (c[5] != c[4])
|
||||
mask |= 1 << 4;
|
||||
if (c[6] != c[4])
|
||||
mask |= 1 << 5;
|
||||
if (c[7] != c[4])
|
||||
mask |= 1 << 6;
|
||||
if (c[8] != c[4])
|
||||
mask |= 1 << 7;
|
||||
|
||||
#define P0 dst0[0]
|
||||
#define P1 dst0[1]
|
||||
#define P2 dst1[0]
|
||||
#define P3 dst1[1]
|
||||
#define MUR (c[1] != c[5])
|
||||
#define MDR (c[5] != c[7])
|
||||
#define MDL (c[7] != c[3])
|
||||
#define MUL (c[3] != c[1])
|
||||
#define IC(p0) c[p0]
|
||||
#define I11(p0,p1) interp_32_11(c[p0], c[p1])
|
||||
#define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2])
|
||||
#define I31(p0,p1) interp_32_31(c[p0], c[p1])
|
||||
#define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2])
|
||||
#define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2])
|
||||
#define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2])
|
||||
#define I53(p0,p1) interp_32_53(c[p0], c[p1])
|
||||
#define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2])
|
||||
#define I71(p0,p1) interp_32_71(c[p0], c[p1])
|
||||
#define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2])
|
||||
#define I97(p0,p1) interp_32_97(c[p0], c[p1])
|
||||
#define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2])
|
||||
#define I151(p0,p1) interp_32_151(c[p0], c[p1])
|
||||
|
||||
switch (mask) {
|
||||
#include "lq2x.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 lq2xS_32_def(u32* dst0, u32* dst1, const u32* src0, const u32* src1, const u32* src2, unsigned count)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for(i=0;i<count;++i) {
|
||||
unsigned char mask;
|
||||
|
||||
u32 c[9];
|
||||
|
||||
c[1] = src0[0];
|
||||
c[4] = src1[0];
|
||||
c[7] = src2[0];
|
||||
|
||||
if (i>0) {
|
||||
c[0] = src0[-1];
|
||||
c[3] = src1[-1];
|
||||
c[6] = src2[-1];
|
||||
} else {
|
||||
c[0] = c[1];
|
||||
c[3] = c[4];
|
||||
c[6] = c[7];
|
||||
}
|
||||
|
||||
if (i<count-1) {
|
||||
c[2] = src0[1];
|
||||
c[5] = src1[1];
|
||||
c[8] = src2[1];
|
||||
} else {
|
||||
c[2] = c[1];
|
||||
c[5] = c[4];
|
||||
c[8] = c[7];
|
||||
}
|
||||
|
||||
// lq2xS 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
|
||||
int brightArray[9];
|
||||
int maxBright = 0, minBright = 999999;
|
||||
for(int j = 0 ; j < 9 ; j++)
|
||||
{
|
||||
const int b = (int)((c[j] & 0xF8));
|
||||
const int g = (int)((c[j] & 0xF800)) >> 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;
|
||||
}
|
||||
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
|
||||
#define MDR false
|
||||
#define MDL false
|
||||
#define MUL false
|
||||
#define IC(p0) c[p0]
|
||||
#define I11(p0,p1) interp_32_11(c[p0], c[p1])
|
||||
#define I211(p0,p1,p2) interp_32_211(c[p0], c[p1], c[p2])
|
||||
#define I31(p0,p1) interp_32_31(c[p0], c[p1])
|
||||
#define I332(p0,p1,p2) interp_32_332(c[p0], c[p1], c[p2])
|
||||
#define I431(p0,p1,p2) interp_32_431(c[p0], c[p1], c[p2])
|
||||
#define I521(p0,p1,p2) interp_32_521(c[p0], c[p1], c[p2])
|
||||
#define I53(p0,p1) interp_32_53(c[p0], c[p1])
|
||||
#define I611(p0,p1,p2) interp_32_611(c[p0], c[p1], c[p2])
|
||||
#define I71(p0,p1) interp_32_71(c[p0], c[p1])
|
||||
#define I772(p0,p1,p2) interp_32_772(c[p0], c[p1], c[p2])
|
||||
#define I97(p0,p1) interp_32_97(c[p0], c[p1])
|
||||
#define I1411(p0,p1,p2) interp_32_1411(c[p0], c[p1], c[p2])
|
||||
#define I151(p0,p1) interp_32_151(c[p0], c[p1])
|
||||
|
||||
switch (mask) {
|
||||
#include "lq2x.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;
|
||||
}
|
||||
}
|
||||
void lq2x16(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
|
||||
u8 *dstPtr, u32 dstPitch, int width, int height)
|
||||
{
|
||||
u16 *dst0 = (u16 *)dstPtr;
|
||||
u16 *dst1 = dst0 + (dstPitch >> 1);
|
||||
|
||||
u16 *src0 = (u16 *)srcPtr;
|
||||
u16 *src1 = src0 + (srcPitch >> 1);
|
||||
u16 *src2 = src1 + (srcPitch >> 1);
|
||||
|
||||
lq2x_16_def(dst0, dst1, src0, src0, src1, width);
|
||||
if( height == 1 ) return;
|
||||
|
||||
int count = height;
|
||||
|
||||
count -= 2;
|
||||
while(count>0) {
|
||||
dst0 += dstPitch;
|
||||
dst1 += dstPitch;
|
||||
lq2x_16_def(dst0, dst1, src0, src1, src2, width);
|
||||
src0 = src1;
|
||||
src1 = src2;
|
||||
src2 += srcPitch >> 1;
|
||||
--count;
|
||||
}
|
||||
dst0 += dstPitch;
|
||||
dst1 += dstPitch;
|
||||
lq2x_16_def(dst0, dst1, src0, src1, src1, width);
|
||||
}
|
||||
|
||||
void lq2xS16(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
|
||||
u8 *dstPtr, u32 dstPitch, int width, int height)
|
||||
{
|
||||
u16 *dst0 = (u16 *)dstPtr;
|
||||
u16 *dst1 = dst0 + (dstPitch >> 1);
|
||||
|
||||
u16 *src0 = (u16 *)srcPtr;
|
||||
u16 *src1 = src0 + (srcPitch >> 1);
|
||||
u16 *src2 = src1 + (srcPitch >> 1);
|
||||
|
||||
int count;
|
||||
|
||||
lq2xS_16_def(dst0, dst1, src0, src0, src1, width);
|
||||
if( height == 1 ) return;
|
||||
|
||||
count = height;
|
||||
|
||||
count -= 2;
|
||||
while(count>0) {
|
||||
dst0 += dstPitch;
|
||||
dst1 += dstPitch;
|
||||
lq2x_16_def(dst0, dst1, src0, src1, src2, width);
|
||||
src0 = src1;
|
||||
src1 = src2;
|
||||
src2 += srcPitch >> 1;
|
||||
--count;
|
||||
}
|
||||
dst0 += dstPitch;
|
||||
dst1 += dstPitch;
|
||||
lq2xS_16_def(dst0, dst1, src0, src1, src1, width);
|
||||
}
|
||||
|
||||
void lq2x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
|
||||
u8 *dstPtr, u32 dstPitch, int width, int height)
|
||||
{
|
||||
u32 *dst0 = (u32 *)dstPtr;
|
||||
u32 *dst1 = dst0 + (dstPitch >> 2);
|
||||
|
||||
u32 *src0 = (u32 *)srcPtr;
|
||||
u32 *src1 = src0 + (srcPitch >> 2);
|
||||
u32 *src2 = src1 + (srcPitch >> 2);
|
||||
lq2x_32_def(dst0, dst1, src0, src0, src1, width);
|
||||
if( height == 1 ) return;
|
||||
|
||||
int count = height;
|
||||
|
||||
count -= 2;
|
||||
while(count>0) {
|
||||
dst0 += dstPitch >> 1;
|
||||
dst1 += dstPitch >> 1;
|
||||
lq2x_32_def(dst0, dst1, src0, src1, src2, width);
|
||||
src0 = src1;
|
||||
src1 = src2;
|
||||
src2 += srcPitch >> 2;
|
||||
--count;
|
||||
}
|
||||
dst0 += dstPitch >> 1;
|
||||
dst1 += dstPitch >> 1;
|
||||
lq2x_32_def(dst0, dst1, src0, src1, src1, width);
|
||||
}
|
||||
|
||||
void lq2xS32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
|
||||
u8 *dstPtr, u32 dstPitch, int width, int height)
|
||||
{
|
||||
u32 *dst0 = (u32 *)dstPtr;
|
||||
u32 *dst1 = dst0 + (dstPitch >> 2);
|
||||
|
||||
u32 *src0 = (u32 *)srcPtr;
|
||||
u32 *src1 = src0 + (srcPitch >> 2);
|
||||
u32 *src2 = src1 + (srcPitch >> 2);
|
||||
|
||||
int count;
|
||||
|
||||
lq2xS_32_def(dst0, dst1, src0, src0, src1, width);
|
||||
if( height == 1 ) return;
|
||||
|
||||
count = height;
|
||||
|
||||
count -= 2;
|
||||
while(count>0) {
|
||||
dst0 += dstPitch >> 1;
|
||||
dst1 += dstPitch >> 1;
|
||||
lq2x_32_def(dst0, dst1, src0, src1, src2, width);
|
||||
src0 = src1;
|
||||
src1 = src2;
|
||||
src2 += srcPitch >> 2;
|
||||
--count;
|
||||
}
|
||||
dst0 += dstPitch >> 1;
|
||||
dst1 += dstPitch >> 1;
|
||||
lq2xS_32_def(dst0, dst1, src0, src1, src1, width);
|
||||
}
|
||||
|
||||
void lq2x_init(unsigned bits_per_pixel)
|
||||
{
|
||||
interp_set(bits_per_pixel);
|
||||
}
|
||||
|
||||
void RenderLQ2X (SSurface Src, SSurface Dst)
|
||||
{
|
||||
|
||||
unsigned char *lpSrc, *lpDst;
|
||||
|
||||
lpSrc = Src.Surface;
|
||||
lpDst = Dst.Surface;
|
||||
|
||||
lq2x32 (lpSrc, Src.Pitch*2,
|
||||
lpSrc,
|
||||
lpDst, Dst.Pitch*2 , Src.Width, Src.Height);
|
||||
}
|
||||
|
||||
void RenderLQ2XS (SSurface Src, SSurface Dst)
|
||||
{
|
||||
|
||||
unsigned char *lpSrc, *lpDst;
|
||||
|
||||
lpSrc = Src.Surface;
|
||||
lpDst = Dst.Surface;
|
||||
|
||||
lq2xS32 (lpSrc, Src.Pitch*2,
|
||||
lpSrc,
|
||||
lpDst, Dst.Pitch*2 , Src.Width, Src.Height);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -15,10 +15,10 @@
|
|||
You should have received a copy of the GNU General Public License
|
||||
along with DeSmuME; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "filter.h"
|
||||
#include "types.h"
|
||||
*/
|
||||
|
||||
#include "filter.h"
|
||||
#include "types.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
@ -41,8 +41,8 @@ FORCEINLINE void ScanLine16_2( uint16 *lpDst, uint16 *lpSrc, unsigned int Width)
|
|||
*lpDst++ = fadeOutColors[scanline_filter_a][(*lpSrc)];
|
||||
*lpDst++ = fadeOutColors[scanline_filter_b][(*lpSrc++)];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
FORCEINLINE void ScanLine32( uint32 *lpDst, uint32 *lpSrc, unsigned int Width){
|
||||
while(Width--){
|
||||
*lpDst++ = *lpSrc;
|
||||
|
@ -72,16 +72,16 @@ FORCEINLINE void ScanLine32_2( uint32 *lpDst, uint32 *lpSrc, unsigned int Width)
|
|||
lpDst+=2;
|
||||
lpSrc++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FORCEINLINE void DoubleLine32( uint32 *lpDst, uint32 *lpSrc, unsigned int Width){
|
||||
while(Width--){
|
||||
*lpDst++ = *lpSrc;
|
||||
*lpDst++ = *lpSrc++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
FORCEINLINE void DoubleLine32( uint32 *lpDst, uint32 *lpSrc, unsigned int Width){
|
||||
while(Width--){
|
||||
*lpDst++ = *lpSrc;
|
||||
*lpDst++ = *lpSrc++;
|
||||
}
|
||||
}
|
||||
|
||||
void RenderScanline( SSurface Src, SSurface Dst)
|
||||
{
|
||||
fac_a = (16-scanline_filter_a);
|
||||
|
@ -101,19 +101,19 @@ void RenderScanline( SSurface Src, SSurface Dst)
|
|||
//memset (lpDst, 0, 512*2), lpDst += dstPitch;
|
||||
}
|
||||
|
||||
void RenderNearest2X (SSurface Src, SSurface Dst)
|
||||
{
|
||||
uint32 *lpSrc;
|
||||
unsigned int H;
|
||||
|
||||
const uint32 srcHeight = Src.Height;
|
||||
|
||||
const unsigned int srcPitch = Src.Pitch >> 1;
|
||||
lpSrc = reinterpret_cast<uint32 *>(Src.Surface);
|
||||
|
||||
const unsigned int dstPitch = Dst.Pitch >> 1;
|
||||
uint32 *lpDst = (uint32*)Dst.Surface;
|
||||
for (H = 0; H < srcHeight; H++, lpSrc += srcPitch)
|
||||
DoubleLine32 (lpDst, lpSrc, Src.Width), lpDst += dstPitch,
|
||||
DoubleLine32 (lpDst, lpSrc, Src.Width), lpDst += dstPitch;
|
||||
}
|
||||
void RenderNearest2X (SSurface Src, SSurface Dst)
|
||||
{
|
||||
uint32 *lpSrc;
|
||||
unsigned int H;
|
||||
|
||||
const uint32 srcHeight = Src.Height;
|
||||
|
||||
const unsigned int srcPitch = Src.Pitch >> 1;
|
||||
lpSrc = reinterpret_cast<uint32 *>(Src.Surface);
|
||||
|
||||
const unsigned int dstPitch = Dst.Pitch >> 1;
|
||||
uint32 *lpDst = (uint32*)Dst.Surface;
|
||||
for (H = 0; H < srcHeight; H++, lpSrc += srcPitch)
|
||||
DoubleLine32 (lpDst, lpSrc, Src.Width), lpDst += dstPitch,
|
||||
DoubleLine32 (lpDst, lpSrc, Src.Width), lpDst += dstPitch;
|
||||
}
|
||||
|
|
|
@ -3102,7 +3102,10 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
|
|||
|
||||
//Filters
|
||||
MainWindow->checkMenu(IDM_RENDER_NORMAL, video.currentfilter == video.NONE );
|
||||
MainWindow->checkMenu(IDM_RENDER_LQ2X, video.currentfilter == video.LQ2X );
|
||||
MainWindow->checkMenu(IDM_RENDER_LQ2XS, video.currentfilter == video.LQ2XS );
|
||||
MainWindow->checkMenu(IDM_RENDER_HQ2X, video.currentfilter == video.HQ2X );
|
||||
MainWindow->checkMenu(IDM_RENDER_HQ2XS, video.currentfilter == video.HQ2XS );
|
||||
MainWindow->checkMenu(IDM_RENDER_2XSAI, video.currentfilter == video._2XSAI );
|
||||
MainWindow->checkMenu(IDM_RENDER_SUPER2XSAI, video.currentfilter == video.SUPER2XSAI );
|
||||
MainWindow->checkMenu(IDM_RENDER_SUPEREAGLE, video.currentfilter == video.SUPEREAGLE );
|
||||
|
@ -3597,6 +3600,20 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
|
|||
FilterUpdate(hwnd);
|
||||
}
|
||||
break;
|
||||
case IDM_RENDER_LQ2X:
|
||||
{
|
||||
Lock lock (win_backbuffer_sync);
|
||||
video.setfilter(video.LQ2X);
|
||||
FilterUpdate(hwnd);
|
||||
}
|
||||
break;
|
||||
case IDM_RENDER_LQ2XS:
|
||||
{
|
||||
Lock lock (win_backbuffer_sync);
|
||||
video.setfilter(video.LQ2XS);
|
||||
FilterUpdate(hwnd);
|
||||
}
|
||||
break;
|
||||
case IDM_RENDER_HQ2X:
|
||||
{
|
||||
Lock lock (win_backbuffer_sync);
|
||||
|
@ -3604,6 +3621,13 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
|
|||
FilterUpdate(hwnd);
|
||||
}
|
||||
break;
|
||||
case IDM_RENDER_HQ2XS:
|
||||
{
|
||||
Lock lock (win_backbuffer_sync);
|
||||
video.setfilter(video.HQ2XS);
|
||||
FilterUpdate(hwnd);
|
||||
}
|
||||
break;
|
||||
case IDM_RENDER_2XSAI:
|
||||
{
|
||||
Lock lock (win_backbuffer_sync);
|
||||
|
|
|
@ -783,6 +783,10 @@
|
|||
#define IDM_HOTKEY_CONFIG 60079
|
||||
#define IDC_FASTFETCHEXECUTE 60080
|
||||
|
||||
#define IDM_RENDER_HQ2XS 60081
|
||||
#define IDM_RENDER_LQ2X 60082
|
||||
#define IDM_RENDER_LQ2XS 60083
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
|
|
Binary file not shown.
|
@ -24,7 +24,10 @@ public:
|
|||
SUPEREAGLE,
|
||||
SCANLINE,
|
||||
BILINEAR,
|
||||
NEAREST2X
|
||||
NEAREST2X,
|
||||
HQ2XS,
|
||||
LQ2X,
|
||||
LQ2XS,
|
||||
};
|
||||
|
||||
|
||||
|
@ -76,9 +79,18 @@ public:
|
|||
{
|
||||
case NONE:
|
||||
break;
|
||||
case LQ2X:
|
||||
RenderLQ2X(src, dst);
|
||||
break;
|
||||
case LQ2XS:
|
||||
RenderLQ2XS(src, dst);
|
||||
break;
|
||||
case HQ2X:
|
||||
RenderHQ2X(src, dst);
|
||||
break;
|
||||
case HQ2XS:
|
||||
RenderHQ2XS(src, dst);
|
||||
break;
|
||||
case _2XSAI:
|
||||
Render2xSaI (src, dst);
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue