/* OS_SpriteOp utilities V1.02 18/12/07
   See osspr.h for docs
   Copyright 2008 Jeffrey Lee
   This file is part of WOUM.
   WOUM is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
   WOUM is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   You should have received a copy of the GNU General Public License
   along with WOUM.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef _OSSPR_C
#define _OSSPR_C

#include <stdlib.h>

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

#include "osspr.h"

static _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);
	if (osspr_regs.r[0] != 1)
		return 0; /* Not found */
	length = osspr_regs.r[4]+1027; /* Add extra space */
	length = length - (length & 3); /* Finish rounding to word */
	m = (int *) malloc(length);
	if (m == 0)
		return 0;
	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);
	if (m == 0)
		return 0;
	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);
}

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

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;
}

osspr_info OSSpr_GetInfo2(void *b,void *s)
{
	osspr_info i;
	osspr_regs.r[0] = 512+40;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) s;
	_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 */
}

int OSSpr_ReadPixel2(void *b,void *s,int x,int y)
{
	osspr_regs.r[0] = 512+41;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) s;
	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);
}

void OSSpr_WritePixel2(void *b,void *s,int x,int y,int col,int tint)
{
	osspr_regs.r[0] = 512+42;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) s;
	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];
}

int OSSpr_ReadMask2(void *b,void *s,int x,int y)
{
	osspr_regs.r[0] = 512+43;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) s;
	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_WriteMask2(void *b,void *s,int x,int y,int mask)
{
	osspr_regs.r[0] = 512+44;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) s;
	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);
}

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

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_GetPalette2(void *b,void *s)
{
	osspr_regs.r[0] = 512+37;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) s;
	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];
}

int OSSpr_GetPaletteSize2(void *b,void *s)
{
	osspr_regs.r[0] = 512+37;
	osspr_regs.r[1] = (int) b;
	osspr_regs.r[2] = (int) s;
	osspr_regs.r[3] = -1;
	_kernel_swi(OS_SpriteOp,&osspr_regs,&osspr_regs);
	return osspr_regs.r[3];
}

#endif
