summaryrefslogtreecommitdiff
path: root/gdk-pixbuf
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2020-07-14 15:03:23 +1200
committerEmmanuele Bassi <ebassi@gnome.org>2020-11-09 12:54:05 +0000
commit5212d69f2362f9b68ccf9385277e5c4a744b2187 (patch)
treee8de9a3b1f257808ca6659d96682047e7ce538ec /gdk-pixbuf
parent5286af4138046df96c406b48d48b4da31e1820ad (diff)
downloadgdk-pixbuf-5212d69f2362f9b68ccf9385277e5c4a744b2187.tar.gz
gif: Replace old buffer management code with GByteArray
Diffstat (limited to 'gdk-pixbuf')
-rw-r--r--gdk-pixbuf/io-gif.c121
1 files changed, 13 insertions, 108 deletions
diff --git a/gdk-pixbuf/io-gif.c b/gdk-pixbuf/io-gif.c
index b08a00bd6..07fee59cf 100644
--- a/gdk-pixbuf/io-gif.c
+++ b/gdk-pixbuf/io-gif.c
@@ -62,7 +62,6 @@
#undef DUMP_IMAGE_DETAILS
-#undef IO_GIFDEBUG
#define MAXCOLORMAPSIZE 256
@@ -125,10 +124,7 @@ struct _GifContext
GdkPixbufModulePreparedFunc prepared_func;
GdkPixbufModuleUpdatedFunc updated_func;
gpointer user_data;
- guchar *buf;
- gsize ptr;
- gsize size;
- gsize amount_needed;
+ GByteArray *buf;
/* extension context */
guchar extension_label;
@@ -145,26 +141,13 @@ struct _GifContext
GError **error;
};
-
-
-#ifdef IO_GIFDEBUG
-static int count = 0;
-#endif
-
/* Returns TRUE if read is OK,
* FALSE if more memory is needed. */
static gboolean
gif_read (GifContext *context, guchar *buffer, size_t len)
{
gboolean retval;
-#ifdef IO_GIFDEBUG
- gint i;
-#endif
if (context->file) {
-#ifdef IO_GIFDEBUG
- count += len;
- g_print ("Fsize :%zi\tcount :%d\t", len, count);
-#endif
retval = (fread (buffer, 1, len, context->file) == len);
if (!retval && ferror (context->file)) {
@@ -175,38 +158,14 @@ gif_read (GifContext *context, guchar *buffer, size_t len)
_("Failure reading GIF: %s"),
g_strerror (save_errno));
}
-
-#ifdef IO_GIFDEBUG
- if (len < 100) {
- for (i = 0; i < len; i++)
- g_print ("%d ", buffer[i]);
- }
- g_print ("\n");
-#endif
-
+
return retval;
} else {
-#ifdef IO_GIFDEBUG
-/* g_print ("\tlooking for %d bytes. size == %d, ptr == %d\n", len, context->size, context->ptr); */
-#endif
- if ((context->size - context->ptr) >= len) {
-#ifdef IO_GIFDEBUG
- count += len;
-#endif
- memcpy (buffer, context->buf + context->ptr, len);
- context->ptr += len;
- context->amount_needed = 0;
-#ifdef IO_GIFDEBUG
- g_print ("Psize :%zi\tcount :%d\t", len, count);
- if (len < 100) {
- for (i = 0; i < len; i++)
- g_print ("%d ", buffer[i]);
- }
- g_print ("\n");
-#endif
+ if (context->buf->len >= len) {
+ memcpy (buffer, context->buf->data, len);
+ g_byte_array_remove_range (context->buf, 0, len);
return TRUE;
}
- context->amount_needed = len - (context->size - context->ptr);
}
return FALSE;
}
@@ -839,12 +798,7 @@ new_context (GdkPixbufModuleSizeFunc size_func,
context->prepared_func = prepared_func;
context->updated_func = updated_func;
context->user_data = user_data;
- context->buf = NULL;
- context->amount_needed = 13;
- context->buf = g_new (guchar, context->amount_needed);
- context->transparent_index = -1;
- context->delay_time = -1;
- context->disposal = -1;
+ context->buf = g_byte_array_new ();
context->animation->loop = 1;
context->in_loop_extension = FALSE;
@@ -925,7 +879,7 @@ gdk_pixbuf__gif_image_load (FILE *file, GError **error)
out:
g_object_unref (context->animation);
- g_free (context->buf);
+ g_byte_array_unref (context->buf);
g_free (context);
return pixbuf;
@@ -944,9 +898,6 @@ gdk_pixbuf__gif_image_begin_load (GdkPixbufModuleSizeFunc size_func,
g_assert (prepared_func != NULL);
g_assert (updated_func != NULL);
-#ifdef IO_GIFDEBUG
- count = 0;
-#endif
context = new_context (size_func, prepared_func, updated_func, user_data);
if (context == NULL) {
@@ -986,7 +937,7 @@ gdk_pixbuf__gif_image_stop_load (gpointer data, GError **error)
g_object_unref (context->animation);
- g_free (context->buf);
+ g_byte_array_unref (context->buf);
g_free (context);
return retval;
@@ -1001,59 +952,13 @@ gdk_pixbuf__gif_image_load_increment (gpointer data,
GifContext *context = (GifContext *) data;
context->error = error;
-
- if (context->amount_needed == 0) {
- /* we aren't looking for some bytes. */
- /* we can use buf now, but we don't want to keep it around at all.
- * it will be gone by the end of the call. */
- context->buf = (guchar*) buf; /* very dubious const cast */
- context->ptr = 0;
- context->size = size;
- } else {
- /* we need some bytes */
- if (size < context->amount_needed) {
- context->amount_needed -= size;
- /* copy it over and return */
- memcpy (context->buf + context->size, buf, size);
- context->size += size;
- return TRUE;
- } else if (size == context->amount_needed) {
- memcpy (context->buf + context->size, buf, size);
- context->size += size;
- } else {
- context->buf = g_realloc (context->buf, context->size + size);
- memcpy (context->buf + context->size, buf, size);
- context->size += size;
- }
- }
- retval = gif_main_loop (context);
+ g_byte_array_append (context->buf, buf, size);
- if (retval == -2) {
- if (context->buf == buf)
- context->buf = NULL;
+ retval = gif_main_loop (context);
+ if (retval == -2)
return FALSE;
- }
- if (retval == -1) {
- /* we didn't have enough memory */
- /* prepare for the next image_load_increment */
- if (context->buf == buf) {
- g_assert (context->size == size);
- context->buf = g_new (guchar, context->amount_needed + (context->size - context->ptr));
- memcpy (context->buf, buf + context->ptr, context->size - context->ptr);
- } else {
- /* copy the left overs to the begining of the buffer */
- /* and realloc the memory */
- memmove (context->buf, context->buf + context->ptr, context->size - context->ptr);
- context->buf = g_realloc (context->buf, context->amount_needed + (context->size - context->ptr));
- }
- context->size = context->size - context->ptr;
- context->ptr = 0;
- } else {
- /* we are prolly all done */
- if (context->buf == buf)
- context->buf = NULL;
- }
+
return TRUE;
}
@@ -1098,7 +1003,7 @@ gdk_pixbuf__gif_image_load_animation (FILE *file,
if (context->error && *(context->error))
g_print ("%s\n", (*(context->error))->message);
- g_free (context->buf);
+ g_byte_array_unref (context->buf);
g_free (context);
return animation;
}