dicom 0.2.0.0 → 0.3.0.0
raw patch · 3 files changed
+31/−6 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.DICOM.Object: FragmentContent :: [ByteString] -> ElementContent
Files
- dicom.cabal +1/−1
- src/Data/DICOM/Object.hs +27/−5
- src/Data/DICOM/Tag.hs +3/−0
dicom.cabal view
@@ -1,5 +1,5 @@ name: dicom-version: 0.2.0.0+version: 0.3.0.0 synopsis: A library for reading and writing DICOM files in the Explicit VR Little Endian transfer syntax. license: GPL-3 license-file: LICENSE
src/Data/DICOM/Object.hs view
@@ -95,8 +95,14 @@ data ElementContent = BytesContent B.ByteString- | SequenceContent Sequence deriving (Show, Eq)+ | FragmentContent [B.ByteString]+ | SequenceContent Sequence deriving Eq +instance Show ElementContent where+ showsPrec p (BytesContent _) = showParen (p > 10) $ showString "BytesContent {..}"+ showsPrec p (FragmentContent f) = showParen (p > 10) $ showString "FragmentContent { length = " . shows (length f) . showString " }"+ showsPrec p (SequenceContent s) = showParen (p > 10) $ showString "SequenceContent " . showsPrec 11 s+ data Element = Element { elementTag :: Tag , elementVL :: VL@@ -126,7 +132,10 @@ content <- case _vr of SQ -> SequenceContent <$> readSequence _vl _ -> case _vl of- UndefinedValueLength -> failWithOffset "Undefined VL not implemented"+ UndefinedValueLength ->+ case _tag of+ PixelData -> FragmentContent <$> readFragmentData+ _ -> failWithOffset "Undefined VL not implemented" _ -> do bytes <- getByteString $ fromIntegral $ runVL _vl return $ BytesContent bytes@@ -141,6 +150,7 @@ case elementContent el of SequenceContent s -> writeSequence (elementVL el) s BytesContent bs -> putByteString bs+ FragmentContent _ -> fail "Fragment content is not supported for writing." readSequence :: VL -> Get Sequence readSequence UndefinedValueLength = do@@ -159,6 +169,19 @@ putWord32le 0 _ -> return () +readFragmentData :: Get [B.ByteString]+readFragmentData = do+ els <- untilG (isSequenceDelimitationItem <$> get) $ do+ t <- get+ case t of+ Item -> do+ itemLength <- getWord32le+ getByteString $ fromIntegral $ itemLength+ _ -> failWithOffset "Expected Item tag"+ SequenceDelimitationItem <- get+ skip 4+ return els+ instance Binary SequenceItem where get = do t <- get@@ -174,7 +197,7 @@ _ -> do els <- untilByteCount (fromIntegral itemLength) get return $ SequenceItem itemLength els- _ -> failWithOffset "Unexpected tag"+ _ -> failWithOffset "Expected Item tag" put si = do put Item putWord32le $ sequenceItemLength si@@ -201,7 +224,7 @@ start <- bytesRead flip untilG a $ do end <- bytesRead- return (end - start < count)+ return (end - start >= count) isVLReserved :: VR -> Bool isVLReserved OB = True@@ -355,4 +378,3 @@ object :: [Element] -> Object object = Object . sortBy (compare `on` elementTag)-
src/Data/DICOM/Tag.hs view
@@ -23,6 +23,7 @@ , pattern Item , pattern ItemDelimitationItem , pattern SequenceDelimitationItem+ , pattern PixelData , tag ) where@@ -66,6 +67,8 @@ pattern Item = Tag SequenceGroup (TagElement 0xE000) pattern ItemDelimitationItem = Tag SequenceGroup (TagElement 0xE00D) pattern SequenceDelimitationItem = Tag SequenceGroup (TagElement 0xE0DD)++pattern PixelData = Tag (TagGroup 0x7FE0) (TagElement 0x0010) -- Smart constructors