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"
+
+
+// =======================================================================
+// =======================================================================