2018-11-15 23:31:39 +00:00
|
|
|
/*****************************************************************************\
|
|
|
|
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.
|
|
|
|
\*****************************************************************************/
|
2010-09-25 15:46:12 +00:00
|
|
|
|
|
|
|
#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;
|
|
|
|
}
|