]> git.draconx.ca Git - liblbx.git/blobdiff - src/lbximg.c
liblbx: Clean up embedded palette handling
[liblbx.git] / src / lbximg.c
index dc4697b31568c0f6cb7483f7fca3aabdb4b5ab25..cdba3af56bca64d05dc51a7a90cc996f45ace2ea 100644 (file)
@@ -206,66 +206,70 @@ int output(unsigned int frameno, const struct img_format *fmt,
 
 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. */
@@ -341,7 +345,6 @@ decode(struct lbx_image *img, FILE *palf, FILE *override, int fmt, char **argv)
 {
        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;
@@ -349,8 +352,6 @@ decode(struct lbx_image *img, FILE *palf, FILE *override, int fmt, char **argv)
 
        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");
@@ -392,7 +393,7 @@ decode(struct lbx_image *img, FILE *palf, FILE *override, int fmt, char **argv)
        }
 
        if (usepalette) {
-               if (loadpalette(img, &info, palf, override, palette) == -1) {
+               if (loadpalette(img, palf, override, palette) == -1) {
                        ret = EXIT_FAILURE;
                        goto err;
                }
@@ -537,14 +538,21 @@ int main(int argc, char **argv)
 
        if (verbose || mode == MODE_IDENT) {
                struct lbx_imginfo info;
+               int palette_count;
 
                if (!file)
                        file = "stdin";
 
+               palette_count = lbx_img_getpalette(img, NULL);
+               if (palette_count < 0) {
+                       tool_err(-1, "error reading image: %s", lbx_errmsg());
+                       return EXIT_FAILURE;
+               }
+
                lbx_img_getinfo(img, &info);
                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" : "",
+                      palette_count  ? ", embedded palette" : "",
                       img->chunk     ? ", chunked" : "",
                       info.looping   ? ", loops" : "");
        }