mirror of
https://github.com/holub/mame
synced 2025-05-25 15:25:33 +03:00
296 lines
7.7 KiB
C
296 lines
7.7 KiB
C
|
|
#ifndef SDL_TEXFORMAT
|
|
|
|
#if 0
|
|
INLINE UINT32 ycc_to_rgb(unsigned y, unsigned cb, unsigned cr)
|
|
{
|
|
/* original equations:
|
|
|
|
C = Y - 16
|
|
D = Cb - 128
|
|
E = Cr - 128
|
|
|
|
R = clip(( 298 * C + 409 * E + 128) >> 8)
|
|
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
|
|
B = clip(( 298 * C + 516 * D + 128) >> 8)
|
|
|
|
R = clip(( 298 * (Y - 16) + 409 * (Cr - 128) + 128) >> 8)
|
|
G = clip(( 298 * (Y - 16) - 100 * (Cb - 128) - 208 * (Cr - 128) + 128) >> 8)
|
|
B = clip(( 298 * (Y - 16) + 516 * (Cb - 128) + 128) >> 8)
|
|
|
|
R = clip(( 298 * Y - 298 * 16 + 409 * Cr - 409 * 128 + 128) >> 8)
|
|
G = clip(( 298 * Y - 298 * 16 - 100 * Cb + 100 * 128 - 208 * Cr + 208 * 128 + 128) >> 8)
|
|
B = clip(( 298 * Y - 298 * 16 + 516 * Cb - 516 * 128 + 128) >> 8)
|
|
|
|
R = clip(( 298 * Y - 298 * 16 + 409 * Cr - 409 * 128 + 128) >> 8)
|
|
G = clip(( 298 * Y - 298 * 16 - 100 * Cb + 100 * 128 - 208 * Cr + 208 * 128 + 128) >> 8)
|
|
B = clip(( 298 * Y - 298 * 16 + 516 * Cb - 516 * 128 + 128) >> 8)
|
|
*/
|
|
//int r, g, b, common;
|
|
unsigned int r, g, b, common;
|
|
|
|
common = 298 * y - 56992;
|
|
r = (common + 409 * cr);
|
|
g = (common - 100 * cb - 208 * cr + 91776);
|
|
b = (common + 516 * cb - 13696);
|
|
|
|
if ((int) r < 0) r = 0;
|
|
if ((int) g < 0) g = 0;
|
|
if ((int) b < 0) b = 0;
|
|
|
|
/* MAME_RGB does upper clamping */
|
|
|
|
return MAKE_RGB(r >> 8, g >> 8, b >> 8);
|
|
}
|
|
#else
|
|
|
|
|
|
static int clamp_lu[256+128+128] = { 255 };
|
|
static int coff_cr[256][2] = { {0, 0} };
|
|
static int coff_cb[256][2] = { {0, 0} };
|
|
|
|
static void init_clamp(void)
|
|
{
|
|
int i;
|
|
for (i=0;i<128;i++)
|
|
{
|
|
clamp_lu[i] = 0;
|
|
clamp_lu[i + 256 + 128] = 255;
|
|
}
|
|
for (i=0;i<256;i++)
|
|
{
|
|
clamp_lu[i + 128] = i;
|
|
|
|
coff_cr[i][0] = + 409 * i - 56992;
|
|
coff_cr[i][1] = - 208 * i;
|
|
coff_cb[i][0] = - 100 * i /* - 208 * cr */ + 34784;
|
|
coff_cb[i][1] = + 516 * i - 70688;
|
|
}
|
|
}
|
|
|
|
INLINE int clamp(int x) { return (const int) clamp_lu[(x >> 8) + 128] ; }
|
|
|
|
INLINE UINT32 ycc_to_rgb(unsigned y, unsigned cb, unsigned cr)
|
|
{
|
|
int r, g, b, common;
|
|
common = y * 298;
|
|
|
|
r = (const int) coff_cr[cr][0]; // 409 * cr - 56992;
|
|
g = (const int) coff_cb[cb][0] + (const int) coff_cr[cr][1]; //- 100 * cb - 208 * cr + 34784;
|
|
b = (const int) coff_cb[cb][1]; //+ 516 * cb - 70688;
|
|
return 0xff000000 | (clamp(r + common)<<16) | (clamp(g + common)<<8) | (clamp(b + common));
|
|
}
|
|
|
|
#endif
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_ARGB32
|
|
#include "texcopy.c"
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_RGB32
|
|
#include "texcopy.c"
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_RGB32_PALETTED
|
|
#include "texcopy.c"
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_PALETTE16
|
|
#include "texcopy.c"
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_PALETTE16A
|
|
#include "texcopy.c"
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_RGB15
|
|
#include "texcopy.c"
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_RGB15_PALETTED
|
|
#include "texcopy.c"
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_PALETTE16_ARGB1555
|
|
#include "texcopy.c"
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_RGB15_ARGB1555
|
|
#include "texcopy.c"
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_RGB15_PALETTED_ARGB1555
|
|
#include "texcopy.c"
|
|
|
|
#if 0 //def SDLMAME_MACOSX /* native MacOS X composite texture format */
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_YUY16
|
|
#include "texcopy.c"
|
|
|
|
#define SDL_TEXFORMAT SDL_TEXFORMAT_YUY16_PALETTED
|
|
#include "texcopy.c"
|
|
|
|
#endif
|
|
|
|
//============================================================
|
|
// MANUAL TEXCOPY FUNCS
|
|
// (YUY format is weird and doesn't fit the assumptions of the
|
|
// standard macros so we handle it here
|
|
//============================================================
|
|
#if 1 //ndef SDLMAME_MACOSX
|
|
static void texcopy_yuv16(texture_info *texture, const render_texinfo *texsource)
|
|
{
|
|
int x, y;
|
|
UINT32 *dst;
|
|
UINT16 *src;
|
|
|
|
if (clamp_lu[0]>0)
|
|
init_clamp();
|
|
|
|
// loop over Y
|
|
for (y = 0; y < texsource->height; y++)
|
|
{
|
|
src = (UINT16 *)texsource->base + y * texsource->rowpixels;
|
|
dst = (UINT32 *)texture->data + (y * texture->yprescale + texture->borderpix) * texture->rawwidth;
|
|
|
|
// always fill non-wrapping textures with an extra pixel on the left
|
|
if (texture->borderpix)
|
|
*dst++ = 0;
|
|
|
|
// we don't support prescale for YUV textures
|
|
for (x = texsource->width/2; x > 0 ; x--)
|
|
{
|
|
UINT16 srcpix0 = *src++;
|
|
UINT16 srcpix1 = *src++;
|
|
UINT8 cb = srcpix0 & 0xff;
|
|
UINT8 cr = srcpix1 & 0xff;
|
|
|
|
*dst++ = ycc_to_rgb(srcpix0 >> 8, cb, cr);
|
|
*dst++ = ycc_to_rgb(srcpix1 >> 8, cb, cr);
|
|
}
|
|
|
|
// always fill non-wrapping textures with an extra pixel on the right
|
|
#if 0
|
|
if (texture->borderpix)
|
|
*dst++ = 0;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
static void texcopy_yuv16_paletted(texture_info *texture, const render_texinfo *texsource)
|
|
{
|
|
int x, y;
|
|
UINT32 *dst;
|
|
UINT16 *src;
|
|
int lookup[256];
|
|
|
|
if (clamp_lu[0]>0)
|
|
init_clamp();
|
|
|
|
/* preprocess lookup */
|
|
for (x=0; x<256; x++)
|
|
lookup[x] = texsource->palette[x] * 298;
|
|
|
|
// loop over Y
|
|
for (y = 0; y < texsource->height; y++)
|
|
{
|
|
src = (UINT16 *)texsource->base + y * texsource->rowpixels;
|
|
dst = (UINT32 *)texture->data + (y * texture->yprescale + texture->borderpix) * texture->rawwidth;
|
|
|
|
// always fill non-wrapping textures with an extra pixel on the left
|
|
if (texture->borderpix)
|
|
*dst++ = 0;
|
|
|
|
// we don't support prescale for YUV textures
|
|
for (x = texsource->width/2; x > 0 ; x--)
|
|
{
|
|
UINT16 srcpix0 = *src++;
|
|
UINT16 srcpix1 = *src++;
|
|
UINT8 cb = srcpix0 & 0xff;
|
|
UINT8 cr = srcpix1 & 0xff;
|
|
|
|
#if 0
|
|
*dst++ = ycc_to_rgb(texsource->palette[0x000 + (srcpix0 >> 8)], cb, cr);
|
|
*dst++ = ycc_to_rgb(texsource->palette[0x000 + (srcpix1 >> 8)], cb, cr);
|
|
#else
|
|
int r = (const int) coff_cr[cr][0];
|
|
int g = (const int) coff_cb[cb][0] + (const int) coff_cr[cr][1];
|
|
int b = (const int) coff_cb[cb][1];
|
|
int y1 = (const int) lookup[(srcpix0 >> 8)];
|
|
int y2 = (const int) lookup[(srcpix1 >> 8)];
|
|
|
|
|
|
*dst++ = 0xff000000 | (clamp(r + y1)<<16) | (clamp(g + y1)<<8) | (clamp(b + y1));
|
|
*dst++ = 0xff000000 | (clamp(r + y2)<<16) | (clamp(g + y2)<<8) | (clamp(b + y2));
|
|
#endif
|
|
}
|
|
|
|
// always fill non-wrapping textures with an extra pixel on the right
|
|
#if 0
|
|
if (texture->borderpix)
|
|
*dst++ = 0;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
#else // recursive include
|
|
|
|
#include "texsrc.h"
|
|
|
|
static void FUNC_NAME(texcopy)(texture_info *texture, const render_texinfo *texsource)
|
|
{
|
|
int x, y;
|
|
DEST_TYPE *dst;
|
|
TEXSRC_TYPE *src;
|
|
|
|
// loop over Y
|
|
for (y = 0; y < texsource->height; y++)
|
|
{
|
|
src = (TEXSRC_TYPE *)texsource->base + y * texsource->rowpixels;
|
|
dst = (DEST_TYPE *)texture->data + (y * texture->yprescale + texture->borderpix) * texture->rawwidth;
|
|
|
|
// always fill non-wrapping textures with an extra pixel on the left
|
|
if (texture->borderpix)
|
|
*dst++ = 0;
|
|
|
|
switch(texture->xprescale)
|
|
{
|
|
case 1:
|
|
for (x = 0; x < texsource->width; x++)
|
|
{
|
|
*dst++ = TEXSRC_TO_DEST(*src);
|
|
src++;
|
|
}
|
|
break;
|
|
case 2:
|
|
for (x = 0; x < texsource->width; x++)
|
|
{
|
|
DEST_TYPE pixel = TEXSRC_TO_DEST(*src);
|
|
*dst++ = pixel;
|
|
*dst++ = pixel;
|
|
src++;
|
|
}
|
|
break;
|
|
case 3:
|
|
for (x = 0; x < texsource->width; x++)
|
|
{
|
|
DEST_TYPE pixel = TEXSRC_TO_DEST(*src);
|
|
*dst++ = pixel;
|
|
*dst++ = pixel;
|
|
*dst++ = pixel;
|
|
src++;
|
|
}
|
|
break;
|
|
}
|
|
|
|
// always fill non-wrapping textures with an extra pixel on the right
|
|
if (texture->borderpix)
|
|
*dst++ = 0;
|
|
|
|
/* abuse x var to act as line counter while copying */
|
|
for (x = 1; x < texture->yprescale; x++)
|
|
{
|
|
DEST_TYPE *src1 = (DEST_TYPE *)texture->data + (y * texture->yprescale + texture->borderpix) * texture->rawwidth;
|
|
dst = (DEST_TYPE *)texture->data + (y * texture->yprescale + texture->borderpix + x) * texture->rawwidth;
|
|
memcpy(dst, src1, (texture->rawwidth + 2*texture->borderpix) * sizeof(DEST_TYPE));
|
|
}
|
|
}
|
|
}
|
|
|
|
#undef SDL_TEXFORMAT
|
|
#endif
|