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

图片显示

开发平台:

C/C++

  1. /*
  2.  * IImage.c
  3.  *
  4.  * Image library
  5.  *
  6.  * Description:
  7.  * Portable routines to manipulate raster images.
  8.  *
  9.  * History:
  10.  * 26-Aug-99 Craig Knudsen cknudsen@radix.net
  11.  * Added IAllocNamedColor()
  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 "Ilib.h"
  20. #include "IlibP.h"
  21. #include "IColorsP.h"
  22. static int num_colors = 0;
  23. static IColorP **colors = NULL;
  24. static void init_colors ()
  25. {
  26.   IColorP *color;
  27.   colors = (IColorP **) malloc ( 2 * sizeof ( IColorP * ) );
  28.   /* add black as color 0 */
  29.   color = (IColorP *) malloc ( sizeof ( IColorP ) );
  30.   color->red = color->green = color->blue = 0;
  31.   color->value = num_colors++;
  32.   colors[0] = color;
  33.   /* add white as color 1 */
  34.   color = (IColorP *) malloc ( sizeof ( IColorP ) );
  35.   color->red = color->green = color->blue = 255;
  36.   color->value = num_colors++;
  37.   colors[1] = color;
  38. }
  39. IColorP *_IGetColor ( color )
  40. int color;
  41. {
  42.   if ( colors == NULL )
  43.     init_colors ();
  44.   if ( color < 0 || color >= num_colors )
  45.     return ( NULL );
  46.   return ( colors[color] );
  47. }
  48. IColor IAllocColor ( red, green, blue )
  49. unsigned int red, green, blue;
  50. {
  51.   IColorP *color;
  52.   if ( colors == NULL )
  53.     init_colors ();
  54.   if ( red > 255 || green > 255 || blue > 255 ) {
  55.     fprintf ( stderr, "Bad color: %d/%d/%dn", red, green, blue );
  56.     return ( 0 ); /* black */
  57.   }
  58.   else {
  59.     color = (IColorP *) malloc ( sizeof ( IColorP ) );
  60.     color->magic = IMAGIC_COLOR;
  61.     color->red = red;
  62.     color->green = green;
  63.     color->blue = blue;
  64.     color->value = num_colors++;
  65.     colors  = (IColorP **) realloc ( (void *)colors,
  66.       ( num_colors * sizeof ( IColorP * ) ) );
  67.     colors[color->value] = color;
  68.     return ( color->value );
  69.   }
  70. }
  71. IError _IFreeColor ( color )
  72. IColor color;
  73. {
  74.   IColorP *c = (IColorP *)color;
  75.   if ( color ) {
  76.     c = _IGetColor ( color );
  77.     if ( ! c )
  78.       return ( IInvalidColor );
  79.     if ( c->magic != IMAGIC_COLOR )
  80.       return ( IInvalidColor );
  81.     if ( color >= 0 && color < num_colors && colors[color] ) {
  82.       colors[color]->magic = 0;
  83.       free ( colors[color] );
  84.       colors[color] = NULL;
  85.     }
  86.     else
  87.       return ( IInvalidColor );
  88.   }
  89.   return ( INoError );
  90. }
  91. IError IAllocNamedColor ( colorname, color_ret )
  92. char *colorname;
  93. IColor *color_ret;
  94. {
  95.   int loop;
  96.   char *cname, *ptr, *ptr2;
  97.   int found = 0;
  98.   cname = (char *) malloc ( strlen ( colorname ) + 1 );
  99.   for ( ptr = colorname, ptr2 = cname; *ptr != ''; ptr++ ) {
  100.     if ( *ptr != ' ' ) {
  101.       *ptr2 = tolower ( *ptr );
  102.       ptr2++;
  103.     }
  104.   }
  105.   *ptr2 = '';
  106.   for ( loop = 0; loop < I_NUM_NAMED_COLORS && ! found; loop++ ) {
  107.     if ( strcmp ( named_colors[loop].name, cname ) == 0 ) {
  108.       *color_ret = IAllocColor ( named_colors[loop].r,
  109.         named_colors[loop].g, named_colors[loop].b );
  110.       found = 1;
  111.     }
  112.   }
  113.   free ( cname );
  114.   return ( found ? INoError : IInvalidColorName );
  115. }