/* sprite.h
 * Copyright (C) Acorn Computers Ltd., 1989
 * Copyright (C) Codemist Ltd., 1989
 */
#ifndef __sprite_h
#define __sprite_h
#ifndef __os_h
#include "os.h"
#endif
typedef enum
{
 sprite_nopalette = 0,
 sprite_haspalette = 1
}sprite_palflag;
typedef struct
{
 int xmag,ymag,xdiv,ydiv;
}sprite_factors;
typedef char sprite_pixtrans; 
os_error * sprite_screensave(const char *filename, sprite_palflag);
 
os_error * sprite_screenload(const char *filename);
typedef struct 
{
 int size;
 int number;
 int sproff;
 int freeoff;
}sprite_area;
typedef struct 
{
 int next; 
 char name[12]; 
 int width; 
 int height; 
 int lbit; 
 int rbit; 
 int image; 
 int mask; 
 int mode; 
 
 
}sprite_header;


#define SPRITE_BBC      0
#define SPRITE_BGR1     1
#define SPRITE_BGR2     2
#define SPRITE_BGR4     3
#define SPRITE_BGR8     4
#define SPRITE_XBGR1555 5
#define SPRITE_XBGR8888 6
#define SPRITE_CMYK8888 7
#define SPRITE_BGR888   8
#define SPRITE_BGR565   10
#define SPRITE_NEW5
#define SPRITE_XBGR4444 16




typedef struct /* Format of a sprite header */
{
  int  next;      /*  Offset to next sprite                */
  char name[12];  /*  Sprite name                          */
  int  width;     /*  Width in words-1      (0..639)       */
  int  height;    /*  Height in scanlines-1 (0..255/511)   */
  int  lbit;      /*  First bit used (left end of row)     */
  int  rbit;      /*  Last bit used (right end of row)     */
  int  image;     /*  Offset to sprite image               */
  int  mask;      /*  Offset to transparency mask          */

  union
  {
   int bbcmode;

   struct
   {
    unsigned int mode:31;      /*  Mode sprite was defined in           */
    unsigned int alpha:1;
   } mode;

   struct
   {
    unsigned int new:1;
    unsigned int xdpi:13;
    unsigned int ydpi:13;
    unsigned int type:4;
    unsigned int alpha:1;
   } type;
   
    struct
   {
    unsigned int new:1;         /* should be always %1 */
    unsigned int reserved1:3;   /* should be always 0 */
    unsigned int xeigen:2;
    unsigned int yeigen:2;
    unsigned int flags:8;
    unsigned int reserved2:4;   /* should be always 0 */
    unsigned int type:7;
    unsigned int reserved3:4;   /* should always be %1111 */
    unsigned int alpha:1;
   } type5;

  } selector;
} newsprite_header;






#define sprite_mainarea ((sprite_area *) 0)
typedef void * sprite_ptr;
void sprite_area_initialise(sprite_area *, int size);
os_error * sprite_area_readinfo(sprite_area *, sprite_area *resultarea);
os_error * sprite_area_reinit(sprite_area *);
os_error * sprite_area_load(sprite_area *, const char *filename);
 
os_error * sprite_area_merge(sprite_area *, const char *filename);
 
os_error * sprite_area_save(sprite_area *, const char *filename);
os_error * sprite_getname(sprite_area *, void *buffer, int *length, int index);
os_error * sprite_get(sprite_area *, char *name, sprite_palflag);
os_error * sprite_get_rp(sprite_area *, char *name, sprite_palflag,
 sprite_ptr *resultaddress);
os_error * sprite_get_given(sprite_area *, char *name, sprite_palflag,
 int x0, int y0, int x1, int y1);
os_error * sprite_get_given_rp(sprite_area *, char *name, sprite_palflag,
 int x0, int y0, int x1, int y1,
 sprite_ptr *resultaddress);
os_error * sprite_create(sprite_area *, char *name, sprite_palflag,
 int width, int height, int mode);
os_error * sprite_create_rp(sprite_area *, char *name, sprite_palflag,
 int width, int height, int mode,
 sprite_ptr *resultaddress);
