snes9x/filter/epx.cpp

259 lines
5.6 KiB
C++

/*****************************************************************************\
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
This file is licensed under the Snes9x License.
For further information, consult the LICENSE file in the root directory.
\*****************************************************************************/
#include "snes9x.h"
#include "epx.h"
void EPX_16 (uint8 *srcPtr, int srcRowBytes, uint8 *dstPtr, int dstRowBytes, int width, int height)
{
uint16 colorX, colorA, colorB, colorC, colorD;
uint16 *sP, *uP, *lP;
uint32 *dP1, *dP2;
int w;
height -= 2;
// D
// A X C
// B
// top edge
sP = (uint16 *) srcPtr;
lP = (uint16 *) (srcPtr + srcRowBytes);
dP1 = (uint32 *) dstPtr;
dP2 = (uint32 *) (dstPtr + dstRowBytes);
// left edge
colorX = *sP;
colorC = *++sP;
colorB = *lP++;
if ((colorX != colorC) && (colorB != colorX))
{
#ifdef MSB_FIRST
*dP1 = (colorX << 16) + colorX;
*dP2 = (colorX << 16) + ((colorB == colorC) ? colorB : colorX);
#else
*dP1 = colorX + (colorX << 16);
*dP2 = colorX + (((colorB == colorC) ? colorB : colorX) << 16);
#endif
}
else
*dP1 = *dP2 = (colorX << 16) + colorX;
dP1++;
dP2++;
//
for (w = width - 2; w; w--)
{
colorA = colorX;
colorX = colorC;
colorC = *++sP;
colorB = *lP++;
if ((colorA != colorC) && (colorB != colorX))
{
#ifdef MSB_FIRST
*dP1 = (colorX << 16) + colorX;
*dP2 = (((colorA == colorB) ? colorA : colorX) << 16) + ((colorB == colorC) ? colorB : colorX);
#else
*dP1 = colorX + (colorX << 16);
*dP2 = ((colorA == colorB) ? colorA : colorX) + (((colorB == colorC) ? colorB : colorX) << 16);
#endif
}
else
*dP1 = *dP2 = (colorX << 16) + colorX;
dP1++;
dP2++;
}
// right edge
colorA = colorX;
colorX = colorC;
colorB = *lP;
if ((colorA != colorX) && (colorB != colorX))
{
#ifdef MSB_FIRST
*dP1 = (colorX << 16) + colorX;
*dP2 = (((colorA == colorB) ? colorA : colorX) << 16) + colorX;
#else
*dP1 = colorX + (colorX << 16);
*dP2 = ((colorA == colorB) ? colorA : colorX) + (colorX << 16);
#endif
}
else
*dP1 = *dP2 = (colorX << 16) + colorX;
srcPtr += srcRowBytes;
dstPtr += dstRowBytes << 1;
//
for (; height; height--)
{
sP = (uint16 *) srcPtr;
uP = (uint16 *) (srcPtr - srcRowBytes);
lP = (uint16 *) (srcPtr + srcRowBytes);
dP1 = (uint32 *) dstPtr;
dP2 = (uint32 *) (dstPtr + dstRowBytes);
// left edge
colorX = *sP;
colorC = *++sP;
colorB = *lP++;
colorD = *uP++;
if ((colorX != colorC) && (colorB != colorD))
{
#ifdef MSB_FIRST
*dP1 = (colorX << 16) + ((colorC == colorD) ? colorC : colorX);
*dP2 = (colorX << 16) + ((colorB == colorC) ? colorB : colorX);
#else
*dP1 = colorX + (((colorC == colorD) ? colorC : colorX) << 16);
*dP2 = colorX + (((colorB == colorC) ? colorB : colorX) << 16);
#endif
}
else
*dP1 = *dP2 = (colorX << 16) + colorX;
dP1++;
dP2++;
//
for (w = width - 2; w; w--)
{
colorA = colorX;
colorX = colorC;
colorC = *++sP;
colorB = *lP++;
colorD = *uP++;
if ((colorA != colorC) && (colorB != colorD))
{
#ifdef MSB_FIRST
*dP1 = (((colorD == colorA) ? colorD : colorX) << 16) + ((colorC == colorD) ? colorC : colorX);
*dP2 = (((colorA == colorB) ? colorA : colorX) << 16) + ((colorB == colorC) ? colorB : colorX);
#else
*dP1 = ((colorD == colorA) ? colorD : colorX) + (((colorC == colorD) ? colorC : colorX) << 16);
*dP2 = ((colorA == colorB) ? colorA : colorX) + (((colorB == colorC) ? colorB : colorX) << 16);
#endif
}
else
*dP1 = *dP2 = (colorX << 16) + colorX;
dP1++;
dP2++;
}
// right edge
colorA = colorX;
colorX = colorC;
colorB = *lP;
colorD = *uP;
if ((colorA != colorX) && (colorB != colorD))
{
#ifdef MSB_FIRST
*dP1 = (((colorD == colorA) ? colorD : colorX) << 16) + colorX;
*dP2 = (((colorA == colorB) ? colorA : colorX) << 16) + colorX;
#else
*dP1 = ((colorD == colorA) ? colorD : colorX) + (colorX << 16);
*dP2 = ((colorA == colorB) ? colorA : colorX) + (colorX << 16);
#endif
}
else
*dP1 = *dP2 = (colorX << 16) + colorX;
srcPtr += srcRowBytes;
dstPtr += dstRowBytes << 1;
}
// bottom edge
sP = (uint16 *) srcPtr;
uP = (uint16 *) (srcPtr - srcRowBytes);
dP1 = (uint32 *) dstPtr;
dP2 = (uint32 *) (dstPtr + dstRowBytes);
// left edge
colorX = *sP;
colorC = *++sP;
colorD = *uP++;
if ((colorX != colorC) && (colorX != colorD))
{
#ifdef MSB_FIRST
*dP1 = (colorX << 16) + ((colorC == colorD) ? colorC : colorX);
*dP2 = (colorX << 16) + colorX;
#else
*dP1 = colorX + (((colorC == colorD) ? colorC : colorX) << 16);
*dP2 = colorX + (colorX << 16);
#endif
}
else
*dP1 = *dP2 = (colorX << 16) + colorX;
dP1++;
dP2++;
//
for (w = width - 2; w; w--)
{
colorA = colorX;
colorX = colorC;
colorC = *++sP;
colorD = *uP++;
if ((colorA != colorC) && (colorX != colorD))
{
#ifdef MSB_FIRST
*dP1 = (((colorD == colorA) ? colorD : colorX) << 16) + ((colorC == colorD) ? colorC : colorX);
*dP2 = (colorX << 16) + colorX;
#else
*dP1 = ((colorD == colorA) ? colorD : colorX) + (((colorC == colorD) ? colorC : colorX) << 16);
*dP2 = colorX + (colorX << 16);
#endif
}
else
*dP1 = *dP2 = (colorX << 16) + colorX;
dP1++;
dP2++;
}
// right edge
colorA = colorX;
colorX = colorC;
colorD = *uP;
if ((colorA != colorX) && (colorX != colorD))
{
#ifdef MSB_FIRST
*dP1 = (((colorD == colorA) ? colorD : colorX) << 16) + colorX;
*dP2 = (colorX << 16) + colorX;
#else
*dP1 = ((colorD == colorA) ? colorD : colorX) + (colorX << 16);
*dP2 = colorX + (colorX << 16);
#endif
}
else
*dP1 = *dP2 = (colorX << 16) + colorX;
}