This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository legacy-imlib2.

View the commit online.

commit b6bf5d052086ed487b46333cff129448fc5c0a4f
Author: Kim Woelders <[email protected]>
AuthorDate: Mon Nov 14 13:58:28 2022 +0100

    multiframe: Allocate frame info only when needed
---
 src/lib/image.c                   |  2 +-
 src/modules/loaders/loader_gif.c  | 22 ++++++++++++++--------
 src/modules/loaders/loader_ico.c  | 13 ++++++++-----
 src/modules/loaders/loader_jxl.c  | 23 +++++++++++++----------
 src/modules/loaders/loader_png.c  |  7 +++++--
 src/modules/loaders/loader_ps.c   | 21 ++++++++++-----------
 src/modules/loaders/loader_webp.c | 19 +++++++++++--------
 7 files changed, 62 insertions(+), 45 deletions(-)

diff --git a/src/lib/image.c b/src/lib/image.c
index 73860c7..58fdfe6 100644
--- a/src/lib/image.c
+++ b/src/lib/image.c
@@ -783,7 +783,7 @@ __imlib_LoadProgressRows(ImlibImage * im, int row, int nrows)
 __EXPORT__ ImlibImageFrame *
 __imlib_GetFrame(ImlibImage * im)
 {
-   if (im->frame > 0 && !im->pframe)
+   if (!im->pframe)
       im->pframe = calloc(1, sizeof(ImlibImageFrame));
    return im->pframe;
 }
diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index 3d49715..139a345 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -84,12 +84,19 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
+   pf = NULL;
    transp = -1;
    fcount = 0;
    frame = im->frame;
-   pf = __imlib_GetFrame(im);
-   if (pf)
+   if (frame > 0)
      {
+#if 0
+        if (frame > 1 && frame > gif->ImageCount)
+           QUIT_WITH_RC(LOAD_BADFRAME);
+#endif
+        pf = __imlib_GetFrame(im);
+        if (!pf)
+           QUIT_WITH_RC(LOAD_OOM);
         pf->frame_count = gif->ImageCount;
         pf->loop_count = 0;     /* Loop forever */
         if (pf->frame_count > 1)
@@ -99,11 +106,10 @@ _load(ImlibImage * im, int load_data)
 
         D("Canvas WxH=%dx%d frames=%d repeat=%d\n",
           pf->canvas_w, pf->canvas_h, pf->frame_count, pf->loop_count);
-
-#if 0
-        if (frame > 1 && frame > pf->frame_count)
-           goto quit;
-#endif
+     }
+   else
+     {
+        frame = 1;
      }
 
    bg = gif->SBackGroundColor;
@@ -139,7 +145,7 @@ _load(ImlibImage * im, int load_data)
 
              fcount += 1;
 
