#FEATURE by cg
authorClaus Gittinger <cg@exept.de>
Thu, 24 Aug 2017 22:46:23 +0200
changeset 3974 b4f7c8442dd8
parent 3973 440d7bd84437
child 3975 1315fd14851b
#FEATURE by cg class: TIFFReader added: #readLong8s:signed: changed: #decodeTiffTag:numberType:length: #fromStream: #readLZWTiffImageData
TIFFReader.st
--- 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'!