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 e353a684c26b07f1cd482092c7560f7c4d483a49
Author: Kim Woelders <[email protected]>
AuthorDate: Thu Oct 27 18:40:36 2022 +0200

    multiframe: Move frame info to allocated record
    
    Avoid the overhead in ImlibImage when not doing multiframe loads.
---
 src/lib/Imlib2_Loader.h           | 21 ++++++-----
 src/lib/api.c                     | 26 +++++++++-----
 src/lib/image.c                   | 24 ++++++++++---
 src/lib/image.h                   | 23 +++++++-----
 src/modules/loaders/loader_gif.c  | 68 +++++++++++++++++++++---------------
 src/modules/loaders/loader_ico.c  |  8 +++--
 src/modules/loaders/loader_jxl.c  | 30 +++++++++-------
 src/modules/loaders/loader_png.c  | 73 +++++++++++++++++++++------------------
 src/modules/loaders/loader_ps.c   | 10 +++---
 src/modules/loaders/loader_webp.c | 49 +++++++++++++++-----------
 10 files changed, 203 insertions(+), 129 deletions(-)

diff --git a/src/lib/Imlib2_Loader.h b/src/lib/Imlib2_Loader.h
index a8f650c..8b77165 100644
--- a/src/lib/Imlib2_Loader.h
+++ b/src/lib/Imlib2_Loader.h
@@ -131,6 +131,17 @@ typedef struct _ImlibImageTag {
    struct _ImlibImageTag *next;
 } ImlibImageTag;
 
