diff options
Diffstat (limited to 'win/tkWinColor.c')
-rw-r--r-- | win/tkWinColor.c | 302 |
1 files changed, 141 insertions, 161 deletions
diff --git a/win/tkWinColor.c b/win/tkWinColor.c index 088c216..d93143d 100644 --- a/win/tkWinColor.c +++ b/win/tkWinColor.c @@ -1,4 +1,4 @@ -/* +/* * tkWinColor.c -- * * Functions to map color names to system color values. @@ -6,8 +6,8 @@ * 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. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tkWinInt.h" @@ -20,24 +20,22 @@ typedef struct WinColor { TkColor info; /* Generic color information. */ - int index; /* Index for GetSysColor(), -1 if color - * is not a "live" system color. */ + int index; /* Index for GetSysColor(), -1 if color is not + * a "live" system color. */ } WinColor; /* - * 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. + * 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; + const char *name; int index; } SystemColorEntry; - -static SystemColorEntry sysColors[] = { +static const SystemColorEntry sysColors[] = { {"3dDarkShadow", COLOR_3DDKSHADOW}, {"3dLight", COLOR_3DLIGHT}, {"ActiveBorder", COLOR_ACTIVEBORDER}, @@ -50,46 +48,40 @@ static SystemColorEntry sysColors[] = { {"ButtonText", COLOR_BTNTEXT}, {"CaptionText", COLOR_CAPTIONTEXT}, {"DisabledText", COLOR_GRAYTEXT}, - {"GrayText", 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}, + {"InfoText", COLOR_INFOTEXT}, {"Menu", COLOR_MENU}, - {"MenuText", COLOR_MENUTEXT}, + {"MenuText", COLOR_MENUTEXT}, {"Scrollbar", COLOR_SCROLLBAR}, {"Window", COLOR_WINDOW}, {"WindowFrame", COLOR_WINDOWFRAME}, - {"WindowText", COLOR_WINDOWTEXT}, - {NULL, 0} + {"WindowText", COLOR_WINDOWTEXT} }; -typedef struct ThreadSpecificData { - int ncolors; -} ThreadSpecificData; -static Tcl_ThreadDataKey dataKey; - /* * Forward declarations for functions defined later in this file. */ -static int FindSystemColor _ANSI_ARGS_((const char *name, - XColor *colorPtr, int *indexPtr)); +static int FindSystemColor(const char *name, XColor *colorPtr, + int *indexPtr); /* *---------------------------------------------------------------------- * * FindSystemColor -- * - * This routine finds the color entry that corresponds to the - * specified color. + * 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. + * Returns non-zero on success. The RGB values of the XColor will be + * initialized to the proper values on success. * * Side effects: * None. @@ -98,43 +90,21 @@ static int FindSystemColor _ANSI_ARGS_((const char *name, */ static int -FindSystemColor(name, colorPtr, indexPtr) - const char *name; /* Color name. */ - XColor *colorPtr; /* Where to store results. */ - int *indexPtr; /* Out parameter to store color index. */ +FindSystemColor( + const char *name, /* Color name. */ + XColor *colorPtr, /* Where to store results. */ + int *indexPtr) /* Out parameter to store color index. */ { int l, u, r, i; - ThreadSpecificData *tsdPtr = (ThreadSpecificData *) - Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); - - /* - * Count the number of elements in the color array if we haven't - * done so yet. - */ - - if (tsdPtr->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; - } - } - tsdPtr->ncolors++; - } - } + int index; + int version = LOBYTE(LOWORD(GetVersion())); /* * Perform a binary search on the sorted array of colors. */ l = 0; - u = tsdPtr->ncolors - 1; + u = (sizeof(sysColors) / sizeof(sysColors[0])) - 1; while (l <= u) { i = (l + u) / 2; r = strcasecmp(name, sysColors[i].name); @@ -150,12 +120,22 @@ FindSystemColor(name, colorPtr, indexPtr) return 0; } - *indexPtr = sysColors[i].index; - colorPtr->pixel = GetSysColor(sysColors[i].index); + index = sysColors[i].index; + if (version < 4) { + if (index == COLOR_3DDKSHADOW) { + index = COLOR_BTNSHADOW; + } else if (index == COLOR_3DLIGHT) { + index = COLOR_BTNHIGHLIGHT; + } + } + *indexPtr = index; + colorPtr->pixel = GetSysColor(index); + /* - * x257 is (value<<8 + value) to get the properly bit shifted - * and padded value. [Bug: 4919] + * x257 is (value<<8 + value) to get the properly bit shifted and padded + * value. [Bug: 4919] */ + colorPtr->red = GetRValue(colorPtr->pixel) * 257; colorPtr->green = GetGValue(colorPtr->pixel) * 257; colorPtr->blue = GetBValue(colorPtr->pixel) * 257; @@ -176,40 +156,39 @@ FindSystemColor(name, colorPtr, indexPtr) * * 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. * *---------------------------------------------------------------------- */ TkColor * -TkpGetColor(tkwin, name) - Tk_Window tkwin; /* Window in which color will be used. */ - Tk_Uid name; /* Name of color to allocated (in form +TkpGetColor( + 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. */ + * system 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. + * 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)) || TkParseColor(Tk_Display(tkwin), Tk_Colormap(tkwin), name, &color)) { - winColPtr = (WinColor *) ckalloc(sizeof(WinColor)); + winColPtr = 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 *) winColPtr; } return (TkColor *) NULL; } @@ -219,30 +198,29 @@ 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. * *---------------------------------------------------------------------- */ TkColor * -TkpGetColorByValue(tkwin, colorPtr) - Tk_Window tkwin; /* Window in which color will be used. */ - XColor *colorPtr; /* Red, green, and blue fields indicate +TkpGetColorByValue( + 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)); + WinColor *tkColPtr = ckalloc(sizeof(WinColor)); tkColPtr->info.color.red = colorPtr->red; tkColPtr->info.color.green = colorPtr->green; @@ -264,15 +242,15 @@ TkpGetColorByValue(tkwin, colorPtr) * 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. * *---------------------------------------------------------------------- */ void -TkpFreeColor(tkColPtr) - TkColor *tkColPtr; /* Color to be released. Must have been +TkpFreeColor( + TkColor *tkColPtr) /* Color to be released. Must have been * allocated by TkpGetColor or * TkpGetColorByValue. */ { @@ -287,13 +265,13 @@ TkpFreeColor(tkColPtr) * * TkWinIndexOfColor -- * - * Given a color, return the system color index that was used - * to create the color. + * 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. + * 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. @@ -302,13 +280,13 @@ TkpFreeColor(tkColPtr) */ int -TkWinIndexOfColor(colorPtr) - XColor *colorPtr; +TkWinIndexOfColor( + XColor *colorPtr) { register WinColor *winColPtr = (WinColor *) colorPtr; if (winColPtr->info.magic == COLOR_MAGIC) { return winColPtr->index; - } + } return -1; } @@ -320,8 +298,8 @@ TkWinIndexOfColor(colorPtr) * Find the closest available color to the specified XColor. * * Results: - * Updates the color argument and returns 1 on success. Otherwise - * returns 0. + * Updates the color argument and returns 1 on success. Otherwise returns + * 0. * * Side effects: * Allocates a new color in the palette. @@ -330,10 +308,10 @@ TkWinIndexOfColor(colorPtr) */ int -XAllocColor(display, colormap, color) - Display* display; - Colormap colormap; - XColor* color; +XAllocColor( + Display *display, + Colormap colormap, + XColor *color) { TkWinColormap *cmap = (TkWinColormap *) colormap; PALETTEENTRY entry, closeEntry; @@ -354,7 +332,7 @@ XAllocColor(display, colormap, color) /* * Find the nearest existing palette entry. */ - + newPixel = RGB(entry.peRed, entry.peGreen, entry.peBlue); index = GetNearestPaletteIndex(cmap->palette, newPixel); GetPaletteEntries(cmap->palette, index, 1, &closeEntry); @@ -362,15 +340,14 @@ XAllocColor(display, colormap, color) closeEntry.peBlue); /* - * If this is not a duplicate, allocate a new entry. Note that - * we may get values for index that are above the current size - * of the palette. This happens because we don't shrink the size of - * the palette object when we deallocate colors so there may be - * stale values that match in the upper slots. We should ignore - * those values and just put the new color in as if the colors - * had not matched. + * If this is not a duplicate, allocate a new entry. Note that we may + * get values for index that are above the current size of the + * palette. This happens because we don't shrink the size of the + * palette object when we deallocate colors so there may be stale + * values that match in the upper slots. We should ignore those values + * and just put the new color in as if the colors had not matched. */ - + if ((index >= cmap->size) || (newPixel != closePixel)) { if (cmap->size == sizePalette) { color->red = closeEntry.peRed * 257; @@ -378,7 +355,7 @@ XAllocColor(display, colormap, color) color->blue = closeEntry.peBlue * 257; entry = closeEntry; if (index >= cmap->size) { - OutputDebugString("XAllocColor: Colormap is bigger than we thought"); + OutputDebugStringA("XAllocColor: Colormap is bigger than we thought"); } } else { cmap->size++; @@ -389,19 +366,18 @@ XAllocColor(display, colormap, color) color->pixel = PALETTERGB(entry.peRed, entry.peGreen, entry.peBlue); entryPtr = Tcl_CreateHashEntry(&cmap->refCounts, - (char *) color->pixel, &new); + INT2PTR(color->pixel), &new); if (new) { refCount = 1; } else { - refCount = ((int) Tcl_GetHashValue(entryPtr)) + 1; + refCount = (PTR2INT(Tcl_GetHashValue(entryPtr))) + 1; } - Tcl_SetHashValue(entryPtr, (ClientData)refCount); + Tcl_SetHashValue(entryPtr, INT2PTR(refCount)); } else { - /* * Determine what color will actually be used on non-colormap systems. */ - + color->pixel = GetNearestColor(dc, RGB(entry.peRed, entry.peGreen, entry.peBlue)); color->red = GetRValue(color->pixel) * 257; @@ -424,19 +400,19 @@ XAllocColor(display, colormap, color) * None. * * Side effects: - * Removes entries for the current palette and compacts the - * remaining set. + * Removes entries for the current palette and compacts the remaining + * set. * *---------------------------------------------------------------------- */ void -XFreeColors(display, colormap, pixels, npixels, planes) - Display* display; - Colormap colormap; - unsigned long* pixels; - int npixels; - unsigned long planes; +XFreeColors( + Display *display, + Colormap colormap, + unsigned long *pixels, + int npixels, + unsigned long planes) { TkWinColormap *cmap = (TkWinColormap *) colormap; COLORREF cref; @@ -449,38 +425,35 @@ XFreeColors(display, colormap, pixels, npixels, planes) /* * We don't have to do anything for non-palette devices. */ - - if (GetDeviceCaps(dc, RASTERCAPS) & RC_PALETTE) { + if (GetDeviceCaps(dc, RASTERCAPS) & RC_PALETTE) { /* * This is really slow for large values of npixels. */ for (i = 0; i < npixels; i++) { - entryPtr = Tcl_FindHashEntry(&cmap->refCounts, - (char *) pixels[i]); + entryPtr = Tcl_FindHashEntry(&cmap->refCounts, INT2PTR(pixels[i])); if (!entryPtr) { - panic("Tried to free a color that isn't allocated."); + Tcl_Panic("Tried to free a color that isn't allocated"); } - refCount = (int) Tcl_GetHashValue(entryPtr) - 1; + refCount = PTR2INT(Tcl_GetHashValue(entryPtr)) - 1; if (refCount == 0) { cref = pixels[i] & 0x00ffffff; index = GetNearestPaletteIndex(cmap->palette, cref); GetPaletteEntries(cmap->palette, index, 1, &entry); if (cref == RGB(entry.peRed, entry.peGreen, entry.peBlue)) { count = cmap->size - index; - entries = (PALETTEENTRY *) ckalloc(sizeof(PALETTEENTRY) - * count); + entries = ckalloc(sizeof(PALETTEENTRY) * count); GetPaletteEntries(cmap->palette, index+1, count, entries); SetPaletteEntries(cmap->palette, index, count, entries); - ckfree((char *) entries); + ckfree(entries); cmap->size--; } else { - panic("Tried to free a color that isn't allocated."); + Tcl_Panic("Tried to free a color that isn't allocated"); } Tcl_DeleteHashEntry(entryPtr); } else { - Tcl_SetHashValue(entryPtr, (ClientData)refCount); + Tcl_SetHashValue(entryPtr, INT2PTR(refCount)); } } } @@ -504,11 +477,11 @@ XFreeColors(display, colormap, pixels, npixels, planes) */ Colormap -XCreateColormap(display, w, visual, alloc) - Display* display; - Window w; - Visual* visual; - int alloc; +XCreateColormap( + Display *display, + Window w, + Visual *visual, + int alloc) { char logPalBuf[sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY)]; LOGPALETTE *logPalettePtr; @@ -529,7 +502,7 @@ XCreateColormap(display, w, visual, alloc) logPalettePtr->palNumEntries = GetPaletteEntries(sysPal, 0, 256, logPalettePtr->palPalEntry); - cmap = (TkWinColormap *) ckalloc(sizeof(TkWinColormap)); + cmap = ckalloc(sizeof(TkWinColormap)); cmap->size = logPalettePtr->palNumEntries; cmap->stale = 0; cmap->palette = CreatePalette(logPalettePtr); @@ -541,9 +514,9 @@ XCreateColormap(display, w, visual, alloc) Tcl_InitHashTable(&cmap->refCounts, TCL_ONE_WORD_KEYS); for (i = 0; i < logPalettePtr->palNumEntries; i++) { entryPtr = logPalettePtr->palPalEntry + i; - hashPtr = Tcl_CreateHashEntry(&cmap->refCounts, (char*) PALETTERGB( - entryPtr->peRed, entryPtr->peGreen, entryPtr->peBlue), &new); - Tcl_SetHashValue(hashPtr, (ClientData)1); + hashPtr = Tcl_CreateHashEntry(&cmap->refCounts, INT2PTR(PALETTERGB( + entryPtr->peRed, entryPtr->peGreen, entryPtr->peBlue)), &new); + Tcl_SetHashValue(hashPtr, INT2PTR(1)); } return (Colormap)cmap; @@ -560,24 +533,24 @@ XCreateColormap(display, w, visual, alloc) * None. * * Side effects: - * Deletes the palette associated with the colormap. Note that - * the palette must not be selected into a device context when - * this occurs. + * Deletes the palette associated with the colormap. Note that the + * palette must not be selected into a device context when this occurs. * *---------------------------------------------------------------------- */ void -XFreeColormap(display, colormap) - Display* display; - Colormap colormap; +XFreeColormap( + Display *display, + Colormap colormap) { TkWinColormap *cmap = (TkWinColormap *) colormap; + if (!DeleteObject(cmap->palette)) { - panic("Unable to free colormap, palette is still selected."); + Tcl_Panic("Unable to free colormap, palette is still selected"); } Tcl_DeleteHashTable(&cmap->refCounts); - ckfree((char *) cmap); + ckfree(cmap); } /* @@ -585,10 +558,9 @@ XFreeColormap(display, colormap) * * TkWinSelectPalette -- * - * This function sets up the specified device context with a - * given palette. If the palette is stale, it realizes it in - * the background unless the palette is the current global - * palette. + * This function sets up the specified device context with a given + * palette. If the palette is stale, it realizes it in the background + * unless the palette is the current global palette. * * Results: * Returns the previous palette selected into the device context. @@ -600,9 +572,9 @@ XFreeColormap(display, colormap) */ HPALETTE -TkWinSelectPalette(dc, colormap) - HDC dc; - Colormap colormap; +TkWinSelectPalette( + HDC dc, + Colormap colormap) { TkWinColormap *cmap = (TkWinColormap *) colormap; HPALETTE oldPalette; @@ -612,3 +584,11 @@ TkWinSelectPalette(dc, colormap) RealizePalette(dc); return oldPalette; } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ |