summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2012-02-15 20:33:58 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2012-02-15 20:33:58 (GMT)
commit05750b46ee02ad06be61476b42f8a1a8d8a87597 (patch)
tree31fe161db5699e5d076d9a6dbf02882e9db7aad0 /generic
parentd0aa23eb9005cbc9b4e706ab70b5082be80bad35 (diff)
parent505d8dc8bc999b995961dbd32c518620d843bdfe (diff)
downloadtk-05750b46ee02ad06be61476b42f8a1a8d8a87597.zip
tk-05750b46ee02ad06be61476b42f8a1a8d8a87597.tar.gz
tk-05750b46ee02ad06be61476b42f8a1a8d8a87597.tar.bz2
[Bug 3486474]: Inconsistent color scaling
Diffstat (limited to 'generic')
-rw-r--r--generic/tkColor.c55
-rw-r--r--generic/tkCursor.c4
-rw-r--r--generic/tkImgBmap.c4
-rw-r--r--generic/tkImgPhoto.c2
-rw-r--r--generic/tkInt.h7
-rw-r--r--generic/tkStubInit.c6
6 files changed, 73 insertions, 5 deletions
diff --git a/generic/tkColor.c b/generic/tkColor.c
index f06c43f..8893dfe 100644
--- a/generic/tkColor.c
+++ b/generic/tkColor.c
@@ -809,3 +809,58 @@ TkDebugColor(tkwin, name)
}
return resultPtr;
}
+
+#ifndef __WIN32__
+/* This function is not necessary for Win32,
+ * since XParseColor already does the right thing */
+Status
+TkParseColor(display, map, spec, colorPtr)
+ Display * display; /* The display */
+ Colormap map; /* Color map */
+ _Xconst char* spec; /* String to be parsed */
+ XColor * colorPtr;
+{
+ if (*spec == '#') {
+ char buf[14];
+ buf[0] = '#'; buf[13] = '\0';
+ if (!*(++spec) || !*(++spec) || !*(++spec)) {
+ /* Not at least 3 hex digits, so invalid */
+ return 0;
+ } else if (!*(++spec)) {
+ /* Exactly 3 hex digits */
+ buf[9] = buf[10] = buf[11] = buf[12] = *(--spec);
+ buf[5] = buf[6] = buf[7] = buf[8] = *(--spec);
+ buf[1] = buf[2] = buf[3] = buf[4] = *(--spec);
+ spec = buf;
+ } else if (!*(++spec) || !*(++spec)) {
+ /* Not at least 6 hex digits, so invalid */
+ return 0;
+ } else if (!*(++spec)) {
+ /* Exactly 6 hex digits */
+ buf[10] = buf[12] = *(--spec);
+ buf[9] = buf[11] = *(--spec);
+ buf[6] = buf[8] = *(--spec);
+ buf[5] = buf[7] = *(--spec);
+ buf[2] = buf[4] = *(--spec);
+ buf[1] = buf[3] = *(--spec);
+ spec = buf;
+ } else if (!*(++spec) || !*(++spec)) {
+ /* Not at least 9 hex digits, so invalid */
+ return 0;
+ } else if (!*(++spec)) {
+ /* Exactly 9 hex digits */
+ buf[11] = *(--spec);
+ buf[10] = *(--spec);
+ buf[9] = buf[12] = *(--spec);
+ buf[7] = *(--spec);
+ buf[6] = *(--spec);
+ buf[5] = buf[8] = *(--spec);
+ buf[3] = *(--spec);
+ buf[2] = *(--spec);
+ buf[1] = buf[4] = *(--spec);
+ spec = buf;
+ }
+ }
+ return XParseColor(display, map, spec, colorPtr);
+}
+#endif /* __WIN32__ */
diff --git a/generic/tkCursor.c b/generic/tkCursor.c
index 466d0ef..f599083 100644
--- a/generic/tkCursor.c
+++ b/generic/tkCursor.c
@@ -357,12 +357,12 @@ Tk_GetCursorFromData(interp, tkwin, source, mask, width, height,
* available and add it to the database.
*/
- if (XParseColor(dataKey.display, Tk_Colormap(tkwin), fg, &fgColor) == 0) {
+ if (TkParseColor(dataKey.display, Tk_Colormap(tkwin), fg, &fgColor) == 0) {
Tcl_AppendResult(interp, "invalid color name \"", fg, "\"",
(char *) NULL);
goto error;
}
- if (XParseColor(dataKey.display, Tk_Colormap(tkwin), bg, &bgColor) == 0) {
+ if (TkParseColor(dataKey.display, Tk_Colormap(tkwin), bg, &bgColor) == 0) {
Tcl_AppendResult(interp, "invalid color name \"", bg, "\"",
(char *) NULL);
goto error;
diff --git a/generic/tkImgBmap.c b/generic/tkImgBmap.c
index 99ae050..e1ccecb 100644
--- a/generic/tkImgBmap.c
+++ b/generic/tkImgBmap.c
@@ -1266,7 +1266,7 @@ ImgBmapPostscript(clientData, interp, tkwin, psinfo, x, y, width, height,
*/
if ((masterPtr->bgUid != NULL) && (masterPtr->bgUid[0] != '\000')) {
XColor color;
- XParseColor(Tk_Display(tkwin), Tk_Colormap(tkwin), masterPtr->bgUid,
+ TkParseColor(Tk_Display(tkwin), Tk_Colormap(tkwin), masterPtr->bgUid,
&color);
if (Tk_PostscriptColor(interp, psinfo, &color) != TCL_OK) {
return TCL_ERROR;
@@ -1286,7 +1286,7 @@ ImgBmapPostscript(clientData, interp, tkwin, psinfo, x, y, width, height,
*/
if ( (masterPtr->fgUid != NULL) && (masterPtr->data != NULL) ) {
XColor color;
- XParseColor(Tk_Display(tkwin), Tk_Colormap(tkwin), masterPtr->fgUid,
+ TkParseColor(Tk_Display(tkwin), Tk_Colormap(tkwin), masterPtr->fgUid,
&color);
if (Tk_PostscriptColor(interp, psinfo, &color) != TCL_OK) {
return TCL_ERROR;
diff --git a/generic/tkImgPhoto.c b/generic/tkImgPhoto.c
index 80b44d7..ffbb47c 100644
--- a/generic/tkImgPhoto.c
+++ b/generic/tkImgPhoto.c
@@ -1150,7 +1150,7 @@ ImgPhotoCmd(clientData, interp, objc, objv)
break;
}
for (x = 0; x < dataWidth; ++x) {
- if (!XParseColor(Tk_Display(tkwin), Tk_Colormap(tkwin),
+ if (!TkParseColor(Tk_Display(tkwin), Tk_Colormap(tkwin),
listArgv[x], &color)) {
Tcl_AppendResult(interp, "can't parse color \"",
listArgv[x], "\"", (char *) NULL);
diff --git a/generic/tkInt.h b/generic/tkInt.h
index 777201e..c274236 100644
--- a/generic/tkInt.h
+++ b/generic/tkInt.h
@@ -1213,6 +1213,13 @@ EXTERN int TkParsePadAmount _ANSI_ARGS_((Tcl_Interp *interp,
Tk_Window tkwin, Tcl_Obj *objPtr,
int *pad1Ptr, int *pad2Ptr));
EXTERN int TkpAlwaysShowSelection _ANSI_ARGS_((Tk_Window tkwin));
+#ifdef __WIN32__
+#define TkParseColor XParseColor
+#else
+EXTERN Status TkParseColor _ANSI_ARGS_((Display * display,
+ Colormap map, _Xconst char* spec,
+ XColor * colorPtr));
+#endif
/*
* Unsupported commands.
diff --git a/generic/tkStubInit.c b/generic/tkStubInit.c
index 6df1f2d..a82e044 100644
--- a/generic/tkStubInit.c
+++ b/generic/tkStubInit.c
@@ -46,6 +46,12 @@
#define Tk_GetCanvasVisitor ((VOID * (*) _ANSI_ARGS_((Tcl_Interp * interp, \
CONST char * name))) NULL)
+#ifndef __WIN32__
+/* Make sure that extensions which call XParseColor through
+ * the stub table, call TkParseColor in stead. See bug #3486474 */
+# define XParseColor TkParseColor
+#endif
+
/*
* WARNING: The contents of this file is automatically generated by the
* tools/genStubs.tcl script. Any modifications to the function declarations