module Codec.Picture.Jpg.Types( MutableMacroBlock
, createEmptyMutableMacroBlock
, mutate
, printMacroBlock
, (!!!), (.!!!.), (.<-.)
) where
import Control.Monad.ST( ST )
import Foreign.Storable ( Storable )
import Control.Monad.Primitive ( PrimState, PrimMonad )
import qualified Data.Vector.Storable as V
import qualified Data.Vector.Storable.Mutable as M
import Text.Printf
(!!!) :: (Storable e) => V.Vector e -> Int -> e
(!!!) =
V.unsafeIndex
(.!!!.) :: (PrimMonad m, Storable a)
=> M.STVector (PrimState m) a -> Int -> m a
(.!!!.) =
M.unsafeRead
(.<-.) :: (PrimMonad m, Storable a)
=> M.STVector (PrimState m) a -> Int -> a -> m ()
(.<-.) =
M.unsafeWrite
type MutableMacroBlock s a = M.STVector s a
createEmptyMutableMacroBlock :: (Storable a, Num a) => ST s (MutableMacroBlock s a)
createEmptyMutableMacroBlock = M.replicate 64 0
mutate :: Storable a
=> (Int -> a -> a)
-> MutableMacroBlock s a -> ST s (MutableMacroBlock s a)
mutate f block = update 0 >> return block
where updateVal i = (block .!!!. i) >>= (block .<-. i) . f i
update 63 = updateVal 63
update n = updateVal n >> update (n + 1)
printMacroBlock :: (Storable a, PrintfArg a)
=> MutableMacroBlock s a -> ST s String
printMacroBlock block = pLn 0
where pLn 64 = return "===============================\n"
pLn i = do
v <- block .!!!. i
vn <- pLn (i+1)
return $ printf (if i `mod` 8 == 0 then "\n%5d " else "%5d ") v ++ vn