    {-# OPTIONS_HADDOCK hide #-}
    module Codec.BMP.Compression
            (Compression(..))
    where
    import Data.Word
    import Data.Binary
    import Data.Binary.Get
    import Data.Binary.Put

    -- | The Compression mode says how the image data is encoded in the file.
    data Compression
            = CompressionRGB
            | CompressionRLE8
            | CompressionRLE4
            | CompressionBitFields
            | CompressionJPEG
            | CompressionPNG
            | CompressionUnknown Word32
            deriving (Int -> Compression -> ShowS
    [Compression] -> ShowS
    Compression -> String
    (Int -> Compression -> ShowS)
    -> (Compression -> String)
    -> ([Compression] -> ShowS)
    -> Show Compression
    forall a.
    (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
    $cshowsPrec :: Int -> Compression -> ShowS
    showsPrec :: Int -> Compression -> ShowS
    $cshow :: Compression -> String
    show :: Compression -> String
    $cshowList :: [Compression] -> ShowS
    showList :: [Compression] -> ShowS
    Show, Compression -> Compression -> Bool
    (Compression -> Compression -> Bool)
    -> (Compression -> Compression -> Bool) -> Eq Compression
    forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
    $c== :: Compression -> Compression -> Bool
    == :: Compression -> Compression -> Bool
    $c/= :: Compression -> Compression -> Bool
    /= :: Compression -> Compression -> Bool
    Eq)

    instance Binary Compression where
     get :: Get Compression
    get
      = do  c       <- Get Word32
    getWord32le
            case c of
             Word32
    0      -> Compression -> Get Compression
    forall a. a -> Get a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Compression -> Get Compression) -> Compression -> Get Compression
    forall a b. (a -> b) -> a -> b
    $ Compression
    CompressionRGB
             Word32
    1      -> Compression -> Get Compression
    forall a. a -> Get a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Compression -> Get Compression) -> Compression -> Get Compression
    forall a b. (a -> b) -> a -> b
    $ Compression
    CompressionRLE8
             Word32
    2      -> Compression -> Get Compression
    forall a. a -> Get a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Compression -> Get Compression) -> Compression -> Get Compression
    forall a b. (a -> b) -> a -> b
    $ Compression
    CompressionRLE4
             Word32
    3      -> Compression -> Get Compression
    forall a. a -> Get a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Compression -> Get Compression) -> Compression -> Get Compression
    forall a b. (a -> b) -> a -> b
    $ Compression
    CompressionBitFields
             Word32
    4      -> Compression -> Get Compression
    forall a. a -> Get a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Compression -> Get Compression) -> Compression -> Get Compression
    forall a b. (a -> b) -> a -> b
    $ Compression
    CompressionJPEG
             Word32
    5      -> Compression -> Get Compression
    forall a. a -> Get a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Compression -> Get Compression) -> Compression -> Get Compression
    forall a b. (a -> b) -> a -> b
    $ Compression
    CompressionPNG
             Word32
    _      -> Compression -> Get Compression
    forall a. a -> Get a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Compression -> Get Compression) -> Compression -> Get Compression
    forall a b. (a -> b) -> a -> b
    $ Word32 -> Compression
    CompressionUnknown Word32
    c

     put :: Compression -> Put
    put Compression
    c
      = case Compression
    c of
            Compression
    CompressionRGB          -> Word32 -> Put
    putWord32le Word32
    0
            Compression
    CompressionRLE8         -> Word32 -> Put
    putWord32le Word32
    1
            Compression
    CompressionRLE4         -> Word32 -> Put
    putWord32le Word32
    2
            Compression
    CompressionBitFields    -> Word32 -> Put
    putWord32le Word32
    3
            Compression
    CompressionJPEG         -> Word32 -> Put
    putWord32le Word32
    4
            Compression
    CompressionPNG          -> Word32 -> Put
    putWord32le Word32
    5
            CompressionUnknown Word32
    x    -> Word32 -> Put
    putWord32le Word32
    x