module Graphics.Proc.Core.State.Elements.Draw(
    DrawState(..),
    EllipseMode, RectMode, DrawMode(..), 
    StrokeCap(..), StrokeJoin(..)    
) where

import Control.Monad.Trans.State.Strict
import Data.Default
import Graphics.Proc.Core.GLBridge

data DrawState = DrawState 
  { drawEllipseMode   :: EllipseMode
  , drawRectMode      :: RectMode
  , drawStrokeCap     :: StrokeCap
  , drawStrokeJoin    :: StrokeJoin
  , drawStrokeWeight  :: Float
  , drawFill          :: Maybe Col
  , drawStroke        :: Maybe Col  
  }

instance Default DrawState where
  def = DrawState 
    { drawEllipseMode  = Center
    , drawRectMode     = Corner
    , drawStrokeCap    = Round
    , drawStrokeJoin   = JoinMiter
    , drawStrokeWeight = 1
    , drawFill         = Just $ Col 0 0 0 1
    , drawStroke       = Just $ Col 0 0 0 1
    }

-- | Modes for drawing of ellipse. See @ellipseMode@.
type EllipseMode = DrawMode

-- | Modes for drawing of rectangle. See @rectMode@.
type RectMode = DrawMode

-- | Modes for drawing of rectangle or ellipse.
data DrawMode = Radius | Center | Corner | Corners
  deriving (Show, Eq, Enum, Bounded)

instance Default DrawMode where
  def = Center

data StrokeCap = Round | Square | Project
  deriving (Show, Eq, Enum, Bounded)

instance Default StrokeCap where
  def = Round

data StrokeJoin = JoinMiter | JoinBevel | JoinRound
  deriving (Show, Eq, Enum, Bounded)

instance Default StrokeJoin where  
  def = JoinMiter

----------------------------------------------------------