gruff-examples-0.3.1: src/Convert/Gruff2a.hs
module Convert.Gruff2a (gruff2a) where
import Convert.Common (readMay, image', Colour(Colour), Image())
import Numeric (readSigned, readFloat)
data AngledInternalAddress
= Unangled Integer
| Angled Integer Angle AngledInternalAddress
deriving Read
type Angle = Rational
newtype R = R Rational
instance Read R where
readsPrec _ = map (\(x, s) -> (R x, s)) . readParen False (readSigned readFloat)
data Color = Color Int Int Int
deriving Read
c :: Color -> Colour
c (Color r g b) = Colour (fromIntegral r / m) (fromIntegral g / m) (fromIntegral b / m) where m = 65535
data Gruff2a = Gruff2
{ gAddress :: Maybe AngledInternalAddress
, gReal :: Maybe R
, gImag :: Maybe R
, gSize :: Maybe R
, gRota :: Maybe Double
, gColours :: (Color, Color, Color)
}
deriving Read
gruff2a :: String -> Maybe Image
gruff2a s = convert =<< readMay s
convert :: Gruff2a -> Maybe Image -- FIXME handle rota?
convert Gruff2
{ gReal = Just (R re), gImag = Just (R im), gSize = Just (R sz)
, gColours = (ci, cb, ce)
} = Just $ image' 512 288 4 (c ci, c cb, c ce) re im (fromRational sz)
convert _ = Nothing