#!/usr/bin/pike
/*
 * tiler.pike
 *
 * Tiles NxM different pngs into a single png
 *
 * History:
 *       1/07/2019 Creation
 *       5/11/2019 Fix erroneous 1-pixel border around every tile
 *       9/03/2023 Support transparency
 *
 * Author: Dario Rodriguez dario@softhome.net
 * This program is distributed under the terms of the GNU GPL v2.1+
 */

int
main(int argc, array(string) argv)
{
        int a4w,a4h;
        int maxx,maxy;
        int px,py;
        string destfilename;
        int total;
        Image.Image image,alpha;
        Image.Layer l;
        mapping imagemapping;
        array(Image.Layer) layers=({});
        if(argc<4 || (argc>1 && argv[1]=="--help")) {
                Stdio.werror("Syntax:  "+argv[0]+" <width_in_tiles> <height_in_tiles> <file1.png> [<file2.png> [...]] <destfile.png>\n");
                Stdio.werror("Example: "+argv[0]+" 3 2 file1.png file2.png file3.png file4.png file5.png file6.png dest.png\n");
                Stdio.werror("Example result: dest.png\n");
                return(1);
        }
        a4w=(int)argv[1];
        a4h=(int)argv[2];
        destfilename=argv[sizeof(argv)-1];
        array(string) infiles=argv[3..sizeof(argv)-2];
        maxx=maxy=1;
        write("* Calculating tile size\n");
        foreach(infiles, string f) {
                image=Image.load(f);
                if(image->xsize()>maxx)
                        maxx=image->xsize();
                if(image->ysize()>maxy)
                        maxy=image->ysize();
        }
        image=Image.Image(maxx*a4w,maxy*a4h,255,255,255);
        alpha=Image.Image(maxx*a4w,maxy*a4h,0,0,0);
        l=Image.Layer(image,alpha,"normal");
        l->set_offset(0,0);
        layers+=({l});
        px=py=0;
        total=0;
        foreach(infiles, string f) {
                write("* Processing "+f+"...\n");
                imagemapping=Image._load(f);
                image=imagemapping["image"];
                alpha=imagemapping["alpha"];
                l=Image.Layer(image,alpha,"normal");
                l->set_offset(px*(maxx),py*(maxy));
                layers+=({l});
                //result->paste(img,px*(maxx),py*(maxy));
                px++;
                if(px>=a4w) {
                        px=0;
                        py++;
                }
                total++;
        }
        l=Image.lay(layers);
        l->set_offset(0,0);
        write("* Writing "+destfilename+"...\n");
        Stdio.write_file(destfilename,Image.PNG.encode(l->image(),(["alpha":l->alpha()])));
        write("tiled "+total+" images into "+destfilename+". Process finished.\n");
        return(0);
}