{-# LANGUAGE DeriveAnyClass #-}

{-# OPTIONS -Wall #-}

-- | Bindings for types used mainly in @rtextures@
module Raylib.Types.Core.Textures
  ( -- * Enumerations
    PixelFormat (..),
    TextureFilter (..),
    TextureWrap (..),
    CubemapLayout (..),
    NPatchLayout (..),

    -- * Structures
    Image (..),
    Texture (..),
    RenderTexture (..),
    NPatchInfo (..),
    Texture2D,
    TextureCubemap,
    RenderTexture2D,

    -- * Pointer utilities
    p'image'data,
    p'image'width,
    p'image'height,
    p'image'mipmaps,
    p'image'format,
    p'texture'id,
    p'texture'width,
    p'texture'height,
    p'texture'mipmaps,
    p'texture'format,
    p'renderTexture'id,
    p'renderTexture'texture,
    p'renderTexture'depth,
    p'nPatchInfo'source,
    p'nPatchInfo'left,
    p'nPatchInfo'top,
    p'nPatchInfo'right,
    p'nPatchInfo'bottom,
    p'nPatchInfo'layout,
  )
where

import Foreign
  ( Ptr,
    Storable (alignment, peek, poke, sizeOf),
    Word8,
    castPtr,
    newArray,
    peekArray,
    plusPtr,
  )
import Foreign.C
  ( CInt (..),
    CUChar,
    CUInt,
  )
import Raylib.Internal (getPixelDataSize)
import Raylib.Internal.Foreign (Freeable (rlFreeDependents), c'free)
import Raylib.Types.Core (Rectangle)

---------------------------------------
-- textures enums ---------------------
---------------------------------------

data PixelFormat
  = PixelFormatUnset
  | PixelFormatUncompressedGrayscale
  | PixelFormatUncompressedGrayAlpha
  | PixelFormatUncompressedR5G6B5
  | PixelFormatUncompressedR8G8B8
  | PixelFormatUncompressedR5G5B5A1
  | PixelFormatUncompressedR4G4B4A4
  | PixelFormatUncompressedR8G8B8A8
  | PixelFormatUncompressedR32
  | PixelFormatUncompressedR32G32B32
  | PixelFormatUncompressedR32G32B32A32
  | PixelFormatUncompressedR16
  | PixelFormatUncompressedR16G16B16
  | PixelFormatUncompressedR16G16B16A16
  | PixelFormatCompressedDxt1Rgb
  | PixelFormatCompressedDxt1Rgba
  | PixelFormatCompressedDxt3Rgba
  | PixelFormatCompressedDxt5Rgba
  | PixelFormatCompressedEtc1Rgb
  | PixelFormatCompressedEtc2Rgb
  | PixelFormatCompressedEtc2EacRgba
  | PixelFormatCompressedPvrtRgb
  | PixelFormatCompressedPvrtRgba
  | PixelFormatCompressedAstc4x4Rgba
  | PixelFormatCompressedAstc8x8Rgba
  deriving (PixelFormat -> PixelFormat -> Bool
(PixelFormat -> PixelFormat -> Bool)
-> (PixelFormat -> PixelFormat -> Bool) -> Eq PixelFormat
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PixelFormat -> PixelFormat -> Bool
== :: PixelFormat -> PixelFormat -> Bool
$c/= :: PixelFormat -> PixelFormat -> Bool
/= :: PixelFormat -> PixelFormat -> Bool
Eq, Int -> PixelFormat -> ShowS
[PixelFormat] -> ShowS
PixelFormat -> String
(Int -> PixelFormat -> ShowS)
-> (PixelFormat -> String)
-> ([PixelFormat] -> ShowS)
-> Show PixelFormat
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PixelFormat -> ShowS
showsPrec :: Int -> PixelFormat -> ShowS
$cshow :: PixelFormat -> String
show :: PixelFormat -> String
$cshowList :: [PixelFormat] -> ShowS
showList :: [PixelFormat] -> ShowS
Show)

instance Storable PixelFormat where
  sizeOf :: PixelFormat -> Int
sizeOf PixelFormat
_ = Int
4
  alignment :: PixelFormat -> Int
alignment PixelFormat
_ = Int
4
  peek :: Ptr PixelFormat -> IO PixelFormat
peek Ptr PixelFormat
ptr = do
    CInt
val <- Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr PixelFormat -> Ptr CInt
forall a b. Ptr a -> Ptr b
castPtr Ptr PixelFormat
ptr :: Ptr CInt)
    PixelFormat -> IO PixelFormat
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> PixelFormat
forall a. Enum a => Int -> a
toEnum (Int -> PixelFormat) -> Int -> PixelFormat
forall a b. (a -> b) -> a -> b
$ CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CInt
val)
  poke :: Ptr PixelFormat -> PixelFormat -> IO ()
poke Ptr PixelFormat
ptr PixelFormat
v = do
    Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr PixelFormat -> Ptr CInt
forall a b. Ptr a -> Ptr b
castPtr Ptr PixelFormat
ptr) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral (PixelFormat -> Int
forall a. Enum a => a -> Int
fromEnum PixelFormat
v) :: CInt)

instance Enum PixelFormat where
  fromEnum :: PixelFormat -> Int
fromEnum PixelFormat
n = case PixelFormat
n of
    PixelFormat
PixelFormatUnset -> Int
0
    PixelFormat
