packages feed

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