]> git.eshelyaron.com Git - emacs.git/commitdiff
(w32_color_map_lookup): New function.
authorGeoff Voelker <voelker@cs.washington.edu>
Thu, 24 Sep 1998 02:14:55 +0000 (02:14 +0000)
committerGeoff Voelker <voelker@cs.washington.edu>
Thu, 24 Sep 1998 02:14:55 +0000 (02:14 +0000)
(x_to_w32_color): Approximate colors ending in numbers if necessary.

src/w32fns.c

index ea683d08fefe3fd538900a3816009b17c18add28..1253ecda0a7ac4950d0974f4069ab5d3cb2fe16d 100644 (file)
@@ -1266,6 +1266,38 @@ w32_to_x_color (rgb)
     return Qnil;
 }
 
+COLORREF
+w32_color_map_lookup (colorname)
+     char *colorname;
+{
+  Lisp_Object tail, ret = Qnil;
+
+  BLOCK_INPUT;
+
+  for (tail = Vw32_color_map; !NILP (tail); tail = Fcdr (tail))
+    {
+      register Lisp_Object elt, tem;
+
+      elt = Fcar (tail);
+      if (!CONSP (elt)) continue;
+
+      tem = Fcar (elt);
+
+      if (lstrcmpi (XSTRING (tem)->data, colorname) == 0)
+       {
+         ret = XUINT (Fcdr (elt));
+         break;
+       }
+
+      QUIT;
+    }
+
+
+  UNBLOCK_INPUT;
+
+  return ret;
+}
+
 COLORREF 
 x_to_w32_color (colorname)
      char * colorname;
@@ -1430,27 +1462,30 @@ x_to_w32_color (colorname)
   /* I am not going to attempt to handle any of the CIE color schemes
      or TekHVC, since I don't know the algorithms for conversion to
      RGB.  */
-  
-  for (tail = Vw32_color_map; !NILP (tail); tail = Fcdr (tail))
+
+  /* If we fail to lookup the color name in w32_color_map, then check the
+     colorname to see if it can be crudely approximated: If the X color 
+     ends in a number (e.g., "darkseagreen2"), strip the number and
+     return the result of looking up the base color name.  */
+  ret = w32_color_map_lookup (colorname);
+  if (NILP (ret)) 
     {
-      register Lisp_Object elt, tem;
+      int len = strlen (colorname);
 
-      elt = Fcar (tail);
-      if (!CONSP (elt)) continue;
+      if (isdigit (colorname[len - 1])) 
+       {
+         char *ptr, *approx = alloca (len);
 
-      tem = Fcar (elt);
+         strcpy (approx, colorname);
+         ptr = &approx[len - 1];
+         while (ptr > approx && isdigit (*ptr)) 
+             *ptr-- = '\0';
 
-      if (lstrcmpi (XSTRING (tem)->data, colorname) == 0)
-       {
-         ret = XUINT(Fcdr (elt));
-         break;
+         ret = w32_color_map_lookup (approx);
        }
-
-      QUIT;
     }
   
   UNBLOCK_INPUT;
-  
   return ret;
 }