mirror of https://github.com/snes9xgit/snes9x.git
Add blend filters in blit.cpp
This commit is contained in:
parent
b65f18fa84
commit
41dc2fbb61
153
filter/blit.cpp
153
filter/blit.cpp
|
@ -181,11 +181,12 @@
|
|||
#define ALL_COLOR_MASK (FIRST_COLOR_MASK | SECOND_COLOR_MASK | THIRD_COLOR_MASK)
|
||||
|
||||
#ifdef GFX_MULTI_FORMAT
|
||||
static uint16 lowPixelMask = 0, qlowPixelMask = 0;
|
||||
static uint16 lowPixelMask = 0, qlowPixelMask = 0, highBitsMask = 0;
|
||||
static uint32 colorMask = 0;
|
||||
#else
|
||||
#define lowPixelMask (RGB_LOW_BITS_MASK)
|
||||
#define qlowPixelMask ((RGB_HI_BITS_MASK >> 3) | TWO_LOW_BITS_MASK)
|
||||
#define highBitsMask (ALL_COLOR_MASK & RGB_REMOVE_LOW_BITS_MASK)
|
||||
#define colorMask (((~RGB_HI_BITS_MASK & ALL_COLOR_MASK) << 16) | (~RGB_HI_BITS_MASK & ALL_COLOR_MASK))
|
||||
#endif
|
||||
|
||||
|
@ -204,6 +205,7 @@ bool8 S9xBlitFilterInit (void)
|
|||
#ifdef GFX_MULTI_FORMAT
|
||||
lowPixelMask = RGB_LOW_BITS_MASK;
|
||||
qlowPixelMask = (RGB_HI_BITS_MASK >> 3) | TWO_LOW_BITS_MASK;
|
||||
highBitsMask = ALL_COLOR_MASK & RGB_REMOVE_LOW_BITS_MASK;
|
||||
colorMask = ((~RGB_HI_BITS_MASK & ALL_COLOR_MASK) << 16) | (~RGB_HI_BITS_MASK & ALL_COLOR_MASK);
|
||||
#endif
|
||||
|
||||
|
@ -252,7 +254,7 @@ void S9xBlitNTSCFilterSet (const snes_ntsc_setup_t *setup)
|
|||
snes_ntsc_init(ntsc, setup);
|
||||
}
|
||||
|
||||
void S9xBlitPixSmall16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
void S9xBlitPixSimple1x1 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
width <<= 1;
|
||||
|
||||
|
@ -264,7 +266,41 @@ void S9xBlitPixSmall16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRo
|
|||
}
|
||||
}
|
||||
|
||||
void S9xBlitPixScaled16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
void S9xBlitPixSimple1x2 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
width <<= 1;
|
||||
|
||||
for (; height; height--)
|
||||
{
|
||||
memcpy(dstPtr, srcPtr, width);
|
||||
dstPtr += dstRowBytes;
|
||||
memcpy(dstPtr, srcPtr, width);
|
||||
srcPtr += srcRowBytes;
|
||||
dstPtr += dstRowBytes;
|
||||
}
|
||||
}
|
||||
|
||||
void S9xBlitPixSimple2x1 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
for (; height; height--)
|
||||
{
|
||||
uint16 *dP = (uint16 *) dstPtr, *bP = (uint16 *) srcPtr;
|
||||
|
||||
for (int i = 0; i < (width >> 1); i++)
|
||||
{
|
||||
*dP++ = *bP;
|
||||
*dP++ = *bP++;
|
||||
|
||||
*dP++ = *bP;
|
||||
*dP++ = *bP++;
|
||||
}
|
||||
|
||||
srcPtr += srcRowBytes;
|
||||
dstPtr += dstRowBytes;
|
||||
}
|
||||
}
|
||||
|
||||
void S9xBlitPixSimple2x2 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
uint8 *dstPtr2 = dstPtr + dstRowBytes, *deltaPtr = XDelta;
|
||||
dstRowBytes <<= 1;
|
||||
|
@ -313,30 +349,24 @@ void S9xBlitPixScaled16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstR
|
|||
}
|
||||
}
|
||||
|
||||
void S9xBlitPixHiRes16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
width <<= 1;
|
||||
|
||||
for (; height; height--)
|
||||
{
|
||||
memcpy(dstPtr, srcPtr, width);
|
||||
dstPtr += dstRowBytes;
|
||||
memcpy(dstPtr, srcPtr, width);
|
||||
srcPtr += srcRowBytes;
|
||||
dstPtr += dstRowBytes;
|
||||
}
|
||||
}
|
||||
|
||||
void S9xBlitPixDoubled16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
void S9xBlitPixBlend1x1 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
for (; height; height--)
|
||||
{
|
||||
uint16 *dP = (uint16 *) dstPtr, *bP = (uint16 *) srcPtr;
|
||||
uint16 prev, curr;
|
||||
|
||||
for (int i = 0; i < width; i++)
|
||||
prev = *bP;
|
||||
|
||||
for (int i = 0; i < (width >> 1); i++)
|
||||
{
|
||||
*dP++ = *bP;
|
||||
*dP++ = *bP++;
|
||||
curr = *bP++;
|
||||
*dP++ = (prev & curr) + (((prev ^ curr) & highBitsMask) >> 1);
|
||||
prev = curr;
|
||||
|
||||
curr = *bP++;
|
||||
*dP++ = (prev & curr) + (((prev ^ curr) & highBitsMask) >> 1);
|
||||
prev = curr;
|
||||
}
|
||||
|
||||
srcPtr += srcRowBytes;
|
||||
|
@ -344,7 +374,58 @@ void S9xBlitPixDoubled16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dst
|
|||
}
|
||||
}
|
||||
|
||||
void S9xBlitPixScaledTV16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
void S9xBlitPixBlend2x1 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
for (; height; height--)
|
||||
{
|
||||
uint16 *dP = (uint16 *) dstPtr, *bP = (uint16 *) srcPtr;
|
||||
uint16 prev, curr;
|
||||
|
||||
prev = *bP;
|
||||
|
||||
for (int i = 0; i < (width >> 1); i++)
|
||||
{
|
||||
curr = *bP++;
|
||||
*dP++ = (prev & curr) + (((prev ^ curr) & highBitsMask) >> 1);
|
||||
*dP++ = curr;
|
||||
prev = curr;
|
||||
|
||||
curr = *bP++;
|
||||
*dP++ = (prev & curr) + (((prev ^ curr) & highBitsMask) >> 1);
|
||||
*dP++ = curr;
|
||||
prev = curr;
|
||||
}
|
||||
|
||||
srcPtr += srcRowBytes;
|
||||
dstPtr += dstRowBytes;
|
||||
}
|
||||
}
|
||||
|
||||
void S9xBlitPixTV1x2 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
uint8 *dstPtr2 = dstPtr + dstRowBytes;
|
||||
dstRowBytes <<= 1;
|
||||
|
||||
for (; height; height--)
|
||||
{
|
||||
uint32 *dP1 = (uint32 *) dstPtr, *dP2 = (uint32 *) dstPtr2, *bP = (uint32 *) srcPtr;
|
||||
uint32 product, darkened;
|
||||
|
||||
for (int i = 0; i < (width >> 1); i++)
|
||||
{
|
||||
product = *dP1++ = *bP++;
|
||||
darkened = (product = (product >> 1) & colorMask);
|
||||
darkened += (product = (product >> 1) & colorMask);
|
||||
*dP2++ = darkened;
|
||||
}
|
||||
|
||||
srcPtr += srcRowBytes;
|
||||
dstPtr += dstRowBytes;
|
||||
dstPtr2 += dstRowBytes;
|
||||
}
|
||||
}
|
||||
|
||||
void S9xBlitPixTV2x2 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
uint8 *dstPtr2 = dstPtr + dstRowBytes, *deltaPtr = XDelta;
|
||||
dstRowBytes <<= 1;
|
||||
|
@ -455,31 +536,7 @@ void S9xBlitPixScaledTV16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int ds
|
|||
}
|
||||
}
|
||||
|
||||
void S9xBlitPixHiResTV16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
uint8 *dstPtr2 = dstPtr + dstRowBytes;
|
||||
dstRowBytes <<= 1;
|
||||
|
||||
for (; height; height--)
|
||||
{
|
||||
uint32 *dP1 = (uint32 *) dstPtr, *dP2 = (uint32 *) dstPtr2, *bP = (uint32 *) srcPtr;
|
||||
uint32 product, darkened;
|
||||
|
||||
for (int i = 0; i < (width >> 1); i++)
|
||||
{
|
||||
product = *dP1++ = *bP++;
|
||||
darkened = (product = (product >> 1) & colorMask);
|
||||
darkened += (product = (product >> 1) & colorMask);
|
||||
*dP2++ = darkened;
|
||||
}
|
||||
|
||||
srcPtr += srcRowBytes;
|
||||
dstPtr += dstRowBytes;
|
||||
dstPtr2 += dstRowBytes;
|
||||
}
|
||||
}
|
||||
|
||||
void S9xBlitPixHiResMixedTV16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
void S9xBlitPixMixedTV1x2 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
uint8 *dstPtr2 = dstPtr + dstRowBytes, *srcPtr2 = srcPtr + srcRowBytes;
|
||||
dstRowBytes <<= 1;
|
||||
|
@ -520,7 +577,7 @@ void S9xBlitPixHiResMixedTV16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, in
|
|||
}
|
||||
}
|
||||
|
||||
void S9xBlitPixSmooth16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
void S9xBlitPixSmooth2x2 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
|
||||
{
|
||||
uint8 *dstPtr2 = dstPtr + dstRowBytes, *deltaPtr = XDelta;
|
||||
uint32 lastLinePix[SNES_WIDTH << 1];
|
||||
|
|
|
@ -189,14 +189,16 @@ void S9xBlitClearDelta (void);
|
|||
bool8 S9xBlitNTSCFilterInit (void);
|
||||
void S9xBlitNTSCFilterDeinit (void);
|
||||
void S9xBlitNTSCFilterSet (const snes_ntsc_setup_t *);
|
||||
void S9xBlitPixSmall16 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixScaled16 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixHiRes16 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixDoubled16 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixScaledTV16 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixHiResTV16 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixHiResMixedTV16 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixSmooth16 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixSimple1x1 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixSimple1x2 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixSimple2x1 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixSimple2x2 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixBlend1x1 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixBlend2x1 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixTV1x2 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixTV2x2 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixMixedTV1x2 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixSmooth2x2 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixSuperEagle16 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPix2xSaI16 (uint8 *, int, uint8 *, int, int, int);
|
||||
void S9xBlitPixSuper2xSaI16 (uint8 *, int, uint8 *, int, int, int);
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<key>IBFramework Version</key>
|
||||
<string>823</string>
|
||||
<key>IBLastKnownRelativeProjectPath</key>
|
||||
<string>../macpdate.xcodeproj</string>
|
||||
<string>../snes9x.xcodeproj</string>
|
||||
<key>IBOldestOS</key>
|
||||
<integer>6</integer>
|
||||
<key>IBOpenObjects</key>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -238,6 +238,7 @@ enum
|
|||
VIDEOMODE_BLOCKY,
|
||||
VIDEOMODE_TV,
|
||||
VIDEOMODE_SMOOTH,
|
||||
VIDEOMODE_BLEND,
|
||||
VIDEOMODE_SUPEREAGLE,
|
||||
VIDEOMODE_2XSAI,
|
||||
VIDEOMODE_SUPER2XSAI,
|
||||
|
|
|
@ -267,6 +267,7 @@ enum
|
|||
iOpenGLBlocky = 1,
|
||||
iOpenGLTVMode,
|
||||
iOpenGLSmoothMode,
|
||||
iOpenGLBlendMode,
|
||||
iOpenGLEagleMode,
|
||||
iOpenGL2xSAIMode,
|
||||
iOpenGLSuper2xSAIMode,
|
||||
|
@ -308,7 +309,7 @@ static PrefList prefList[] =
|
|||
{ 'gl32', &gl32bit, sizeof(bool8 ) },
|
||||
{ 'glst', &glstretch, sizeof(bool8 ) },
|
||||
{ 'draw', &drawingMethod, sizeof(long ) },
|
||||
{ 'vmod', &videoMode, sizeof(int ) },
|
||||
{ 'Vmod', &videoMode, sizeof(int ) },
|
||||
{ 'MPmt', &multiprocessor, sizeof(bool8 ) },
|
||||
{ 'VSNC', &vsync, sizeof(bool8 ) },
|
||||
{ 'H239', &drawoverscan, sizeof(bool8 ) },
|
||||
|
@ -592,6 +593,10 @@ void ConfigurePreferences (void)
|
|||
SetControl32BitValue(ctl, iOpenGLSmoothMode);
|
||||
break;
|
||||
|
||||
case VIDEOMODE_BLEND:
|
||||
SetControl32BitValue(ctl, iOpenGLBlendMode);
|
||||
break;
|
||||
|
||||
case VIDEOMODE_SUPEREAGLE:
|
||||
SetControl32BitValue(ctl, iOpenGLEagleMode);
|
||||
break;
|
||||
|
@ -954,6 +959,11 @@ void ConfigurePreferences (void)
|
|||
videoMode = VIDEOMODE_SMOOTH;
|
||||
break;
|
||||
|
||||
case iOpenGLBlendMode:
|
||||
drawingMethod = kDrawingBlitGL;
|
||||
videoMode = VIDEOMODE_BLEND;
|
||||
break;
|
||||
|
||||
case iOpenGLEagleMode:
|
||||
drawingMethod = kDrawingBlitGL;
|
||||
videoMode = VIDEOMODE_SUPEREAGLE;
|
||||
|
|
|
@ -1245,7 +1245,7 @@ static inline void RenderBlitScreen (Blitter Fn, int x, int sW, int sH, int cW,
|
|||
uint8 *tmpBuffer = blitGLBuffer + (1024 * 512 * 2);
|
||||
int aligned = ((ntsc_width + 2) >> 1) << 1;
|
||||
(Fn) ((uint8 *) buf, sW * 2, tmpBuffer, 1024 * 2, sW, sH);
|
||||
S9xBlitPixHiResMixedTV16(tmpBuffer, 1024 * 2, blitGLBuffer, 1024 * 2, aligned, cH);
|
||||
S9xBlitPixMixedTV1x2(tmpBuffer, 1024 * 2, blitGLBuffer, 1024 * 2, aligned, cH);
|
||||
cH *= 2;
|
||||
}
|
||||
|
||||
|
@ -1581,6 +1581,22 @@ static void S9xPutImageBlitGL (int width, int height)
|
|||
{
|
||||
default:
|
||||
case 2:
|
||||
if (videoMode == VIDEOMODE_BLEND)
|
||||
{
|
||||
if (width <= 256)
|
||||
{
|
||||
copyWidth = width * 2;
|
||||
copyHeight = height;
|
||||
blitFn = S9xBlitPixBlend2x1;
|
||||
}
|
||||
else
|
||||
{
|
||||
copyWidth = width;
|
||||
copyHeight = height;
|
||||
blitFn = S9xBlitPixBlend1x1;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (height <= 256)
|
||||
{
|
||||
if (width <= 256)
|
||||
|
@ -1591,7 +1607,7 @@ static void S9xPutImageBlitGL (int width, int height)
|
|||
switch (videoMode)
|
||||
{
|
||||
default:
|
||||
case VIDEOMODE_TV: blitFn = S9xBlitPixScaledTV16; break;
|
||||
case VIDEOMODE_TV: blitFn = S9xBlitPixTV2x2; break;
|
||||
case VIDEOMODE_SUPEREAGLE: blitFn = S9xBlitPixSuperEagle16; break;
|
||||
case VIDEOMODE_2XSAI: blitFn = S9xBlitPix2xSaI16; break;
|
||||
case VIDEOMODE_SUPER2XSAI: blitFn = S9xBlitPixSuper2xSaI16; break;
|
||||
|
@ -1605,13 +1621,13 @@ static void S9xPutImageBlitGL (int width, int height)
|
|||
{
|
||||
copyWidth = width;
|
||||
copyHeight = height * 2;
|
||||
blitFn = S9xBlitPixHiResTV16;
|
||||
blitFn = S9xBlitPixTV1x2;
|
||||
}
|
||||
else
|
||||
{
|
||||
copyWidth = width;
|
||||
copyHeight = height;
|
||||
blitFn = S9xBlitPixSmall16;
|
||||
blitFn = S9xBlitPixSimple1x1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1619,7 +1635,7 @@ static void S9xPutImageBlitGL (int width, int height)
|
|||
{
|
||||
copyWidth = width;
|
||||
copyHeight = height;
|
||||
blitFn = S9xBlitPixSmall16;
|
||||
blitFn = S9xBlitPixSimple1x1;
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -1635,7 +1651,7 @@ static void S9xPutImageBlitGL (int width, int height)
|
|||
{
|
||||
copyWidth = width;
|
||||
copyHeight = height;
|
||||
blitFn = S9xBlitPixSmall16;
|
||||
blitFn = S9xBlitPixSimple1x1;
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -1658,7 +1674,7 @@ static void S9xPutImageBlitGL (int width, int height)
|
|||
{
|
||||
copyWidth = width;
|
||||
copyHeight = height;
|
||||
blitFn = S9xBlitPixSmall16;
|
||||
blitFn = S9xBlitPixSimple1x1;
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
15
unix/x11.cpp
15
unix/x11.cpp
|
@ -793,7 +793,7 @@ void S9xPutImage (int width, int height)
|
|||
{
|
||||
copyWidth = width * 2;
|
||||
copyHeight = height;
|
||||
blitFn = S9xBlitPixDoubled16;
|
||||
blitFn = S9xBlitPixSimple2x1;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -802,9 +802,9 @@ void S9xPutImage (int width, int height)
|
|||
|
||||
switch (GUI.video_mode)
|
||||
{
|
||||
case VIDEOMODE_BLOCKY: blitFn = S9xBlitPixScaled16; break;
|
||||
case VIDEOMODE_TV: blitFn = S9xBlitPixScaledTV16; break;
|
||||
case VIDEOMODE_SMOOTH: blitFn = S9xBlitPixSmooth16; break;
|
||||
case VIDEOMODE_BLOCKY: blitFn = S9xBlitPixSimple2x2; break;
|
||||
case VIDEOMODE_TV: blitFn = S9xBlitPixTV2x2; break;
|
||||
case VIDEOMODE_SMOOTH: blitFn = S9xBlitPixSmooth2x2; break;
|
||||
case VIDEOMODE_SUPEREAGLE: blitFn = S9xBlitPixSuperEagle16; break;
|
||||
case VIDEOMODE_2XSAI: blitFn = S9xBlitPix2xSaI16; break;
|
||||
case VIDEOMODE_SUPER2XSAI: blitFn = S9xBlitPixSuper2xSaI16; break;
|
||||
|
@ -821,16 +821,15 @@ void S9xPutImage (int width, int height)
|
|||
|
||||
switch (GUI.video_mode)
|
||||
{
|
||||
default: blitFn = S9xBlitPixHiRes16; break;
|
||||
case VIDEOMODE_TV: blitFn = S9xBlitPixHiResTV16; break;
|
||||
default: blitFn = S9xBlitPixSimple1x2; break;
|
||||
case VIDEOMODE_TV: blitFn = S9xBlitPixTV1x2; break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
copyWidth = width;
|
||||
copyHeight = height;
|
||||
|
||||
blitFn = S9xBlitPixSmall16;
|
||||
blitFn = S9xBlitPixSimple1x1;
|
||||
}
|
||||
|
||||
blitFn((uint8 *) GFX.Screen, GFX.Pitch, GUI.blit_screen, GUI.blit_screen_pitch, width, height);
|
||||
|
|
Loading…
Reference in New Issue