changeset 18:022eee2e7de6

Add dmScaledBlitSurface32to32TransparentGA().
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 28 Sep 2012 14:50:58 +0300
parents a60fe802636a
children 10f58ff516b3
files dmblitfunc.h
diffstat 1 files changed, 58 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/dmblitfunc.h	Fri Sep 28 14:50:14 2012 +0300
+++ b/dmblitfunc.h	Fri Sep 28 14:50:58 2012 +0300
@@ -165,6 +165,64 @@
 #include "dmscaledblit.h"
 
 
+// -----------------------------------------------------------------------
+
+#define DM_SCALED_NAME dmScaledBlitSurface32to32TransparentGA
+#define DM_SCALED_SRC_BYTES 4
+#define DM_SCALED_DST_BYTES 4
+#define DM_SCALED_ARGS , Uint32 alpha
+
+#ifdef DM_USE_SIMD
+#define DM_SCALED_VARS \
+    const Uint64 qpdrm   = 0xff00ff00ff00ffULL;
+
+#define DM_SCALED_SRC_TYPE Uint32
+#define DM_SCALED_DST_TYPE Uint32
+#define DM_SCALED_INNER_INIT \
+    asm(					\
+        "movd        %0,     %%mm4\n"		\
+        "punpcklwd   %%mm4,  %%mm4\n"		\
+        "punpckldq   %%mm4,  %%mm4\n"		\
+        : 					\
+        : "m" (alpha)				\
+        : "%mm4" );
+
+#define DM_SCALED_INNER				\
+    asm(					\
+        "movd        %2,     %%mm1\n"		\
+        "pxor        %%mm2,  %%mm2\n"		\
+        "movd        %1,     %%mm3\n"		\
+        "punpcklbw   %%mm2,  %%mm1\n"		\
+        "punpcklbw   %%mm2,  %%mm3\n"		\
+        \
+        "psubw       %%mm3,  %%mm1\n"		\
+        "pmullw      %%mm4,  %%mm1\n"		\
+        "psraw       $8,     %%mm1\n"		\
+        "paddw       %%mm3,  %%mm1\n"		\
+        "pand        %3,     %%mm1\n"		\
+        "packuswb    %%mm2,  %%mm1\n"		\
+        "movd        %%mm1,  %0\n"		\
+        : "=m" (*dp)				\
+        : "m" (*dp), "m" (sp[FP_GETH(xv)]), "m" (qpdrm)	\
+        : "memory", "%mm1", "%mm2", "%mm3", "%mm4" ); 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) * alpha) >> 8; \
+    dp->g += ((q.g - dp->g) * alpha) >> 8; \
+    dp->b += ((q.b - dp->b) * alpha) >> 8; \
+    dp->a  = alpha; \
+    dp++;
+#endif
+
+#include "dmscaledblit.h"
+
 // =======================================================================
 // DMD_SATURATE
 // =======================================================================