PixelFormatUncompressedGrayscale -> Int
1
    PixelFormat
PixelFormatUncompressedGrayAlpha -> Int
2
    PixelFormat
PixelFormatUncompressedR5G6B5 -> Int
3
    PixelFormat
PixelFormatUncompressedR8G8B8 -> Int
4
    PixelFormat
PixelFormatUncompressedR5G5B5A1 -> Int
5
    PixelFormat
PixelFormatUncompressedR4G4B4A4 -> Int
6
    PixelFormat
PixelFormatUncompressedR8G8B8A8 -> Int
7
    PixelFormat
PixelFormatUncompressedR32 -> Int
8
    PixelFormat
PixelFormatUncompressedR32G32B32 -> Int
9
    PixelFormat
PixelFormatUncompressedR32G32B32A32 -> Int
10
    PixelFormat
PixelFormatUncompressedR16 -> Int
11
    PixelFormat
PixelFormatUncompressedR16G16B16 -> Int
12
    PixelFormat
PixelFormatUncompressedR16G16B16A16 -> Int
13
    PixelFormat
PixelFormatCompressedDxt1Rgb -> Int
14
    PixelFormat
PixelFormatCompressedDxt1Rgba -> Int
15
    PixelFormat
PixelFormatCompressedDxt3Rgba -> Int
16
    PixelFormat
PixelFormatCompressedDxt5Rgba -> Int
17
    PixelFormat
PixelFormatCompressedEtc1Rgb -> Int
18
    PixelFormat
PixelFormatCompressedEtc2Rgb -> Int
19
    PixelFormat
PixelFormatCompressedEtc2EacRgba -> Int
20
    PixelFormat
PixelFormatCompressedPvrtRgb -> Int
21
    PixelFormat
PixelFormatCompressedPvrtRgba -> Int
22
    PixelFormat
PixelFormatCompressedAstc4x4Rgba -> Int
23
    PixelFormat
PixelFormatCompressedAstc8x8Rgba -> Int
24

  toEnum :: Int -> PixelFormat
toEnum Int
n = case Int
n of
    Int
0 -> PixelFormat
PixelFormatUnset
    Int
1 -> PixelFormat
PixelFormatUncompressedGrayscale
    Int
2 -> PixelFormat
PixelFormatUncompressedGrayAlpha
    Int
3 -> PixelFormat
PixelFormatUncompressedR5G6B5
    Int
4 -> PixelFormat
PixelFormatUncompressedR8G8B8
    Int
5 -> PixelFormat
PixelFormatUncompressedR5G5B5A1
    Int
6 -> PixelFormat
PixelFormatUncompressedR4G4B4A4
    Int
7 -> PixelFormat
PixelFormatUncompressedR8G8B8A8
    Int
8 -> PixelFormat
PixelFormatUncompressedR32
    Int
9 -> PixelFormat
PixelFormatUncompressedR32G32B32
    Int
10 -> PixelFormat
PixelFormatUncompressedR32G32B32A32
    Int
11 -> PixelFormat
PixelFormatUncompressedR16
    Int
12 -> PixelFormat
PixelFormatUncompressedR16G16B16
    Int
13 -> PixelFormat
PixelFormatUncompressedR16G16B16A16
    Int
14 -> PixelFormat
PixelFormatCompressedDxt1Rgb
    Int
15 -> PixelFormat
PixelFormatCompressedDxt1Rgba
    Int
16 -> PixelFormat
PixelFormatCompressedDxt3Rgba
    Int
17 -> PixelFormat
PixelFormatCompressedDxt5Rgba
    Int
18 -> PixelFormat
PixelFormatCompressedEtc1Rgb
    Int
19 -> PixelFormat
PixelFormatCompressedEtc2Rgb
    Int
20 -> PixelFormat
PixelFormatCompressedEtc2EacRgba
    Int
21 -> PixelFormat
PixelFormatCompressedPvrtRgb
    Int
22 -> PixelFormat
PixelFormatCompressedPvrtRgba
    Int
23 -> PixelFormat
PixelFormatCompressedAstc4x4Rgba
    Int
24 -> PixelFormat
PixelFormatCompressedAstc8x8Rgba
    Int
_ -> String -> PixelFormat
forall a. HasCallStack => String -> a
error (String -> PixelFormat) -> String -> PixelFormat
forall a b. (a -> b) -> a -> b
$ String
"(PixelFormat.toEnum) Invalid value: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n

