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
--- a/edtimeline.h	Wed Oct 17 00:01:46 2012 +0300
+++ b/edtimeline.h	Wed Oct 17 00:23:36 2012 +0300
@@ -2,7 +2,7 @@
 #define EDTIMELINE_H
 
 #include <QWidget>
-#include "dmtimeline.h"
+#include "dmengine.h"
 
 class TimelineTrackView : public QWidget
 {