aosd-0.2.2: Graphics/Aosd/Renderer.hs
{-# OPTIONS -Wall #-}
module Graphics.Aosd.Renderer where
import Graphics.Rendering.Cairo
import Graphics.Rendering.Pango.Enums
import Graphics.Aosd.Util
class AosdRenderer a where
toGeneralRenderer :: a -> IO GeneralRenderer
data GeneralRenderer = GeneralRenderer {
grRender :: Render (),
-- | Part of the surface that the renderer actually draws on (determines the window size).
grInkExtent :: Rectangle,
-- | Part of the surface whose...
--
-- * ... left edge is aligned to the left edge of the screen, if 'xPos' is 'Min'
--
-- * ... center is aligned to the center of the screen, if 'xPos' is 'Center'
--
-- * ... right edge is aligned to the right edge of the screen, if 'xPos' is 'Max'
--
-- (Likewise for the /y/ axis)
grPositioningExtent :: Rectangle
}
instance AosdRenderer GeneralRenderer where
toGeneralRenderer = return
debugRenderer :: GeneralRenderer
debugRenderer =
GeneralRenderer {
grInkExtent = rect,
grPositioningExtent = rect,
grRender = do
liftIO (putStdErr "debugRenderer invoked")
setLineWidth lw
setSourceRGB 0 1 0
arc 0 0 (r - lw) 0 (2*pi)
stroke
}
where
rect = Rectangle (-r) (-r) (2*r) (2*r)
r :: Num a => a
r = 100
lw = 5
-- -- | Horizontal concatenation
-- data HCatRenderer = forall r1 r2. (AosdRenderer r1, AosdRenderer r2) => HCat r1 r2
--
--
-- -- | Vertical concatenation
-- data VCatRenderer = forall r1 r2. (AosdRenderer r1, AosdRenderer r2) => VCat r1 r2
-- instance AosdRenderer HCatRenderer where
-- toGeneralRenderer (HCat r1 r2) = do
-- gr1 <- toGeneralRenderer r1
-- gr2 <- toGeneralRenderer r2
-- return GeneralRenderer {
-- grWidth = ((+) `on` grWidth) gr1 gr2,
-- grHeight = (max `on` grHeight) gr1 gr2,
-- grRender = do
-- grRender gr1
-- translate (fromIntegral $ grWidth gr1) 0
-- grRender gr2
-- }
--
-- instance AosdRenderer VCatRenderer where
-- toGeneralRenderer (VCat r1 r2) = do
-- gr1 <- toGeneralRenderer r1
-- gr2 <- toGeneralRenderer r2
-- return GeneralRenderer {
-- grWidth = (max `on` grWidth) gr1 gr2,
-- grHeight = ((+) `on` grHeight) gr1 gr2,
-- grRender = do
-- grRender gr1
-- translate 0 (fromIntegral $ grHeight gr1)
-- grRender gr2
-- }