]> git.draconx.ca Git - liblbx.git/blobdiff - src/image.c
liblbx: Clear the image mask when backtracking frames.
[liblbx.git] / src / image.c
index d58314544373a38ce86825d1ed4e511aa1044062..76fbfed3528ccf2d8561c7ee1bf9502e7d6eef99 100644 (file)
 #include "image.h"
 
 #define FLAG_OVERWRITE 0x0400 /* Draw each frame on a clean slate (unsure). */
+#define FLAG_BUILDING  0x0800 /* Buildings have this, related to shadow? */
 #define FLAG_PALETTE   0x1000 /* Image contains embedded palette. */
 #define FLAG_LOOPING   0x2000 /* Loop over all frames in the image (unsure). */
-#define FLAG_ALL (FLAG_OVERWRITE|FLAG_PALETTE|FLAG_LOOPING)
+
+#define FLAG_ALL (FLAG_OVERWRITE|FLAG_BUILDING|FLAG_PALETTE|FLAG_LOOPING)
 
 #define HDR_LEN 12
 
@@ -289,8 +291,10 @@ unsigned char **lbximg_getframe(struct lbx_image *img, int frame)
                memset(img->mask[0],      0, img->width * img->height);
        } else {
                /* Start over if we are backtracking. */
-               if (img->currentframe > frame)
+               if (img->currentframe > frame) {
+                       memset(img->mask[0], 0, img->width * img->height);
                        img->currentframe = -1;
+               }
 
                /* We must have previous frame decoded to continue. */
                if (frame > img->currentframe + 1) {
@@ -324,13 +328,15 @@ unsigned char **lbximg_getframe(struct lbx_image *img, int frame)
        return img->framedata;
 }
 
-int lbximg_loadpalette(FILE *f, struct lbx_colour palette[static 256])
+int
+lbximg_loadpalette(void *f, const struct lbx_file_ops *fops,
+                   struct lbx_colour palette[static 256])
 {
        unsigned char entry[4];
        int i;
 
        for (i = 0; i < 256; i++) {
-               if (fread(entry, sizeof entry, 1, f) != 1) {
+               if (fops->read(entry, sizeof entry, f) != sizeof entry) {
                        lbx_errno = (feof(f)) ? LBX_EEOF : -errno;
                        return -1;
                }
@@ -340,10 +346,11 @@ int lbximg_loadpalette(FILE *f, struct lbx_colour palette[static 256])
                        return -1;
                }
 
-               palette[i] = (struct lbx_colour){
-                       .red   = entry[1] << 2,
-                       .green = entry[2] << 2,
-                       .blue  = entry[3] << 2,
+               palette[i] = (struct lbx_colour) {
+                       .red    = entry[1] << 2,
+                       .green  = entry[2] << 2,
+                       .blue   = entry[3] << 2,
+                       .active = 1,
                };
        }
 
@@ -368,7 +375,6 @@ lbximg_getpalette(struct lbx_image *img, struct lbx_colour palette[static 256])
 
        for (i = 0; i < img->palcount; i++) {
                rc = img->fops->read(entry, sizeof entry, img->f);
-
                if (rc < sizeof entry) {
                        goto readerr;
                }
@@ -379,9 +385,10 @@ lbximg_getpalette(struct lbx_image *img, struct lbx_colour palette[static 256])
                }
 
                palette[img->palstart + i] = (struct lbx_colour){
-                       .red   = entry[1] << 2,
-                       .green = entry[2] << 2,
-                       .blue  = entry[3] << 2,
+                       .red    = entry[1] << 2,
+                       .green  = entry[2] << 2,
+                       .blue   = entry[3] << 2,
+                       .active = 1,
                };
        }