-- -*- Mode: Haskell -*- -- Copyright 1994 by Peter Thiemann -- Color.hs --- string converter for colors -- Author : Peter Thiemann -- Created On : Thu Dec 2 16:58:33 1993 -- Last Modified By: Peter Thiemann -- Last Modified On: Fri Dec 3 14:13:34 1993 -- Update Count : 3 -- Status : Unknown, Use with caution! -- -- $Locker: $ -- $Log: Color.hs,v $ -- Revision 1.1 2004/08/05 11:11:57 malcolm -- Add a regression testsuite for the nhc98 compiler. It isn't very good, -- but it is better than nothing. I've been using it for about four years -- on nightly builds, so it's about time it entered the repository! It -- includes a slightly altered version of the nofib suite. -- Instructions are in the README. -- -- Revision 1.3 1999/01/18 19:38:46 sof -- Misc (backward compatible) changes to make srcs acceptable -- to a Haskell 98 compiler. -- -- Revision 1.2 1996/07/25 21:23:51 partain -- Bulk of final changes for 2.01 -- -- Revision 1.1 1996/01/08 20:02:35 partain -- Initial revision -- -- Revision 1.1 1994/03/15 15:34:53 thiemann -- Initial revision -- -- module Color where -- (Color (..), lookupColor, showsColor, prepareColors) import Char -- 1.3 import List ((\\)) -- 1.3 type Color = (Int, Int, Int) noColor :: Color noColor = (-1, -1, -1) {- readColor :: String -> Color readColor = readColor1 . map toLower readColor1 :: String -> Color readColor1 ('b':'l':'a':_) = 0 readColor1 ('b':'l':'u':_) = 1 readColor1 ('g':_) = 2 readColor1 ('c':_) = 3 readColor1 ('r':_) = 4 readColor1 ('m':_) = 5 readColor1 ('y':_) = 6 readColor1 ('w':_) = 7 readColor1 _ = -1 -} lookupColor :: String -> [(String, (a, b, c))] -> (a, b, c) lookupColor colorName colorTable = head [(r,g,b) | (c,(r,g,b)) <- colorTable, c == map toLower colorName] showsColor :: Color -> ShowS showsColor (r,g,b) = showString " (" . shows r . showChar ',' . shows g . showChar ',' . shows b . showChar ')' prepareColors rgbFile colors = decodeColors (map (map toLower) colors) (fallBackRgb++parsedRgbFile) [] where parsedRgbFile = (map parseLine (lines rgbFile)) decodeColors [] parsedRgbFile decoded = decoded decodeColors clrs [] decoded = [(name,(128,128,128)) | name <- clrs ]++decoded decodeColors clrs ((r,g,b,name):parsedRgbFile) decoded = decodeColors (clrs \\ found) parsedRgbFile (foundDecoded++decoded) where found = [ c | c <- clrs, name == c ] foundDecoded = [ (c,(r,g,b)) | c <- found ] parseLine str = let (r,restr):_ = reads{-was:readDec-} (skipWhite str) (g,restg):_ = reads{-was:readDec-} (skipWhite restr) (b,restb):_ = reads{-was:readDec-} (skipWhite restg) name = skipWhite restb in (r,g,b,name) where skipWhite = dropWhile isSpace fallBackRgb :: [(Int,Int,Int,String)] fallBackRgb = [ ( 0, 0, 0,"black"), ( 0, 0,255,"blue"), ( 0,255, 0,"green"), ( 0,255,255,"cyan"), (255, 0, 0,"red"), (255, 0,255,"magenta"), (255,255, 0,"yellow"), (255,255,255,"white")] showsPsColor (r,g,b) = showChar ' ' . shows r . showChar ' ' . shows g . showChar ' ' . shows b . showString " scol" showsFigColor (r,g,b) = showChar ' ' . shows (minPosition 0 (-1,32768*32768) [ (x-r)*(x-r) + (y-g)*(y-g) + (z-b)*(z-b) | (x,y,z,_) <- fallBackRgb ]) -- -- find position of minimal element in list -- minPosition i (pos,min) [] = pos minPosition i (pos,min) (x:rest) | x < min = minPosition (i+1) (i,x) rest | otherwise = minPosition (i+1) (pos,min) rest