Mercurial > hg > dmlib
diff dmblitfunc.h @ 0:32250b436bca
Initial re-import.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 28 Sep 2012 01:54:23 +0300 |
parents | |
children | 62b2c3de93a8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmblitfunc.h Fri Sep 28 01:54:23 2012 +0300 @@ -0,0 +1,251 @@ +/* + * DMLib + * -- Sprite / surface blitting functions + * Programmed and designed by Matti 'ccr' Hamalainen + * (C) Copyright 2011-2012 Tecnic Software productions (TNSP) + */ + +// ======================================================================= +// DMD_NONE +// ======================================================================= + +#define DM_SCALED_NAME dmScaledBlitSurface8to8 +#define DM_SCALED_SRC_BYTES 1 +#define DM_SCALED_DST_BYTES 1 +#define DM_SCALED_SRC_TYPE Uint8 +#define DM_SCALED_DST_TYPE Uint8 + +#define DM_SCALED_INNER *dp++ = sp[FP_GETH(xv)]; + +#include "dmscaledblit.h" + +// ----------------------------------------------------------------------- + +#define DM_SCALED_NAME dmScaledBlitSurface8to32 +#define DM_SCALED_SRC_BYTES 1 +#define DM_SCALED_DST_BYTES 4 +#define DM_SCALED_SRC_TYPE Uint8 +#define DM_SCALED_DST_TYPE Uint32 + +#define DM_SCALED_VARS const Uint32 *pal; +#define DM_SCALED_INIT \ + if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \ + pal = (Uint32 *) src->format->palette->colors; + +#define DM_SCALED_INNER *dp++ = pal[sp[FP_GETH(xv)]]; + +#include "dmscaledblit.h" + +// ----------------------------------------------------------------------- + +#define DM_SCALED_NAME dmScaledBlitSurface32to32 +#define DM_SCALED_SRC_BYTES 4 +#define DM_SCALED_DST_BYTES 4 +#define DM_SCALED_SRC_TYPE Uint32 +#define DM_SCALED_DST_TYPE Uint32 +#define DM_SCALED_INIT + +#define DM_SCALED_INNER *dp++ = sp[FP_GETH(xv)]; + +#include "dmscaledblit.h" + + +// ======================================================================= +// DMD_TRANSPARENT +// ======================================================================= + +#define DM_SCALED_NAME dmScaledBlitSurface8to8Transparent +#define DM_SCALED_SRC_BYTES 1 +#define DM_SCALED_DST_BYTES 1 +#define DM_SCALED_SRC_TYPE Uint8 +#define DM_SCALED_DST_TYPE Uint8 + +#define DM_SCALED_INNER \ + *dp = sp[FP_GETH(xv)] ? sp[FP_GETH(xv)] : *dp; dp++; + +#include "dmscaledblit.h" + +// ----------------------------------------------------------------------- + +#define DM_SCALED_NAME dmScaledBlitSurface8to32Transparent +#define DM_SCALED_SRC_BYTES 1 +#define DM_SCALED_DST_BYTES 4 +#define DM_SCALED_SRC_TYPE Uint8 +#define DM_SCALED_DST_TYPE DMRGBA32 +#define DM_SCALED_VARS const DMRGBA32 *pal; +#define DM_SCALED_INIT \ + if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \ + pal = (DMRGBA32 *) src->format->palette->colors; + +#define DM_SCALED_INNER \ + const DMRGBA32 q = pal[sp[FP_GETH(xv)]]; \ + dp->r += ((q.r - dp->r) * q.a) >> 8; \ + dp->g += ((q.g - dp->g) * q.a) >> 8; \ + dp->b += ((q.b - dp->b) * q.a) >> 8; \ + dp->a = q.a; \ + dp++; + +#include "dmscaledblit.h" + + +// ----------------------------------------------------------------------- + +#define DM_SCALED_NAME dmScaledBlitSurface32to32Transparent +#define DM_SCALED_SRC_BYTES 4 +#define DM_SCALED_DST_BYTES 4 +#define DM_SCALED_INIT + +#ifdef DM_USE_SIMD +#define DM_SCALED_INNER_INIT \ + const Uint32 qpdmask = 0x000000ff; + +#define DM_SCALED_SRC_TYPE Uint32 +#define DM_SCALED_DST_TYPE Uint32 +#define DM_SCALED_INNER \ + asm( \ + "movd %2, %%mm1\n" \ + "movq %%mm1, %%mm3\n" \ + "movd %3, %%mm5\n" \ + "pand %%mm5, %%mm3\n" \ + "movq %%mm3, %%mm4\n" \ + "psllq $8, %%mm4\n" \ + "por %%mm4, %%mm3\n" \ + "psllq $16, %%mm3\n" \ + "por %%mm3, %%mm4\n" \ + \ + "pxor %%mm2, %%mm2\n" \ + "punpcklbw %%mm2, %%mm4\n" \ + \ + "movd %1, %%mm3\n" \ + "punpcklbw %%mm2, %%mm1\n" \ + "punpcklbw %%mm2, %%mm3\n" \ + "psubw %%mm3, %%mm1\n" \ + "pmullw %%mm4, %%mm1\n" \ + "psrlw $8, %%mm1\n" \ + "packuswb %%mm2, %%mm1\n" \ + "movd %%mm1, %0\n" \ + : "=m" (*dp) \ + : "m" (*dp), "m" (sp[FP_GETH(xv)]), "m" (qpdmask) \ + : "memory" ); dp++; + +#define DM_SCALED_FINISH asm("emms\n"); +#else +#define DM_SCALED_SRC_TYPE DMRGBA32 +#define DM_SCALED_DST_TYPE DMRGBA32 +#define DM_SCALED_INNER \ + const DMRGBA32 q = sp[FP_GETH(xv)]; \ + dp->r += ((q.r - dp->r) * q.a) >> 8; \ + dp->g += ((q.g - dp->g) * q.a) >> 8; \ + dp->b += ((q.b - dp->b) * q.a) >> 8; \ + dp->a = q.a; \ + dp++; +#endif + +#include "dmscaledblit.h" + +// ----------------------------------------------------------------------- + +#define DM_SCALED_NAME dmScaledBlitSurface32to32TransparentX +#define DM_SCALED_SRC_BYTES 4 +#define DM_SCALED_DST_BYTES 4 +#define DM_SCALED_SRC_TYPE DMRGBA32 +#define DM_SCALED_DST_TYPE DMRGBA32 +#define DM_SCALED_INIT + +#define DM_SCALED_INNER \ + const DMRGBA32 q = sp[FP_GETH(xv)]; \ + dp->r = (q.r * q.a + dp->r * dp->a) >> 9; \ + dp->g = (q.g * q.a + dp->g * dp->a) >> 9; \ + dp->b = (q.b * q.a + dp->b * dp->a) >> 9; \ + dp->a = q.a ? q.a : dp->a; \ + dp++; + +#include "dmscaledblit.h" + + +// ======================================================================= +// DMD_SATURATE +// ======================================================================= + +#define DM_SCALED_NAME dmScaledBlitSurface8to8Saturate +#define DM_SCALED_SRC_BYTES 1 +#define DM_SCALED_DST_BYTES 1 +#define DM_SCALED_SRC_TYPE Uint8 +#define DM_SCALED_DST_TYPE Uint8 +#define DM_SCALED_INNER *(dp++) += sp[FP_GETH(xv)]; +#include "dmscaledblit.h" + +// ----------------------------------------------------------------------- + +#define DM_SCALED_NAME dmScaledBlitSurface8to32Saturate +#define DM_SCALED_SRC_BYTES 1 +#define DM_SCALED_DST_BYTES 4 +#define DM_SCALED_SRC_TYPE Uint8 +#define DM_SCALED_DST_TYPE DMRGBA32 +#define DM_SCALED_VARS const DMRGBA32 *pal; +#define DM_SCALED_INIT \ + if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \ + pal = (DMRGBA32 *) src->format->palette->colors; + +#ifdef DM_USE_SIMD +#define DM_SCALED_INNER \ + asm("movd %2, %%mm1\n" \ + "movd %1, %%mm2\n" \ + "paddusb %%mm2, %%mm1\n" \ + "movd %%mm1, %0\n" \ + : "=m" (*dp) \ + : "m" (*dp), "m" (pal[sp[FP_GETH(xv)]]) \ + : "memory" ); dp++; + +#define DM_SCALED_FINISH asm("emms\n"); +#else +#define DM_SCALED_INNER \ + const DMRGBA32 q = pal[sp[FP_GETH(xv)]]; \ + const int qr = dp->r + q.r, qg = dp->g + q.g, qb = dp->b + q.b; \ + dp->r = qr < 256 ? qr : 255; \ + dp->g = qg < 256 ? qg : 255; \ + dp->b = qb < 256 ? qb : 255; \ + dp->a = q.a; \ + dp++; +#endif + +#include "dmscaledblit.h" + +// ----------------------------------------------------------------------- + +#define DM_SCALED_NAME dmScaledBlitSurface32to32Saturate +#define DM_SCALED_SRC_BYTES 4 +#define DM_SCALED_DST_BYTES 4 +#define DM_SCALED_INIT + +#ifdef DM_USE_SIMD +#define DM_SCALED_SRC_TYPE Uint32 +#define DM_SCALED_DST_TYPE Uint32 +#define DM_SCALED_INNER \ + asm("movd %2, %%mm1\n" \ + "movd %1, %%mm2\n" \ + "paddusb %%mm2, %%mm1\n" \ + "movd %%mm1, %0\n" \ + : "=m" (*dp) \ + : "m" (*dp), "m" (sp[FP_GETH(xv)]) \ + : "memory" ); dp++; + +#define DM_SCALED_FINISH asm("emms\n"); +#else +#define DM_SCALED_SRC_TYPE DMRGBA32 +#define DM_SCALED_DST_TYPE DMRGBA32 +#define DM_SCALED_INNER \ + const DMRGBA32 q = sp[FP_GETH(xv)]; \ + const int qr = dp->r + q.r, qg = dp->g + q.g, qb = dp->b + q.b; \ + dp->r = qr < 256 ? qr : 255; \ + dp->g = qg < 256 ? qg : 255; \ + dp->b = qb < 256 ? qb : 255; \ + dp->a = q.a; \ + dp++; +#endif + +#include "dmscaledblit.h" + + +// ======================================================================= +// =======================================================================