comic-0.0.1: src/Data/Comic/Types.hs
{-# LANGUAGE OverloadedStrings, DeriveGeneric, DeriveAnyClass #-}
module Data.Comic.Types (
ImageName
, Font(..), FontName, FontSize, HintSize
, RGBA, blackRGBA, whiteRGBA
, Position (..), RelPosition (..)
) where
import Control.DeepSeq
import Control.Monad
import qualified Data.Aeson as JS
import Data.Aeson (ToJSON(..), FromJSON(..), (.:))
import Data.Hashable (Hashable(hashWithSalt))
import Data.Text (Text)
import Data.Word
import GHC.Generics (Generic)
type ImageName = Text
type FontName = Text
type FontSize = Int
type HintSize = Int
type RGBA = (Word8, Word8, Word8, Word8)
blackRGBA :: RGBA
blackRGBA = (0, 0, 0, 255)
whiteRGBA :: RGBA
whiteRGBA = (255, 255, 255, 255)
data Font =
Font {-# UNPACK #-} !FontName {-# UNPACK #-} !FontSize {-# UNPACK #-} !RGBA
deriving (Read, Show, Eq, Ord, Generic, NFData)
instance Hashable Font where
hashWithSalt s (Font fn fs rgba) =
hashWithSalt s (fn, fs, rgba)
data Position =
Pos { _pX :: {-# UNPACK #-} !Int, _pY :: {-# UNPACK #-} !Int }
deriving (Read, Show, Eq, Ord, Generic, NFData)
instance Hashable Position where
hashWithSalt s (Pos x y) = hashWithSalt s (x, y)
instance ToJSON Position where
toJSON (Pos x y) = JS.object [("x", toJSON x), ("y", toJSON y)]
instance FromJSON Position where
parseJSON (JS.Object v) = Pos <$> v .: "x" <*> v .: "y"
parseJSON _ = mzero
data RelPosition =
RPos { _rX :: {-# UNPACK #-} !Float, _rY :: {-# UNPACK #-} !Float }
deriving (Read, Show, Eq, Ord, Generic, NFData)
instance Hashable RelPosition where
hashWithSalt s (RPos x y) = hashWithSalt s (x, y)
instance ToJSON RelPosition where
toJSON (RPos x y) = JS.object [("x", toJSON x), ("y", toJSON y)]
instance FromJSON RelPosition where
parseJSON (JS.Object v) = RPos <$> v .: "x" <*> v .: "y"
parseJSON _ = mzero