data TextureFilter
  = TextureFilterPoint
  | TextureFilterBilinear
  | TextureFilterTrilinear
  | TextureFilterAnisotropic4x
  | TextureFilterAnisotropic8x
  | TextureFilterAnisotropic16x
  deriving (Int -> TextureFilter
TextureFilter -> Int
TextureFilter -> [TextureFilter]
TextureFilter -> TextureFilter
TextureFilter -> TextureFilter -> [TextureFilter]
TextureFilter -> TextureFilter -> TextureFilter -> [TextureFilter]
(TextureFilter -> TextureFilter)
-> (TextureFilter -> TextureFilter)
-> (Int -> TextureFilter)
-> (TextureFilter -> Int)
-> (TextureFilter -> [TextureFilter])
-> (TextureFilter -> TextureFilter -> [TextureFilter])
-> (TextureFilter -> TextureFilter -> [TextureFilter])
-> (TextureFilter
    -> TextureFilter -> TextureFilter -> [TextureFilter])
-> Enum TextureFilter
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: TextureFilter -> TextureFilter
succ :: TextureFilter -> TextureFilter
$cpred :: TextureFilter -> TextureFilter
pred :: TextureFilter -> TextureFilter
$ctoEnum :: Int -> TextureFilter
toEnum :: Int -> TextureFilter
$cfromEnum :: TextureFilter -> Int
fromEnum :: TextureFilter -> Int
$cenumFrom :: TextureFilter -> [TextureFilter]
enumFrom :: TextureFilter -> [TextureFilter]
$cenumFromThen :: TextureFilter -> TextureFilter -> [TextureFilter]
enumFromThen :: TextureFilter -> TextureFilter -> [TextureFilter]
$cenumFromTo :: TextureFilter -> TextureFilter -> [TextureFilter]
enumFromTo :: TextureFilter -> TextureFilter -> [TextureFilter]
$cenumFromThenTo :: TextureFilter -> TextureFilter -> TextureFilter -> [TextureFilter]
enumFromThenTo :: TextureFilter -> TextureFilter -> TextureFilter -> [TextureFilter]
Enum)

data TextureWrap
  = TextureWrapRepeat
  | TextureWrapClamp
  | TextureWrapMirrorRepeat
  | TextureWrapMirrorClamp
  deriving (Int -> TextureWrap
TextureWrap -> Int
TextureWrap -> [TextureWrap]
TextureWrap -> TextureWrap
TextureWrap -> TextureWrap -> [TextureWrap]
TextureWrap -> TextureWrap -> TextureWrap -> [TextureWrap]
(TextureWrap -> TextureWrap)
-> (TextureWrap -> TextureWrap)
-> (Int -> TextureWrap)
-> (TextureWrap -> Int)
-> (TextureWrap -> [TextureWrap])
-> (TextureWrap -> TextureWrap -> [TextureWrap])
-> (TextureWrap -> TextureWrap -> [TextureWrap])
-> (TextureWrap -> TextureWrap -> TextureWrap -> [TextureWrap])
-> Enum TextureWrap
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: TextureWrap -> TextureWrap
succ :: TextureWrap -> TextureWrap
$cpred :: TextureWrap -> TextureWrap
pred :: TextureWrap -> TextureWrap
$ctoEnum :: Int -> TextureWrap
toEnum :: Int -> TextureWrap
$cfromEnum :: TextureWrap -> Int
fromEnum :: TextureWrap -> Int
$cenumFrom :: TextureWrap -> [TextureWrap]
enumFrom :: TextureWrap -> [TextureWrap]
$cenumFromThen :: TextureWrap -> TextureWrap -> [TextureWrap]
enumFromThen :: TextureWrap -> TextureWrap -> [TextureWrap]
$cenumFromTo :: TextureWrap -> TextureWrap -> [TextureWrap]
enumFromTo :: TextureWrap -> TextureWrap -> [TextureWrap]
$cenumFromThenTo :: TextureWrap -> TextureWrap -> TextureWrap -> [TextureWrap]
enumFromThenTo :: TextureWrap -> TextureWrap -> TextureWrap -> [TextureWrap]
Enum)

data CubemapLayout
  = CubemapLayoutAutoDetect
  | CubemapLayoutLineVertical
  | CubemapLayoutLineHorizontal
  | CubemapLayoutCrossThreeByFour
  | CubemapLayoutCrossThreeByThree
  | CubemapLayoutPanorama
  deriving (Int -> CubemapLayout
CubemapLayout -> Int
CubemapLayout -> [CubemapLayout]
CubemapLayout -> CubemapLayout
CubemapLayout -> CubemapLayout -> [CubemapLayout]
CubemapLayout -> CubemapLayout -> CubemapLayout -> [CubemapLayout]
(CubemapLayout -> CubemapLayout)
-> (CubemapLayout -> CubemapLayout)
-> (Int -> CubemapLayout)
-> (CubemapLayout -> Int)
-> (CubemapLayout -> [CubemapLayout])
-> (CubemapLayout -> CubemapLayout -> [CubemapLayout])
-> (CubemapLayout -> CubemapLayout -> [CubemapLayout])
-> (CubemapLayout
    -> CubemapLayout -> CubemapLayout -> [CubemapLayout])
-> Enum CubemapLayout
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: CubemapLayout -> CubemapLayout
succ :: CubemapLayout -> CubemapLayout
$cpred :: CubemapLayout -> CubemapLayout
pred :: CubemapLayout -> CubemapLayout
$ctoEnum :: Int -> CubemapLayout
toEnum :: Int -> CubemapLayout
$cfromEnum :: CubemapLayout -> Int
fromEnum :: CubemapLayout -> Int
$cenumFrom :: CubemapLayout -> [CubemapLayout]
enumFrom :: CubemapLayout -> [CubemapLayout]
$cenumFromThen :: CubemapLayout -> CubemapLayout -> [CubemapLayout]
enumFromThen :: CubemapLayout -> CubemapLayout -> [CubemapLayout]
$cenumFromTo :: CubemapLayout -> CubemapLayout -> [CubemapLayout]
enumFromTo :: CubemapLayout -> CubemapLayout -> [CubemapLayout]
$cenumFromThenTo :: CubemapLayout -> CubemapLayout -> CubemapLayout -> [CubemapLayout]
enumFromThenTo :: CubemapLayout -> CubemapLayout -> CubemapLayout -> [CubemapLayout]
Enum)

