view 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 source

/*
 * 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"


// =======================================================================
// =======================================================================