www.pudn.com > ilib > IImage.c
/* * IImage.c * * Image library * * Description: * Portable routines to manipulate raster images. * * History: * 20-Aug-99 Craig Knudsen cknudsen@radix.net * Added IGetTransparent() * 20-May-96 Craig Knudsen cknudsen@radix.net * Created * ****************************************************************************/ #include#include #include #include #include "Ilib.h" #define IIncludeFileFormats /* add some static defines */ #include "IlibP.h" IImage ICreateImage ( width, height, options ) unsigned width, height, options; { IImageP *image; image = (IImageP *) malloc ( sizeof ( IImageP ) ); memset ( image, '\0', sizeof ( IImageP ) ); image->width = width; image->height = height; if ( options & IOPTION_GREYSCALE ) { image->data = (unsigned char *) malloc ( width * height ); memset ( image->data, 255, width * height ); image->greyscale = 1; } else { image->data = (unsigned char *) malloc ( width * height * 3 ); memset ( image->data, 255, width * height * 3 ); } image->magic = IMAGIC_IMAGE; return ( (IImage)image ); } IError IDuplicateImage ( image, image_return ) IImage image; IImage *image_return; { IImageP *i = (IImageP *) image; IImageP *ret; if ( i ) { if ( i->magic != IMAGIC_IMAGE ) return ( IInvalidImage ); } else return ( IInvalidImage ); if ( i->greyscale ) *image_return = ICreateImage ( i->width, i->height, IOPTION_GREYSCALE ); else *image_return = ICreateImage ( i->width, i->height, IOPTION_NONE ); ret = (IImageP *)*image_return; if ( i->greyscale ) memcpy ( ret->data, i->data, i->width * i->height ); else memcpy ( ret->data, i->data, i->width * i->height * 3 ); ret->transparent = i->transparent; ret->interlaced = i->interlaced; ret->greyscale = i->greyscale; return ( INoError ); } unsigned int IImageHeight ( image ) IImage image; { IImageP *i = (IImageP *) image; if ( i ) { if ( i->magic != IMAGIC_IMAGE ) return ( 0 ); } else return ( 0 ); return ( i->height ); } unsigned int IImageWidth ( image ) IImage image; { IImageP *i = (IImageP *) image; if ( i ) { if ( i->magic != IMAGIC_IMAGE ) return ( 0 ); } else return ( 0 ); return ( i->width ); } IError _IFreeImage ( image ) IImage image; { IImageP *i = (IImageP *) image; if ( i ) { if ( i->magic != IMAGIC_IMAGE ) return ( IInvalidImage ); i->magic = 0; free ( i->data ); if ( i->comments ) free ( i->comments ); i->comments = NULL; free ( i ); } return ( INoError ); } IError IWriteImageFile ( fp, image, format, options ) FILE *fp; IImage image; IFileFormat format; IOptions options; { IError ret; IImageP *imagep = (IImageP *)image; if ( imagep ) { if ( imagep->magic != IMAGIC_IMAGE ) return ( IInvalidImage ); } else return ( IInvalidImage ); if ( format < 0 || format >= INUM_FORMATS ) { fprintf ( stderr, "IWriteImageFile: invalid format %d\n", format ); } else { if ( IFileFormats[format].write_func ) ret = IFileFormats[format].write_func ( fp, imagep, options ); else fprintf ( stderr, "IWriteImageFile: %s format write not implemented.\n", IFileFormats[format].name ); } return ( ret ); } IError IReadImageFile ( fp, format, options, image_return ) FILE *fp; IFileFormat format; IOptions options; IImage *image_return; { IError ret; if ( format < 0 || format >= INUM_FORMATS ) { fprintf ( stderr, "IReadImageFile: invalid format %d\n", format ); return ( IInvalidFormat ); } else { if ( IFileFormats[format].read_func ) ret = IFileFormats[format].read_func ( fp, options, (IImageP **)image_return ); else { fprintf ( stderr, "IReadImageFile: %s format write not implemented.\n", IFileFormats[format].name ); return ( IFunctionNotImplemented ); } } return ( ret ); } IError ISetComment ( image, comments ) IImage image; char *comments; { IImageP *imagep = (IImageP *)image; if ( imagep ) { if ( imagep->magic != IMAGIC_IMAGE ) return ( IInvalidImage ); } else return ( IInvalidImage ); if ( imagep->comments != NULL ) free ( imagep->comments ); if ( comments == NULL ) imagep->comments = NULL; else { imagep->comments = (char *) malloc ( strlen ( comments ) + 1 ); strcpy ( imagep->comments, comments ); } return INoError; } IError IGetComment ( image, comments ) IImage image; char **comments; { IImageP *imagep = (IImageP *)image; if ( imagep ) { if ( imagep->magic != IMAGIC_IMAGE ) return ( IInvalidImage ); } else return ( IInvalidImage ); *comments = imagep->comments; return INoError; } IError ISetTransparent ( image, color ) IImage image; IColor color; { IImageP *imagep = (IImageP *)image; IColorP *colorp; if ( imagep ) { if ( imagep->magic != IMAGIC_IMAGE ) return ( IInvalidImage ); } else return ( IInvalidImage ); colorp = _IGetColor ( color ); if ( colorp ) { if ( colorp->magic != IMAGIC_COLOR ) return ( IInvalidColor ); } else return ( IInvalidColor ); imagep->transparent = colorp; return ( INoError ); } IError IGetTransparent ( image, color ) IImage image; IColor *color; { IImageP *imagep = (IImageP *)image; if ( imagep ) { if ( imagep->magic != IMAGIC_IMAGE ) return ( IInvalidImage ); } else return ( IInvalidImage ); if ( imagep->transparent && imagep->transparent->magic == IMAGIC_COLOR ) { *color = imagep->transparent->value; return ( INoError ); } else { return ( INoTransparentColor ); } }