data NPatchLayout = NPatchNinePatch | NPatchThreePatchVertical | NPatchThreePatchHorizontal deriving (NPatchLayout -> NPatchLayout -> Bool
(NPatchLayout -> NPatchLayout -> Bool)
-> (NPatchLayout -> NPatchLayout -> Bool) -> Eq NPatchLayout
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NPatchLayout -> NPatchLayout -> Bool
== :: NPatchLayout -> NPatchLayout -> Bool
$c/= :: NPatchLayout -> NPatchLayout -> Bool
/= :: NPatchLayout -> NPatchLayout -> Bool
Eq, Int -> NPatchLayout -> ShowS
[NPatchLayout] -> ShowS
NPatchLayout -> String
(Int -> NPatchLayout -> ShowS)
-> (NPatchLayout -> String)
-> ([NPatchLayout] -> ShowS)
-> Show NPatchLayout
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NPatchLayout -> ShowS
showsPrec :: Int -> NPatchLayout -> ShowS
$cshow :: NPatchLayout -> String
show :: NPatchLayout -> String
$cshowList :: [NPatchLayout] -> ShowS
showList :: [NPatchLayout] -> ShowS
Show, Int -> NPatchLayout
NPatchLayout -> Int
NPatchLayout -> [NPatchLayout]
NPatchLayout -> NPatchLayout
NPatchLayout -> NPatchLayout -> [NPatchLayout]
NPatchLayout -> NPatchLayout -> NPatchLayout -> [NPatchLayout]
(NPatchLayout -> NPatchLayout)
-> (NPatchLayout -> NPatchLayout)
-> (Int -> NPatchLayout)
-> (NPatchLayout -> Int)
-> (NPatchLayout -> [NPatchLayout])
-> (NPatchLayout -> NPatchLayout -> [NPatchLayout])
-> (NPatchLayout -> NPatchLayout -> [NPatchLayout])
-> (NPatchLayout -> NPatchLayout -> NPatchLayout -> [NPatchLayout])
-> Enum NPatchLayout
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: NPatchLayout -> NPatchLayout
succ :: NPatchLayout -> NPatchLayout
$cpred :: NPatchLayout -> NPatchLayout
pred :: NPatchLayout -> NPatchLayout
$ctoEnum :: Int -> NPatchLayout
toEnum :: Int -> NPatchLayout
$cfromEnum :: NPatchLayout -> Int
fromEnum :: NPatchLayout -> Int
$cenumFrom :: NPatchLayout -> [NPatchLayout]
enumFrom :: NPatchLayout -> [NPatchLayout]
$cenumFromThen :: NPatchLayout -> NPatchLayout -> [NPatchLayout]
enumFromThen :: NPatchLayout -> NPatchLayout -> [NPatchLayout]
$cenumFromTo :: NPatchLayout -> NPatchLayout -> [NPatchLayout]
enumFromTo :: NPatchLayout -> NPatchLayout -> [NPatchLayout]
$cenumFromThenTo :: NPatchLayout -> NPatchLayout -> NPatchLayout -> [NPatchLayout]
enumFromThenTo :: NPatchLayout -> NPatchLayout -> NPatchLayout -> [NPatchLayout]
Enum)

instance Storable NPatchLayout where
  sizeOf :: NPatchLayout -> Int
sizeOf NPatchLayout
_ = Int
4
  alignment :: NPatchLayout -> Int
alignment NPatchLayout
_ = Int
4
  peek :: Ptr NPatchLayout -> IO NPatchLayout
peek Ptr NPatchLayout
ptr = do
    CInt
val <- Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr NPatchLayout -> Ptr CInt
forall a b. Ptr a -> Ptr b
castPtr Ptr NPatchLayout
ptr)
    NPatchLayout -> IO NPatchLayout
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (NPatchLayout -> IO NPatchLayout)
-> NPatchLayout -> IO NPatchLayout
forall a b. (a -> b) -> a -> b
$ Int -> NPatchLayout
forall a. Enum a => Int -> a
toEnum (Int -> NPatchLayout) -> Int -> NPatchLayout
forall a b. (a -> b) -> a -> b
$ CInt -> Int
forall a. Enum a => a -> Int
fromEnum (CInt
val :: CInt)
  poke :: Ptr NPatchLayout -> NPatchLayout -> IO ()
poke Ptr NPatchLayout
ptr NPatchLayout
v = Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr NPatchLayout -> Ptr CInt
forall a b. Ptr a -> Ptr b
castPtr Ptr NPatchLayout
ptr) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral (NPatchLayout -> Int
forall a. Enum a => a -> Int
fromEnum NPatchLayout
v) :: CInt)

---------------------------------------
-- textures structures ----------------
---------------------------------------

