summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKim Woelders <kim@woelders.dk>2021-12-12 16:50:20 +0100
committerKim Woelders <kim@woelders.dk>2021-12-19 14:58:43 +0100
commit7a0022684d3d385bf5e8cdd55efe2bd3dd3cb6c4 (patch)
tree1370ea1a0889f8260084ca6accab01ada308fce4
parentb2ac97d93a2539a53a780d112ce2c1153efa1d53 (diff)
downloadimlib2-7a0022684d3d385bf5e8cdd55efe2bd3dd3cb6c4.tar.gz
ICO loader: Multiframe support
-rw-r--r--src/modules/loaders/loader_ico.c44
1 files changed, 25 insertions, 19 deletions
diff --git a/src/modules/loaders/loader_ico.c b/src/modules/loaders/loader_ico.c
index 8dce7ff..ee02491 100644
--- a/src/modules/loaders/loader_ico.c
+++ b/src/modules/loaders/loader_ico.c
@@ -302,35 +302,41 @@ ico_data_get_nibble(DATA8 * data, int w, int x, int y)
static int
ico_load(ico_t * ico, ImlibImage * im, int load_data)
{
- int ic, x, y, w, h, d;
+ int ic, x, y, w, h, d, frame;
DATA32 *cmap;
DATA8 *pxls, *mask, *psrc;
ie_t *ie;
DATA32 *pdst;
DATA32 pixel;
- /* Find icon with largest size and depth */
- ic = y = d = 0;
- for (x = 0; x < ico->idir.icons; x++)
+ frame = 0; /* Select default */
+ if (im->frame_num > 0)
{
- ie = &ico->ie[x];
- w = ie->w;
- h = ie->h;
- if (w * h < y)
- continue;
- if (w * h == y && ie->bih.bpp < d)
- continue;
- ic = x;
- y = w * h;
- d = ie->bih.bpp;
+ frame = im->frame_num;
+ im->frame_count = ico->idir.icons;
+
+ if (frame > 1 && frame > im->frame_count)
+ return 0;
}
- /* Enable overriding selected index for debug purposes */
- if (im->key)
+ ic = frame - 1;
+ if (ic < 0)
{
- ic = atoi(im->key);
- if (ic >= ico->idir.icons)
- return 0;
+ /* Select default: Find icon with largest size and depth */
+ ic = y = d = 0;
+ for (x = 0; x < ico->idir.icons; x++)
+ {
+ ie = &ico->ie[x];
+ w = ie->w;
+ h = ie->h;
+ if (w * h < y)
+ continue;
+ if (w * h == y && ie->bih.bpp < d)
+ continue;
+ ic = x;
+ y = w * h;
+ d = ie->bih.bpp;
+ }
}
ie = &ico->ie[ic];