Ebnf2ps-1.0.8: src/Color.hs
-- -*- 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.1.1 1998/12/09 13:34:08 pjt
-- Imported sources
--
-- Revision 1.1 1994/03/15 15:34:53 thiemann
-- Initial revision
--
--
-- Last Modified By: M. Walter
module Color where
-- (Color (..), lookupColor, showsColor, showsAColor, prepareColors)
import Data.Char
import Numeric
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
-}
-- Gofer-like stuff:
ljustify' :: Int -> String -> String
ljustify' n s = s ++ space' (max 0 (n - length s))
space' :: Int -> String
space' n = copy' n ' '
copy' :: Int -> a -> [a] -- make list of n copies of x
copy' n x = take n xs where xs = x:xs
--
lookupColor :: String -> [(String,(Int,Int,Int))] -> (Int,Int,Int)
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 ')'
showsAColor :: Color -> String -> ShowS
showsAColor color str = showString ('\t': ljustify' 16 str) . showsColor color . showChar '\n'
-- Folgendes Stück abgeändert und durch untiges ersetzt, weil \\ nicht
-- verfügbar, V. Wysk:
--
-- 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 ]
prepareColors rgbFile colors =
decodeColors (map (map toLower) colors) (fallBackRgb++parsedRgbFile)
where parsedRgbFile = [parseLine l | l <- lines rgbFile, notComment l]
notComment ('!':_) = False
notComment _ = True
decodeColors :: [String] -> [(Int,Int,Int,String)] -> [(String,(Int,Int,Int))]
decodeColors clrs parsedRgbFile = [ (name,(r,g,b)) | name <- clrs,
(r,g,b,name') <- parsedRgbFile,
name == name' ]
-- bis hier
parseLine str = let (r,restr):_ = readDec (skipWhite str)
(g,restg):_ = readDec (skipWhite restr)
(b,restb):_ = readDec (skipWhite restg)
name = map toLower (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