#ifndef __OSSPR_C
#define __OSSPR_C

#include <stdlib.h>

#include "kernel.h"
#include "swis.h"

#include "osspr.h"

_kernel_swi_regs osspr_regs;

void *OSSpr_LoadFile(char *f)
{
	int length;
	int *m;
	/* Load the sprite file and return pointer... */
	osspr_regs.r[0] = 17;
	osspr_regs.r[1] = (int) f;
	_kernel_swi (OS_File,&osspr_regs,&osspr_regs);
	length = osspr_regs.r[4]+1027; /* Add extra space */
	length = length - (length & 3); /* Finish rounding to word */
	m = (int *) malloc(length);
	m[0] = length;
	/* Initialise block... */
	osspr_regs.r[0] = 256+9;
	osspr_regs.r[1] = (int) m;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
	/* Now load */
	osspr_regs.r[0] = 256+10;
	osspr_regs.r[1] = (int) m;
	osspr_regs.r[2] = (int) f;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
	return m;
}

void *OSSpr_CreateFile(int length)
{
	int *m;
	m = (int *) malloc(length);
	m[0] = length;
	m[1] = 0;
	m[2] = 16;
	m[3] = 16;
	return m;
}

void OSSpr_CreateSprite(void *b,char *name,int pal,int width,int height,int mode)
{
	osspr_regs.r[0] = 256+15;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) name;
	osspr_regs.r[3] = pal;
	osspr_regs.r[4] = width;
	osspr_regs.r[5] = height;
	osspr_regs.r[6] = mode;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
}

void OSSpr_SaveFile(void *b,char *f)
{
	osspr_regs.r[0] = 256+12;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) f;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
}

osspr_info OSSpr_GetInfo(void *b,char *n)
{
	osspr_info i;
	osspr_regs.r[0] = 256+40;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) n;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
	i.width = osspr_regs.r[3];
	i.height = osspr_regs.r[4];
	i.mask = osspr_regs.r[5];
	i.mode = osspr_regs.r[6];
	return i;
}

int OSSpr_ReadPixel(void *b,char *n,int x,int y)
{
	osspr_regs.r[0] = 256+41;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) n;
	osspr_regs.r[3] = x;
	osspr_regs.r[4] = y;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
	return osspr_regs.r[5] + osspr_regs.r[6]; /* Add them together; tint is 0 for non-tinted formats */
}

void OSSpr_WritePixel(void *b,char *n,int x,int y,int col,int tint)
{
	osspr_regs.r[0] = 256+42;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) n;
	osspr_regs.r[3] = x;
	osspr_regs.r[4] = y;
	osspr_regs.r[5] = col;
	osspr_regs.r[6] = tint;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
}

int OSSpr_ReadMask(void *b,char *n,int x,int y)
{
	osspr_regs.r[0] = 256+43;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) n;
	osspr_regs.r[3] = x;
	osspr_regs.r[4] = y;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
	return osspr_regs.r[5];
}

void OSSpr_WriteMask(void *b,char *n,int x,int y,int mask)
{
	osspr_regs.r[0] = 256+44;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) n;
	osspr_regs.r[3] = x;
	osspr_regs.r[4] = y;
	osspr_regs.r[5] = mask;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
}

void OSSpr_CloseFile(void *b)
{
	free(b);
}

void OSSpr_GetName(void *b,char *n,int i)
{
	osspr_regs.r[0] = 256+13;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) n;
	osspr_regs.r[3] = 13; /* Assume it is the full length */
	osspr_regs.r[4] = i;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
}

int OSSpr_CountSprites(void *b)
{
	osspr_regs.r[0] = 256+8;
	osspr_regs.r[1] = (int) b;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
	return osspr_regs.r[3];
}

int OSSpr_GetPalette(void *b,char *n)
{
	osspr_regs.r[0] = 256+37;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) n;
	osspr_regs.r[3] = -1;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
	return osspr_regs.r[4];
}

int OSSpr_GetPaletteSize(void *b,char *n)
{
	osspr_regs.r[0] = 256+37;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) n;
	osspr_regs.r[3] = -1;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
	return osspr_regs.r[3];
}

#endif
