summaryrefslogtreecommitdiffstats
path: root/xlib
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 /xlib
parentd0aa23eb9005cbc9b4e706ab70b5082be80bad35 (diff)
parent505d8dc8bc999b995961dbd32c518620d843bdfe (diff)
downloadtk-05750b46ee02ad06be61476b42f8a1a8d8a87597.zip
tk-05750b46ee02ad06be61476b42f8a1a8d8a87597.tar.gz
tk-05750b46ee02ad06be61476b42f8a1a8d8a87597.tar.bz2
[Bug 3486474]: Inconsistent color scaling
Diffstat (limited to 'xlib')
-rw-r--r--xlib/xcolors.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/xlib/xcolors.c b/xlib/xcolors.c
index 32c53bd..7e88b2a 100644
--- a/xlib/xcolors.c
+++ b/xlib/xcolors.c
@@ -882,24 +882,33 @@ XParseColor(display, map, spec, colorPtr)
XColor *colorPtr;
{
if (spec[0] == '#') {
- char fmt[16];
- int i, red, green, blue;
+ char *p;
+ Tcl_WideInt value = _strtoi64(++spec, &p, 16);
- if ((i = (int) strlen(spec+1))%3) {
- return 0;
- }
- i /= 3;
-
- sprintf(fmt, "%%%dx%%%dx%%%dx", i, i, i);
- if (sscanf(spec+1, fmt, &red, &green, &blue) != 3) {
+ switch ((int)(p-spec)) {
+ case 3:
+ colorPtr->red = (unsigned short) (((value >> 8) & 0xf) * 0x1111);
+ colorPtr->green = (unsigned short) (((value >> 4) & 0xf) * 0x1111);
+ colorPtr->blue = (unsigned short) ((value & 0xf) * 0x1111);
+ break;
+ case 6:
+ colorPtr->red = (unsigned short) (((value >> 16) & 0xff) | ((value >> 8) & 0xff00));
+ colorPtr->green = (unsigned short) (((value >> 8) & 0xff) | (value & 0xff00));
+ colorPtr->blue = (unsigned short) ((value & 0xff) | (value << 8));
+ break;
+ case 9:
+ colorPtr->red = (unsigned short) (((value >> 32) & 0xf) | ((value >> 20) & 0xfff0));
+ colorPtr->green = (unsigned short) (((value >> 20) & 0xf) | ((value >> 8) & 0xfff0));
+ colorPtr->blue = (unsigned short) (((value >> 8) & 0xf) | (value << 4));
+ break;
+ case 12:
+ colorPtr->red = (unsigned short) (value >> 32);
+ colorPtr->green = (unsigned short) (value >> 16);
+ colorPtr->blue = (unsigned short) value;
+ break;
+ default:
return 0;
}
- colorPtr->red = (((unsigned short) red) << (4 * (4 - i)))
- | ((unsigned short) red);
- colorPtr->green = (((unsigned short) green) << (4 * (4 - i)))
- | ((unsigned short) green);
- colorPtr->blue = (((unsigned short) blue) << (4 * (4 - i)))
- | ((unsigned short) blue);
} else {
if (!FindColor(spec, colorPtr)) {
return 0;