packages feed

sdl2-compositor-1.2: resolution-independent.hs

import Data.Text (pack)
import Linear.V2 (V2(..))
import SDL (initialize, InitFlag(InitVideo), createWindow,
            WindowConfig(windowInitialSize), defaultWindow,
            createRenderer, defaultRenderer, clear, present,
            RendererConfig(rendererTargetTexture,rendererType),
            quit,($=), rendererLogicalSize,
            RendererType(SoftwareRenderer)
           )
import System.Environment (getArgs)
import SDL.Compositor.ResIndependent (translateR, fillRectangle,
                                      fromRelativeCompositor)
import SDL.Compositor (runRenderer, rgba)
import Control.Concurrent (threadDelay)

main :: IO ()
main = do
  -- Initialize sdl
  initialize [InitVideo]
  -- read window dimensions from command line args
  dims <- (\(w:h:_) -> V2 (read w) (read h)) <$> getArgs
  -- create a window with the given dimensions
  window <- createWindow (pack "test window") (defaultWindow {windowInitialSize = dims})
  -- create a renderer for the windows surface, software for
  -- compatibility reasons
  renderer <- createRenderer window (-1)
              (defaultRenderer {rendererTargetTexture = True
                               ,rendererType = SoftwareRenderer})
  -- setting the logical size is optional
  rendererLogicalSize renderer $= Just dims
  -- clear the window
  clear renderer
  -- draw a white square with length 0.99 for the edges
  let square = fillRectangle (V2 0.99 0.99) (rgba 255 255 255 255)
  -- draw everything
  runRenderer
    renderer
    ( fromRelativeCompositor (fromIntegral <$> dims) $
      translateR (V2 0.5 0.5) -- move the square to the center of
      square
    )
  -- present what we have drawn to the user
  present renderer
  -- wait for 5 seconds
  threadDelay (5 * 10^6)
  -- quit sdl
  quit