packages feed

accelerate-examples-0.14.0.0: examples/mandelbrot/Main.hs

{-# LANGUAGE CPP #-}
--
-- A Mandelbrot set generator.
-- Originally submitted by Simon Marlow as part of Issue #49.
--

import World
import Config
import Monitoring
import ParseArgs

import Data.Label
import Control.Monad
import System.Environment                       ( getArgs, withArgs )
import Criterion.Main                           ( defaultMainWith, bench, whnf )

import Prelude                                  as P
import Data.Array.Accelerate                    as A
import Graphics.Gloss.Accelerate.Data.Picture   as G
import qualified Graphics.Gloss                 as G


-- Main ------------------------------------------------------------------------

makePicture :: World -> G.Picture
makePicture world = bitmapOfArray (renderWorld world) False


main :: IO ()
main
  = do
        beginMonitoring
        argv                    <- getArgs
        (conf, cconf, rest)     <- parseArgs optHelp optBackend options defaults header footer argv

        let world       = initialWorld conf view
            fps         = get optFramerate conf
            width       = get optWidth conf
            height      = get optHeight conf

            -- Centre coordinates: Re(c) = -0.7; Im(c) = 0
            -- View width: 3.0769
            --
            view        = (-2.23, -1.15, 0.83, 1.15)

            force arr   = indexArray arr (Z:.0:.0) `seq` arr

            mandel
              | get optBench conf
              = withArgs rest $ defaultMainWith cconf (return ())
                    [ bench "mandelbrot" $ whnf (force . renderWorld) world ]
#ifdef ACCELERATE_ENABLE_GUI
              | fps == 0
              = G.display
                    (G.InWindow "Mandelbrot" (width, height) (10, 10))
                    G.black
                    (makePicture world)

              | fps > 0
              = G.play
                    (G.InWindow "Mandelbrot" (width, height) (10, 10))
                    G.black
                    fps
                    world
                    makePicture
                    (react conf)
                    (const refocus)
#endif
              | otherwise
              = return ()


        unless (P.null rest) $
          putStrLn $ "Warning: unrecognized options: " P.++ show rest

        mandel