packages feed

opencv-0.0.0.0: src/OpenCV/Internal/ImgCodecs.hsc

{-# language CPP #-}
{-# language OverloadedLists #-}

#ifndef ENABLE_INTERNAL_DOCUMENTATION
{-# OPTIONS_HADDOCK hide #-}
#endif

module OpenCV.Internal.ImgCodecs
    ( ImreadMode(..)
    , marshalImreadMode
    , JpegParams(..)
    , defaultJpegParams
    , marshalJpegParams
    , PngStrategy(..)
    , marshalPngStrategy
    , PngParams(..)
    , defaultPngParams
    , marshalPngParams
    , OutputFormat(..)
    , marshalOutputFormat
    ) where

import "base" Data.Int
import "base" Data.Word
import "base" Foreign.C.Types
import "base" Foreign.Marshal.Utils ( fromBool )
import qualified "vector" Data.Vector.Storable as VS


#include <stdint.h>
#include <bindings.dsl.h>
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"

#include "namespace.hpp"

data ImreadMode
   = ImreadUnchanged
   | ImreadGrayscale
   | ImreadColor
   | ImreadAnyDepth
   | ImreadAnyColor
   | ImreadLoadGdal
     deriving (Show)

#num IMREAD_UNCHANGED
#num IMREAD_GRAYSCALE
#num IMREAD_COLOR
#num IMREAD_ANYDEPTH
#num IMREAD_ANYCOLOR
#num IMREAD_LOAD_GDAL

marshalImreadMode :: ImreadMode -> Int32
marshalImreadMode = \case
    ImreadUnchanged -> c'IMREAD_UNCHANGED
    ImreadGrayscale -> c'IMREAD_GRAYSCALE
    ImreadColor     -> c'IMREAD_COLOR
    ImreadAnyDepth  -> c'IMREAD_ANYDEPTH
    ImreadAnyColor  -> c'IMREAD_ANYCOLOR
    ImreadLoadGdal  -> c'IMREAD_LOAD_GDAL

data JpegParams =
     JpegParams
     { jpegParamQuality         :: Int -- ^ \[0..100\]
     , jpegParamProgressive     :: Bool
     , jpegParamOptimize        :: Bool
     , jpegParamRestartInterval :: Word16
     , jpegParamLumaQuality     :: Int
     , jpegParamChromaQuality   :: Int
     } deriving Show

defaultJpegParams :: JpegParams
defaultJpegParams =
    JpegParams
    { jpegParamQuality         = 95
    , jpegParamProgressive     = False
    , jpegParamOptimize        = False
    , jpegParamRestartInterval = 0
    , jpegParamLumaQuality     = -1
    , jpegParamChromaQuality   = -1
    }

#num IMWRITE_JPEG_QUALITY
#num IMWRITE_JPEG_PROGRESSIVE
#num IMWRITE_JPEG_OPTIMIZE
#num IMWRITE_JPEG_RST_INTERVAL
#num IMWRITE_JPEG_LUMA_QUALITY
#num IMWRITE_JPEG_CHROMA_QUALITY

marshalJpegParams :: JpegParams -> VS.Vector CInt
marshalJpegParams params =
    [ c'IMWRITE_JPEG_QUALITY       , fromIntegral $ jpegParamQuality         params
    , c'IMWRITE_JPEG_PROGRESSIVE   , fromBool     $ jpegParamProgressive     params
    , c'IMWRITE_JPEG_OPTIMIZE      , fromBool     $ jpegParamOptimize        params
    , c'IMWRITE_JPEG_RST_INTERVAL  , fromIntegral $ jpegParamRestartInterval params
    , c'IMWRITE_JPEG_LUMA_QUALITY  , fromIntegral $ jpegParamLumaQuality     params
    , c'IMWRITE_JPEG_CHROMA_QUALITY, fromIntegral $ jpegParamChromaQuality   params
    ]

data PngStrategy
   = PngStrategyDefault
   | PngStrategyFiltered
   | PngStrategyHuffmanOnly
   | PngStrategyRLE
   | PngStrategyFixed
     deriving Show

#num IMWRITE_PNG_STRATEGY_DEFAULT
#num IMWRITE_PNG_STRATEGY_FILTERED
#num IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY
#num IMWRITE_PNG_STRATEGY_RLE
#num IMWRITE_PNG_STRATEGY_FIXED

marshalPngStrategy :: PngStrategy -> CInt
marshalPngStrategy = \case
   PngStrategyDefault     -> c'IMWRITE_PNG_STRATEGY_DEFAULT
   PngStrategyFiltered    -> c'IMWRITE_PNG_STRATEGY_FILTERED
   PngStrategyHuffmanOnly -> c'IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY
   PngStrategyRLE         -> c'IMWRITE_PNG_STRATEGY_RLE
   PngStrategyFixed       -> c'IMWRITE_PNG_STRATEGY_FIXED

data PngParams =
     PngParams
     { pngParamCompression :: Int
     , pngParamStrategy    :: PngStrategy
     , pngParamBinaryLevel :: Bool
     } deriving Show

defaultPngParams :: PngParams
defaultPngParams =
    PngParams
    { pngParamCompression = 3
    , pngParamStrategy    = PngStrategyDefault
    , pngParamBinaryLevel = False
    }

#num IMWRITE_PNG_COMPRESSION
#num IMWRITE_PNG_STRATEGY
#num IMWRITE_PNG_BILEVEL

marshalPngParams :: PngParams -> VS.Vector CInt
marshalPngParams params =
    [ c'IMWRITE_PNG_COMPRESSION, fromIntegral        $ pngParamCompression params
    , c'IMWRITE_PNG_STRATEGY   , marshalPngStrategy $ pngParamStrategy    params
    , c'IMWRITE_PNG_BILEVEL    , fromBool            $ pngParamBinaryLevel params
    ]

data OutputFormat
   = OutputBmp
   | OutputExr
   | OutputHdr Bool -- ^ Compression (run length encoding)
   | OutputJpeg JpegParams
   | OutputJpeg2000
   | OutputPng PngParams
   | OutputPxm Bool -- ^ Binary
   | OutputSunras
   | OutputTiff
   | OutputWebP Int -- ^ Quality [1..100], > 100 == lossless
     deriving Show

#num IMWRITE_PXM_BINARY
#num IMWRITE_WEBP_QUALITY

marshalOutputFormat :: OutputFormat -> (String, VS.Vector CInt)
marshalOutputFormat = \case
    OutputBmp          -> (".bmp" , [])
    OutputExr          -> (".exr" , [])
    OutputHdr comp     -> (".hdr" , [fromBool comp])
    OutputJpeg params  -> (".jpeg", marshalJpegParams params)
    OutputJpeg2000     -> (".jp2" , [])
    OutputPng params   -> (".png" , marshalPngParams params)
    OutputPxm binary   -> (".pxm" , [c'IMWRITE_PXM_BINARY, fromBool binary])
    OutputSunras       -> (".sr"  , [])
    OutputTiff         -> (".tiff", [])
    OutputWebP quality -> (".webp", [c'IMWRITE_WEBP_QUALITY, fromIntegral quality])