buildrootschalter/package/imlib2/0002-GIF-loader-Simplify-error-handling.patch
Fabio Porcedda b637d6af9e imlib2: use giflib instead of soon to be deprecated libungif
Add three upstream patch to support giflib version 5.1

Also rename the previous patches to match the order of the commits in
the upstream master branch.

Signed-off-by: Fabio Porcedda <fabio.porcedda@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
2015-03-07 17:41:59 +01:00

176 lines
5.4 KiB
Diff

From 908a179726d010963f4fe1b57fb5f7bf590d7d64 Mon Sep 17 00:00:00 2001
From: Kim Woelders <kim@woelders.dk>
Date: Tue, 31 Dec 2013 18:13:45 +0100
Subject: [PATCH 2/5] GIF loader: Simplify error handling.
Also:
- Fix memory leak when image data allocation fails.
- Some aux data arrays may as well be const.
---
src/modules/loaders/loader_gif.c | 80 ++++++++++++++++------------------------
1 file changed, 32 insertions(+), 48 deletions(-)
diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index d1c2ae2..a39c860 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -8,6 +8,9 @@ char
load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
char immediate_load)
{
+ static const int intoffset[] = { 0, 4, 2, 1 };
+ static const int intjump[] = { 8, 8, 4, 2 };
+ int rc;
DATA32 *ptr;
GifFileType *gif;
GifRowType *rows;
@@ -16,8 +19,6 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
int i, j, done, bg, r, g, b, w = 0, h = 0;
float per = 0.0, per_inc;
int last_per = 0, last_y = 0;
- int intoffset[] = { 0, 4, 2, 1 };
- int intjump[] = { 8, 8, 4, 2 };
int transp;
int fd;
@@ -49,6 +50,8 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
return 0;
}
+ rc = 0; /* Failure */
+
do
{
if (DGifGetRecordType(gif, &rec) == GIF_ERROR)
@@ -66,37 +69,19 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
w = gif->Image.Width;
h = gif->Image.Height;
if (!IMAGE_DIMENSIONS_OK(w, h))
- {
- DGifCloseFile(gif);
- return 0;
- }
- rows = malloc(h * sizeof(GifRowType *));
+ goto quit2;
+
+ rows = calloc(h, sizeof(GifRowType *));
if (!rows)
- {
- DGifCloseFile(gif);
- return 0;
- }
- for (i = 0; i < h; i++)
- {
- rows[i] = NULL;
- }
+ goto quit2;
+
for (i = 0; i < h; i++)
{
rows[i] = malloc(w * sizeof(GifPixelType));
if (!rows[i])
- {
- DGifCloseFile(gif);
- for (i = 0; i < h; i++)
- {
- if (rows[i])
- {
- free(rows[i]);
- }
- }
- free(rows);
- return 0;
- }
+ goto quit;
}
+
if (gif->Image.Interlace)
{
for (i = 0; i < 4; i++)
@@ -135,6 +120,7 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
}
}
while (rec != TERMINATE_RECORD_TYPE);
+
if (transp >= 0)
{
SET_FLAG(im->flags, F_HAS_ALPHA);
@@ -143,6 +129,7 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
{
UNSET_FLAG(im->flags, F_HAS_ALPHA);
}
+
/* set the format string member to the lower-case full extension */
/* name for the format - so example names would be: */
/* "png", "jpeg", "tiff", "ppm", "pgm", "pbm", "gif", "xpm" ... */
@@ -150,17 +137,15 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
im->h = h;
if (!im->format)
im->format = strdup("gif");
+
if (im->loader || immediate_load || progress)
{
bg = gif->SBackGroundColor;
cmap = (gif->Image.ColorMap ? gif->Image.ColorMap : gif->SColorMap);
im->data = (DATA32 *) malloc(sizeof(DATA32) * w * h);
if (!im->data)
- {
- DGifCloseFile(gif);
- free(rows);
- return 0;
- }
+ goto quit;
+
ptr = im->data;
per_inc = 100.0 / (((float)w) * h);
for (i = 0; i < h; i++)
@@ -188,30 +173,29 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
last_per = (int)per;
if (!(progress(im, (int)per, 0, last_y, w, i)))
{
- DGifCloseFile(gif);
- for (i = 0; i < h; i++)
- {
- free(rows[i]);
- }
- free(rows);
- return 2;
+ rc = 2;
+ goto quit;
}
last_y = i;
}
}
}
+
+ if (progress)
+ progress(im, 100, 0, last_y, w, h);
}
- if (progress)
- {
- progress(im, 100, 0, last_y, w, h);
- }
- DGifCloseFile(gif);
+
+ rc = 1; /* Success */
+
+ quit:
for (i = 0; i < h; i++)
- {
- free(rows[i]);
- }
+ free(rows[i]);
free(rows);
- return 1;
+
+ quit2:
+ DGifCloseFile(gif);
+
+ return rc;
}
void
--
2.3.1