{-# LANGUAGE RecordWildCards #-} import Affection import qualified SDL import qualified SDL.Raw as Raw import qualified GEGL as G import qualified BABL as B import qualified Data.Map.Strict as M import Control.Monad (when) import Foreign.Storable (peek) import Foreign.C.Types import Debug.Trace -- main :: IO () -- main = withAllAffection $ -- withDefaultWindow "test" $ do -- changeColor $ RGBA 255 255 255 255 -- clear -- present -- liftIO $ delaySec 2 main :: IO () main = do conf <- return $ AffectionConfig { initComponents = All , windowTitle = "Affection: example00" , windowConfig = SDL.defaultWindow , preLoop = return () , drawLoop = draw , updateLoop = update , loadState = load , cleanUp = clean } withAffection conf data UserData = UserData { nodeGraph :: M.Map String G.GeglNode , foreground :: G.GeglBuffer } load :: SDL.Surface -> IO UserData load _ = do traceM "loading" root <- G.gegl_node_new traceM "new root node" checkerboard <- G.gegl_node_new_child root $ G.checkerboardOperation [ G.Property "color1" $ G.PropertyColor $ G.RGBA 0.4 0.4 0.4 1 , G.Property "color2" $ G.PropertyColor $ G.RGBA 0.6 0.6 0.6 1 ] traceM "checkerboard" over <- G.gegl_node_new_child root G.defaultOverOperation traceM "over" buffer <- G.gegl_buffer_new (Just $ G.GeglRectangle 0 0 800 600) =<< B.babl_format (B.PixelFormat B.RGBA B.CFfloat) sink <- G.gegl_node_new_child root $ G.Operation "gegl:copy-buffer" [ G.Property "buffer" $ G.PropertyBuffer buffer ] traceM "buffer-source" nop <- G.gegl_node_new_child root $ G.Operation "gegl:nop" [] traceM "nop" crop <- G.gegl_node_new_child root $ G.Operation "gegl:crop" [ G.Property "width" $ G.PropertyDouble 800 , G.Property "height" $ G.PropertyDouble 600 ] G.gegl_node_link_many [checkerboard, over, crop, sink] G.gegl_node_connect_to nop "output" over "aux" traceM "connections made" myMap <- return $ M.fromList [ ("root" , root) , ("over" , over) , ("background" , checkerboard) , ("sink" , sink) , ("nop" , nop) ] let roi = G.GeglRectangle 0 0 20 20 traceM "loading complete" return $ UserData { nodeGraph = myMap , foreground = buffer } draw :: Affection UserData () draw = do traceM "drawing" UserData{..} <- getAffection drawRect (nodeGraph M.! "nop") (G.RGB 1 0 0) Fill (G.GeglRectangle 10 10 500 500) foreground liftIO $ G.gegl_node_process $ nodeGraph M.! "sink" update :: Double -> [SDL.Event] -> Affection UserData () update sec _ = do traceM "updating" -- liftIO $ delaySec 5 ad <- get ud@UserData{..} <- getAffection traceM $ (show $ 1 / sec) ++ " FPS" when (elapsedTime ad > 20) $ put $ ad { quitEvent = True } clean :: UserData -> IO () clean _ = return ()