bmp 1.1.0.0 → 1.1.1.0
raw patch · 4 files changed
+53/−51 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- Codec/BMP.hs +36/−34
- Codec/BMP/BitmapInfoV3.hs +11/−11
- Codec/BMP/FileHeader.hs +5/−5
- bmp.cabal +1/−1
Codec/BMP.hs view
@@ -69,14 +69,19 @@ -- If there is anything wrong this gives an `Error` instead. hGetBMP :: Handle -> IO (Either Error BMP) hGetBMP h- = do -- load the file header.- buf <- BSL.hGet h sizeOfFileHeader- if (fromIntegral $ BSL.length buf) /= sizeOfFileHeader- then return $ Left ErrorReadOfFileHeaderFailed- else hGetBMP2 h (decode buf)+ = do -- lazily load the whole file+ buf <- BSL.hGetContents h++ -- split off the file header+ let (bufFileHeader, bufRest) + = BSL.splitAt (fromIntegral sizeOfFileHeader) buf + if (fromIntegral $ BSL.length bufFileHeader) /= sizeOfFileHeader+ then return $ Left ErrorReadOfFileHeaderFailed+ else hGetBMP2 bufRest (decode bufFileHeader) -hGetBMP2 h fileHeader+ +hGetBMP2 buf fileHeader -- Check the magic before doing anything else. -- If the specified file is not a BMP file then we'd prefer to get -- this error than a `ReadOfImageHeaderFailed`.@@ -85,62 +90,59 @@ | otherwise = do -- Next comes the image header. - -- The first word tells us which header format it is.- bufSize <- BSL.hGet h 4- let sizeHeader = runGet getWord32le bufSize+ -- The first word tells us how long it is.+ let sizeHeader = runGet getWord32le buf - -- Load the rest of the image header- let sizeRest = fromIntegral sizeHeader - 4- bufRest <- BSL.hGet h sizeRest- if (fromIntegral $ BSL.length bufRest) /= sizeRest+ -- split off the image header+ let (bufImageHeader, bufRest)+ = BSL.splitAt (fromIntegral sizeHeader) buf++ if (fromIntegral $ BSL.length bufImageHeader) /= sizeHeader then return $ Left ErrorReadOfImageHeaderFailed- else do- let bufHeader = BSL.append bufSize bufRest- hGetBMP3 h fileHeader sizeHeader bufHeader- + else hGetBMP3 fileHeader bufImageHeader bufRest+ -hGetBMP3 h fileHeader sizeHeader bufHeader- | sizeHeader == 40 - = do let info = decode bufHeader+hGetBMP3 fileHeader bufImageHeader bufRest+ | BSL.length bufImageHeader == 40 + = do let info = decode bufImageHeader case checkBitmapInfoV3 info of Just err -> return $ Left err- Nothing -> hGetBMP4 h fileHeader (InfoV3 info) + Nothing -> hGetBMP4 fileHeader (InfoV3 info) bufRest (fromIntegral $ dib3ImageSize info) - | sizeHeader == 108- = do let info = decode bufHeader+ | BSL.length bufImageHeader == 108+ = do let info = decode bufImageHeader case checkBitmapInfoV4 info of Just err -> return $ Left err- Nothing -> hGetBMP4 h fileHeader (InfoV4 info) + Nothing -> hGetBMP4 fileHeader (InfoV4 info) bufRest (fromIntegral $ dib3ImageSize $ dib4InfoV3 info) - | sizeHeader == 124- = do let info = decode bufHeader+ | BSL.length bufImageHeader == 124+ = do let info = decode bufImageHeader case checkBitmapInfoV5 info of Just err -> return $ Left err- Nothing -> hGetBMP4 h fileHeader (InfoV5 info) + Nothing -> hGetBMP4 fileHeader (InfoV5 info) bufRest (fromIntegral $ dib3ImageSize $ dib4InfoV3 $ dib5InfoV4 info) | otherwise- = return $ Left $ ErrorUnhandledBitmapHeaderSize (fromIntegral sizeHeader)+ = return + $ Left + $ ErrorUnhandledBitmapHeaderSize (fromIntegral $ BSL.length bufImageHeader) -hGetBMP4 h fileHeader imageHeader sizeImage- = do -- load the image data.- imageData <- BS.hGet h sizeImage- - if (fromIntegral $ BS.length imageData) /= sizeImage+hGetBMP4 fileHeader imageHeader bufImage (sizeImage :: Int)+ = if (fromIntegral $ BSL.length bufImage) /= sizeImage then return $ Left ErrorReadOfImageDataFailed else return $ Right $ BMP { bmpFileHeader = fileHeader , bmpBitmapInfo = imageHeader- , bmpRawImageData = imageData }+ , bmpRawImageData = BS.pack $ BSL.unpack bufImage } -- Writing ----------------------------------------------------------------------------------------
Codec/BMP/BitmapInfoV3.hs view
@@ -14,37 +14,37 @@ -- | Device Independent Bitmap (DIB) header for Windows V3. data BitmapInfoV3 = BitmapInfoV3 - { -- | Size of the image header, in bytes.+ { -- | (+0) Size of the image header, in bytes. dib3Size :: Word32 - -- | Width of the image, in pixels.+ -- | (+4) Width of the image, in pixels. , dib3Width :: Word32 - -- | Height of the image, in pixels.+ -- | (+8) Height of the image, in pixels. , dib3Height :: Word32 - -- | Number of color planes.+ -- | (+12) Number of color planes. , dib3Planes :: Word16 - -- | Number of bits per pixel.+ -- | (+14) Number of bits per pixel. , dib3BitCount :: Word16 - -- | Image compression mode.+ -- | (+16) Image compression mode. , dib3Compression :: Compression - -- | Size of raw image data.+ -- | (+20) Size of raw image data. , dib3ImageSize :: Word32 - -- | Prefered resolution in pixels per meter, along the X axis.+ -- | (+24) Prefered resolution in pixels per meter, along the X axis. , dib3PelsPerMeterX :: Word32 - -- | Prefered resolution in pixels per meter, along the Y axis.+ -- | (+28) Prefered resolution in pixels per meter, along the Y axis. , dib3PelsPerMeterY :: Word32 - -- | Number of color entries that are used.+ -- | (+32) Number of color entries that are used. , dib3ColorsUsed :: Word32 - -- | Number of significant colors.+ -- | (+36) Number of significant colors. , dib3ColorsImportant :: Word32 } deriving (Show)
Codec/BMP/FileHeader.hs view
@@ -15,19 +15,19 @@ -- | BMP file header. data FileHeader = FileHeader - { -- | Magic numbers 0x42 0x4d+ { -- | (+0) Magic numbers 0x42 0x4d fileHeaderType :: Word16 - -- | Size of the file, in bytes.+ -- | (+2) Size of the file, in bytes. , fileHeaderFileSize :: Word32 - -- | Reserved, must be zero.+ -- | (+6) Reserved, must be zero. , fileHeaderReserved1 :: Word16 - -- | Reserved, must be zero.+ -- | (+8) Reserved, must be zero. , fileHeaderReserved2 :: Word16 - -- | Offset in bytes to the start of the pixel data.+ -- | (+10) Offset in bytes to the start of the pixel data. , fileHeaderOffset :: Word32 } deriving (Show)
bmp.cabal view
@@ -1,5 +1,5 @@ Name: bmp-Version: 1.1.0.0+Version: 1.1.1.0 License: MIT License-file: LICENSE Author: Ben Lippmeier