diff options
-rw-r--r-- | src/stage.c | 42 |
1 files changed, 37 insertions, 5 deletions
diff --git a/src/stage.c b/src/stage.c index 806b633..a9a5829 100644 --- a/src/stage.c +++ b/src/stage.c @@ -14,6 +14,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <assert.h> #include <stdlib.h> #include <string.h> @@ -40,6 +41,9 @@ struct stage_t { /* minimally initialize a stage to carry an object */ static void _stage_set_object(stage_t *stage, const char *name, void *object, stage_render_func_t render_func, stage_free_func_t free_func) { + assert(stage); + assert(name); + strncpy(stage->name, name, sizeof(stage->name)); stage->render = render_func; stage->free = free_func; @@ -69,6 +73,8 @@ static stage_t * _stage_new(const char *name, void *object, stage_render_func_t /* free a stage, no list manipulation occurs, this is purely cleanup of the stage and its object */ static void _stage_free(stage_t *stage) { + assert(stage); + if (stage->free) stage->free(stage, stage->object); @@ -82,6 +88,9 @@ stage_t * stage_new(stage_t *parent, int layer, const char *name, void *object, { stage_t *stage; + assert(parent || !layer); + assert(layer < STAGE_LAYERS_MAX); + stage = _stage_new(name, object, render_func, free_func); if (!stage) return NULL; @@ -98,12 +107,16 @@ stage_t * stage_new(stage_t *parent, int layer, const char *name, void *object, /* replace a given stage's object only - retain render/free hooks and everything else, invalidates cache - DOES NOT FREE OLD OBJECT */ void stage_set_object(stage_t *stage, void *object) { + assert(stage); + stage->object = object; } void stage_get_object(const stage_t *stage, void **res_object) { + assert(stage); + *res_object = stage->object; } @@ -111,6 +124,8 @@ void stage_get_object(const stage_t *stage, void **res_object) /* replaces a given stage's object-related properties but otherwise keeping the existing state */ void stage_replace(stage_t *stage, const char *name, void *object, stage_render_func_t render_func, stage_free_func_t free_func) { + assert(stage); + if (stage->free) stage->free(stage, stage->object); @@ -124,6 +139,8 @@ static void _stage_free_all(stage_t *stage, int force); /* recursively free the layers of this stage, but not the stage itself */ static void _stage_free_layers(stage_t *stage, int force) { + assert(stage); + for (int i = 0; i < STAGE_LAYERS_MAX; i++) { stage_t *s, *_s; @@ -136,6 +153,8 @@ static void _stage_free_layers(stage_t *stage, int force) /* free the stage recursively, skipping locked stages if !force */ static void _stage_free_all(stage_t *stage, int force) { + assert(stage); + if (stage->locked && !force) return; @@ -160,6 +179,8 @@ stage_t * stage_free(stage_t *stage) /* set the alpha on a stage */ void stage_set_alpha(stage_t *stage, float alpha) { + assert(stage); + stage->alpha = alpha; } @@ -167,6 +188,8 @@ void stage_set_alpha(stage_t *stage, float alpha) /* set a stage's active state (participates in rendering) */ void stage_set_active(stage_t *stage, int active) { + assert(stage); + stage->active = active; } @@ -174,6 +197,8 @@ void stage_set_active(stage_t *stage, int active) /* set a stage's locked state (doesn't get freed by clears) */ void stage_set_locked(stage_t *stage, int locked) { + assert(stage); + stage->locked = locked; } @@ -182,11 +207,11 @@ void stage_set_locked(stage_t *stage, int locked) /* TODO: maybe support supplying a parent here for switching parents? */ void stage_set_layer(stage_t *stage, int layer) { - /* TODO: assert parent, and layer sanity */ - if (stage->parent) { - (void) dll_del(&stage->layer); - (void) dll_add_pre(&stage->parent->layers[layer], &stage->layer); - } + assert(stage); + assert(stage->parent); + + (void) dll_del(&stage->layer); + (void) dll_add_pre(&stage->parent->layers[layer], &stage->layer); } @@ -226,6 +251,8 @@ static void _render_stage(const stage_t *stage, float alpha) { float a = alpha * stage->alpha; + assert(stage); + if (stage->render) stage->render(stage, stage->object, a); @@ -245,6 +272,8 @@ static void _render_stage(const stage_t *stage, float alpha) /* recursively render the supplied stage tree, skipping inactive branches */ void stage_render(const stage_t *stage) { + assert(stage); + if (!stage->active) return; @@ -255,6 +284,9 @@ void stage_render(const stage_t *stage) /* lookup a stage from a name, returns first match */ stage_t * stage_lookup_name(stage_t *stage, const char *name) { + assert(stage); + assert(name); + if (!strncmp(stage->name, name, sizeof(stage->name))) return stage; |