From bb91c0edc3a0adf5638b94c2343bffedb56ceb68 Mon Sep 17 00:00:00 2001 From: Sean Fox Date: Thu, 26 Jun 2008 07:00:01 +0000 Subject: Made non-critical bitmap callbacks optional (nullable in struct); assert on critical bitmap callbacks to ensure they are present svn path=/branches/dynis/libnsgif/; revision=4450 --- libnsgif.c | 21 +++++++++++++++++---- libnsgif.h | 2 ++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/libnsgif.c b/libnsgif.c index 925da90..0872507 100644 --- a/libnsgif.c +++ b/libnsgif.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "libnsgif.h" #include "utils/log.h" @@ -303,6 +304,7 @@ gif_result gif_initialise(gif_animation *gif, size_t size, unsigned char *data) /* Initialise the sprite header */ + assert(gif->bitmap_callbacks.bitmap_create); if ((gif->frame_image = gif->bitmap_callbacks.bitmap_create(gif->width, gif->height)) == NULL) { gif_finalise(gif); return GIF_INSUFFICIENT_MEMORY; @@ -382,8 +384,10 @@ static gif_result gif_initialise_sprite(gif_animation *gif, unsigned int width, /* Allocate some more memory */ + assert(gif->bitmap_callbacks.bitmap_create); if ((buffer = gif->bitmap_callbacks.bitmap_create(max_width, max_height)) == NULL) return GIF_INSUFFICIENT_MEMORY; + assert(gif->bitmap_callbacks.bitmap_destroy); gif->bitmap_callbacks.bitmap_destroy(gif->frame_image); gif->frame_image = buffer; gif->width = max_width; @@ -850,6 +854,7 @@ gif_result gif_decode_frame(gif_animation *gif, unsigned int frame) { /* Get the frame data */ + assert(gif->bitmap_callbacks.bitmap_get_buffer); frame_data = (unsigned int *)gif->bitmap_callbacks.bitmap_get_buffer(gif->frame_image); if (!frame_data) return GIF_INSUFFICIENT_MEMORY; @@ -893,6 +898,7 @@ gif_result gif_decode_frame(gif_animation *gif, unsigned int frame) { goto gif_decode_frame_exit; /* Get this frame's data */ + assert(gif->bitmap_callbacks.bitmap_get_buffer); frame_data = (unsigned int *)gif->bitmap_callbacks.bitmap_get_buffer(gif->frame_image); if (!frame_data) return GIF_INSUFFICIENT_MEMORY; @@ -987,11 +993,16 @@ gif_decode_frame_exit: /* Check if we should test for optimisation */ if (gif->frames[frame].virgin) { - gif->frames[frame].opaque = gif->bitmap_callbacks.bitmap_test_opaque(gif->frame_image); + if (gif->bitmap_callbacks.bitmap_test_opaque) + gif->frames[frame].opaque = gif->bitmap_callbacks.bitmap_test_opaque(gif->frame_image); + else + gif->frames[frame].opaque = false; gif->frames[frame].virgin = false; } - gif->bitmap_callbacks.bitmap_set_opaque(gif->frame_image, gif->frames[frame].opaque); - gif->bitmap_callbacks.bitmap_modified(gif->frame_image); + if (gif->bitmap_callbacks.bitmap_set_opaque) + gif->bitmap_callbacks.bitmap_set_opaque(gif->frame_image, gif->frames[frame].opaque); + if (gif->bitmap_callbacks.bitmap_modified) + gif->bitmap_callbacks.bitmap_modified(gif->frame_image); /* Restore the buffer position */ @@ -1076,8 +1087,10 @@ static unsigned int gif_interlaced_line(int height, int y) { void gif_finalise(gif_animation *gif) { /* Release all our memory blocks */ - if (gif->frame_image) + if (gif->frame_image) { + assert(gif->bitmap_callbacks.bitmap_destroy); gif->bitmap_callbacks.bitmap_destroy(gif->frame_image); + } gif->frame_image = NULL; free(gif->frames); gif->frames = NULL; diff --git a/libnsgif.h b/libnsgif.h index 8564b12..e0c0af7 100644 --- a/libnsgif.h +++ b/libnsgif.h @@ -74,6 +74,8 @@ typedef struct gif_bitmap_callback_vt { gif_bitmap_cb_create bitmap_create; /**< Create a bitmap. */ gif_bitmap_cb_destroy bitmap_destroy; /**< Free a bitmap. */ gif_bitmap_cb_get_buffer bitmap_get_buffer; /**< Return a pointer to the pixel data in a bitmap. */ + /** Members below are optional + */ gif_bitmap_cb_set_opaque bitmap_set_opaque; /**< Sets whether a bitmap should be plotted opaque. */ gif_bitmap_cb_test_opaque bitmap_test_opaque; /**< Tests whether a bitmap has an opaque alpha channel. */ gif_bitmap_cb_modified bitmap_modified; /**< The bitmap image has changed, so flush any persistant cache. */ -- cgit v1.2.3