data Image = Image
  { Image -> [Word8]
image'data :: [Word8],
    Image -> Int
image'width :: Int,
    Image -> Int
image'height :: Int,
    Image -> Int
image'mipmaps :: Int,
    Image -> PixelFormat
image'format :: PixelFormat
  }
  deriving (Image -> Image -> Bool
(Image -> Image -> Bool) -> (Image -> Image -> Bool) -> Eq Image
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Image -> Image -> Bool
== :: Image -> Image -> Bool
$c/= :: Image -> Image -> Bool
/= :: Image -> Image -> Bool
Eq, Int -> Image -> ShowS
[Image] -> ShowS
Image -> String
(Int -> Image -> ShowS)
-> (Image -> String) -> ([Image] -> ShowS) -> Show Image
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Image -> ShowS
showsPrec :: Int -> Image -> ShowS
$cshow :: Image -> String
show :: Image -> String
$cshowList :: [Image] -> ShowS
showList :: [Image] -> ShowS
Show)

instance Storable Image where
  sizeOf :: Image -> Int
sizeOf Image
_ = Int
24
  alignment :: Image -> Int
alignment Image
_ = Int
4
  peek :: Ptr Image -> IO Image
peek Ptr Image
_p = do
    Int
width <- CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr Image -> Ptr CInt
p'image'width Ptr Image
_p)
    Int
height <- CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr Image -> Ptr CInt
p'image'height Ptr Image
_p)
    Int
mipmaps <- CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr Image -> Ptr CInt
p'image'mipmaps Ptr Image
_p)
    PixelFormat
format <- Ptr PixelFormat -> IO PixelFormat
forall a. Storable a => Ptr a -> IO a
peek (Ptr Image -> Ptr PixelFormat
p'image'format Ptr Image
_p)
    [Word8]
iData <- (CUChar -> Word8) -> [CUChar] -> [Word8]
forall a b. (a -> b) -> [a] -> [b]
map CUChar -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([CUChar] -> [Word8]) -> IO [CUChar] -> IO [Word8]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int -> Ptr CUChar -> IO [CUChar]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray (Int -> Int -> Int -> Int
getPixelDataSize Int
width Int
height (PixelFormat -> Int
forall a. Enum a => a -> Int
fromEnum PixelFormat
format)) (Ptr CUChar -> IO [CUChar]) -> IO (Ptr CUChar) -> IO [CUChar]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr (Ptr CUChar) -> IO (Ptr CUChar)
forall a. Storable a => Ptr a -> IO a
peek (Ptr Image -> Ptr (Ptr CUChar)
p'image'data Ptr Image
_p))
    Image -> IO Image
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Image -> IO Image) -> Image -> IO Image
forall a b. (a -> b) -> a -> b
$ [Word8] -> Int -> Int -> Int -> PixelFormat -> Image
Image [Word8]
iData Int
width Int
height Int
mipmaps PixelFormat
format
  poke :: Ptr Image -> Image -> IO ()
poke Ptr Image
_p (Image [Word8]
arr Int
width Int
height Int
mipmaps PixelFormat
format) = do
    Ptr (Ptr CUChar) -> Ptr CUChar -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Image -> Ptr (Ptr CUChar)
p'image'data Ptr Image
_p) (Ptr CUChar -> IO ()) -> IO (Ptr CUChar) -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< [CUChar] -> IO (Ptr CUChar)
forall a. Storable a => [a] -> IO (Ptr a)
newArray ((Word8 -> CUChar) -> [Word8] -> [CUChar]
forall a b. (a -> b) -> [a] -> [b]
map Word8 -> CUChar
forall a b. (Integral a, Num b) => a -> b
fromIntegral [Word8]
arr)
    Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Image -> Ptr CInt
p'image'width Ptr Image
_p) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
width)
    Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Image -> Ptr CInt
p'image'height Ptr Image
_p) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
height)
    Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Image -> Ptr CInt
p'image'mipmaps Ptr Image
_p) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
mipmaps)
    Ptr PixelFormat -> PixelFormat -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Image -> Ptr PixelFormat
p'image'format Ptr Image
_p) PixelFormat
format
    () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

