module Graphics.UI.Gtk.Helpers.Pixbuf where
import Graphics.UI.Gtk
import Data.Word
safePixbufComposite :: Pixbuf -> Pixbuf
-> Int -> Int
-> Int -> Int
-> InterpType
-> Word8
-> IO ()
safePixbufComposite pbO pbD x y x' y' interp alpha = do
w <- pixbufGetWidth pbO
h <- pixbufGetHeight pbO
w' <- pixbufGetWidth pbD
h' <- pixbufGetHeight pbD
safePixbufComposite' pbO pbD x y x' y' w h w' h' interp alpha
safePixbufComposite' :: Pixbuf -> Pixbuf
-> Int -> Int
-> Int -> Int
-> Int -> Int
-> Int -> Int
-> InterpType
-> Word8
-> IO ()
safePixbufComposite' pbO pbD x y x' y' w h w' h' interp alpha
| x + w < 0 || y + h < 0 || w < 0 || h < 0
= return ()
| x < 0 || y < 0
= do let diffX = if x > 0 then 0 else abs x
diffY = if y > 0 then 0 else abs y
newX = if x < 0 then 0 else x
newY = if y < 0 then 0 else y
newX' = if x < 0 then 0 else x'
newY' = if y < 0 then 0 else y'
pbO' <- pixbufNew ColorspaceRgb True 8 (w diffX) (h diffY)
pixbufCopyArea pbO diffX diffY (w diffX) (h diffY) pbO' 0 0
safePixbufComposite' pbO' pbD
newX newY
newX' newY'
(w diffX) (h diffY)
w' h'
interp alpha
| otherwise
= do let realw = if (x + w) > w' then w' x else w
realh = if (y + h) > h' then h' y else h
pixbufComposite pbO pbD x y realw realh (fI x') (fI y') 1 1 interp alpha
where fI = fromIntegral
pixbufNewEmpty :: Int -> Int -> IO Pixbuf
pixbufNewEmpty w h = do
pb <- pixbufNew ColorspaceRgb True 8 w h
pixbufFill pb 0 0 0 1
return pb
pixbufNewWithBGColor :: Bool -> Int -> Int -> (Word8, Word8, Word8) -> IO Pixbuf
pixbufNewWithBGColor alpha w h (r,g,b) = do
pb <- pixbufNew ColorspaceRgb alpha 8 w h
pixbufFill pb r g b 255
return pb