static int loadoverride(FILE *f, struct lbx_colour palette[static 256])
{
- struct lbx_image *overimg = lbx_img_open(f, &lbx_default_fops, NULL);
- struct lbx_imginfo info;
+ struct lbx_image *img;
+ int rc, ret = 0;
- if (!overimg) {
+ img = lbx_img_open(f, &lbx_default_fops, NULL);
+ if (!img) {
tool_err(-1, "failed to open override image: %s", lbx_errmsg());
return -1;
}
- lbx_img_getinfo(overimg, &info);
-
- if (!info.palettesz) {
- tool_err(-1, "override image has no palette.");
- lbx_img_close(overimg);
- return -1;
- }
- if (lbx_img_getpalette(overimg, palette) == -1) {
+ rc = lbx_img_getpalette(img, palette);
+ if (rc < 0) {
tool_err(-1, "error reading override palette: %s", lbx_errmsg());
- lbx_img_close(overimg);
- return -1;
+ ret = -1;
+ } else if (rc == 0) {
+ tool_err(-1, "override image has no palette.");
+ ret = -1;
}
- lbx_img_close(overimg);
- return 0;
+ lbx_img_close(img);
+ return ret;
}
-static int loadpalette(struct lbx_image *img, struct lbx_imginfo *info,
- FILE *palf, FILE *override,
- struct lbx_colour palette[static 256])
+static int loadpalette(struct lbx_image *img, FILE *palf, FILE *override,
+ struct lbx_colour *palette)
{
- int i;
-
- /* For sanity. */
- if (!palf && !info->palettesz && !override) {
- tool_err(-1, "no palette available.");
- return -1;
- }
+ int rc, ret = -1;
/* Default the palette to a wonderful pink. */
- for (i = 0; i < 256; i++) {
+ for (unsigned i = 0; i < 256; i++) {
palette[i] = (struct lbx_colour){0x3f, 0x00, 0x3f};
}
/* Read the external palette, if any. */
- if (palf && lbx_img_loadpalette(palf, &lbx_default_fops, palette) != 0) {
- tool_err(-1, "error reading external palette: %s", lbx_errmsg());
- return -1;
+ if (palf) {
+ rc = lbx_img_loadpalette(palf, &lbx_default_fops, palette);
+ if (rc < 0) {
+ tool_err(-1, "error reading external palette: %s", lbx_errmsg());
+ return -1;
+ }
+
+ ret = 0;
}
- /* Read the embedded palette, if any. */
- if (info->palettesz && lbx_img_getpalette(img, palette) == -1) {
+ /* Read the embedded palette */
+ rc = lbx_img_getpalette(img, palette);
+ if (rc < 0) {
tool_err(-1, "error reading embedded palette: %s", lbx_errmsg());
return -1;
+ } else if (rc > 0) {
+ ret = 0;
}
/* Read the override palette, if any. */
- if (override && loadoverride(override, palette) == -1) {
- return -1;
+ if (override) {
+ rc = loadoverride(override, palette);
+ if (rc < 0)
+ return -1;
+ ret = 0;
}
- return 0;
+ /* If we literally have no palette data at all, may as well fail. */
+ if (ret < 0)
+ tool_err(-1, "no palette available.");
+ return ret;
}
/* Return true iff a divides b. */
{
unsigned char *pixels = NULL, *pixel_mask = NULL, *framebits = NULL;
struct lbx_colour palette[256];
- struct lbx_imginfo info;
int rc, ret = EXIT_FAILURE;
int extracted = 0;
unsigned int i;
assert(fmt >= 0 && fmt < sizeof formats / sizeof formats[0]);
- lbx_img_getinfo(img, &info);
-
npixels = img->width;
if (img->height && npixels >= SIZE_MAX / img->height) {
tool_err(-1, "image too large");
}
if (usepalette) {
- if (loadpalette(img, &info, palf, override, palette) == -1) {
+ if (loadpalette(img, palf, override, palette) == -1) {
ret = EXIT_FAILURE;
goto err;
}
}
if (verbose || mode == MODE_IDENT) {
- struct lbx_imginfo info;
+ int palette_count;
if (!file)
file = "stdin";
- lbx_img_getinfo(img, &info);
+ palette_count = lbx_img_getpalette(img, NULL);
+ if (palette_count < 0) {
+ tool_err(-1, "error reading image: %s", lbx_errmsg());
+ return EXIT_FAILURE;
+ }
+
printf("%s is %hux%hu LBX image, %hhu frame(s)%s%s%s\n",
file, img->width, img->height, img->frames,
- info.palettesz ? ", embedded palette" : "",
- img->chunk ? ", chunked" : "",
- info.looping ? ", loops" : "");
+ palette_count ? ", embedded palette" : "",
+ img->chunk ? ", chunked" : "",
+ img->leadin+1 < img->frames ? ", loops" : "");
}
switch (mode) {