changeset 24242:2dd79725f0c5

(msdos-approximate-color): New function. (msdos-color-translate): Call it to find a DOS color that best approximates an X-style "#NNNNNN" color specification.
author Eli Zaretskii <eliz@gnu.org>
date Mon, 01 Feb 1999 13:25:12 +0000
parents 31a8f281b188
children aa82f46ecc36
files lisp/term/pc-win.el
diffstat 1 files changed, 28 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/term/pc-win.el	Mon Feb 01 12:21:47 1999 +0000
+++ b/lisp/term/pc-win.el	Mon Feb 01 13:25:12 1999 +0000
@@ -175,6 +175,7 @@
   "List of alternate names for colors.")
 
 (defun msdos-color-translate (name)
+  "Translate color specification in NAME into something DOS terminal groks."
   (setq name (downcase name))
   (let* ((len (length name))
 	 (val (- (length x-colors)
@@ -232,7 +233,33 @@
 	       (and
 		(string-match "[1-4]\\'" name)
 		(msdos-color-translate
-		 (substring name 0 (match-beginning 0)))))))))
+		 (substring name 0 (match-beginning 0))))))
+	(and (= len 7)	;; X-style "#XXYYZZ" color spec
+	     (eq (aref name 0) ?#)
+	     (member (aref name 1)
+		     '(?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9
+			  ?A ?B ?C ?D ?E ?F ?a ?b ?c ?d ?e ?f))
+	     (msdos-color-translate
+	      (msdos-approximate-color (string-to-number
+					(substring name 1) 16)))))))
+
+(defun msdos-approximate-color (num)
+  "Return a DOS color name which is the best approximation for the number NUM."
+  (let ((color-values msdos-color-values)
+	(candidate (car msdos-color-values))
+	(best-distance 16777216)	;; 0xFFFFFF + 1
+	best-color)
+    (while candidate
+      (let* ((values (cdr candidate))
+	     (value (+ (lsh (car values) 16)
+		       (lsh (car (cdr values)) 8)
+		       (nth 2 values))))
+	 (if (< (abs (- value num)) best-distance)
+	     (setq best-distance (abs (- value num))
+		   best-color (car candidate))))
+      (setq color-values (cdr color-values))
+      (setq candidate (car color-values)))
+    best-color))
 ;; ---------------------------------------------------------------------------
 ;; We want to delay setting frame parameters until the faces are setup
 (defvar default-frame-alist nil)