    {-# LANGUAGE FlexibleContexts #-}
    {-# LANGUAGE TypeFamilies #-}
    -- | Module providing a 'fast' implementation of IDCT

    --

    -- inverse two dimensional DCT, Chen-Wang algorithm

    -- (cf. IEEE ASSP-32, pp. 803-816, Aug. 1984)

    -- 32-bit integer arithmetic (8 bit coefficients)

    -- 11 mults, 29 adds per DCT

    --                                      sE, 18.8.91

    --

    -- coefficients extended to 12 bit for IEEE1180-1990

    -- compliance                           sE,  2.1.94

    --

    -- this code assumes >> to be a two's-complement arithmetic

    -- right shift: (-2)>>1 == -1 , (-3)>>1 == -2

    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 = Int -> [Int16] -> Vector Int16
    forall a. Storable a => Int -> [a] -> Vector a
    V.fromListN 1024 [ Int16 -> Int16
    forall p. (Ord p, Num p) => p -> p
    val Int16
    i| Int16
    i <- [(-512) .. 511] ]
        where val :: p -> p
    val i :: p
    i | p
    i p -> p -> Bool
    forall a. Ord a => a -> a -> Bool
    < (-256) = -256
                    | p
    i p -> p -> Bool
    forall a. Ord a => a -> a -> Bool
    > 255    =  255
                    | Bool
    otherwise  =  p
    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 = 2841 -- 2048*sqrt(2)*cos(1*pi/16)

    w2 :: Int
    w2 = 2676 -- 2048*sqrt(2)*cos(2*pi/16)

    w3 :: Int
    w3 = 2408 -- 2048*sqrt(2)*cos(3*pi/16)

    w5 :: Int
    w5 = 1609 -- 2048*sqrt(2)*cos(5*pi/16)

    w6 :: Int
    w6 = 1108 -- 2048*sqrt(2)*cos(6*pi/16)

    w7 :: Int
    w7 = 565  -- 2048*sqrt(2)*cos(7*pi/16)

    -- row (horizontal) IDCT

    --

    --           7                       pi         1

    -- dst[k] = sum c[l] * src[l] * cos( -- * ( k + - ) * l )

    --          l=0                      8          2

    --

    -- where: c[0]    = 128

    --        c[1..7] = 128*sqrt(2)

    idctRow :: MutableMacroBlock s Int16 -> Int ->  ST s ()
    idctRow :: MutableMacroBlock s Int16 -> Int -> ST s ()
    idctRow blk :: MutableMacroBlock s Int16
    blk idx :: Int
    idx = do
      Int16
    xx0 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (0 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx1 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (4 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx2 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (6 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx3 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (2 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx4 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (1 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx5 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (7 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx6 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (5 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx7 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (3 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      let initialState :: IDctStage
    initialState = $WIDctStage :: Int
    -> Int
    -> Int
    -> Int
    -> Int
    -> Int
    -> Int
    -> Int
    -> Int
    -> IDctStage
    IDctStage { x0 :: Int
    x0 = (Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx0 Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftL` 11) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 128
                                   , x1 :: Int
    x1 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx1 Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftL` 11
                                   , x2 :: Int
    x2 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx2
                                   , x3 :: Int
    x3 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx3
                                   , x4 :: Int
    x4 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx4
                                   , x5 :: Int
    x5 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx5
                                   , x6 :: Int
    x6 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx6
                                   , x7 :: Int
    x7 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx7
                                   , x8 :: Int
    x8 = 0
                                   }

          firstStage :: IDctStage -> IDctStage
    firstStage c :: IDctStage
    c = IDctStage
    c { x4 :: Int
    x4 = Int
    x8'  Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + (Int
    w1 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - Int
    w7) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x4 IDctStage
    c
                           , x5 :: Int
    x5 = Int
    x8'  Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - (Int
    w1 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    w7) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x5 IDctStage
    c
                           , x6 :: Int
    x6 = Int
    x8'' Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - (Int
    w3 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - Int
    w5) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x6 IDctStage
    c
                           , x7 :: Int
    x7 = Int
    x8'' Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - (Int
    w3 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    w5) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x7 IDctStage
    c
                           , x8 :: Int
    x8 = Int
    x8''
                           }
              where x8' :: Int
    x8' = Int
    w7 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * (IDctStage -> Int
    x4 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x5 IDctStage
    c)
                    x8'' :: Int
    x8'' = Int
    w3 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * (IDctStage -> Int
    x6 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x7 IDctStage
    c)

          secondStage :: IDctStage -> IDctStage
    secondStage c :: IDctStage
    c = IDctStage
    c { x0 :: Int
    x0 = IDctStage -> Int
    x0 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x1 IDctStage
    c
                            , x8 :: Int
    x8 = IDctStage -> Int
    x0 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x1 IDctStage
    c
                            , x1 :: Int
    x1 = Int
    x1''
                            , x2 :: Int
    x2 = Int
    x1' Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - (Int
    w2 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    w6) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x2 IDctStage
    c
                            , x3 :: Int
    x3 = Int
    x1' Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + (Int
    w2 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - Int
    w6) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x3 IDctStage
    c
                            , x4 :: Int
    x4 = IDctStage -> Int
    x4 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x6 IDctStage
    c
                            , x6 :: Int
    x6 = IDctStage -> Int
    x5 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x7 IDctStage
    c
                            , x5 :: Int
    x5 = IDctStage -> Int
    x5 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x7 IDctStage
    c
                            }
                where x1' :: Int
    x1'  = Int
    w6 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * (IDctStage -> Int
    x3 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x2 IDctStage
    c)
                      x1'' :: Int
    x1'' = IDctStage -> Int
    x4 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x6 IDctStage
    c

          thirdStage :: IDctStage -> IDctStage
    thirdStage c :: IDctStage
    c = IDctStage
    c { x7 :: Int
    x7 = IDctStage -> Int
    x8 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x3 IDctStage
    c
                           , x8 :: Int
    x8 = IDctStage -> Int
    x8 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x3 IDctStage
    c
                           , x3 :: Int
    x3 = IDctStage -> Int
    x0 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x2 IDctStage
    c
                           , x0 :: Int
    x0 = IDctStage -> Int
    x0 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x2 IDctStage
    c
                           , x2 :: Int
    x2 = (181 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * (IDctStage -> Int
    x4 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x5 IDctStage
    c) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 128) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                           , x4 :: Int
    x4 = (181 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * (IDctStage -> Int
    x4 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x5 IDctStage
    c) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 128) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                           }
          scaled :: IDctStage -> IDctStage
    scaled c :: IDctStage
    c = IDctStage
    c { x0 :: Int
    x0 = (IDctStage -> Int
    x7 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x1 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                       , x1 :: Int
    x1 = (IDctStage -> Int
    x3 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x2 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                       , x2 :: Int
    x2 = (IDctStage -> Int
    x0 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x4 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                       , x3 :: Int
    x3 = (IDctStage -> Int
    x8 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x6 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                       , x4 :: Int
    x4 = (IDctStage -> Int
    x8 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x6 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                       , x5 :: Int
    x5 = (IDctStage -> Int
    x0 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x4 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                       , x6 :: Int
    x6 = (IDctStage -> Int
    x3 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x2 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                       , x7 :: Int
    x7 = (IDctStage -> Int
    x7 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x1 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                       }
          transformed :: IDctStage
    transformed = IDctStage -> IDctStage
    scaled (IDctStage -> IDctStage)
    -> (IDctStage -> IDctStage) -> IDctStage -> IDctStage
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . IDctStage -> IDctStage
    thirdStage (IDctStage -> IDctStage)
    -> (IDctStage -> IDctStage) -> IDctStage -> IDctStage
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . IDctStage -> IDctStage
    secondStage (IDctStage -> IDctStage) -> IDctStage -> IDctStage
    forall a b. (a -> b) -> a -> b
    $ IDctStage -> IDctStage
    firstStage IDctStage
    initialState

      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (0 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ IDctStage -> Int
    x0 IDctStage
    transformed
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (1 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ IDctStage -> Int
    x1 IDctStage
    transformed
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (2 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ IDctStage -> Int
    x2 IDctStage
    transformed
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (3 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ IDctStage -> Int
    x3 IDctStage
    transformed
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (4 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ IDctStage -> Int
    x4 IDctStage
    transformed
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (5 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ IDctStage -> Int
    x5 IDctStage
    transformed
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (6 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ IDctStage -> Int
    x6 IDctStage
    transformed
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (7 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ IDctStage -> Int
    x7 IDctStage
    transformed

    -- column (vertical) IDCT

    --

    --             7                         pi         1

    -- dst[8*k] = sum c[l] * src[8*l] * cos( -- * ( k + - ) * l )

    --            l=0                        8          2

    --

    -- where: c[0]    = 1/1024

    --        c[1..7] = (1/1024)*sqrt(2)

    --

    idctCol :: MutableMacroBlock s Int16 -> Int -> ST s ()
    idctCol :: MutableMacroBlock s Int16 -> Int -> ST s ()
    idctCol blk :: MutableMacroBlock s Int16
    blk idx :: Int
    idx = do
      Int16
    xx0 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (    0 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx1 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (8 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * 4 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx2 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (8 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * 6 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx3 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (8 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * 2 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx4 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (8     Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx5 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (8 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * 7 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx6 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (8 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * 5 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      Int16
    xx7 <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` (8 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * 3 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    idx)
      let initialState :: IDctStage
    initialState = $WIDctStage :: Int
    -> Int
    -> Int
    -> Int
    -> Int
    -> Int
    -> Int
    -> Int
    -> Int
    -> IDctStage
    IDctStage { x0 :: Int
    x0 = (Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx0 Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftL` 8) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 8192
                                   , x1 :: Int
    x1 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx1 Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftL` 8
                                   , x2 :: Int
    x2 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx2
                                   , x3 :: Int
    x3 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx3
                                   , x4 :: Int
    x4 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx4
                                   , x5 :: Int
    x5 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx5
                                   , x6 :: Int
    x6 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx6
                                   , x7 :: Int
    x7 =  Int16 -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Int16
    xx7
                                   , x8 :: Int
    x8 = 0
                                   }
          firstStage :: IDctStage -> IDctStage
    firstStage c :: IDctStage
    c = IDctStage
    c { x4 :: Int
    x4 = (Int
    x8'  Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + (Int
    w1 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - Int
    w7) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x4 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 3
                           , x5 :: Int
    x5 = (Int
    x8'  Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - (Int
    w1 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    w7) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x5 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 3
                           , x6 :: Int
    x6 = (Int
    x8'' Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - (Int
    w3 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - Int
    w5) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x6 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 3
                           , x7 :: Int
    x7 = (Int
    x8'' Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - (Int
    w3 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    w5) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x7 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 3
                           , x8 :: Int
    x8 = Int
    x8''
                           }
              where x8' :: Int
    x8'  = Int
    w7 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * (IDctStage -> Int
    x4 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x5 IDctStage
    c) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 4
                    x8'' :: Int
    x8'' = Int
    w3 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * (IDctStage -> Int
    x6 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x7 IDctStage
    c) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 4

          secondStage :: IDctStage -> IDctStage
    secondStage c :: IDctStage
    c = IDctStage
    c { x8 :: Int
    x8 = IDctStage -> Int
    x0 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x1 IDctStage
    c
                            , x0 :: Int
    x0 = IDctStage -> Int
    x0 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x1 IDctStage
    c
                            , x2 :: Int
    x2 = (Int
    x1' Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - (Int
    w2 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + Int
    w6) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x2 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 3
                            , x3 :: Int
    x3 = (Int
    x1' Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + (Int
    w2 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - Int
    w6) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * IDctStage -> Int
    x3 IDctStage
    c) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 3
                            , x4 :: Int
    x4 = IDctStage -> Int
    x4 IDctStage
    c Int -> Int -> Int
    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 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x7 IDctStage
    c
                            , x5 :: Int
    x5 = IDctStage -> Int
    x5 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x7 IDctStage
    c
                            }
              where x1' :: Int
    x1'  = Int
    w6 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * (IDctStage -> Int
    x3 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x2 IDctStage
    c) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 4
                    x1'' :: Int
    x1'' = IDctStage -> Int
    x4 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x6 IDctStage
    c

          thirdStage :: IDctStage -> IDctStage
    thirdStage c :: IDctStage
    c = IDctStage
    c { x7 :: Int
    x7 = IDctStage -> Int
    x8 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x3 IDctStage
    c
                           , x8 :: Int
    x8 = IDctStage -> Int
    x8 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x3 IDctStage
    c
                           , x3 :: Int
    x3 = IDctStage -> Int
    x0 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x2 IDctStage
    c
                           , x0 :: Int
    x0 = IDctStage -> Int
    x0 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x2 IDctStage
    c
                           , x2 :: Int
    x2 = (181 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * (IDctStage -> Int
    x4 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x5 IDctStage
    c) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 128) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                           , x4 :: Int
    x4 = (181 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * (IDctStage -> Int
    x4 IDctStage
    c Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x5 IDctStage
    c) Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 128) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 8
                           }

          clip :: Int -> Int16
    clip i :: Int
    i | Int
    i Int -> Int -> Bool
    forall a. Ord a => a -> a -> Bool
    < 511 = if Int
    i Int -> Int -> Bool
    forall a. Ord a => a -> a -> Bool
    > -512 then Vector Int16
    iclip Vector Int16 -> Int -> Int16
    forall a. Storable a => Vector a -> Int -> a
    `V.unsafeIndex` (Int
    i Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 512)
                                        else Vector Int16
    iclip Vector Int16 -> Int -> Int16
    forall a. Storable a => Vector a -> Int -> a
    `V.unsafeIndex` 0

                 | Bool
    otherwise = Vector Int16
    iclip Vector Int16 -> Int -> Int16
    forall a. Storable a => Vector a -> Int -> a
    `V.unsafeIndex` 1023

          f :: IDctStage
    f = IDctStage -> IDctStage
    thirdStage (IDctStage -> IDctStage)
    -> (IDctStage -> IDctStage) -> IDctStage -> IDctStage
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . IDctStage -> IDctStage
    secondStage (IDctStage -> IDctStage) -> IDctStage -> IDctStage
    forall a b. (a -> b) -> a -> b
    $ IDctStage -> IDctStage
    firstStage IDctStage
    initialState
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (Int
    idx Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 8Int -> Int -> Int
    forall a. Num a => a -> a -> a
    *0)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    clip (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ (IDctStage -> Int
    x7 IDctStage
    f Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x1 IDctStage
    f) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 14
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (Int
    idx Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 8  )) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    clip (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ (IDctStage -> Int
    x3 IDctStage
    f Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x2 IDctStage
    f) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 14
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (Int
    idx Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 8Int -> Int -> Int
    forall a. Num a => a -> a -> a
    *2)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    clip (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ (IDctStage -> Int
    x0 IDctStage
    f Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x4 IDctStage
    f) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 14
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (Int
    idx Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 8Int -> Int -> Int
    forall a. Num a => a -> a -> a
    *3)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    clip (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ (IDctStage -> Int
    x8 IDctStage
    f Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + IDctStage -> Int
    x6 IDctStage
    f) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 14
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (Int
    idx Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 8Int -> Int -> Int
    forall a. Num a => a -> a -> a
    *4)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    clip (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ (IDctStage -> Int
    x8 IDctStage
    f Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x6 IDctStage
    f) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 14
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (Int
    idx Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 8Int -> Int -> Int
    forall a. Num a => a -> a -> a
    *5)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    clip (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ (IDctStage -> Int
    x0 IDctStage
    f Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x4 IDctStage
    f) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 14
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (Int
    idx Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 8Int -> Int -> Int
    forall a. Num a => a -> a -> a
    *6)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    clip (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ (IDctStage -> Int
    x3 IDctStage
    f Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x2 IDctStage
    f) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 14
      (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    blk MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` (Int
    idx Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 8Int -> Int -> Int
    forall a. Num a => a -> a -> a
    *7)) (Int16 -> ST s ()) -> (Int -> Int16) -> Int -> ST s ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Int -> Int16
    clip (Int -> ST s ()) -> Int -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ (IDctStage -> Int
    x7 IDctStage
    f Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - IDctStage -> Int
    x1 IDctStage
    f) Int -> Int -> Int
    forall a. Bits a => a -> Int -> a
    `unsafeShiftR` 14

    {-# INLINE fastIdct #-}
    -- | Algorithm to call to perform an IDCT, return the same

    -- block that the one given as input.

    fastIdct :: MutableMacroBlock s Int16
             -> ST s (MutableMacroBlock s Int16)
    fastIdct :: MutableMacroBlock s Int16 -> ST s (MutableMacroBlock s Int16)
    fastIdct block :: MutableMacroBlock s Int16
    block = Int -> ST s (MutableMacroBlock s Int16)
    rows 0
      where rows :: Int -> ST s (MutableMacroBlock s Int16)
    rows 8 = Int -> ST s (MutableMacroBlock s Int16)
    cols 0
            rows i :: Int
    i = MutableMacroBlock s Int16 -> Int -> ST s ()
    forall s. MutableMacroBlock s Int16 -> Int -> ST s ()
    idctRow MutableMacroBlock s Int16
    block (8 Int -> Int -> Int
    forall a. Num a => a -> a -> a
    * Int
    i) ST s ()
    -> ST s (MutableMacroBlock s Int16)
    -> ST s (MutableMacroBlock s Int16)
    forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
    >> Int -> ST s (MutableMacroBlock s Int16)
    rows (Int
    i Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 1)

            cols :: Int -> ST s (MutableMacroBlock s Int16)
    cols 8 = MutableMacroBlock s Int16 -> ST s (MutableMacroBlock s Int16)
    forall (m :: * -> *) a. Monad m => a -> m a
    return MutableMacroBlock s Int16
    block
            cols i :: Int
    i = MutableMacroBlock s Int16 -> Int -> ST s ()
    forall s. MutableMacroBlock s Int16 -> Int -> ST s ()
    idctCol MutableMacroBlock s Int16
    block Int
    i ST s ()
    -> ST s (MutableMacroBlock s Int16)
    -> ST s (MutableMacroBlock s Int16)
    forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
    >> Int -> ST s (MutableMacroBlock s Int16)
    cols (Int
    i Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 1)

    {-# INLINE mutableLevelShift #-}
    -- | Perform a Jpeg level shift in a mutable fashion.

    mutableLevelShift :: MutableMacroBlock s Int16
                      -> ST s (MutableMacroBlock s Int16)
    mutableLevelShift :: MutableMacroBlock s Int16 -> ST s (MutableMacroBlock s Int16)
    mutableLevelShift block :: MutableMacroBlock s Int16
    block = Int -> ST s (MutableMacroBlock s Int16)
    update 0
      where update :: Int -> ST s (MutableMacroBlock s Int16)
    update 64 = MutableMacroBlock s Int16 -> ST s (MutableMacroBlock s Int16)
    forall (m :: * -> *) a. Monad m => a -> m a
    return MutableMacroBlock s Int16
    block
            update idx :: Int
    idx = do
                Int16
    val <- MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    block MVector (PrimState (ST s)) Int16 -> Int -> ST s Int16
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> m a
    `M.unsafeRead` Int
    idx
                (MutableMacroBlock s Int16
    MVector (PrimState (ST s)) Int16
    block MVector (PrimState (ST s)) Int16 -> Int -> Int16 -> ST s ()
    forall (m :: * -> *) a.
    (PrimMonad m, Storable a) =>
    MVector (PrimState m) a -> Int -> a -> m ()
    `M.unsafeWrite` Int
    idx) (Int16 -> ST s ()) -> Int16 -> ST s ()
    forall a b. (a -> b) -> a -> b
    $ Int16
    val Int16 -> Int16 -> Int16
    forall a. Num a => a -> a -> a
    + 128
                Int -> ST s (MutableMacroBlock s Int16)
    update (Int -> ST s (MutableMacroBlock s Int16))
    -> Int -> ST s (MutableMacroBlock s Int16)
    forall a b. (a -> b) -> a -> b
    $ Int
    idx Int -> Int -> Int
    forall a. Num a => a -> a -> a
    + 1