+typedef struct {
+   int                 canvas_w;        /* Canvas size      */
+   int                 canvas_h;
+   int                 frame_count;     /* Number of frames */
+   int                 frame_x; /* Frame origin     */
+   int                 frame_y;
+   int                 frame_flags;     /* Frame flags      */
+   int                 frame_delay;     /* Frame delay (ms) */
+   int                 loop_count;      /* Animation loops  */
+} ImlibImageFrame;
+
 struct _ImlibImage {
    ImlibImageFileInfo *fi;
    ImlibLdCtx         *lc;
@@ -141,14 +152,6 @@ struct _ImlibImage {
    char                rsvd[3];
 
    int                 frame;
-   int                 canvas_w;        /* Canvas size      */
-   int                 canvas_h;
-   int                 frame_count;     /* Number of frames */
-   int                 frame_x; /* Frame origin     */
-   int                 frame_y;
-   int                 frame_flags;     /* Frame flags      */
-   int                 frame_delay;     /* Frame delay (ms) */
-   int                 loop_count;      /* Animation loops  */
 };
 
 /* Must match the ones in Imlib2.h.in */
@@ -176,6 +179,8 @@ void                __imlib_FreeTag(ImlibImage * im, ImlibImageTag * t);
 
 const char         *__imlib_GetKey(const ImlibImage * im);
 
+ImlibImageFrame    *__imlib_GetFrame(ImlibImage * im);
+
 void                __imlib_LoadProgressSetPass(ImlibImage * im,
                                                 int pass, int n_pass);
 int                 __imlib_LoadProgress(ImlibImage * im,
diff --git a/src/lib/api.c b/src/lib/api.c
index 41595a4..9409c61 100644
--- a/src/lib/api.c
+++ b/src/lib/api.c
@@ -677,21 +677,31 @@ EAPI void
 imlib_image_get_frame_info(Imlib_Frame_Info * info)
 {
    ImlibImage         *im;
+   ImlibImageFrame    *fp;
 
    CHECK_PARAM_POINTER("image", ctx->image);
    CAST_IMAGE(im, ctx->image);
 
-   info->loop_count = im->loop_count;
-   info->frame_count = im->frame_count;
+   fp = im->pframe;
+   if (!fp)
+     {
+        memset(info, 0, sizeof(Imlib_Frame_Info));
+        info->canvas_w = info->frame_w = im->w;
+        info->canvas_h = info->frame_h = im->h;
+        return;
+     }
+
+   info->loop_count = fp->loop_count;
+   info->frame_count = fp->frame_count;
    info->frame_num = im->frame;
-   info->canvas_w = im->canvas_w ? im->canvas_w : im->w;
-   info->canvas_h = im->canvas_h ? im->canvas_h : im->h;
-   info->frame_x = im->frame_x;
-   info->frame_y = im->frame_y;
+   info->canvas_w = fp->canvas_w ? fp->canvas_w : im->w;
+   info->canvas_h = fp->canvas_h ? fp->canvas_h : im->h;
+   info->frame_x = fp->frame_x;
+   info->frame_y = fp->frame_y;
    info->frame_w = im->w;
    info->frame_h = im->h;
-   info->frame_flags = im->frame_flags;
-   info->frame_delay = im->frame_delay ? im->frame_delay : 100;
+   info->frame_flags = fp->frame_flags;
+   info->frame_delay = fp->frame_delay ? fp->frame_delay : 100;
 }
 
 EAPI void
diff --git a/src/lib/image.c b/src/lib/image.c
index 820de3a..73860c7 100644
--- a/src/lib/image.c
+++ b/src/lib/image.c
@@ -207,6 +207,8 @@ __imlib_ConsumeImage(ImlibImage * im)
    if (im->fi)
       __imlib_ImageFileContextPop(im);
 
+   free(im->pframe);
+
    free(im);
 }
 
@@ -729,8 +731,11 @@ __imlib_LoadProgress(ImlibImage * im, int x, int y, int w, int h)
    lc->area += w * h;
    lc->pct = (100. * lc->area + .1) / (im->w * im->h);
 
-   x += im->frame_x;
-   y += im->frame_y;
+   if (im->pframe)
+     {
+        x += im->pframe->frame_x;
+        y += im->pframe->frame_y;
+     }
 
    rc = !lc->progress(im, lc->pct, x, y, w, h);
 
@@ -762,8 +767,11 @@ __imlib_LoadProgressRows(ImlibImage * im, int row, int nrows)
    pct = (100 * nrtot * (lc->pass + 1)) / (im->h * lc->n_pass);
    if (pct == 100 || pct >= lc->pct + lc->granularity)
      {
-        col += im->frame_x;
-        row += im->frame_y;
+        if (im->pframe)
+          {
+             col += im->pframe->frame_x;
+             row += im->pframe->frame_y;
+          }
         rc = !lc->progress(im, pct, col, row, im->w, nrows);
         lc->row = nrtot;
         lc->pct += lc->granularity;
@@ -772,6 +780,14 @@ __imlib_LoadProgressRows(ImlibImage * im, int row, int nrows)
    return rc;
 }
 
+__EXPORT__ ImlibImageFrame *
+__imlib_GetFrame(ImlibImage * im)
+{
+   if (im->frame > 0 && !im->pframe)
+      im->pframe = calloc(1, sizeof(ImlibImageFrame));
+   return im->pframe;
+}
+
 /* free and image - if its uncachable and refcoutn is 0 - free it in reality */
 void
 __imlib_FreeImage(ImlibImage * im)
diff --git a/src/lib/image.h b/src/lib/image.h
index a0a1765..0c3ed0f 100644
--- a/src/lib/image.h
+++ b/src/lib/image.h
@@ -42,6 +42,17 @@ typedef struct _ImlibImageTag {
    struct _ImlibImageTag *next;
 } ImlibImageTag;
 
+typedef struct {
+   int                 canvas_w;        /* Canvas size      */
+   int                 canvas_h;
+   int                 frame_count;     /* Number of frames */
+   int                 frame_x; /* Frame origin     */
+   int                 frame_y;
+   int                 frame_flags;     /* Frame flags      */
+   int                 frame_delay;     /* Frame delay (ms) */
+   int                 loop_count;      /* Animation loops  */
+} ImlibImageFrame;
+
 struct _ImlibImage {
    ImlibImageFileInfo *fi;
    ImlibLdCtx         *lc;
@@ -52,14 +63,6 @@ struct _ImlibImage {
    char                rsvd[3];
 
    int                 frame;
-   int                 canvas_w;        /* Canvas size      */
-   int                 canvas_h;
-   int                 frame_count;     /* Number of frames */
-   int                 frame_x; /* Frame origin     */
-   int                 frame_y;
-   int                 frame_flags;     /* Frame flags      */
-   int                 frame_delay;     /* Frame delay (ms) */
-   int                 loop_count;      /* Animation loops  */
 
    /* vvv Private vvv */
    ImlibLoader        *loader;
@@ -75,6 +78,8 @@ struct _ImlibImage {
    ImlibBorder         border;
    ImlibImageTag      *tags;
    ImlibImageDataMemoryFunction data_memory_func;
+
+   ImlibImageFrame    *pframe;
    /* ^^^ Private ^^^ */
 };
 
@@ -124,6 +129,8 @@ ImlibImageTag      *__imlib_RemoveTag(ImlibImage * im, const char *key);
 void                __imlib_FreeTag(ImlibImage * im, ImlibImageTag * t);
 void                __imlib_FreeAllTags(ImlibImage * im);
 
+ImlibImageFrame    *__imlib_GetFrame(ImlibImage * im);
+
 void                __imlib_SetCacheSize(int size);
 int                 __imlib_GetCacheSize(void);
 int                 __imlib_CurrentCacheSize(void);
diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index aac328a..3d49715 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -65,7 +65,9 @@ _load(ImlibImage * im, int load_data)
    int                 i, j, bg, bits;
    int                 transp;
    uint32_t            colormap[256];
-   int                 fcount, frame, multiframe;
+   int                 fcount, frame;
+   bool                multiframe;
+   ImlibImageFrame    *pf;
 
    rc = LOAD_FAIL;
    rows = NULL;
@@ -85,20 +87,21 @@ _load(ImlibImage * im, int load_data)
    transp = -1;
    fcount = 0;
    frame = im->frame;
-   if (frame > 0)
+   pf = __imlib_GetFrame(im);
+   if (pf)
      {
-        im->frame_count = gif->ImageCount;
-        im->loop_count = 0;     /* Loop forever */
-        if (im->frame_count > 1)
-           im->frame_flags |= FF_IMAGE_ANIMATED;
-        im->canvas_w = gif->SWidth;
-        im->canvas_h = gif->SHeight;
+        pf->frame_count = gif->ImageCount;
+        pf->loop_count = 0;     /* Loop forever */
+        if (pf->frame_count > 1)
+           pf->frame_flags |= FF_IMAGE_ANIMATED;
+        pf->canvas_w = gif->SWidth;
+        pf->canvas_h = gif->SHeight;
 
         D("Canvas WxH=%dx%d frames=%d repeat=%d\n",
-          im->canvas_w, im->canvas_h, im->frame_count, im->loop_count);
+          pf->canvas_w, pf->canvas_h, pf->frame_count, pf->loop_count);
 
 #if 0
-        if (frame > 1 && frame > im->frame_count)
+        if (frame > 1 && frame > pf->frame_count)
            goto quit;
 #endif
      }
@@ -155,16 +158,23 @@ _load(ImlibImage * im, int load_data)
 
              im->w = gif->Image.Width;
              im->h = gif->Image.Height;
-             im->frame_x = gif->Image.Left;
-             im->frame_y = gif->Image.Top;
+             if (pf)
+               {
+                  pf->frame_x = gif->Image.Left;
+                  pf->frame_y = gif->Image.Top;
+
+                  D("Canvas WxH=%dx%d frame=%d/%d X,Y=%d,%d WxH=%dx%d\n",
+                    pf->canvas_w, pf->canvas_h, gif->ImageCount,
+                    pf->frame_count, pf->frame_x, pf->frame_y, im->w, im->h);
+               }
+             else
+               {
+                  D("WxH=%dx%d\n", im->w, im->h);
+               }
 
              if (!IMAGE_DIMENSIONS_OK(im->w, im->h))
                 goto quit;
 
-             D("Canvas WxH=%dx%d frame=%d/%d X,Y=%d,%d WxH=%dx%d\n",
-               im->canvas_w, im->canvas_h, gif->ImageCount, im->frame_count,
-               im->frame_x, im->frame_y, im->w, im->h);
-
              DL(" CM S=%p I=%p\n", cmap, gif->Image.ColorMap);
              if (gif->Image.ColorMap)
                 cmap = gif->Image.ColorMap;
@@ -203,7 +213,7 @@ _load(ImlibImage * im, int load_data)
                }
 
              /* Break if no specific frame was requested */
-             if (frame == 0)
+             if (!pf)
                 break;
           }
         else if (rec == EXTENSION_RECORD_TYPE)
