+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;
+
+ if (!overimg) {
+ errmsg("failed to open override image: %s\n", lbx_errmsg());
+ return -1;
+ }
+ lbx_img_getinfo(overimg, &info);
+
+ if (!info.palettesz) {
+ errmsg("override image has no palette.\n", 0);
+ lbx_img_close(overimg);
+ return -1;
+ }
+
+ if (lbx_img_getpalette(overimg, palette) == -1) {
+ errmsg("error reading override palette: %s\n", lbx_errmsg());
+ lbx_img_close(overimg);
+ return -1;
+ }
+
+ lbx_img_close(overimg);
+ return 0;
+}
+
+static int loadpalette(struct lbx_image *img, struct lbx_imginfo *info,
+ FILE *palf, FILE *override,
+ struct lbx_colour palette[static 256])
+{
+ int i;
+
+ /* In no-palette mode, use palette indices for colour. */
+ if (!usepalette) {
+ for (i = 0; i < 256; i++) {
+ palette[i] = (struct lbx_colour){i,i,i};
+ }
+
+ return 0;
+ }
+
+ /* For sanity. */
+ if (!palf && !info->palettesz && !override) {
+ errmsg("no palette available.\n", 0);
+ return -1;
+ }
+
+ /* Default the palette to a wonderful pink. */
+ for (i = 0; i < 256; i++) {
+ palette[i] = (struct lbx_colour){0xff, 0x00, 0xff};
+ }
+
+ /* Read the external palette, if any. */
+ if (palf && lbx_img_loadpalette(palf, &lbx_default_fops, palette) != 0) {
+ errmsg("error reading external palette: %s\n", lbx_errmsg());
+ return -1;
+ }
+
+ /* Read the embedded palette, if any. */
+ if (info->palettesz && lbx_img_getpalette(img, palette) == -1) {
+ errmsg("error reading embedded palette: %s\n", lbx_errmsg());
+ return -1;
+ }
+
+ /* Read the override palette, if any. */
+ if (override && loadoverride(override, palette) == -1) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int decode(struct lbx_image *img, FILE *palf, FILE *override, char **argv)