#!/usr/bin/pike
/*
 * paster.pike
 *
 * Resize a png into another png
 *
 * History:
 *      28/09/2020 Creation from resizer.pike
 *
 * 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 i;
	string geom;
	mapping imagemapping;
	int xsize,ysize;
        int xoff,yoff;
	string destfilename;
	Image.Image image,alpha;
	array(Image.Layer) layers=({});
	Image.Layer l;
        if(argc<4 || (argc%2)!=0 || (argc>1 && argv[1]=="--help")) {
                Stdio.werror("Syntax:  "+argv[0]+" <geom1> { <file1.png> | <htmlcolor1> } [<geom2> { <file2.png> | <htmlcolor2> } [...]] <outfile.png>\n");
                Stdio.werror("Example: "+argv[0]+" 200x300+0+0 bg.png 150x0+25+25 image.png 100x1+0+0 \"#ff0000\" dest.png\n");
                Stdio.werror("Example result: dest.png\n");
                return(1);
        }
	destfilename=argv[argc-1];
	write("* Loading images...\n");
	for(i=1;(i+1)<argc;i+=2) {
		geom=argv[i];
		if(sizeof(argv[i+1])>1 && argv[i+1][0]=='#') {
			string htmlcolor=argv[i+1];
			int r,g,b,a;
			a=0;
			htmlcolor-="#";
			sscanf(htmlcolor[0..1],"%x",r);
        		sscanf(htmlcolor[2..3],"%x",g);
        		sscanf(htmlcolor[4..5],"%x",b);
        		if(sizeof(htmlcolor)>6)
                		sscanf(htmlcolor[6..7],"%x",a);
write("r:"+r+" g:"+g+" b:"+b+" a:"+a+"\n");
			image=Image.Image(1,1,r,g,b);
			imagemapping=([ "image":image, "alpha":Image.Image(1,1,255-a,255-a,255-a) ]);
		} else {
			imagemapping=Image._load(argv[i+1]);
		}
		xsize=ysize=xoff=yoff=0;
        	if(sizeof(geom/"x")>1)
			xsize=(int) (geom/"x")[0];
        	if(sizeof(geom/"x")>1)
                	ysize=(int) (((geom/"x")[1])/"+")[0];
        	if(sizeof(geom/"+")>1)
                	xoff=(int) (geom/"+")[1];
        	if(sizeof(geom/"+")>2)
                	yoff=(int) (geom/"+")[2];
		image=imagemapping["image"];
		alpha=imagemapping["alpha"];
		xsize=(xsize!=0)?xsize:(ysize==0)?image->xsize():ysize*image->xsize()/image->ysize();
		ysize=(ysize!=0)?ysize:(xsize==0)?image->ysize():xsize*image->ysize()/image->xsize();
		if(xsize!=image->xsize() || ysize!=image->ysize()) {
			image=image->scale(xsize,ysize);
			if(!intp(alpha))
				alpha=alpha->scale(xsize,ysize);
		}
		if(intp(alpha))
			alpha=Image.Image(xsize,ysize,255,255,255);
		l=Image.Layer(image,alpha,"normal");
		l->set_offset(xoff,yoff);
		layers+=({l});
	}
	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("* Finished successfully\n");
        return(0);
}