struct lbx_image {
unsigned short width, height;
unsigned short wtf, flags;
- unsigned short frames, leadin;
+ unsigned char frames, wtf2, leadin, chunk;
unsigned short palstart, palcount;
const struct lbx_file_ops *fops;
.width = unpack_16_le(hdr+0),
.height = unpack_16_le(hdr+2),
.wtf = unpack_16_le(hdr+4),
- .frames = unpack_16_le(hdr+6),
- .leadin = unpack_16_le(hdr+8),
+ .frames = hdr[6],
+ .wtf2 = hdr[7],
+ .leadin = hdr[8],
+ .chunk = hdr[9],
.flags = unpack_16_le(hdr+10),
.currentframe = -1,
/*
* DEBUG ONLY. These assertions exist to catch otherwise valid image
* files which differ from what I believe to be true of all LBX images.
- * If we never find any exceptions, we can replace the assertions with
- * assumptions.
+ * When we can decode every image, then these assertions should be
+ * replaced with constraints.
*/
- _lbx_assert(img->wtf == 0); /* version? */
- _lbx_assert(img->frames > img->leadin); /* cmbtshp.lbx breaks this. */
+ _lbx_assert(img->wtf == 0); /* version? */
+ _lbx_assert(img->wtf2 == 0); /* very likely is simply reserved. */
+ _lbx_assert(img->frames > img->leadin);
_lbx_assert(!(img->flags & ~FLAG_ALL));
/* Read all offsets. Should be merged with identical code in lbx.c */
if (img->flags & FLAG_RAW)
return read_raw_frame(img, frame);
- if (img->flags & FLAG_OVERWRITE) {
+ if ((img->flags & FLAG_OVERWRITE)
+ || (img->chunk && !(frame % img->chunk))) {
/* Clear the slate. */
img->currentframe = -1;
memset(img->framedata[0], 0, img->width * img->height);
.width = img->width,
.height = img->height,
.nframes = img->frames,
+ .chunk = img->chunk,
.palettesz = (img->flags & FLAG_PALETTE) ? img->palcount : 0,
};
};
struct lbx_imginfo {
- unsigned int width, height;
- unsigned int nframes, loopstart;
- int palettesz;
- int looping;
+ unsigned short width, height;
+ unsigned char nframes, loopstart, chunk;
+ int palettesz, looping;
};
LBX_IMG *lbximg_open(void *f, const struct lbx_file_ops *fops,
printf("%s is %ux%u LBX image, %u frame(s)%s%s\n",
name, info.width, info.height, info.nframes,
info.palettesz ? ", embedded palette" : "",
+ info.chunk ? ", chunked" : "",
info.looping ? ", loops" : "");
}
$LBXIMG -df starbg.lbx.009 -p fonts.lbx.005
compare 0 cfc5d92b6503951c4962498c7dcfea31
+# Monsters
+$LBXTOOL -xf $DATADIR/monster.lbx monster.lbx.{007,014}
+
+echo "monster.lbx.007: multi frame, chunked:"
+$LBXIMG -df monster.lbx.007 -p fonts.lbx.004 -O monster.lbx.014 0 5 19
+compare 0 59399c8d2d74116ff4b330a2cc1f3cc2
+compare 5 6947e108f7c8d2d2d626c67af3fdb7e2
+compare 19 03d86257527f0d7a91c2cde57059e734
+
# Clean up
if [[ $FAILED -eq 0 ]]; then
echo "All tests completed successfully."