www.pudn.com > ilib > IlibP.h
/*
* Ilib.h
*
* Image library Private include
*
* Description:
* To be included only be Ilib internal functions
*
* History:
* 01-Apr-00 Jim Winstead jimw@trainedmonkey.com
* Added _IReadBMP()
* 26-Aug-99 Craig Knudsen cknudsen@radix.net
* Added _IReadXPM()
* 23-Aug-99 Craig Knudsen cknudsen@radix.net
* Added text_style to IGCP.
* 22-Jul-99 Craig Knudsen cknudsen@radix.net
* Added JPEG support.
* 19-Jul-99 Craig Knudsen cknudsen@radix.net
* Added PNG support.
* 19-May-98 Craig Knudsen cknudsen@radix.net
* Added _ISetPointRGB macro
* 20-May-96 Craig Knudsen cknudsen@radix.net
* Created
*
****************************************************************************/
#ifndef _ilibp_h
#define _ilibp_h
/*
** Define a magic value to place at the front of each structure.
** If this value is incorrect, then an invalid structure was
** passed in.
*/
#define IMAGIC_IMAGE 467
#define IMAGIC_GC 333
#define IMAGIC_COLOR 847
#define IMAGIC_FONT 104
#ifndef PI
#define PI 3.14159265358979323846
#endif /* PI */
/*
** Default comment for images
*/
#define IDEFAULT_COMMENT "Creator: Ilib http://www.radix.net/~cknudsen/Ilib/"
/*
** Structures
*/
typedef struct {
unsigned int magic; /* memory verification */
unsigned char red; /* red value (0-255) */
unsigned char green; /* green value (0-255) */
unsigned char blue; /* blue value (0-255) */
unsigned long value; /* pixel value */
} IColorP;
typedef struct {
unsigned int magic; /* memory verification */
int width; /* width */
int height; /* height */
char *comments; /* comments */
unsigned char *data; /* image data */
unsigned short interlaced; /* interlaced output? */
unsigned short greyscale; /* greyscale? */
IColorP *transparent; /* transparent color */
} IImageP;
typedef struct {
unsigned int magic; /* memory verification */
char *name;
} IFontP;
typedef struct {
unsigned int magic; /* memory verification */
IColorP *foreground; /* foreground color */
IColorP *background; /* background color */
IFontP *font; /* font */
unsigned short antialiased; /* use anti-aliasing (size is halfed) */
unsigned int line_width; /* line width */
ILineStyle line_style; /* line style */
ITextStyle text_style; /* line style */
/* add more later ... */
} IGCP;
/*
** File formats.
*/
IError _IWritePGM (
#ifndef _NO_PROTO
FILE *fp,
IImageP *image,
IOptions options
#endif
);
IError _IReadPPM (
#ifndef _NO_PROTO
FILE *fp,
IOptions options,
IImageP **image_return
#endif
);
IError _IWritePPM (
#ifndef _NO_PROTO
FILE *fp,
IImageP *image,
IOptions options
#endif
);
IError _IWriteXPM (
#ifndef _NO_PROTO
FILE *fp,
IImageP *image,
IOptions options
#endif
);
IError _IReadXPM (
#ifndef _NO_PROTO
FILE *fp,
IOptions options,
IImageP **image_return
#endif
);
IError _IReadPNG (
#ifndef _NO_PROTO
FILE *fp,
IOptions options,
IImageP **image_return
#endif
);
IError _IWritePNG (
#ifndef _NO_PROTO
FILE *fp,
IImageP *image,
IOptions options
#endif
);
IError _IReadGIF (
#ifndef _NO_PROTO
FILE *fp,
IOptions options,
IImageP **image_return
#endif
);
IError _IWriteGIF (
#ifndef _NO_PROTO
FILE *fp,
IImageP *image,
IOptions options
#endif
);
#ifdef HAVE_JPEGLIB
IError _IReadJPEG (
#ifndef _NO_PROTO
FILE *fp,
IOptions options,
IImageP **image_return
#endif
);
IError _IWriteJPEG (
#ifndef _NO_PROTO
FILE *fp,
IImageP *image,
IOptions options
#endif
);
#endif
IError _IReadBMP (
#ifndef _NO_PROTO
FILE *fp,
IOptions options,
IImageP **image_return
#endif
);
typedef struct {
char *name;
IError (*read_func) (
#ifndef _NO_PROTO
FILE *fp, /* output file pointer */
IOptions options, /* read options */
IImageP **image_return /* returned image */
#endif
);
IError (*write_func) (
#ifndef _NO_PROTO
FILE *fp, /* output file pointer */
IImageP *image, /* image to save */
IOptions options /* write options */
#endif
);
int maxdepth; /* max depth (1=b/w, 8=256 colors) */
int grey; /* is grey? */
} IFormatDef;
#ifdef IIncludeFileFormats
static IFormatDef IFileFormats[] = {
{ /* IFORMAT_GIF */ "GIF", _IReadGIF, _IWriteGIF, 8, 0 },
{ /* IFORMAT_PPM */ "PPM", _IReadPPM, _IWritePPM, 24, 0 },
{ /* IFORMAT_PGM */ "PGM", _IReadPPM, _IWritePGM, 8, 1 },
{ /* IFORMAT_PBM */ "PBM", NULL, NULL, 1, 1 },
{ /* IFORMAT_XPM */ "XPM", _IReadXPM, _IWriteXPM, 24, 0 },
{ /* IFORMAT_XBM */ "XBM", NULL, NULL, 1, 1 },
#ifdef HAVE_PNGLIB
{ /* IFORMAT_PNG */ "PNG", _IReadPNG, _IWritePNG, 24, 0 },
#else
{ /* IFORMAT_PNG */ "PNG", NULL, NULL, 24, 0 },
#endif
#ifdef HAVE_JPEGLIB
{ /* IFORMAT_JPEG */ "JPEG", _IReadJPEG, _IWriteJPEG, 24, 0 },
#else
{ /* IFORMAT_JPEG */ "JPEG", NULL, NULL, 24, 0 },
#endif
{ /* IFORMAT_BMP */ "BMP", _IReadBMP, NULL, 24, 0 },
};
#endif /* IIncludeFileFormats */
IColorP *_IGetColor (
#ifndef _NO_PROTO
int color /* int index to translate */
#endif
);
IError _IFontBDFGetSize (
#ifndef _NO_PROTO
char *name, /* font name */
unsigned int *height_return /* out: height of font */
#endif
);
/*
** Define a function to draw a point. Must be inline because this
** is typically within multiple for loops and we don't want all those
** extra stack pushes and pops slowing us down...
** Arguments are ( ImageP *, IGCP *, int, int ).
*/
#define _IDrawPoint _ISetPoint
#define _ISetPoint(i,g,x,y) \
{ \
unsigned char *ptrX;\
if ( (x) >= 0 && (x) < i->width && (y) >= 0 && (y) < i->height ) {\
if ( i->greyscale ) {\
ptrX = i->data + ( (y) * i->width ) + (x); \
*ptrX = g->foreground->red; \
} else {\
ptrX = i->data + ( (y) * i->width * 3 ) + ( (x) * 3 ); \
*ptrX = g->foreground->red; \
*(ptrX + 1) = g->foreground->green; \
*(ptrX + 2) = g->foreground->blue; \
}\
}\
}
#define _ISetPointRGB(i,x,y,r,g,b) \
{ \
unsigned char *ptrX;\
if ( (x) >= 0 && (x) < i->width && (y) >= 0 && (y) < i->height ) {\
if ( i->greyscale ) {\
ptrX = i->data + ( (y) * i->width ) + (x); \
*ptrX = r; \
} else {\
ptrX = i->data + ( (y) * i->width * 3 ) + ( (x) * 3 ); \
*ptrX = r; \
*(ptrX + 1) = g; \
*(ptrX + 2) = b; \
}\
}\
}
#define _IGetPointColor(i,x,y,c) \
{ \
unsigned char *ptrX;\
if ( (x) >= 0 && (x) < i->width && (y) >= 0 && (y) < i->height ) {\
if ( i->greyscale ) {\
ptrX = i->data + ( (y) * i->width ) + (x); \
c.red = c.green = c.blue = *ptrX; \
} else {\
ptrX = i->data + ( (y) * i->width * 3 ) + ( (x) * 3 ); \
c.red = *ptrX; \
c.green = *(ptrX + 1); \
c.blue = *(ptrX + 2); \
}\
}\
}
#endif /* _ilibp_h */