content: {-|
  Module      : Graphics.Shine.Picture
  Description : Short description
  Copyright   : (c) Francesco Gazzetta, 2016
  License     : MIT
  Maintainer  : francygazz@gmail.com
  Stability   : experimental
  
  This module contains the 'Picture' datatype, used to represent the image to draw
  on the canvas, and some functions to operate on it.
  -}
  module Graphics.Shine.Picture (
    Picture (..),
    Color (..),
    TextAlignment (..),
    Font,
    circle,
    path,
    (<>)
  ) where
  
  import Data.Monoid ((<>))
  import Graphics.Shine.Image
  
  -- | Js-style font, ex. @"12px Sans"@
  type Font = String
  
  -- | How the text should be aligned
  data TextAlignment = LeftAlign | CenterAlign | RightAlign deriving (Eq, Show)
  
  -- | A color given r, g, b (all from 0 to 255) and alpha (from 0 to 1)
  data Color = Color Int Int Int Float deriving (Eq, Show)
  
  -- | A drawable element. All Pictures are centered.
  data Picture =
               -- | The empty picture. Draws nothing.
               Empty
               -- | A rectangle from the dimensions
               | Rect Double Double
               -- | Same thing but filled
               | RectF Double Double
               -- | A line from the coordinates of two points
               | Line Double Double Double Double
               -- | A polygon from a list of vertices
               | Polygon [(Double, Double)]
               -- | An arc from the radius, start angle, end angle.
               -- If the last parameter is True, the direction is counterclockwise
               -- TODO replace with Clockwise | Counterclockwise or remove entirely
               | Arc Double Double Double Bool
               -- | A filled circle from the radius
               | CircleF Double
               -- | Draws some text. The 'Maybe' 'Double' is the optional max width.
               | Text Font TextAlignment (Maybe Double) String
               -- | Draws an image
               | Image ImageSize ImageData
               -- | Draws the second `Picture` over the first
               | Over Picture Picture
               -- | Applies the `Color` to the picture.
               -- Innermost colors have the precedence, so you can set a "global
               -- color" and override it
               | Colored Color Picture
               -- | Rotates the Picture (in radians)
               | Rotate Double Picture
               -- | Moves the Picture by the given x and y distances
               | Translate Double Double Picture
               -- TODO stroke
               deriving (Eq, Show)
  
  -- | A circle from the center coordinates and radius
  circle :: Double -> Picture
  circle r = Arc r 0 (2*3.14) False
  
  -- | Shorthand to draw a series of lines
  path :: [(Double, Double)] -> Picture
  path xs = foldMap (\((x,y),(x',y')) -> Line x y x' y') $ zip xs $ tail xs
  
  -- | 'Picture's are 'Semigroup's. The composing function is the overlapping
  -- (the right picture is drawn over the left one).
  instance Semigroup Picture where
      (<>) = Over
  
  -- | 'Picture's are 'Monoid's. The identity is an 'Empty' (completely transparent)
  -- picture and the composing function is the overlapping (the right picture is
  -- drawn over the left one).
  instance Monoid Picture where
      mempty = Empty
      mappend = Over
  
  