@@ -218,20 +228,20 @@ _load(ImlibImage * im, int load_data)
                   DL(" EXTENSION_RECORD_TYPE(%d): ic=%d: ext_code=%02x: %02x %02x %02x %02x %02x\n",    //
                      rec, gif->ImageCount, ext_code,
                      ext[0], ext[1], ext[2], ext[3], ext[4]);
-                  if (ext_code == GRAPHICS_EXT_FUNC_CODE
+                  if (pf && ext_code == GRAPHICS_EXT_FUNC_CODE
                       && gif->ImageCount == frame - 1)
                     {
                        bits = ext[1];
-                       im->frame_delay = 10 * (0x100 * ext[3] + ext[2]);
+                       pf->frame_delay = 10 * (0x100 * ext[3] + ext[2]);
                        if (bits & 1)
                           transp = ext[4];
                        disp = (bits >> 2) & 0x7;
                        if (disp == 2 || disp == 3)
-                          im->frame_flags |= FF_FRAME_DISPOSE_CLEAR;
-                       im->frame_flags |= FF_FRAME_BLEND;
+                          pf->frame_flags |= FF_FRAME_DISPOSE_CLEAR;
+                       pf->frame_flags |= FF_FRAME_BLEND;
                        D(" Frame %d: disp=%d ui=%d tr=%d, delay=%d transp = #%02x\n",   //
                          gif->ImageCount + 1, disp, (bits >> 1) & 1, bits & 1,
-                         im->frame_delay, transp);
+                         pf->frame_delay, transp);
                     }
                   ext = NULL;
                   DGifGetExtensionNext(gif, &ext);
