module PCD.Conversion where
import Control.Lens ((^.), (.~))
import Control.Monad (when)
import qualified Data.Text.IO as T
import qualified Data.Vector as B
import Foreign.Marshal.Alloc (allocaBytes)
import System.IO (IOMode(..), openFile, hClose, hPutBuf, withBinaryFile)
import PCD.Header
import qualified PCD.Internal.AsciiParsers as A
import PCD.Internal.StorableFieldType (pokeBinaryPoints)
asciiToBinary :: FilePath -> FilePath -> IO ()
asciiToBinary i o = do h <- openFile i ReadMode
(pcdh,_) <- readHeader h
print pcdh
when (pcdh^.format /= ASCII)
(error "Input PCD is already binary!")
let numBytes = totalBinarySize pcdh
putStrLn $ "Expecting to generate "++show numBytes++" bytes"
v <- A.readPointsDefault pcdh h
putStrLn $ "Parsed "++show (B.length v)++" ASCII points"
hClose h
T.writeFile o (writeHeader (format .~ Binary $ pcdh))
withBinaryFile o AppendMode $ \h' ->
allocaBytes numBytes $ \ptr ->
pokeBinaryPoints ptr v >>
hPutBuf h' ptr numBytes