import Control.Concurrent (threadDelay)
import Data.Text (pack)
import Linear.V2 (V2(..))
import SDL (initialize, InitFlag(InitVideo), createWindow, defaultWindow,
createRenderer, RendererConfig(rendererTargetTexture),
defaultRenderer, rendererLogicalSize, ($=), present, clear, quit,
BlendMode(BlendAlphaBlend))
import SDL.Compositor (filledRectangleC, translateA, runRenderer, overC,
modulateAlphaM, blendMode, rgba)
main :: IO ()
main = do
-- intialize SDL
initialize [InitVideo]
-- create a window
window <- createWindow (pack "test window") defaultWindow
-- create a renderer for the window
rend <- createRenderer window (-1) (defaultRenderer {rendererTargetTexture = True})
-- set the logical size of the window to 800x600
rendererLogicalSize rend $= (Just (V2 800 600))
-- clear the renderer
clear rend
let
-- 3 rectangles, one in red, one in green and one in blue, width:
-- 100, height 150
rectRed = filledRectangleC (V2 100 150) (rgba 255 100 100 255)
rectGreen = filledRectangleC (V2 100 150) (rgba 100 255 100 255)
rectBlue = filledRectangleC (V2 100 150) (rgba 100 100 255 255)
-- translate an image by (250,300) pixels
translateToCenter = translateA (V2 250 300)
-- draw everything
runRenderer rend
( ( -- enable alpha blending for the whole subtree
blendMode BlendAlphaBlend .
-- make all the images slightly transparent
modulateAlphaM 150 .
-- align the images in the center
translateToCenter
)
( -- red, green and blue
rectRed `overC`
translateA (V2 150 0) (rectGreen `overC`
translateA (V2 150 0) rectBlue)
)
)
-- show the drawn image on the screen
present rend
-- pause for 5 seconds
threadDelay (5 * (10::Int)^(6::Int))
-- quit SDL
quit