From 8eaa91469800bf6915c24ce27afff29962da992f Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Fri, 28 Sep 2012 09:41:22 +0000 Subject: Add 8 colors to the supported color list (aqua, crimson, fuchsia, indigo, lime, olive, silver and teal), part of TIP #403 FossilOrigin-Name: d222d486b422b5c19437251a936f6fc5c124ee3b --- ChangeLog | 8 ++ generic/tkColor.c | 415 +++++++++++++++++++++++++++++------------------------ generic/tkInt.h | 2 + unix/tkUnixColor.c | 201 ++++++++++++++------------ xlib/rgb.txt | 18 +++ xlib/xcolors.c | 12 +- 6 files changed, 374 insertions(+), 282 deletions(-) diff --git a/ChangeLog b/ChangeLog index ae6e126..56928ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2012-09-27 Jan Nijtmans + + * generic/tkInt.h: Add 8 colors to the supported color list + * generic/tkColor.c: (aqua, crimson, fuchsia, indigo, lime, + * unix/tkUnixColor.c: olive, silver and teal), part of TIP #403 + * xlib/rgb.txt + * xlib/xcolors.c + 2012-09-26 Jan Nijtmans * win/Makefile.in: Compile win32 binaries with -DTCL_NO_DEPRECATED diff --git a/generic/tkColor.c b/generic/tkColor.c index a5a1136..848e9ab 100755 --- a/generic/tkColor.c +++ b/generic/tkColor.c @@ -1,21 +1,22 @@ -/* +/* * tkColor.c -- * - * This file maintains a database of color values for the Tk - * toolkit, in order to avoid round-trips to the server to - * map color names to pixel values. + * This file maintains a database of color values for the Tk toolkit, in + * order to avoid round-trips to the server to map color names to pixel + * values. * * Copyright (c) 1990-1994 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ +#include "tkInt.h" #include "tkColor.h" /* - * Structures of the following following type are used as keys for + * Structures of the following following type are used as keys for * colorValueTable (in TkDisplay). */ @@ -26,18 +27,17 @@ typedef struct { Display *display; /* Display for colormap. */ } ValueKey; - /* - * The structure below is used to allocate thread-local data. + * The structure below is used to allocate thread-local data. */ typedef struct ThreadSpecificData { - char rgbString[20]; /* */ + char rgbString[20]; /* */ } ThreadSpecificData; static Tcl_ThreadDataKey dataKey; /* - * Forward declarations for procedures defined in this file: + * Forward declarations for functions defined in this file: */ static void ColorInit _ANSI_ARGS_((TkDisplay *dispPtr)); @@ -48,8 +48,8 @@ static void InitColorObj _ANSI_ARGS_((Tcl_Obj *objPtr)); /* * The following structure defines the implementation of the "color" Tcl - * object, which maps a string color name to a TkColor object. The - * ptr1 field of the Tcl_Obj points to a TkColor object. + * object, which maps a string color name to a TkColor object. The ptr1 field + * of the Tcl_Obj points to a TkColor object. */ Tcl_ObjType tkColorObjType = { @@ -65,21 +65,20 @@ Tcl_ObjType tkColorObjType = { * * Tk_AllocColorFromObj -- * - * Given a Tcl_Obj *, map the value to a corresponding - * XColor structure based on the tkwin given. + * Given a Tcl_Obj *, map the value to a corresponding XColor structure + * based on the tkwin given. * * Results: - * The return value is a pointer to an XColor structure that - * indicates the red, blue, and green intensities for the color - * given by the string in objPtr, and also specifies a pixel value - * to use to draw in that color. If an error occurs, NULL is - * returned and an error message will be left in interp's result - * (unless interp is NULL). + * The return value is a pointer to an XColor structure that indicates + * the red, blue, and green intensities for the color given by the string + * in objPtr, and also specifies a pixel value to use to draw in that + * color. If an error occurs, NULL is returned and an error message will + * be left in interp's result (unless interp is NULL). * * Side effects: - * The color is added to an internal database with a reference count. - * For each call to this procedure, there should eventually be a call - * to Tk_FreeColorFromObj so that the database is cleaned up when colors + * The color is added to an internal database with a reference count. For + * each call to this function, there should eventually be a call to + * Tk_FreeColorFromObj so that the database is cleaned up when colors * aren't in use anymore. * *---------------------------------------------------------------------- @@ -102,15 +101,15 @@ Tk_AllocColorFromObj(interp, tkwin, objPtr) tkColPtr = (TkColor *) objPtr->internalRep.twoPtrValue.ptr1; /* - * If the object currently points to a TkColor, see if it's the - * one we want. If so, increment its reference count and return. + * If the object currently points to a TkColor, see if it's the one we + * want. If so, increment its reference count and return. */ if (tkColPtr != NULL) { if (tkColPtr->resourceRefCount == 0) { /* - * This is a stale reference: it refers to a TkColor that's - * no longer in use. Clear the reference. + * This is a stale reference: it refers to a TkColor that's no + * longer in use. Clear the reference. */ FreeColorObjProc(objPtr); @@ -123,9 +122,9 @@ Tk_AllocColorFromObj(interp, tkwin, objPtr) } /* - * The object didn't point to the TkColor that we wanted. Search - * the list of TkColors with the same name to see if one of the - * other TkColors is the right one. + * The object didn't point to the TkColor that we wanted. Search the list + * of TkColors with the same name to see if one of the other TkColors is + * the right one. */ if (tkColPtr != NULL) { @@ -145,7 +144,7 @@ Tk_AllocColorFromObj(interp, tkwin, objPtr) } /* - * Still no luck. Call Tk_GetColor to allocate a new TkColor object. + * Still no luck. Call Tk_GetColor to allocate a new TkColor object. */ tkColPtr = (TkColor *) Tk_GetColor(interp, tkwin, Tcl_GetString(objPtr)); @@ -165,31 +164,31 @@ Tk_AllocColorFromObj(interp, tkwin, objPtr) * XColor structure. * * Results: - * The return value is a pointer to an XColor structure that - * indicates the red, blue, and green intensities for the color - * given by "name", and also specifies a pixel value to use to - * draw in that color. If an error occurs, NULL is returned and - * an error message will be left in the interp's result. + * The return value is a pointer to an XColor structure that indicates + * the red, blue, and green intensities for the color given by "name", + * and also specifies a pixel value to use to draw in that color. If an + * error occurs, NULL is returned and an error message will be left in + * the interp's result. * * Side effects: - * The color is added to an internal database with a reference count. - * For each call to this procedure, there should eventually be a call - * to Tk_FreeColor so that the database is cleaned up when colors - * aren't in use anymore. + * The color is added to an internal database with a reference count. For + * each call to this function, there should eventually be a call to + * Tk_FreeColor so that the database is cleaned up when colors aren't in + * use anymore. * *---------------------------------------------------------------------- */ XColor * Tk_GetColor(interp, tkwin, name) - Tcl_Interp *interp; /* Place to leave error message if - * color can't be found. */ + Tcl_Interp *interp; /* Place to leave error message if color can't + * be found. */ Tk_Window tkwin; /* Window in which color will be used. */ Tk_Uid name; /* Name of color to be allocated (in form * suitable for passing to XParseColor). */ { Tcl_HashEntry *nameHashPtr; - int new; + int isNew; TkColor *tkColPtr; TkColor *existingColPtr; TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr; @@ -199,14 +198,13 @@ Tk_GetColor(interp, tkwin, name) } /* - * First, check to see if there's already a mapping for this color - * name. + * First, check to see if there's already a mapping for this color name. */ - nameHashPtr = Tcl_CreateHashEntry(&dispPtr->colorNameTable, name, &new); - if (!new) { + nameHashPtr = Tcl_CreateHashEntry(&dispPtr->colorNameTable, name, &isNew); + if (!isNew) { existingColPtr = (TkColor *) Tcl_GetHashValue(nameHashPtr); - for (tkColPtr = existingColPtr; tkColPtr != NULL; + for (tkColPtr = existingColPtr; tkColPtr != NULL; tkColPtr = tkColPtr->nextPtr) { if ((tkColPtr->screen == Tk_Screen(tkwin)) && (Tk_Colormap(tkwin) == tkColPtr->colormap)) { @@ -219,8 +217,7 @@ Tk_GetColor(interp, tkwin, name) } /* - * The name isn't currently known. Map from the name to a pixel - * value. + * The name isn't currently known. Map from the name to a pixel value. */ tkColPtr = TkpGetColor(tkwin, name); @@ -228,28 +225,28 @@ Tk_GetColor(interp, tkwin, name) if (interp != NULL) { if (*name == '#') { Tcl_AppendResult(interp, "invalid color name \"", name, - "\"", (char *) NULL); + "\"", NULL); } else { Tcl_AppendResult(interp, "unknown color name \"", name, - "\"", (char *) NULL); + "\"", NULL); } } - if (new) { + if (isNew) { Tcl_DeleteHashEntry(nameHashPtr); } return (XColor *) NULL; } /* - * Now create a new TkColor structure and add it to colorNameTable - * (in TkDisplay). + * Now create a new TkColor structure and add it to colorNameTable (in + * TkDisplay). */ tkColPtr->magic = COLOR_MAGIC; tkColPtr->gc = None; tkColPtr->screen = Tk_Screen(tkwin); tkColPtr->colormap = Tk_Colormap(tkwin); - tkColPtr->visual = Tk_Visual(tkwin); + tkColPtr->visual = Tk_Visual(tkwin); tkColPtr->resourceRefCount = 1; tkColPtr->objRefCount = 0; tkColPtr->type = TK_COLOR_BY_NAME; @@ -265,21 +262,20 @@ Tk_GetColor(interp, tkwin, name) * * Tk_GetColorByValue -- * - * Given a desired set of red-green-blue intensities for a color, - * locate a pixel value to use to draw that color in a given - * window. + * Given a desired set of red-green-blue intensities for a color, locate + * a pixel value to use to draw that color in a given window. * * Results: - * The return value is a pointer to an XColor structure that - * indicates the closest red, blue, and green intensities available - * to those specified in colorPtr, and also specifies a pixel - * value to use to draw in that color. + * The return value is a pointer to an XColor structure that indicates + * the closest red, blue, and green intensities available to those + * specified in colorPtr, and also specifies a pixel value to use to draw + * in that color. * * Side effects: - * The color is added to an internal database with a reference count. - * For each call to this procedure, there should eventually be a call - * to Tk_FreeColor, so that the database is cleaned up when colors - * aren't in use anymore. + * The color is added to an internal database with a reference count. For + * each call to this function, there should eventually be a call to + * Tk_FreeColor, so that the database is cleaned up when colors aren't in + * use anymore. * *---------------------------------------------------------------------- */ @@ -292,7 +288,7 @@ Tk_GetColorByValue(tkwin, colorPtr) { ValueKey valueKey; Tcl_HashEntry *valueHashPtr; - int new; + int isNew; TkColor *tkColPtr; Display *display = Tk_Display(tkwin); TkDisplay *dispPtr = TkGetDisplay(display); @@ -302,26 +298,28 @@ Tk_GetColorByValue(tkwin, colorPtr) } /* - * First, check to see if there's already a mapping for this color - * name. + * First, check to see if there's already a mapping for this color name. + * Must clear the structure first; it's not tightly packed on 64-bit + * systems. [Bug 2911570] */ + memset(&valueKey, 0, sizeof(ValueKey)); valueKey.red = colorPtr->red; valueKey.green = colorPtr->green; valueKey.blue = colorPtr->blue; valueKey.colormap = Tk_Colormap(tkwin); valueKey.display = display; - valueHashPtr = Tcl_CreateHashEntry(&dispPtr->colorValueTable, - (char *) &valueKey, &new); - if (!new) { + valueHashPtr = Tcl_CreateHashEntry(&dispPtr->colorValueTable, + (char *) &valueKey, &isNew); + if (!isNew) { tkColPtr = (TkColor *) Tcl_GetHashValue(valueHashPtr); tkColPtr->resourceRefCount++; return &tkColPtr->color; } /* - * The name isn't currently known. Find a pixel value for this - * color and add a new structure to colorValueTable (in TkDisplay). + * The name isn't currently known. Find a pixel value for this color and + * add a new structure to colorValueTable (in TkDisplay). */ tkColPtr = TkpGetColorByValue(tkwin, colorPtr); @@ -329,7 +327,7 @@ Tk_GetColorByValue(tkwin, colorPtr) tkColPtr->gc = None; tkColPtr->screen = Tk_Screen(tkwin); tkColPtr->colormap = valueKey.colormap; - tkColPtr->visual = Tk_Visual(tkwin); + tkColPtr->visual = Tk_Visual(tkwin); tkColPtr->resourceRefCount = 1; tkColPtr->objRefCount = 0; tkColPtr->type = TK_COLOR_BY_VALUE; @@ -344,16 +342,14 @@ Tk_GetColorByValue(tkwin, colorPtr) * * Tk_NameOfColor -- * - * Given a color, return a textual string identifying - * the color. + * Given a color, return a textual string identifying the color. * * Results: - * If colorPtr was created by Tk_GetColor, then the return - * value is the "string" that was used to create it. - * Otherwise the return value is a string that could have - * been passed to Tk_GetColor to allocate that color. The - * storage for the returned string is only guaranteed to - * persist up until the next call to this procedure. + * If colorPtr was created by Tk_GetColor, then the return value is the + * "string" that was used to create it. Otherwise the return value is a + * string that could have been passed to Tk_GetColor to allocate that + * color. The storage for the returned string is only guaranteed to + * persist up until the next call to this function. * * Side effects: * None. @@ -366,14 +362,15 @@ Tk_NameOfColor(colorPtr) XColor *colorPtr; /* Color whose name is desired. */ { register TkColor *tkColPtr = (TkColor *) colorPtr; - + if ((tkColPtr->magic == COLOR_MAGIC) && (tkColPtr->type == TK_COLOR_BY_NAME)) { return tkColPtr->hashPtr->key.string; } else { - ThreadSpecificData *tsdPtr = (ThreadSpecificData *) - Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); - sprintf(tsdPtr->rgbString, "#%04x%04x%04x", colorPtr->red, + ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); + + sprintf(tsdPtr->rgbString, "#%04x%04x%04x", colorPtr->red, colorPtr->green, colorPtr->blue); return tsdPtr->rgbString; } @@ -384,15 +381,14 @@ Tk_NameOfColor(colorPtr) * * Tk_GCForColor -- * - * Given a color allocated from this module, this procedure - * returns a GC that can be used for simple drawing with that - * color. + * Given a color allocated from this module, this function returns a GC + * that can be used for simple drawing with that color. * * Results: - * The return value is a GC with color set as its foreground - * color and all other fields defaulted. This GC is only valid - * as long as the color exists; it is freed automatically when - * the last reference to the color is freed. + * The return value is a GC with color set as its foreground color and + * all other fields defaulted. This GC is only valid as long as the color + * exists; it is freed automatically when the last reference to the color + * is freed. * * Side effects: * None. @@ -402,29 +398,28 @@ Tk_NameOfColor(colorPtr) GC Tk_GCForColor(colorPtr, drawable) - XColor *colorPtr; /* Color for which a GC is desired. Must - * have been allocated by Tk_GetColor. */ - Drawable drawable; /* Drawable in which the color will be - * used (must have same screen and depth - * as the one for which the color was - * allocated). */ + XColor *colorPtr; /* Color for which a GC is desired. Must have + * been allocated by Tk_GetColor. */ + Drawable drawable; /* Drawable in which the color will be used + * (must have same screen and depth as the one + * for which the color was allocated). */ { TkColor *tkColPtr = (TkColor *) colorPtr; XGCValues gcValues; /* - * Do a quick sanity check to make sure this color was really - * allocated by Tk_GetColor. + * Do a quick sanity check to make sure this color was really allocated by + * Tk_GetColor. */ if (tkColPtr->magic != COLOR_MAGIC) { - panic("Tk_GCForColor called with bogus color"); + Tcl_Panic("Tk_GCForColor called with bogus color"); } if (tkColPtr->gc == None) { gcValues.foreground = tkColPtr->color.pixel; - tkColPtr->gc = XCreateGC(DisplayOfScreen(tkColPtr->screen), - drawable, GCForeground, &gcValues); + tkColPtr->gc = XCreateGC(DisplayOfScreen(tkColPtr->screen), drawable, + GCForeground, &gcValues); } return tkColPtr->gc; } @@ -434,16 +429,14 @@ Tk_GCForColor(colorPtr, drawable) * * Tk_FreeColor -- * - * This procedure is called to release a color allocated by - * Tk_GetColor. + * This function is called to release a color allocated by Tk_GetColor. * * Results: * None. * * Side effects: - * The reference count associated with colorPtr is deleted, and - * the color is released to X if there are no remaining uses - * for it. + * The reference count associated with colorPtr is deleted, and the color + * is released to X if there are no remaining uses for it. * *---------------------------------------------------------------------- */ @@ -459,12 +452,12 @@ Tk_FreeColor(colorPtr) TkColor *prevPtr; /* - * Do a quick sanity check to make sure this color was really - * allocated by Tk_GetColor. + * Do a quick sanity check to make sure this color was really allocated by + * Tk_GetColor. */ if (tkColPtr->magic != COLOR_MAGIC) { - panic("Tk_FreeColor called with bogus color"); + Tcl_Panic("Tk_FreeColor called with bogus color"); } tkColPtr->resourceRefCount--; @@ -474,8 +467,8 @@ Tk_FreeColor(colorPtr) /* * This color is no longer being actively used, so free the color - * resources associated with it and remove it from the hash table. - * no longer any objects referencing it. + * resources associated with it and remove it from the hash table. No + * longer any objects referencing it. */ if (tkColPtr->gc != None) { @@ -488,7 +481,7 @@ Tk_FreeColor(colorPtr) if (prevPtr == tkColPtr) { if (tkColPtr->nextPtr == NULL) { Tcl_DeleteHashEntry(tkColPtr->hashPtr); - } else { + } else { Tcl_SetHashValue(tkColPtr->hashPtr, tkColPtr->nextPtr); } } else { @@ -499,10 +492,9 @@ Tk_FreeColor(colorPtr) } /* - * Free the TkColor structure if there are no objects referencing - * it. However, if there are objects referencing it then keep the - * structure around; it will get freed when the last reference is - * cleared + * Free the TkColor structure if there are no objects referencing it. + * However, if there are objects referencing it then keep the structure + * around; it will get freed when the last reference is cleared */ if (tkColPtr->objRefCount == 0) { @@ -515,18 +507,18 @@ Tk_FreeColor(colorPtr) * * Tk_FreeColorFromObj -- * - * This procedure is called to release a color allocated by - * Tk_AllocColorFromObj. It does not throw away the Tcl_Obj *; - * it only gets rid of the hash table entry for this color - * and clears the cached value that is normally stored in the object. + * This function is called to release a color allocated by + * Tk_AllocColorFromObj. It does not throw away the Tcl_Obj *; it only + * gets rid of the hash table entry for this color and clears the cached + * value that is normally stored in the object. * * Results: * None. * * Side effects: - * The reference count associated with the color represented by - * objPtr is decremented, and the color is released to X if there are - * no remaining uses for it. + * The reference count associated with the color represented by objPtr is + * decremented, and the color is released to X if there are no remaining + * uses for it. * *---------------------------------------------------------------------- */ @@ -544,19 +536,18 @@ Tk_FreeColorFromObj(tkwin, objPtr) /* *--------------------------------------------------------------------------- * - * FreeColorObjProc -- + * FreeColorObjProc -- * - * This proc is called to release an object reference to a color. - * Called when the object's internal rep is released or when - * the cached tkColPtr needs to be changed. + * This proc is called to release an object reference to a color. Called + * when the object's internal rep is released or when the cached tkColPtr + * needs to be changed. * * Results: * None. * * Side effects: - * The object reference count is decremented. When both it - * and the hash ref count go to zero, the color's resources - * are released. + * The object reference count is decremented. When both it and the hash + * ref count go to zero, the color's resources are released. * *--------------------------------------------------------------------------- */ @@ -569,7 +560,7 @@ FreeColorObjProc(objPtr) if (tkColPtr != NULL) { tkColPtr->objRefCount--; - if ((tkColPtr->objRefCount == 0) + if ((tkColPtr->objRefCount == 0) && (tkColPtr->resourceRefCount == 0)) { ckfree((char *) tkColPtr); } @@ -580,17 +571,17 @@ FreeColorObjProc(objPtr) /* *--------------------------------------------------------------------------- * - * DupColorObjProc -- + * DupColorObjProc -- * - * When a cached color object is duplicated, this is called to - * update the internal reps. + * When a cached color object is duplicated, this is called to update the + * internal reps. * * Results: * None. * * Side effects: - * The color's objRefCount is incremented and the internal rep - * of the copy is set to point to it. + * The color's objRefCount is incremented and the internal rep of the + * copy is set to point to it. * *--------------------------------------------------------------------------- */ @@ -601,7 +592,7 @@ DupColorObjProc(srcObjPtr, dupObjPtr) Tcl_Obj *dupObjPtr; /* The object we are copying to. */ { TkColor *tkColPtr = (TkColor *) srcObjPtr->internalRep.twoPtrValue.ptr1; - + dupObjPtr->typePtr = srcObjPtr->typePtr; dupObjPtr->internalRep.twoPtrValue.ptr1 = (VOID *) tkColPtr; @@ -615,17 +606,16 @@ DupColorObjProc(srcObjPtr, dupObjPtr) * * Tk_GetColorFromObj -- * - * Returns the color referred to by a Tcl object. The color must - * already have been allocated via a call to Tk_AllocColorFromObj - * or Tk_GetColor. + * Returns the color referred to by a Tcl object. The color must already + * have been allocated via a call to Tk_AllocColorFromObj or Tk_GetColor. * * Results: - * Returns the XColor * that matches the tkwin and the string rep - * of objPtr. + * Returns the XColor * that matches the tkwin and the string rep of + * objPtr. * * Side effects: - * If the object is not already a color, the conversion will free - * any old internal representation. + * If the object is not already a color, the conversion will free any old + * internal representation. * *---------------------------------------------------------------------- */ @@ -644,34 +634,35 @@ Tk_GetColorFromObj(tkwin, objPtr) if (objPtr->typePtr != &tkColorObjType) { InitColorObj(objPtr); } - + /* - * First check to see if the internal representation of the object - * is defined and is a color that is valid for the current screen - * and color map. If it is, we are done. + * First check to see if the internal representation of the object is + * defined and is a color that is valid for the current screen and color + * map. If it is, we are done. */ + tkColPtr = (TkColor *) objPtr->internalRep.twoPtrValue.ptr1; if ((tkColPtr != NULL) && (tkColPtr->resourceRefCount > 0) && (Tk_Screen(tkwin) == tkColPtr->screen) && (Tk_Colormap(tkwin) == tkColPtr->colormap)) { /* - * The object already points to the right TkColor structure. - * Just return it. + * The object already points to the right TkColor structure. Just + * return it. */ return (XColor *) tkColPtr; } /* - * If we reach this point, it means that the TkColor structure - * that we have cached in the internal representation is not valid - * for the current screen and colormap. But there is a list of - * other TkColor structures attached to the TkDisplay. Walk this - * list looking for the right TkColor structure. + * If we reach this point, it means that the TkColor structure that we + * have cached in the internal representation is not valid for the current + * screen and colormap. But there is a list of other TkColor structures + * attached to the TkDisplay. Walk this list looking for the right TkColor + * structure. */ - hashPtr = Tcl_FindHashEntry(&dispPtr->colorNameTable, + hashPtr = Tcl_FindHashEntry(&dispPtr->colorNameTable, Tcl_GetString(objPtr)); if (hashPtr == NULL) { goto error; @@ -687,8 +678,8 @@ Tk_GetColorFromObj(tkwin, objPtr) } } - error: - panic(" Tk_GetColorFromObj called with non-existent color!"); + error: + Tcl_Panic("Tk_GetColorFromObj called with non-existent color!"); /* * The following code isn't reached; it's just there to please compilers. */ @@ -700,16 +691,15 @@ Tk_GetColorFromObj(tkwin, objPtr) * * InitColorObj -- * - * Bookeeping procedure to change an objPtr to a color type. + * Bookeeping function to change an objPtr to a color type. * * Results: * None. * * Side effects: - * The old internal rep of the object is freed. The object's - * type is set to color with a NULL TkColor pointer (the pointer - * will be set later by either Tk_AllocColorFromObj or - * Tk_GetColorFromObj). + * The old internal rep of the object is freed. The object's type is set + * to color with a NULL TkColor pointer (the pointer will be set later by + * either Tk_AllocColorFromObj or Tk_GetColorFromObj). * *---------------------------------------------------------------------- */ @@ -721,7 +711,7 @@ InitColorObj(objPtr) Tcl_ObjType *typePtr; /* - * Free the old internalRep before setting the new one. + * Free the old internalRep before setting the new one. */ Tcl_GetString(objPtr); @@ -754,10 +744,10 @@ ColorInit(dispPtr) TkDisplay *dispPtr; { if (!dispPtr->colorInit) { - dispPtr->colorInit = 1; + dispPtr->colorInit = 1; Tcl_InitHashTable(&dispPtr->colorNameTable, TCL_STRING_KEYS); - Tcl_InitHashTable(&dispPtr->colorValueTable, - sizeof(ValueKey)/sizeof(int)); + Tcl_InitHashTable(&dispPtr->colorValueTable, + sizeof(ValueKey)/sizeof(int)); } } @@ -766,13 +756,13 @@ ColorInit(dispPtr) * * TkDebugColor -- * - * This procedure returns debugging information about a color. + * This function returns debugging information about a color. * * Results: * The return value is a list with one sublist for each TkColor - * corresponding to "name". Each sublist has two elements that - * contain the resourceRefCount and objRefCount fields from the - * TkColor structure. + * corresponding to "name". Each sublist has two elements that contain + * the resourceRefCount and objRefCount fields from the TkColor + * structure. * * Side effects: * None. @@ -782,28 +772,29 @@ ColorInit(dispPtr) Tcl_Obj * TkDebugColor(tkwin, name) - Tk_Window tkwin; /* The window in which the color will be - * used (not currently used). */ + Tk_Window tkwin; /* The window in which the color will be used + * (not currently used). */ char *name; /* Name of the desired color. */ { - TkColor *tkColPtr; Tcl_HashEntry *hashPtr; - Tcl_Obj *resultPtr, *objPtr; + Tcl_Obj *resultPtr; TkDisplay *dispPtr = ((TkWindow *) tkwin)->dispPtr; resultPtr = Tcl_NewObj(); hashPtr = Tcl_FindHashEntry(&dispPtr->colorNameTable, name); if (hashPtr != NULL) { - tkColPtr = (TkColor *) Tcl_GetHashValue(hashPtr); + TkColor *tkColPtr = (TkColor *) Tcl_GetHashValue(hashPtr); + if (tkColPtr == NULL) { - panic("TkDebugColor found empty hash table entry"); + Tcl_Panic("TkDebugColor found empty hash table entry"); } for ( ; (tkColPtr != NULL); tkColPtr = tkColPtr->nextPtr) { - objPtr = Tcl_NewObj(); + Tcl_Obj *objPtr = Tcl_NewObj(); + Tcl_ListObjAppendElement(NULL, objPtr, Tcl_NewIntObj(tkColPtr->resourceRefCount)); Tcl_ListObjAppendElement(NULL, objPtr, - Tcl_NewIntObj(tkColPtr->objRefCount)); + Tcl_NewIntObj(tkColPtr->objRefCount)); Tcl_ListObjAppendElement(NULL, resultPtr, objPtr); } } @@ -811,8 +802,35 @@ TkDebugColor(tkwin, name) } #ifndef __WIN32__ + /* This function is not necessary for Win32, * since XParseColor already does the right thing */ + +#undef XParseColor + +CONST char *CONST tkWebColors[20] = { + /* 'a' */ "qua\0#0000ffffffff", + /* 'b' */ NULL, + /* 'c' */ "rimson\0#dcdc14143c3c", + /* 'd' */ NULL, + /* 'e' */ NULL, + /* 'f' */ "uchsia\0#ffff0000ffff", + /* 'g' */ NULL, + /* 'h' */ NULL, + /* 'i' */ "ndigo\0#4b4b00008282", + /* 'j' */ NULL, + /* 'k' */ NULL, + /* 'l' */ "ime\0#0000ffff0000", + /* 'm' */ NULL, + /* 'n' */ NULL, + /* 'o' */ "live\0#808080800000", + /* 'p' */ NULL, + /* 'q' */ NULL, + /* 'r' */ NULL, + /* 's' */ "ilver\0#c0c0c0c0c0c0", + /* 't' */ "eal\0#000080808080" +}; + Status TkParseColor(display, map, name, color) Display * display; /* The display */ @@ -865,12 +883,31 @@ TkParseColor(display, map, name, color) } else { name -= 13; } - } else { - if (strlen(name) > 99) { - /* Don't bother to parse this. [Bug 2809525]*/ - return 0; + goto done; + } else if (((*name - 'A') & 0xdf) < sizeof(tkWebColors)/sizeof(tkWebColors[0])) { + const char *p = tkWebColors[((*name - 'A') & 0x1f)]; + if (p) { + const char *q = name; + while (!((*p - *(++q)) & 0xdf)) { + if (!*p++) { + name = p; + goto done; + } + } } } + if (strlen(name) > 99) { + /* Don't bother to parse this. [Bug 2809525]*/ + return 0; + } +done: return XParseColor(display, map, name, color); } #endif /* __WIN32__ */ +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/generic/tkInt.h b/generic/tkInt.h index a6e09ee..c2211aa 100644 --- a/generic/tkInt.h +++ b/generic/tkInt.h @@ -970,6 +970,8 @@ extern Tk_ImageType tkPhotoImageType; extern Tcl_HashTable tkPredefBitmapTable; extern int tkSendSerial; +extern CONST char *const tkWebColors[20]; + #include "tkIntDecls.h" #ifdef BUILD_tk diff --git a/unix/tkUnixColor.c b/unix/tkUnixColor.c index 722dd06..205056b 100755 --- a/unix/tkUnixColor.c +++ b/unix/tkUnixColor.c @@ -1,46 +1,45 @@ -/* +/* * tkUnixColor.c -- * - * This file contains the platform specific color routines - * needed for X support. + * This file contains the platform specific color routines needed for X + * support. * * Copyright (c) 1996 by Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include /* - * If a colormap fills up, attempts to allocate new colors from that - * colormap will fail. When that happens, we'll just choose the - * closest color from those that are available in the colormap. - * One of the following structures will be created for each "stressed" - * colormap to keep track of the colors that are available in the - * colormap (otherwise we would have to re-query from the server on - * each allocation, which would be very slow). These entries are - * flushed after a few seconds, since other clients may release or + * If a colormap fills up, attempts to allocate new colors from that colormap + * will fail. When that happens, we'll just choose the closest color from + * those that are available in the colormap. One of the following structures + * will be created for each "stressed" colormap to keep track of the colors + * that are available in the colormap (otherwise we would have to re-query + * from the server on each allocation, which would be very slow). These + * entries are flushed after a few seconds, since other clients may release or * reallocate colors over time. */ struct TkStressedCmap { - Colormap colormap; /* X's token for the colormap. */ - int numColors; /* Number of entries currently active - * at *colorPtr. */ - XColor *colorPtr; /* Pointer to malloc'ed array of all - * colors that seem to be available in - * the colormap. Some may not actually - * be available, e.g. because they are - * read-write for another client; when - * we find this out, we remove them - * from the array. */ - struct TkStressedCmap *nextPtr; /* Next in list of all stressed - * colormaps for the display. */ + Colormap colormap; /* X's token for the colormap. */ + int numColors; /* Number of entries currently active at + * *colorPtr. */ + XColor *colorPtr; /* Pointer to malloc'ed array of all colors + * that seem to be available in the colormap. + * Some may not actually be available, e.g. + * because they are read-write for another + * client; when we find this out, we remove + * them from the array. */ + struct TkStressedCmap *nextPtr; + /* Next in list of all stressed colormaps for + * the display. */ }; /* - * Forward declarations for procedures defined in this file: + * Forward declarations for functions defined in this file: */ static void DeleteStressedCmap _ANSI_ARGS_((Display *display, @@ -59,8 +58,8 @@ static void FindClosestColor _ANSI_ARGS_((Tk_Window tkwin, * None * * Side effects: - * Invalidates the colormap cache for the colormap associated with - * the given color. + * Invalidates the colormap cache for the colormap associated with the + * given color. * *---------------------------------------------------------------------- */ @@ -75,14 +74,13 @@ TkpFreeColor(tkColPtr) Screen *screen = tkColPtr->screen; /* - * Careful! Don't free black or white, since this will - * make some servers very unhappy. Also, there is a bug in - * some servers (such Sun's X11/NeWS server) where reference - * counting is performed incorrectly, so that if a color is - * allocated twice in different places and then freed twice, - * the second free generates an error (this bug existed as of - * 10/1/92). To get around this problem, ignore errors that - * occur during the free operation. + * Careful! Don't free black or white, since this will make some servers + * very unhappy. Also, there is a bug in some servers (such Sun's X11/NeWS + * server) where reference counting is performed incorrectly, so that if a + * color is allocated twice in different places and then freed twice, the + * second free generates an error (this bug existed as of 10/1/92). To get + * around this problem, ignore errors that occur during the free + * operation. */ visual = tkColPtr->visual; @@ -112,8 +110,7 @@ TkpFreeColor(tkColPtr) * * Side effects: * May invalidate the colormap cache associated with tkwin upon - * allocating a new colormap entry. Allocates a new TkColor - * structure. + * allocating a new colormap entry. Allocates a new TkColor structure. * *---------------------------------------------------------------------- */ @@ -130,7 +127,7 @@ TkpGetColor(tkwin, name) TkColor *tkColPtr; /* - * Map from the name to a pixel value. Call XAllocNamedColor rather than + * Map from the name to a pixel value. Call XAllocNamedColor rather than * XParseColor for non-# names: this saves a server round-trip for those * names. */ @@ -138,6 +135,18 @@ TkpGetColor(tkwin, name) if (*name != '#') { XColor screen; + if (((*name - 'A') & 0xdf) < sizeof(tkWebColors)/sizeof(tkWebColors[0])) { + const char *p = tkWebColors[((*name - 'A') & 0x1f)]; + if (p) { + const char *q = name; + while (!((*p - *(++q)) & 0xdf)) { + if (!*p++) { + name = p; + goto gotWebColor; + } + } + } + } if (strlen(name) > 99) { /* Don't bother to parse this. [Bug 2809525]*/ return (TkColor *) NULL; @@ -145,10 +154,10 @@ TkpGetColor(tkwin, name) DeleteStressedCmap(display, colormap); } else { /* - * Couldn't allocate the color. Try translating the name to - * a color value, to see whether the problem is a bad color - * name or a full colormap. If the colormap is full, then - * pick an approximation to the desired color. + * Couldn't allocate the color. Try translating the name to a + * color value, to see whether the problem is a bad color name or + * a full colormap. If the colormap is full, then pick an + * approximation to the desired color. */ if (XLookupColor(display, colormap, name, &color, &screen) == 0) { @@ -157,6 +166,7 @@ TkpGetColor(tkwin, name) FindClosestColor(tkwin, &screen, &color); } } else { + gotWebColor: if (TkParseColor(display, colormap, name, &color) == 0) { return (TkColor *) NULL; } @@ -178,19 +188,18 @@ TkpGetColor(tkwin, name) * * TkpGetColorByValue -- * - * Given a desired set of red-green-blue intensities for a color, - * locate a pixel value to use to draw that color in a given - * window. + * Given a desired set of red-green-blue intensities for a color, locate + * a pixel value to use to draw that color in a given window. * * Results: - * The return value is a pointer to an TkColor structure that - * indicates the closest red, blue, and green intensities available - * to those specified in colorPtr, and also specifies a pixel - * value to use to draw in that color. + * The return value is a pointer to an TkColor structure that indicates + * the closest red, blue, and green intensities available to those + * specified in colorPtr, and also specifies a pixel value to use to draw + * in that color. * * Side effects: - * May invalidate the colormap cache for the specified window. - * Allocates a new TkColor structure. + * May invalidate the colormap cache for the specified window. Allocates + * a new TkColor structure. * *---------------------------------------------------------------------- */ @@ -222,15 +231,15 @@ TkpGetColorByValue(tkwin, colorPtr) * * FindClosestColor -- * - * When Tk can't allocate a color because a colormap has filled - * up, this procedure is called to find and allocate the closest - * available color in the colormap. + * When Tk can't allocate a color because a colormap has filled up, this + * function is called to find and allocate the closest available color in + * the colormap. * * Results: - * There is no return value, but *actualColorPtr is filled in - * with information about the closest available color in tkwin's - * colormap. This color has been allocated via X, so it must - * be released by the caller when the caller is done with it. + * There is no return value, but *actualColorPtr is filled in with + * information about the closest available color in tkwin's colormap. + * This color has been allocated via X, so it must be released by the + * caller when the caller is done with it. * * Side effects: * A color is allocated. @@ -256,8 +265,8 @@ FindClosestColor(tkwin, desiredColorPtr, actualColorPtr) XVisualInfo template, *visInfoPtr; /* - * Find the TkStressedCmap structure for this colormap, or create - * a new one if needed. + * Find the TkStressedCmap structure for this colormap, or create a new + * one if needed. */ for (stressPtr = dispPtr->stressPtr; ; stressPtr = stressPtr->nextPtr) { @@ -265,20 +274,24 @@ FindClosestColor(tkwin, desiredColorPtr, actualColorPtr) stressPtr = (TkStressedCmap *) ckalloc(sizeof(TkStressedCmap)); stressPtr->colormap = colormap; template.visualid = XVisualIDFromVisual(Tk_Visual(tkwin)); + visInfoPtr = XGetVisualInfo(Tk_Display(tkwin), VisualIDMask, &template, &numFound); if (numFound < 1) { - panic("FindClosestColor couldn't lookup visual"); + Tcl_Panic("FindClosestColor couldn't lookup visual"); } + stressPtr->numColors = visInfoPtr->colormap_size; XFree((char *) visInfoPtr); stressPtr->colorPtr = (XColor *) ckalloc((unsigned) (stressPtr->numColors * sizeof(XColor))); - for (i = 0; i < stressPtr->numColors; i++) { + for (i = 0; i < stressPtr->numColors; i++) { stressPtr->colorPtr[i].pixel = (unsigned long) i; } + XQueryColors(dispPtr->display, colormap, stressPtr->colorPtr, stressPtr->numColors); + stressPtr->nextPtr = dispPtr->stressPtr; dispPtr->stressPtr = stressPtr; break; @@ -289,27 +302,27 @@ FindClosestColor(tkwin, desiredColorPtr, actualColorPtr) } /* - * Find the color that best approximates the desired one, then - * try to allocate that color. If that fails, it must mean that - * the color was read-write (so we can't use it, since it's owner - * might change it) or else it was already freed. Try again, - * over and over again, until something succeeds. + * Find the color that best approximates the desired one, then try to + * allocate that color. If that fails, it must mean that the color was + * read-write (so we can't use it, since it's owner might change it) or + * else it was already freed. Try again, over and over again, until + * something succeeds. */ - while (1) { + while (1) { if (stressPtr->numColors == 0) { - panic("FindClosestColor ran out of colors"); + Tcl_Panic("FindClosestColor ran out of colors"); } closestDistance = 1e30; closest = 0; for (colorPtr = stressPtr->colorPtr, i = 0; i < stressPtr->numColors; colorPtr++, i++) { /* - * Use Euclidean distance in RGB space, weighted by Y (of YIQ) - * as the objective function; this accounts for differences - * in the color sensitivity of the eye. + * Use Euclidean distance in RGB space, weighted by Y (of YIQ) as + * the objective function; this accounts for differences in the + * color sensitivity of the eye. */ - + tmp = .30*(((int) desiredColorPtr->red) - (int) colorPtr->red); distance = tmp*tmp; tmp = .61*(((int) desiredColorPtr->green) - (int) colorPtr->green); @@ -328,8 +341,8 @@ FindClosestColor(tkwin, desiredColorPtr, actualColorPtr) } /* - * Couldn't allocate the color. Remove it from the table and - * go back to look for the next best color. + * Couldn't allocate the color. Remove it from the table and go back + * to look for the next best color. */ stressPtr->colorPtr[closest] = @@ -343,30 +356,29 @@ FindClosestColor(tkwin, desiredColorPtr, actualColorPtr) * * DeleteStressedCmap -- * - * This procedure releases the information cached for "colormap" - * so that it will be refetched from the X server the next time - * it is needed. + * This function releases the information cached for "colormap" so that + * it will be refetched from the X server the next time it is needed. * * Results: * None. * * Side effects: - * The TkStressedCmap structure for colormap is deleted; the - * colormap is no longer considered to be "stressed". + * The TkStressedCmap structure for colormap is deleted; the colormap is + * no longer considered to be "stressed". * * Note: - * This procedure is invoked whenever a color in a colormap is - * freed, and whenever a color allocation in a colormap succeeds. - * This guarantees that TkStressedCmap structures are always - * deleted before the corresponding Colormap is freed. + * This function is invoked whenever a color in a colormap is freed, and + * whenever a color allocation in a colormap succeeds. This guarantees + * that TkStressedCmap structures are always deleted before the + * corresponding Colormap is freed. * *---------------------------------------------------------------------- */ static void DeleteStressedCmap(display, colormap) - Display *display; /* Xlib's handle for the display - * containing the colormap. */ + Display *display; /* Xlib's handle for the display containing + * the colormap. */ Colormap colormap; /* Colormap to flush. */ { TkStressedCmap *prevPtr, *stressPtr; @@ -392,12 +404,11 @@ DeleteStressedCmap(display, colormap) * * TkpCmapStressed -- * - * Check to see whether a given colormap is known to be out - * of entries. + * Check to see whether a given colormap is known to be out of entries. * * Results: - * 1 is returned if "colormap" is stressed (i.e. it has run out - * of entries recently), 0 otherwise. + * 1 is returned if "colormap" is stressed (i.e. it has run out of + * entries recently), 0 otherwise. * * Side effects: * None. @@ -421,3 +432,11 @@ TkpCmapStressed(tkwin, colormap) } return 0; } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/xlib/rgb.txt b/xlib/rgb.txt index 67b979e..3b7ba4d 100755 --- a/xlib/rgb.txt +++ b/xlib/rgb.txt @@ -1,3 +1,13 @@ +! Changes compared to Xorg:rgb.txt +! name old value new value +! aqua - 0 255 255 +! crimson - 220 20 60 +! fuchsia - 255 0 255 +! indigo - 75 0 130 +! lime - 0 255 0 +! olive - 128 128 0 +! silver - 192 192 192 +! teal - 0 128 128 ! 240 248 255 aliceBlue 250 235 215 antiqueWhite @@ -5,6 +15,7 @@ 238 223 204 antiqueWhite2 205 192 176 antiqueWhite3 139 131 120 antiqueWhite4 + 0 255 255 aqua 127 255 212 aquamarine 127 255 212 aquamarine1 118 238 198 aquamarine2 @@ -65,6 +76,7 @@ 238 232 205 cornsilk2 205 200 177 cornsilk3 139 136 120 cornsilk4 +220 20 60 crimson 0 255 255 cyan 0 255 255 cyan1 0 238 238 cyan2 @@ -137,6 +149,7 @@ 139 26 26 firebrick4 255 250 240 floralWhite 34 139 34 forestGreen +255 0 255 fuchsia 220 220 220 gainsboro 248 248 255 ghostWhite 255 215 0 gold @@ -374,6 +387,7 @@ 238 99 99 indianRed2 205 85 85 indianRed3 139 58 58 indianRed4 + 75 0 130 indigo 255 255 240 ivory 255 255 240 ivory1 238 238 224 ivory2 @@ -445,6 +459,7 @@ 238 238 209 lightYellow2 205 205 180 lightYellow3 139 139 122 lightYellow4 + 0 255 0 lime 50 205 50 limeGreen 250 240 230 linen 255 0 255 magenta @@ -490,6 +505,7 @@ 0 0 128 navy 0 0 128 navyBlue 253 245 230 oldLace +128 128 0 olive 107 142 35 oliveDrab 192 255 62 oliveDrab1 179 238 58 oliveDrab2 @@ -586,6 +602,7 @@ 238 121 66 sienna2 205 104 57 sienna3 139 71 38 sienna4 +192 192 192 silver 135 206 235 skyBlue 135 206 255 skyBlue1 126 192 238 skyBlue2 @@ -622,6 +639,7 @@ 238 154 73 tan2 205 133 63 tan3 139 90 43 tan4 + 0 128 128 teal 216 191 216 thistle 255 225 255 thistle1 238 210 238 thistle2 diff --git a/xlib/xcolors.c b/xlib/xcolors.c index 497f251..70ab3cb 100755 --- a/xlib/xcolors.c +++ b/xlib/xcolors.c @@ -17,8 +17,8 @@ * Index array. For each of the characters 'a'-'y', this table gives the first color * starting with that character in the xColors table. */ -static const unsigned char az[] = {0, 4, 12, 19, 43, 44, 47, 57, 59, 61, - 62, 63, 86, 101, 104, 109, 120, 121, 124, 137, 141, 142, 144, 147, 148, 150}; +static const unsigned char az[] = {0, 5, 13, 21, 45, 46, 50, 60, 62, 65, 66, + 67, 91, 106, 109, 115, 126, 127, 130, 144, 149, 150, 152, 155, 156, 158}; /* * Define an array that defines the mapping from color names to RGB values. @@ -43,6 +43,7 @@ static const elem xColors[] = { /* Colors starting with 'a' */ "liceBlue\0 \360\370\377", "ntiqueWhite\0 \213\203\170\315\300\260\356\337\314\377\357\333\372\353\327\4", + "qua\0 \000\377\377", "quamarine\0 \105\213\164\146\315\252\166\356\306\177\377\324\177\377\324\4", "zure\0 \203\213\213\301\315\315\340\356\356\360\377\377\360\377\377\4", /* Colors starting with 'b' */ @@ -61,6 +62,7 @@ static const elem xColors[] = { "oral\0 \213\076\057\315\133\105\356\152\120\377\162\126\377\177\120\4", "ornflowerBlue\0 \144\225\355", "ornsilk\0 \213\210\170\315\310\261\356\350\315\377\370\334\377\370\334\4", + "rimson\0 \334\024\074", "yan\0 \000\213\213\000\315\315\000\356\356\000\377\377\000\377\377\4", /* Colors starting with 'd' */ "arkBlue\0 \000\000\213", @@ -93,6 +95,7 @@ static const elem xColors[] = { "irebrick\0 \213\032\032\315\046\046\356\054\054\377\060\060\262\042\042\4", "loralWhite\0 \377\372\360", "orestGreen\0 \042\213\042", + "uchsia\0 \377\000\377", /* Colors starting with 'g' */ "ainsboro\0 \334\334\334", "hostWhite\0 \370\370\377", @@ -111,6 +114,7 @@ static const elem xColors[] = { "otPink\0 \213\072\142\315\140\220\356\152\247\377\156\264\377\151\264\4", /* Colors starting with 'i' */ "ndianRed\0 \213\072\072\315\125\125\356\143\143\377\152\152\315\134\134\4", + "ndigo\0 \113\000\202", "vory\0 \213\213\203\315\315\301\356\356\340\377\377\360\377\377\360\4", /* Colors starting with 'j' */ "\377" /* placeholder */, @@ -138,6 +142,7 @@ static const elem xColors[] = { "ightSlateGrey\0 \167\210\231", "ightSteelBlue\0 \156\173\213\242\265\315\274\322\356\312\341\377\260\304\336\4", "ightYellow\0 \213\213\172\315\315\264\356\356\321\377\377\340\377\377\340\4", + "ime\0 \000\377\000", "imeGreen\0 \062\315\062", "inen\0 \372\360\346", /* Colors starting with 'm' */ @@ -162,6 +167,7 @@ static const elem xColors[] = { "avyBlue\0 \000\000\200", /* Colors starting with 'o' */ "ldLace\0 \375\365\346", + "live\0 \200\200\000", "liveDrab\0 \151\213\042\232\315\062\263\356\072\300\377\076\153\216\043\4", "range\0 \213\132\000\315\205\000\356\232\000\377\245\000\377\245\000\4", "rangeRed\0 \213\045\000\315\067\000\356\100\000\377\105\000\377\105\000\4", @@ -191,6 +197,7 @@ static const elem xColors[] = { "eaGreen\0 \056\213\127\103\315\200\116\356\224\124\377\237\056\213\127\4", "eashell\0 \213\206\202\315\305\277\356\345\336\377\365\356\377\365\356\4", "ienna\0 \213\107\046\315\150\071\356\171\102\377\202\107\240\122\055\4", + "ilver\0 \300\300\300", "kyBlue\0 \112\160\213\154\246\315\176\300\356\207\316\377\207\316\353\4", "lateBlue\0 \107\074\213\151\131\315\172\147\356\203\157\377\152\132\315\4", "lateGray\0 \154\173\213\237\266\315\271\323\356\306\342\377\160\200\220\4", @@ -200,6 +207,7 @@ static const elem xColors[] = { "teelBlue\0 \066\144\213\117\224\315\134\254\356\143\270\377\106\202\264\4", /* Colors starting with 't' */ "an\0 \213\132\053\315\205\077\356\232\111\377\245\117\322\264\214\4", + "eal\0 \000\200\200", "histle\0 \213\173\213\315\265\315\356\322\356\377\341\377\330\277\330\4", "omato\0 \213\066\046\315\117\071\356\134\102\377\143\107\377\143\107\4", "urquoise\0 \000\206\213\000\305\315\000\345\356\000\365\377\100\340\320\4", -- cgit v0.12