Commit b637d6af authored by Fabio Porcedda's avatar Fabio Porcedda Committed by Thomas Petazzoni
Browse files

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: default avatarFabio Porcedda <fabio.porcedda@gmail.com>
Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
parent d8be6f7b
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
From 17bf7bf95da6ed5b522205c321efcf838c48b13d Mon Sep 17 00:00:00 2001
From: Kim Woelders <kim@woelders.dk>
Date: Sun, 4 Aug 2013 08:05:27 +0200
Subject: [PATCH 1/5] GIF loader: Fix for libgif version 5.

---
 src/modules/loaders/loader_gif.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index 23b8fd0..d1c2ae2 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -29,6 +29,7 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
    /* already data in this image - dont load it again */
    if (im->data)
       return 0;
+
 #ifndef __EMX__
    fd = open(im->real_file, O_RDONLY);
 #else
@@ -36,12 +37,18 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
 #endif
    if (fd < 0)
       return 0;
+
+#if GIFLIB_MAJOR >= 5
+   gif = DGifOpenFileHandle(fd, NULL);
+#else
    gif = DGifOpenFileHandle(fd);
+#endif
    if (!gif)
      {
         close(fd);
         return 0;
      }
+
    do
      {
         if (DGifGetRecordType(gif, &rec) == GIF_ERROR)
-- 
2.3.1
+175 −0
Original line number Diff line number Diff line
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
+2 −2
Original line number Diff line number Diff line
From 49e3034ab714c9f05a6c0a04cf85ecbdb65c02d5 Mon Sep 17 00:00:00 2001
From aaf62d4c605726e6c5f6869bd6834eca03c50d9c Mon Sep 17 00:00:00 2001
From: Mike Frysinger <vapier@gentoo.org>
Date: Mon, 28 Jul 2014 22:59:35 -0400
Subject: [PATCH 1/2] fix X_DISPLAY_MISSING redefined warnings when X is
Subject: [PATCH 3/5] fix X_DISPLAY_MISSING redefined warnings when X is
 disabled

This is set up in config.h by configure, so avoid defining it again.
+2 −2
Original line number Diff line number Diff line
From f5caf5432609938794d7a72afe059cfcfccd38bf Mon Sep 17 00:00:00 2001
From c7f6ae523bbe165e50c44c21744f56f6f4b575c5 Mon Sep 17 00:00:00 2001
From: Mike Frysinger <vapier@gentoo.org>
Date: Mon, 28 Jul 2014 23:01:23 -0400
Subject: [PATCH 2/2] do not link with X libs when X is disabled
Subject: [PATCH 4/5] do not link with X libs when X is disabled

URL: https://bugs.gentoo.org/517670
---
+44 −0
Original line number Diff line number Diff line
From 8531957235f8702f8bdafac31059812d66e95c23 Mon Sep 17 00:00:00 2001
From: Heiko Becker <heirecka@exherbo.org>
Date: Mon, 13 Oct 2014 17:41:25 +0200
Subject: [PATCH 5/5] GIF loader: Fix for libgif version 5.1

Summary:
From giflib-5.1.0's NEWS:
"A small change to the API: DGifClose() and EGifClose() now take a
pointer-to-int second argument (like the corresponding openers)
where a diagnostic code will be deposited when they return
GIF_ERROR."

Test Plan:
I've built imlib2 against giflib-4.2.3 and 5.1.0 and opened a few
gif files with feh.

Reviewers: kwo

Reviewed By: kwo

Differential Revision: https://phab.enlightenment.org/D1529
---
 src/modules/loaders/loader_gif.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index a39c860..c53f62c 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -193,7 +193,11 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
    free(rows);
 
  quit2:
+#if GIFLIB_MAJOR > 5 || (GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1)
+   DGifCloseFile(gif, NULL);
+#else
    DGifCloseFile(gif);
+#endif
 
    return rc;
 }
-- 
2.3.1
Loading