typedef struct Rawimage Rawimage;

struct Rawimage
{
       Rectangle       r;
       uchar   *cmap;
       int             cmaplen;
       int             nchans;
       uchar   *chans[4];
       int             chandesc;
       int             chanlen;

       int             fields;         /* defined by format */
       int             gifflags;       /* gif only; graphics control extension flag word */
       int             gifdelay;       /* gif only; graphics control extension delay in cs */
       int             giftrindex;     /* gif only; graphics control extension transparency index */
       int             gifloopcount;   /* number of times to loop in animation; 0 means forever */
};

enum
{
       /* Channel descriptors */
       CRGB    = 0,    /* three channels, no map */
       CYCbCr  = 1,    /* three channels, no map, level-shifted 601 color space */
       CY      = 2,    /* one channel, luminance */
       CRGB1   = 3,    /* one channel, map present */
       CRGBV   = 4,    /* one channel, map is RGBV, understood */
       CRGB24  = 5,    /* one channel in correct data order for loadimage(RGB24) */
       CRGBA32 = 6,    /* one channel in correct data order for loadimage(RGBA32) */
       CYA16   = 7,    /* one channel in correct data order for loadimage(Grey8+Alpha8) */
       CRGBVA16= 8,    /* one channel in correct data order for loadimage(CMAP8+Alpha8) */

       /* GIF flags */
       TRANSP  = 1,
       INPUT   = 2,
       DISPMASK = 7<<2
};


enum{   /* PNG flags */
       II_GAMMA =      1 << 0,
       II_COMMENT =    1 << 1,
};

typedef struct ImageInfo {
       ulong   fields_set;
       double  gamma;
       char    *comment;
} ImageInfo;


Rawimage**      readjpg(int, int);
Rawimage**      Breadjpg(Biobuf *b, int);
Rawimage**      readpng(int, int);
Rawimage**      Breadpng(Biobuf *b, int);
Rawimage**      readgif(int, int);
Rawimage**      readpixmap(int, int);
Rawimage*       torgbv(Rawimage*, int);
Rawimage*       totruecolor(Rawimage*, int);
int             writerawimage(int, Rawimage*);
void*           _remaperror(char*, ...);

typedef struct Memimage Memimage;       /* avoid necessity to include memdraw.h */

char*           startgif(Biobuf*, Image*, int);
char*           writegif(Biobuf*, Image*, char*, int, int);
void            endgif(Biobuf*);
char*           memstartgif(Biobuf*, Memimage*, int);
char*           memwritegif(Biobuf*, Memimage*, char*, int, int);
void            memendgif(Biobuf*);
Image*          onechan(Image*);
Memimage*       memonechan(Memimage*);

char*           writeppm(Biobuf*, Image*, char*);
char*           memwriteppm(Biobuf*, Memimage*, char*);
Image*          multichan(Image*);
Memimage*       memmultichan(Memimage*);

char*           memwritepng(Biobuf*, Memimage*, ImageInfo*);