📄 tkwincolor.c
字号:
/* * tkWinColor.c -- * * Functions to map color names to system color values. * * Copyright (c) 1995 Sun Microsystems, Inc. * Copyright (c) 1994 Software Research Associates, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * SCCS: @(#) tkWinColor.c 1.20 97/10/27 16:39:23 */#include <tkColor.h>#include <tkWinInt.h>/* * The following structure is used to keep track of each color that is * allocated by this module. */typedef struct WinColor { TkColor info; /* Generic color information. */ int index; /* Index for GetSysColor(), -1 if color * is not a "live" system color. */} WinColor;/* * colorTable is a hash table used to look up X colors by name. */static Tcl_HashTable colorTable;/* * The sysColors array contains the names and index values for the * Windows indirect system color names. In use, all of the names * will have the string "System" prepended, but we omit it in the table * to save space. */typedef struct { char *name; int index;} SystemColorEntry;static SystemColorEntry sysColors[] = { "3dDarkShadow", COLOR_3DDKSHADOW, "3dLight", COLOR_3DLIGHT, "ActiveBorder", COLOR_ACTIVEBORDER, "ActiveCaption", COLOR_ACTIVECAPTION, "AppWorkspace", COLOR_APPWORKSPACE, "Background", COLOR_BACKGROUND, "ButtonFace", COLOR_BTNFACE, "ButtonHighlight", COLOR_BTNHIGHLIGHT, "ButtonShadow", COLOR_BTNSHADOW, "ButtonText", COLOR_BTNTEXT, "CaptionText", COLOR_CAPTIONTEXT, "DisabledText", COLOR_GRAYTEXT, "GrayText", COLOR_GRAYTEXT, "Highlight", COLOR_HIGHLIGHT, "HighlightText", COLOR_HIGHLIGHTTEXT, "InactiveBorder", COLOR_INACTIVEBORDER, "InactiveCaption", COLOR_INACTIVECAPTION, "InactiveCaptionText", COLOR_INACTIVECAPTIONTEXT, "InfoBackground", COLOR_INFOBK, "InfoText", COLOR_INFOTEXT, "Menu", COLOR_MENU, "MenuText", COLOR_MENUTEXT, "Scrollbar", COLOR_SCROLLBAR, "Window", COLOR_WINDOW, "WindowFrame", COLOR_WINDOWFRAME, "WindowText", COLOR_WINDOWTEXT, NULL, 0};static int ncolors = 0;/* * Forward declarations for functions defined later in this file. */static int FindSystemColor _ANSI_ARGS_((const char *name, XColor *colorPtr, int *indexPtr));static int GetColorByName _ANSI_ARGS_((char *name, XColor *color));static int GetColorByValue _ANSI_ARGS_((char *value, XColor *color));/* *---------------------------------------------------------------------- * * FindSystemColor -- * * This routine finds the color entry that corresponds to the * specified color. * * Results: * Returns non-zero on success. The RGB values of the XColor * will be initialized to the proper values on success. * * Side effects: * None. * *---------------------------------------------------------------------- */static intFindSystemColor(name, colorPtr, indexPtr) const char *name; /* Color name. */ XColor *colorPtr; /* Where to store results. */ int *indexPtr; /* Out parameter to store color index. */{ int l, u, r, i; /* * Count the number of elements in the color array if we haven't * done so yet. */ if (ncolors == 0) { SystemColorEntry *ePtr; int version; version = LOBYTE(LOWORD(GetVersion())); for (ePtr = sysColors; ePtr->name != NULL; ePtr++) { if (version < 4) { if (ePtr->index == COLOR_3DDKSHADOW) { ePtr->index = COLOR_BTNSHADOW; } else if (ePtr->index == COLOR_3DLIGHT) { ePtr->index = COLOR_BTNHIGHLIGHT; } } ncolors++; } } /* * Perform a binary search on the sorted array of colors. */ l = 0; u = ncolors - 1; while (l <= u) { i = (l + u) / 2; r = strcasecmp(name, sysColors[i].name); if (r == 0) { break; } else if (r < 0) { u = i-1; } else { l = i+1; } } if (l > u) { return 0; } *indexPtr = sysColors[i].index; colorPtr->pixel = GetSysColor(sysColors[i].index); colorPtr->red = GetRValue(colorPtr->pixel) << 8; colorPtr->green = GetGValue(colorPtr->pixel) << 8; colorPtr->blue = GetBValue(colorPtr->pixel) << 8; colorPtr->flags = DoRed|DoGreen|DoBlue; colorPtr->pad = 0; return 1;}/* *---------------------------------------------------------------------- * * TkpGetColor -- * * Allocate a new TkColor for the color with the given name. * * Results: * Returns a newly allocated TkColor, or NULL on failure. * * Side effects: * May invalidate the colormap cache associated with tkwin upon * allocating a new colormap entry. Allocates a new TkColor * structure. * *---------------------------------------------------------------------- */TkColor *TkpGetColor(tkwin, name) Tk_Window tkwin; /* Window in which color will be used. */ Tk_Uid name; /* Name of color to allocated (in form * suitable for passing to XParseColor). */{ WinColor *winColPtr; XColor color; int index = -1; /* -1 indicates that this is not an indirect * sytem color. */ /* * Check to see if it is a system color or an X color string. If the * color is found, allocate a new WinColor and store the XColor and the * system color index. */ if (((strncasecmp(name, "system", 6) == 0) && FindSystemColor(name+6, &color, &index)) || XParseColor(Tk_Display(tkwin), Tk_Colormap(tkwin), name, &color)) { winColPtr = (WinColor *) ckalloc(sizeof(WinColor)); winColPtr->info.color = color; winColPtr->index = index; XAllocColor(Tk_Display(tkwin), Tk_Colormap(tkwin), &winColPtr->info.color); return (TkColor *) winColPtr; } return (TkColor *) NULL;}/* *---------------------------------------------------------------------- * * 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. * * 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. * * Side effects: * May invalidate the colormap cache for the specified window. * Allocates a new TkColor structure. * *---------------------------------------------------------------------- */TkColor *TkpGetColorByValue(tkwin, colorPtr) Tk_Window tkwin; /* Window in which color will be used. */ XColor *colorPtr; /* Red, green, and blue fields indicate * desired color. */{ WinColor *tkColPtr = (WinColor *) ckalloc(sizeof(WinColor)); tkColPtr->info.color.red = colorPtr->red; tkColPtr->info.color.green = colorPtr->green; tkColPtr->info.color.blue = colorPtr->blue; tkColPtr->info.color.pixel = 0; tkColPtr->index = -1; XAllocColor(Tk_Display(tkwin), Tk_Colormap(tkwin), &tkColPtr->info.color); return (TkColor *) tkColPtr;}/* *---------------------------------------------------------------------- * * TkpFreeColor -- * * Release the specified color back to the system. * * Results: * None * * Side effects: * Invalidates the colormap cache for the colormap associated with * the given color. * *---------------------------------------------------------------------- */voidTkpFreeColor(tkColPtr) TkColor *tkColPtr; /* Color to be released. Must have been * allocated by TkpGetColor or * TkpGetColorByValue. */{ Screen *screen = tkColPtr->screen; XFreeColors(DisplayOfScreen(screen), tkColPtr->colormap, &tkColPtr->color.pixel, 1, 0L);}/* *---------------------------------------------------------------------- * * TkWinIndexOfColor -- * * Given a color, return the system color index that was used * to create the color. * * Results: * If the color was allocated using a system indirect color name, * then the corresponding GetSysColor() index is returned. * Otherwise, -1 is returned. * * Side effects: * None. * *---------------------------------------------------------------------- */intTkWinIndexOfColor(colorPtr) XColor *colorPtr;{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -