/*=============================================================================
                                 ilbm.h
===============================================================================
  Facilities for processign IFF ILBM files
=============================================================================*/
#ifndef ILBM_H_INCLUDED
#define ILBM_H_INCLUDED

static __inline__ unsigned int
ilbm_rowByteCt(unsigned int const cols) {

    return (cols / 16 + (cols % 16 == 0 ? 0 : 1)) * 2;
}



/* definitions for BMHD */

typedef struct {
    unsigned short w, h;
    short x, y;
    unsigned char nPlanes, masking, compression, flags;
    unsigned short transparentColor;
    unsigned char xAspect, yAspect;
    short pageWidth, pageHeight;
} BitMapHeader;
#define BitMapHeaderSize    20

#define BMHD_FLAGS_CMAPOK       (1<<7)      /* valid 8bit colormap */

#define mskNone                 0
#define mskHasMask              1
#define mskHasTransparentColor  2
#define mskLasso                3       /* can't handle this */
#define mskMAXKNOWN             mskLasso
static const char * mskNAME[] = {
    "none", "mask plane", "transparent color", "lasso"
};

#define cmpNone                 0
#define cmpByteRun1             1
#define cmpMAXKNOWN             cmpByteRun1
static const char * cmpNAME[] = { "none", "byterun1" };


/* definitions for CMAP */

#if 0   /* not used */
typedef struct {
    unsigned char r, g, b;
} ColorRegister;
#endif


/* definitions for CAMG */

#define CAMGChunkSize       4

#define vmLACE              0x0004
#define vmEXTRA_HALFBRITE   0x0080
#define vmHAM               0x0800
#define vmHIRES             0x8000

#define HAMCODE_CMAP      0     /* look up color in colormap */
#define HAMCODE_BLUE      1     /* new blue component */
#define HAMCODE_RED       2     /* new red component */
#define HAMCODE_GREEN     3     /* new green component */


/* multipalette PCHG chunk definitions */

/* get number of longwords in line mask from PCHG.LineCount */
#define MaskLongWords(x)    (((x) + 31) / 32)

typedef struct {
    unsigned short  Compression;
    unsigned short  Flags;
    short           StartLine;      /* may be negative */
    unsigned short  LineCount;
    unsigned short  ChangedLines;
    unsigned short  MinReg;
    unsigned short  MaxReg;
    unsigned short  MaxChanges;
    unsigned long   TotalChanges;
} PCHGHeader;
#define PCHGHeaderSize      20

/* Compression modes */
#define PCHG_COMP_NONE      0
#define PCHG_COMP_HUFFMAN   1

/* Flags */
#define PCHGF_12BIT         (1 << 0)    /* use SmallLineChanges */
#define PCHGF_32BIT         (1 << 1)    /* use BigLineChanges */
#define PCHGF_USE_ALPHA     (1 << 2)    /* meaningful only if PCHG_32BIT is on:
                                           use the Alpha channel info */
typedef struct {
    unsigned long   CompInfoSize;
    unsigned long   OriginalDataSize;
} PCHGCompHeader;
#define PCHGCompHeaderSize  8

#if 0   /* not used */
typedef struct {
    unsigned char   ChangeCount16;
    unsigned char   ChangeCount32;
    unsigned short  *PaletteChange;
} SmallLineChanges;

typedef struct {
    unsigned short  Register;
    unsigned char   Alpha, Red, Blue, Green;    /* ARBG, not ARGB */
} BigPaletteChange;

typedef struct {
    unsigned short      ChangeCount;
    BigPaletteChange    *PaletteChange;
} BigLineChanges;
#endif /* 0 */


/* definitions for CLUT */

#if 0 /* not used */
typedef struct {
    unsigned long type;
    unsigned long reserved0;
    unsigned char lut[256];
} ColorLUT;
#endif /* 0 */
#define CLUTSize    (256+4+4)

/* types */
#define CLUT_MONO   0
#define CLUT_RED    1
#define CLUT_GREEN  2
#define CLUT_BLUE   3
#define CLUT_HUE    4   /* can't handle this */
#define CLUT_SAT    5   /* can't handle this */


/* unofficial DCOL chunk for direct-color */

typedef struct {
    unsigned char r, g, b, pad1;
} DirectColor;
#define DirectColorSize     4



/* IFF chunk IDs */

typedef unsigned long   IFF_ID;

#define MAKE_ID(a, b, c, d) \
    ((IFF_ID)(a)<<24 | (IFF_ID)(b)<<16 | (IFF_ID)(c)<<8 | (IFF_ID)(d))

#define ID_FORM     MAKE_ID('F', 'O', 'R', 'M')
    /* EA IFF 85 group identifier */
#define ID_CAT      MAKE_ID('C', 'A', 'T', ' ')
    /* EA IFF 85 group identifier */
#define ID_LIST     MAKE_ID('L', 'I', 'S', 'T')
    /* EA IFF 85 group identifier */
#define ID_PROP     MAKE_ID('P', 'R', 'O', 'P')
    /* EA IFF 85 group identifier */
#define ID_END      MAKE_ID('E', 'N', 'D', ' ')
    /* unofficial END-of-FORM identifier (see Amiga RKM Devices Ed.3
       page 376) */
#define ID_ILBM     MAKE_ID('I', 'L', 'B', 'M')
    /* EA IFF 85 raster bitmap form */