@@ -244,14 +254,18 @@ _load(ImlibImage * im, int load_data)
      }
 
    im->has_alpha = transp >= 0;
-   im->frame_count = fcount;
-   multiframe = im->frame_count > 1;
-   if (multiframe)
-      im->frame_flags |= FF_IMAGE_ANIMATED;
+   multiframe = false;
+   if (pf)
+     {
+        pf->frame_count = fcount;
+        multiframe = pf->frame_count > 1;
+        if (multiframe)
+           pf->frame_flags |= FF_IMAGE_ANIMATED;
+     }
 
    if (!rows)
      {
-        if (frame > 1 && frame > im->frame_count)
+        if (pf && frame > 1 && frame > pf->frame_count)
            QUIT_WITH_RC(LOAD_BADFRAME);
 
         goto quit;
diff --git a/src/modules/loaders/loader_ico.c b/src/modules/loaders/loader_ico.c
index 0ebf4ec..5225971 100644
--- a/src/modules/loaders/loader_ico.c
+++ b/src/modules/loaders/loader_ico.c
@@ -272,6 +272,7 @@ _load(ImlibImage * im, int load_data)
    ie_t               *ie;
    uint32_t           *pdst;
    uint32_t            pixel;
+   ImlibImageFrame    *pf;
 
    rc = LOAD_FAIL;
 
@@ -304,11 +305,12 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
    frame = im->frame;
-   if (frame > 0)
+   pf = __imlib_GetFrame(im);
+   if (pf)
      {
-        im->frame_count = ico.idir.icons;
+        pf->frame_count = ico.idir.icons;
 
-        if (frame > 1 && frame > im->frame_count)
+        if (frame > 1 && frame > pf->frame_count)
            QUIT_WITH_RC(LOAD_BADFRAME);
      }
 
diff --git a/src/modules/loaders/loader_jxl.c b/src/modules/loaders/loader_jxl.c
index 8bd9acc..07528b2 100644
--- a/src/modules/loaders/loader_jxl.c
+++ b/src/modules/loaders/loader_jxl.c
@@ -48,6 +48,7 @@ _load(ImlibImage * im, int load_data)
    JxlBasicInfo        info;
    JxlFrameHeader      fhdr;
    int                 frame, delay_unit;
+   ImlibImageFrame    *pf;
 
 #if MAX_RUNNERS > 0
    size_t              n_runners;
@@ -100,6 +101,7 @@ _load(ImlibImage * im, int load_data)
       goto quit;
 
    frame = im->frame;
+   pf = __imlib_GetFrame(im);
    delay_unit = 0;
 
    for (;;)
@@ -137,23 +139,23 @@ _load(ImlibImage * im, int load_data)
              im->h = info.ysize;
              im->has_alpha = info.alpha_bits > 0;
 
-             if (frame > 0)
+             if (pf)
                {
                   if (info.have_animation)
                     {
-                       im->frame_count = 1234567890;    // FIXME - Hack
-                       im->loop_count = info.animation.num_loops;
-                       im->frame_flags |= FF_IMAGE_ANIMATED;
-                       im->canvas_w = info.xsize;
-                       im->canvas_h = info.ysize;
+                       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",
-                    im->canvas_w, im->canvas_h,
-                    im->frame_count, im->loop_count);
+                    pf->canvas_w, pf->canvas_h,
+                    pf->frame_count, pf->loop_count);
 
-                  if (frame > 1 && im->frame_count > 0
-                      && frame > im->frame_count)
+                  if (frame > 1 && pf->frame_count > 0
+                      && frame > pf->frame_count)
                      QUIT_WITH_RC(LOAD_BADFRAME);
 
                   if (frame > 1)
@@ -178,12 +180,14 @@ _load(ImlibImage * im, int load_data)
              break;
 
           case JXL_DEC_FRAME:
+             if (!pf)
+                break;
              JxlDecoderGetFrameHeader(dec, &fhdr);
              if (fhdr.is_last)
-                im->frame_count = frame;
-             im->frame_delay = fhdr.duration * delay_unit;
+                pf->frame_count = frame;
+             pf->frame_delay = fhdr.duration * delay_unit;
              D("Frame duration=%d tc=%08x nl=%d last=%d\n",
-               im->frame_delay, fhdr.timecode, fhdr.name_length, fhdr.is_last);
+               pf->frame_delay, fhdr.timecode, fhdr.name_length, fhdr.is_last);
              break;
 
           case JXL_DEC_FULL_IMAGE:
diff --git a/src/modules/loaders/loader_png.c b/src/modules/loaders/loader_png.c
index 79f5b02..4832499 100644
--- a/src/modules/loaders/loader_png.c
+++ b/src/modules/loaders/loader_png.c
@@ -274,7 +274,7 @@ row_callback(png_struct * png_ptr, png_byte * new_row,
 
         if (im->lc)
           {
-             if (im->frame_count > 1)
+             if (im->frame > 0)
                {
                   if (done)
                      __imlib_LoadProgress(im, 0, 0, im->w, im->h);
@@ -304,6 +304,7 @@ _load(ImlibImage * im, int load_data)
    int                 w, h, frame, fcount;
    bool                save_fdat, seen_actl, seen_fctl;
    png_chunk_t         cbuf;
+   ImlibImageFrame    *pf;
 
    /* read header */
    rc = LOAD_FAIL;
@@ -338,7 +339,8 @@ _load(ImlibImage * im, int load_data)
                                info_callback, row_callback, NULL);
 
    frame = im->frame;
-   if (frame <= 0)
+   pf = __imlib_GetFrame(im);
+   if (!pf)
       goto scan_done;
 
    /* Animation info requested. Look it up to find the frame's
@@ -376,11 +378,11 @@ _load(ImlibImage * im, int load_data)
           case PNG_TYPE_acTL:
              seen_actl = true;
 #define P (&chunk->actl)
-             im->frame_count = htonl(P->num_frames);
-             im->loop_count = htonl(P->num_plays);
-             D("num_frames=%d num_plays=%d\n", im->frame_count,
+             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,
                htonl(P->num_plays));
-             if (frame > im->frame_count)
+             if (frame > pf->frame_count)
                 QUIT_WITH_RC(LOAD_BADFRAME);
              break;
 #undef P
@@ -453,29 +455,32 @@ _load(ImlibImage * im, int load_data)
              im->w = htonl(pfctl->w);
              im->h = htonl(pfctl->h);
 #endif
-             im->canvas_w = w;
-             im->canvas_h = h;
-             im->frame_x = htonl(pfctl->x);
-             im->frame_y = htonl(pfctl->y);
-             if (pfctl->dispose_op == APNG_DISPOSE_OP_BACKGROUND)
-                im->frame_flags |= FF_FRAME_DISPOSE_CLEAR;
-             else if (pfctl->dispose_op == APNG_DISPOSE_OP_PREVIOUS)
-                im->frame_flags |= FF_FRAME_DISPOSE_PREV;
-             if (pfctl->blend_op != APNG_BLEND_OP_SOURCE)
-                im->frame_flags |= FF_FRAME_BLEND;
-             val = htons(pfctl->delay_den);
-             if (val == 0)
-                val = 100;
-             im->frame_delay = 1000 * htons(pfctl->delay_num) / val;
-
-             D("WxH=%dx%d(%dx%d) X,Y=%d,%d depth=%d color=%d comp=%d filt=%d interlace=%d disp=%d blend=%d delay=%d/%d\n",      //
-               htonl(pfctl->w), htonl(pfctl->h),
-               im->canvas_w, im->canvas_h, im->frame_x, im->frame_y,
-               P->depth, P->color, P->comp, P->filt, P->interl,
-               pfctl->dispose_op, pfctl->blend_op,
-               pfctl->delay_num, pfctl->delay_den);
-
-             if (frame <= 1)
+             if (pf)
+               {
+                  pf->canvas_w = w;
+                  pf->canvas_h = h;
+                  pf->frame_x = htonl(pfctl->x);
+                  pf->frame_y = htonl(pfctl->y);
+                  if (pfctl->dispose_op == APNG_DISPOSE_OP_BACKGROUND)
+                     pf->frame_flags |= FF_FRAME_DISPOSE_CLEAR;
+                  else if (pfctl->dispose_op == APNG_DISPOSE_OP_PREVIOUS)
+                     pf->frame_flags |= FF_FRAME_DISPOSE_PREV;
+                  if (pfctl->blend_op != APNG_BLEND_OP_SOURCE)
+                     pf->frame_flags |= FF_FRAME_BLEND;
+                  val = htons(pfctl->delay_den);
+                  if (val == 0)
+                     val = 100;
+                  pf->frame_delay = 1000 * htons(pfctl->delay_num) / val;
+
+                  D("WxH=%dx%d(%dx%d) X,Y=%d,%d depth=%d color=%d comp=%d filt=%d interlace=%d disp=%d blend=%d delay=%d/%d\n", //
+                    htonl(pfctl->w), htonl(pfctl->h),
+                    pf->canvas_w, pf->canvas_h, pf->frame_x, pf->frame_y,
+                    P->depth, P->color, P->comp, P->filt, P->interl,
+                    pfctl->dispose_op, pfctl->blend_op,
+                    pfctl->delay_num, pfctl->delay_den);
+               }
+
+             if (!pf || frame <= 1)
                 break;          /* Process actual IHDR chunk */
 
              /* Process fake IHDR for frame */
@@ -493,7 +498,7 @@ _load(ImlibImage * im, int load_data)
              /* Needed chunks should now be read */
              /* Note - Just before starting to process data chunks libpng will
               * call info_callback() */
-             if (im->frame_count <= 0)
+             if (!pf || pf->frame_count <= 0)
                 break;          /* Regular PNG - Process actual IDAT chunk */
              if (frame == 1 && seen_fctl)
                 break;          /* APNG, First frame is IDAT */
@@ -506,10 +511,12 @@ _load(ImlibImage * im, int load_data)
 
           case PNG_TYPE_acTL:
 #define P (&chunk->actl)
-             if (im->frame_count > 1)
-                im->frame_flags |= FF_IMAGE_ANIMATED;
+             if (!pf)
+                continue;
+             if (pf->frame_count > 1)
+                pf->frame_flags |= FF_IMAGE_ANIMATED;
              D("num_frames=%d num_plays=%d\n",
-               im->frame_count, htonl(P->num_plays));
+               pf->frame_count, htonl(P->num_plays));
              continue;
 #undef P
 
diff --git a/src/modules/loaders/loader_ps.c b/src/modules/loaders/loader_ps.c
index 8ca6023..dded974 100644
--- a/src/modules/loaders/loader_ps.c
+++ b/src/modules/loaders/loader_ps.c
@@ -22,6 +22,7 @@ _load(ImlibImage * im, int load_data)
    unsigned char      *src;
    uint32_t           *dst;
    int                 i, j;
+   ImlibImageFrame    *pf;
 
    rc = LOAD_FAIL;
    spdoc = NULL;
@@ -47,12 +48,13 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
    frame = im->frame;
-   if (frame > 0)
+   pf = __imlib_GetFrame(im);
+   if (pf)
      {
-        im->frame_count = spectre_document_get_n_pages(spdoc);
-        D("Pages=%d\n", im->frame_count);
+        pf->frame_count = spectre_document_get_n_pages(spdoc);
+        D("Pages=%d\n", pf->frame_count);
 
-        if (frame > 1 && frame > im->frame_count)
+        if (frame > 1 && frame > pf->frame_count)
            QUIT_WITH_RC(LOAD_BADFRAME);
      }
    else
diff --git a/src/modules/loaders/loader_webp.c b/src/modules/loaders/loader_webp.c
index 963cec2..bb0923c 100644
--- a/src/modules/loaders/loader_webp.c
+++ b/src/modules/loaders/loader_webp.c
@@ -17,6 +17,7 @@ _load(ImlibImage * im, int load_data)
    WebPDemuxer        *demux;
    WebPIterator        iter;
    int                 frame;
+   ImlibImageFrame    *pf;
 
    rc = LOAD_FAIL;
 
@@ -34,19 +35,21 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
    frame = im->frame;
-   if (frame > 0)
+   pf = __imlib_GetFrame(im);
+   if (pf)
      {
-        im->frame_count = WebPDemuxGetI(demux, WEBP_FF_FRAME_COUNT);
-        im->loop_count = WebPDemuxGetI(demux, WEBP_FF_LOOP_COUNT);
-        if (im->frame_count > 1)
-           im->frame_flags |= FF_IMAGE_ANIMATED;
-        im->canvas_w = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
-        im->canvas_h = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
+        frame = im->frame;
+        pf->frame_count = WebPDemuxGetI(demux, WEBP_FF_FRAME_COUNT);
+        pf->loop_count = WebPDemuxGetI(demux, WEBP_FF_LOOP_COUNT);
+        if (pf->frame_count > 1)
+           pf->frame_flags |= FF_IMAGE_ANIMATED;
+        pf->canvas_w = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
+        pf->canvas_h = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
 
         D("Canvas WxH=%dx%d frames=%d repeat=%d\n",
-          im->canvas_w, im->canvas_h, im->frame_count, im->loop_count);
+          pf->canvas_w, pf->canvas_h, pf->frame_count, pf->loop_count);
 
-        if (frame > 1 && frame > im->frame_count)
+        if (frame > 1 && frame > pf->frame_count)
            QUIT_WITH_RC(LOAD_BADFRAME);
      }
    else