-             if (frame > 0 && gif->ImageCount != frame)
+             if (gif->ImageCount != frame)
                {
                   int                 size = 0;
                   GifByteType        *data;
diff --git a/src/modules/loaders/loader_ico.c b/src/modules/loaders/loader_ico.c
index 5225971..13df3e2 100644
--- a/src/modules/loaders/loader_ico.c
+++ b/src/modules/loaders/loader_ico.c
@@ -305,13 +305,16 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
    frame = im->frame;
-   pf = __imlib_GetFrame(im);
-   if (pf)
+   if (frame > 0)
      {
-        pf->frame_count = ico.idir.icons;
-
-        if (frame > 1 && frame > pf->frame_count)
+        if (frame > 1 && frame > ico.idir.icons)
            QUIT_WITH_RC(LOAD_BADFRAME);
+
+        pf = __imlib_GetFrame(im);
+        if (!pf)
+           QUIT_WITH_RC(LOAD_OOM);
+
+        pf->frame_count = ico.idir.icons;
      }
 
    ic = frame - 1;
diff --git a/src/modules/loaders/loader_jxl.c b/src/modules/loaders/loader_jxl.c
index 07528b2..96ad698 100644
--- a/src/modules/loaders/loader_jxl.c
+++ b/src/modules/loaders/loader_jxl.c
@@ -100,9 +100,9 @@ _load(ImlibImage * im, int load_data)
    if (jst != JXL_DEC_SUCCESS)
       goto quit;
 
-   frame = im->frame;
-   pf = __imlib_GetFrame(im);
    delay_unit = 0;
+   frame = im->frame;
+   pf = NULL;
 
    for (;;)
      {
@@ -139,24 +139,27 @@ _load(ImlibImage * im, int load_data)
              im->h = info.ysize;
              im->has_alpha = info.alpha_bits > 0;
 
-             if (pf)
+             if (frame > 0)
                {
                   if (info.have_animation)
                     {
+                       pf = __imlib_GetFrame(im);
+                       if (!pf)
+                          QUIT_WITH_RC(LOAD_OOM);
                        pf->frame_count = 1234567890;    // FIXME - Hack
                        pf->loop_count = info.animation.num_loops;
                        pf->frame_flags |= FF_IMAGE_ANIMATED;
                        pf->canvas_w = info.xsize;
                        pf->canvas_h = info.ysize;
-                    }
 
-                  D("Canvas WxH=%dx%d frames=%d repeat=%d\n",
-                    pf->canvas_w, pf->canvas_h,
-                    pf->frame_count, pf->loop_count);
+                       D("Canvas WxH=%dx%d frames=%d repeat=%d\n",
+                         pf->canvas_w, pf->canvas_h,
+                         pf->frame_count, pf->loop_count);
 
-                  if (frame > 1 && pf->frame_count > 0
-                      && frame > pf->frame_count)
-                     QUIT_WITH_RC(LOAD_BADFRAME);
+                       if (frame > 1 && pf->frame_count > 0
+                           && frame > pf->frame_count)
+                          QUIT_WITH_RC(LOAD_BADFRAME);
+                    }
 
                   if (frame > 1)
                     {
diff --git a/src/modules/loaders/loader_png.c b/src/modules/loaders/loader_png.c
index 4832499..3718ca0 100644
--- a/src/modules/loaders/loader_png.c
+++ b/src/modules/loaders/loader_png.c
@@ -339,8 +339,8 @@ _load(ImlibImage * im, int load_data)
                                info_callback, row_callback, NULL);
 
    frame = im->frame;
-   pf = __imlib_GetFrame(im);
-   if (!pf)
+   pf = NULL;
+   if (frame <= 0)
       goto scan_done;
 
    /* Animation info requested. Look it up to find the frame's
@@ -378,6 +378,9 @@ _load(ImlibImage * im, int load_data)
           case PNG_TYPE_acTL:
              seen_actl = true;
 #define P (&chunk->actl)
+             pf = __imlib_GetFrame(im);
+             if (!pf)
+                QUIT_WITH_RC(LOAD_OOM);
              pf->frame_count = htonl(P->num_frames);
              pf->loop_count = htonl(P->num_plays);
              D("num_frames=%d num_plays=%d\n", pf->frame_count,
diff --git a/src/modules/loaders/loader_ps.c b/src/modules/loaders/loader_ps.c
index dded974..b6deb8d 100644
--- a/src/modules/loaders/loader_ps.c
+++ b/src/modules/loaders/loader_ps.c
@@ -14,7 +14,7 @@ _load(ImlibImage * im, int load_data)
    SpectreDocument    *spdoc;
    SpectrePage        *sppage;
    SpectreStatus       spst;
-   int                 frame;
+   int                 frame, fcount;
    int                 w, h;
    SpectreRenderContext *sprc;
    unsigned char      *pdata;
@@ -48,18 +48,17 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
    frame = im->frame;
-   pf = __imlib_GetFrame(im);
-   if (pf)
+   if (frame > 0)
      {
-        pf->frame_count = spectre_document_get_n_pages(spdoc);
-        D("Pages=%d\n", pf->frame_count);
-
-        if (frame > 1 && frame > pf->frame_count)
+        fcount = spectre_document_get_n_pages(spdoc);
+        D("Pages=%d\n", fcount);
+        if (frame > 1 && frame > fcount)
            QUIT_WITH_RC(LOAD_BADFRAME);
-     }
-   else
-     {
-        frame = 1;
+
+        pf = __imlib_GetFrame(im);
+        if (!pf)
+           QUIT_WITH_RC(LOAD_OOM);
+        pf->frame_count = fcount;
      }
 
    sppage = spectre_document_get_page(spdoc, frame - 1);
diff --git a/src/modules/loaders/loader_webp.c b/src/modules/loaders/loader_webp.c
index bb0923c..81d14a9 100644
--- a/src/modules/loaders/loader_webp.c
+++ b/src/modules/loaders/loader_webp.c
@@ -16,7 +16,7 @@ _load(ImlibImage * im, int load_data)
    WebPData            webp_data;
    WebPDemuxer        *demux;
    WebPIterator        iter;
-   int                 frame;
+   int                 frame, fcount;
    ImlibImageFrame    *pf;
 
    rc = LOAD_FAIL;
@@ -34,12 +34,18 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
+   pf = NULL;
    frame = im->frame;
-   pf = __imlib_GetFrame(im);
-   if (pf)
+   if (frame > 0)
      {
-        frame = im->frame;
-        pf->frame_count = WebPDemuxGetI(demux, WEBP_FF_FRAME_COUNT);
+        fcount = WebPDemuxGetI(demux, WEBP_FF_FRAME_COUNT);
+        if (frame > 1 && frame > fcount)
+           QUIT_WITH_RC(LOAD_BADFRAME);
+
+        pf = __imlib_GetFrame(im);
+        if (!pf)
+           QUIT_WITH_RC(LOAD_OOM);
+        pf->frame_count = fcount;
         pf->loop_count = WebPDemuxGetI(demux, WEBP_FF_LOOP_COUNT);
         if (pf->frame_count > 1)
            pf->frame_flags |= FF_IMAGE_ANIMATED;
@@ -48,9 +54,6 @@ _load(ImlibImage * im, int load_data)
 
         D("Canvas WxH=%dx%d frames=%d repeat=%d\n",
           pf->canvas_w, pf->canvas_h, pf->frame_count, pf->loop_count);
-
-        if (frame > 1 && frame > pf->frame_count)
-           QUIT_WITH_RC(LOAD_BADFRAME);
      }
    else
      {

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to