mame/src/osd/sdl/texcopy.c
2010-02-14 14:08:57 +00:00

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