{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module Codec.Picture.Jpg.Internal.FastIdct( MutableMacroBlock
, fastIdct
, mutableLevelShift
, createEmptyMutableMacroBlock
) where
import qualified Data.Vector.Storable as V
import Control.Monad.ST( ST )
import Data.Bits( unsafeShiftL, unsafeShiftR )
import Data.Int( Int16 )
import qualified Data.Vector.Storable.Mutable as M
import Codec.Picture.Jpg.Internal.Types
iclip :: V.Vector Int16
iclip :: Vector Int16
iclip = forall a. Storable a => Int -> [a] -> Vector a
V.fromListN Int
1024 [ forall {a}. (Ord a, Num a) => a -> a
val Int16
i| Int16
i <- [(-Int16
512) .. Int16
511] ]
where val :: a -> a
val a
i | a
i forall a. Ord a => a -> a -> Bool
< (-a
256) = -a
256
| a
i forall a. Ord a => a -> a -> Bool
> a
255 = a
255
| Bool
otherwise = a
i
data IDctStage = IDctStage {
IDctStage -> Int
x0 :: {-# UNPACK #-} !Int,
IDctStage -> Int
x1 :: {-# UNPACK #-} !Int,
IDctStage -> Int
x2 :: {-# UNPACK #-} !Int,
IDctStage -> Int
x3 :: {-# UNPACK #-} !Int,
IDctStage -> Int
x4 :: {-# UNPACK #-} !Int,
IDctStage -> Int
x5 :: {-# UNPACK #-} !Int,
IDctStage -> Int
x6 :: {-# UNPACK #-} !Int,
IDctStage -> Int
x7 :: {-# UNPACK #-} !Int,
IDctStage -> Int
x8 :: {-# UNPACK #-} !Int
}
w1, w2, w3, w5, w6, w7 :: Int
w1 :: Int
w1 = Int
2841
w2 :: Int
w2 = Int
2676
w3 :: Int
w3 = Int
2408
w5 :: Int
w5 = Int
1609
w6 :: Int
w6 = Int
1108
w7 :: Int
w7 = Int
565
idctRow :: MutableMacroBlock s Int16 -> Int -> ST s ()
idctRow :: forall s. MutableMacroBlock s Int16 -> Int -> ST s ()
idctRow MutableMacroBlock s Int16
blk Int
idx = do
Int16
xx0 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
0 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx1 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
4 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx2 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
6 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx3 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
2 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx4 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
1 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx5 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
7 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx6 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
5 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx7 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
3 forall a. Num a => a -> a -> a
+ Int
idx)
let initialState :: IDctStage
initialState = IDctStage { x0 :: Int
x0 = (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx0 forall a. Bits a => a -> Int -> a
`unsafeShiftL` Int
11) forall a. Num a => a -> a -> a
+ Int
128
, x1 :: Int
x1 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx1 forall a. Bits a => a -> Int -> a
`unsafeShiftL` Int
11
, x2 :: Int
x2 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx2
, x3 :: Int
x3 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx3
, x4 :: Int
x4 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx4
, x5 :: Int
x5 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx5
, x6 :: Int
x6 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx6
, x7 :: Int
x7 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx7
, x8 :: Int
x8 = Int
0
}
firstStage :: IDctStage -> IDctStage
firstStage IDctStage
c = IDctStage
c { x4 :: Int
x4 = Int
x8' forall a. Num a => a -> a -> a
+ (Int
w1 forall a. Num a => a -> a -> a
- Int
w7) forall a. Num a => a -> a -> a
* IDctStage -> Int
x4 IDctStage
c
, x5 :: Int
x5 = Int
x8' forall a. Num a => a -> a -> a
- (Int
w1 forall a. Num a => a -> a -> a
+ Int
w7) forall a. Num a => a -> a -> a
* IDctStage -> Int
x5 IDctStage
c
, x6 :: Int
x6 = Int
x8'' forall a. Num a => a -> a -> a
- (Int
w3 forall a. Num a => a -> a -> a
- Int
w5) forall a. Num a => a -> a -> a
* IDctStage -> Int
x6 IDctStage
c
, x7 :: Int
x7 = Int
x8'' forall a. Num a => a -> a -> a
- (Int
w3 forall a. Num a => a -> a -> a
+ Int
w5) forall a. Num a => a -> a -> a
* IDctStage -> Int
x7 IDctStage
c
, x8 :: Int
x8 = Int
x8''
}
where x8' :: Int
x8' = Int
w7 forall a. Num a => a -> a -> a
* (IDctStage -> Int
x4 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x5 IDctStage
c)
x8'' :: Int
x8'' = Int
w3 forall a. Num a => a -> a -> a
* (IDctStage -> Int
x6 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x7 IDctStage
c)
secondStage :: IDctStage -> IDctStage
secondStage IDctStage
c = IDctStage
c { x0 :: Int
x0 = IDctStage -> Int
x0 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x1 IDctStage
c
, x8 :: Int
x8 = IDctStage -> Int
x0 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x1 IDctStage
c
, x1 :: Int
x1 = Int
x1''
, x2 :: Int
x2 = Int
x1' forall a. Num a => a -> a -> a
- (Int
w2 forall a. Num a => a -> a -> a
+ Int
w6) forall a. Num a => a -> a -> a
* IDctStage -> Int
x2 IDctStage
c
, x3 :: Int
x3 = Int
x1' forall a. Num a => a -> a -> a
+ (Int
w2 forall a. Num a => a -> a -> a
- Int
w6) forall a. Num a => a -> a -> a
* IDctStage -> Int
x3 IDctStage
c
, x4 :: Int
x4 = IDctStage -> Int
x4 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x6 IDctStage
c
, x6 :: Int
x6 = IDctStage -> Int
x5 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x7 IDctStage
c
, x5 :: Int
x5 = IDctStage -> Int
x5 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x7 IDctStage
c
}
where x1' :: Int
x1' = Int
w6 forall a. Num a => a -> a -> a
* (IDctStage -> Int
x3 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x2 IDctStage
c)
x1'' :: Int
x1'' = IDctStage -> Int
x4 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x6 IDctStage
c
thirdStage :: IDctStage -> IDctStage
thirdStage IDctStage
c = IDctStage
c { x7 :: Int
x7 = IDctStage -> Int
x8 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x3 IDctStage
c
, x8 :: Int
x8 = IDctStage -> Int
x8 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x3 IDctStage
c
, x3 :: Int
x3 = IDctStage -> Int
x0 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x2 IDctStage
c
, x0 :: Int
x0 = IDctStage -> Int
x0 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x2 IDctStage
c
, x2 :: Int
x2 = (Int
181 forall a. Num a => a -> a -> a
* (IDctStage -> Int
x4 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x5 IDctStage
c) forall a. Num a => a -> a -> a
+ Int
128) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
, x4 :: Int
x4 = (Int
181 forall a. Num a => a -> a -> a
* (IDctStage -> Int
x4 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x5 IDctStage
c) forall a. Num a => a -> a -> a
+ Int
128) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
}
scaled :: IDctStage -> IDctStage
scaled IDctStage
c = IDctStage
c { x0 :: Int
x0 = (IDctStage -> Int
x7 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x1 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
, x1 :: Int
x1 = (IDctStage -> Int
x3 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x2 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
, x2 :: Int
x2 = (IDctStage -> Int
x0 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x4 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
, x3 :: Int
x3 = (IDctStage -> Int
x8 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x6 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
, x4 :: Int
x4 = (IDctStage -> Int
x8 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x6 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
, x5 :: Int
x5 = (IDctStage -> Int
x0 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x4 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
, x6 :: Int
x6 = (IDctStage -> Int
x3 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x2 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
, x7 :: Int
x7 = (IDctStage -> Int
x7 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x1 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
}
transformed :: IDctStage
transformed = IDctStage -> IDctStage
scaled forall b c a. (b -> c) -> (a -> b) -> a -> c
. IDctStage -> IDctStage
thirdStage forall b c a. (b -> c) -> (a -> b) -> a -> c
. IDctStage -> IDctStage
secondStage forall a b. (a -> b) -> a -> b
$ IDctStage -> IDctStage
firstStage IDctStage
initialState
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
0 forall a. Num a => a -> a -> a
+ Int
idx)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ IDctStage -> Int
x0 IDctStage
transformed
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
1 forall a. Num a => a -> a -> a
+ Int
idx)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ IDctStage -> Int
x1 IDctStage
transformed
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
2 forall a. Num a => a -> a -> a
+ Int
idx)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ IDctStage -> Int
x2 IDctStage
transformed
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
3 forall a. Num a => a -> a -> a
+ Int
idx)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ IDctStage -> Int
x3 IDctStage
transformed
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
4 forall a. Num a => a -> a -> a
+ Int
idx)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ IDctStage -> Int
x4 IDctStage
transformed
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
5 forall a. Num a => a -> a -> a
+ Int
idx)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ IDctStage -> Int
x5 IDctStage
transformed
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
6 forall a. Num a => a -> a -> a
+ Int
idx)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ IDctStage -> Int
x6 IDctStage
transformed
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
7 forall a. Num a => a -> a -> a
+ Int
idx)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ IDctStage -> Int
x7 IDctStage
transformed
idctCol :: MutableMacroBlock s Int16 -> Int -> ST s ()
idctCol :: forall s. MutableMacroBlock s Int16 -> Int -> ST s ()
idctCol MutableMacroBlock s Int16
blk Int
idx = do
Int16
xx0 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` ( Int
0 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx1 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
8 forall a. Num a => a -> a -> a
* Int
4 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx2 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
8 forall a. Num a => a -> a -> a
* Int
6 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx3 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
8 forall a. Num a => a -> a -> a
* Int
2 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx4 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
8 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx5 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
8 forall a. Num a => a -> a -> a
* Int
7 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx6 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
8 forall a. Num a => a -> a -> a
* Int
5 forall a. Num a => a -> a -> a
+ Int
idx)
Int16
xx7 <- MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` (Int
8 forall a. Num a => a -> a -> a
* Int
3 forall a. Num a => a -> a -> a
+ Int
idx)
let initialState :: IDctStage
initialState = IDctStage { x0 :: Int
x0 = (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx0 forall a. Bits a => a -> Int -> a
`unsafeShiftL` Int
8) forall a. Num a => a -> a -> a
+ Int
8192
, x1 :: Int
x1 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx1 forall a. Bits a => a -> Int -> a
`unsafeShiftL` Int
8
, x2 :: Int
x2 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx2
, x3 :: Int
x3 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx3
, x4 :: Int
x4 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx4
, x5 :: Int
x5 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx5
, x6 :: Int
x6 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx6
, x7 :: Int
x7 = forall a b. (Integral a, Num b) => a -> b
fromIntegral Int16
xx7
, x8 :: Int
x8 = Int
0
}
firstStage :: IDctStage -> IDctStage
firstStage IDctStage
c = IDctStage
c { x4 :: Int
x4 = (Int
x8' forall a. Num a => a -> a -> a
+ (Int
w1 forall a. Num a => a -> a -> a
- Int
w7) forall a. Num a => a -> a -> a
* IDctStage -> Int
x4 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
3
, x5 :: Int
x5 = (Int
x8' forall a. Num a => a -> a -> a
- (Int
w1 forall a. Num a => a -> a -> a
+ Int
w7) forall a. Num a => a -> a -> a
* IDctStage -> Int
x5 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
3
, x6 :: Int
x6 = (Int
x8'' forall a. Num a => a -> a -> a
- (Int
w3 forall a. Num a => a -> a -> a
- Int
w5) forall a. Num a => a -> a -> a
* IDctStage -> Int
x6 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
3
, x7 :: Int
x7 = (Int
x8'' forall a. Num a => a -> a -> a
- (Int
w3 forall a. Num a => a -> a -> a
+ Int
w5) forall a. Num a => a -> a -> a
* IDctStage -> Int
x7 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
3
, x8 :: Int
x8 = Int
x8''
}
where x8' :: Int
x8' = Int
w7 forall a. Num a => a -> a -> a
* (IDctStage -> Int
x4 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x5 IDctStage
c) forall a. Num a => a -> a -> a
+ Int
4
x8'' :: Int
x8'' = Int
w3 forall a. Num a => a -> a -> a
* (IDctStage -> Int
x6 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x7 IDctStage
c) forall a. Num a => a -> a -> a
+ Int
4
secondStage :: IDctStage -> IDctStage
secondStage IDctStage
c = IDctStage
c { x8 :: Int
x8 = IDctStage -> Int
x0 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x1 IDctStage
c
, x0 :: Int
x0 = IDctStage -> Int
x0 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x1 IDctStage
c
, x2 :: Int
x2 = (Int
x1' forall a. Num a => a -> a -> a
- (Int
w2 forall a. Num a => a -> a -> a
+ Int
w6) forall a. Num a => a -> a -> a
* IDctStage -> Int
x2 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
3
, x3 :: Int
x3 = (Int
x1' forall a. Num a => a -> a -> a
+ (Int
w2 forall a. Num a => a -> a -> a
- Int
w6) forall a. Num a => a -> a -> a
* IDctStage -> Int
x3 IDctStage
c) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
3
, x4 :: Int
x4 = IDctStage -> Int
x4 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x6 IDctStage
c
, x1 :: Int
x1 = Int
x1''
, x6 :: Int
x6 = IDctStage -> Int
x5 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x7 IDctStage
c
, x5 :: Int
x5 = IDctStage -> Int
x5 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x7 IDctStage
c
}
where x1' :: Int
x1' = Int
w6 forall a. Num a => a -> a -> a
* (IDctStage -> Int
x3 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x2 IDctStage
c) forall a. Num a => a -> a -> a
+ Int
4
x1'' :: Int
x1'' = IDctStage -> Int
x4 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x6 IDctStage
c
thirdStage :: IDctStage -> IDctStage
thirdStage IDctStage
c = IDctStage
c { x7 :: Int
x7 = IDctStage -> Int
x8 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x3 IDctStage
c
, x8 :: Int
x8 = IDctStage -> Int
x8 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x3 IDctStage
c
, x3 :: Int
x3 = IDctStage -> Int
x0 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x2 IDctStage
c
, x0 :: Int
x0 = IDctStage -> Int
x0 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x2 IDctStage
c
, x2 :: Int
x2 = (Int
181 forall a. Num a => a -> a -> a
* (IDctStage -> Int
x4 IDctStage
c forall a. Num a => a -> a -> a
+ IDctStage -> Int
x5 IDctStage
c) forall a. Num a => a -> a -> a
+ Int
128) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
, x4 :: Int
x4 = (Int
181 forall a. Num a => a -> a -> a
* (IDctStage -> Int
x4 IDctStage
c forall a. Num a => a -> a -> a
- IDctStage -> Int
x5 IDctStage
c) forall a. Num a => a -> a -> a
+ Int
128) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8
}
clip :: Int -> Int16
clip Int
i | Int
i forall a. Ord a => a -> a -> Bool
< Int
511 = if Int
i forall a. Ord a => a -> a -> Bool
> -Int
512 then Vector Int16
iclip forall a. Storable a => Vector a -> Int -> a
`V.unsafeIndex` (Int
i forall a. Num a => a -> a -> a
+ Int
512)
else Vector Int16
iclip forall a. Storable a => Vector a -> Int -> a
`V.unsafeIndex` Int
0
| Bool
otherwise = Vector Int16
iclip forall a. Storable a => Vector a -> Int -> a
`V.unsafeIndex` Int
1023
f :: IDctStage
f = IDctStage -> IDctStage
thirdStage forall b c a. (b -> c) -> (a -> b) -> a -> c
. IDctStage -> IDctStage
secondStage forall a b. (a -> b) -> a -> b
$ IDctStage -> IDctStage
firstStage IDctStage
initialState
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
idx forall a. Num a => a -> a -> a
+ Int
8forall a. Num a => a -> a -> a
*Int
0)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int16
clip forall a b. (a -> b) -> a -> b
$ (IDctStage -> Int
x7 IDctStage
f forall a. Num a => a -> a -> a
+ IDctStage -> Int
x1 IDctStage
f) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
14
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
idx forall a. Num a => a -> a -> a
+ Int
8 )) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int16
clip forall a b. (a -> b) -> a -> b
$ (IDctStage -> Int
x3 IDctStage
f forall a. Num a => a -> a -> a
+ IDctStage -> Int
x2 IDctStage
f) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
14
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
idx forall a. Num a => a -> a -> a
+ Int
8forall a. Num a => a -> a -> a
*Int
2)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int16
clip forall a b. (a -> b) -> a -> b
$ (IDctStage -> Int
x0 IDctStage
f forall a. Num a => a -> a -> a
+ IDctStage -> Int
x4 IDctStage
f) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
14
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
idx forall a. Num a => a -> a -> a
+ Int
8forall a. Num a => a -> a -> a
*Int
3)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int16
clip forall a b. (a -> b) -> a -> b
$ (IDctStage -> Int
x8 IDctStage
f forall a. Num a => a -> a -> a
+ IDctStage -> Int
x6 IDctStage
f) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
14
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
idx forall a. Num a => a -> a -> a
+ Int
8forall a. Num a => a -> a -> a
*Int
4)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int16
clip forall a b. (a -> b) -> a -> b
$ (IDctStage -> Int
x8 IDctStage
f forall a. Num a => a -> a -> a
- IDctStage -> Int
x6 IDctStage
f) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
14
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
idx forall a. Num a => a -> a -> a
+ Int
8forall a. Num a => a -> a -> a
*Int
5)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int16
clip forall a b. (a -> b) -> a -> b
$ (IDctStage -> Int
x0 IDctStage
f forall a. Num a => a -> a -> a
- IDctStage -> Int
x4 IDctStage
f) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
14
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
idx forall a. Num a => a -> a -> a
+ Int
8forall a. Num a => a -> a -> a
*Int
6)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int16
clip forall a b. (a -> b) -> a -> b
$ (IDctStage -> Int
x3 IDctStage
f forall a. Num a => a -> a -> a
- IDctStage -> Int
x2 IDctStage
f) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
14
(MutableMacroBlock s Int16
blk forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` (Int
idx forall a. Num a => a -> a -> a
+ Int
8forall a. Num a => a -> a -> a
*Int
7)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int16
clip forall a b. (a -> b) -> a -> b
$ (IDctStage -> Int
x7 IDctStage
f forall a. Num a => a -> a -> a
- IDctStage -> Int
x1 IDctStage
f) forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
14
{-# INLINE fastIdct #-}
fastIdct :: MutableMacroBlock s Int16
-> ST s (MutableMacroBlock s Int16)
fastIdct :: forall s.
MutableMacroBlock s Int16 -> ST s (MutableMacroBlock s Int16)
fastIdct MutableMacroBlock s Int16
block = Int -> ST s (MutableMacroBlock s Int16)
rows Int
0
where rows :: Int -> ST s (MutableMacroBlock s Int16)
rows Int
8 = Int -> ST s (MutableMacroBlock s Int16)
cols Int
0
rows Int
i = forall s. MutableMacroBlock s Int16 -> Int -> ST s ()
idctRow MutableMacroBlock s Int16
block (Int
8 forall a. Num a => a -> a -> a
* Int
i) forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Int -> ST s (MutableMacroBlock s Int16)
rows (Int
i forall a. Num a => a -> a -> a
+ Int
1)
cols :: Int -> ST s (MutableMacroBlock s Int16)
cols Int
8 = forall (m :: * -> *) a. Monad m => a -> m a
return MutableMacroBlock s Int16
block
cols Int
i = forall s. MutableMacroBlock s Int16 -> Int -> ST s ()
idctCol MutableMacroBlock s Int16
block Int
i forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Int -> ST s (MutableMacroBlock s Int16)
cols (Int
i forall a. Num a => a -> a -> a
+ Int
1)
{-# INLINE mutableLevelShift #-}
mutableLevelShift :: MutableMacroBlock s Int16
-> ST s (MutableMacroBlock s Int16)
mutableLevelShift :: forall s.
MutableMacroBlock s Int16 -> ST s (MutableMacroBlock s Int16)
mutableLevelShift MutableMacroBlock s Int16
block = Int -> ST s (MutableMacroBlock s Int16)
update Int
0
where update :: Int -> ST s (MutableMacroBlock s Int16)
update Int
64 = forall (m :: * -> *) a. Monad m => a -> m a
return MutableMacroBlock s Int16
block
update Int
idx = do
Int16
val <- MutableMacroBlock s Int16
block forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> m a
`M.unsafeRead` Int
idx
(MutableMacroBlock s Int16
block forall (m :: * -> *) a.
(PrimMonad m, Storable a) =>
MVector (PrimState m) a -> Int -> a -> m ()
`M.unsafeWrite` Int
idx) forall a b. (a -> b) -> a -> b
$ Int16
val forall a. Num a => a -> a -> a
+ Int16
128
Int -> ST s (MutableMacroBlock s Int16)
update forall a b. (a -> b) -> a -> b
$ Int
idx forall a. Num a => a -> a -> a
+ Int
1