{-# LINE 1 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
{-# LANGUAGE BlockArguments, LambdaCase, TupleSections #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
module Graphics.Cairo.Drawing.Paths.CairoPathT (
Path(..), CairoPathT, pattern CairoPathT, withCairoPathT, mkCairoPathT,
MoveTo(..), LineCurveTo(..), CloseTo(..),
CairoPatchPathT, pattern CairoPatchPathT,
pattern CairoPathTPatch, mkCairoPatchPathT ) where
import Foreign.Ptr
import Foreign.ForeignPtr hiding (newForeignPtr)
import Foreign.Concurrent
import Foreign.Marshal
import Foreign.Storable
import Foreign.C.Types
import Data.Bool
import Data.Word
import Graphics.Cairo.Exception
import System.IO.Unsafe
newtype CairoPathT = CairoPathT_ (ForeignPtr CairoPathT) deriving Int -> CairoPathT -> ShowS
[CairoPathT] -> ShowS
CairoPathT -> String
(Int -> CairoPathT -> ShowS)
-> (CairoPathT -> String)
-> ([CairoPathT] -> ShowS)
-> Show CairoPathT
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CairoPathT -> ShowS
showsPrec :: Int -> CairoPathT -> ShowS
$cshow :: CairoPathT -> String
show :: CairoPathT -> String
$cshowList :: [CairoPathT] -> ShowS
showList :: [CairoPathT] -> ShowS
Show
pattern CairoPathT :: [Path] -> CairoPathT
pattern $mCairoPathT :: forall {r}. CairoPathT -> ([Path] -> r) -> ((# #) -> r) -> r
$bCairoPathT :: [Path] -> CairoPathT
CairoPathT ps <- (unsafePerformIO . cairoPathTPathList -> ps) where
CairoPathT = IO CairoPathT -> CairoPathT
forall a. IO a -> a
unsafePerformIO (IO CairoPathT -> CairoPathT)
-> ([Path] -> IO CairoPathT) -> [Path] -> CairoPathT
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Path] -> IO CairoPathT
pathListToCairoPathT
withCairoPathT :: CairoPathT -> (Ptr CairoPathT -> IO a) -> IO a
withCairoPathT :: forall a. CairoPathT -> (Ptr CairoPathT -> IO a) -> IO a
withCairoPathT (CairoPathT_ ForeignPtr CairoPathT
fpth) = ForeignPtr CairoPathT -> (Ptr CairoPathT -> IO a) -> IO a
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CairoPathT
fpth
mkCairoPathT :: Ptr CairoPathT -> IO CairoPathT
mkCairoPathT :: Ptr CairoPathT -> IO CairoPathT
mkCairoPathT Ptr CairoPathT
p =
ForeignPtr CairoPathT -> CairoPathT
CairoPathT_ (ForeignPtr CairoPathT -> CairoPathT)
-> IO (ForeignPtr CairoPathT) -> IO CairoPathT
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathT -> IO () -> IO (ForeignPtr CairoPathT)
forall a. Ptr a -> IO () -> IO (ForeignPtr a)
newForeignPtr Ptr CairoPathT
p (Ptr CairoPathT -> IO ()
c_cairo_path_destroy Ptr CairoPathT
p)
IO CairoPathT -> IO () -> IO CairoPathT
forall a b. IO a -> IO b -> IO a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* (Word32 -> IO ()
cairoStatusToThrowError (Word32 -> IO ()) -> IO Word32 -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr CairoPathT -> IO Word32
cairoPathTStatus Ptr CairoPathT
p)
foreign import ccall "cairo_path_destroy" c_cairo_path_destroy ::
Ptr CairoPathT -> IO ()
cairoPathTStatus :: Ptr CairoPathT -> IO Word32
{-# LINE 44 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
cairoPathTStatus = (\hsc_ptr -> peekByteOff hsc_ptr 0)
{-# LINE 45 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
cairoPathTData ::Ptr CairoPathT -> IO (Ptr CairoPathDataT)
cairoPathTData :: Ptr CairoPathT -> IO (Ptr CairoPathDataT)
cairoPathTData = (\Ptr CairoPathT
hsc_ptr -> Ptr CairoPathT -> Int -> IO (Ptr CairoPathDataT)
forall b. Ptr b -> Int -> IO (Ptr CairoPathDataT)
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr CairoPathT
hsc_ptr Int
8)
{-# LINE 48 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
cairoPathTNumData :: Ptr CairoPathT -> IO CInt
cairoPathTNumData :: Ptr CairoPathT -> IO CInt
cairoPathTNumData = (\Ptr CairoPathT
hsc_ptr -> Ptr CairoPathT -> Int -> IO CInt
forall b. Ptr b -> Int -> IO CInt
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr CairoPathT
hsc_ptr Int
16)
{-# LINE 51 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
newtype CairoPathDataT = CairoPathDataT (Ptr CairoPathDataT) deriving Int -> CairoPathDataT -> ShowS
[CairoPathDataT] -> ShowS
CairoPathDataT -> String
(Int -> CairoPathDataT -> ShowS)
-> (CairoPathDataT -> String)
-> ([CairoPathDataT] -> ShowS)
-> Show CairoPathDataT
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CairoPathDataT -> ShowS
showsPrec :: Int -> CairoPathDataT -> ShowS
$cshow :: CairoPathDataT -> String
show :: CairoPathDataT -> String
$cshowList :: [CairoPathDataT] -> ShowS
showList :: [CairoPathDataT] -> ShowS
Show
nextPtr :: Ptr a -> Int -> Int -> Ptr a
nextPtr :: forall a. Ptr a -> Int -> Int -> Ptr a
nextPtr Ptr a
p Int
sz Int
al = Ptr a -> Int -> Ptr a
forall a. Ptr a -> Int -> Ptr a
alignPtr (Ptr a -> Int -> Ptr a
forall a b. Ptr a -> Int -> Ptr b
plusPtr Ptr a
p Int
sz) Int
al
nextCairoPathDataT :: Ptr CairoPathDataT -> Ptr CairoPathDataT
nextCairoPathDataT :: Ptr CairoPathDataT -> Ptr CairoPathDataT
nextCairoPathDataT Ptr CairoPathDataT
p = Ptr CairoPathDataT -> Int -> Int -> Ptr CairoPathDataT
forall a. Ptr a -> Int -> Int -> Ptr a
nextPtr Ptr CairoPathDataT
p (Int
16) Int
8
{-# LINE 59 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
nextByLength :: Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength :: Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
n | CInt
n CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
1 = Ptr CairoPathDataT
p
nextByLength Ptr CairoPathDataT
p CInt
n = Ptr CairoPathDataT -> Ptr CairoPathDataT
nextCairoPathDataT (Ptr CairoPathDataT -> Ptr CairoPathDataT)
-> Ptr CairoPathDataT -> Ptr CairoPathDataT
forall a b. (a -> b) -> a -> b
$ Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p (CInt
n CInt -> CInt -> CInt
forall a. Num a => a -> a -> a
- CInt
1)
cairoPathDataTHeaderType :: Ptr CairoPathDataT -> IO Word32
cairoPathDataTHeaderType = (\hsc_ptr -> peekByteOff hsc_ptr 0)
{-# LINE 66 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
cairoPathDataTHeaderLength :: Ptr CairoPathDataT -> IO CInt
= (\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> IO CInt
forall b. Ptr b -> Int -> IO CInt
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr CairoPathDataT
hsc_ptr Int
4)
{-# LINE 69 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
cairoPathDataTPointX, cairoPathDataTPointY :: Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX :: Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX = (\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> IO CDouble
forall b. Ptr b -> Int -> IO CDouble
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr CairoPathDataT
hsc_ptr Int
0)
{-# LINE 72 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
cairoPathDataTPointY = (\hsc_ptr -> peekByteOff hsc_ptr 8)
{-# LINE 73 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
data Path
= PathMoveTo CDouble CDouble
| PathLineTo CDouble CDouble
| PathCurveTo CDouble CDouble CDouble CDouble CDouble CDouble
| PathClosePath
deriving Int -> Path -> ShowS
[Path] -> ShowS
Path -> String
(Int -> Path -> ShowS)
-> (Path -> String) -> ([Path] -> ShowS) -> Show Path
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Path -> ShowS
showsPrec :: Int -> Path -> ShowS
$cshow :: Path -> String
show :: Path -> String
$cshowList :: [Path] -> ShowS
showList :: [Path] -> ShowS
Show
cairoPathTPathList :: CairoPathT -> IO [Path]
cairoPathTPathList :: CairoPathT -> IO [Path]
cairoPathTPathList (CairoPathT_ ForeignPtr CairoPathT
fp) = ForeignPtr CairoPathT -> (Ptr CairoPathT -> IO [Path]) -> IO [Path]
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CairoPathT
fp \Ptr CairoPathT
p -> do
d <- Ptr CairoPathT -> IO (Ptr CairoPathDataT)
cairoPathTData Ptr CairoPathT
p
n <- cairoPathTNumData p
cairoPathDataTPathList d n
cairoPathDataTPathList :: Ptr CairoPathDataT -> CInt -> IO [Path]
cairoPathDataTPathList :: Ptr CairoPathDataT -> CInt -> IO [Path]
cairoPathDataTPathList Ptr CairoPathDataT
_ CInt
n | CInt
n CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
1 = [Path] -> IO [Path]
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
cairoPathDataTPathList Ptr CairoPathDataT
p CInt
n = IO [Path] -> IO [Path]
forall a. IO a -> IO a
unsafeInterleaveIO do
pth <- IO Path -> IO Path
forall a. IO a -> IO a
unsafeInterleaveIO (IO Path -> IO Path) -> IO Path -> IO Path
forall a b. (a -> b) -> a -> b
$ Ptr CairoPathDataT -> IO Word32
cairoPathDataTHeaderType Ptr CairoPathDataT
p IO Word32 -> (Word32 -> IO Path) -> IO Path
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Word32
0 -> CDouble -> CDouble -> Path
PathMoveTo
{-# LINE 92 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(CDouble -> CDouble -> Path) -> IO CDouble -> IO (CDouble -> Path)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p1 IO (CDouble -> Path) -> IO CDouble -> IO Path
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p1
Word32
1 -> CDouble -> CDouble -> Path
PathLineTo
{-# LINE 94 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(CDouble -> CDouble -> Path) -> IO CDouble -> IO (CDouble -> Path)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p1 IO (CDouble -> Path) -> IO CDouble -> IO Path
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p1
Word32
2 -> CDouble
-> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> Path
PathCurveTo
{-# LINE 96 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(CDouble
-> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> Path)
-> IO CDouble
-> IO (CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> Path)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p1 IO (CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> Path)
-> IO CDouble
-> IO (CDouble -> CDouble -> CDouble -> CDouble -> Path)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p1
IO (CDouble -> CDouble -> CDouble -> CDouble -> Path)
-> IO CDouble -> IO (CDouble -> CDouble -> CDouble -> Path)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p2 IO (CDouble -> CDouble -> CDouble -> Path)
-> IO CDouble -> IO (CDouble -> CDouble -> Path)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p2
IO (CDouble -> CDouble -> Path)
-> IO CDouble -> IO (CDouble -> Path)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p3 IO (CDouble -> Path) -> IO CDouble -> IO Path
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p3
Word32
3 -> Path -> IO Path
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Path
PathClosePath
{-# LINE 100 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
Word32
_ -> String -> IO Path
forall a. HasCallStack => String -> a
error String
"no such path"
ln <- cairoPathDataTHeaderLength p
(pth :) <$> cairoPathDataTPathList (nextByLength p ln) (n - ln)
where
p1 :: Ptr CairoPathDataT
p1 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
1
p2 :: Ptr CairoPathDataT
p2 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
2
p3 :: Ptr CairoPathDataT
p3 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
3
pathToNumData :: Path -> Int
pathToNumData :: Path -> Int
pathToNumData = \case
PathMoveTo CDouble
_ CDouble
_ -> Int
2; PathLineTo CDouble
_ CDouble
_ -> Int
2; PathCurveTo CDouble
_ CDouble
_ CDouble
_ CDouble
_ CDouble
_ CDouble
_ -> Int
4; Path
PathClosePath -> Int
1
pathToCairoPathData :: Ptr CairoPathDataT -> Path -> IO ()
pathToCairoPathData :: Ptr CairoPathDataT -> Path -> IO ()
pathToCairoPathData Ptr CairoPathDataT
p = \case
PathMoveTo CDouble
x CDouble
y -> do
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p (Word32
0 :: Word32)
{-# LINE 116 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CInt -> IO ()
forall b. Ptr b -> Int -> CInt -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
4) Ptr CairoPathDataT
p (CInt
2 :: CInt)
{-# LINE 117 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p1 CDouble
x
{-# LINE 118 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p1 CDouble
y
{-# LINE 119 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
PathLineTo CDouble
x CDouble
y -> do
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p (Word32
1 :: Word32)
{-# LINE 121 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CInt -> IO ()
forall b. Ptr b -> Int -> CInt -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
4) Ptr CairoPathDataT
p (CInt
2 :: CInt)
{-# LINE 122 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p1 CDouble
x
{-# LINE 123 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p1 CDouble
y
{-# LINE 124 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
PathCurveTo CDouble
x1 CDouble
y1 CDouble
x2 CDouble
y2 CDouble
x3 CDouble
y3 -> do
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p (Word32
2 :: Word32)
{-# LINE 126 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CInt -> IO ()
forall b. Ptr b -> Int -> CInt -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
4) Ptr CairoPathDataT
p (CInt
4 :: CInt)
{-# LINE 127 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p1 CDouble
x1
{-# LINE 128 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p1 CDouble
y1
{-# LINE 129 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p2 CDouble
x2
{-# LINE 130 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p2 CDouble
y2
{-# LINE 131 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p3 CDouble
x3
{-# LINE 132 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p3 CDouble
y3
{-# LINE 133 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
Path
PathClosePath -> do
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p (Word32
3 :: Word32)
{-# LINE 135 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CInt -> IO ()
forall b. Ptr b -> Int -> CInt -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
4) Ptr CairoPathDataT
p (CInt
1 :: CInt)
{-# LINE 136 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
where
p1 :: Ptr CairoPathDataT
p1 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
1
p2 :: Ptr CairoPathDataT
p2 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
2
p3 :: Ptr CairoPathDataT
p3 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
3
calcAlignedSize :: Int -> Int -> Int
calcAlignedSize :: Int -> Int -> Int
calcAlignedSize Int
sz Int
al = (Int
sz Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
al Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int -> Int
forall a. Num a => a -> a
signum (Int
sz Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
al)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
al
cairoPathDataTSize :: Int
cairoPathDataTSize :: Int
cairoPathDataTSize = Int -> Int -> Int
calcAlignedSize (Int
16) Int
8
{-# LINE 146 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
pathListToCairoPathT :: [Path] -> IO CairoPathT
pathListToCairoPathT :: [Path] -> IO CairoPathT
pathListToCairoPathT [Path]
pths = ForeignPtr CairoPathT -> CairoPathT
CairoPathT_ (ForeignPtr CairoPathT -> CairoPathT)
-> IO (ForeignPtr CairoPathT) -> IO CairoPathT
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
pd <- Int -> IO (Ptr CairoPathDataT)
forall a. Int -> IO (Ptr a)
mallocBytes (Int -> IO (Ptr CairoPathDataT)) -> Int -> IO (Ptr CairoPathDataT)
forall a b. (a -> b) -> a -> b
$ [Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (Path -> Int
pathToNumData (Path -> Int) -> [Path] -> [Int]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Path]
pths) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
cairoPathDataTSize
pathListToCairoPathDataT pd pths
p <- mallocBytes (24)
{-# LINE 152 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathT
hsc_ptr -> Ptr CairoPathT -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathT
hsc_ptr Int
0) p (0 :: Word32)
{-# LINE 153 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathT
hsc_ptr -> Ptr CairoPathT -> Int -> Ptr CairoPathDataT -> IO ()
forall b. Ptr b -> Int -> Ptr CairoPathDataT -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathT
hsc_ptr Int
8) p pd
{-# LINE 154 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathT
hsc_ptr -> Ptr CairoPathT -> Int -> Int -> IO ()
forall b. Ptr b -> Int -> Int -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathT
hsc_ptr Int
16) p $ sum (pathToNumData <$> pths)
{-# LINE 155 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
newForeignPtr p $ free pd >> free p
pathListToCairoPathDataT :: Ptr CairoPathDataT -> [Path] -> IO ()
pathListToCairoPathDataT :: Ptr CairoPathDataT -> [Path] -> IO ()
pathListToCairoPathDataT Ptr CairoPathDataT
pd = \case
[] -> () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
Path
pth : [Path]
pths -> Ptr CairoPathDataT -> Path -> IO ()
pathToCairoPathData Ptr CairoPathDataT
pd Path
pth IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ptr CairoPathDataT -> [Path] -> IO ()
pathListToCairoPathDataT (Ptr CairoPathDataT
pd Ptr CairoPathDataT -> Int -> Ptr CairoPathDataT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
cairoPathDataTSize Int -> Int -> Int
forall a. Num a => a -> a -> a
* Path -> Int
pathToNumData Path
pth)) [Path]
pths
cairoPathTCheckPaths :: CairoPathT -> [Word32 -> Bool] -> IO Bool
{-# LINE 163 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
cairoPathTCheckPaths (CairoPathT_ fpth) ts = withForeignPtr fpth \ppth -> do
d <- cairoPathTData ppth
n <- cairoPathTNumData ppth
cairoPathDataCheckPaths d ts n
cairoPathDataCheckPaths :: Ptr CairoPathDataT -> [Word32 -> Bool] -> CInt -> IO Bool
{-# LINE 169 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
cairoPathDataCheckPaths _ [] 0 = pure True
cairoPathDataCheckPaths _ [] _ = pure False
cairoPathDataCheckPaths _ _ 0 = pure False
cairoPathDataCheckPaths p (t : ts) n = do
b <- t <$> cairoPathDataTHeaderType p
ln <- cairoPathDataTHeaderLength p
(b &&) <$> unsafeInterleaveIO (cairoPathDataCheckPaths (nextByLength p ln) ts (n - ln))
cairoPathTGetGoal :: CairoPathT -> Int -> IO (Maybe (CDouble, CDouble))
cairoPathTGetGoal :: CairoPathT -> Int -> IO (Maybe (CDouble, CDouble))
cairoPathTGetGoal (CairoPathT_ ForeignPtr CairoPathT
fpth) Int
i = ForeignPtr CairoPathT
-> (Ptr CairoPathT -> IO (Maybe (CDouble, CDouble)))
-> IO (Maybe (CDouble, CDouble))
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CairoPathT
fpth \Ptr CairoPathT
ppth -> do
d <- Ptr CairoPathT -> IO (Ptr CairoPathDataT)
cairoPathTData Ptr CairoPathT
ppth
n <- cairoPathTNumData ppth
cairoPathDataTGetGoal d i n
cairoPathDataTGetGoal :: Ptr CairoPathDataT -> Int -> CInt -> IO (Maybe (CDouble, CDouble))
cairoPathDataTGetGoal :: Ptr CairoPathDataT -> Int -> CInt -> IO (Maybe (CDouble, CDouble))
cairoPathDataTGetGoal Ptr CairoPathDataT
_ Int
_ CInt
n | CInt
n CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
1 = Maybe (CDouble, CDouble) -> IO (Maybe (CDouble, CDouble))
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (CDouble, CDouble)
forall a. Maybe a
Nothing
cairoPathDataTGetGoal Ptr CairoPathDataT
p Int
0 CInt
_ = IO (Maybe (CDouble, CDouble)) -> IO (Maybe (CDouble, CDouble))
forall a. IO a -> IO a
unsafeInterleaveIO do
Ptr CairoPathDataT -> IO Word32
cairoPathDataTHeaderType Ptr CairoPathDataT
p IO Word32
-> (Word32 -> IO (Maybe (CDouble, CDouble)))
-> IO (Maybe (CDouble, CDouble))
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Word32
0 -> (\CDouble
x CDouble
y -> (CDouble, CDouble) -> Maybe (CDouble, CDouble)
forall a. a -> Maybe a
Just (CDouble
x, CDouble
y))
{-# LINE 188 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(CDouble -> CDouble -> Maybe (CDouble, CDouble))
-> IO CDouble -> IO (CDouble -> Maybe (CDouble, CDouble))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p1 IO (CDouble -> Maybe (CDouble, CDouble))
-> IO CDouble -> IO (Maybe (CDouble, CDouble))
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p1
Word32
1 -> (\CDouble
x CDouble
y -> (CDouble, CDouble) -> Maybe (CDouble, CDouble)
forall a. a -> Maybe a
Just (CDouble
x, CDouble
y))
{-# LINE 190 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(CDouble -> CDouble -> Maybe (CDouble, CDouble))
-> IO CDouble -> IO (CDouble -> Maybe (CDouble, CDouble))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p1 IO (CDouble -> Maybe (CDouble, CDouble))
-> IO CDouble -> IO (Maybe (CDouble, CDouble))
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p1
Word32
2 -> (\CDouble
x CDouble
y -> (CDouble, CDouble) -> Maybe (CDouble, CDouble)
forall a. a -> Maybe a
Just (CDouble
x, CDouble
y))
{-# LINE 192 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(CDouble -> CDouble -> Maybe (CDouble, CDouble))
-> IO CDouble -> IO (CDouble -> Maybe (CDouble, CDouble))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p3 IO (CDouble -> Maybe (CDouble, CDouble))
-> IO CDouble -> IO (Maybe (CDouble, CDouble))
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p3
Word32
3 -> Maybe (CDouble, CDouble) -> IO (Maybe (CDouble, CDouble))
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (CDouble, CDouble)
forall a. Maybe a
Nothing
{-# LINE 194 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
Word32
_ -> String -> IO (Maybe (CDouble, CDouble))
forall a. HasCallStack => String -> a
error String
"no such path"
where p1 :: Ptr CairoPathDataT
p1 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
1; p3 :: Ptr CairoPathDataT
p3 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
3
cairoPathDataTGetGoal Ptr CairoPathDataT
p Int
i CInt
n = do
ln <- Ptr CairoPathDataT -> IO CInt
cairoPathDataTHeaderLength Ptr CairoPathDataT
p
cairoPathDataTGetGoal (nextByLength p ln) (i - 1) (n - ln)
lineOrCurve :: Word32 -> Bool
{-# LINE 201 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
lineOrCurve = (||) <$> (== 1) <*> (== 2)
{-# LINE 202 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
isCairoPatchPath :: CairoPathT -> IO Bool
isCairoPatchPath :: CairoPathT -> IO Bool
isCairoPatchPath CairoPathT
pth = do
b1 <- CairoPathT -> [Word32 -> Bool] -> IO Bool
cairoPathTCheckPaths CairoPathT
pth [
(Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
== Word32
0), Word32 -> Bool
lineOrCurve, Word32 -> Bool
lineOrCurve, Word32 -> Bool
lineOrCurve,
{-# LINE 207 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
== Word32
3) ]
{-# LINE 208 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
b2 <- cairoPathTCheckPaths pth [
(== 0), lineOrCurve, lineOrCurve, lineOrCurve, lineOrCurve ]
{-# LINE 210 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
b3 <- cairoPathTGetGoal pth 0 >>= \case
Maybe (CDouble, CDouble)
Nothing -> Bool -> IO Bool
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
Just (CDouble
x0, CDouble
y0) -> CairoPathT -> Int -> IO (Maybe (CDouble, CDouble))
cairoPathTGetGoal CairoPathT
pth Int
4 IO (Maybe (CDouble, CDouble))
-> (Maybe (CDouble, CDouble) -> IO Bool) -> IO Bool
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Maybe (CDouble, CDouble)
Nothing -> Bool -> IO Bool
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
Just (CDouble
xc, CDouble
yc) -> Bool -> IO Bool
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool -> IO Bool) -> Bool -> IO Bool
forall a b. (a -> b) -> a -> b
$ CDouble
xc CDouble -> CDouble -> Bool
forall a. Eq a => a -> a -> Bool
== CDouble
x0 Bool -> Bool -> Bool
&& CDouble
yc CDouble -> CDouble -> Bool
forall a. Eq a => a -> a -> Bool
== CDouble
y0
pure $ b1 || (b2 && b3)
newtype CairoPatchPathT = CairoPatchPathT_ (ForeignPtr CairoPathT) deriving Int -> CairoPatchPathT -> ShowS
[CairoPatchPathT] -> ShowS
CairoPatchPathT -> String
(Int -> CairoPatchPathT -> ShowS)
-> (CairoPatchPathT -> String)
-> ([CairoPatchPathT] -> ShowS)
-> Show CairoPatchPathT
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CairoPatchPathT -> ShowS
showsPrec :: Int -> CairoPatchPathT -> ShowS
$cshow :: CairoPatchPathT -> String
show :: CairoPatchPathT -> String
$cshowList :: [CairoPatchPathT] -> ShowS
showList :: [CairoPatchPathT] -> ShowS
Show
mkCairoPatchPathT :: Ptr CairoPathT -> IO CairoPatchPathT
mkCairoPatchPathT :: Ptr CairoPathT -> IO CairoPatchPathT
mkCairoPatchPathT Ptr CairoPathT
p =
ForeignPtr CairoPathT -> CairoPatchPathT
CairoPatchPathT_ (ForeignPtr CairoPathT -> CairoPatchPathT)
-> IO (ForeignPtr CairoPathT) -> IO CairoPatchPathT
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathT -> IO () -> IO (ForeignPtr CairoPathT)
forall a. Ptr a -> IO () -> IO (ForeignPtr a)
newForeignPtr Ptr CairoPathT
p (Ptr CairoPathT -> IO ()
c_cairo_path_destroy Ptr CairoPathT
p)
IO CairoPatchPathT -> IO () -> IO CairoPatchPathT
forall a b. IO a -> IO b -> IO a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* (Word32 -> IO ()
cairoStatusToThrowError (Word32 -> IO ()) -> IO Word32 -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr CairoPathT -> IO Word32
cairoPathTStatus Ptr CairoPathT
p)
pattern CairoPathTPatch :: CairoPatchPathT -> CairoPathT
pattern $mCairoPathTPatch :: forall {r}.
CairoPathT -> (CairoPatchPathT -> r) -> ((# #) -> r) -> r
$bCairoPathTPatch :: CairoPatchPathT -> CairoPathT
CairoPathTPatch ppth <- (unsafePerformIO . cairoPathTPatch -> Just ppth) where
CairoPathTPatch (CairoPatchPathT_ ForeignPtr CairoPathT
fpth) = ForeignPtr CairoPathT -> CairoPathT
CairoPathT_ ForeignPtr CairoPathT
fpth
cairoPathTPatch :: CairoPathT -> IO (Maybe CairoPatchPathT)
cairoPathTPatch :: CairoPathT -> IO (Maybe CairoPatchPathT)
cairoPathTPatch pth :: CairoPathT
pth@(CairoPathT_ ForeignPtr CairoPathT
fpth) =
Maybe CairoPatchPathT
-> Maybe CairoPatchPathT -> Bool -> Maybe CairoPatchPathT
forall a. a -> a -> Bool -> a
bool Maybe CairoPatchPathT
forall a. Maybe a
Nothing (CairoPatchPathT -> Maybe CairoPatchPathT
forall a. a -> Maybe a
Just (CairoPatchPathT -> Maybe CairoPatchPathT)
-> CairoPatchPathT -> Maybe CairoPatchPathT
forall a b. (a -> b) -> a -> b
$ ForeignPtr CairoPathT -> CairoPatchPathT
CairoPatchPathT_ ForeignPtr CairoPathT
fpth) (Bool -> Maybe CairoPatchPathT)
-> IO Bool -> IO (Maybe CairoPatchPathT)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CairoPathT -> IO Bool
isCairoPatchPath CairoPathT
pth
data MoveTo = MoveTo CDouble CDouble deriving Int -> MoveTo -> ShowS
[MoveTo] -> ShowS
MoveTo -> String
(Int -> MoveTo -> ShowS)
-> (MoveTo -> String) -> ([MoveTo] -> ShowS) -> Show MoveTo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MoveTo -> ShowS
showsPrec :: Int -> MoveTo -> ShowS
$cshow :: MoveTo -> String
show :: MoveTo -> String
$cshowList :: [MoveTo] -> ShowS
showList :: [MoveTo] -> ShowS
Show
data LineCurveTo
= LineTo CDouble CDouble
| CurveTo CDouble CDouble CDouble CDouble CDouble CDouble
deriving Int -> LineCurveTo -> ShowS
[LineCurveTo] -> ShowS
LineCurveTo -> String
(Int -> LineCurveTo -> ShowS)
-> (LineCurveTo -> String)
-> ([LineCurveTo] -> ShowS)
-> Show LineCurveTo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LineCurveTo -> ShowS
showsPrec :: Int -> LineCurveTo -> ShowS
$cshow :: LineCurveTo -> String
show :: LineCurveTo -> String
$cshowList :: [LineCurveTo] -> ShowS
showList :: [LineCurveTo] -> ShowS
Show
data CloseTo
= CloseLineTo
| CloseCurveTo CDouble CDouble CDouble CDouble
deriving Int -> CloseTo -> ShowS
[CloseTo] -> ShowS
CloseTo -> String
(Int -> CloseTo -> ShowS)
-> (CloseTo -> String) -> ([CloseTo] -> ShowS) -> Show CloseTo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CloseTo -> ShowS
showsPrec :: Int -> CloseTo -> ShowS
$cshow :: CloseTo -> String
show :: CloseTo -> String
$cshowList :: [CloseTo] -> ShowS
showList :: [CloseTo] -> ShowS
Show
pattern CairoPatchPathT :: MoveTo -> LineCurveTo -> LineCurveTo -> LineCurveTo -> CloseTo -> CairoPatchPathT
pattern $mCairoPatchPathT :: forall {r}.
CairoPatchPathT
-> (MoveTo
-> LineCurveTo -> LineCurveTo -> LineCurveTo -> CloseTo -> r)
-> ((# #) -> r)
-> r
$bCairoPatchPathT :: MoveTo
-> LineCurveTo
-> LineCurveTo
-> LineCurveTo
-> CloseTo
-> CairoPatchPathT
CairoPatchPathT mt lct1 lct2 lct3 cls <- (unsafePerformIO . drawFromCairoPatchPathT -> (mt, lct1, lct2, lct3, cls)) where
CairoPatchPathT MoveTo
mt LineCurveTo
lct1 LineCurveTo
lct2 LineCurveTo
lct3 CloseTo
cls = IO CairoPatchPathT -> CairoPatchPathT
forall a. IO a -> a
unsafePerformIO (IO CairoPatchPathT -> CairoPatchPathT)
-> IO CairoPatchPathT -> CairoPatchPathT
forall a b. (a -> b) -> a -> b
$ MoveTo
-> LineCurveTo
-> LineCurveTo
-> LineCurveTo
-> CloseTo
-> IO CairoPatchPathT
patchPathsToCairoPatchPathT MoveTo
mt LineCurveTo
lct1 LineCurveTo
lct2 LineCurveTo
lct3 CloseTo
cls
drawFromCairoPatchPathT :: CairoPatchPathT -> IO (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo)
drawFromCairoPatchPathT :: CairoPatchPathT
-> IO (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo)
drawFromCairoPatchPathT (CairoPatchPathT_ ForeignPtr CairoPathT
fpth) = ForeignPtr CairoPathT
-> (Ptr CairoPathT
-> IO (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo))
-> IO (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CairoPathT
fpth \Ptr CairoPathT
ppth -> do
d <- Ptr CairoPathT -> IO (Ptr CairoPathDataT)
cairoPathTData Ptr CairoPathT
ppth
n <- cairoPathTNumData ppth
drawFromCairoPathDataT d n >>= \case
(Just (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo)
r, CInt
0) -> (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo)
-> IO (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo)
r
(Maybe (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo),
CInt)
_ -> String
-> IO (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo)
forall a. HasCallStack => String -> a
error String
"badbadbad"
drawFromCairoPathDataT :: Ptr CairoPathDataT -> CInt ->
IO (Maybe (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo), CInt)
drawFromCairoPathDataT :: Ptr CairoPathDataT
-> CInt
-> IO
(Maybe (MoveTo, LineCurveTo, LineCurveTo, LineCurveTo, CloseTo),
CInt)
drawFromCairoPathDataT Ptr CairoPathDataT
p0 CInt
n0 = do
(mmt, pn1) <- Ptr CairoPathDataT
-> CInt -> IO (Maybe MoveTo, (Ptr CairoPathDataT, CInt))
drawMoveToFromCairoPathDataT Ptr CairoPathDataT
p0 CInt
n0
(mlct1, pn2) <- uncurry drawLineCurveToFromCairoPathDataT pn1
(mlct2, pn3) <- uncurry drawLineCurveToFromCairoPathDataT pn2
(mlct3, pn4) <- uncurry drawLineCurveToFromCairoPathDataT pn3
(mcls_, (_p5, n5)) <- uncurry drawCloseToFromCairoPathDataT pn4
let mcls = case Maybe MoveTo
mmt of
Maybe MoveTo
Nothing -> String -> Maybe CloseTo
forall a. HasCallStack => String -> a
error String
"bad"
Just (MoveTo CDouble
x0 CDouble
y0) -> case Maybe (CloseTo, Maybe (CDouble, CDouble))
mcls_ of
Maybe (CloseTo, Maybe (CDouble, CDouble))
Nothing -> String -> Maybe CloseTo
forall a. HasCallStack => String -> a
error String
"bad"
Just (CloseTo
m, Maybe (CDouble, CDouble)
Nothing) -> CloseTo -> Maybe CloseTo
forall a. a -> Maybe a
Just CloseTo
m
Just (CloseTo
m, Just (CDouble
x1, CDouble
y1))
| CDouble
x0 CDouble -> CDouble -> Bool
forall a. Eq a => a -> a -> Bool
== CDouble
x1 Bool -> Bool -> Bool
&& CDouble
y0 CDouble -> CDouble -> Bool
forall a. Eq a => a -> a -> Bool
== CDouble
y1 -> CloseTo -> Maybe CloseTo
forall a. a -> Maybe a
Just CloseTo
m
| Bool
otherwise -> String -> Maybe CloseTo
forall a. HasCallStack => String -> a
error String
"bad"
if n5 /= 0 then error "bad" else pure
. (, n5) $ (,,,,) <$> mmt <*> mlct1 <*> mlct2 <*> mlct3 <*> mcls
drawMoveToFromCairoPathDataT :: Ptr CairoPathDataT -> CInt -> IO (Maybe MoveTo, (Ptr CairoPathDataT, CInt))
drawMoveToFromCairoPathDataT :: Ptr CairoPathDataT
-> CInt -> IO (Maybe MoveTo, (Ptr CairoPathDataT, CInt))
drawMoveToFromCairoPathDataT Ptr CairoPathDataT
p CInt
n = do
mt <- Ptr CairoPathDataT -> IO Word32
cairoPathDataTHeaderType Ptr CairoPathDataT
p IO Word32 -> (Word32 -> IO (Maybe MoveTo)) -> IO (Maybe MoveTo)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Word32
0 -> MoveTo -> Maybe MoveTo
forall a. a -> Maybe a
Just
{-# LINE 279 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(MoveTo -> Maybe MoveTo) -> IO MoveTo -> IO (Maybe MoveTo)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (CDouble -> CDouble -> MoveTo
MoveTo (CDouble -> CDouble -> MoveTo)
-> IO CDouble -> IO (CDouble -> MoveTo)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p1 IO (CDouble -> MoveTo) -> IO CDouble -> IO MoveTo
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p1)
Word32
_ -> Maybe MoveTo -> IO (Maybe MoveTo)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe MoveTo
forall a. Maybe a
Nothing
ln <- cairoPathDataTHeaderLength p
if n - ln < 0 then error "bad" else pure (mt, (nextByLength p ln, n - ln))
where p1 :: Ptr CairoPathDataT
p1 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
1
drawLineCurveToFromCairoPathDataT :: Ptr CairoPathDataT -> CInt -> IO (Maybe LineCurveTo, (Ptr CairoPathDataT, CInt))
drawLineCurveToFromCairoPathDataT :: Ptr CairoPathDataT
-> CInt -> IO (Maybe LineCurveTo, (Ptr CairoPathDataT, CInt))
drawLineCurveToFromCairoPathDataT Ptr CairoPathDataT
p CInt
n = do
lct <- Ptr CairoPathDataT -> IO Word32
cairoPathDataTHeaderType Ptr CairoPathDataT
p IO Word32
-> (Word32 -> IO (Maybe LineCurveTo)) -> IO (Maybe LineCurveTo)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Word32
1 -> LineCurveTo -> Maybe LineCurveTo
forall a. a -> Maybe a
Just
{-# LINE 289 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(LineCurveTo -> Maybe LineCurveTo)
-> IO LineCurveTo -> IO (Maybe LineCurveTo)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (CDouble -> CDouble -> LineCurveTo
LineTo (CDouble -> CDouble -> LineCurveTo)
-> IO CDouble -> IO (CDouble -> LineCurveTo)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p1 IO (CDouble -> LineCurveTo) -> IO CDouble -> IO LineCurveTo
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p1)
Word32
2 -> (LineCurveTo -> Maybe LineCurveTo
forall a. a -> Maybe a
Just (LineCurveTo -> Maybe LineCurveTo)
-> IO LineCurveTo -> IO (Maybe LineCurveTo)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (IO LineCurveTo -> IO (Maybe LineCurveTo))
-> IO LineCurveTo -> IO (Maybe LineCurveTo)
forall a b. (a -> b) -> a -> b
$ CDouble
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> LineCurveTo
CurveTo
{-# LINE 291 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(CDouble
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> CDouble
-> LineCurveTo)
-> IO CDouble
-> IO
(CDouble
-> CDouble -> CDouble -> CDouble -> CDouble -> LineCurveTo)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p1 IO
(CDouble
-> CDouble -> CDouble -> CDouble -> CDouble -> LineCurveTo)
-> IO CDouble
-> IO (CDouble -> CDouble -> CDouble -> CDouble -> LineCurveTo)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p1
IO (CDouble -> CDouble -> CDouble -> CDouble -> LineCurveTo)
-> IO CDouble -> IO (CDouble -> CDouble -> CDouble -> LineCurveTo)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p2 IO (CDouble -> CDouble -> CDouble -> LineCurveTo)
-> IO CDouble -> IO (CDouble -> CDouble -> LineCurveTo)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p2
IO (CDouble -> CDouble -> LineCurveTo)
-> IO CDouble -> IO (CDouble -> LineCurveTo)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p3 IO (CDouble -> LineCurveTo) -> IO CDouble -> IO LineCurveTo
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p3
Word32
_ -> Maybe LineCurveTo -> IO (Maybe LineCurveTo)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe LineCurveTo
forall a. Maybe a
Nothing
ln <- cairoPathDataTHeaderLength p
if n - ln < 0 then error "bad" else pure (lct, (nextByLength p ln, n - ln))
where p1 :: Ptr CairoPathDataT
p1 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
1; p2 :: Ptr CairoPathDataT
p2 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
2; p3 :: Ptr CairoPathDataT
p3 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
3
drawCloseToFromCairoPathDataT :: Ptr CairoPathDataT -> CInt -> IO (Maybe (CloseTo, Maybe (CDouble, CDouble)), (Ptr CairoPathDataT, CInt))
drawCloseToFromCairoPathDataT :: Ptr CairoPathDataT
-> CInt
-> IO
(Maybe (CloseTo, Maybe (CDouble, CDouble)),
(Ptr CairoPathDataT, CInt))
drawCloseToFromCairoPathDataT Ptr CairoPathDataT
p CInt
n = do
ctgl <- Ptr CairoPathDataT -> IO Word32
cairoPathDataTHeaderType Ptr CairoPathDataT
p IO Word32
-> (Word32 -> IO (Maybe (CloseTo, Maybe (CDouble, CDouble))))
-> IO (Maybe (CloseTo, Maybe (CDouble, CDouble)))
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Word32
1 -> ((CloseTo, Maybe (CDouble, CDouble))
-> Maybe (CloseTo, Maybe (CDouble, CDouble))
forall a. a -> Maybe a
Just ((CloseTo, Maybe (CDouble, CDouble))
-> Maybe (CloseTo, Maybe (CDouble, CDouble)))
-> IO (CloseTo, Maybe (CDouble, CDouble))
-> IO (Maybe (CloseTo, Maybe (CDouble, CDouble)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (IO (CloseTo, Maybe (CDouble, CDouble))
-> IO (Maybe (CloseTo, Maybe (CDouble, CDouble))))
-> IO (CloseTo, Maybe (CDouble, CDouble))
-> IO (Maybe (CloseTo, Maybe (CDouble, CDouble)))
forall a b. (a -> b) -> a -> b
$ ((CloseTo
CloseLineTo ,) (Maybe (CDouble, CDouble) -> (CloseTo, Maybe (CDouble, CDouble)))
-> ((CDouble, CDouble) -> Maybe (CDouble, CDouble))
-> (CDouble, CDouble)
-> (CloseTo, Maybe (CDouble, CDouble))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CDouble, CDouble) -> Maybe (CDouble, CDouble)
forall a. a -> Maybe a
Just ((CDouble, CDouble) -> (CloseTo, Maybe (CDouble, CDouble)))
-> IO (CDouble, CDouble) -> IO (CloseTo, Maybe (CDouble, CDouble))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (IO (CDouble, CDouble) -> IO (CloseTo, Maybe (CDouble, CDouble)))
-> IO (CDouble, CDouble) -> IO (CloseTo, Maybe (CDouble, CDouble))
forall a b. (a -> b) -> a -> b
$
{-# LINE 303 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(,) (CDouble -> CDouble -> (CDouble, CDouble))
-> IO CDouble -> IO (CDouble -> (CDouble, CDouble))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p1 IO (CDouble -> (CDouble, CDouble))
-> IO CDouble -> IO (CDouble, CDouble)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p1
Word32
2 -> ((CloseTo, Maybe (CDouble, CDouble))
-> Maybe (CloseTo, Maybe (CDouble, CDouble))
forall a. a -> Maybe a
Just ((CloseTo, Maybe (CDouble, CDouble))
-> Maybe (CloseTo, Maybe (CDouble, CDouble)))
-> IO (CloseTo, Maybe (CDouble, CDouble))
-> IO (Maybe (CloseTo, Maybe (CDouble, CDouble)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (IO (CloseTo, Maybe (CDouble, CDouble))
-> IO (Maybe (CloseTo, Maybe (CDouble, CDouble))))
-> IO (CloseTo, Maybe (CDouble, CDouble))
-> IO (Maybe (CloseTo, Maybe (CDouble, CDouble)))
forall a b. (a -> b) -> a -> b
$ (,)
{-# LINE 305 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(CloseTo
-> Maybe (CDouble, CDouble) -> (CloseTo, Maybe (CDouble, CDouble)))
-> IO CloseTo
-> IO
(Maybe (CDouble, CDouble) -> (CloseTo, Maybe (CDouble, CDouble)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (CDouble -> CDouble -> CDouble -> CDouble -> CloseTo
CloseCurveTo
(CDouble -> CDouble -> CDouble -> CDouble -> CloseTo)
-> IO CDouble -> IO (CDouble -> CDouble -> CDouble -> CloseTo)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p1 IO (CDouble -> CDouble -> CDouble -> CloseTo)
-> IO CDouble -> IO (CDouble -> CDouble -> CloseTo)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p1
IO (CDouble -> CDouble -> CloseTo)
-> IO CDouble -> IO (CDouble -> CloseTo)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p2 IO (CDouble -> CloseTo) -> IO CDouble -> IO CloseTo
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p2)
IO
(Maybe (CDouble, CDouble) -> (CloseTo, Maybe (CDouble, CDouble)))
-> IO (Maybe (CDouble, CDouble))
-> IO (CloseTo, Maybe (CDouble, CDouble))
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((CDouble, CDouble) -> Maybe (CDouble, CDouble)
forall a. a -> Maybe a
Just ((CDouble, CDouble) -> Maybe (CDouble, CDouble))
-> IO (CDouble, CDouble) -> IO (Maybe (CDouble, CDouble))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((,) (CDouble -> CDouble -> (CDouble, CDouble))
-> IO CDouble -> IO (CDouble -> (CDouble, CDouble))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointX Ptr CairoPathDataT
p3 IO (CDouble -> (CDouble, CDouble))
-> IO CDouble -> IO (CDouble, CDouble)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr CairoPathDataT -> IO CDouble
cairoPathDataTPointY Ptr CairoPathDataT
p3))
Word32
3 -> Maybe (CloseTo, Maybe (CDouble, CDouble))
-> IO (Maybe (CloseTo, Maybe (CDouble, CDouble)))
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe (CloseTo, Maybe (CDouble, CDouble))
-> IO (Maybe (CloseTo, Maybe (CDouble, CDouble))))
-> Maybe (CloseTo, Maybe (CDouble, CDouble))
-> IO (Maybe (CloseTo, Maybe (CDouble, CDouble)))
forall a b. (a -> b) -> a -> b
$ (CloseTo, Maybe (CDouble, CDouble))
-> Maybe (CloseTo, Maybe (CDouble, CDouble))
forall a. a -> Maybe a
Just (CloseTo
CloseLineTo, Maybe (CDouble, CDouble)
forall a. Maybe a
Nothing)
{-# LINE 310 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
Word32
_ -> Maybe (CloseTo, Maybe (CDouble, CDouble))
-> IO (Maybe (CloseTo, Maybe (CDouble, CDouble)))
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (CloseTo, Maybe (CDouble, CDouble))
forall a. Maybe a
Nothing
ln <- cairoPathDataTHeaderLength p
if n - ln < 0 then error "bad" else pure (ctgl, (nextByLength p ln, n - ln))
where [Ptr CairoPathDataT
p1, Ptr CairoPathDataT
p2, Ptr CairoPathDataT
p3] = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p (CInt -> Ptr CairoPathDataT) -> [CInt] -> [Ptr CairoPathDataT]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [CInt
1, CInt
2, CInt
3]
patchPathsToCairoPatchPathT ::
MoveTo -> LineCurveTo -> LineCurveTo -> LineCurveTo -> CloseTo -> IO CairoPatchPathT
patchPathsToCairoPatchPathT :: MoveTo
-> LineCurveTo
-> LineCurveTo
-> LineCurveTo
-> CloseTo
-> IO CairoPatchPathT
patchPathsToCairoPatchPathT MoveTo
mt LineCurveTo
lct1 LineCurveTo
lct2 LineCurveTo
lct3 CloseTo
cls = ForeignPtr CairoPathT -> CairoPatchPathT
CairoPatchPathT_ (ForeignPtr CairoPathT -> CairoPatchPathT)
-> IO (ForeignPtr CairoPathT) -> IO CairoPatchPathT
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
pd <- Int -> IO (Ptr CairoPathDataT)
forall a. Int -> IO (Ptr a)
mallocBytes (Int -> IO (Ptr CairoPathDataT)) -> Int -> IO (Ptr CairoPathDataT)
forall a b. (a -> b) -> a -> b
$ MoveTo
-> LineCurveTo -> LineCurveTo -> LineCurveTo -> CloseTo -> Int
patchPathSize MoveTo
mt LineCurveTo
lct1 LineCurveTo
lct2 LineCurveTo
lct3 CloseTo
cls Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
cairoPathDataTSize
patchPathsToCairoPathDataT pd mt lct1 lct2 lct3 cls
p <- mallocBytes (24)
{-# LINE 321 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathT
hsc_ptr -> Ptr CairoPathT -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathT
hsc_ptr Int
0) p (0 :: Word32)
{-# LINE 322 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathT
hsc_ptr -> Ptr CairoPathT -> Int -> Ptr CairoPathDataT -> IO ()
forall b. Ptr b -> Int -> Ptr CairoPathDataT -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathT
hsc_ptr Int
8) p pd
{-# LINE 323 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathT
hsc_ptr -> Ptr CairoPathT -> Int -> Int -> IO ()
forall b. Ptr b -> Int -> Int -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathT
hsc_ptr Int
16) p $ patchPathSize mt lct1 lct2 lct3 cls
{-# LINE 324 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
newForeignPtr p $ free pd >> free p
patchPathSize :: MoveTo -> LineCurveTo -> LineCurveTo -> LineCurveTo -> CloseTo -> Int
patchPathSize :: MoveTo
-> LineCurveTo -> LineCurveTo -> LineCurveTo -> CloseTo -> Int
patchPathSize MoveTo
_mt LineCurveTo
lct1 LineCurveTo
lct2 LineCurveTo
lct3 CloseTo
cls =
Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ [Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (LineCurveTo -> Int
lineCurveToSize (LineCurveTo -> Int) -> [LineCurveTo] -> [Int]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [LineCurveTo
lct1, LineCurveTo
lct2, LineCurveTo
lct3]) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ CloseTo -> Int
closeToSize CloseTo
cls
lineCurveToSize :: LineCurveTo -> Int
lineCurveToSize :: LineCurveTo -> Int
lineCurveToSize (LineTo CDouble
_ CDouble
_) = Int
2
lineCurveToSize (CurveTo CDouble
_ CDouble
_ CDouble
_ CDouble
_ CDouble
_ CDouble
_) = Int
4
closeToSize :: CloseTo -> Int
closeToSize :: CloseTo -> Int
closeToSize CloseTo
CloseLineTo = Int
1
closeToSize (CloseCurveTo CDouble
_ CDouble
_ CDouble
_ CDouble
_) = Int
4
patchPathsToCairoPathDataT :: Ptr CairoPathDataT ->
MoveTo -> LineCurveTo -> LineCurveTo -> LineCurveTo -> CloseTo -> IO ()
patchPathsToCairoPathDataT :: Ptr CairoPathDataT
-> MoveTo
-> LineCurveTo
-> LineCurveTo
-> LineCurveTo
-> CloseTo
-> IO ()
patchPathsToCairoPathDataT Ptr CairoPathDataT
pd MoveTo
mt LineCurveTo
lct1 LineCurveTo
lct2 LineCurveTo
lct3 CloseTo
cls = do
pd1 <- Ptr CairoPathDataT -> MoveTo -> IO (Ptr CairoPathDataT)
moveToToCairoPathDataT Ptr CairoPathDataT
pd MoveTo
mt
pd2 <- lineCurveToToCairoPathDataT pd1 lct1
pd3 <- lineCurveToToCairoPathDataT pd2 lct2
pd4 <- lineCurveToToCairoPathDataT pd3 lct3
_ <- closeToToCairoPathDataT pd4 mt cls
pure ()
moveToToCairoPathDataT :: Ptr CairoPathDataT -> MoveTo -> IO (Ptr CairoPathDataT)
moveToToCairoPathDataT :: Ptr CairoPathDataT -> MoveTo -> IO (Ptr CairoPathDataT)
moveToToCairoPathDataT Ptr CairoPathDataT
p (MoveTo CDouble
x CDouble
y) = do
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p (Word32
0 :: Word32)
{-# LINE 351 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CInt -> IO ()
forall b. Ptr b -> Int -> CInt -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
4) Ptr CairoPathDataT
p (CInt
2 :: CInt)
{-# LINE 352 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p1 CDouble
x
{-# LINE 353 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p1 CDouble
y
{-# LINE 354 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
Ptr CairoPathDataT -> IO (Ptr CairoPathDataT)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Ptr CairoPathDataT -> IO (Ptr CairoPathDataT))
-> Ptr CairoPathDataT -> IO (Ptr CairoPathDataT)
forall a b. (a -> b) -> a -> b
$ Ptr CairoPathDataT
p Ptr CairoPathDataT -> Int -> Ptr CairoPathDataT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
cairoPathDataTSize Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2)
where p1 :: Ptr CairoPathDataT
p1 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
1
lineCurveToToCairoPathDataT :: Ptr CairoPathDataT -> LineCurveTo -> IO (Ptr CairoPathDataT)
lineCurveToToCairoPathDataT :: Ptr CairoPathDataT -> LineCurveTo -> IO (Ptr CairoPathDataT)
lineCurveToToCairoPathDataT Ptr CairoPathDataT
p = \case
LineTo CDouble
x CDouble
y -> do
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p (Word32
1 :: Word32)
{-# LINE 361 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CInt -> IO ()
forall b. Ptr b -> Int -> CInt -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
4) Ptr CairoPathDataT
p (CInt
2 :: CInt)
{-# LINE 362 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p1 CDouble
x
{-# LINE 363 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p1 CDouble
y
{-# LINE 364 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
Ptr CairoPathDataT -> IO (Ptr CairoPathDataT)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Ptr CairoPathDataT -> IO (Ptr CairoPathDataT))
-> Ptr CairoPathDataT -> IO (Ptr CairoPathDataT)
forall a b. (a -> b) -> a -> b
$ Ptr CairoPathDataT
p Ptr CairoPathDataT -> Int -> Ptr CairoPathDataT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
cairoPathDataTSize Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2)
CurveTo CDouble
x1 CDouble
y1 CDouble
x2 CDouble
y2 CDouble
x3 CDouble
y3 -> do
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p (Word32
2 :: Word32)
{-# LINE 367 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CInt -> IO ()
forall b. Ptr b -> Int -> CInt -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
4) Ptr CairoPathDataT
p (CInt
4 :: CInt)
{-# LINE 368 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p1 CDouble
x1
{-# LINE 369 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p1 CDouble
y1
{-# LINE 370 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p2 CDouble
x2
{-# LINE 371 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p2 CDouble
y2
{-# LINE 372 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p3 CDouble
x3
{-# LINE 373 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p3 CDouble
y3
{-# LINE 374 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
Ptr CairoPathDataT -> IO (Ptr CairoPathDataT)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Ptr CairoPathDataT -> IO (Ptr CairoPathDataT))
-> Ptr CairoPathDataT -> IO (Ptr CairoPathDataT)
forall a b. (a -> b) -> a -> b
$ Ptr CairoPathDataT
p Ptr CairoPathDataT -> Int -> Ptr CairoPathDataT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
cairoPathDataTSize Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
4)
where p1 :: Ptr CairoPathDataT
p1 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
1; p2 :: Ptr CairoPathDataT
p2 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
2; p3 :: Ptr CairoPathDataT
p3 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
3
closeToToCairoPathDataT :: Ptr CairoPathDataT -> MoveTo -> CloseTo -> IO (Ptr CairoPathDataT)
closeToToCairoPathDataT :: Ptr CairoPathDataT -> MoveTo -> CloseTo -> IO (Ptr CairoPathDataT)
closeToToCairoPathDataT Ptr CairoPathDataT
p (MoveTo CDouble
x0 CDouble
y0) = \case
CloseTo
CloseLineTo -> do
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p (Word32
3 :: Word32)
{-# LINE 381 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CInt -> IO ()
forall b. Ptr b -> Int -> CInt -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
4) Ptr CairoPathDataT
p (CInt
1 :: CInt)
{-# LINE 382 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
Ptr CairoPathDataT -> IO (Ptr CairoPathDataT)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Ptr CairoPathDataT -> IO (Ptr CairoPathDataT))
-> Ptr CairoPathDataT -> IO (Ptr CairoPathDataT)
forall a b. (a -> b) -> a -> b
$ Ptr CairoPathDataT
p Ptr CairoPathDataT -> Int -> Ptr CairoPathDataT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
cairoPathDataTSize
CloseCurveTo CDouble
x1 CDouble
y1 CDouble
x2 CDouble
y2 -> do
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> Word32 -> IO ()
forall b. Ptr b -> Int -> Word32 -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p (Word32
2 :: Word32)
{-# LINE 385 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CInt -> IO ()
forall b. Ptr b -> Int -> CInt -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
4) Ptr CairoPathDataT
p (CInt
4 :: CInt)
{-# LINE 386 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p1 CDouble
x1
{-# LINE 387 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p1 CDouble
y1
{-# LINE 388 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p2 CDouble
x2
{-# LINE 389 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p2 CDouble
y2
{-# LINE 390 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
0) Ptr CairoPathDataT
p3 CDouble
x0
{-# LINE 391 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
(\Ptr CairoPathDataT
hsc_ptr -> Ptr CairoPathDataT -> Int -> CDouble -> IO ()
forall b. Ptr b -> Int -> CDouble -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CairoPathDataT
hsc_ptr Int
8) Ptr CairoPathDataT
p3 CDouble
y0
{-# LINE 392 "src/Graphics/Cairo/Drawing/Paths/CairoPathT.hsc" #-}
Ptr CairoPathDataT -> IO (Ptr CairoPathDataT)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Ptr CairoPathDataT -> IO (Ptr CairoPathDataT))
-> Ptr CairoPathDataT -> IO (Ptr CairoPathDataT)
forall a b. (a -> b) -> a -> b
$ Ptr CairoPathDataT
p Ptr CairoPathDataT -> Int -> Ptr CairoPathDataT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
cairoPathDataTSize Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
4)
where p1 :: Ptr CairoPathDataT
p1 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
1; p2 :: Ptr CairoPathDataT
p2 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
2; p3 :: Ptr CairoPathDataT
p3 = Ptr CairoPathDataT -> CInt -> Ptr CairoPathDataT
nextByLength Ptr CairoPathDataT
p CInt
3