{-# LANGUAGE ScopedTypeVariables, FlexibleInstances, MultiParamTypeClasses #-}
{-# OPTIONS_HADDOCK hide #-}
module Graphics.UI.Gtk.Gdk.PixbufData (
PixbufData,
mkPixbufData
) where
import System.Glib.FFI
import Graphics.UI.Gtk.Types
import Data.Array.Base ( MArray(..), newArray_, unsafeRead, unsafeWrite,
getBounds, getNumElements )
data PixbufData i e = PixbufData !Pixbuf
{-# UNPACK #-} !(Ptr e)
!(i,i)
{-# UNPACK #-} !Int
mkPixbufData :: Storable e => Pixbuf -> Ptr e -> Int -> PixbufData Int e
mkPixbufData :: Pixbuf -> Ptr e -> Int -> PixbufData Int e
mkPixbufData pb :: Pixbuf
pb (Ptr e
ptr :: Ptr e) size :: Int
size =
Pixbuf -> Ptr e -> (Int, Int) -> Int -> PixbufData Int e
forall i e. Pixbuf -> Ptr e -> (i, i) -> Int -> PixbufData i e
PixbufData Pixbuf
pb Ptr e
ptr (0, Int
count) Int
count
where count :: Int
count = Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
size Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` e -> Int
forall a. Storable a => a -> Int
sizeOf (e
forall a. HasCallStack => a
undefined :: e))
instance Storable e => MArray PixbufData e IO where
newArray :: (i, i) -> e -> IO (PixbufData i e)
newArray (l :: i
l,u :: i
u) e :: e
e = [Char] -> IO (PixbufData i e)
forall a. HasCallStack => [Char] -> a
error "Gtk.Gdk.Pixbuf.newArray: not implemented"
newArray_ :: (i, i) -> IO (PixbufData i e)
newArray_ (l :: i
l,u :: i
u) = [Char] -> IO (PixbufData i e)
forall a. HasCallStack => [Char] -> a
error "Gtk.Gdk.Pixbuf.newArray_: not implemented"
{-# INLINE unsafeRead #-}
unsafeRead :: PixbufData i e -> Int -> IO e
unsafeRead (PixbufData (Pixbuf pb :: ForeignPtr Pixbuf
pb) pixPtr :: Ptr e
pixPtr _ _) idx :: Int
idx = do
e
e <- Ptr e -> Int -> IO e
forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff Ptr e
pixPtr Int
idx
ForeignPtr Pixbuf -> IO ()
forall a. ForeignPtr a -> IO ()
touchForeignPtr ForeignPtr Pixbuf
pb
e -> IO e
forall (m :: * -> *) a. Monad m => a -> m a
return e
e
{-# INLINE unsafeWrite #-}
unsafeWrite :: PixbufData i e -> Int -> e -> IO ()
unsafeWrite (PixbufData (Pixbuf pb :: ForeignPtr Pixbuf
pb) pixPtr :: Ptr e
pixPtr _ _) idx :: Int
idx elem :: e
elem = do
Ptr e -> Int -> e -> IO ()
forall a. Storable a => Ptr a -> Int -> a -> IO ()
pokeElemOff Ptr e
pixPtr Int
idx e
elem
ForeignPtr Pixbuf -> IO ()
forall a. ForeignPtr a -> IO ()
touchForeignPtr ForeignPtr Pixbuf
pb
{-# INLINE getBounds #-}
getBounds :: PixbufData i e -> IO (i, i)
getBounds (PixbufData _ _ bd :: (i, i)
bd _) = (i, i) -> IO (i, i)
forall (m :: * -> *) a. Monad m => a -> m a
return (i, i)
bd
{-# INLINE getNumElements #-}
getNumElements :: PixbufData i e -> IO Int
getNumElements (PixbufData _ _ _ count :: Int
count) = Int -> IO Int
forall (m :: * -> *) a. Monad m => a -> m a
return Int
count