{-# LANGUAGE DeriveGeneric #-} -- | Strokes are used for defining lines and drawing them. module Gelatin.Core.Stroke where import Data.Maybe (fromMaybe) import GHC.Generics (Generic) data LineCap = LineCapNone | LineCapButt | LineCapSquare | LineCapRound | LineCapTriOut | LineCapTriIn deriving (Show, Ord, Eq, Enum, Generic) data Stroke = Stroke { strokeWidth :: Float , strokeFeather :: Float , strokeLineCaps :: (LineCap,LineCap) } deriving (Show, Eq, Generic) data StrokeAttr = StrokeNone | StrokeWidth Float | StrokeFeather Float | StrokeCaps (LineCap,LineCap) deriving (Show, Eq, Generic) defaultStroke :: Stroke defaultStroke = Stroke 1 1 (LineCapRound,LineCapRound) strokeAttr :: Maybe Stroke -> StrokeAttr -> Maybe Stroke strokeAttr _ StrokeNone = Nothing strokeAttr Nothing c = strokeAttr (Just defaultStroke) c strokeAttr (Just s) (StrokeWidth w) = Just $ s {strokeWidth = w} strokeAttr (Just s) (StrokeFeather t) = Just $ s {strokeFeather = t} strokeAttr (Just s) (StrokeCaps cs) = Just $ s {strokeLineCaps = cs} strokeWith :: [StrokeAttr] -> Stroke strokeWith atts = fromMaybe defaultStroke $ foldl strokeAttr Nothing atts