
typedef unsigned char U8;
typedef signed char S8;
typedef unsigned short U16;
typedef signed short S16;
typedef unsigned int U32;
typedef signed int S32;
typedef float F32;

typedef struct CXFORM {
  S16 addr, addg, addb, adda;
  S16 mulr, mulg, mulb, mula;
} CXFORM;


typedef struct MATRIX {
  S32 scalex, scaley, rotate0, rotate1;
  S32 tx, ty;
} MATRIX;


typedef struct RECT {
  S32 minx, miny, maxx, maxy;
} RECT;


typedef struct GRADIENT {
  U8 n, usealpha;
  U8 ratio[8];
  U32 rgba[8];
} GRADIENT;


typedef struct LINESTYLE {
  U16 width;
  U32 rgba;
} LINESTYLE;

typedef struct LINESTYLEARRAY {
  U32 n;
  LINESTYLE *styles;
} LINESTYLEARRAY;


#define FILLSTYLE_SOLID       0x00
#define FILLSTYLE_LINEAR      0x10
#define FILLSTYLE_RADIAL      0x12
#define FILLSTYLE_TILED       0x40
#define FILLSTYLE_CLIPPED     0x41

typedef struct FILLSTYLE {
  U8 type;
  union {
    U32 solid;
    struct {
      MATRIX matrix;
      GRADIENT gradient;
    } gradient;
    struct {
      MATRIX matrix;
      U16 id;
    } bitmap;
  } fill;
} FILLSTYLE;

typedef struct FILLSTYLEARRAY {
  U32 n;
  FILLSTYLE *styles;
} FILLSTYLEARRAY;

#define SHAPERECORD_NULL                0
#define SHAPERECORD_END                 1
#define SHAPERECORD_STYLE               2
#define SHAPERECORD_STRAIGHT            3
#define SHAPERECORD_CURVE               4
#define SHAPERECORD_STYLE_MOVE          1
#define SHAPERECORD_STYLE_FILL0         2
#define SHAPERECORD_STYLE_FILL1         4
#define SHAPERECORD_STYLE_LINE          8
#define SHAPERECORD_STYLE_STYLES        16

typedef struct SHAPERECORD {
  U8 type, flags;
  U8 fillstyle0, fillstyle1, linestyle;
  S32 x, y, ctrlx, ctrly;
} SHAPERECORD;

typedef struct SHAPE {
  U16 id;

  RECT bbox;
  FILLSTYLEARRAY fillstyles;
  LINESTYLEARRAY linestyles;

  U32 n;
  SHAPERECORD *records;
} SHAPE;

#define ACTION_NULL           0x00
#define ACTION_NEXTFRAME      0x04
#define ACTION_PREVIOUSFRAME  0x05
#define ACTION_PLAY           0x06
#define ACTION_STOP           0x07
#define ACTION_STOPSOUNDS     0x09

#define ACTION_GOTOFRAME      0x81
#define ACTION_GETURL         0x83


typedef struct ACTION {
  U8 action;
  union {
    U16 gotoframe;
    struct {
      char *url;
      char *target;
    } geturl;
  } data;
} ACTION;


#define BITMAP_RAW            0
#define BITMAP_JPEG           1
#define BITMAP_LOSSLESS       2
#define BITMAP_HAS_ALPHA      128
#define BITMAP_JPEGALPHA      (BITMAP_JPEG+BITMAP_HAS_ALPHA)
#define BITMAP_LOSSLESSALPHA  (BITMAP_LOSSLESS+BITMAP_HAS_ALPHA)


typedef struct BITMAP {
  U16 id, width, height;
  U32 sizeinmemory;
  char *file;
  U32 alphasizeinmemory;
  char *alphafile;
  U8 type, bits, alphatype;
} BITMAP;


#define PLACEOBJECT_MOVE      0x01
#define PLACEOBJECT_CHARACTER 0x02
#define PLACEOBJECT_MATRIX    0x04
#define PLACEOBJECT_CXFORM    0x08
#define PLACEOBJECT_CLIP      0x40

typedef struct PLACEOBJECT {
  U16 depth, id, clip, frameno;
  U8 usealpha, flags;
  MATRIX matrix;
  CXFORM cxform;
} PLACEOBJECT;

#define BUTTONSTATE_UP        (1<<0)
#define BUTTONSTATE_OVER      (1<<1)
#define BUTTONSTATE_DOWN      (1<<2)
#define BUTTONSTATE_SHAPE     (1<<3)

#define BUTTONTRANSITION_LEAVE      0
#define BUTTONTRANSITION_ENTER      1
#define BUTTONTRANSITION_DOWN       2
#define BUTTONTRANSITION_UP         3

typedef struct BUTTONSTATE {
  U8 state;
  U16 id, depth;
  MATRIX matrix;
  CXFORM cxform;
} BUTTONSTATE;

typedef struct BUTTON {
  U16 id;
  U32 count, actioncount;
  BUTTONSTATE *states;
  ACTION *actions;
} BUTTON;

typedef struct BUTTONSOUND {
  U16 buttonid;
  U16 soundids[4], loops[4];
} BUTTONSOUND;

#define SOUNDFORMAT_LIN8      0
#define SOUNDFORMAT_LIN16     1
#define SOUNDFORMAT_ADPCM2    2
#define SOUNDFORMAT_ADPCM3    3
#define SOUNDFORMAT_ADPCM4    4
#define SOUNDFORMAT_ADPCM5    5
#define SOUND_INPUT           8

typedef struct SOUND {
  char *file;
  U32 sizeinmemory;
  S32 format, freq, stereo;
  U16 id;
} SOUND;

typedef struct PLAYSOUND {
  U16 id;
  U16 loops;
} PLAYSOUND;

#define GLYPHSHAPE_MOVE       0
#define GLYPHSHAPE_LINE       1
#define GLYPHSHAPE_CURVE      2

typedef struct GLYPHSHAPE {
  U8 type;
  S32 x, y, ctrlx, ctrly;
} GLYPHSHAPE;

typedef struct GLYPH {
  U8 letter;
  U32 shapecount;
  GLYPHSHAPE *shapes;
  RECT bbox;
} GLYPH;

typedef struct FONT {
  U16 id;
  S16 spacing;
  U32 glyphcount;
  char fontname[256];
  GLYPH *glyphs;
  U32 usedglyphs[8];
} FONT;

#define TEXTREC_STRING      0
#define TEXTREC_FONT        1
#define TEXTREC_SIZE        2
#define TEXTREC_COLOUR      4
#define TEXTREC_MOVE        8

typedef struct TEXTREC {
  U8 flags;
  union {
    struct {
      U8 *text;
      U8 length;
    } text;
    struct {
      U16 font, size;
      U32 colour;
      S32 x, y;
    } style;
  } data;
} TEXTREC;

typedef struct TEXT {
  U16 id;

  MATRIX matrix;

  U32 recordcount;
  TEXTREC *records;
} TEXT;


typedef struct FRAME {
  U32 placecount, removecount, actioncount, soundcount;
  PLACEOBJECT *place;
  PLAYSOUND *sounds;
  U16 *removedepths;
  U32 bgcolour;
  ACTION *actions;
} FRAME;