typedef enum
{
 sprite_id_name = 0,
 sprite_id_addr = 0x74527053 
}sprite_type;
typedef struct
{
 union
 {
 char * name; 
 sprite_ptr addr;
 } s;
 sprite_type tag; 
}sprite_id;
os_error * sprite_select(sprite_area *, sprite_id *);
 
os_error * sprite_select_rp(sprite_area *, sprite_id *,
 sprite_ptr *resultaddress);
os_error * sprite_delete(sprite_area *, sprite_id *);
os_error * sprite_rename(sprite_area *, sprite_id *, char *newname);
os_error * sprite_copy(sprite_area *, sprite_id *, char *copyname);
os_error * sprite_put(sprite_area *, sprite_id *, int gcol);
os_error * sprite_put_given(sprite_area *, sprite_id *, int gcol,
 int x, int y);
os_error * sprite_put_scaled(sprite_area *, sprite_id *, int gcol,
 int x, int y,
 sprite_factors *factors,
 sprite_pixtrans pixtrans[]);
os_error * sprite_put_greyscaled(sprite_area *, sprite_id *,
 int x, int y,
 sprite_factors *factors,
 sprite_pixtrans pixtrans[]);
os_error * sprite_put_mask(sprite_area *, sprite_id *);
os_error * sprite_put_mask_given(sprite_area *, sprite_id *, int x, int y);
os_error * sprite_put_mask_scaled(sprite_area *, sprite_id *,
 int x, int y,
 sprite_factors *factors);
os_error * sprite_put_char_scaled(char ch,
 int x, int y,
 sprite_factors *factors);
os_error * sprite_create_mask(sprite_area *, sprite_id *);
os_error * sprite_remove_mask(sprite_area *, sprite_id *);
os_error * sprite_insert_row(sprite_area *, sprite_id *, int row);
os_error * sprite_delete_row(sprite_area *, sprite_id *, int row);
os_error * sprite_insert_column(sprite_area *, sprite_id *, int column);
os_error * sprite_delete_column(sprite_area *, sprite_id *, int column);
os_error * sprite_flip_x(sprite_area *, sprite_id *);
os_error * sprite_flip_y(sprite_area *, sprite_id *);
typedef struct
{
 int width;
 int height;
 int mask;
 int mode;
}sprite_info;
os_error * sprite_readsize(sprite_area *, sprite_id *,
 sprite_info *resultinfo);
typedef struct
{
 int colour;
 int tint;
}sprite_colour;
os_error * sprite_readpixel(sprite_area *, sprite_id *,
 int x, int y, sprite_colour *resultcolour);
os_error * sprite_writepixel(sprite_area *, sprite_id *,
 int x, int y, sprite_colour *colour);
typedef enum
{
 sprite_masktransparent = 0,
 sprite_masksolid = 1
}sprite_maskstate;
os_error * sprite_readmask(sprite_area *, sprite_id *,
 int x, int y, sprite_maskstate *resultmaskstate);
os_error * sprite_writemask(sprite_area *, sprite_id *,
 int x, int y, sprite_maskstate *maskstate);
typedef struct
 { int r[4];
 } sprite_state;
os_error *sprite_restorestate(sprite_state state);
os_error *sprite_outputtosprite(sprite_area *area, sprite_id *id,
 int *save_area, sprite_state *state);
os_error *sprite_outputtomask(sprite_area *area, sprite_id *id,
 int *save_area, sprite_state *state);
os_error *sprite_outputtoscreen(int *save_area, sprite_state *state);
os_error *sprite_sizeof_spritecontext(sprite_area *area, sprite_id *id,
 int *size);
os_error *sprite_sizeof_screencontext(int *size);
os_error *sprite_removewastage(sprite_area *area, sprite_id *id);


typedef struct 
{
 int a;
 int b;
 int c;
 int d;
 int e;
 int f;
} sprite_transform;


os_error * sprite_put_trans(sprite_area *area, sprite_id *spr,int gcol_action,
                         sprite_transform * trans,sprite_pixtrans *pixtrans);


 
#endif
