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 6df68e3e2e52d271c1f4e048872fb46c7b149c03
Author: Kim Woelders <[email protected]>
AuthorDate: Sun Nov 13 10:24:09 2022 +0100

    multiframe: Tweaks around frame number handling
---
 src/lib/Imlib2_Loader.h           |  2 +-
 src/lib/api.c                     |  2 +-
 src/lib/image.c                   | 33 +++++++++++++++++----------------
 src/lib/image.h                   |  2 +-
 src/modules/loaders/loader_gif.c  |  9 ++++-----
 src/modules/loaders/loader_ico.c  |  5 ++---
 src/modules/loaders/loader_jxl.c  | 23 ++++++++++-------------
 src/modules/loaders/loader_png.c  |  4 ++--
 src/modules/loaders/loader_ps.c   |  9 ++++++---
 src/modules/loaders/loader_webp.c |  9 ++++++---
 10 files changed, 50 insertions(+), 48 deletions(-)

diff --git a/src/lib/Imlib2_Loader.h b/src/lib/Imlib2_Loader.h
index ca79d56..a8f650c 100644
--- a/src/lib/Imlib2_Loader.h
+++ b/src/lib/Imlib2_Loader.h
@@ -140,10 +140,10 @@ struct _ImlibImage {
    char                has_alpha;
    char                rsvd[3];
 
+   int                 frame;
    int                 canvas_w;        /* Canvas size      */
    int                 canvas_h;
    int                 frame_count;     /* Number of frames */
-   int                 frame_num;       /* Current frame    */
    int                 frame_x; /* Frame origin     */
    int                 frame_y;
    int                 frame_flags;     /* Frame flags      */
diff --git a/src/lib/api.c b/src/lib/api.c
index 7a8d994..41595a4 100644
--- a/src/lib/api.c
+++ b/src/lib/api.c
@@ -683,7 +683,7 @@ imlib_image_get_frame_info(Imlib_Frame_Info * info)
 
    info->loop_count = im->loop_count;
    info->frame_count = im->frame_count;
-   info->frame_num = im->frame_num;
+   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;
diff --git a/src/lib/image.c b/src/lib/image.c
index b688662..f73890f 100644
--- a/src/lib/image.c
+++ b/src/lib/image.c
@@ -220,19 +220,20 @@ __imlib_FindCachedImage(const char *file, int frame)
    for (im = images, im_prev = NULL; im; im_prev = im, im = im->next)
      {
         /* if the filenames match and it's valid */
-        if (!strcmp(file, im->file) && !IM_FLAG_ISSET(im, F_INVALID) &&
-            frame == im->frame_num)
+        if (strcmp(file, im->file) || IM_FLAG_ISSET(im, F_INVALID))
+           continue;
+        if (frame != im->frame)
+           continue;
+
+        /* move the image to the head of the image list */
+        if (im_prev)
           {
-             /* move the image to the head of the image list */
-             if (im_prev)
-               {
-                  im_prev->next = im->next;
-                  im->next = images;
-                  images = im;
-               }
-             DP(" got %p: '%s' frame %d\n", im, im->fi->name, im->frame_num);
-             return im;
+             im_prev->next = im->next;
+             im->next = images;
+             images = im;
           }
+        DP(" got %p: '%s' frame %d\n", im, im->fi->name, im->frame);
+        return im;
      }
    DP(" got none\n");
    return NULL;
@@ -242,7 +243,7 @@ __imlib_FindCachedImage(const char *file, int frame)
 static void
 __imlib_AddImageToCache(ImlibImage * im)
 {
-   DP("%s: %p: '%s' frame %d\n", __func__, im, im->fi->name, im->frame_num);
+   DP("%s: %p: '%s' frame %d\n", __func__, im, im->fi->name, im->frame);
    im->next = images;
    images = im;
 }
@@ -254,7 +255,7 @@ __imlib_RemoveImageFromCache(ImlibImage * im_del)
    ImlibImage         *im, *im_prev;
 
    im = im_del;
-   DP("%s: %p: '%s' frame %d\n", __func__, im, im->fi->name, im->frame_num);
+   DP("%s: %p: '%s' frame %d\n", __func__, im, im->fi->name, im->frame);
 
    for (im = images, im_prev = NULL; im; im_prev = im, im = im->next)
      {
@@ -380,8 +381,8 @@ __imlib_LoadImageWrapper(const ImlibLoader * l, ImlibImage * im, int load_data)
 {
    int                 rc;
 
-   DP("%s: fmt='%s' file='%s'(%s), imm=%d\n", __func__,
-      l->name, im->file, im->fi->name, load_data);
+   DP("%s: fmt='%s' file='%s'(%s) frame=%d, imm=%d\n", __func__,
+      l->name, im->file, im->fi->name, im->frame, load_data);
 
 #if IMLIB2_DEBUG
    unsigned int        t0 = __imlib_time_us();
@@ -548,7 +549,7 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
    im = __imlib_ProduceImage();
    im->file = strdup(file);
    im->key = im_key;
-   im->frame_num = ila->frame;
+   im->frame = ila->frame;
 
    if (__imlib_ImageFileContextPush(im, true, im_file ? im_file : im->file) ||
        __imlib_FileContextOpen(im->fi, ila->fp, ila->fdata, st.st_size))
diff --git a/src/lib/image.h b/src/lib/image.h
index 44816e5..a0a1765 100644
--- a/src/lib/image.h
+++ b/src/lib/image.h
@@ -51,10 +51,10 @@ struct _ImlibImage {
    char                has_alpha;
    char                rsvd[3];
 
+   int                 frame;
    int                 canvas_w;        /* Canvas size      */
    int                 canvas_h;
    int                 frame_count;     /* Number of frames */
-   int                 frame_num;       /* Current frame    */
    int                 frame_x; /* Frame origin     */
    int                 frame_y;
    int                 frame_flags;     /* Frame flags      */
diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index 6cf1ddc..7e81726 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -84,10 +84,9 @@ _load(ImlibImage * im, int load_data)
 
    transp = -1;
    fcount = 0;
-   frame = 1;
-   if (im->frame_num > 0)
+   frame = im->frame;
+   if (frame > 0)
      {
-        frame = im->frame_num;
         im->frame_count = gif->ImageCount;
         im->loop_count = 0;     /* Loop forever */
         if (im->frame_count > 1)
@@ -137,7 +136,7 @@ _load(ImlibImage * im, int load_data)
 
              fcount += 1;
 
-             if (gif->ImageCount != frame)
+             if (frame > 0 && gif->ImageCount != frame)
                {
                   int                 size = 0;
                   GifByteType        *data;
@@ -204,7 +203,7 @@ _load(ImlibImage * im, int load_data)
                }
 
              /* Break if no specific frame was requested */
-             if (im->frame_num == 0)
+             if (frame == 0)
                 break;
           }
         else if (rec == EXTENSION_RECORD_TYPE)
diff --git a/src/modules/loaders/loader_ico.c b/src/modules/loaders/loader_ico.c
index 530bdc3..0ebf4ec 100644
--- a/src/modules/loaders/loader_ico.c
+++ b/src/modules/loaders/loader_ico.c
@@ -303,10 +303,9 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
-   frame = 0;                   /* Select default */
-   if (im->frame_num > 0)
+   frame = im->frame;
+   if (frame > 0)
      {
-        frame = im->frame_num;
         im->frame_count = ico.idir.icons;
 
         if (frame > 1 && frame > im->frame_count)
diff --git a/src/modules/loaders/loader_jxl.c b/src/modules/loaders/loader_jxl.c
index 7868b0a..8bd9acc 100644
--- a/src/modules/loaders/loader_jxl.c
+++ b/src/modules/loaders/loader_jxl.c
@@ -47,7 +47,7 @@ _load(ImlibImage * im, int load_data)
    JxlDecoder         *dec;
    JxlBasicInfo        info;
    JxlFrameHeader      fhdr;
-   int                 delay_unit;
+   int                 frame, delay_unit;
 
 #if MAX_RUNNERS > 0
    size_t              n_runners;
@@ -99,6 +99,7 @@ _load(ImlibImage * im, int load_data)
    if (jst != JXL_DEC_SUCCESS)
       goto quit;
 
+   frame = im->frame;
    delay_unit = 0;
 
    for (;;)
@@ -136,12 +137,8 @@ _load(ImlibImage * im, int load_data)
              im->h = info.ysize;
              im->has_alpha = info.alpha_bits > 0;
 
-             int                 frame;
-
-             frame = 1;
-             if (im->frame_num > 0)
+             if (frame > 0)
                {
-                  frame = im->frame_num;
                   if (info.have_animation)
                     {
                        im->frame_count = 1234567890;    // FIXME - Hack
@@ -158,16 +155,16 @@ _load(ImlibImage * im, int load_data)
                   if (frame > 1 && im->frame_count > 0
                       && frame > im->frame_count)
                      QUIT_WITH_RC(LOAD_BADFRAME);
+
+                  if (frame > 1)
+                    {
+                       /* Fast forward to desired frame */
+                       JxlDecoderSkipFrames(dec, frame - 1);
+                    }
                }
 
              if (!load_data)
                 QUIT_WITH_RC(LOAD_SUCCESS);
-
-             if (frame > 1)
-               {
-                  /* Fast forward to desired frame */
-                  JxlDecoderSkipFrames(dec, frame - 1);
-               }
              break;
 
           case JXL_DEC_NEED_IMAGE_OUT_BUFFER:
@@ -183,7 +180,7 @@ _load(ImlibImage * im, int load_data)
           case JXL_DEC_FRAME:
              JxlDecoderGetFrameHeader(dec, &fhdr);
              if (fhdr.is_last)
-                im->frame_count = im->frame_num;
+                im->frame_count = frame;
              im->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);
diff --git a/src/modules/loaders/loader_png.c b/src/modules/loaders/loader_png.c
index 96f8eb5..16cf268 100644
--- a/src/modules/loaders/loader_png.c
+++ b/src/modules/loaders/loader_png.c
@@ -337,8 +337,8 @@ _load(ImlibImage * im, int load_data)
    png_set_progressive_read_fn(png_ptr, &ctx,
                                info_callback, row_callback, NULL);
 
-   frame = im->frame_num;
-   if (im->frame_num <= 0)
+   frame = im->frame;
+   if (frame <= 0)
       goto scan_done;
 
    /* Animation info requested. Look it up to find the frame's
diff --git a/src/modules/loaders/loader_ps.c b/src/modules/loaders/loader_ps.c
index 20cd080..8ca6023 100644
--- a/src/modules/loaders/loader_ps.c
+++ b/src/modules/loaders/loader_ps.c
@@ -46,16 +46,19 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
-   frame = 1;
-   if (im->frame_num > 0)
+   frame = im->frame;
+   if (frame > 0)
      {
-        frame = im->frame_num;
         im->frame_count = spectre_document_get_n_pages(spdoc);
         D("Pages=%d\n", im->frame_count);
 
         if (frame > 1 && frame > im->frame_count)
            QUIT_WITH_RC(LOAD_BADFRAME);
      }
+   else
+     {
+        frame = 1;
+     }
 
    sppage = spectre_document_get_page(spdoc, frame - 1);
    spst = spectre_document_status(spdoc);
diff --git a/src/modules/loaders/loader_webp.c b/src/modules/loaders/loader_webp.c
index 1269768..1b773a1 100644
--- a/src/modules/loaders/loader_webp.c
+++ b/src/modules/loaders/loader_webp.c
@@ -33,10 +33,9 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
-   frame = 1;
-   if (im->frame_num > 0)
+   frame = im->frame;
+   if (frame > 0)
      {
-        frame = im->frame_num;
         im->frame_count = WebPDemuxGetI(demux, WEBP_FF_FRAME_COUNT);
         im->loop_count = WebPDemuxGetI(demux, WEBP_FF_LOOP_COUNT);
         if (im->frame_count > 1)
@@ -50,6 +49,10 @@ _load(ImlibImage * im, int load_data)
         if (frame > 1 && frame > im->frame_count)
            QUIT_WITH_RC(LOAD_BADFRAME);
      }
+   else
+     {
+        frame = 1;
+     }
 
    if (!WebPDemuxGetFrame(demux, frame, &iter))
       goto quit;

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

Reply via email to