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:
zeromus 2009-09-15 04:36:21 +00:00
parent 91f19f2521
commit d3d573d777
13 changed files with 2123 additions and 66 deletions

View File

@ -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

View File

@ -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"
>

View File

@ -1243,6 +1243,10 @@
RelativePath=".\filter\hq2x.cpp"
>
</File>
<File
RelativePath=".\filter\lq2x.cpp"
>
</File>
<File
RelativePath=".\filter\scanline.cpp"
>

View File

@ -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

View File

@ -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);

View File

@ -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);
}

View File

@ -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

View File

@ -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;
}

View File

@ -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);

View File

@ -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.

View File

@ -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;