module Graphics.HGL.X11.DC
( drawUnbuffered, drawBuffered, erase
) where
import Graphics.HGL.X11.Types
import qualified Graphics.X11.Xlib as X
import Data.IORef( IORef, readIORef, writeIORef )
import Control.Concurrent( readMVar )
import Graphics.HGL.Internals.Draw
drawUnbuffered :: DC -> Draw () -> IO ()
drawUnbuffered dc p = do
unDraw erase dc
unDraw p dc
drawBuffered :: DC -> Draw () -> X.GC -> Int -> IORef (Maybe X.Pixmap) -> IO ()
drawBuffered dc p gc depth ref_mbuffer = do
(_,(width,height)) <- readMVar (ref_rect dc)
mbuffer <- readIORef ref_mbuffer
buffer <- case mbuffer of
Nothing -> X.createPixmap (disp dc)
(drawable dc)
width
height
(fromIntegral depth)
Just buffer -> return buffer
X.fillRectangle (disp dc) buffer gc 0 0 width height
unDraw p dc{drawable=buffer}
X.copyArea (disp dc) buffer (drawable dc) (paintGC dc) 0 0 width height 0 0
writeIORef ref_mbuffer (Just buffer)
erase :: Draw ()
erase = mkDraw (\ dc -> X.clearWindow (disp dc) (drawable dc))