From 07e73475c18e129e18825426b3071b99f6b6871a Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Fri, 2 Apr 2021 12:00:50 +0100 Subject: [PATCH] make a patch for the libnsgif alloc delay --- .../libnsgif/patches/delay-alloc.patch | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 libvips/foreign/libnsgif/patches/delay-alloc.patch diff --git a/libvips/foreign/libnsgif/patches/delay-alloc.patch b/libvips/foreign/libnsgif/patches/delay-alloc.patch new file mode 100644 index 00000000..d7d5f97d --- /dev/null +++ b/libvips/foreign/libnsgif/patches/delay-alloc.patch @@ -0,0 +1,71 @@ +--- libnsgif-orig.c 2021-04-02 11:59:38.120048459 +0100 ++++ libnsgif.c 2021-04-02 11:59:44.439972362 +0100 +@@ -79,34 +79,17 @@ + unsigned int width, + unsigned int height) + { +- unsigned int max_width; +- unsigned int max_height; +- struct bitmap *buffer; +- +- /* Check if we've changed */ +- if ((width <= gif->width) && (height <= gif->height)) { ++ /* Already allocated? */ ++ if (gif->frame_image) { + return GIF_OK; + } + +- /* Get our maximum values */ +- max_width = (width > gif->width) ? width : gif->width; +- max_height = (height > gif->height) ? height : gif->height; +- +- /* Allocate some more memory */ + assert(gif->bitmap_callbacks.bitmap_create); +- buffer = gif->bitmap_callbacks.bitmap_create(max_width, max_height); +- if (buffer == NULL) { ++ gif->frame_image = gif->bitmap_callbacks.bitmap_create(width, height); ++ if (gif->frame_image == 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; +- gif->height = max_height; +- +- /* Invalidate our currently decoded image */ +- gif->decoded_frame = GIF_INVALID_FRAME; + return GIF_OK; + } + +@@ -392,10 +375,12 @@ + gif->frames[frame].redraw_required = ((gif->frames[frame].disposal_method == GIF_FRAME_CLEAR) || + (gif->frames[frame].disposal_method == GIF_FRAME_RESTORE)); + +- /* Boundary checking - shouldn't ever happen except with junk data */ +- if (gif_initialise_sprite(gif, (offset_x + width), (offset_y + height))) { +- return GIF_INSUFFICIENT_MEMORY; +- } ++ /* Frame size may have grown. ++ */ ++ gif->width = (offset_x + width > gif->width) ? ++ offset_x + width : gif->width; ++ gif->height = (offset_y + height > gif->height) ? ++ offset_y + height : gif->height; + + /* Decode the flags */ + flags = gif_data[9]; +@@ -739,6 +724,12 @@ + goto gif_decode_frame_exit; + } + ++ /* Make sure we have a buffer to decode to. ++ */ ++ if (gif_initialise_sprite(gif, gif->width, gif->height)) { ++ return GIF_INSUFFICIENT_MEMORY; ++ } ++ + /* Decode the flags */ + flags = gif_data[9]; + colour_table_size = 2 << (flags & GIF_COLOUR_TABLE_SIZE_MASK);