summaryrefslogtreecommitdiff
path: root/gtk/gtk_throbber.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtk_throbber.c')
-rw-r--r--gtk/gtk_throbber.c192
1 files changed, 9 insertions, 183 deletions
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;