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.