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.