----------------------------------------------------------------------------- -- | -- Module : Graphics.HGL.X11.DC -- Copyright : (c) Alastair Reid, 1999-2003 -- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org -- Stability : internal -- Portability : non-portable (requires concurrency) -- -- A simple graphics library. -- ----------------------------------------------------------------------------- -- #hide 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 ---------------------------------------------------------------- -- 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) -- Note: The buffer is deallocated whenever the window size changes! 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)) ---------------------------------------------------------------- -- End ----------------------------------------------------------------