-- array (getPixelDataSize image'width image'height (fromEnum image'format))
p'image'data :: Ptr Image -> Ptr (Ptr CUChar)
p'image'data :: Ptr Image -> Ptr (Ptr CUChar)
p'image'data = (Ptr Image -> Int -> Ptr (Ptr CUChar)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0)

p'image'width :: Ptr Image -> Ptr CInt
p'image'width :: Ptr Image -> Ptr CInt
p'image'width = (Ptr Image -> Int -> Ptr CInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8)

p'image'height :: Ptr Image -> Ptr CInt
p'image'height :: Ptr Image -> Ptr CInt
p'image'height = (Ptr Image -> Int -> Ptr CInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
12)

p'image'mipmaps :: Ptr Image -> Ptr CInt
p'image'mipmaps :: Ptr Image -> Ptr CInt
p'image'mipmaps = (Ptr Image -> Int -> Ptr CInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16)

p'image'format :: Ptr Image -> Ptr PixelFormat
p'image'format :: Ptr Image -> Ptr PixelFormat
p'image'format = (Ptr Image -> Int -> Ptr PixelFormat
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
20)

instance Freeable Image where
  rlFreeDependents :: Image -> Ptr Image -> IO ()
rlFreeDependents Image
_ Ptr Image
ptr = do
    Ptr () -> IO ()
c'free (Ptr () -> IO ()) -> (Ptr CUChar -> Ptr ()) -> Ptr CUChar -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr CUChar -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr (Ptr CUChar -> IO ()) -> IO (Ptr CUChar) -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr (Ptr CUChar) -> IO (Ptr CUChar)
forall a. Storable a => Ptr a -> IO a
peek (Ptr Image -> Ptr (Ptr CUChar)
p'image'data Ptr Image
ptr)

data Texture = Texture
  { Texture -> Integer
texture'id :: Integer,
    Texture -> Int
texture'width :: Int,
    Texture -> Int
texture'height :: Int,
    Texture -> Int
texture'mipmaps :: Int,
    Texture -> PixelFormat
texture'format :: PixelFormat
  }
  deriving (Texture -> Texture -> Bool
(Texture -> Texture -> Bool)
-> (Texture -> Texture -> Bool) -> Eq Texture
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Texture -> Texture -> Bool
== :: Texture -> Texture -> Bool
$c/= :: Texture -> Texture -> Bool
/= :: Texture -> Texture -> Bool
Eq, Int -> Texture -> ShowS
[Texture] -> ShowS
Texture -> String
(Int -> Texture -> ShowS)
-> (Texture -> String) -> ([Texture] -> ShowS) -> Show Texture
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Texture -> ShowS
showsPrec :: Int -> Texture -> ShowS
$cshow :: Texture -> String
show :: Texture -> String
$cshowList :: [Texture] -> ShowS
showList :: [Texture] -> ShowS
Show, Texture -> Ptr Texture -> IO ()
(Texture -> Ptr Texture -> IO ())
-> (Texture -> Ptr Texture -> IO ()) -> Freeable Texture
forall a.
(a -> Ptr a -> IO ()) -> (a -> Ptr a -> IO ()) -> Freeable a
$crlFreeDependents :: Texture -> Ptr Texture -> IO ()
rlFreeDependents :: Texture -> Ptr Texture -> IO ()
$crlFree :: Texture -> Ptr Texture -> IO ()
rlFree :: Texture -> Ptr Texture -> IO ()
Freeable)

instance Storable Texture where
  sizeOf :: Texture -> Int
sizeOf Texture
_ = Int
20
  alignment :: Texture -> Int
alignment Texture
_ = Int
4
  peek :: Ptr Texture -> IO Texture
peek Ptr Texture
_p = do
    Integer
tId <- CUInt -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CUInt -> Integer) -> IO CUInt -> IO Integer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CUInt -> IO CUInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr Texture -> Ptr CUInt
p'texture'id Ptr Texture
_p)
    Int
width <- CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr Texture -> Ptr CInt
p'texture'width Ptr Texture
_p)
    Int
height <- CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr Texture -> Ptr CInt
p'texture'height Ptr Texture
_p)
    Int
mipmaps <- CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr Texture -> Ptr CInt
p'texture'mipmaps Ptr Texture
_p)
    PixelFormat
format <- Ptr PixelFormat -> IO PixelFormat
forall a. Storable a => Ptr a -> IO a
peek (Ptr Texture -> Ptr PixelFormat
p'texture'format Ptr Texture
_p)
    Texture -> IO Texture
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Texture -> IO Texture) -> Texture -> IO Texture
forall a b. (a -> b) -> a -> b
$ Integer -> Int -> Int -> Int -> PixelFormat -> Texture
Texture Integer
tId Int
width Int
height Int
mipmaps PixelFormat
format
  poke :: Ptr Texture -> Texture -> IO ()
poke Ptr Texture
_p (Texture Integer
tId Int
width Int
height Int
mipmaps PixelFormat
format) = do
    Ptr CUInt -> CUInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Texture -> Ptr CUInt
p'texture'id Ptr Texture
_p) (Integer -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
tId)
    Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Texture -> Ptr CInt
p'texture'width Ptr Texture
_p) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
width)
    Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Texture -> Ptr CInt
p'texture'height Ptr Texture
_p) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
height)
    Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Texture -> Ptr CInt
p'texture'mipmaps Ptr Texture
_p) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
mipmaps)
    Ptr PixelFormat -> PixelFormat -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr Texture -> Ptr PixelFormat
p'texture'format Ptr Texture
_p) PixelFormat
format
    () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

p'texture'id :: Ptr Texture -> Ptr CUInt
p'texture'id :: Ptr Texture -> Ptr CUInt
p'texture'id = (Ptr Texture -> Int -> Ptr CUInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0)

p'texture'width :: Ptr Texture -> Ptr CInt
p'texture'width :: Ptr Texture -> Ptr CInt
p'texture'width = (Ptr Texture -> Int -> Ptr CInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4)

p'texture'height :: Ptr Texture -> Ptr CInt
p'texture'height :: Ptr Texture -> Ptr CInt
p'texture'height = (Ptr Texture -> Int -> Ptr CInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8)

p'texture'mipmaps :: Ptr Texture -> Ptr CInt
p'texture'mipmaps :: Ptr Texture -> Ptr CInt
p'texture'mipmaps = (Ptr Texture -> Int -> Ptr CInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
12)

p'texture'format :: Ptr Texture -> Ptr PixelFormat
p'texture'format :: Ptr Texture -> Ptr PixelFormat
p'texture'format = (Ptr Texture -> Int -> Ptr PixelFormat
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16)

type Texture2D = Texture

type TextureCubemap = Texture

