diff options
author | Rob Kendrick <rjek@netsurf-browser.org> | 2006-08-15 21:29:20 +0000 |
---|---|---|
committer | Rob Kendrick <rjek@netsurf-browser.org> | 2006-08-15 21:29:20 +0000 |
commit | 8ab966398f67b7945f4d08ac1911beb0abd30657 (patch) | |
tree | 642e88da0dff1914957095f2e87ff425ece2c31b /gtk/gtk_throbber.c | |
parent | fdbb855a9c38524d9c8feefd38bd3a78d95e1788 (diff) | |
download | netsurf-8ab966398f67b7945f4d08ac1911beb0abd30657.tar.gz netsurf-8ab966398f67b7945f4d08ac1911beb0abd30657.tar.bz2 |
Merge new glade nsgtk window code into trunk.
svn path=/trunk/netsurf/; revision=2853
Diffstat (limited to 'gtk/gtk_throbber.c')
-rw-r--r-- | gtk/gtk_throbber.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/gtk/gtk_throbber.c b/gtk/gtk_throbber.c new file mode 100644 index 000000000..a0b76b14d --- /dev/null +++ b/gtk/gtk_throbber.c @@ -0,0 +1,131 @@ +/* + * This file is part of NetSurf, http://netsurf.sourceforge.net/ + * Licensed under the GNU General Public License, + * http://www.opensource.org/licenses/gpl-license + * Copyright 2006 Rob Kendrick <rjek@rjek.com> + */ + +#include <stdio.h> +#include <stdlib.h> +#include "netsurf/utils/log.h" +#include "netsurf/image/gifread.h" +#include "netsurf/gtk/gtk_throbber.h" +#include "netsurf/gtk/gtk_bitmap.h" + +struct nsgtk_throbber *nsgtk_throbber = NULL; + +bool nsgtk_throbber_initialise(const char *fn) +{ + /* disect the GIF provided by filename in *fn into a series of + * GdkPixbuf for use later. + */ + struct gif_animation *gif; /**< structure for gifread.c */ + struct nsgtk_throbber *throb; /**< structure we generate */ + int i; + + FILE *fh = fopen(fn, "rb"); + + if (fh == NULL) { + LOG(("Unable to open throbber image '%s' for reading!", fn)); + return false; + } + + gif = (struct gif_animation *)malloc(sizeof(struct gif_animation)); + throb = (struct nsgtk_throbber *)malloc(sizeof(struct nsgtk_throbber)); + + /* discover the size of the data file. */ + fseek(fh, 0, SEEK_END); + gif->buffer_size = ftell(fh); + fseek(fh, 0, SEEK_SET); + + /* allocate a block of sufficient size, and load the data in. */ + gif->gif_data = (unsigned char *)malloc(gif->buffer_size); + fread(gif->gif_data, gif->buffer_size, 1, fh); + fclose(fh); + + /* set current position within GIF file to beginning, in order to + * signal to gifread that we're brand new. + */ + gif->buffer_position = 0; + + /* initialise the gif_animation structure. */ + switch (gif_initialise(gif)) + { + 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)); + free(gif->gif_data); + free(gif); + free(throb); + return false; + break; + case GIF_INSUFFICIENT_MEMORY: + LOG(("Ran out of memory decoding GIF image '%s'!", fn)); + free(gif->gif_data); + free(gif); + free(throb); + return false; + break; + } + + 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)); + free(gif->gif_data); + free(gif); + free(throb); + return false; + } + + throb->framedata = (GdkPixbuf **)malloc(sizeof(GdkPixbuf *) + * throb->nframes); + + /* 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++) + { + gif_decode_frame(gif, i); + throb->framedata[i] = gdk_pixbuf_copy( + gtk_bitmap_get_primary(gif->frame_image)); + } + + gif_finalise(gif); + free(gif->gif_data); + free(gif); + + /* 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; +} + +void nsgtk_throbber_finalise(void) +{ + int i; + + for (i = 0; i < nsgtk_throbber->nframes; i++) + gdk_pixbuf_unref(nsgtk_throbber->framedata[i]); + + free(nsgtk_throbber->framedata); + free(nsgtk_throbber); + + nsgtk_throbber = NULL; +} |