@@ -61,18 +64,22 @@ _load(ImlibImage * im, int load_data)
 
    im->w = iter.width;
    im->h = iter.height;
-   im->frame_x = iter.x_offset;
-   im->frame_y = iter.y_offset;
-   im->frame_delay = iter.duration;
-   if (iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND)
-      im->frame_flags |= FF_FRAME_DISPOSE_CLEAR;
-   if (iter.blend_method == WEBP_MUX_BLEND)
-      im->frame_flags |= FF_FRAME_BLEND;
-
-   D("Canvas WxH=%dx%d frame=%d/%d X,Y=%d,%d WxH=%dx%d alpha=%d T=%d dm=%d co=%d bl=%d\n",      //
-     im->canvas_w, im->canvas_h, iter.frame_num, im->frame_count,
-     im->frame_x, im->frame_y, im->w, im->h, iter.has_alpha,
-     im->frame_delay, iter.dispose_method, iter.complete, iter.blend_method);
+   if (pf)
+     {
+        pf->frame_x = iter.x_offset;
+        pf->frame_y = iter.y_offset;
+        pf->frame_delay = iter.duration;
+        if (iter.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND)
+           pf->frame_flags |= FF_FRAME_DISPOSE_CLEAR;
+        if (iter.blend_method == WEBP_MUX_BLEND)
+           pf->frame_flags |= FF_FRAME_BLEND;
+
+        D("Canvas WxH=%dx%d frame=%d/%d X,Y=%d,%d WxH=%dx%d alpha=%d T=%d dm=%d co=%d bl=%d\n", //
+          pf->canvas_w, pf->canvas_h, iter.frame_num, pf->frame_count,
+          pf->frame_x, pf->frame_y, im->w, im->h, iter.has_alpha,
+          pf->frame_delay, iter.dispose_method, iter.complete,
+          iter.blend_method);
+     }
 
    if (!IMAGE_DIMENSIONS_OK(im->w, im->h))
       goto quit;

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

Reply via email to