shine-0.2.0.3: src/Graphics/Shine/Picture.hs
{-|
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