module Geometry.Earcut where import qualified Data.Vector.Storable as S import qualified Data.Vector as V -- import Data.Vector.Storable (Vector) import Foreign import Foreign.C.Types import System.IO.Unsafe -- foreign import ccall tester :: IO Int foreign import ccall "earcut" c_earcut :: Ptr Double -> Int -> Ptr (Ptr Word32) -> Ptr CULong -> IO () earcut :: [(Double, Double)] -> V.Vector (Int,Int,Int) earcut p = let out = earcut' (S.fromList $ concat [ [x,y] | (x,y) <- p ]) in V.generate (S.length out `div` 3) $ \i -> (fromIntegral $ out S.! (i*3+0) ,fromIntegral $ out S.! (i*3+1) ,fromIntegral $ out S.! (i*3+2)) earcut' :: S.Vector Double -> S.Vector Word32 earcut' polygon = unsafePerformIO $ S.unsafeWith polygon $ \polyPtr -> alloca $ \outPtr -> alloca $ \outLen -> do c_earcut polyPtr (S.length polygon) outPtr outLen len <- peek outLen out <- newForeignPtr_ =<< peek outPtr return $ S.unsafeFromForeignPtr0 out (fromIntegral len)