IImage.c
资源名称:ilib [点击查看]
上传用户:changbiao
上传日期:2007-01-13
资源大小:141k
文件大小:6k
源码类别:

图片显示

开发平台:

C/C++

  1. /*
  2.  * IImage.c
  3.  *
  4.  * Image library
  5.  *
  6.  * Description:
  7.  * Portable routines to manipulate raster images.
  8.  *
  9.  * History:
  10.  * 20-Aug-99 Craig Knudsen cknudsen@radix.net
  11.  * Added IGetTransparent()
  12.  * 20-May-96 Craig Knudsen cknudsen@radix.net
  13.  * Created
  14.  *
  15.  ****************************************************************************/
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <ctype.h>
  19. #include <memory.h>
  20. #include "Ilib.h"
  21. #define IIncludeFileFormats /* add some static defines */
  22. #include "IlibP.h"
  23. IImage ICreateImage ( width, height, options )
  24. unsigned width, height, options;
  25. {
  26.   IImageP *image;
  27.   image = (IImageP *) malloc ( sizeof ( IImageP ) );
  28.   memset ( image, '', sizeof ( IImageP ) );
  29.   image->width = width;
  30.   image->height = height;
  31.   if ( options & IOPTION_GREYSCALE ) {
  32.     image->data = (unsigned char *) malloc ( width * height );
  33.     memset ( image->data, 255, width * height );
  34.     image->greyscale = 1;
  35.   }
  36.   else {
  37.     image->data = (unsigned char *) malloc ( width * height * 3 );
  38.     memset ( image->data, 255, width * height * 3 );
  39.   }
  40.   image->magic = IMAGIC_IMAGE;
  41.   return ( (IImage)image );
  42. }
  43. IError IDuplicateImage ( image, image_return )
  44. IImage image;
  45. IImage *image_return;
  46. {
  47.   IImageP *i = (IImageP *) image;
  48.   IImageP *ret;
  49.   if ( i ) {
  50.     if ( i->magic != IMAGIC_IMAGE )
  51.       return ( IInvalidImage );
  52.   }
  53.   else
  54.     return ( IInvalidImage );
  55.   if ( i->greyscale )
  56.     *image_return = ICreateImage ( i->width, i->height, IOPTION_GREYSCALE );
  57.   else
  58.     *image_return = ICreateImage ( i->width, i->height, IOPTION_NONE );
  59.   ret = (IImageP *)*image_return;
  60.   if ( i->greyscale )
  61.     memcpy ( ret->data, i->data, i->width * i->height );
  62.   else
  63.     memcpy ( ret->data, i->data, i->width * i->height * 3 );
  64.   ret->transparent = i->transparent;
  65.   ret->interlaced = i->interlaced;
  66.   ret->greyscale = i->greyscale;
  67.   return ( INoError );
  68. }
  69. unsigned int IImageHeight ( image )
  70. IImage image;
  71. {
  72.   IImageP *i = (IImageP *) image;
  73.   if ( i ) {
  74.     if ( i->magic != IMAGIC_IMAGE )
  75.       return ( 0 );
  76.   }
  77.   else
  78.     return ( 0 );
  79.   return ( i->height );
  80. }
  81. unsigned int IImageWidth ( image )
  82. IImage image;
  83. {
  84.   IImageP *i = (IImageP *) image;
  85.   if ( i ) {
  86.     if ( i->magic != IMAGIC_IMAGE )
  87.       return ( 0 );
  88.   }
  89.   else
  90.     return ( 0 );
  91.   return ( i->width );
  92. }
  93. IError _IFreeImage ( image )
  94. IImage image;
  95. {
  96.   IImageP *i = (IImageP *) image;
  97.   if ( i ) {
  98.     if ( i->magic != IMAGIC_IMAGE )
  99.       return ( IInvalidImage );
  100.     i->magic = 0;
  101.     free ( i->data );
  102.     if ( i->comments )
  103.       free ( i->comments );
  104.     i->comments = NULL;
  105.     free ( i );
  106.   }
  107.   return ( INoError );
  108. }
  109. IError IWriteImageFile ( fp, image, format, options )
  110. FILE *fp;
  111. IImage image;
  112. IFileFormat format;
  113. IOptions options;
  114. {
  115.   IError ret;
  116.   IImageP *imagep = (IImageP *)image;
  117.   if ( imagep ) {
  118.     if ( imagep->magic != IMAGIC_IMAGE )
  119.       return ( IInvalidImage );
  120.   }
  121.   else
  122.     return ( IInvalidImage );
  123.   if ( format < 0 || format >= INUM_FORMATS ) {
  124.     fprintf ( stderr, "IWriteImageFile: invalid format %dn", format );
  125.   }
  126.   else {
  127.     if ( IFileFormats[format].write_func )
  128.       ret = IFileFormats[format].write_func ( fp, imagep, options );
  129.     else
  130.       fprintf ( stderr, "IWriteImageFile: %s format write not implemented.n",
  131.         IFileFormats[format].name );
  132.   }
  133.   return ( ret );
  134. }
  135. IError IReadImageFile ( fp, format, options, image_return )
  136. FILE *fp;
  137. IFileFormat format;
  138. IOptions options;
  139. IImage *image_return;
  140. {
  141.   IError ret;
  142.   if ( format < 0 || format >= INUM_FORMATS ) {
  143.     fprintf ( stderr, "IReadImageFile: invalid format %dn", format );
  144.     return ( IInvalidFormat );
  145.   }
  146.   else {
  147.     if ( IFileFormats[format].read_func )
  148.       ret = IFileFormats[format].read_func ( fp, options, (IImageP **)image_return );
  149.     else {
  150.       fprintf ( stderr, "IReadImageFile: %s format write not implemented.n",
  151.         IFileFormats[format].name );
  152.       return ( IFunctionNotImplemented );
  153.     }
  154.   }
  155.   return ( ret );
  156. }
  157. IError ISetComment ( image, comments )
  158. IImage image;
  159. char *comments;
  160. {
  161.   IImageP *imagep = (IImageP *)image;
  162.   if ( imagep ) {
  163.     if ( imagep->magic != IMAGIC_IMAGE )
  164.       return ( IInvalidImage );
  165.   }
  166.   else
  167.     return ( IInvalidImage );
  168.   if ( imagep->comments != NULL )
  169.     free ( imagep->comments );
  170.   if ( comments == NULL )
  171.     imagep->comments = NULL;
  172.   else {
  173.     imagep->comments = (char *) malloc ( strlen ( comments ) + 1 );
  174.     strcpy ( imagep->comments, comments );
  175.   }
  176.   return INoError;
  177. }
  178. IError IGetComment ( image, comments )
  179. IImage image;
  180. char **comments;
  181. {
  182.   IImageP *imagep = (IImageP *)image;
  183.   if ( imagep ) {
  184.     if ( imagep->magic != IMAGIC_IMAGE )
  185.       return ( IInvalidImage );
  186.   }
  187.   else
  188.     return ( IInvalidImage );
  189.   *comments = imagep->comments;
  190.   return INoError;
  191. }
  192. IError ISetTransparent ( image, color )
  193. IImage image;
  194. IColor color;
  195. {
  196.   IImageP *imagep = (IImageP *)image;
  197.   IColorP *colorp;
  198.   if ( imagep ) {
  199.     if ( imagep->magic != IMAGIC_IMAGE )
  200.       return ( IInvalidImage );
  201.   }
  202.   else
  203.     return ( IInvalidImage );
  204.   colorp = _IGetColor ( color );
  205.   if ( colorp ) {
  206.     if ( colorp->magic != IMAGIC_COLOR )
  207.       return ( IInvalidColor );
  208.   }
  209.   else
  210.     return ( IInvalidColor );
  211.   imagep->transparent = colorp;
  212.   return ( INoError );
  213. }
  214. IError IGetTransparent ( image, color )
  215. IImage image;
  216. IColor *color;
  217. {
  218.   IImageP *imagep = (IImageP *)image;
  219.   if ( imagep ) {
  220.     if ( imagep->magic != IMAGIC_IMAGE )
  221.       return ( IInvalidImage );
  222.   }
  223.   else
  224.     return ( IInvalidImage );
  225.   if ( imagep->transparent && imagep->transparent->magic == IMAGIC_COLOR ) {
  226.     *color = imagep->transparent->value;
  227.     return ( INoError );
  228.   } else {
  229.     return ( INoTransparentColor );
  230.   }
  231. }