#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "kernel.h"
#include "swis.h"

int width=64;
int height=64;
char *infile=0;
char *outfile=0;

_kernel_swi_regs regs;
int *sprs;

void split_sprite(char *name,int w,int h)
{
	int count=0;
	int x,y;
	char name2[16];
	for(y=0;y<h;y+=height)
		for(x=0;x<w;x+=width)
		{
			sprintf(name2,"%s%d",name,count++);
			regs.r[0] = 27+256;
			regs.r[1] = (int) sprs;
			regs.r[2] = (int) name;
			regs.r[3] = (int) name2;
			if(!_kernel_swi(OS_SpriteOp,&regs,&regs))
			{
				/* Reduce */
				if(y>0)
				{
					regs.r[0] = 57+256;
					regs.r[1] = (int) sprs;
					regs.r[2] = (int) name2;
					regs.r[3] = 0;
					regs.r[4] = -y;
					_kernel_swi(OS_SpriteOp,&regs,&regs);
				}
				if(y+height < h)
				{
					regs.r[0] = 57+256;
					regs.r[1] = (int) sprs;
					regs.r[2] = (int) name2;
					regs.r[3] = height;
					regs.r[4] = (y+height)-h;
					_kernel_swi(OS_SpriteOp,&regs,&regs);
				}
				if(x>0)
				{
					regs.r[0] = 58+256;
					regs.r[1] = (int) sprs;
					regs.r[2] = (int) name2;
					regs.r[3] = 0;
					regs.r[4] = -x;
					_kernel_swi(OS_SpriteOp,&regs,&regs);
				}
				if(x+width < w)
				{
					regs.r[0] = 58+256;
					regs.r[1] = (int) sprs;
					regs.r[2] = (int) name2;
					regs.r[3] = width;
					regs.r[4] = (x+width)-w;
					_kernel_swi(OS_SpriteOp,&regs,&regs);
				}
			}
		}
	/* Delete source */
	regs.r[0] = 25+256;
	regs.r[1] = (int) sprs;
	regs.r[2] = (int) name;
	_kernel_swi(OS_SpriteOp,&regs,&regs);
}

int main(int argc,char **argv)
{
	int i;
	char name[16];
	for(i=1;i<argc;i++)
		if(!strncmp(argv[i],"-width=",7))
			width = atoi(argv[i]+7);
		else if(!strncmp(argv[i],"-height=",8))
			height = atoi(argv[i]+8);
		else if(!infile)
			infile = argv[i];
		else
			outfile = argv[i];
	if((!infile) || (!outfile))
	{
		printf("spr2tiles\n\
Usage:\n\
spr2tiles [options] <infile> <outfile>\n\
Options are:\n\
-width=<n>	Set width of tiles (default 64)\n\
-height=<n>	Set height of tiles (default 64)\n");
		return 0;
	}
	/* Process */
	regs.r[0] = 17;
	regs.r[1] = (int) infile;
	_kernel_swi(OS_File,&regs,&regs);
	if(regs.r[0] != 1)
	{
		printf("Input not found!\n");
		return 1;
	}
	sprs = (int *) malloc(regs.r[4]*4);
	sprs[0] = regs.r[4]*4;
	sprs[1] = 0;
	sprs[2] = 16;
	sprs[3] = 16;
	regs.r[0] = 10+256;
	regs.r[1] = (int) sprs;
	regs.r[2] = (int) infile;
	_kernel_swi(OS_SpriteOp,&regs,&regs);
	for(i=0;i<sprs[1];i++)
	{
		/* Get sprite name */
		memset(name,0,sizeof(name));
		regs.r[0] = 13+256;
		regs.r[1] = (int) sprs;
		regs.r[2] = (int) name;
		regs.r[3] = sizeof(name);
		regs.r[4] = i+1;
		_kernel_swi(OS_SpriteOp,&regs,&regs);
		/* Get info */
		regs.r[0] = 40+256;
		regs.r[1] = (int) sprs;
		regs.r[2] = (int) name;
		_kernel_swi(OS_SpriteOp,&regs,&regs);
		if((regs.r[3] > width) || (regs.r[4] > height))
		{
			split_sprite(name,regs.r[3],regs.r[4]);
			i = 0; /* Rescan from start in case sprites have changed order somehow */
		}
	}
	/* Save! */
	regs.r[0] = 12+256;
	regs.r[1] = (int) sprs;
	regs.r[2] = (int) outfile;
	_kernel_swi(OS_SpriteOp,&regs,&regs);
	return 0;
}