data RenderTexture = RenderTexture
  { RenderTexture -> Integer
renderTexture'id :: Integer,
    RenderTexture -> Texture
renderTexture'texture :: Texture,
    RenderTexture -> Texture
renderTexture'depth :: Texture
  }
  deriving (RenderTexture -> RenderTexture -> Bool
(RenderTexture -> RenderTexture -> Bool)
-> (RenderTexture -> RenderTexture -> Bool) -> Eq RenderTexture
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RenderTexture -> RenderTexture -> Bool
== :: RenderTexture -> RenderTexture -> Bool
$c/= :: RenderTexture -> RenderTexture -> Bool
/= :: RenderTexture -> RenderTexture -> Bool
Eq, Int -> RenderTexture -> ShowS
[RenderTexture] -> ShowS
RenderTexture -> String
(Int -> RenderTexture -> ShowS)
-> (RenderTexture -> String)
-> ([RenderTexture] -> ShowS)
-> Show RenderTexture
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RenderTexture -> ShowS
showsPrec :: Int -> RenderTexture -> ShowS
$cshow :: RenderTexture -> String
show :: RenderTexture -> String
$cshowList :: [RenderTexture] -> ShowS
showList :: [RenderTexture] -> ShowS
Show, RenderTexture -> Ptr RenderTexture -> IO ()
(RenderTexture -> Ptr RenderTexture -> IO ())
-> (RenderTexture -> Ptr RenderTexture -> IO ())
-> Freeable RenderTexture
forall a.
(a -> Ptr a -> IO ()) -> (a -> Ptr a -> IO ()) -> Freeable a
$crlFreeDependents :: RenderTexture -> Ptr RenderTexture -> IO ()
rlFreeDependents :: RenderTexture -> Ptr RenderTexture -> IO ()
$crlFree :: RenderTexture -> Ptr RenderTexture -> IO ()
rlFree :: RenderTexture -> Ptr RenderTexture -> IO ()
Freeable)

instance Storable RenderTexture where
  sizeOf :: RenderTexture -> Int
sizeOf RenderTexture
_ = Int
44
  alignment :: RenderTexture -> Int
alignment RenderTexture
_ = Int
4
  peek :: Ptr RenderTexture -> IO RenderTexture
peek Ptr RenderTexture
_p = do
    Integer
rtId <- CUInt -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CUInt -> Integer) -> IO CUInt -> IO Integer
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CUInt -> IO CUInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr RenderTexture -> Ptr CUInt
p'renderTexture'id Ptr RenderTexture
_p)
    Texture
texture <- Ptr Texture -> IO Texture
forall a. Storable a => Ptr a -> IO a
peek (Ptr RenderTexture -> Ptr Texture
p'renderTexture'texture Ptr RenderTexture
_p)
    Texture
depth <- Ptr Texture -> IO Texture
forall a. Storable a => Ptr a -> IO a
peek (Ptr RenderTexture -> Ptr Texture
p'renderTexture'depth Ptr RenderTexture
_p)
    RenderTexture -> IO RenderTexture
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (RenderTexture -> IO RenderTexture)
-> RenderTexture -> IO RenderTexture
forall a b. (a -> b) -> a -> b
$ Integer -> Texture -> Texture -> RenderTexture
RenderTexture Integer
rtId Texture
texture Texture
depth
  poke :: Ptr RenderTexture -> RenderTexture -> IO ()
poke Ptr RenderTexture
_p (RenderTexture Integer
rtId Texture
texture Texture
depth) = do
    Ptr CUInt -> CUInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr RenderTexture -> Ptr CUInt
p'renderTexture'id Ptr RenderTexture
_p) (Integer -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
rtId)
    Ptr Texture -> Texture -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr RenderTexture -> Ptr Texture
p'renderTexture'texture Ptr RenderTexture
_p) Texture
texture
    Ptr Texture -> Texture -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr RenderTexture -> Ptr Texture
p'renderTexture'depth Ptr RenderTexture
_p) Texture
depth
    () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

p'renderTexture'id :: Ptr RenderTexture -> Ptr CUInt
p'renderTexture'id :: Ptr RenderTexture -> Ptr CUInt
p'renderTexture'id = (Ptr RenderTexture -> Int -> Ptr CUInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0)

p'renderTexture'texture :: Ptr RenderTexture -> Ptr Texture
p'renderTexture'texture :: Ptr RenderTexture -> Ptr Texture
p'renderTexture'texture = (Ptr RenderTexture -> Int -> Ptr Texture
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
4)

p'renderTexture'depth :: Ptr RenderTexture -> Ptr Texture
p'renderTexture'depth :: Ptr RenderTexture -> Ptr Texture
p'renderTexture'depth = (Ptr RenderTexture -> Int -> Ptr Texture
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24)

type RenderTexture2D = RenderTexture

