From 17096ef891ce955a81d56527ce3f764121fb2deb Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Sun, 24 Jan 2010 01:46:17 +0000 Subject: Somewhat rationalise GTK throbber initialisation svn path=/trunk/netsurf/; revision=9872 --- gtk/gtk_throbber.c | 192 +++-------------------------------------------------- 1 file changed, 9 insertions(+), 183 deletions(-) (limited to 'gtk/gtk_throbber.c') diff --git a/gtk/gtk_throbber.c b/gtk/gtk_throbber.c index ea7cf43ac..5f79a2182 100644 --- a/gtk/gtk_throbber.c +++ b/gtk/gtk_throbber.c @@ -38,12 +38,12 @@ struct nsgtk_throbber *nsgtk_throbber = NULL; * \param ... Filenames of PNGs containing frames. * \return true on success. */ -bool nsgtk_throbber_initialise_from_png(const int frames, ...) +bool nsgtk_throbber_initialise_from_png(const int frames, char** frame_files) { - va_list filenames; GError *err = NULL; struct nsgtk_throbber *throb; /**< structure we generate */ bool errors_when_loading = false; /**< true if a frame failed */ + int frame_loop; if (frames < 2) { /* we need at least two frames - one for idle, one for active */ @@ -64,25 +64,20 @@ bool nsgtk_throbber_initialise_from_png(const int frames, ...) return false; } - va_start(filenames, frames); - - for (int i = 0; i < frames; i++) { - const char *fn = va_arg(filenames, const char *); - throb->framedata[i] = gdk_pixbuf_new_from_file(fn, &err); + for (frame_loop = 0; frame_loop < frames; frame_loop++) { + throb->framedata[frame_loop] = gdk_pixbuf_new_from_file(frame_files[frame_loop], &err); if (err != NULL) { LOG(("Error when loading %s: %s (%d)", - fn, err->message, err->code)); - throb->framedata[i] = NULL; + frame_files[frame_loop], err->message, err->code)); + throb->framedata[frame_loop] = NULL; errors_when_loading = true; } } - va_end(filenames); - if (errors_when_loading == true) { - for (int i = 0; i < frames; i++) { - if (throb->framedata[i] != NULL) - gdk_pixbuf_unref(throb->framedata[i]); + for (frame_loop = 0; frame_loop < frames; frame_loop++) { + if (throb->framedata[frame_loop] != NULL) + gdk_pixbuf_unref(throb->framedata[frame_loop]); } free(throb->framedata); @@ -96,175 +91,6 @@ bool nsgtk_throbber_initialise_from_png(const int frames, ...) return true; } -/** - * Creates the throbber using a single GIF, using the first frame as the - * inactive throbber, and the others for the active animation. The GIF must - * therefor have at least two frames. - * - * \param fn Filename of GIF to use. It must have at least two frames. - * \return true on success. - */ -#ifdef WITH_GIF -extern gif_bitmap_callback_vt gif_bitmap_callbacks; /**< external structure containing - * bitmap callback functions */ -bool nsgtk_throbber_initialise_from_gif(const char *fn) -{ - /* disect the GIF provided by filename in *fn into a series of - * GdkPixbuf for use later. - */ - gif_animation gif; - struct nsgtk_throbber *throb; /**< structure we generate */ - FILE *fh; - int res; - size_t size; - unsigned char *data; - int i; - - throb = calloc(1, sizeof(struct nsgtk_throbber)); - if (throb == NULL) - return false; - - fh = fopen(fn, "rb"); - if (fh == NULL) { - LOG(("Unable to open throbber image '%s' for reading!", fn)); - free(throb); - return false; - } - - /* discover the size of the data file. */ - fseek(fh, 0, SEEK_END); - size = ftell(fh); - fseek(fh, 0, SEEK_SET); - - /* allocate a block of sufficient size, and load the data in. */ - data = malloc(size); - if (data == NULL) { - fclose(fh); - free(throb); - return false; - } - - if (fread(data, size, 1, fh) != 1) { - /* interesting; we couldn't read it all in. */ - free(data); - fclose(fh); - free(throb); - return false; - } - fclose(fh); - - /* create our gif animation */ - gif_create(&gif, &gif_bitmap_callbacks); - - /* initialise the gif_animation structure. */ - do { - res = gif_initialise(&gif, size, data); - if (res != GIF_OK && res != GIF_WORKING) { - switch (res) { - case GIF_INSUFFICIENT_FRAME_DATA: - case GIF_FRAME_DATA_ERROR: - case GIF_INSUFFICIENT_DATA: - case GIF_DATA_ERROR: - LOG(("GIF image '%s' appears invalid!", fn)); - break; - case GIF_INSUFFICIENT_MEMORY: - LOG(("Ran out of memory decoding GIF image '%s'!", fn)); - break; - } - gif_finalise(&gif); - free(data); - free(throb); - return false; - } - } while (res != GIF_OK); - - throb->nframes = gif.frame_count; - - if (throb->nframes < 2) { - /* we need at least two frames - one for idle, one for active */ - LOG(("Insufficent number of frames in throbber image '%s'!", - fn)); - LOG(("(GIF contains %d frames, where 2 is a minimum.)", - throb->nframes)); - gif_finalise(&gif); - free(data); - free(throb); - return false; - } - - throb->framedata = malloc(sizeof(GdkPixbuf *) * throb->nframes); - if (throb->framedata == NULL) { - gif_finalise(&gif); - free(data); - free(throb); - return false; - } - - /* decode each frame in turn, extracting the struct bitmap * for each, - * and put that in our array of frames. - */ - for (i = 0; i < throb->nframes; i++) { - res = gif_decode_frame(&gif, i); - if (res != GIF_OK) { - switch (res) { - case GIF_INSUFFICIENT_FRAME_DATA: - case GIF_FRAME_DATA_ERROR: - case GIF_INSUFFICIENT_DATA: - case GIF_DATA_ERROR: - LOG(("GIF image '%s' appears invalid!", fn)); - break; - case GIF_INSUFFICIENT_MEMORY: - LOG(("Ran out of memory decoding GIF image '%s'!", fn)); - break; - } - - gif_finalise(&gif); - free(data); - while (i >= 0) { - if (throb->framedata[i] != NULL) - gdk_pixbuf_unref(throb->framedata[i]); - i--; - } - free(throb->framedata); - free(throb); - return false; - } - - throb->framedata[i] = gdk_pixbuf_copy( - gtk_bitmap_get_primary(gif.frame_image)); - if (throb->framedata[i] == NULL) { - gif_finalise(&gif); - free(data); - while (i >= 0) { - if (throb->framedata[i] != NULL) - gdk_pixbuf_unref(throb->framedata[i]); - i--; - } - free(throb->framedata); - free(throb); - return false; - } - } - - gif_finalise(&gif); - free(data); - - /* debug code: save out each frame as a PNG to make sure decoding is - * working correctly. - - for (i = 0; i < throb->nframes; i++) { - char fname[20]; - sprintf(fname, "frame%d.png", i); - gdk_pixbuf_save(throb->framedata[i], fname, "png", NULL, NULL); - } - */ - - nsgtk_throbber = throb; - - return true; -} -#endif - void nsgtk_throbber_finalise(void) { int i; -- cgit v1.2.3