foo
authorJohn Tsiombikas <nuclear@member.fsf.org>
Sat, 6 Jan 2024 15:03:33 +0000 (17:03 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Sat, 6 Jan 2024 15:03:33 +0000 (17:03 +0200)
src/data.s
tools/pngdump/tiles.c

index 328fc12..ad75a4c 100644 (file)
@@ -6,6 +6,10 @@
        .globl cellspr_data_end
        .globl cellspr_cmap
        .globl cellspr_cmap_end
+       .globl lifebg_data
+       .globl lifebg_data_end
+       .globl lifefg_data
+       .globl lifefg_data_end
 font8x8_data:
        .incbin "data/font8x8.img"
 font8x8_data_end:
@@ -20,4 +24,26 @@ cellspr_cmap:
        .incbin "data/cellspr.cmap"
 cellspr_cmap_end:
 
+       .align 2
+lifebg_data:
+       .incbin "data/lifebg.img"
+lifebg_data_end:
+
+       .align 2
+lifebg_cmap:
+       .incbin "data/lifebg.cmap"
+lifebg_cmap_end:
+
+       .align 2
+lifefg_data:
+       .incbin "data/lifefg.img"
+lifefg_data_end:
+
+       .align 2
+lifefg_cmap:
+       .incbin "data/lifefg.cmap"
+lifefg_cmap_end:
+
+
+
 | vi:ft=gas68k:
index bcf27e6..92f404f 100644 (file)
@@ -1,12 +1,15 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdint.h>
 #include "tiles.h"
 #include "image.h"
 
+static int matchtile(struct image *img, int toffs, int th);
+
 int img2tiles(struct tilemap *tmap, struct image *img, int tw, int th, int dedup)
 {
-       int i, j, x, y, tx, ty, tileoffs, xtiles, ytiles, ntiles;
+       int i, j, x, y, tx, ty, tileoffs, xtiles, ytiles, ntiles, tileno, tid;
        struct image orig;
        unsigned int pix;
 
@@ -34,6 +37,7 @@ int img2tiles(struct tilemap *tmap, struct image *img, int tw, int th, int dedup
                }
        }
 
+       tileno = 0;
        tileoffs = 0;
        y = 0;
        for(i=0; i<ytiles; i++) {
@@ -45,7 +49,14 @@ int img2tiles(struct tilemap *tmap, struct image *img, int tw, int th, int dedup
                                        put_pixel(img, tx, ty + tileoffs, pix);
                                }
                        }
-                       tileoffs += th; /* destination Y offset, inc by th for every tile */
+
+                       if(!dedup || (tid = matchtile(img, tileoffs, th)) == -1) {
+                               tmap->map[tileno] = tileno;
+                               tileoffs += th; /* destination Y offset, inc by th for every tile */
+                       } else {
+                               tmap->map[tileno] = tid;
+                       }
+                       tileno++;
                        x += tw;
                }
                y += th;
@@ -55,7 +66,45 @@ int img2tiles(struct tilemap *tmap, struct image *img, int tw, int th, int dedup
        return 0;
 }
 
-int dump_tilemap(struct tilemap *tmap, const char *fname)
+static int matchtile(struct image *img, int toffs, int th)
 {
+       int i, tilesz;
+       int ntiles = toffs / th;
+       unsigned char *pa, *pb;
+
+       tilesz = img->pitch * th;
+       pa = (unsigned char*)img->pixels;
+       pb = (unsigned char*)img->pixels + toffs * tilesz;
+
+       for(i=0; i<ntiles; i++) {
+               if(memcmp(pa, pb, tilesz) == 0) {
+                       return i;
+               }
+               pa += tilesz;
+       }
+
        return -1;
 }
+
+int dump_tilemap(struct tilemap *tmap, const char *fname)
+{
+       FILE *fp;
+       int i, sz = tmap->width * tmap->height;
+       uint16_t id;
+
+       if(sz <= 0) return -1;
+
+       if(!(fp = fopen(fname, "wb"))) {
+               fprintf(stderr, "dump_tilemap: failed to open %s for writing\n", fname);
+               return -1;
+       }
+
+       for(i=0; i<sz; i++) {
+               /* XXX dump in 16bit big endian for the megadrive */
+               id = (tmap->map[i] << 8) | (tmap->map[i] >> 8);
+               fwrite(&id, sizeof id, 1, fp);
+       }
+
+       fclose(fp);
+       return 0;
+}