www.pudn.com > ilib > IColor.c
/* * IImage.c * * Image library * * Description: * Portable routines to manipulate raster images. * * History: * 26-Aug-99 Craig Knudsen cknudsen@radix.net * Added IAllocNamedColor() * 20-May-96 Craig Knudsen cknudsen@radix.net * Created * ****************************************************************************/ #include#include #include #include "Ilib.h" #include "IlibP.h" #include "IColorsP.h" static int num_colors = 0; static IColorP **colors = NULL; static void init_colors () { IColorP *color; colors = (IColorP **) malloc ( 2 * sizeof ( IColorP * ) ); /* add black as color 0 */ color = (IColorP *) malloc ( sizeof ( IColorP ) ); color->red = color->green = color->blue = 0; color->value = num_colors++; colors[0] = color; /* add white as color 1 */ color = (IColorP *) malloc ( sizeof ( IColorP ) ); color->red = color->green = color->blue = 255; color->value = num_colors++; colors[1] = color; } IColorP *_IGetColor ( color ) int color; { if ( colors == NULL ) init_colors (); if ( color < 0 || color >= num_colors ) return ( NULL ); return ( colors[color] ); } IColor IAllocColor ( red, green, blue ) unsigned int red, green, blue; { IColorP *color; if ( colors == NULL ) init_colors (); if ( red > 255 || green > 255 || blue > 255 ) { fprintf ( stderr, "Bad color: %d/%d/%d\n", red, green, blue ); return ( 0 ); /* black */ } else { color = (IColorP *) malloc ( sizeof ( IColorP ) ); color->magic = IMAGIC_COLOR; color->red = red; color->green = green; color->blue = blue; color->value = num_colors++; colors = (IColorP **) realloc ( (void *)colors, ( num_colors * sizeof ( IColorP * ) ) ); colors[color->value] = color; return ( color->value ); } } IError _IFreeColor ( color ) IColor color; { IColorP *c = (IColorP *)color; if ( color ) { c = _IGetColor ( color ); if ( ! c ) return ( IInvalidColor ); if ( c->magic != IMAGIC_COLOR ) return ( IInvalidColor ); if ( color >= 0 && color < num_colors && colors[color] ) { colors[color]->magic = 0; free ( colors[color] ); colors[color] = NULL; } else return ( IInvalidColor ); } return ( INoError ); } IError IAllocNamedColor ( colorname, color_ret ) char *colorname; IColor *color_ret; { int loop; char *cname, *ptr, *ptr2; int found = 0; cname = (char *) malloc ( strlen ( colorname ) + 1 ); for ( ptr = colorname, ptr2 = cname; *ptr != '\0'; ptr++ ) { if ( *ptr != ' ' ) { *ptr2 = tolower ( *ptr ); ptr2++; } } *ptr2 = '\0'; for ( loop = 0; loop < I_NUM_NAMED_COLORS && ! found; loop++ ) { if ( strcmp ( named_colors[loop].name, cname ) == 0 ) { *color_ret = IAllocColor ( named_colors[loop].r, named_colors[loop].g, named_colors[loop].b ); found = 1; } } free ( cname ); return ( found ? INoError : IInvalidColorName ); }