view minijss/jmix_c_in.c @ 2208:90ec1ec89c56

Revamp the palette handling in lib64gfx somewhat, add helper functions to lib64util for handling external palette file options and add support for specifying one of the "internal" palettes or external (.act) palette file to gfxconv and 64vw.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 14 Jun 2019 05:01:12 +0300
parents 95eb6285f45c
children
line wrap: on
line source

/*
 * miniJSS - Mixing routines in C
 * Programmed and designed by Matti 'ccr' Hamalainen
 * (C) Copyright 2006-2015 Tecnic Software productions (TNSP)
 */

//#define JMIXER_DEBUG fprintf(stderr, "[%.8x:%.8x / %.8x]: %d\n", FP_GETH32(tmpPos), FP_GETL32(tmpPos), endPos, sp[FP_GETH32(tmpPos)]);
#define JMIXER_DEBUG
#define JMIXER_ADDBUF_TYPE Sint32


/* Mono / Linear Interpolation
 */
#define JMIXER_SAMPLE_TYPE Sint16
#define JMIXER_INIT
#define JMIXER_FUNC \
    const Sint32 vol = (FP_GETH32(tmpVolume) * mixer->globalVol) / 256; \
    memmove(&tl[0], &tl[1], 4 * sizeof(tl[0])); \
    tl[4] = (((Sint32) sp[FP_GETH32(tmpPos)]) * vol * 3 + tl[3] * 2 + tl[2] + tl[1] + tl[0]) / (256 * 8); \
    *(ap++) += tl[4];

#define JMIXER_NAME        jvmMix_Mono_C_FW
#define JMIXER_NEXT        FP_ADD(tmpPos, tmpDelta);
#define JMIXER_NEXT_RAMP   FP_ADD(tmpPos, tmpDelta); FP_ADD(tmpVolume, tmpDeltaV);
#define JMIXER_ENDCOND     (tmpPos.dw < endPos.dw)
#include "jmixtmpl_c.h"

#define JMIXER_NAME        jvmMix_Mono_C_BW
#define JMIXER_NEXT        FP_SUB(tmpPos, tmpDelta);
#define JMIXER_NEXT_RAMP   FP_SUB(tmpPos, tmpDelta); FP_ADD(tmpVolume, tmpDeltaV);
#define JMIXER_ENDCOND     (tmpPos.dw > endPos.dw)
#include "jmixtmpl_c.h"


#undef JMIXER_SAMPLE_TYPE
#undef JMIXER_INIT
#undef JMIXER_FUNC


/* Stereo / Linear Interpolation
 */
#define JMIXER_SAMPLE_TYPE Sint16
#define JMIXER_INIT

#define JMIXER_FUNC \
    const Sint32 vol_l = (FP_GETH32(tmpVolume) * mixer->globalVol) / 256, \
                 vol_r = (FP_GETH32(tmpVolume) * mixer->globalVol) / 256; \
    memmove(&tl[0], &tl[1], 4 * sizeof(tl[0])); \
    memmove(&tr[0], &tr[1], 4 * sizeof(tr[0])); \
    tl[4] = (((Sint32) sp[FP_GETH32(tmpPos)]) * vol_l * 3 + tl[3] * 2 + tl[2] + tl[1] + tl[0]) / (256 * 8); \
    *(ap++) += tl[4]; \
    tr[4] = (((Sint32) sp[FP_GETH32(tmpPos)]) * vol_r * 3 + tr[3] * 2 + tr[2] + tr[1] + tr[0]) / (256 * 8); \
    *(ap++) += tr[4];

#define JMIXER_NAME        jvmMix_Stereo_C_FW
#define JMIXER_NEXT        FP_ADD(tmpPos, tmpDelta);
#define JMIXER_NEXT_RAMP   FP_ADD(tmpPos, tmpDelta); FP_ADD(tmpVolume, tmpDeltaV);
#define JMIXER_ENDCOND     (tmpPos.dw < endPos.dw)
#include "jmixtmpl_c.h"

#define JMIXER_NAME        jvmMix_Stereo_C_BW
#define JMIXER_NEXT        FP_SUB(tmpPos, tmpDelta);
#define JMIXER_NEXT_RAMP   FP_SUB(tmpPos, tmpDelta); FP_ADD(tmpVolume, tmpDeltaV);
#define JMIXER_ENDCOND     (tmpPos.dw > endPos.dw)
#include "jmixtmpl_c.h"


#undef JMIXER_SAMPLE_TYPE
#undef JMIXER_INIT
#undef JMIXER_FUNC


/* Post processing functions
 */
#define JMIXER_CLAMP \
    if (t < JVM_LIMIT_16_NEG) t = JVM_LIMIT_16_NEG; else    \
    if (t > JVM_LIMIT_16_POS) t = JVM_LIMIT_16_POS;

#define JMIXER_NAME jvmPostProcess_U8_C
#define JMIXER_TYPE Uint8
#define JMIXER_FUNCTION *(sp++) = (t + JVM_ADD_16) >> 8;
#include "jmix_post_c.h"


#define JMIXER_NAME jvmPostProcess_S8_C
#define JMIXER_TYPE Sint8
#define JMIXER_FUNCTION *(sp++) = t >> 8;
#include "jmix_post_c.h"


#define JMIXER_NAME jvmPostProcess_U16_C
#define JMIXER_TYPE Uint16
#define JMIXER_FUNCTION *(sp++) = t + JVM_ADD_16;
#include "jmix_post_c.h"


#define JMIXER_NAME jvmPostProcess_S16_C
#define JMIXER_TYPE Sint16
#define JMIXER_FUNCTION *(sp++) = t;
#include "jmix_post_c.h"