module OpenCV.Unsafe
( unsafeCoerceMat
, unsafeCoerceMatM
, unsafeFreeze
, unsafeThaw
, unsafeRead
, unsafeWrite
) where
import "base" Foreign.Ptr ( plusPtr )
import "base" Foreign.Storable ( Storable, peek, poke, sizeOf )
import "primitive" Control.Monad.Primitive
( PrimMonad, PrimState, unsafePrimToPrim )
import "this" OpenCV.Internal.Core.Types.Mat
import "this" OpenCV.Internal.Mutable
unsafeRead
:: forall m shape channels depth value
. (PrimMonad m, Storable value)
=> Mut (Mat shape channels depth) (PrimState m)
-> [Int]
-> Int
-> m value
unsafeRead matM pos channel =
unsafePrimToPrim $ withMatData (unMut matM) $ \step dataPtr ->
let elemPtr = matElemAddress dataPtr (fromIntegral <$> step) pos
in peek (elemPtr `plusPtr` (channel * sizeOf dummyValue))
where
dummyValue :: value
dummyValue = error "dummy"
unsafeWrite
:: (PrimMonad m, Storable value)
=> Mut (Mat shape channels depth) (PrimState m)
-> [Int]
-> Int
-> value
-> m ()
unsafeWrite matM pos channel value =
unsafePrimToPrim $ withMatData (unMut matM) $ \step dataPtr ->
let elemPtr = matElemAddress dataPtr (fromIntegral <$> step) pos
in poke (elemPtr `plusPtr` (channel * sizeOf value)) value