return img;
}
-struct lbx_image *lbximg_fopen(FILE *f)
+static int pipe_close(void *f)
{
- return lbximg_open(f, &lbx_default_fops, NULL);
+ struct lbx_pipe_state *p = f;
+ int rc;
+
+ rc = fclose(p->f);
+ free(p);
+ return rc;
+}
+
+static int file_close(void *f)
+{
+ return fclose((FILE *)f);
+}
+
+struct lbx_image *lbximg_fopen(const char *file)
+{
+ struct lbx_pipe_state *p;
+ FILE *f;
+
+ f = fopen(file, "rb");
+ if (!f)
+ return NULL;
+
+ if (fseek(f, 0, SEEK_CUR) == 0)
+ return lbximg_open(f, &lbx_default_fops, file_close);
+
+ p = malloc(sizeof *p);
+ if (!p) {
+ fclose(f);
+ return NULL;
+ }
+
+ *p = (struct lbx_pipe_state) { .f = f };
+ return lbximg_open(p, &lbx_pipe_fops, pipe_close);
}
static int _lbx_drawrow(int first, struct lbx_image *img)
LBX_IMG *lbximg_open(void *f, const struct lbx_file_ops *fops,
int (*destructor)(void *));
-LBX_IMG *lbximg_fopen(FILE *f);
+LBX_IMG *lbximg_fopen(const char *file);
int lbximg_close(LBX_IMG *img);
unsigned char **lbximg_getframe(LBX_IMG *img, int frame);
static int loadoverride(FILE *f, struct lbx_colour palette[static 256])
{
- LBX_IMG *overimg = lbximg_fopen(f);
+ LBX_IMG *overimg = lbximg_open(f, &lbx_default_fops, NULL);
struct lbx_imginfo info;
if (!overimg) {