(munsell-split): reject beginning and trailing garbage.
authorakr <akr>
Sun, 29 Oct 2000 06:21:07 +0000 (06:21 +0000)
committerakr <akr>
Sun, 29 Oct 2000 06:21:07 +0000 (06:21 +0000)
(munsell-hue-round): new function.
(munsell-value-round): new function.
(munsell-chroma-round): new function.
(munsell-round): use `munsell-hue-round', `munsell-value-round' and
`munsell-chroma-round'.

munsell-conv.el

index 2e3e76e..a402d1a 100644 (file)
        (value-var (nth 1 vars))
        (chroma-var (nth 2 vars)))
     `(let ((,color-var ,color-expr))
-       (if (string-match "^N\\([0-9]+\\(\\.[0-9]*\\)?\\)\\|\\([0-9]+\\(\\.[0-9]*\\)?\\)\\(B\\|BG\\|G\\|GY\\|Y\\|YR\\|R\\|RP\\|P\\|PB\\)\\([0-9]+\\(\\.[0-9]*\\)?\\)/\\([0-9]+\\(\\.[0-9]*\\)?\\)$" ,color-var)
+       (if (string-match "^\\(N\\([0-9]+\\(\\.[0-9]*\\)?\\)\\|\\([0-9]+\\(\\.[0-9]*\\)?\\)\\(B\\|BG\\|G\\|GY\\|Y\\|YR\\|R\\|RP\\|P\\|PB\\)\\([0-9]+\\(\\.[0-9]*\\)?\\)/\\([0-9]+\\(\\.[0-9]*\\)?\\)\\)$" ,color-var)
           (let ((,hue-var
-                 (if (match-beginning 1)
+                 (if (match-beginning 2)
                      '(0 . "N")
-                   (cons (string-to-number (match-string 3 ,color-var))
-                         (match-string 5 ,color-var))))
+                   (cons (string-to-number (match-string 4 ,color-var))
+                         (match-string 6 ,color-var))))
                 (,value-var
                  (string-to-number
-                  (match-string (if (match-beginning 1) 1 6) ,color-var)))
+                  (match-string (if (match-beginning 2) 2 7) ,color-var)))
                 (,chroma-var
-                 (if (match-beginning 1)
+                 (if (match-beginning 2)
                      0
-                   (string-to-number (match-string 8 ,color-var)))))
+                   (string-to-number (match-string 9 ,color-var)))))
             ,body)
         ,(or
           invalid-action
           `(error "invalid munsell color: %s" ,color-var))))))
 
+(defun munsell-hue-round (h &optional round-function)
+  (unless round-function (setq round-function 'round))
+  (let ((h2 (* 5 (apply round-function (car h) '(2.5)))))
+    (if (= h2 0)
+       (concat
+        "10" 
+        (cadr
+         (member
+          (cdr h) '("R" "RP" "P" "PB" "B" "BG" "G" "GY" "Y" "YR" "R"))))
+      (concat
+       (int-to-string (ash h2 -1))
+       (unless (= (logand h2 1) 0) ".5")
+       (cdr h)))))
+
+(defun munsell-value-round (v &optional round-function)
+  (unless round-function (setq round-function 'round))
+  (if (<= v 0.9)
+      (let ((rounded (apply round-function v '(0.2))))
+       (if (= rounded 5)
+           "1"
+         (concat "0." (int-to-string (* 2 rounded)))))
+    (int-to-string (apply round-function v '(1)))))
+
+(defun munsell-chroma-round (c &optional round-function)
+  (unless round-function (setq round-function 'round))
+  (int-to-string (* 2 (apply chroma-round c '(2)))))
+
 (defun munsell-round (h v c hue-round value-round chroma-round)
-  (let ((c-rounded (* 2 (apply chroma-round c '(2)))))
-    (concat
-     (if (= c-rounded 0)
-        "N"
-       (let ((h2 (* 5 (apply hue-round (car h) '(2.5)))))
-        (concat
-         (int-to-string (ash h2 -1))
-         (unless (= (logand h2 1) 0) ".5")
-         (cdr h))))
-     (if (< v 0.9)
-        (concat "0." (int-to-string (* 2 (apply value-round v '(0.2)))))
-       (int-to-string (apply value-round v '(1))))
-     (if (= c-rounded 0)
-        ""
-       (concat "/" (int-to-string c-rounded))))))
+  (let ((c-rounded (munsell-chroma-round c chroma-round))
+       (v-rounded (munsell-value-round v value-round)))
+    (if (string= c-rounded "0")
+       (concat "N" v-rounded)
+      (concat (munsell-hue-round h hue-round) v-rounded "/" c-rounded))))
 
 (defun munsell-convert (color)
   (munsell-split color (h v c)