# HG changeset patch # User Claus Gittinger # Date 860712123 -7200 # Node ID 76ffe180cff8507753a29f03cbc945e82330523a # Parent 7df33af3beaab5c74b09a870bf6baef3b0325bdb checkin from browser diff -r 7df33af3beaa -r 76ffe180cff8 TIFFRdr.st --- a/TIFFRdr.st Sun Apr 06 15:03:43 1997 +0200 +++ b/TIFFRdr.st Fri Apr 11 00:42:03 1997 +0200 @@ -127,563 +127,865 @@ "/ 'tiffTag: ' print. tagType printCR. - (numberType == 3) ifTrue:[ - "short" + (numberType == 3 "TIFF_SHORT") ifTrue:[ + "16 bit ushort" valueArray := self readShorts:length. value := valueArray at:1 + ] ifFalse:[(numberType == 4 "TIFF_LONG") ifTrue:[ + "32 bit uinteger" + valueArray := self readLongs:length. + value := valueArray at:1 + ] ifFalse:[(numberType == 2 "TIFF_ASCII") ifTrue:[ + "ascii characters" + value := self readChars:length + ] ifFalse:[(numberType == 5 "TIFF_RATIONAL") ifTrue:[ + "64 bit ufraction" + valueArray := self readFracts:length. + value := valueArray at:1 ] ifFalse:[ - (numberType == 4) ifTrue:[ - "integer" - valueArray := self readLongs:length. - value := valueArray at:1 - ] ifFalse:[ - (numberType == 2) ifTrue:[ - "character" - value := self readChars:length - ] ifFalse:[ - (numberType == 5) ifTrue:[ - "fraction" - valueArray := self readFracts:length. - value := valueArray at:1 - ] ifFalse:[ - offset := (inStream nextLongMSB:(byteOrder ~~ #lsb)) - ] - ] - ] - ]. + offset := (inStream nextLongMSB:(byteOrder ~~ #lsb)) + ]]]]. + + (tagType < 300) ifTrue:[ + (tagType == 254) ifTrue:[ + "/ New SubfileType + "/ REDUCEDIMAGE -> 1 + "/ PAGE -> 2 + "/ MASK -> 4 + "newSubFileType := value." - (tagType == 254) ifTrue:[ - "NewSubfileType" - "newSubFileType := value." + "/ 'newSubfiletype ' print. value printNewline. + + ^ self + ]. + (tagType == 255) ifTrue:[ + "/ Old SubfileType + "/ IMAGE -> 1 + "/ REDUCEDIMAGE -> 2 + "/ PAGE -> 3 + subFileType := value. + + "/ 'subfiletype ' print. value printNewline. -"/ 'newSubfiletype ' print. value printNewline. + ^ self + ]. + (tagType == 256) ifTrue:[ + "ImageWidth" + width := value. - ^ self - ]. - (tagType == 255) ifTrue:[ - "SubfileType" - subFileType := value. - -"/ 'subfiletype ' print. value printNewline. + "/ 'width ' print. width printNewline. - ^ self - ]. - (tagType == 256) ifTrue:[ - "ImageWidth" - width := value. + ^ self + ]. + (tagType == 257) ifTrue:[ + "ImageHeight" + height := value. + + "/ 'height ' print. height printNewline. -"/ 'width ' print. width printNewline. + ^ self + ]. + (tagType == 258) ifTrue:[ + "bitspersample" + bitsPerSample := valueArray. - ^ self - ]. - (tagType == 257) ifTrue:[ - "ImageHeight" - height := value. + "/ 'bitspersample ' print. bitsPerSample printNewline. -"/ 'height ' print. height printNewline. - - ^ self - ]. - (tagType == 258) ifTrue:[ - "bitspersample" - bitsPerSample := valueArray. - -"/ 'bitspersample ' print. bitsPerSample printNewline. + ^ self + ]. + (tagType == 259) ifTrue:[ + "/ compression + "/ NONE -> 1 + "/ CCITTRLE -> 2 + "/ CCITTFAX3 -> 3 + "/ CCITTFAX4 -> 4 + "/ LZW -> 5 + "/ OJPEG -> 6 + "/ JPEG -> 7 + "/ NEXT -> 32766 + "/ CCITTRLEW -> 32771 + "/ PACKBITS -> 32809 + "/ PIXARFILM -> 32908 + "/ PIXARLOG -> 32909 + "/ DEFLATE -> 32946 + "/ DCS -> 32947 + "/ JBIG -> 34661 + + compression := value. - ^ self - ]. - (tagType == 259) ifTrue:[ - "compression" - compression := value. - -"/ 'compression ' print. compression printNewline. - - ^ self - ]. - (tagType == 262) ifTrue:[ - "photometric" + "/ 'compression ' print. compression printNewline. - (value == 0) ifTrue:[ - photometric := #whiteIs0 - ] ifFalse:[ - (value == 1) ifTrue:[ - photometric := #blackIs0 - ] ifFalse:[ - (value == 2) ifTrue:[ - photometric := #rgb + ^ self + ]. + (tagType == 262) ifTrue:[ + "photometric" + + (value == 0) ifTrue:[ + photometric := #whiteIs0 ] ifFalse:[ - (value == 3) ifTrue:[ - photometric := #palette + (value == 1) ifTrue:[ + photometric := #blackIs0 ] ifFalse:[ - (value == 4) ifTrue:[ - photometric := #transparency + (value == 2) ifTrue:[ + photometric := #rgb ] ifFalse:[ - (value == 5) ifTrue:[ - photometric := #separated "/ color separations + (value == 3) ifTrue:[ + photometric := #palette ] ifFalse:[ - (value == 6) ifTrue:[ - photometric := #ycbr "/ CCIR 601 + (value == 4) ifTrue:[ + photometric := #transparency ] ifFalse:[ - (value == 8) ifTrue:[ - photometric := #cielab "/ 1976 CIE L*a*b* + (value == 5) ifTrue:[ + photometric := #separated "/ color separations ] ifFalse:[ - photometric := nil + (value == 6) ifTrue:[ + photometric := #ycbr "/ CCIR 601 + ] ifFalse:[ + (value == 8) ifTrue:[ + photometric := #cielab "/ 1976 CIE L*a*b* + ] ifFalse:[ + photometric := nil + ] + ] ] ] ] ] ] - ] - ] + ]. + + "/ 'photometric ' print. photometric printNewline. + + ^ self ]. + (tagType == 263) ifTrue:[ + "/ Treshholding + "/ BILEVEL -> 1 + "/ HALFTONE -> 2 + "/ ERRORDIFFUSE -> 3 -"/ 'photometric ' print. photometric printNewline. + "threshholding := value." + + "/ 'treshholding ' print. value printNewline. + + ^ self + ]. + (tagType == 264) ifTrue:[ + "CellWidth" + "cellWidth:= value." + + "/ 'cellWidth ' print. value printNewline. + + ^ self + ]. + (tagType == 265) ifTrue:[ + "CellLength" + "cellLength:= value." + + "/ 'cellLength ' print. value printNewline. - ^ self - ]. - (tagType == 263) ifTrue:[ - "Treshholding" - "threshholding := value." + ^ self + ]. + (tagType == 266) ifTrue:[ + "fillOrder" + (value == 1) ifTrue:[ + fillOrder := #msb + ] ifFalse:[ + (value == 2) ifTrue:[ + fillOrder := #lsb + ] ifFalse:[ + fillOrder := nil + ] + ]. + + "/ 'fillorder ' print. fillOrder printNewline. -"/ 'treshholding ' print. value printNewline. + ^ self + ]. + (tagType == 269) ifTrue:[ + "documentName - info only" + + "/ 'documentName ' print. value printNewline. + + ^ self + ]. + (tagType == 270) ifTrue:[ + "imageDescription - info only" + + "/ 'imageDescription ' print. value printNewline. + + ^ self + ]. + (tagType == 271) ifTrue:[ + "make - info only" - ^ self - ]. - (tagType == 264) ifTrue:[ - "CellWidth" - "cellWidth:= value." + "/ 'make ' print. value printNewline. + + ^ self + ]. + (tagType == 272) ifTrue:[ + "model - info only" + + "/ 'model ' print. value printNewline. + + ^ self + ]. + (tagType == 273) ifTrue:[ + "stripoffsets" + stripOffsets := valueArray. -"/ 'cellWidth ' print. value printNewline. + "/ 'stripOffsets Array(' print. stripOffsets size print. ')' printNewline. + + ^ self + ]. + (tagType == 274) ifTrue:[ + "Orientation" + + orientation := + #( nil "/ 1 normal (topLeft) + unsupported "/ 2 horizontal flip + unsupported "/ 3 horizontal & vertical flip + vFlip "/ 4 vertical flip + unsupported "/ 5 rot 90' counter clock-wise + unsupported "/ 6 rot 90' clock-wise + unsupported "/ 7 rot 90' & flip + unsupported "/ 8 rot 90' ccw & flip + ) at:value ifAbsent:#unsupported. - ^ self - ]. - (tagType == 265) ifTrue:[ - "CellLength" - "cellLength:= value." + "/ 'orientation ' print. value printNewline. + + ^ self + ]. + (tagType == 277) ifTrue:[ + "samplesPerPixel" + samplesPerPixel := value. + + "/ 'samplesperpixel ' print. samplesPerPixel printNewline. + + ^ self + ]. + (tagType == 278) ifTrue:[ + "rowsperstrip" + rowsPerStrip := value. + + "/ 'rowsperstrip ' print. rowsPerStrip printNewline. -"/ 'cellLength ' print. value printNewline. + ^ self + ]. + (tagType == 279) ifTrue:[ + "stripbytecount" + stripByteCounts := valueArray. + + "/ 'stripByteCounts Array(' print. + "/ stripByteCounts size print. + "/ ')' printNewline. + + ^ self + ]. + (tagType == 280) ifTrue:[ + "MinSampleValue" + "minSampleValue:= value." + + "/ 'minSampleValue ' print. value printNewline. - ^ self - ]. - (tagType == 266) ifTrue:[ - "fillOrder" - (value == 1) ifTrue:[ - fillOrder := #msb - ] ifFalse:[ - (value == 2) ifTrue:[ - fillOrder := #lsb - ] ifFalse:[ - fillOrder := nil - ] + ^ self + ]. + (tagType == 281) ifTrue:[ + "MaxSampleValue" + "maxSampleValue:= value." + + "/ 'maxSampleValue ' print. value printNewline. + + ^ self + ]. + (tagType == 282) ifTrue:[ + "xResolution" + + "/ 'xres ' print. value printNewline. + + ^ self + ]. + (tagType == 283) ifTrue:[ + "yResolution" + + "/ 'yres ' print. value printNewline. + + ^ self ]. + (tagType == 284) ifTrue:[ + "planarconfig" + (value == 1) ifTrue:[ + planarConfiguration := 1 + ] ifFalse:[ + (value == 2) ifTrue:[ + planarConfiguration := 2 + ] ifFalse:[ + planarConfiguration := nil + ] + ]. -"/ 'fillorder ' print. fillOrder printNewline. + "/ 'planarconfig ' print. planarConfiguration printNewline. + + ^ self + ]. + (tagType == 285) ifTrue:[ + "pageName" + + "/ 'pageName ' print. value printNewline. - ^ self - ]. - (tagType == 269) ifTrue:[ - "documentName - info only" + ^ self + ]. + (tagType == 286) ifTrue:[ + "xPosition" + + "/ 'xPos ' print. value printNewline. -"/ 'documentName ' print. value printNewline. + ^ self + ]. + (tagType == 287) ifTrue:[ + "yPosition" + + "/ 'yPos ' print. value printNewline. + + ^ self + ]. + (tagType == 288) ifTrue:[ + "freeOffsets" + + "/ 'freeOffsets ' print. value printNewline. - ^ self - ]. - (tagType == 270) ifTrue:[ - "imageDescription - info only" + ^ self + ]. + (tagType == 289) ifTrue:[ + "freeByteCounts" + + "/ 'freeByteCounts ' print. value printNewline. -"/ 'imageDescription ' print. value printNewline. + ^ self + ]. + (tagType == 290) ifTrue:[ + "grayResponceUnit" + + "/ 'grayResponceUnit' print. value printNewline. - ^ self - ]. - (tagType == 271) ifTrue:[ - "make - info only" + ^ self + ]. + (tagType == 291) ifTrue:[ + "grayResponceCurve" + + "/ 'grayResponceCurve' print. value printNewline. -"/ 'make ' print. value printNewline. + ^ self + ]. + (tagType == 292) ifTrue:[ + "/ group3options + "/ 2DENCODING -> 1 + "/ UNCOMPRESSED -> 2 + "/ FILLBITS -> 4 + + group3options := value. + + "/ 'group3options ' print. group3options printNewline. - ^ self - ]. - (tagType == 272) ifTrue:[ - "model - info only" + ^ self + ]. + (tagType == 293) ifTrue:[ + "/ group4options + "/ UNCOMPRESSED -> 2 -"/ 'model ' print. value printNewline. + "group4options := value." + + "/ 'group4options ' print. value printNewline. + + ^ self + ]. + (tagType == 296) ifTrue:[ + "resolutionunit" - ^ self - ]. - (tagType == 273) ifTrue:[ - "stripoffsets" - stripOffsets := valueArray. + "/ (value == 1) ifTrue:[ + "/ 'res-unit pixel' printNewline + "/ ] ifFalse:[ + "/ (value == 2) ifTrue:[ + "/ 'res-unit inch' printNewline + "/ ] ifFalse:[ + "/ (value == 3) ifTrue:[ + "/ 'res-unit mm' printNewline + "/ ] ifFalse:[ + "/ 'res-unit invalid' printNewline + "/ ] + "/ ] + "/ ]. -"/ 'stripOffsets Array(' print. stripOffsets size print. ')' printNewline. + "resolutionUnit := value." + ^ self + ]. + (tagType == 297) ifTrue:[ + "pageNumber" + "pageNumber := value." - ^ self + "/ 'pageNumber ' print. value printNewline. + + ^ self + ]. ]. - (tagType == 274) ifTrue:[ - "Orientation" + + (tagType < 400) ifTrue:[ + (tagType == 300) ifTrue:[ + "colorResponceUnit" + + "/ 'colorResponceUnit' print. value printNewline. + + ^ self + ]. + (tagType == 301) ifTrue:[ + "colorResponceCurve" + + "/ 'colorResponceCurve' print. value printNewline. + + ^ self + ]. + (tagType == 305) ifTrue:[ + "software - info only" + + "/ 'software' print. value printNewline. + + ^ self + ]. + (tagType == 306) ifTrue:[ + "dateTime - info only" + + "/ 'dateTime ' print. value printNewline. + + ^ self + ]. + (tagType == 315) ifTrue:[ + "artist - info only" - orientation := - #( nil "/ 1 normal - unsupported "/ 2 horizontal flip - unsupported "/ 3 horizontal & vertical flip - vFlip "/ 4 vertical flip - unsupported "/ 5 rot 90' counter clock-wise - unsupported "/ 6 rot 90' clock-wise - unsupported "/ 7 rot 90' & flip - unsupported "/ 8 rot 90' ccw & flip - ) at:value ifAbsent:#unsupported. + "/ 'artist ' print. value printNewline. + + ^ self + ]. + (tagType == 316) ifTrue:[ + "host computer - info only" + + "/ 'host ' print. value printNewline. + + ^ self + ]. + (tagType == 317) ifTrue:[ + "predictor" + predictor := value. + + "/ 'predictor ' print. predictor printNewline. -"/ 'orientation ' print. value printNewline. + ^ self + ]. + (tagType == 318) ifTrue:[ + "whitePoint" + + "/ 'whitePoint ' print. value printNewline. + + ^ self + ]. + (tagType == 319) ifTrue:[ + "primaryChromatics" + + "/ 'primaryChromatics ' print. value printNewline. + + ^ self + ]. + (tagType == 320) ifTrue:[ + "colorMap" - ^ self - ]. - (tagType == 277) ifTrue:[ - "samplesPerPixel" - samplesPerPixel := value. + "/ 'colorMap (size=' print. valueArray size print. ')' printNewline. + + " + the tiff colormap contains 16bit values; + our colormap expects 8bit values + " + n := valueArray size // 3. -"/ 'samplesperpixel ' print. samplesPerPixel printNewline. + rV := ByteArray uninitializedNew:n. + gV := ByteArray uninitializedNew:n. + bV := ByteArray uninitializedNew:n. + scaleFactor := 255.0 / 16rFFFF. + i2 := n+1. + i3 := 2*n+1. + 1 to:n do:[:vi | + val := ((valueArray at:vi) * scaleFactor) rounded. + rV at:vi put:val. + val := ((valueArray at:i2) * scaleFactor) rounded. + gV at:vi put:val. + val := ((valueArray at:i3) * scaleFactor) rounded. + bV at:vi put:val. + i2 := i2 + 1. + i3 := i3 + 1. + ]. + colorMap := Colormap redVector:rV greenVector:gV blueVector:bV. + ^ self + ]. + (tagType == 321) ifTrue:[ + "halftonehints" + + "/ 'halftonehints' print. value printNewline. - ^ self - ]. - (tagType == 278) ifTrue:[ - "rowsperstrip" - rowsPerStrip := value. + ^ self + ]. + (tagType == 322) ifTrue:[ + "tilewidth" + + "/ 'tilewidth' print. value printNewline. -"/ 'rowsperstrip ' print. rowsPerStrip printNewline. + ^ self + ]. + (tagType == 323) ifTrue:[ + "tilelength" + + "/ 'tilelength' print. value printNewline. + + ^ self + ]. + (tagType == 324) ifTrue:[ + "tileoffsets" - ^ self - ]. - (tagType == 279) ifTrue:[ - "stripbytecount" - stripByteCounts := valueArray. + "/ 'tileoffsets' print. value printNewline. + + ^ self + ]. + (tagType == 325) ifTrue:[ + "tilebytecounts" + + "/ 'tilebytecounts' print. value printNewline. -"/ 'stripByteCounts Array(' print. -"/ stripByteCounts size print. -"/ ')' printNewline. + ^ self + ]. + (tagType == 327) ifTrue:[ + "cleanfaxdata" + + "/ 'tilebytecounts' print. value printNewline. + + ^ self + ]. + (tagType == 328) ifTrue:[ + "consecutiveBadFaxLines" - ^ self - ]. - (tagType == 280) ifTrue:[ - "MinSampleValue" - "minSampleValue:= value." + "/ 'consecutiveBadFaxLines' print. value printNewline. + + ^ self + ]. + (tagType == 330) ifTrue:[ + "subifd" + + "/ 'subifd' print. value printNewline. + + ^ self + ]. + (tagType == 332) ifTrue:[ + "ink set" + + "/ 'ink set' print. value printNewline. -"/ 'minSampleValue ' print. value printNewline. + ^ self + ]. + (tagType == 333) ifTrue:[ + "ink names" + + "/ 'ink names' print. value printNewline. + + ^ self + ]. + (tagType == 336) ifTrue:[ + "dot range" + + "/ 'dot range' print. value printNewline. + + ^ self + ]. + (tagType == 337) ifTrue:[ + "target printer" - ^ self - ]. - (tagType == 281) ifTrue:[ - "MaxSampleValue" - "maxSampleValue:= value." + "/ '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. -"/ 'maxSampleValue ' print. value printNewline. + ^ self + ]. + (tagType == 340) ifTrue:[ + "min sample value" + + "/ 'min sample value' print. value printNewline. - ^ self - ]. - (tagType == 282) ifTrue:[ - "xResolution" + ^ self + ]. + (tagType == 341) ifTrue:[ + "max sample value" + + "/ 'max sample value' print. value printNewline. + + ^ self + ]. + (tagType == 347) ifTrue:[ + "jpegtables" -"/ 'xres ' print. value printNewline. + "/ 'jpegtables' print. value printNewline. - ^ self - ]. - (tagType == 283) ifTrue:[ - "yResolution" - -"/ 'yres ' print. value printNewline. - - ^ self + ^ self + ]. ]. - (tagType == 284) ifTrue:[ - "planarconfig" - (value == 1) ifTrue:[ - planarConfiguration := 1 - ] ifFalse:[ - (value == 2) ifTrue:[ - planarConfiguration := 2 - ] ifFalse:[ - planarConfiguration := nil - ] + + (tagType < 600) ifTrue:[ + "/ obsolete JPEG tags + (tagType == 512) ifTrue:[ + "jpeg proc" + + "/ 'jpeg proc' print. value printNewline. + + ^ self + ]. + (tagType == 513) ifTrue:[ + "jpeg proc" + + "/ 'jpeg proc' print. value printNewline. + + ^ self + ]. + (tagType == 514) ifTrue:[ + "jpeg ifByteCount" + + "/ 'jpeg ifByteCount' print. value printNewline. + + ^ self + ]. + (tagType == 515) ifTrue:[ + "jpeg restartInterval" + + "/ 'jpeg restartInterval' print. value printNewline. + + ^ self + ]. + (tagType == 517) ifTrue:[ + "jpeg glossLessPredictors" + + "/ 'jpeg glossLessPredictors' print. value printNewline. + + ^ self + ]. + (tagType == 518) ifTrue:[ + "jpeg pointTransform" + + "/ 'jpeg pointTransform' print. value printNewline. + + ^ self + ]. + (tagType == 519) ifTrue:[ + "jpeg qTables" + + "/ 'jpeg qTables' print. value printNewline. + + ^ self + ]. + (tagType == 520) ifTrue:[ + "jpeg dcTables" + + "/ 'jpeg dcTables' print. value printNewline. + + ^ self + ]. + (tagType == 521) ifTrue:[ + "jpeg acTables" + + "/ 'jpeg acTables' print. value printNewline. + + ^ self ]. -"/ 'planarconfig ' print. planarConfiguration printNewline. - - ^ self - ]. - (tagType == 285) ifTrue:[ - "pageName" - -"/ 'pageName ' print. value printNewline. - - ^ self - ]. - (tagType == 286) ifTrue:[ - "xPosition" -"/ 'xPos ' print. value printNewline. - - ^ self - ]. - (tagType == 287) ifTrue:[ - "yPosition" + (tagType == 529) ifTrue:[ + "ycbr coeff" -"/ 'yPos ' print. value printNewline. - - ^ self - ]. - (tagType == 288) ifTrue:[ - "freeOffsets" - -"/ 'freeOffsets ' print. value printNewline. + "/ 'ycbr coeff' print. value printNewline. - ^ self - ]. - (tagType == 289) ifTrue:[ - "freeByteCounts" - -"/ 'freeByteCounts ' print. value printNewline. - - ^ self - ]. - (tagType == 290) ifTrue:[ - "grayResponceUnit" - -"/ 'grayResponceUnit' print. value printNewline. + ^ self + ]. + (tagType == 530) ifTrue:[ + "ycbr subsampling" - ^ self - ]. - (tagType == 291) ifTrue:[ - "grayResponceCurve" - -"/ 'grayResponceCurve' print. value printNewline. - - ^ self - ]. - (tagType == 292) ifTrue:[ - "group3options" - group3options := value. - -"/ 'group3options ' print. group3options printNewline. - - ^ self - ]. - (tagType == 293) ifTrue:[ - "group4options" - "group4options := value." - -"/ 'group4options ' print. value printNewline. + "/ 'ycbr subsampling' print. value printNewline. - ^ self - ]. - (tagType == 296) ifTrue:[ - "resolutionunit" + ^ self + ]. + (tagType == 531) ifTrue:[ + "ycbr positioning" -"/ (value == 1) ifTrue:[ -"/ 'res-unit pixel' printNewline -"/ ] ifFalse:[ -"/ (value == 2) ifTrue:[ -"/ 'res-unit inch' printNewline -"/ ] ifFalse:[ -"/ (value == 3) ifTrue:[ -"/ 'res-unit mm' printNewline -"/ ] ifFalse:[ -"/ 'res-unit invalid' printNewline -"/ ] -"/ ] -"/ ]. - - "resolutionUnit := value." - ^ self - ]. - (tagType == 297) ifTrue:[ - "pageNumber" - "pageNumber := value." - -"/ 'pageNumber ' print. value printNewline. - - ^ self - ]. - (tagType == 300) ifTrue:[ - "colorResponceUnit" - -"/ 'colorResponceUnit' print. value printNewline. + "/ 'ycbr positioning' print. value printNewline. - ^ self - ]. - (tagType == 301) ifTrue:[ - "colorResponceCurve" - -"/ 'colorResponceCurve' print. value printNewline. - - ^ self - ]. - (tagType == 305) ifTrue:[ - "software - info only" - -"/ 'software' print. value printNewline. + ^ self + ]. + (tagType == 532) ifTrue:[ + "referenceBlackWhite" - ^ self - ]. - (tagType == 306) ifTrue:[ - "dateTime - info only" - -"/ 'dateTime ' print. value printNewline. + "/ 'ycbr positioning' print. value printNewline. - ^ self - ]. - (tagType == 315) ifTrue:[ - "artist - info only" - -"/ 'artist ' print. value printNewline. - - ^ self - ]. - (tagType == 316) ifTrue:[ - "host computer - info only" - -"/ 'host ' print. value printNewline. - - ^ self + ^ self + ]. ]. - (tagType == 317) ifTrue:[ - "predictor" - predictor := value. + + (tagType > 32000) ifTrue:[ -"/ 'predictor ' print. predictor printNewline. + "/ Private Island graphics tags + (tagType == 32953) ifTrue:[ + "ref points" - ^ self - ]. - (tagType == 318) ifTrue:[ - "whitePoint" + "/ 'ref points' print. value printNewline. -"/ 'whitePoint ' print. value printNewline. + ^ self + ]. + (tagType == 32954) ifTrue:[ + "regionTagPoint" + + "/ 'regionTagPoint' print. value printNewline. - ^ self - ]. - (tagType == 319) ifTrue:[ - "primaryChromatics" + ^ self + ]. + (tagType == 32955) ifTrue:[ + "regionWarpCorners" -"/ 'primaryChromatics ' print. value printNewline. + "/ 'regionWarpCorners' print. value printNewline. - ^ self - ]. - (tagType == 320) ifTrue:[ - "colorMap" + ^ self + ]. + (tagType == 32956) ifTrue:[ + "regionAffine" -"/ 'colorMap (size=' print. valueArray size print. ')' printNewline. + "/ 'regionAffine' print. value printNewline. - " - the tiff colormap contains 16bit values; - our colormap expects 8bit values - " - n := valueArray size // 3. + ^ self + ]. + + + "/ Private SGI tags - rV := ByteArray uninitializedNew:n. - gV := ByteArray uninitializedNew:n. - bV := ByteArray uninitializedNew:n. - scaleFactor := 255.0 / 16rFFFF. - i2 := n+1. - i3 := 2*n+1. - 1 to:n do:[:vi | - val := ((valueArray at:vi) * scaleFactor) rounded. - rV at:vi put:val. - val := ((valueArray at:i2) * scaleFactor) rounded. - gV at:vi put:val. - val := ((valueArray at:i3) * scaleFactor) rounded. - bV at:vi put:val. - i2 := i2 + 1. - i3 := i3 + 1. + (tagType == 32995) ifTrue:[ + "matteing" + + "/ 'matteing' print. value printNewline. + + ^ self + ]. + (tagType == 32996) ifTrue:[ + "datatype" + + "/ 'datatype' print. value printNewline. + + ^ self ]. - colorMap := Colormap redVector:rV greenVector:gV blueVector:bV. - ^ self - ]. - (tagType == 332) ifTrue:[ - "ink set" + (tagType == 32997) ifTrue:[ + "imagedepth" + + "/ 'imagedepth' print. value printNewline. -"/ 'ink set' print. value printNewline. + ^ self + ]. + (tagType == 32998) ifTrue:[ + "tiledepth" - ^ self - ]. - (tagType == 333) ifTrue:[ - "ink names" + "/ 'tiledepth' print. value printNewline. -"/ 'ink names' print. value printNewline. + ^ self + ]. - ^ self - ]. - (tagType == 336) ifTrue:[ - "dot range" + "/ Private Pixar tags -"/ 'dot range' print. value printNewline. + (tagType == 33300) ifTrue:[ + "image full width" + + "/ 'image full width' print. value printNewline. - ^ self - ]. - (tagType == 337) ifTrue:[ - "target printer" + ^ self + ]. + (tagType == 33301) ifTrue:[ + "image full length" -"/ 'target printer' print. value printNewline. + "/ 'image full length' print. value printNewline. - ^ self - ]. - (tagType == 339) ifTrue:[ - "sample format" + ^ self + ]. + + "/ Private Eastman Kodak tags -"/ 'sample format' print. value printNewline. + (tagType == 33405) ifTrue:[ + "write serial number" + + "/ 'write serial number' print. value printNewline. - ^ self - ]. - (tagType == 340) ifTrue:[ - "min sample value" + ^ self + ]. + + "/ unknown -"/ 'min sample value' print. value printNewline. + (tagType == 33432) ifTrue:[ + "copyright" + + "/ 'copyright' print. value printNewline. - ^ self - ]. - (tagType == 341) ifTrue:[ - "max sample value" + ^ self + ]. -"/ 'max sample value' print. value printNewline. + "/ Private Texas instruments - ^ self - ]. - (tagType == 512) ifTrue:[ - "jpeg proc" + (tagType == 34232) ifTrue:[ + "sequence frame count" -"/ 'jpeg proc' print. value printNewline. + "/ 'sequence frame count' print. value printNewline. - ^ self - ]. - (tagType == 513) ifTrue:[ - "jpeg proc" + ^ self + ]. -"/ 'jpeg proc' print. value printNewline. + "/ Private Pixel magic + + (tagType == 34232) ifTrue:[ + "jbig options" - ^ self - ]. - (tagType == 32995) ifTrue:[ - "matteing" + "/ 'jbig options' print. value printNewline. + + ^ self + ]. -"/ 'matteing' print. value printNewline. + "/ More Private SGI + + (tagType == 34908) ifTrue:[ + "fax recv params" - ^ self - ]. - (tagType == 32996) ifTrue:[ - "datatype" + "/ 'fax recv params' print. value printNewline. -"/ 'datatype' print. value printNewline. + ^ self + ]. + (tagType == 34909) ifTrue:[ + "fax subaddress" + + "/ 'fax subaddress' print. value printNewline. - ^ self - ]. - (tagType == 32997) ifTrue:[ - "imagedepth" - -"/ 'imagedepth' print. value printNewline. + ^ self + ]. + (tagType == 34910) ifTrue:[ + "fax recv time" - ^ self - ]. - (tagType == 32998) ifTrue:[ - "tiledepth" + "/ 'fax recv time' print. value printNewline. -"/ 'tiledepth' print. value printNewline. - - ^ self + ^ self + ]. ]. "/ @@ -693,10 +995,10 @@ "/ 'TIFFReader [warning]: unknown tag type ' errorPrint. tagType errorPrintCR - "Modified: 31.1.1997 / 10:50:38 / cg" + "Modified: 11.4.1997 / 00:17:13 / cg" ! ! -!TIFFReader methodsFor:'private - reading'! +!TIFFReader methodsFor:'private - data reading'! readCCITT3RLETiffImageData 'TIFFReader [warning]: ccitt mod Huffman (rle) compression not implemented' errorPrintCR. @@ -777,48 +1079,25 @@ "Modified: 10.1.1997 / 19:10:59 / cg" ! -readChars:n - "read n characters and return them in a string" - - |oldPos offset string| - - n == 0 ifTrue:[^ '']. +readDCSTiffImageData + 'TIFFReader [warning]: dcs compression not implemented' errorPrintCR - string := String new:(n - 1). - (n <= 4) ifTrue:[ - inStream nextBytes:(n - 1) into:string - ] ifFalse:[ - offset := inStream nextLongMSB:(byteOrder ~~ #lsb). - oldPos := inStream position. - inStream position:(offset + 1). - inStream nextBytes:(n - 1) into:string. - inStream position:oldPos - ]. - ^ string - - "Modified: 5.9.1996 / 12:21:08 / cg" + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:30:54 / cg" ! -readFracts:nFracts - "read nFracts fractions (2 32bit words) and return them in an array" - - |oldPos offset values numerator denominator msb - n "{ Class: SmallInteger }" | - - n := nFracts. +readDeflateTiffImageData + 'TIFFReader [warning]: deflate compression not implemented' errorPrintCR - msb := byteOrder ~~ #lsb. - values := Array basicNew:n. - offset := inStream nextLongMSB:msb. - oldPos := inStream position. - inStream position:(offset + 1). - 1 to:n do:[:index | - numerator := inStream nextLongMSB:msb. - denominator := inStream nextLongMSB:msb. - values at:index put:(Fraction numerator:numerator denominator:denominator) - ]. - inStream position:oldPos. - ^ values + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:30:45 / cg" +! + +readJBIGTiffImageData + 'TIFFReader [warning]: jbig compression not implemented' errorPrintCR + + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:31:00 / cg" ! readJPEGTiffImageData @@ -908,30 +1187,6 @@ "Modified: 10.1.1997 / 18:13:21 / cg" ! -readLongs:nLongs - "read nLongs long numbers (32bit) and return them in an array" - - |oldPos offset values msb - n "{ Class: SmallInteger }" | - - n := nLongs. - - msb := byteOrder ~~ #lsb. - values := Array basicNew:n. - (n == 1) ifTrue:[ - values at:1 put:(inStream nextLongMSB:msb). - ] ifFalse:[ - offset := inStream nextLongMSB:msb. - oldPos := inStream position. - inStream position:(offset + 1). - 1 to:n do:[:index | - values at:index put:(inStream nextLongMSB:msb) - ]. - inStream position:oldPos - ]. - ^ values -! - readNeXTJPEGTiffImageData 'TIFFReader [warning]: jpeg compression not implemented' errorPrintCR @@ -953,33 +1208,88 @@ "Modified: 10.1.1997 / 18:10:57 / cg" ! -readShorts:nShorts - "read nShorts short numbers (16bit) and return them in an array" +readPixarFilmTiffImageData + 'TIFFReader [warning]: pixar film compression not implemented' errorPrintCR - |oldPos offset values msb val2 - n "{ Class: SmallInteger }" | + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:30:33 / cg" +! + +readPixarLogTiffImageData + 'TIFFReader [warning]: pixar log compression not implemented' errorPrintCR - n := nShorts. + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:30:39 / cg" +! - msb := (byteOrder ~~ #lsb). - values := Array basicNew:n. - (n <= 2) ifTrue:[ - values at:1 put:(inStream nextUnsignedShortMSB:msb). - val2 := inStream nextUnsignedShortMSB:msb. +readThunderScanTiffImageData + 'TIFFReader [warning]: thunderScan compression not implemented' errorPrintCR + + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:30:23 / cg" +! - (n == 2) ifTrue:[ - values at:2 put:val2 - ] - ] ifFalse:[ - offset := inStream nextLongMSB:msb. - oldPos := inStream position. - inStream position:(offset + 1). - 1 to:n do:[:index | - values at:index put:(inStream nextUnsignedShortMSB:msb) - ]. - inStream position:oldPos +readTiffImageData + (compression == 1) ifTrue:[ + ^ self readUncompressedTiffImageData. + ]. + (compression == 2) ifTrue:[ + ^ self readCCITT3RLETiffImageData. + ]. + (compression == 3) ifTrue:[ + ^ self readCCITTGroup3TiffImageData. + ]. + (compression == 4) ifTrue:[ + ^ self readCCITTGroup4TiffImageData. + ]. + (compression == 5) ifTrue:[ + ^ self readLZWTiffImageData. + ]. + (compression == 6) ifTrue:[ + ^ self readJPEGTiffImageData. + ]. + (compression == 7) ifTrue:[ + ^ self readNewJPEGTiffImageData. + ]. + + (compression == 32766) ifTrue:[ + ^ self readNeXTRLE2TiffImageData. + ]. + (compression == 32771) ifTrue:[ + ^ self readCCITTRLEWTiffImageData. ]. - ^ values + (compression == 32773) ifTrue:[ + ^ self readPackbitsTiffImageData. + ]. + (compression == 32809) ifTrue:[ + ^ self readThunderScanTiffImageData. + ]. + (compression == 32908) ifTrue:[ + ^ self readPixarFilmTiffImageData. + ]. + (compression == 32909) ifTrue:[ + ^ self readPixarLogTiffImageData. + ]. + (compression == 32946) ifTrue:[ + ^ self readDeflateTiffImageData. + ]. + (compression == 32947) ifTrue:[ + ^ self readDCSTiffImageData. + ]. + (compression == 32865) ifTrue:[ + ^ self readNeXTJPEGTiffImageData. + ]. + (compression == 34661) ifTrue:[ + ^ self readJBIGTiffImageData. + ]. + + 'TIFFReader [warning]: compression type ' errorPrint. compression errorPrint. + ' not known' errorPrintCR. + + ^ nil. + + "Created: 11.4.1997 / 00:19:44 / cg" + "Modified: 11.4.1997 / 00:29:54 / cg" ! readUncompressedTiffImageData @@ -1056,6 +1366,105 @@ "Modified: 10.1.1997 / 18:10:46 / cg" ! ! +!TIFFReader methodsFor:'private - reading'! + +readChars:n + "read n characters and return them in a string" + + |oldPos offset string| + + n == 0 ifTrue:[^ '']. + + string := String new:(n - 1). + (n <= 4) ifTrue:[ + inStream nextBytes:(n - 1) into:string + ] ifFalse:[ + offset := inStream nextLongMSB:(byteOrder ~~ #lsb). + oldPos := inStream position. + inStream position:(offset + 1). + inStream nextBytes:(n - 1) into:string. + inStream position:oldPos + ]. + ^ string + + "Modified: 5.9.1996 / 12:21:08 / cg" +! + +readFracts:nFracts + "read nFracts fractions (2 32bit words) and return them in an array" + + |oldPos offset values numerator denominator msb + n "{ Class: SmallInteger }" | + + n := nFracts. + + msb := byteOrder ~~ #lsb. + values := Array basicNew:n. + offset := inStream nextLongMSB:msb. + oldPos := inStream position. + inStream position:(offset + 1). + 1 to:n do:[:index | + numerator := inStream nextLongMSB:msb. + denominator := inStream nextLongMSB:msb. + values at:index put:(Fraction numerator:numerator denominator:denominator) + ]. + inStream position:oldPos. + ^ values +! + +readLongs:nLongs + "read nLongs long numbers (32bit) and return them in an array" + + |oldPos offset values msb + n "{ Class: SmallInteger }" | + + n := nLongs. + + msb := byteOrder ~~ #lsb. + values := Array basicNew:n. + (n == 1) ifTrue:[ + values at:1 put:(inStream nextLongMSB:msb). + ] ifFalse:[ + offset := inStream nextLongMSB:msb. + oldPos := inStream position. + inStream position:(offset + 1). + 1 to:n do:[:index | + values at:index put:(inStream nextLongMSB:msb) + ]. + inStream position:oldPos + ]. + ^ values +! + +readShorts:nShorts + "read nShorts short numbers (16bit) and return them in an array" + + |oldPos offset values msb val2 + n "{ Class: SmallInteger }" | + + n := nShorts. + + msb := (byteOrder ~~ #lsb). + values := Array basicNew:n. + (n <= 2) ifTrue:[ + values at:1 put:(inStream nextUnsignedShortMSB:msb). + val2 := inStream nextUnsignedShortMSB:msb. + + (n == 2) ifTrue:[ + values at:2 put:val2 + ] + ] ifFalse:[ + offset := inStream nextLongMSB:msb. + oldPos := inStream position. + inStream position:(offset + 1). + 1 to:n do:[:index | + values at:index put:(inStream nextUnsignedShortMSB:msb) + ]. + inStream position:oldPos + ]. + ^ values +! ! + !TIFFReader methodsFor:'private - writing'! writeBitsPerSample @@ -1445,7 +1854,7 @@ tagType "{ Class: SmallInteger }" numberType "{ Class: SmallInteger }" length "{ Class: SmallInteger }" - result offset ok msb + result offset msb bitsPerPixel bytesPerRow offset1 offset2 tmp| inStream := aStream. @@ -1509,25 +1918,24 @@ ]. "check for required tags" - ok := true. width isNil ifTrue:[ 'TIFFReader [warning]: missing width tag' errorPrintCR. - ok := false + ^ nil ]. height isNil ifTrue:[ 'TIFFReader [warning]: missing length tag' errorPrintCR. - ok := false + ^ nil ]. photometric isNil ifTrue:[ 'TIFFReader [warning]: missing photometric tag' errorPrintCR. - ok := false + ^ nil ]. stripOffsets isNil ifTrue:[ 'TIFFReader [warning]: missing stripOffsets tag' errorPrintCR. - ok := false + ^ nil ]. stripByteCounts isNil ifTrue:[ @@ -1538,10 +1946,6 @@ stripByteCounts isNil ifTrue:[ 'TIFFReader [warning]: missing stripByteCounts tag' errorPrintCR. - ok := false - ]. - - ok ifFalse:[ ^ nil ]. @@ -1555,77 +1959,35 @@ rowsPerStrip := height ]. - ok := false. - (compression == 1) ifTrue:[ - result := self readUncompressedTiffImageData. - ok := true - ]. - (compression == 2) ifTrue:[ - result := self readCCITT3RLETiffImageData. - ok := true - ]. - (compression == 3) ifTrue:[ - result := self readCCITTGroup3TiffImageData. - ok := true - ]. - (compression == 4) ifTrue:[ - result := self readCCITTGroup4TiffImageData. - ok := true - ]. - (compression == 5) ifTrue:[ - result := self readLZWTiffImageData. - ok := true - ]. - (compression == 6) ifTrue:[ - result := self readJPEGTiffImageData. - ok := true - ]. - (compression == 32766) ifTrue:[ - result := self readNeXTRLE2TiffImageData. - ok := true - ]. - (compression == 32771) ifTrue:[ - result := self readCCITTRLEWTiffImageData. - ok := true - ]. - (compression == 32773) ifTrue:[ - result := self readPackbitsTiffImageData. - ok := true - ]. - (compression == 32865) ifTrue:[ - result := self readNeXTJPEGTiffImageData. - ok := true - ]. - ok ifFalse:[ - 'TIFFReader [warning]: compression type ' errorPrint. compression errorPrint. - ' not known' errorPrintCR - ]. + result := self readTiffImageData. + result notNil ifTrue:[ + + orientation == #vFlip ifTrue:[ + "/ reverse rows to top-to bottom - orientation == #vFlip ifTrue:[ - "/ reverse rows to top-to bottom - - bytesPerRow := self bytesPerRow. - tmp := ByteArray new:bytesPerRow. - offset1 := 1. - offset2 := (height-1)*bytesPerRow + 1. - 0 to:(height-1//2) do:[:row | - tmp replaceFrom:1 to:bytesPerRow - with:data startingAt:offset1. - data replaceFrom:offset1 to:offset1+bytesPerRow-1 - with:data startingAt:offset2. - data replaceFrom:offset2 to:offset2+bytesPerRow-1 - with:tmp startingAt:1. - offset1 := offset1 + bytesPerRow. - offset2 := offset2 - bytesPerRow. + bytesPerRow := self bytesPerRow. + tmp := ByteArray new:bytesPerRow. + offset1 := 1. + offset2 := (height-1)*bytesPerRow + 1. + 0 to:(height-1//2) do:[:row | + tmp replaceFrom:1 to:bytesPerRow + with:data startingAt:offset1. + data replaceFrom:offset1 to:offset1+bytesPerRow-1 + with:data startingAt:offset2. + data replaceFrom:offset2 to:offset2+bytesPerRow-1 + with:tmp startingAt:1. + offset1 := offset1 + bytesPerRow. + offset2 := offset2 - bytesPerRow. + ]. ]. - ]. - orientation == #unsupported ifTrue:[ - 'TIFFReader [warning]: unsupported orientation' errorPrintCR + orientation == #unsupported ifTrue:[ + 'TIFFReader [warning]: unsupported orientation' errorPrintCR + ]. ]. ^ result - "Modified: 31.1.1997 / 10:51:27 / cg" + "Modified: 11.4.1997 / 00:21:58 / cg" ! ! !TIFFReader methodsFor:'writing to file'! @@ -1730,6 +2092,6 @@ !TIFFReader class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libview2/Attic/TIFFRdr.st,v 1.50 1997-02-27 11:50:14 cg Exp $' + ^ '$Header: /cvs/stx/stx/libview2/Attic/TIFFRdr.st,v 1.51 1997-04-10 22:42:03 cg Exp $' ! ! TIFFReader initialize! diff -r 7df33af3beaa -r 76ffe180cff8 TIFFReader.st --- a/TIFFReader.st Sun Apr 06 15:03:43 1997 +0200 +++ b/TIFFReader.st Fri Apr 11 00:42:03 1997 +0200 @@ -127,563 +127,865 @@ "/ 'tiffTag: ' print. tagType printCR. - (numberType == 3) ifTrue:[ - "short" + (numberType == 3 "TIFF_SHORT") ifTrue:[ + "16 bit ushort" valueArray := self readShorts:length. value := valueArray at:1 + ] ifFalse:[(numberType == 4 "TIFF_LONG") ifTrue:[ + "32 bit uinteger" + valueArray := self readLongs:length. + value := valueArray at:1 + ] ifFalse:[(numberType == 2 "TIFF_ASCII") ifTrue:[ + "ascii characters" + value := self readChars:length + ] ifFalse:[(numberType == 5 "TIFF_RATIONAL") ifTrue:[ + "64 bit ufraction" + valueArray := self readFracts:length. + value := valueArray at:1 ] ifFalse:[ - (numberType == 4) ifTrue:[ - "integer" - valueArray := self readLongs:length. - value := valueArray at:1 - ] ifFalse:[ - (numberType == 2) ifTrue:[ - "character" - value := self readChars:length - ] ifFalse:[ - (numberType == 5) ifTrue:[ - "fraction" - valueArray := self readFracts:length. - value := valueArray at:1 - ] ifFalse:[ - offset := (inStream nextLongMSB:(byteOrder ~~ #lsb)) - ] - ] - ] - ]. + offset := (inStream nextLongMSB:(byteOrder ~~ #lsb)) + ]]]]. + + (tagType < 300) ifTrue:[ + (tagType == 254) ifTrue:[ + "/ New SubfileType + "/ REDUCEDIMAGE -> 1 + "/ PAGE -> 2 + "/ MASK -> 4 + "newSubFileType := value." - (tagType == 254) ifTrue:[ - "NewSubfileType" - "newSubFileType := value." + "/ 'newSubfiletype ' print. value printNewline. + + ^ self + ]. + (tagType == 255) ifTrue:[ + "/ Old SubfileType + "/ IMAGE -> 1 + "/ REDUCEDIMAGE -> 2 + "/ PAGE -> 3 + subFileType := value. + + "/ 'subfiletype ' print. value printNewline. -"/ 'newSubfiletype ' print. value printNewline. + ^ self + ]. + (tagType == 256) ifTrue:[ + "ImageWidth" + width := value. - ^ self - ]. - (tagType == 255) ifTrue:[ - "SubfileType" - subFileType := value. - -"/ 'subfiletype ' print. value printNewline. + "/ 'width ' print. width printNewline. - ^ self - ]. - (tagType == 256) ifTrue:[ - "ImageWidth" - width := value. + ^ self + ]. + (tagType == 257) ifTrue:[ + "ImageHeight" + height := value. + + "/ 'height ' print. height printNewline. -"/ 'width ' print. width printNewline. + ^ self + ]. + (tagType == 258) ifTrue:[ + "bitspersample" + bitsPerSample := valueArray. - ^ self - ]. - (tagType == 257) ifTrue:[ - "ImageHeight" - height := value. + "/ 'bitspersample ' print. bitsPerSample printNewline. -"/ 'height ' print. height printNewline. - - ^ self - ]. - (tagType == 258) ifTrue:[ - "bitspersample" - bitsPerSample := valueArray. - -"/ 'bitspersample ' print. bitsPerSample printNewline. + ^ self + ]. + (tagType == 259) ifTrue:[ + "/ compression + "/ NONE -> 1 + "/ CCITTRLE -> 2 + "/ CCITTFAX3 -> 3 + "/ CCITTFAX4 -> 4 + "/ LZW -> 5 + "/ OJPEG -> 6 + "/ JPEG -> 7 + "/ NEXT -> 32766 + "/ CCITTRLEW -> 32771 + "/ PACKBITS -> 32809 + "/ PIXARFILM -> 32908 + "/ PIXARLOG -> 32909 + "/ DEFLATE -> 32946 + "/ DCS -> 32947 + "/ JBIG -> 34661 + + compression := value. - ^ self - ]. - (tagType == 259) ifTrue:[ - "compression" - compression := value. - -"/ 'compression ' print. compression printNewline. - - ^ self - ]. - (tagType == 262) ifTrue:[ - "photometric" + "/ 'compression ' print. compression printNewline. - (value == 0) ifTrue:[ - photometric := #whiteIs0 - ] ifFalse:[ - (value == 1) ifTrue:[ - photometric := #blackIs0 - ] ifFalse:[ - (value == 2) ifTrue:[ - photometric := #rgb + ^ self + ]. + (tagType == 262) ifTrue:[ + "photometric" + + (value == 0) ifTrue:[ + photometric := #whiteIs0 ] ifFalse:[ - (value == 3) ifTrue:[ - photometric := #palette + (value == 1) ifTrue:[ + photometric := #blackIs0 ] ifFalse:[ - (value == 4) ifTrue:[ - photometric := #transparency + (value == 2) ifTrue:[ + photometric := #rgb ] ifFalse:[ - (value == 5) ifTrue:[ - photometric := #separated "/ color separations + (value == 3) ifTrue:[ + photometric := #palette ] ifFalse:[ - (value == 6) ifTrue:[ - photometric := #ycbr "/ CCIR 601 + (value == 4) ifTrue:[ + photometric := #transparency ] ifFalse:[ - (value == 8) ifTrue:[ - photometric := #cielab "/ 1976 CIE L*a*b* + (value == 5) ifTrue:[ + photometric := #separated "/ color separations ] ifFalse:[ - photometric := nil + (value == 6) ifTrue:[ + photometric := #ycbr "/ CCIR 601 + ] ifFalse:[ + (value == 8) ifTrue:[ + photometric := #cielab "/ 1976 CIE L*a*b* + ] ifFalse:[ + photometric := nil + ] + ] ] ] ] ] ] - ] - ] + ]. + + "/ 'photometric ' print. photometric printNewline. + + ^ self ]. + (tagType == 263) ifTrue:[ + "/ Treshholding + "/ BILEVEL -> 1 + "/ HALFTONE -> 2 + "/ ERRORDIFFUSE -> 3 -"/ 'photometric ' print. photometric printNewline. + "threshholding := value." + + "/ 'treshholding ' print. value printNewline. + + ^ self + ]. + (tagType == 264) ifTrue:[ + "CellWidth" + "cellWidth:= value." + + "/ 'cellWidth ' print. value printNewline. + + ^ self + ]. + (tagType == 265) ifTrue:[ + "CellLength" + "cellLength:= value." + + "/ 'cellLength ' print. value printNewline. - ^ self - ]. - (tagType == 263) ifTrue:[ - "Treshholding" - "threshholding := value." + ^ self + ]. + (tagType == 266) ifTrue:[ + "fillOrder" + (value == 1) ifTrue:[ + fillOrder := #msb + ] ifFalse:[ + (value == 2) ifTrue:[ + fillOrder := #lsb + ] ifFalse:[ + fillOrder := nil + ] + ]. + + "/ 'fillorder ' print. fillOrder printNewline. -"/ 'treshholding ' print. value printNewline. + ^ self + ]. + (tagType == 269) ifTrue:[ + "documentName - info only" + + "/ 'documentName ' print. value printNewline. + + ^ self + ]. + (tagType == 270) ifTrue:[ + "imageDescription - info only" + + "/ 'imageDescription ' print. value printNewline. + + ^ self + ]. + (tagType == 271) ifTrue:[ + "make - info only" - ^ self - ]. - (tagType == 264) ifTrue:[ - "CellWidth" - "cellWidth:= value." + "/ 'make ' print. value printNewline. + + ^ self + ]. + (tagType == 272) ifTrue:[ + "model - info only" + + "/ 'model ' print. value printNewline. + + ^ self + ]. + (tagType == 273) ifTrue:[ + "stripoffsets" + stripOffsets := valueArray. -"/ 'cellWidth ' print. value printNewline. + "/ 'stripOffsets Array(' print. stripOffsets size print. ')' printNewline. + + ^ self + ]. + (tagType == 274) ifTrue:[ + "Orientation" + + orientation := + #( nil "/ 1 normal (topLeft) + unsupported "/ 2 horizontal flip + unsupported "/ 3 horizontal & vertical flip + vFlip "/ 4 vertical flip + unsupported "/ 5 rot 90' counter clock-wise + unsupported "/ 6 rot 90' clock-wise + unsupported "/ 7 rot 90' & flip + unsupported "/ 8 rot 90' ccw & flip + ) at:value ifAbsent:#unsupported. - ^ self - ]. - (tagType == 265) ifTrue:[ - "CellLength" - "cellLength:= value." + "/ 'orientation ' print. value printNewline. + + ^ self + ]. + (tagType == 277) ifTrue:[ + "samplesPerPixel" + samplesPerPixel := value. + + "/ 'samplesperpixel ' print. samplesPerPixel printNewline. + + ^ self + ]. + (tagType == 278) ifTrue:[ + "rowsperstrip" + rowsPerStrip := value. + + "/ 'rowsperstrip ' print. rowsPerStrip printNewline. -"/ 'cellLength ' print. value printNewline. + ^ self + ]. + (tagType == 279) ifTrue:[ + "stripbytecount" + stripByteCounts := valueArray. + + "/ 'stripByteCounts Array(' print. + "/ stripByteCounts size print. + "/ ')' printNewline. + + ^ self + ]. + (tagType == 280) ifTrue:[ + "MinSampleValue" + "minSampleValue:= value." + + "/ 'minSampleValue ' print. value printNewline. - ^ self - ]. - (tagType == 266) ifTrue:[ - "fillOrder" - (value == 1) ifTrue:[ - fillOrder := #msb - ] ifFalse:[ - (value == 2) ifTrue:[ - fillOrder := #lsb - ] ifFalse:[ - fillOrder := nil - ] + ^ self + ]. + (tagType == 281) ifTrue:[ + "MaxSampleValue" + "maxSampleValue:= value." + + "/ 'maxSampleValue ' print. value printNewline. + + ^ self + ]. + (tagType == 282) ifTrue:[ + "xResolution" + + "/ 'xres ' print. value printNewline. + + ^ self + ]. + (tagType == 283) ifTrue:[ + "yResolution" + + "/ 'yres ' print. value printNewline. + + ^ self ]. + (tagType == 284) ifTrue:[ + "planarconfig" + (value == 1) ifTrue:[ + planarConfiguration := 1 + ] ifFalse:[ + (value == 2) ifTrue:[ + planarConfiguration := 2 + ] ifFalse:[ + planarConfiguration := nil + ] + ]. -"/ 'fillorder ' print. fillOrder printNewline. + "/ 'planarconfig ' print. planarConfiguration printNewline. + + ^ self + ]. + (tagType == 285) ifTrue:[ + "pageName" + + "/ 'pageName ' print. value printNewline. - ^ self - ]. - (tagType == 269) ifTrue:[ - "documentName - info only" + ^ self + ]. + (tagType == 286) ifTrue:[ + "xPosition" + + "/ 'xPos ' print. value printNewline. -"/ 'documentName ' print. value printNewline. + ^ self + ]. + (tagType == 287) ifTrue:[ + "yPosition" + + "/ 'yPos ' print. value printNewline. + + ^ self + ]. + (tagType == 288) ifTrue:[ + "freeOffsets" + + "/ 'freeOffsets ' print. value printNewline. - ^ self - ]. - (tagType == 270) ifTrue:[ - "imageDescription - info only" + ^ self + ]. + (tagType == 289) ifTrue:[ + "freeByteCounts" + + "/ 'freeByteCounts ' print. value printNewline. -"/ 'imageDescription ' print. value printNewline. + ^ self + ]. + (tagType == 290) ifTrue:[ + "grayResponceUnit" + + "/ 'grayResponceUnit' print. value printNewline. - ^ self - ]. - (tagType == 271) ifTrue:[ - "make - info only" + ^ self + ]. + (tagType == 291) ifTrue:[ + "grayResponceCurve" + + "/ 'grayResponceCurve' print. value printNewline. -"/ 'make ' print. value printNewline. + ^ self + ]. + (tagType == 292) ifTrue:[ + "/ group3options + "/ 2DENCODING -> 1 + "/ UNCOMPRESSED -> 2 + "/ FILLBITS -> 4 + + group3options := value. + + "/ 'group3options ' print. group3options printNewline. - ^ self - ]. - (tagType == 272) ifTrue:[ - "model - info only" + ^ self + ]. + (tagType == 293) ifTrue:[ + "/ group4options + "/ UNCOMPRESSED -> 2 -"/ 'model ' print. value printNewline. + "group4options := value." + + "/ 'group4options ' print. value printNewline. + + ^ self + ]. + (tagType == 296) ifTrue:[ + "resolutionunit" - ^ self - ]. - (tagType == 273) ifTrue:[ - "stripoffsets" - stripOffsets := valueArray. + "/ (value == 1) ifTrue:[ + "/ 'res-unit pixel' printNewline + "/ ] ifFalse:[ + "/ (value == 2) ifTrue:[ + "/ 'res-unit inch' printNewline + "/ ] ifFalse:[ + "/ (value == 3) ifTrue:[ + "/ 'res-unit mm' printNewline + "/ ] ifFalse:[ + "/ 'res-unit invalid' printNewline + "/ ] + "/ ] + "/ ]. -"/ 'stripOffsets Array(' print. stripOffsets size print. ')' printNewline. + "resolutionUnit := value." + ^ self + ]. + (tagType == 297) ifTrue:[ + "pageNumber" + "pageNumber := value." - ^ self + "/ 'pageNumber ' print. value printNewline. + + ^ self + ]. ]. - (tagType == 274) ifTrue:[ - "Orientation" + + (tagType < 400) ifTrue:[ + (tagType == 300) ifTrue:[ + "colorResponceUnit" + + "/ 'colorResponceUnit' print. value printNewline. + + ^ self + ]. + (tagType == 301) ifTrue:[ + "colorResponceCurve" + + "/ 'colorResponceCurve' print. value printNewline. + + ^ self + ]. + (tagType == 305) ifTrue:[ + "software - info only" + + "/ 'software' print. value printNewline. + + ^ self + ]. + (tagType == 306) ifTrue:[ + "dateTime - info only" + + "/ 'dateTime ' print. value printNewline. + + ^ self + ]. + (tagType == 315) ifTrue:[ + "artist - info only" - orientation := - #( nil "/ 1 normal - unsupported "/ 2 horizontal flip - unsupported "/ 3 horizontal & vertical flip - vFlip "/ 4 vertical flip - unsupported "/ 5 rot 90' counter clock-wise - unsupported "/ 6 rot 90' clock-wise - unsupported "/ 7 rot 90' & flip - unsupported "/ 8 rot 90' ccw & flip - ) at:value ifAbsent:#unsupported. + "/ 'artist ' print. value printNewline. + + ^ self + ]. + (tagType == 316) ifTrue:[ + "host computer - info only" + + "/ 'host ' print. value printNewline. + + ^ self + ]. + (tagType == 317) ifTrue:[ + "predictor" + predictor := value. + + "/ 'predictor ' print. predictor printNewline. -"/ 'orientation ' print. value printNewline. + ^ self + ]. + (tagType == 318) ifTrue:[ + "whitePoint" + + "/ 'whitePoint ' print. value printNewline. + + ^ self + ]. + (tagType == 319) ifTrue:[ + "primaryChromatics" + + "/ 'primaryChromatics ' print. value printNewline. + + ^ self + ]. + (tagType == 320) ifTrue:[ + "colorMap" - ^ self - ]. - (tagType == 277) ifTrue:[ - "samplesPerPixel" - samplesPerPixel := value. + "/ 'colorMap (size=' print. valueArray size print. ')' printNewline. + + " + the tiff colormap contains 16bit values; + our colormap expects 8bit values + " + n := valueArray size // 3. -"/ 'samplesperpixel ' print. samplesPerPixel printNewline. + rV := ByteArray uninitializedNew:n. + gV := ByteArray uninitializedNew:n. + bV := ByteArray uninitializedNew:n. + scaleFactor := 255.0 / 16rFFFF. + i2 := n+1. + i3 := 2*n+1. + 1 to:n do:[:vi | + val := ((valueArray at:vi) * scaleFactor) rounded. + rV at:vi put:val. + val := ((valueArray at:i2) * scaleFactor) rounded. + gV at:vi put:val. + val := ((valueArray at:i3) * scaleFactor) rounded. + bV at:vi put:val. + i2 := i2 + 1. + i3 := i3 + 1. + ]. + colorMap := Colormap redVector:rV greenVector:gV blueVector:bV. + ^ self + ]. + (tagType == 321) ifTrue:[ + "halftonehints" + + "/ 'halftonehints' print. value printNewline. - ^ self - ]. - (tagType == 278) ifTrue:[ - "rowsperstrip" - rowsPerStrip := value. + ^ self + ]. + (tagType == 322) ifTrue:[ + "tilewidth" + + "/ 'tilewidth' print. value printNewline. -"/ 'rowsperstrip ' print. rowsPerStrip printNewline. + ^ self + ]. + (tagType == 323) ifTrue:[ + "tilelength" + + "/ 'tilelength' print. value printNewline. + + ^ self + ]. + (tagType == 324) ifTrue:[ + "tileoffsets" - ^ self - ]. - (tagType == 279) ifTrue:[ - "stripbytecount" - stripByteCounts := valueArray. + "/ 'tileoffsets' print. value printNewline. + + ^ self + ]. + (tagType == 325) ifTrue:[ + "tilebytecounts" + + "/ 'tilebytecounts' print. value printNewline. -"/ 'stripByteCounts Array(' print. -"/ stripByteCounts size print. -"/ ')' printNewline. + ^ self + ]. + (tagType == 327) ifTrue:[ + "cleanfaxdata" + + "/ 'tilebytecounts' print. value printNewline. + + ^ self + ]. + (tagType == 328) ifTrue:[ + "consecutiveBadFaxLines" - ^ self - ]. - (tagType == 280) ifTrue:[ - "MinSampleValue" - "minSampleValue:= value." + "/ 'consecutiveBadFaxLines' print. value printNewline. + + ^ self + ]. + (tagType == 330) ifTrue:[ + "subifd" + + "/ 'subifd' print. value printNewline. + + ^ self + ]. + (tagType == 332) ifTrue:[ + "ink set" + + "/ 'ink set' print. value printNewline. -"/ 'minSampleValue ' print. value printNewline. + ^ self + ]. + (tagType == 333) ifTrue:[ + "ink names" + + "/ 'ink names' print. value printNewline. + + ^ self + ]. + (tagType == 336) ifTrue:[ + "dot range" + + "/ 'dot range' print. value printNewline. + + ^ self + ]. + (tagType == 337) ifTrue:[ + "target printer" - ^ self - ]. - (tagType == 281) ifTrue:[ - "MaxSampleValue" - "maxSampleValue:= value." + "/ '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. -"/ 'maxSampleValue ' print. value printNewline. + ^ self + ]. + (tagType == 340) ifTrue:[ + "min sample value" + + "/ 'min sample value' print. value printNewline. - ^ self - ]. - (tagType == 282) ifTrue:[ - "xResolution" + ^ self + ]. + (tagType == 341) ifTrue:[ + "max sample value" + + "/ 'max sample value' print. value printNewline. + + ^ self + ]. + (tagType == 347) ifTrue:[ + "jpegtables" -"/ 'xres ' print. value printNewline. + "/ 'jpegtables' print. value printNewline. - ^ self - ]. - (tagType == 283) ifTrue:[ - "yResolution" - -"/ 'yres ' print. value printNewline. - - ^ self + ^ self + ]. ]. - (tagType == 284) ifTrue:[ - "planarconfig" - (value == 1) ifTrue:[ - planarConfiguration := 1 - ] ifFalse:[ - (value == 2) ifTrue:[ - planarConfiguration := 2 - ] ifFalse:[ - planarConfiguration := nil - ] + + (tagType < 600) ifTrue:[ + "/ obsolete JPEG tags + (tagType == 512) ifTrue:[ + "jpeg proc" + + "/ 'jpeg proc' print. value printNewline. + + ^ self + ]. + (tagType == 513) ifTrue:[ + "jpeg proc" + + "/ 'jpeg proc' print. value printNewline. + + ^ self + ]. + (tagType == 514) ifTrue:[ + "jpeg ifByteCount" + + "/ 'jpeg ifByteCount' print. value printNewline. + + ^ self + ]. + (tagType == 515) ifTrue:[ + "jpeg restartInterval" + + "/ 'jpeg restartInterval' print. value printNewline. + + ^ self + ]. + (tagType == 517) ifTrue:[ + "jpeg glossLessPredictors" + + "/ 'jpeg glossLessPredictors' print. value printNewline. + + ^ self + ]. + (tagType == 518) ifTrue:[ + "jpeg pointTransform" + + "/ 'jpeg pointTransform' print. value printNewline. + + ^ self + ]. + (tagType == 519) ifTrue:[ + "jpeg qTables" + + "/ 'jpeg qTables' print. value printNewline. + + ^ self + ]. + (tagType == 520) ifTrue:[ + "jpeg dcTables" + + "/ 'jpeg dcTables' print. value printNewline. + + ^ self + ]. + (tagType == 521) ifTrue:[ + "jpeg acTables" + + "/ 'jpeg acTables' print. value printNewline. + + ^ self ]. -"/ 'planarconfig ' print. planarConfiguration printNewline. - - ^ self - ]. - (tagType == 285) ifTrue:[ - "pageName" - -"/ 'pageName ' print. value printNewline. - - ^ self - ]. - (tagType == 286) ifTrue:[ - "xPosition" -"/ 'xPos ' print. value printNewline. - - ^ self - ]. - (tagType == 287) ifTrue:[ - "yPosition" + (tagType == 529) ifTrue:[ + "ycbr coeff" -"/ 'yPos ' print. value printNewline. - - ^ self - ]. - (tagType == 288) ifTrue:[ - "freeOffsets" - -"/ 'freeOffsets ' print. value printNewline. + "/ 'ycbr coeff' print. value printNewline. - ^ self - ]. - (tagType == 289) ifTrue:[ - "freeByteCounts" - -"/ 'freeByteCounts ' print. value printNewline. - - ^ self - ]. - (tagType == 290) ifTrue:[ - "grayResponceUnit" - -"/ 'grayResponceUnit' print. value printNewline. + ^ self + ]. + (tagType == 530) ifTrue:[ + "ycbr subsampling" - ^ self - ]. - (tagType == 291) ifTrue:[ - "grayResponceCurve" - -"/ 'grayResponceCurve' print. value printNewline. - - ^ self - ]. - (tagType == 292) ifTrue:[ - "group3options" - group3options := value. - -"/ 'group3options ' print. group3options printNewline. - - ^ self - ]. - (tagType == 293) ifTrue:[ - "group4options" - "group4options := value." - -"/ 'group4options ' print. value printNewline. + "/ 'ycbr subsampling' print. value printNewline. - ^ self - ]. - (tagType == 296) ifTrue:[ - "resolutionunit" + ^ self + ]. + (tagType == 531) ifTrue:[ + "ycbr positioning" -"/ (value == 1) ifTrue:[ -"/ 'res-unit pixel' printNewline -"/ ] ifFalse:[ -"/ (value == 2) ifTrue:[ -"/ 'res-unit inch' printNewline -"/ ] ifFalse:[ -"/ (value == 3) ifTrue:[ -"/ 'res-unit mm' printNewline -"/ ] ifFalse:[ -"/ 'res-unit invalid' printNewline -"/ ] -"/ ] -"/ ]. - - "resolutionUnit := value." - ^ self - ]. - (tagType == 297) ifTrue:[ - "pageNumber" - "pageNumber := value." - -"/ 'pageNumber ' print. value printNewline. - - ^ self - ]. - (tagType == 300) ifTrue:[ - "colorResponceUnit" - -"/ 'colorResponceUnit' print. value printNewline. + "/ 'ycbr positioning' print. value printNewline. - ^ self - ]. - (tagType == 301) ifTrue:[ - "colorResponceCurve" - -"/ 'colorResponceCurve' print. value printNewline. - - ^ self - ]. - (tagType == 305) ifTrue:[ - "software - info only" - -"/ 'software' print. value printNewline. + ^ self + ]. + (tagType == 532) ifTrue:[ + "referenceBlackWhite" - ^ self - ]. - (tagType == 306) ifTrue:[ - "dateTime - info only" - -"/ 'dateTime ' print. value printNewline. + "/ 'ycbr positioning' print. value printNewline. - ^ self - ]. - (tagType == 315) ifTrue:[ - "artist - info only" - -"/ 'artist ' print. value printNewline. - - ^ self - ]. - (tagType == 316) ifTrue:[ - "host computer - info only" - -"/ 'host ' print. value printNewline. - - ^ self + ^ self + ]. ]. - (tagType == 317) ifTrue:[ - "predictor" - predictor := value. + + (tagType > 32000) ifTrue:[ -"/ 'predictor ' print. predictor printNewline. + "/ Private Island graphics tags + (tagType == 32953) ifTrue:[ + "ref points" - ^ self - ]. - (tagType == 318) ifTrue:[ - "whitePoint" + "/ 'ref points' print. value printNewline. -"/ 'whitePoint ' print. value printNewline. + ^ self + ]. + (tagType == 32954) ifTrue:[ + "regionTagPoint" + + "/ 'regionTagPoint' print. value printNewline. - ^ self - ]. - (tagType == 319) ifTrue:[ - "primaryChromatics" + ^ self + ]. + (tagType == 32955) ifTrue:[ + "regionWarpCorners" -"/ 'primaryChromatics ' print. value printNewline. + "/ 'regionWarpCorners' print. value printNewline. - ^ self - ]. - (tagType == 320) ifTrue:[ - "colorMap" + ^ self + ]. + (tagType == 32956) ifTrue:[ + "regionAffine" -"/ 'colorMap (size=' print. valueArray size print. ')' printNewline. + "/ 'regionAffine' print. value printNewline. - " - the tiff colormap contains 16bit values; - our colormap expects 8bit values - " - n := valueArray size // 3. + ^ self + ]. + + + "/ Private SGI tags - rV := ByteArray uninitializedNew:n. - gV := ByteArray uninitializedNew:n. - bV := ByteArray uninitializedNew:n. - scaleFactor := 255.0 / 16rFFFF. - i2 := n+1. - i3 := 2*n+1. - 1 to:n do:[:vi | - val := ((valueArray at:vi) * scaleFactor) rounded. - rV at:vi put:val. - val := ((valueArray at:i2) * scaleFactor) rounded. - gV at:vi put:val. - val := ((valueArray at:i3) * scaleFactor) rounded. - bV at:vi put:val. - i2 := i2 + 1. - i3 := i3 + 1. + (tagType == 32995) ifTrue:[ + "matteing" + + "/ 'matteing' print. value printNewline. + + ^ self + ]. + (tagType == 32996) ifTrue:[ + "datatype" + + "/ 'datatype' print. value printNewline. + + ^ self ]. - colorMap := Colormap redVector:rV greenVector:gV blueVector:bV. - ^ self - ]. - (tagType == 332) ifTrue:[ - "ink set" + (tagType == 32997) ifTrue:[ + "imagedepth" + + "/ 'imagedepth' print. value printNewline. -"/ 'ink set' print. value printNewline. + ^ self + ]. + (tagType == 32998) ifTrue:[ + "tiledepth" - ^ self - ]. - (tagType == 333) ifTrue:[ - "ink names" + "/ 'tiledepth' print. value printNewline. -"/ 'ink names' print. value printNewline. + ^ self + ]. - ^ self - ]. - (tagType == 336) ifTrue:[ - "dot range" + "/ Private Pixar tags -"/ 'dot range' print. value printNewline. + (tagType == 33300) ifTrue:[ + "image full width" + + "/ 'image full width' print. value printNewline. - ^ self - ]. - (tagType == 337) ifTrue:[ - "target printer" + ^ self + ]. + (tagType == 33301) ifTrue:[ + "image full length" -"/ 'target printer' print. value printNewline. + "/ 'image full length' print. value printNewline. - ^ self - ]. - (tagType == 339) ifTrue:[ - "sample format" + ^ self + ]. + + "/ Private Eastman Kodak tags -"/ 'sample format' print. value printNewline. + (tagType == 33405) ifTrue:[ + "write serial number" + + "/ 'write serial number' print. value printNewline. - ^ self - ]. - (tagType == 340) ifTrue:[ - "min sample value" + ^ self + ]. + + "/ unknown -"/ 'min sample value' print. value printNewline. + (tagType == 33432) ifTrue:[ + "copyright" + + "/ 'copyright' print. value printNewline. - ^ self - ]. - (tagType == 341) ifTrue:[ - "max sample value" + ^ self + ]. -"/ 'max sample value' print. value printNewline. + "/ Private Texas instruments - ^ self - ]. - (tagType == 512) ifTrue:[ - "jpeg proc" + (tagType == 34232) ifTrue:[ + "sequence frame count" -"/ 'jpeg proc' print. value printNewline. + "/ 'sequence frame count' print. value printNewline. - ^ self - ]. - (tagType == 513) ifTrue:[ - "jpeg proc" + ^ self + ]. -"/ 'jpeg proc' print. value printNewline. + "/ Private Pixel magic + + (tagType == 34232) ifTrue:[ + "jbig options" - ^ self - ]. - (tagType == 32995) ifTrue:[ - "matteing" + "/ 'jbig options' print. value printNewline. + + ^ self + ]. -"/ 'matteing' print. value printNewline. + "/ More Private SGI + + (tagType == 34908) ifTrue:[ + "fax recv params" - ^ self - ]. - (tagType == 32996) ifTrue:[ - "datatype" + "/ 'fax recv params' print. value printNewline. -"/ 'datatype' print. value printNewline. + ^ self + ]. + (tagType == 34909) ifTrue:[ + "fax subaddress" + + "/ 'fax subaddress' print. value printNewline. - ^ self - ]. - (tagType == 32997) ifTrue:[ - "imagedepth" - -"/ 'imagedepth' print. value printNewline. + ^ self + ]. + (tagType == 34910) ifTrue:[ + "fax recv time" - ^ self - ]. - (tagType == 32998) ifTrue:[ - "tiledepth" + "/ 'fax recv time' print. value printNewline. -"/ 'tiledepth' print. value printNewline. - - ^ self + ^ self + ]. ]. "/ @@ -693,10 +995,10 @@ "/ 'TIFFReader [warning]: unknown tag type ' errorPrint. tagType errorPrintCR - "Modified: 31.1.1997 / 10:50:38 / cg" + "Modified: 11.4.1997 / 00:17:13 / cg" ! ! -!TIFFReader methodsFor:'private - reading'! +!TIFFReader methodsFor:'private - data reading'! readCCITT3RLETiffImageData 'TIFFReader [warning]: ccitt mod Huffman (rle) compression not implemented' errorPrintCR. @@ -777,48 +1079,25 @@ "Modified: 10.1.1997 / 19:10:59 / cg" ! -readChars:n - "read n characters and return them in a string" - - |oldPos offset string| - - n == 0 ifTrue:[^ '']. +readDCSTiffImageData + 'TIFFReader [warning]: dcs compression not implemented' errorPrintCR - string := String new:(n - 1). - (n <= 4) ifTrue:[ - inStream nextBytes:(n - 1) into:string - ] ifFalse:[ - offset := inStream nextLongMSB:(byteOrder ~~ #lsb). - oldPos := inStream position. - inStream position:(offset + 1). - inStream nextBytes:(n - 1) into:string. - inStream position:oldPos - ]. - ^ string - - "Modified: 5.9.1996 / 12:21:08 / cg" + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:30:54 / cg" ! -readFracts:nFracts - "read nFracts fractions (2 32bit words) and return them in an array" - - |oldPos offset values numerator denominator msb - n "{ Class: SmallInteger }" | - - n := nFracts. +readDeflateTiffImageData + 'TIFFReader [warning]: deflate compression not implemented' errorPrintCR - msb := byteOrder ~~ #lsb. - values := Array basicNew:n. - offset := inStream nextLongMSB:msb. - oldPos := inStream position. - inStream position:(offset + 1). - 1 to:n do:[:index | - numerator := inStream nextLongMSB:msb. - denominator := inStream nextLongMSB:msb. - values at:index put:(Fraction numerator:numerator denominator:denominator) - ]. - inStream position:oldPos. - ^ values + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:30:45 / cg" +! + +readJBIGTiffImageData + 'TIFFReader [warning]: jbig compression not implemented' errorPrintCR + + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:31:00 / cg" ! readJPEGTiffImageData @@ -908,30 +1187,6 @@ "Modified: 10.1.1997 / 18:13:21 / cg" ! -readLongs:nLongs - "read nLongs long numbers (32bit) and return them in an array" - - |oldPos offset values msb - n "{ Class: SmallInteger }" | - - n := nLongs. - - msb := byteOrder ~~ #lsb. - values := Array basicNew:n. - (n == 1) ifTrue:[ - values at:1 put:(inStream nextLongMSB:msb). - ] ifFalse:[ - offset := inStream nextLongMSB:msb. - oldPos := inStream position. - inStream position:(offset + 1). - 1 to:n do:[:index | - values at:index put:(inStream nextLongMSB:msb) - ]. - inStream position:oldPos - ]. - ^ values -! - readNeXTJPEGTiffImageData 'TIFFReader [warning]: jpeg compression not implemented' errorPrintCR @@ -953,33 +1208,88 @@ "Modified: 10.1.1997 / 18:10:57 / cg" ! -readShorts:nShorts - "read nShorts short numbers (16bit) and return them in an array" +readPixarFilmTiffImageData + 'TIFFReader [warning]: pixar film compression not implemented' errorPrintCR - |oldPos offset values msb val2 - n "{ Class: SmallInteger }" | + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:30:33 / cg" +! + +readPixarLogTiffImageData + 'TIFFReader [warning]: pixar log compression not implemented' errorPrintCR - n := nShorts. + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:30:39 / cg" +! - msb := (byteOrder ~~ #lsb). - values := Array basicNew:n. - (n <= 2) ifTrue:[ - values at:1 put:(inStream nextUnsignedShortMSB:msb). - val2 := inStream nextUnsignedShortMSB:msb. +readThunderScanTiffImageData + 'TIFFReader [warning]: thunderScan compression not implemented' errorPrintCR + + "Modified: 10.1.1997 / 18:11:04 / cg" + "Created: 11.4.1997 / 00:30:23 / cg" +! - (n == 2) ifTrue:[ - values at:2 put:val2 - ] - ] ifFalse:[ - offset := inStream nextLongMSB:msb. - oldPos := inStream position. - inStream position:(offset + 1). - 1 to:n do:[:index | - values at:index put:(inStream nextUnsignedShortMSB:msb) - ]. - inStream position:oldPos +readTiffImageData + (compression == 1) ifTrue:[ + ^ self readUncompressedTiffImageData. + ]. + (compression == 2) ifTrue:[ + ^ self readCCITT3RLETiffImageData. + ]. + (compression == 3) ifTrue:[ + ^ self readCCITTGroup3TiffImageData. + ]. + (compression == 4) ifTrue:[ + ^ self readCCITTGroup4TiffImageData. + ]. + (compression == 5) ifTrue:[ + ^ self readLZWTiffImageData. + ]. + (compression == 6) ifTrue:[ + ^ self readJPEGTiffImageData. + ]. + (compression == 7) ifTrue:[ + ^ self readNewJPEGTiffImageData. + ]. + + (compression == 32766) ifTrue:[ + ^ self readNeXTRLE2TiffImageData. + ]. + (compression == 32771) ifTrue:[ + ^ self readCCITTRLEWTiffImageData. ]. - ^ values + (compression == 32773) ifTrue:[ + ^ self readPackbitsTiffImageData. + ]. + (compression == 32809) ifTrue:[ + ^ self readThunderScanTiffImageData. + ]. + (compression == 32908) ifTrue:[ + ^ self readPixarFilmTiffImageData. + ]. + (compression == 32909) ifTrue:[ + ^ self readPixarLogTiffImageData. + ]. + (compression == 32946) ifTrue:[ + ^ self readDeflateTiffImageData. + ]. + (compression == 32947) ifTrue:[ + ^ self readDCSTiffImageData. + ]. + (compression == 32865) ifTrue:[ + ^ self readNeXTJPEGTiffImageData. + ]. + (compression == 34661) ifTrue:[ + ^ self readJBIGTiffImageData. + ]. + + 'TIFFReader [warning]: compression type ' errorPrint. compression errorPrint. + ' not known' errorPrintCR. + + ^ nil. + + "Created: 11.4.1997 / 00:19:44 / cg" + "Modified: 11.4.1997 / 00:29:54 / cg" ! readUncompressedTiffImageData @@ -1056,6 +1366,105 @@ "Modified: 10.1.1997 / 18:10:46 / cg" ! ! +!TIFFReader methodsFor:'private - reading'! + +readChars:n + "read n characters and return them in a string" + + |oldPos offset string| + + n == 0 ifTrue:[^ '']. + + string := String new:(n - 1). + (n <= 4) ifTrue:[ + inStream nextBytes:(n - 1) into:string + ] ifFalse:[ + offset := inStream nextLongMSB:(byteOrder ~~ #lsb). + oldPos := inStream position. + inStream position:(offset + 1). + inStream nextBytes:(n - 1) into:string. + inStream position:oldPos + ]. + ^ string + + "Modified: 5.9.1996 / 12:21:08 / cg" +! + +readFracts:nFracts + "read nFracts fractions (2 32bit words) and return them in an array" + + |oldPos offset values numerator denominator msb + n "{ Class: SmallInteger }" | + + n := nFracts. + + msb := byteOrder ~~ #lsb. + values := Array basicNew:n. + offset := inStream nextLongMSB:msb. + oldPos := inStream position. + inStream position:(offset + 1). + 1 to:n do:[:index | + numerator := inStream nextLongMSB:msb. + denominator := inStream nextLongMSB:msb. + values at:index put:(Fraction numerator:numerator denominator:denominator) + ]. + inStream position:oldPos. + ^ values +! + +readLongs:nLongs + "read nLongs long numbers (32bit) and return them in an array" + + |oldPos offset values msb + n "{ Class: SmallInteger }" | + + n := nLongs. + + msb := byteOrder ~~ #lsb. + values := Array basicNew:n. + (n == 1) ifTrue:[ + values at:1 put:(inStream nextLongMSB:msb). + ] ifFalse:[ + offset := inStream nextLongMSB:msb. + oldPos := inStream position. + inStream position:(offset + 1). + 1 to:n do:[:index | + values at:index put:(inStream nextLongMSB:msb) + ]. + inStream position:oldPos + ]. + ^ values +! + +readShorts:nShorts + "read nShorts short numbers (16bit) and return them in an array" + + |oldPos offset values msb val2 + n "{ Class: SmallInteger }" | + + n := nShorts. + + msb := (byteOrder ~~ #lsb). + values := Array basicNew:n. + (n <= 2) ifTrue:[ + values at:1 put:(inStream nextUnsignedShortMSB:msb). + val2 := inStream nextUnsignedShortMSB:msb. + + (n == 2) ifTrue:[ + values at:2 put:val2 + ] + ] ifFalse:[ + offset := inStream nextLongMSB:msb. + oldPos := inStream position. + inStream position:(offset + 1). + 1 to:n do:[:index | + values at:index put:(inStream nextUnsignedShortMSB:msb) + ]. + inStream position:oldPos + ]. + ^ values +! ! + !TIFFReader methodsFor:'private - writing'! writeBitsPerSample @@ -1445,7 +1854,7 @@ tagType "{ Class: SmallInteger }" numberType "{ Class: SmallInteger }" length "{ Class: SmallInteger }" - result offset ok msb + result offset msb bitsPerPixel bytesPerRow offset1 offset2 tmp| inStream := aStream. @@ -1509,25 +1918,24 @@ ]. "check for required tags" - ok := true. width isNil ifTrue:[ 'TIFFReader [warning]: missing width tag' errorPrintCR. - ok := false + ^ nil ]. height isNil ifTrue:[ 'TIFFReader [warning]: missing length tag' errorPrintCR. - ok := false + ^ nil ]. photometric isNil ifTrue:[ 'TIFFReader [warning]: missing photometric tag' errorPrintCR. - ok := false + ^ nil ]. stripOffsets isNil ifTrue:[ 'TIFFReader [warning]: missing stripOffsets tag' errorPrintCR. - ok := false + ^ nil ]. stripByteCounts isNil ifTrue:[ @@ -1538,10 +1946,6 @@ stripByteCounts isNil ifTrue:[ 'TIFFReader [warning]: missing stripByteCounts tag' errorPrintCR. - ok := false - ]. - - ok ifFalse:[ ^ nil ]. @@ -1555,77 +1959,35 @@ rowsPerStrip := height ]. - ok := false. - (compression == 1) ifTrue:[ - result := self readUncompressedTiffImageData. - ok := true - ]. - (compression == 2) ifTrue:[ - result := self readCCITT3RLETiffImageData. - ok := true - ]. - (compression == 3) ifTrue:[ - result := self readCCITTGroup3TiffImageData. - ok := true - ]. - (compression == 4) ifTrue:[ - result := self readCCITTGroup4TiffImageData. - ok := true - ]. - (compression == 5) ifTrue:[ - result := self readLZWTiffImageData. - ok := true - ]. - (compression == 6) ifTrue:[ - result := self readJPEGTiffImageData. - ok := true - ]. - (compression == 32766) ifTrue:[ - result := self readNeXTRLE2TiffImageData. - ok := true - ]. - (compression == 32771) ifTrue:[ - result := self readCCITTRLEWTiffImageData. - ok := true - ]. - (compression == 32773) ifTrue:[ - result := self readPackbitsTiffImageData. - ok := true - ]. - (compression == 32865) ifTrue:[ - result := self readNeXTJPEGTiffImageData. - ok := true - ]. - ok ifFalse:[ - 'TIFFReader [warning]: compression type ' errorPrint. compression errorPrint. - ' not known' errorPrintCR - ]. + result := self readTiffImageData. + result notNil ifTrue:[ + + orientation == #vFlip ifTrue:[ + "/ reverse rows to top-to bottom - orientation == #vFlip ifTrue:[ - "/ reverse rows to top-to bottom - - bytesPerRow := self bytesPerRow. - tmp := ByteArray new:bytesPerRow. - offset1 := 1. - offset2 := (height-1)*bytesPerRow + 1. - 0 to:(height-1//2) do:[:row | - tmp replaceFrom:1 to:bytesPerRow - with:data startingAt:offset1. - data replaceFrom:offset1 to:offset1+bytesPerRow-1 - with:data startingAt:offset2. - data replaceFrom:offset2 to:offset2+bytesPerRow-1 - with:tmp startingAt:1. - offset1 := offset1 + bytesPerRow. - offset2 := offset2 - bytesPerRow. + bytesPerRow := self bytesPerRow. + tmp := ByteArray new:bytesPerRow. + offset1 := 1. + offset2 := (height-1)*bytesPerRow + 1. + 0 to:(height-1//2) do:[:row | + tmp replaceFrom:1 to:bytesPerRow + with:data startingAt:offset1. + data replaceFrom:offset1 to:offset1+bytesPerRow-1 + with:data startingAt:offset2. + data replaceFrom:offset2 to:offset2+bytesPerRow-1 + with:tmp startingAt:1. + offset1 := offset1 + bytesPerRow. + offset2 := offset2 - bytesPerRow. + ]. ]. - ]. - orientation == #unsupported ifTrue:[ - 'TIFFReader [warning]: unsupported orientation' errorPrintCR + orientation == #unsupported ifTrue:[ + 'TIFFReader [warning]: unsupported orientation' errorPrintCR + ]. ]. ^ result - "Modified: 31.1.1997 / 10:51:27 / cg" + "Modified: 11.4.1997 / 00:21:58 / cg" ! ! !TIFFReader methodsFor:'writing to file'! @@ -1730,6 +2092,6 @@ !TIFFReader class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libview2/TIFFReader.st,v 1.50 1997-02-27 11:50:14 cg Exp $' + ^ '$Header: /cvs/stx/stx/libview2/TIFFReader.st,v 1.51 1997-04-10 22:42:03 cg Exp $' ! ! TIFFReader initialize!