Mercurial > hg > dmlib
diff dmblitfunc.h @ 95:0430f484641b
Add unscaled blitting functions.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 02 Oct 2012 18:51:16 +0300 |
parents | e5796ffce131 |
children | afa28947e400 |
line wrap: on
line diff
--- a/dmblitfunc.h Tue Oct 02 18:14:44 2012 +0300 +++ b/dmblitfunc.h Tue Oct 02 18:51:16 2012 +0300 @@ -309,5 +309,237 @@ #include "dmscaledblit.h" + // ======================================================================= // ======================================================================= + + + +// ======================================================================= +// DMD_NONE +// ======================================================================= + +#define DM_BLITFUNC_NAME dmUnscaledBlitSurface8to8 +#define DM_BLITFUNC_SRC_BYTES 1 +#define DM_BLITFUNC_DST_BYTES 1 +#define DM_BLITFUNC_SRC_TYPE Uint8 +#define DM_BLITFUNC_DST_TYPE Uint8 + +#define DM_BLITFUNC_INNER *dp++ = sp[xv]; + +#include "dmunscaledblit.h" + +// ----------------------------------------------------------------------- + +#define DM_BLITFUNC_NAME dmUnscaledBlitSurface8to32 +#define DM_BLITFUNC_SRC_BYTES 1 +#define DM_BLITFUNC_DST_BYTES 4 +#define DM_BLITFUNC_SRC_TYPE Uint8 +#define DM_BLITFUNC_DST_TYPE Uint32 + +#define DM_BLITFUNC_VARS const Uint32 *pal; +#define DM_BLITFUNC_INIT \ + if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \ + pal = (Uint32 *) src->format->palette->colors; + +#define DM_BLITFUNC_INNER *dp++ = pal[sp[xv]]; + +#include "dmunscaledblit.h" + +// ----------------------------------------------------------------------- + +#define DM_BLITFUNC_NAME dmUnscaledBlitSurface32to32 +#define DM_BLITFUNC_SRC_BYTES 4 +#define DM_BLITFUNC_DST_BYTES 4 +#define DM_BLITFUNC_SRC_TYPE Uint32 +#define DM_BLITFUNC_DST_TYPE Uint32 +#define DM_BLITFUNC_INIT +#define DM_BLITFUNC_INNER *dp++ = sp[xv]; + +#include "dmunscaledblit.h" + + +// ======================================================================= +// DMD_TRANSPARENT +// ======================================================================= + +#define DM_BLITFUNC_NAME dmUnscaledBlitSurface8to8Transparent +#define DM_BLITFUNC_SRC_BYTES 1 +#define DM_BLITFUNC_DST_BYTES 1 +#define DM_BLITFUNC_SRC_TYPE Uint8 +#define DM_BLITFUNC_DST_TYPE Uint8 + +#define DM_BLITFUNC_INNER \ + *dp = sp[xv] ? sp[xv] : *dp; dp++; + +#include "dmunscaledblit.h" + +// ----------------------------------------------------------------------- + +#define DM_BLITFUNC_NAME dmUnscaledBlitSurface8to32Transparent +#define DM_BLITFUNC_SRC_BYTES 1 +#define DM_BLITFUNC_DST_BYTES 4 +#define DM_BLITFUNC_SRC_TYPE Uint8 +#define DM_BLITFUNC_DST_TYPE DMRGBA32 +#define DM_BLITFUNC_VARS const DMRGBA32 *pal; +#define DM_BLITFUNC_INIT \ + if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \ + pal = (DMRGBA32 *) src->format->palette->colors; + +#define DM_BLITFUNC_INNER \ + const DMRGBA32 q = pal[sp[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 "dmunscaledblit.h" + + +// ----------------------------------------------------------------------- + +#define DM_BLITFUNC_NAME dmUnscaledBlitSurface32to32Transparent +#define DM_BLITFUNC_SRC_BYTES 4 +#define DM_BLITFUNC_DST_BYTES 4 + +#ifdef DM_USE_SIMD +#define DM_BLITFUNC_VARS \ + const Uint32 qpdmask = 0xff000000; \ + const Uint64 qpdrm = 0xff00ff00ff00ffULL; + +#define DM_BLITFUNC_SRC_TYPE Uint32 +#define DM_BLITFUNC_DST_TYPE Uint32 +#define DM_BLITFUNC_INNER \ + asm( \ + "movd %2, %%mm1\n" \ + \ + "movd %3, %%mm2\n" \ + "movq %%mm1, %%mm5\n" \ + "pand %%mm2, %%mm5\n" \ + "psrlw $8, %%mm5\n" \ + "punpcklwd %%mm5, %%mm5\n" \ + "punpckhwd %%mm5, %%mm5\n" \ + \ + "pxor %%mm2, %%mm2\n" \ + "movd %1, %%mm3\n" \ + "punpcklbw %%mm2, %%mm1\n" \ + "punpcklbw %%mm2, %%mm3\n" \ + \ + "psubw %%mm3, %%mm1\n" \ + "pmullw %%mm5, %%mm1\n" \ + "psraw $8, %%mm1\n" \ + "paddw %%mm3, %%mm1\n" \ + "pand %4, %%mm1\n" \ + "packuswb %%mm2, %%mm1\n" \ + "movd %%mm1, %0\n" \ + : "=m" (*dp) \ + : "m" (*dp), "m" (sp[xv]), "m" (qpdmask), "m" (qpdrm) \ + : "memory", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5" ); dp++; + +#define DM_BLITFUNC_FINISH asm("emms\n"); + +#else + +#define DM_BLITFUNC_SRC_TYPE DMRGBA32 +#define DM_BLITFUNC_DST_TYPE DMRGBA32 +#define DM_BLITFUNC_INNER \ + const DMRGBA32 q = sp[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 "dmunscaledblit.h" + + +// ======================================================================= +// DMD_SATURATE +// ======================================================================= + +#define DM_BLITFUNC_NAME dmUnscaledBlitSurface8to8Saturate +#define DM_BLITFUNC_SRC_BYTES 1 +#define DM_BLITFUNC_DST_BYTES 1 +#define DM_BLITFUNC_SRC_TYPE Uint8 +#define DM_BLITFUNC_DST_TYPE Uint8 +#define DM_BLITFUNC_INNER \ + const int q = sp[xv] + *dp; \ + *(dp++) = q < 256 ? q : 255; + +#include "dmunscaledblit.h" + +// ----------------------------------------------------------------------- + +#define DM_BLITFUNC_NAME dmUnscaledBlitSurface8to32Saturate +#define DM_BLITFUNC_SRC_BYTES 1 +#define DM_BLITFUNC_DST_BYTES 4 +#define DM_BLITFUNC_SRC_TYPE Uint8 +#define DM_BLITFUNC_DST_TYPE DMRGBA32 +#define DM_BLITFUNC_VARS const DMRGBA32 *pal; +#define DM_BLITFUNC_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_BLITFUNC_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[xv]]) \ + : "memory", "%mm1", "%mm2" ); dp++; + +#define DM_BLITFUNC_FINISH asm("emms\n"); +#else +#define DM_BLITFUNC_INNER \ + const DMRGBA32 q = pal[sp[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 "dmunscaledblit.h" + +// ----------------------------------------------------------------------- + +#define DM_BLITFUNC_NAME dmUnscaledBlitSurface32to32Saturate +#define DM_BLITFUNC_SRC_BYTES 4 +#define DM_BLITFUNC_DST_BYTES 4 +#define DM_BLITFUNC_INIT + +#ifdef DM_USE_SIMD +#define DM_BLITFUNC_SRC_TYPE Uint32 +#define DM_BLITFUNC_DST_TYPE Uint32 +#define DM_BLITFUNC_INNER \ + asm("movd %2, %%mm1\n" \ + "movd %1, %%mm2\n" \ + "paddusb %%mm2, %%mm1\n" \ + "movd %%mm1, %0\n" \ + : "=m" (*dp) \ + : "m" (*dp), "m" (sp[xv]) \ + : "memory", "%mm1", "%mm2" ); dp++; + +#define DM_BLITFUNC_FINISH asm("emms\n"); +#else +#define DM_BLITFUNC_SRC_TYPE DMRGBA32 +#define DM_BLITFUNC_DST_TYPE DMRGBA32 +#define DM_BLITFUNC_INNER \ + const DMRGBA32 q = sp[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 "dmunscaledblit.h" + + +// =======================================================================