pcd-loader-0.3.0.0: src/PCD/Conversion.hs
-- |Facility to convert an ASCII PCD file to a Binary one.
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 inputFile outputFile@ converts a PCD file from
-- ASCII to Binary.
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