Mercurial > hg > dmlib
changeset 369:e1c984404b6b
Re-entrancy.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 17 Oct 2012 00:23:36 +0300 |
parents | 08ea68abb1f8 |
children | 7e640b1f990b 29f0babc686f |
files | dmengine.c dmsimple.c dmtimeline.h edtimeline.h |
diffstat | 4 files changed, 13 insertions(+), 230 deletions(-) [+] |
line wrap: on
line diff
--- a/dmengine.c Wed Oct 17 00:01:46 2012 +0300 +++ b/dmengine.c Wed Oct 17 00:23:36 2012 +0300 @@ -53,7 +53,7 @@ for (i = 0; i < nengineEffects; i++) { if (engineEffects[i].init != NULL && - (res = engineEffects[i].init(engine, &engine->effectData[i])) != DMERR_OK) + (res = engineEffects[i].init(engine, &(engine->effectData[i]))) != DMERR_OK) return res; } @@ -63,14 +63,17 @@ void engineShutdownEffects(DMEngineData *engine) { - int i; - for (i = 0; i < nengineEffects; i++) + if (engine != NULL && engine->effectData != NULL) { - if (engineEffects[i].shutdown != NULL) - engineEffects[i].shutdown(engine, engine->effectData[i]); + int i; + for (i = 0; i < nengineEffects; i++) + { + if (engineEffects[i].shutdown != NULL) + engineEffects[i].shutdown(engine, engine->effectData[i]); + } + dmFree(engine->effectData); + engine->effectData = NULL; } - dmFree(engine->effectData); - engine->effectData = NULL; }
--- a/dmsimple.c Wed Oct 17 00:01:46 2012 +0300 +++ b/dmsimple.c Wed Oct 17 00:23:36 2012 +0300 @@ -287,7 +287,7 @@ } // Initialize effects - if ((err = dmInitializeEffects()) != DMERR_OK) + if ((err = engineInitializeEffects(&engine)) != DMERR_OK) { dmError("Effects initialization failed, %d: %s\n", err, dmErrorStr(err)); @@ -432,7 +432,7 @@ dmFreeTimeline(engine.tl); dmFreePreparedTimelineData(engine.ptl); - dmShutdownEffects(); + engineShutdownEffects(&engine); dmres_close(engine.resources); if (engine.demoShutdown != NULL)
--- a/dmtimeline.h Wed Oct 17 00:01:46 2012 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,220 +0,0 @@ -#ifndef DMTIMELINE_H -#define DMTIMELINE_H - -#include "dmlib.h" -#include "dmres.h" -#include "dmvecmat.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define DT_MAGIC_ID "SDMETLNE" -#define DT_MAX_EFFECT_PARAMS 16 -#define DT_MAX_NAME_LENGTH 32 -#define DT_FLOAT_STORE_SIZE 16 - - -enum -{ - EFIT_SET, // No interpolation, just "set" the value - EFIT_LINEAR, // Linear interpolation - EFIT_SMOOTH, // Smoothstep interpolation -}; - -enum -{ - EFPT_INT, - EFPT_FLOAT, - EFPT_STRING, - EFPT_VECTOR, - EFPT_MATRIX, -}; - - -typedef struct -{ - int type; // Interpolation type (EFIT_*) between this and next point - int time; // Offsets to event start, -1 == attach to event start, -2 = event end (if event) - - int vint; - DMFloat vfloat; - DMVector vector; - DMMatrix matrix; -} DMTimelinePoint; - - -typedef struct -{ - int npoints, nallocated; - DMTimelinePoint *points; -} DMTimelinePoints; - - -typedef struct -{ - char *name; // Name / description of the parameter - int type; // Type (EFPT_*) - - DMTimelinePoints pts; - char *vstr; - - // Current values (interpolated) - int vint; - DMFloat vfloat; - DMVector vvector; - DMMatrix vmatrix; -} DMTimelineEventParam; - - -typedef struct -{ - char name[DT_MAX_NAME_LENGTH]; - Uint32 type; -} DMFTimelineEventParam; - - -typedef struct -{ - char * name; - int type; - - int (*init)(void **data); - void (*shutdown)(void *data); - int (*render)(SDL_Surface *screen, void *data, const DMTimelineEventParam *params, const int time); - - int nparams; - DMTimelineEventParam params[DT_MAX_EFFECT_PARAMS]; -} DMEffect; - - -typedef struct -{ - Uint32 start, duration; - char effectName[DT_MAX_NAME_LENGTH]; - Uint32 nparams; -} DMFTimelineEvent; - - -typedef struct -{ - int start, duration; - DMEffect *effect; - int nparams; - DMTimelineEventParam *params; -} DMTimelineEvent; - - -typedef struct -{ - BOOL enabled; - DMTimelinePoints points; -} DMTimelineCurve; - - -typedef struct -{ - char name[DT_MAX_NAME_LENGTH]; - Uint8 enabled; - Uint32 nevents; -} DMFTimelineTrack; - - -typedef struct -{ - char *name; // Name of the timeline track - BOOL enabled; // Enabled? - - int nevents, nallocated; // Number of events - DMTimelineEvent **events; // Events - - DMTimelineCurve composite; // Composite curve (transparency of the "layer") -} DMTimelineTrack; - - -typedef struct -{ - char magic[8]; - char name[DT_MAX_NAME_LENGTH]; - Uint32 ntracks; - Uint32 duration; -} DMFTimeline; - - -typedef struct -{ - char *name; - int ntracks, nallocated, duration; - DMTimelineTrack **tracks; -} DMTimeline; - - -typedef struct -{ - DMTimelineTrack *track; - DMTimelineEvent *event; -} DMPreparedEvent; - - -typedef struct _DMPreparedEventGroup -{ - int start, end, nevents, nallocated; - DMPreparedEvent *events; - - struct _DMPreparedEventGroup *next, *prev; -} DMPreparedEventGroup; - - -typedef struct -{ - int duration, ngroups, pos; - DMPreparedEventGroup **groups; -} DMPreparedTimeline; - - -extern DMEffect *dmEffects; -extern int ndmEffects, ndmEffectsAlloc; -extern void **dmEffectData; - -// Effect registration -int dmRegisterEffect(const DMEffect *ef); -int dmInitializeEffects(); -void dmShutdownEffects(); -DMEffect *dmFindEffect(const char *name, const int nparams); -DMEffect *dmFindEffectByName(const char *name); - - -// Basic timeline handling -int dmLoadTimeline(DMResource *res, DMTimeline **tl); -void dmFreeTimeline(DMTimeline *tl); - -void dmFreeTimelinePoints(DMTimelinePoints *points); -void dmFreeTimelineEventParam(DMTimelineEventParam *param); -void dmFreeTimelineEvent(DMTimelineEvent *event); -void dmFreeTimelineTrack(DMTimelineTrack *track); - - -// Execution related -int dmPrepareTimeline(DMTimeline *tl, DMPreparedTimeline *ptl); -void dmFreePreparedTimelineData(DMPreparedTimeline *ptl); - -int dmSeekTimeline(DMPreparedTimeline *tl, int time); -int dmExecuteTimeline(DMPreparedTimeline *tl, SDL_Surface *screen, int time); - - -// Editing/saving related functions -int dmSaveTimeline(DMResource *res, DMTimeline *tl); - -int dmTimelineNew(DMTimeline **tl, const char *name); -int dmTimelineAddTrack(DMTimeline *tl, DMTimelineTrack **track, const char *name); -int dmTimelineTrackAddEvent(DMTimelineTrack *track, int start, int duration, DMTimelineEvent **pev); -int dmTimelineEventSetEffect(DMTimelineEvent *event, const char *name); - -DMTimelineEvent *dmTimelineGetEventAt(DMTimelineTrack *track, int time); - - -#ifdef __cplusplus -} -#endif - -#endif // DMTIMELINE_H