#define ID_DEEP     MAKE_ID('D', 'E', 'E', 'P')
    /* Chunky pixel image files (Used in TV Paint) */
#define ID_RGB8     MAKE_ID('R', 'G', 'B', '8')
    /* RGB image forms, Turbo Silver (Impulse) */
#define ID_RGBN     MAKE_ID('R', 'G', 'B', 'N')
    /* RGB image forms, Turbo Silver (Impulse) */
#define ID_PBM      MAKE_ID('P', 'B', 'M', ' ')
    /* 256-color chunky format (DPaint 2 ?) */
#define ID_ACBM     MAKE_ID('A', 'C', 'B', 'M')
    /* Amiga Contiguous Bitmap (AmigaBasic) */

/* generic */

#define ID_FVER     MAKE_ID('F', 'V', 'E', 'R')
    /* AmigaOS version string */
#define ID_JUNK     MAKE_ID('J', 'U', 'N', 'K')
    /* always ignore this chunk */
#define ID_ANNO     MAKE_ID('A', 'N', 'N', 'O')
    /* EA IFF 85 Generic Annotation chunk */
#define ID_AUTH     MAKE_ID('A', 'U', 'T', 'H')
    /* EA IFF 85 Generic Author chunk */
#define ID_CHRS     MAKE_ID('C', 'H', 'R', 'S')
    /* EA IFF 85 Generic character string chunk */
#define ID_NAME     MAKE_ID('N', 'A', 'M', 'E')
    /* EA IFF 85 Generic Name of art, music, etc. chunk */
#define ID_TEXT     MAKE_ID('T', 'E', 'X', 'T')
    /* EA IFF 85 Generic unformatted ASCII text chunk */
#define ID_copy     MAKE_ID('(', 'c', ')', ' ')
/* EA IFF 85 Generic Copyright text chunk */

/* ILBM chunks */

#define ID_BMHD     MAKE_ID('B', 'M', 'H', 'D')
    /* ILBM BitmapHeader */
#define ID_CMAP     MAKE_ID('C', 'M', 'A', 'P')
    /* ILBM 8bit RGB colormap */
#define ID_GRAB     MAKE_ID('G', 'R', 'A', 'B')
    /* ILBM "hotspot" coordinates */
#define ID_DEST     MAKE_ID('D', 'E', 'S', 'T')
    /* ILBM destination image info */
#define ID_SPRT     MAKE_ID('S', 'P', 'R', 'T')
    /* ILBM sprite identifier */
#define ID_CAMG     MAKE_ID('C', 'A', 'M', 'G')
    /* Amiga viewportmodes */
#define ID_BODY     MAKE_ID('B', 'O', 'D', 'Y')
    /* ILBM image data */
#define ID_CRNG     MAKE_ID('C', 'R', 'N', 'G')
    /* color cycling */
#define ID_CCRT     MAKE_ID('C', 'C', 'R', 'T')
    /* color cycling */
#define ID_CLUT     MAKE_ID('C', 'L', 'U', 'T')
    /* Color Lookup Table chunk */
#define ID_DPI      MAKE_ID('D', 'P', 'I', ' ')
    /* Dots per inch chunk */
#define ID_DPPV     MAKE_ID('D', 'P', 'P', 'V')
    /* DPaint perspective chunk (EA) */
#define ID_DRNG     MAKE_ID('D', 'R', 'N', 'G')
    /* DPaint IV enhanced color cycle chunk (EA) */
#define ID_EPSF     MAKE_ID('E', 'P', 'S', 'F')
    /* Encapsulated Postscript chunk */
#define ID_CMYK     MAKE_ID('C', 'M', 'Y', 'K')
    /* Cyan, Magenta, Yellow, & Black color map (Soft-Logik) */
#define ID_CNAM     MAKE_ID('C', 'N', 'A', 'M')
    /* Color naming chunk (Soft-Logik) */
#define ID_PCHG     MAKE_ID('P', 'C', 'H', 'G')
    /* Line by line palette control information (Sebastiano Vigna) */
#define ID_PRVW     MAKE_ID('P', 'R', 'V', 'W')
    /* A mini duplicate ILBM used for preview (Gary Bonham) */
#define ID_XBMI     MAKE_ID('X', 'B', 'M', 'I')
    /* eXtended BitMap Information (Soft-Logik) */
#define ID_CTBL     MAKE_ID('C', 'T', 'B', 'L')
    /* Newtek Dynamic Ham color chunk */
#define ID_DYCP     MAKE_ID('D', 'Y', 'C', 'P')
    /* Newtek Dynamic Ham chunk */
#define ID_SHAM     MAKE_ID('S', 'H', 'A', 'M')
    /* Sliced HAM color chunk */
#define ID_ABIT     MAKE_ID('A', 'B', 'I', 'T')
    /* ACBM body chunk */
#define ID_DCOL     MAKE_ID('D', 'C', 'O', 'L')
    /* unofficial direct color */
#define ID_DPPS     MAKE_ID('D', 'P', 'P', 'S')
    /* ? */
#define ID_TINY     MAKE_ID('T', 'I', 'N', 'Y')
    /* ? */

/* other stuff */

#define MAXPLANES       16
typedef unsigned short  rawtype;

#define MAXCMAPCOLORS   (1 << MAXPLANES)
#define MAXCOLVAL       255     /* max value of color component */

#endif
