#FEATURE by cg
class: TIFFReader
added: #readLong8s:signed:
changed:
#decodeTiffTag:numberType:length:
#fromStream:
#readLZWTiffImageData
--- a/TIFFReader.st Thu Aug 24 16:44:06 2017 +0200
+++ b/TIFFReader.st Thu Aug 24 22:46:23 2017 +0200
@@ -181,11 +181,23 @@
] ifFalse:[(numberType == 12 "TIFF_DOUBLE") ifTrue:[
"TIFF6: 64 bit IEEE double"
value := self readDoubles:length
+
+ "/ the following are preps for the propsed bigTiff format
+ ] ifFalse:[(numberType == 16 "TIFF_LONG8") ifTrue:[
+ "BIGTIFF: 8-byte unsigned integer"
+ value := self readLong8s:length signed:false
+ ] ifFalse:[(numberType == 17 "TIFF_SLONG8") ifTrue:[
+ "BIGTIFF: 8-byte signed integer"
+ value := self readLong8s:length signed:true
+ ] ifFalse:[(numberType == 18 "TIFF_IFD8") ifTrue:[
+ "BIGTIFF: 8-byte unsigned IFD offset"
+ value := self readLong8s:length signed:false
+
] ifFalse:[
offset := (inStream nextInt32MSB:(byteOrder ~~ #lsb))
- ]]]]]]]]]]].
+ ]]]]]]]]]]]]]].
- (tagType < 300) ifTrue:[
+ (tagType between:200 and:299) ifTrue:[
(tagType == 254) ifTrue:[
"/ New SubfileType
"/ REDUCEDIMAGE -> 1
@@ -334,9 +346,7 @@
fillOrder := nil
]
].
-
"/ 'fillorder ' print. fillOrder printNewline.
-
^ self
].
(tagType == 269) ifTrue:[
@@ -364,7 +374,6 @@
^ self
].
(tagType == 273) ifTrue:[
- "stripoffsets"
stripOffsets := valueArray.
"/ 'stripOffsets Array(' print. stripOffsets size print. ')' printNewline.
^ self
@@ -387,13 +396,11 @@
^ self
].
(tagType == 277) ifTrue:[
- "samplesPerPixel"
samplesPerPixel := value.
"/ 'samplesperpixel ' print. samplesPerPixel printNewline.
^ self
].
(tagType == 278) ifTrue:[
- "rowsperstrip"
rowsPerStrip := value.
"/ 'rowsperstrip ' print. rowsPerStrip printNewline.
^ self
@@ -407,31 +414,26 @@
^ self
].
(tagType == 280) ifTrue:[
- "MinSampleValue"
"/ 'minSampleValue ' print. value printNewline.
metaData at:#MinSampleValue put:value.
^ self
].
(tagType == 281) ifTrue:[
- "MaxSampleValue"
"/ 'maxSampleValue ' print. value printNewline.
metaData at:#MaxSampleValue put:value.
^ self
].
(tagType == 282) ifTrue:[
- "xResolution"
- "/ 'xres ' print. value printNewline.
+ "/ 'xResolution ' print. value printNewline.
metaData at:#ResolutionX put:value.
^ self
].
(tagType == 283) ifTrue:[
- "yResolution"
- "/ 'yres ' print. value printNewline.
+ "/ 'yResolution ' print. value printNewline.
metaData at:#ResolutionY put:value.
^ self
].
(tagType == 284) ifTrue:[
- "planarconfig"
(value == 1) ifTrue:[
planarConfiguration := 1
] ifFalse:[
@@ -445,41 +447,34 @@
^ self
].
(tagType == 285) ifTrue:[
- "pageName"
"/ 'pageName ' print. value printNewline.
metaData at:#PageName put:value.
^ self
].
(tagType == 286) ifTrue:[
- "xPosition"
- "/ 'xPos ' print. value printNewline.
+ "/ 'xPosition ' print. value printNewline.
metaData at:#PositionX put:value.
^ self
].
(tagType == 287) ifTrue:[
- "yPosition"
- "/ 'yPos ' print. value printNewline.
+ "/ 'yPosition ' print. value printNewline.
metaData at:#PositionY put:value.
^ self
].
(tagType == 288) ifTrue:[
- "freeOffsets"
"/ 'freeOffsets ' print. value printNewline.
^ self
].
(tagType == 289) ifTrue:[
- "freeByteCounts"
"/ 'freeByteCounts ' print. value printNewline.
^ self
].
(tagType == 290) ifTrue:[
- "grayResponceUnit"
"/ 'grayResponceUnit' print. value printNewline.
metaData at:#GrayResponceUnit put:value.
^ self
].
(tagType == 291) ifTrue:[
- "grayResponceCurve"
"/ 'grayResponceCurve' print. value printNewline.
metaData at:#GrayResponceCurve put:value.
^ self
@@ -522,22 +517,19 @@
^ self
].
(tagType == 297) ifTrue:[
- "pageNumber"
"/ 'pageNumber ' print. value printNewline.
metaData at:#PageNumber put:value.
^ self
].
].
-
- (tagType < 400) ifTrue:[
+
+ (tagType between:300 and:399) ifTrue:[
(tagType == 300) ifTrue:[
- "colorResponceUnit"
"/ 'colorResponceUnit' print. value printNewline.
metaData at:#ColorResponceUnit put:value.
^ self
].
(tagType == 301) ifTrue:[
- "colorResponceCurve"
"/ 'colorResponceCurve' print. value printNewline.
metaData at:#ColorResponceCurve put:value.
^ self
@@ -567,26 +559,21 @@
^ self
].
(tagType == 317) ifTrue:[
- "predictor"
+ "/ 'predictor ' print. predictor printNewline.
predictor := value.
- "/ 'predictor ' print. predictor printNewline.
^ self
].
(tagType == 318) ifTrue:[
- "whitePoint"
"/ 'whitePoint ' print. value printNewline.
metaData at:#WhitePoint put:value.
^ self
].
(tagType == 319) ifTrue:[
- "primaryChromatics"
"/ 'primaryChromatics ' print. value printNewline.
metaData at:#PrimaryChromatics put:value.
^ self
].
(tagType == 320) ifTrue:[
- "ColorMap"
-
"/ 'colorMap (size=' print. valueArray size print. ')' printNewline.
"
@@ -615,376 +602,353 @@
^ self
].
(tagType == 321) ifTrue:[
- "halftonehints"
"/ 'halftonehints' print. value printNewline.
metaData at:#HalftoneHints put:value.
^ self
].
(tagType == 322) ifTrue:[
- "tilewidth"
"/ 'tilewidth' print. value printNewline.
metaData at:#TileWidth put:value.
^ self
].
(tagType == 323) ifTrue:[
- "tilelength"
"/ 'tilelength' print. value printNewline.
metaData at:#TileLength put:value.
^ self
].
(tagType == 324) ifTrue:[
- "tileoffsets"
"/ 'tileoffsets' print. value printNewline.
metaData at:#TileOffsets put:value.
^ self
].
(tagType == 325) ifTrue:[
- "tilebytecounts"
"/ 'tilebytecounts' print. value printNewline.
metaData at:#TileByteCounts put:value.
^ self
].
(tagType == 326) ifTrue:[
- "BadFaxLines"
"/ 'badFaxLines' print. value printNewline.
^ self
].
(tagType == 327) ifTrue:[
"CleanFaxData"
- "/ 'cleanfaxdata' print. value printNewline.
- "/ (value == 0) ifTrue:[
- "/ 'no lines with incorrect pixel counts' printNewline
- "/ ] ifFalse:[
- "/ (value == 1) ifTrue:[
- "/ 'incorrect lines were regenerated' printNewline
- "/ ] ifFalse:[
- "/ (value == 2) ifTrue:[
- "/ 'incorrect lines were not regenerated' printNewline
- "/ ] ifFalse:[
- "/ 'cleanfaxdata invalid' printNewline
- "/ ]
- "/ ]
- "/ ].
+ "/ 'cleanfaxdata' print. value printNewline.
+ "/ (value == 0) ifTrue:[
+ "/ 'no lines with incorrect pixel counts' printNewline
+ "/ ] ifFalse:[
+ "/ (value == 1) ifTrue:[
+ "/ 'incorrect lines were regenerated' printNewline
+ "/ ] ifFalse:[
+ "/ (value == 2) ifTrue:[
+ "/ 'incorrect lines were not regenerated' printNewline
+ "/ ] ifFalse:[
+ "/ 'cleanfaxdata invalid' printNewline
+ "/ ]
+ "/ ]
+ "/ ].
^ self
].
(tagType == 328) ifTrue:[
- "consecutiveBadFaxLines"
-
- "/ 'consecutiveBadFaxLines' print. value printNewline.
-
+ "/ 'consecutiveBadFaxLines' print. value printNewline.
^ self
].
(tagType == 330) ifTrue:[
- "subifd"
-
- "/ 'subifd' print. value printNewline.
-
+ "/ 'subifd' print. value printNewline.
^ self
].
(tagType == 332) ifTrue:[
- "ink set"
-
- "/ 'ink set' print. value printNewline.
-
+ "/ 'ink set' print. value printNewline.
^ self
].
(tagType == 333) ifTrue:[
- "ink names"
-
"/ 'ink names' print. value printNewline.
metaData at:#IncNames put:value.
^ self
].
+ (tagType == 334) ifTrue:[
+ "/ 'numinks' print. value printNewline.
+ ^ self
+ ].
(tagType == 336) ifTrue:[
- "dot range"
-
"/ 'dot range' print. value printNewline.
^ self
].
(tagType == 337) ifTrue:[
- "target printer"
-
"/ 'target printer' print. value printNewline.
^ self
].
(tagType == 338) ifTrue:[
- "extrasamples"
-
"/ 'extrasamples' print. value printNewline.
-
^ self
].
(tagType == 339) ifTrue:[
- "sample format"
-
"/ 'sample format' print. value printNewline.
-
^ self
].
(tagType == 340) ifTrue:[
- "min sample value"
-
- "/ 'min sample value' print. value printNewline.
-
+ "/ 'min sample value' print. value printNewline.
^ self
].
(tagType == 341) ifTrue:[
- "max sample value"
-
- "/ 'max sample value' print. value printNewline.
-
+ "/ 'max sample value' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 342) ifTrue:[
+ "/ 'transfer range' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 343) ifTrue:[
+ "/ 'clip path' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 344) ifTrue:[
+ "/ 'xclip path units' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 345) ifTrue:[
+ "/ 'yclip path units' print. value printNewline.
^ self
].
(tagType == 347) ifTrue:[
- "jpegtables"
-
- "/ 'jpegtables' print. value printNewline.
-
+ "/ 'jpegtables' print. value printNewline.
^ self
].
].
- (tagType < 600) ifTrue:[
+ (tagType between:400 and:499) ifTrue:[
+ (tagType == 400) ifTrue:[
+ "/ 'GlobalParametersIFD' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 401) ifTrue:[
+ "/ 'ProfileType' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 402) ifTrue:[
+ "/ 'FaxProfile' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 403) ifTrue:[
+ "/ 'CodingMethods' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 404) ifTrue:[
+ "/ 'VersionYear' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 405) ifTrue:[
+ "/ 'ModeNumber' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 433) ifTrue:[
+ "/ 'Decode' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 434) ifTrue:[
+ "/ 'DefaultImageColor' print. value printNewline.
+ ^ self
+ ].
+ ].
+
+ (tagType between:500 and:599) ifTrue:[
"/ obsolete JPEG tags
(tagType == 512) ifTrue:[
- "jpeg proc"
-
- "/ 'jpeg proc' print. value printNewline.
-
+ "/ 'jpeg proc' print. value printNewline.
^ self
].
(tagType == 513) ifTrue:[
- "jpeg proc"
-
- "/ 'jpeg proc' print. value printNewline.
-
+ "/ 'jpeg proc' print. value printNewline.
^ self
].
(tagType == 514) ifTrue:[
- "jpeg ifByteCount"
-
- "/ 'jpeg ifByteCount' print. value printNewline.
-
+ "/ 'jpeg ifByteCount' print. value printNewline.
^ self
].
(tagType == 515) ifTrue:[
- "jpeg restartInterval"
-
- "/ 'jpeg restartInterval' print. value printNewline.
-
+ "/ 'jpeg restartInterval' print. value printNewline.
^ self
].
(tagType == 517) ifTrue:[
- "jpeg glossLessPredictors"
-
- "/ 'jpeg glossLessPredictors' print. value printNewline.
-
+ "/ 'jpeg glossLessPredictors' print. value printNewline.
^ self
].
(tagType == 518) ifTrue:[
- "jpeg pointTransform"
-
- "/ 'jpeg pointTransform' print. value printNewline.
-
+ "/ 'jpeg pointTransform' print. value printNewline.
^ self
].
(tagType == 519) ifTrue:[
- "jpeg qTables"
-
- "/ 'jpeg qTables' print. value printNewline.
-
+ "/ 'jpeg qTables' print. value printNewline.
^ self
].
(tagType == 520) ifTrue:[
- "jpeg dcTables"
-
- "/ 'jpeg dcTables' print. value printNewline.
-
- ^ self
+ "/ 'jpeg dcTables' print. value printNewline.
+ ^ self
].
(tagType == 521) ifTrue:[
- "jpeg acTables"
-
- "/ 'jpeg acTables' print. value printNewline.
-
+ "/ 'jpeg acTables' print. value printNewline.
^ self
].
(tagType == 529) ifTrue:[
- "ycbr coeff"
-
- "/ 'ycbr coeff' print. value printNewline.
-
+ "/ 'ycbr coeff' print. value printNewline.
^ self
].
(tagType == 530) ifTrue:[
- "ycbr subsampling"
-
- "/ 'ycbr subsampling' print. value printNewline.
-
+ "/ 'ycbr subsampling' print. value printNewline.
^ self
].
(tagType == 531) ifTrue:[
- "ycbr positioning"
-
- "/ 'ycbr positioning' print. value printNewline.
-
+ "/ 'ycbr positioning' print. value printNewline.
^ self
].
(tagType == 532) ifTrue:[
- "referenceBlackWhite"
-
- "/ 'ycbr positioning' print. value printNewline.
-
+ "/ 'referenceBlackWhite' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 559) ifTrue:[
+ "/ 'stripRowCounts' print. value printNewline.
^ self
].
].
+ (tagType between:700 and:799) ifTrue:[
+ (tagType == 700) ifTrue:[
+ "XMLPACKET"
+
+ "/ In TIFF files, the XML Packet containing XMP metadata is pointed to
+ "/ by an entry in the Image File Directory (IFD). That entry has a Tag
+ "/ value of 700, as shown in Table 1.1, "TIFF IFD Directory Entry for
+ "/ XML Packets
+
+ "/ 'XMLPACKET' print. value printNewline.
+ ^ self
+ ].
+ ].
+
(tagType > 32000) ifTrue:[
+ (tagType == 32781) ifTrue:[
+ "/'imageid' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 32932) ifTrue:[
+ "/'wang annotation' print. value printNewline.
+ ^ self
+ ].
"/ Private Island graphics tags
(tagType == 32953) ifTrue:[
- "ref points"
-
- "/ 'ref points' print. value printNewline.
-
+ "/'ref points' print. value printNewline.
^ self
].
(tagType == 32954) ifTrue:[
- "regionTagPoint"
-
- "/ 'regionTagPoint' print. value printNewline.
-
+ "/ 'regionTagPoint' print. value printNewline.
^ self
].
(tagType == 32955) ifTrue:[
- "regionWarpCorners"
-
- "/ 'regionWarpCorners' print. value printNewline.
-
+ "/ 'regionWarpCorners' print. value printNewline.
^ self
].
(tagType == 32956) ifTrue:[
- "regionAffine"
-
- "/ 'regionAffine' print. value printNewline.
-
+ "/ 'regionAffine' print. value printNewline.
^ self
].
"/ Private SGI tags
-
(tagType == 32995) ifTrue:[
- "matteing"
-
- "/ 'matteing' print. value printNewline.
-
+ "/ 'matteing' print. value printNewline.
^ self
].
(tagType == 32996) ifTrue:[
- "datatype"
-
- "/ 'datatype' print. value printNewline.
-
+ "/ 'datatype' print. value printNewline.
^ self
].
(tagType == 32997) ifTrue:[
- "imagedepth"
-
- "/ 'imagedepth' print. value printNewline.
-
+ "/ 'imagedepth' print. value printNewline.
^ self
].
(tagType == 32998) ifTrue:[
- "tiledepth"
-
- "/ 'tiledepth' print. value printNewline.
-
+ "/ 'tiledepth' print. value printNewline.
^ self
].
"/ Private Pixar tags
-
(tagType == 33300) ifTrue:[
- "image full width"
-
- "/ 'image full width' print. value printNewline.
-
+ "/ 'image full width' print. value printNewline.
^ self
].
(tagType == 33301) ifTrue:[
- "image full length"
-
- "/ 'image full length' print. value printNewline.
-
+ "/ 'image full length' print. value printNewline.
^ self
].
"/ Private Eastman Kodak tags
-
(tagType == 33405) ifTrue:[
- "write serial number"
-
- "/ 'write serial number' print. value printNewline.
-
+ "/ 'write serial number' print. value printNewline.
^ self
].
"/ unknown
+ (tagType == 33432) ifTrue:[
+ "/ 'copyright' print. value printNewline.
+ ^ self
+ ].
- (tagType == 33432) ifTrue:[
- "copyright"
+ (tagType == 33550) ifTrue:[
+ "/ 'geotiff modelpixelscaletag' print. value printNewline.
+ ^ self
+ ].
- "/ 'copyright' print. value printNewline.
-
+ (tagType == 33723) ifTrue:[
+ "/ 'RICHTIFFIPTC' print. value printNewline.
^ self
].
"/ Private Texas instruments
-
(tagType == 34232) ifTrue:[
- "sequence frame count"
-
- "/ 'sequence frame count' print. value printNewline.
-
+ "/ 'sequence frame count' print. value printNewline.
^ self
].
"/ Private Pixel magic
-
(tagType == 34232) ifTrue:[
- "jbig options"
-
- "/ 'jbig options' print. value printNewline.
-
+ "/ 'jbig options' print. value printNewline.
^ self
].
+ "/ private Photoshop
+ (tagType == 34377) ifTrue:[
+ "/ 'photoshop RICHTIFFIPTC' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 34665) ifTrue:[
+ "/ 'EXIFIFD' print. value printNewline.
+ ^ self
+ ].
+ (tagType == 34675) ifTrue:[
+ "/ 'ICCPROFILE' print. value printNewline.
+ ^ self
+ ].
+
+ (tagType == 34732) ifTrue:[
+ "/ 'ImageLayer' print. value printNewline.
+ ^ self
+ ].
+
"/ More Private SGI
-
(tagType == 34908) ifTrue:[
- "fax recv params"
-
- "/ 'fax recv params' print. value printNewline.
-
+ "/ 'fax recv params' print. value printNewline.
^ self
].
(tagType == 34909) ifTrue:[
- "fax subaddress"
-
- "/ 'fax subaddress' print. value printNewline.
-
+ "/ 'fax subaddress' print. value printNewline.
^ self
].
(tagType == 34910) ifTrue:[
- "fax recv time"
-
- "/ 'fax recv time' print. value printNewline.
-
+ "/ 'fax recv time' print. value printNewline.
^ self
].
].
@@ -996,8 +960,8 @@
"/
'TIFFReader [warning]: unknown tag type ' errorPrint. tagType errorPrintCR
- "Modified: / 11-04-1997 / 01:11:17 / cg"
"Modified (format): / 23-05-2017 / 16:12:58 / mawalch"
+ "Modified: / 24-08-2017 / 22:02:33 / cg"
! !
!TIFFReader methodsFor:'private-data reading'!
@@ -1122,11 +1086,9 @@
nPlanes := samplesPerPixel.
- (nPlanes == 3) ifTrue:[
- (((bitsPerSample at:1) ~~ 8)
- or:[((bitsPerSample at:2) ~~ 8)
- or:[((bitsPerSample at:3) ~~ 8)]]) ifTrue:[
- ^ self fileFormatError:'only 8/8/8 bit/sample are supported'.
+ (nPlanes >= 3) ifTrue:[
+ (bitsPerSample conform:[:each | each == 8]) ifFalse:[
+ ^ self fileFormatError:'only 8/8/8(/8) bits/sample are supported'.
].
bytesPerRow := width * samplesPerPixel.
] ifFalse:[
@@ -1170,12 +1132,10 @@
compressedStrip := ByteArray uninitializedNew:nBytes.
prevSize := nBytes
].
- inStream nextBytes:nBytes
- into:compressedStrip.
- self class decompressLZWFrom:compressedStrip
- count:nBytes
- into:data
- startingAt:offset.
+ inStream nextBytes:nBytes into:compressedStrip.
+ self class
+ decompressLZWFrom:compressedStrip count:nBytes
+ into:data startingAt:offset.
offset := offset + bytesPerStrip.
row := row + rowsPerStrip
].
@@ -1184,7 +1144,8 @@
self class decodeDelta:3 in:data width:width height:height
]
- "Modified: / 12.8.1998 / 13:58:13 / cg"
+ "Modified: / 24-08-2017 / 20:58:59 / cg"
+ "Modified (format): / 24-08-2017 / 22:16:41 / cg"
!
readNeXTJPEGTiffImageData
@@ -1593,6 +1554,34 @@
^ values
!
+readLong8s:nLongs signed:isSigned
+ "read nLongs signed or unsigned long8 numbers (64bit) and return them in an array"
+
+ |oldPos offset values val msb
+ n "{ Class: SmallInteger }" |
+
+ n := nLongs.
+
+ msb := byteOrder ~~ #lsb.
+ values := Array basicNew:n.
+ (n == 1) ifTrue:[
+ val := isSigned ifTrue:[inStream nextInt64MSB:msb] ifFalse:[inStream nextUnsignedInt64MSB:msb].
+ values at:1 put:val.
+ ] ifFalse:[
+ offset := inStream nextInt64MSB:msb.
+ oldPos := inStream position.
+ inStream position:offset.
+ 1 to:n do:[:index |
+ val := isSigned ifTrue:[inStream nextInt64MSB:msb] ifFalse:[inStream nextUnsignedInt64MSB:msb].
+ values at:index put:val
+ ].
+ inStream position:oldPos
+ ].
+ ^ values
+
+ "Created: / 24-08-2017 / 22:01:26 / cg"
+!
+
readLongs:nLongs signed:isSigned
"read nLongs signed or unsigned long numbers (32bit) and return them in an array"
@@ -2071,9 +2060,28 @@
]
].
- version := self readShort.
- (version ~~ 42) ifTrue:[
- ^ self fileFormatError:'version of tiff-file not supported'.
+ version := aStream nextUnsignedInt16MSB:msb.
+ (version == 42) ifTrue:[
+ offset := aStream nextUnsignedInt32MSB:msb.
+ aStream position:offset.
+ ] ifFalse:[
+ (version == 43) ifTrue:[
+ |byteSizeOfOffsets always0|
+
+ "/ 43 is the proposed bigtiff format
+ byteSizeOfOffsets := aStream nextUnsignedInt16MSB:msb.
+ byteSizeOfOffsets == 8 ifFalse:[
+ ^ self fileFormatError:'version of bigtiff-file not supported'.
+ ].
+ always0 := aStream nextUnsignedInt16MSB:msb.
+ always0 == 8 ifFalse:[
+ ^ self fileFormatError:'version of bigtiff-file not supported'.
+ ].
+ offset := aStream nextUnsignedInt64MSB:msb.
+ aStream position:offset.
+ ] ifFalse:[
+ ^ self fileFormatError:'version of tiff-file not supported'.
+ ].
].
"setup default values"
@@ -2093,18 +2101,27 @@
predictor := 1.
orientation := nil.
- offset := aStream nextInt32MSB:msb.
- aStream position:offset.
+ (version == 42) ifTrue:[
+ numberOfTags := aStream nextUnsignedInt16MSB:msb.
- numberOfTags := self readShort.
- 1 to:numberOfTags do:[:index |
- tagType := self readShort.
- numberType := self readShort.
- length := aStream nextInt32MSB:msb.
- self decodeTiffTag:tagType numberType:numberType length:length
+ 1 to:numberOfTags do:[:index |
+ tagType := aStream nextUnsignedInt16MSB:msb.
+ numberType := aStream nextUnsignedInt16MSB:msb.
+ length := aStream nextInt32MSB:msb.
+ self decodeTiffTag:tagType numberType:numberType length:length
+ ].
+ offset := aStream nextInt32MSB:msb.
+ ] ifFalse:[
+ numberOfTags := aStream nextUnsignedInt64MSB:msb.
+
+ 1 to:numberOfTags do:[:index |
+ tagType := aStream nextUnsignedInt16MSB:msb.
+ numberType := aStream nextUnsignedInt16MSB:msb.
+ length := aStream nextInt64MSB:msb.
+ self decodeTiffTag:tagType numberType:numberType length:length
+ ].
+ offset := aStream nextInt32MSB:msb.
].
-
- offset := aStream nextInt32MSB:msb.
(offset ~~ 0) ifTrue:[
'TIFFReader [info]: more tags ignored' infoPrintCR
].
@@ -2174,8 +2191,7 @@
^ result
- "Modified: / 03-02-1998 / 18:02:29 / cg"
- "Modified (comment): / 17-02-2017 / 08:52:02 / cg"
+ "Modified: / 24-08-2017 / 22:07:23 / cg"
! !
!TIFFReader methodsFor:'writing'!