-- GENERATED by C->Haskell Compiler, version 0.28.8 Switcheroo, 25 November 2017 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/Codec/Avif/FFI.chs" #-}
{-# LANGUAGE DeriveDataTypeable #-}

module Codec.Avif.FFI ( avifImageCreate
                      , avifImageCreateEmpty
                      , avifImageDestroy
                      , avifEncoderCreate
                      , avifEncoderDestroy
                      , avifEncoderWrite
                      , avifDecoderCreate
                      , avifDecoderDestroy
                      , avifDecoderReadMemory
                      , avifRGBImageSetDefaults
                      , avifRGBImagePixelSize
                      , avifImageRGBToYUV
                      , avifImageYUVToRGB
                      , avifRGBImageAllocatePixels
                      , avifRGBImageFreePixels
                      , AvifPixelFormat (..)
                      , AvifResult (..)
                      ) where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.ForeignPtr as C2HSImp
import qualified Foreign.Ptr as C2HSImp



import Control.Exception (Exception)
import Data.Coerce (coerce)
import Data.Typeable (Typeable)
import Foreign.C.Types (CInt, CSize)
import Foreign.Ptr (castPtr, Ptr)



type UInt8 = (C2HSImp.CUChar)
{-# LINE 30 "src/Codec/Avif/FFI.chs" #-}

type UInt32 = (C2HSImp.CUInt)
{-# LINE 31 "src/Codec/Avif/FFI.chs" #-}


data AvifPixelFormat = AvifPixelFormatNone
                     | AvifPixelFormatYuv444
                     | AvifPixelFormatYuv422
                     | AvifPixelFormatYuv420
                     | AvifPixelFormatYuv400
instance Enum AvifPixelFormat where
  succ :: AvifPixelFormat -> AvifPixelFormat
succ AvifPixelFormat
AvifPixelFormatNone = AvifPixelFormat
AvifPixelFormatYuv444
  succ AvifPixelFormatYuv444 = AvifPixelFormatYuv422
  succ AvifPixelFormatYuv422 = AvifPixelFormatYuv420
  succ AvifPixelFormatYuv420 = AvifPixelFormatYuv400
  succ AvifPixelFormatYuv400 = error "AvifPixelFormat.succ: AvifPixelFormatYuv400 has no successor"

  pred :: AvifPixelFormat -> AvifPixelFormat
pred AvifPixelFormat
AvifPixelFormatYuv444 = AvifPixelFormat
AvifPixelFormatNone
  pred AvifPixelFormatYuv422 = AvifPixelFormatYuv444
  pred AvifPixelFormatYuv420 = AvifPixelFormatYuv422
  pred AvifPixelFormat
AvifPixelFormatYuv400 = AvifPixelFormat
AvifPixelFormatYuv420
  pred AvifPixelFormatNone = error "AvifPixelFormat.pred: AvifPixelFormatNone has no predecessor"

  enumFromTo from to = go from
    where
      end = fromEnum to
      go v = case compare (fromEnum v) end of
                 LT -> v : go (succ v)
                 EQ -> [v]
                 GT -> []

  enumFrom from = enumFromTo from AvifPixelFormatYuv400

  fromEnum AvifPixelFormatNone = 0
  fromEnum AvifPixelFormatYuv444 = 1
  fromEnum AvifPixelFormatYuv422 = 2
  fromEnum AvifPixelFormatYuv420 = 3
  fromEnum AvifPixelFormatYuv400 = 4

  toEnum 0 = AvifPixelFormatNone
  toEnum 1 = AvifPixelFormatYuv444
  toEnum 2 = AvifPixelFormatYuv422
  toEnum 3 = AvifPixelFormatYuv420
  toEnum 4 = AvifPixelFormatYuv400
  toEnum unmatched = error ("AvifPixelFormat.toEnum: Cannot match " ++ show unmatched)

{-# LINE 33 "src/Codec/Avif/FFI.chs" #-}

data AvifResult = AvifResultOk
                | AvifResultUnknownError
                | AvifResultInvalidFtyp
                | AvifResultNoContent
                | AvifResultNoYuvFormatSelected
                | AvifResultReformatFailed
                | AvifResultUnsupportedDepth
                | AvifResultEncodeColorFailed
                | AvifResultEncodeAlphaFailed
                | AvifResultBmffParseFailed
                | AvifResultNoAv1ItemsFound
                | AvifResultDecodeColorFailed
                | AvifResultDecodeAlphaFailed
                | AvifResultColorAlphaSizeMismatch
                | AvifResultIspeSizeMismatch
                | AvifResultNoCodecAvailable
                | AvifResultNoImagesRemaining
                | AvifResultInvalidExifPayload
                | AvifResultInvalidImageGrid
                | AvifResultInvalidCodecSpecificOption
                | AvifResultTruncatedData
                | AvifResultIoNotSet
                | AvifResultIoError
                | AvifResultWaitingOnIo
                | AvifResultInvalidArgument
                | AvifResultNotImplemented
  deriving (Eq,Show,Typeable)
instance Enum AvifResult where
  succ AvifResultOk = AvifResultUnknownError
  succ AvifResultUnknownError = AvifResultInvalidFtyp
  succ AvifResultInvalidFtyp = AvifResultNoContent
  succ AvifResultNoContent = AvifResultNoYuvFormatSelected
  succ AvifResultNoYuvFormatSelected = AvifResultReformatFailed
  succ AvifResultReformatFailed = AvifResultUnsupportedDepth
  succ AvifResultUnsupportedDepth = AvifResultEncodeColorFailed
  succ AvifResultEncodeColorFailed = AvifResultEncodeAlphaFailed
  succ AvifResultEncodeAlphaFailed = AvifResultBmffParseFailed
  succ AvifResultBmffParseFailed = AvifResultNoAv1ItemsFound
  succ AvifResultNoAv1ItemsFound = AvifResultDecodeColorFailed
  succ AvifResultDecodeColorFailed = AvifResultDecodeAlphaFailed
  succ AvifResultDecodeAlphaFailed = AvifResultColorAlphaSizeMismatch
  succ AvifResultColorAlphaSizeMismatch = AvifResultIspeSizeMismatch
  succ AvifResultIspeSizeMismatch = AvifResultNoCodecAvailable
  succ AvifResultNoCodecAvailable = AvifResultNoImagesRemaining
  succ AvifResultNoImagesRemaining = AvifResultInvalidExifPayload
  succ AvifResultInvalidExifPayload = AvifResultInvalidImageGrid
  succ AvifResultInvalidImageGrid = AvifResultInvalidCodecSpecificOption
  succ AvifResultInvalidCodecSpecificOption = AvifResultTruncatedData
  succ AvifResultTruncatedData = AvifResultIoNotSet
  succ AvifResultIoNotSet = AvifResultIoError
  succ AvifResultIoError = AvifResultWaitingOnIo
  succ AvifResultWaitingOnIo = AvifResultInvalidArgument
  succ AvifResultInvalidArgument = AvifResultNotImplemented
  succ AvifResultNotImplemented = error "AvifResult.succ: AvifResultNotImplemented has no successor"

  pred AvifResultUnknownError = AvifResultOk
  pred AvifResultInvalidFtyp = AvifResultUnknownError
  pred AvifResultNoContent = AvifResultInvalidFtyp
  pred AvifResultNoYuvFormatSelected = AvifResultNoContent
  pred AvifResultReformatFailed = AvifResultNoYuvFormatSelected
  pred AvifResultUnsupportedDepth = AvifResultReformatFailed
  pred AvifResultEncodeColorFailed = AvifResultUnsupportedDepth
  pred AvifResultEncodeAlphaFailed = AvifResultEncodeColorFailed
  pred AvifResultBmffParseFailed = AvifResultEncodeAlphaFailed
  pred AvifResultNoAv1ItemsFound = AvifResultBmffParseFailed
  pred AvifResultDecodeColorFailed = AvifResultNoAv1ItemsFound
  pred AvifResultDecodeAlphaFailed = AvifResultDecodeColorFailed
  pred AvifResultColorAlphaSizeMismatch = AvifResultDecodeAlphaFailed
  pred AvifResultIspeSizeMismatch = AvifResultColorAlphaSizeMismatch
  pred AvifResultNoCodecAvailable = AvifResultIspeSizeMismatch
  pred AvifResultNoImagesRemaining = AvifResultNoCodecAvailable
  pred AvifResultInvalidExifPayload = AvifResultNoImagesRemaining
  pred AvifResultInvalidImageGrid = AvifResultInvalidExifPayload
  pred AvifResultInvalidCodecSpecificOption = AvifResultInvalidImageGrid
  pred AvifResultTruncatedData = AvifResultInvalidCodecSpecificOption
  pred AvifResultIoNotSet = AvifResultTruncatedData
  pred AvifResultIoError = AvifResultIoNotSet
  pred AvifResultWaitingOnIo = AvifResultIoError
  pred AvifResultInvalidArgument = AvifResultWaitingOnIo
  pred AvifResultNotImplemented = AvifResultInvalidArgument
  pred AvifResultOk = error "AvifResult.pred: AvifResultOk has no predecessor"

  enumFromTo :: AvifResult -> AvifResult -> [AvifResult]
enumFromTo AvifResult
from AvifResult
to = AvifResult -> [AvifResult]
forall {t}. Enum t => t -> [t]
go AvifResult
from
    where
      end :: Int
end = AvifResult -> Int
forall a. Enum a => a -> Int
fromEnum AvifResult
to
      go :: t -> [t]
go t
v = case Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (t -> Int
forall a. Enum a => a -> Int
fromEnum t
v) Int
end of
                 Ordering
LT -> t
v t -> [t] -> [t]
forall a. a -> [a] -> [a]
: t -> [t]
go (t -> t
forall a. Enum a => a -> a
succ t
v)
                 Ordering
EQ -> [t
v]
                 Ordering
GT -> []

  enumFrom :: AvifResult -> [AvifResult]
enumFrom AvifResult
from = AvifResult -> AvifResult -> [AvifResult]
forall a. Enum a => a -> a -> [a]
enumFromTo AvifResult
from AvifResult
AvifResultNotImplemented

  fromEnum :: AvifResult -> Int
fromEnum AvifResult
AvifResultOk = Int
0
  fromEnum AvifResult
AvifResultUnknownError = Int
1
  fromEnum AvifResult
AvifResultInvalidFtyp = Int
2
  fromEnum AvifResult
AvifResultNoContent = Int
3
  fromEnum AvifResult
AvifResultNoYuvFormatSelected = Int
4
  fromEnum AvifResult
AvifResultReformatFailed = Int
5
  fromEnum AvifResult
AvifResultUnsupportedDepth = Int
6
  fromEnum AvifResult
AvifResultEncodeColorFailed = Int
7
  fromEnum AvifResult
AvifResultEncodeAlphaFailed = Int
8
  fromEnum AvifResult
AvifResultBmffParseFailed = Int
9
  fromEnum AvifResult
AvifResultNoAv1ItemsFound = Int
10
  fromEnum AvifResult
AvifResultDecodeColorFailed = Int
11
  fromEnum AvifResult
AvifResultDecodeAlphaFailed = Int
12
  fromEnum AvifResult
AvifResultColorAlphaSizeMismatch = Int
13
  fromEnum AvifResult
AvifResultIspeSizeMismatch = Int
14
  fromEnum AvifResult
AvifResultNoCodecAvailable = Int
15
  fromEnum AvifResult
AvifResultNoImagesRemaining = Int
16
  fromEnum AvifResult
AvifResultInvalidExifPayload = Int
17
  fromEnum AvifResult
AvifResultInvalidImageGrid = Int
18
  fromEnum AvifResult
AvifResultInvalidCodecSpecificOption = Int
19
  fromEnum AvifResult
AvifResultTruncatedData = Int
20
  fromEnum AvifResult
AvifResultIoNotSet = Int
21
  fromEnum AvifResult
AvifResultIoError = Int
22
  fromEnum AvifResult
AvifResultWaitingOnIo = Int
23
  fromEnum AvifResult
AvifResultInvalidArgument = Int
24
  fromEnum AvifResult
AvifResultNotImplemented = Int
25

  toEnum :: Int -> AvifResult
toEnum Int
0 = AvifResult
AvifResultOk
  toEnum Int
1 = AvifResult
AvifResultUnknownError
  toEnum Int
2 = AvifResult
AvifResultInvalidFtyp
  toEnum Int
3 = AvifResult
AvifResultNoContent
  toEnum Int
4 = AvifResult
AvifResultNoYuvFormatSelected
  toEnum Int
5 = AvifResult
AvifResultReformatFailed
  toEnum Int
6 = AvifResult
AvifResultUnsupportedDepth
  toEnum Int
7 = AvifResult
AvifResultEncodeColorFailed
  toEnum Int
8 = AvifResult
AvifResultEncodeAlphaFailed
  toEnum Int
9 = AvifResult
AvifResultBmffParseFailed
  toEnum Int
10 = AvifResult
AvifResultNoAv1ItemsFound
  toEnum Int
11 = AvifResult
AvifResultDecodeColorFailed
  toEnum Int
12 = AvifResult
AvifResultDecodeAlphaFailed
  toEnum Int
13 = AvifResult
AvifResultColorAlphaSizeMismatch
  toEnum Int
14 = AvifResult
AvifResultIspeSizeMismatch
  toEnum Int
15 = AvifResult
AvifResultNoCodecAvailable
  toEnum Int
16 = AvifResult
AvifResultNoImagesRemaining
  toEnum Int
17 = AvifResult
AvifResultInvalidExifPayload
  toEnum Int
18 = AvifResult
AvifResultInvalidImageGrid
  toEnum Int
19 = AvifResult
AvifResultInvalidCodecSpecificOption
  toEnum Int
20 = AvifResult
AvifResultTruncatedData
  toEnum Int
21 = AvifResult
AvifResultIoNotSet
  toEnum Int
22 = AvifResult
AvifResultIoError
  toEnum Int
23 = AvifResult
AvifResultWaitingOnIo
  toEnum Int
24 = AvifResult
AvifResultInvalidArgument
  toEnum Int
25 = AvifResult
AvifResultNotImplemented
  toEnum Int
unmatched = String -> AvifResult
forall a. HasCallStack => String -> a
error (String
"AvifResult.toEnum: Cannot match " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
unmatched)

{-# LINE 34 "src/Codec/Avif/FFI.chs" #-}


instance Exception AvifResult where

type AvifImagePtr = C2HSImp.ForeignPtr (AvifImage)
{-# LINE 38 "src/Codec/Avif/FFI.chs" #-}


data AvifImage
data AvifEncoder
data AvifDecoder
data AvifRwData
data AvifRGBImage

type AvifEncoderPtr = C2HSImp.ForeignPtr (AvifEncoder)
{-# LINE 46 "src/Codec/Avif/FFI.chs" #-}

type AvifDecoderPtr = C2HSImp.ForeignPtr (AvifDecoder)
{-# LINE 47 "src/Codec/Avif/FFI.chs" #-}


avifImageCreate :: (CInt) -> (CInt) -> (CInt) -> (AvifPixelFormat) -> IO ((Ptr AvifImage))
avifImageCreate a1 a2 a3 a4 =
  let {a1' = fromIntegral a1} in 
  let {a2' = fromIntegral a2} in 
  let {a3' = fromIntegral a3} in 
  let {a4' = (fromIntegral . fromEnum) a4} in 
  avifImageCreate'_ a1' a2' a3' a4' >>= \res ->
  let {res' = id res} in
  return (res')

{-# LINE 49 "src/Codec/Avif/FFI.chs" #-}

avifImageCreateEmpty :: IO ((Ptr AvifImage))
avifImageCreateEmpty =
  avifImageCreateEmpty'_ >>= \res ->
  let {res' = id res} in
  return (res')

{-# LINE 50 "src/Codec/Avif/FFI.chs" #-}


avifEncoderCreate :: IO ((Ptr AvifEncoder))
avifEncoderCreate =
  avifEncoderCreate'_ >>= \res ->
  let {res' = castPtr res} in
  return (res')

{-# LINE 52 "src/Codec/Avif/FFI.chs" #-}

avifEncoderWrite :: (AvifEncoderPtr) -> (AvifImagePtr) -> (Ptr AvifRwData) -> IO ((AvifResult))
avifEncoderWrite a1 a2 a3 =
  C2HSImp.withForeignPtr a1 $ \a1' -> 
  C2HSImp.withForeignPtr a2 $ \a2' -> 
  let {a3' = castPtr a3} in 
  avifEncoderWrite'_ a1' a2' a3' >>= \res ->
  let {res' = (toEnum . fromIntegral) res} in
  return (res')

{-# LINE 53 "src/Codec/Avif/FFI.chs" #-}


avifDecoderCreate :: IO ((Ptr AvifDecoder))
avifDecoderCreate =
  avifDecoderCreate'_ >>= \res ->
  let {res' = castPtr res} in
  return (res')

{-# LINE 55 "src/Codec/Avif/FFI.chs" #-}

avifDecoderReadMemory :: (AvifDecoderPtr) -> (AvifImagePtr) -> (Ptr UInt8) -> (CSize) -> IO ((AvifResult))
avifDecoderReadMemory a1 a2 a3 a4 =
  C2HSImp.withForeignPtr a1 $ \a1' -> 
  C2HSImp.withForeignPtr a2 $ \a2' -> 
  let {a3' = castPtr a3} in 
  let {a4' = coerce a4} in 
  avifDecoderReadMemory'_ a1' a2' a3' a4' >>= \res ->
  let {res' = (toEnum . fromIntegral) res} in
  return (res')

{-# LINE 56 "src/Codec/Avif/FFI.chs" #-}


avifRGBImageSetDefaults :: (Ptr AvifRGBImage) -> (AvifImagePtr) -> IO ()
avifRGBImageSetDefaults a1 a2 =
  let {a1' = castPtr a1} in 
  C2HSImp.withForeignPtr a2 $ \a2' -> 
  avifRGBImageSetDefaults'_ a1' a2' >>
  return ()

{-# LINE 58 "src/Codec/Avif/FFI.chs" #-}

avifRGBImagePixelSize :: (Ptr AvifRGBImage) -> IO ((UInt32))
avifRGBImagePixelSize a1 =
  let {a1' = castPtr a1} in 
  avifRGBImagePixelSize'_ a1' >>= \res ->
  let {res' = id res} in
  return (res')

{-# LINE 59 "src/Codec/Avif/FFI.chs" #-}


avifImageRGBToYUV :: (AvifImagePtr) -> (Ptr AvifRGBImage) -> IO ((AvifResult))
avifImageRGBToYUV a1 a2 =
  C2HSImp.withForeignPtr a1 $ \a1' -> 
  let {a2' = castPtr a2} in 
  avifImageRGBToYUV'_ a1' a2' >>= \res ->
  let {res' = (toEnum . fromIntegral) res} in
  return (res')

{-# LINE 61 "src/Codec/Avif/FFI.chs" #-}

avifImageYUVToRGB :: (AvifImagePtr) -> (Ptr AvifRGBImage) -> IO ((AvifResult))
avifImageYUVToRGB a1 a2 =
  C2HSImp.withForeignPtr a1 $ \a1' -> 
  let {a2' = castPtr a2} in 
  avifImageYUVToRGB'_ a1' a2' >>= \res ->
  let {res' = (toEnum . fromIntegral) res} in
  return (res')

{-# LINE 62 "src/Codec/Avif/FFI.chs" #-}


avifRGBImageAllocatePixels :: (Ptr AvifRGBImage) -> IO ()
avifRGBImageAllocatePixels a1 =
  let {a1' = castPtr a1} in 
  avifRGBImageAllocatePixels'_ a1' >>
  return ()

{-# LINE 64 "src/Codec/Avif/FFI.chs" #-}

avifRGBImageFreePixels :: (Ptr AvifRGBImage) -> IO ()
avifRGBImageFreePixels a1 =
  let {a1' = castPtr a1} in 
  avifRGBImageFreePixels'_ a1' >>
  return ()

{-# LINE 65 "src/Codec/Avif/FFI.chs" #-}


foreign import ccall "Codec/Avif/FFI.chs.h &avifImageDestroy"
  avifImageDestroy :: C2HSImp.FinalizerPtr ()

foreign import ccall "Codec/Avif/FFI.chs.h &avifEncoderDestroy"
  avifEncoderDestroy :: C2HSImp.FinalizerPtr ()

foreign import ccall "Codec/Avif/FFI.chs.h &avifDecoderDestroy"
  avifDecoderDestroy :: C2HSImp.FinalizerPtr ()

foreign import ccall safe "Codec/Avif/FFI.chs.h avifImageCreate"
  avifImageCreate'_ :: (C2HSImp.CInt -> (C2HSImp.CInt -> (C2HSImp.CInt -> (C2HSImp.CInt -> (IO (C2HSImp.Ptr (AvifImage)))))))

foreign import ccall safe "Codec/Avif/FFI.chs.h avifImageCreateEmpty"
  avifImageCreateEmpty'_ :: (IO (C2HSImp.Ptr (AvifImage)))

foreign import ccall safe "Codec/Avif/FFI.chs.h avifEncoderCreate"
  avifEncoderCreate'_ :: (IO (C2HSImp.Ptr (AvifEncoder)))

foreign import ccall safe "Codec/Avif/FFI.chs.h avifEncoderWrite"
  avifEncoderWrite'_ :: ((C2HSImp.Ptr (AvifEncoder)) -> ((C2HSImp.Ptr (AvifImage)) -> ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))))

foreign import ccall safe "Codec/Avif/FFI.chs.h avifDecoderCreate"
  avifDecoderCreate'_ :: (IO (C2HSImp.Ptr (AvifDecoder)))

foreign import ccall safe "Codec/Avif/FFI.chs.h avifDecoderReadMemory"
  avifDecoderReadMemory'_ :: ((C2HSImp.Ptr (AvifDecoder)) -> ((C2HSImp.Ptr (AvifImage)) -> ((C2HSImp.Ptr C2HSImp.CUChar) -> (C2HSImp.CULong -> (IO C2HSImp.CInt)))))

foreign import ccall safe "Codec/Avif/FFI.chs.h avifRGBImageSetDefaults"
  avifRGBImageSetDefaults'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (AvifImage)) -> (IO ())))

foreign import ccall safe "Codec/Avif/FFI.chs.h avifRGBImagePixelSize"
  avifRGBImagePixelSize'_ :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CUInt))

foreign import ccall safe "Codec/Avif/FFI.chs.h avifImageRGBToYUV"
  avifImageRGBToYUV'_ :: ((C2HSImp.Ptr (AvifImage)) -> ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt)))

foreign import ccall safe "Codec/Avif/FFI.chs.h avifImageYUVToRGB"
  avifImageYUVToRGB'_ :: ((C2HSImp.Ptr (AvifImage)) -> ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt)))

foreign import ccall safe "Codec/Avif/FFI.chs.h avifRGBImageAllocatePixels"
  avifRGBImageAllocatePixels'_ :: ((C2HSImp.Ptr ()) -> (IO ()))

foreign import ccall safe "Codec/Avif/FFI.chs.h avifRGBImageFreePixels"
  avifRGBImageFreePixels'_ :: ((C2HSImp.Ptr ()) -> (IO ()))