data NPatchInfo = NPatchInfo
  { NPatchInfo -> Rectangle
nPatchInfo'source :: Rectangle,
    NPatchInfo -> Int
nPatchInfo'left :: Int,
    NPatchInfo -> Int
nPatchInfo'top :: Int,
    NPatchInfo -> Int
nPatchInfo'right :: Int,
    NPatchInfo -> Int
nPatchInfo'bottom :: Int,
    NPatchInfo -> NPatchLayout
nPatchInfo'layout :: NPatchLayout
  }
  deriving (NPatchInfo -> NPatchInfo -> Bool
(NPatchInfo -> NPatchInfo -> Bool)
-> (NPatchInfo -> NPatchInfo -> Bool) -> Eq NPatchInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NPatchInfo -> NPatchInfo -> Bool
== :: NPatchInfo -> NPatchInfo -> Bool
$c/= :: NPatchInfo -> NPatchInfo -> Bool
/= :: NPatchInfo -> NPatchInfo -> Bool
Eq, Int -> NPatchInfo -> ShowS
[NPatchInfo] -> ShowS
NPatchInfo -> String
(Int -> NPatchInfo -> ShowS)
-> (NPatchInfo -> String)
-> ([NPatchInfo] -> ShowS)
-> Show NPatchInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NPatchInfo -> ShowS
showsPrec :: Int -> NPatchInfo -> ShowS
$cshow :: NPatchInfo -> String
show :: NPatchInfo -> String
$cshowList :: [NPatchInfo] -> ShowS
showList :: [NPatchInfo] -> ShowS
Show, NPatchInfo -> Ptr NPatchInfo -> IO ()
(NPatchInfo -> Ptr NPatchInfo -> IO ())
-> (NPatchInfo -> Ptr NPatchInfo -> IO ()) -> Freeable NPatchInfo
forall a.
(a -> Ptr a -> IO ()) -> (a -> Ptr a -> IO ()) -> Freeable a
$crlFreeDependents :: NPatchInfo -> Ptr NPatchInfo -> IO ()
rlFreeDependents :: NPatchInfo -> Ptr NPatchInfo -> IO ()
$crlFree :: NPatchInfo -> Ptr NPatchInfo -> IO ()
rlFree :: NPatchInfo -> Ptr NPatchInfo -> IO ()
Freeable)

instance Storable NPatchInfo where
  sizeOf :: NPatchInfo -> Int
sizeOf NPatchInfo
_ = Int
36
  alignment :: NPatchInfo -> Int
alignment NPatchInfo
_ = Int
4
  peek :: Ptr NPatchInfo -> IO NPatchInfo
peek Ptr NPatchInfo
_p = do
    Rectangle
source <- Ptr Rectangle -> IO Rectangle
forall a. Storable a => Ptr a -> IO a
peek (Ptr NPatchInfo -> Ptr Rectangle
p'nPatchInfo'source Ptr NPatchInfo
_p)
    Int
left <- CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'left Ptr NPatchInfo
_p)
    Int
top <- CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'top Ptr NPatchInfo
_p)
    Int
right <- CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'right Ptr NPatchInfo
_p)
    Int
bottom <- CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> IO CInt -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CInt -> IO CInt
forall a. Storable a => Ptr a -> IO a
peek (Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'bottom Ptr NPatchInfo
_p)
    NPatchLayout
layout <- Ptr NPatchLayout -> IO NPatchLayout
forall a. Storable a => Ptr a -> IO a
peek (Ptr NPatchInfo -> Ptr NPatchLayout
p'nPatchInfo'layout Ptr NPatchInfo
_p)
    NPatchInfo -> IO NPatchInfo
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (NPatchInfo -> IO NPatchInfo) -> NPatchInfo -> IO NPatchInfo
forall a b. (a -> b) -> a -> b
$ Rectangle -> Int -> Int -> Int -> Int -> NPatchLayout -> NPatchInfo
NPatchInfo Rectangle
source Int
left Int
right Int
top Int
bottom NPatchLayout
layout
  poke :: Ptr NPatchInfo -> NPatchInfo -> IO ()
poke Ptr NPatchInfo
_p (NPatchInfo Rectangle
source Int
left Int
right Int
top Int
bottom NPatchLayout
layout) = do
    Ptr Rectangle -> Rectangle -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr NPatchInfo -> Ptr Rectangle
p'nPatchInfo'source Ptr NPatchInfo
_p) Rectangle
source
    Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'left Ptr NPatchInfo
_p) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
left)
    Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'right Ptr NPatchInfo
_p) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
right)
    Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'top Ptr NPatchInfo
_p) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
top)
    Ptr CInt -> CInt -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'bottom Ptr NPatchInfo
_p) (Int -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
bottom)
    Ptr NPatchLayout -> NPatchLayout -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr NPatchInfo -> Ptr NPatchLayout
p'nPatchInfo'layout Ptr NPatchInfo
_p) NPatchLayout
layout
    () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

p'nPatchInfo'source :: Ptr NPatchInfo -> Ptr Rectangle
p'nPatchInfo'source :: Ptr NPatchInfo -> Ptr Rectangle
p'nPatchInfo'source = (Ptr NPatchInfo -> Int -> Ptr Rectangle
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0)

p'nPatchInfo'left :: Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'left :: Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'left = (Ptr NPatchInfo -> Int -> Ptr CInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16)

p'nPatchInfo'top :: Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'top :: Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'top = (Ptr NPatchInfo -> Int -> Ptr CInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
20)

p'nPatchInfo'right :: Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'right :: Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'right = (Ptr NPatchInfo -> Int -> Ptr CInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
24)

p'nPatchInfo'bottom :: Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'bottom :: Ptr NPatchInfo -> Ptr CInt
p'nPatchInfo'bottom = (Ptr NPatchInfo -> Int -> Ptr CInt
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
28)

p'nPatchInfo'layout :: Ptr NPatchInfo -> Ptr NPatchLayout
p'nPatchInfo'layout :: Ptr NPatchInfo -> Ptr NPatchLayout
p'nPatchInfo'layout = (Ptr NPatchInfo -> Int -> Ptr NPatchLayout
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
32)