TIFFReader.st
changeset 35 f13cdd0b44c7
parent 32 6bdcb6da4d4f
child 38 201df32d2377
--- a/TIFFReader.st	Mon Feb 06 01:36:28 1995 +0100
+++ b/TIFFReader.st	Mon Feb 06 01:37:58 1995 +0100
@@ -27,7 +27,7 @@
 COPYRIGHT (c) 1991 by Claus Gittinger
 	      All Rights Reserved
 
-$Header: /cvs/stx/stx/libview2/TIFFReader.st,v 1.13 1994-11-17 14:29:48 claus Exp $
+$Header: /cvs/stx/stx/libview2/TIFFReader.st,v 1.14 1995-02-06 00:37:58 claus Exp $
 '!
 
 !TIFFReader class methodsFor:'documentation'!
@@ -48,7 +48,7 @@
 
 version
 "
-$Header: /cvs/stx/stx/libview2/TIFFReader.st,v 1.13 1994-11-17 14:29:48 claus Exp $
+$Header: /cvs/stx/stx/libview2/TIFFReader.st,v 1.14 1995-02-06 00:37:58 claus Exp $
 "
 !
 
@@ -119,7 +119,7 @@
      tagType      "{ Class: SmallInteger }"
      numberType   "{ Class: SmallInteger }"
      length       "{ Class: SmallInteger }"
-     result offset ok|
+     result offset ok msb|
 
     inStream := self class streamReadingFile:aFileName.
     inStream isNil ifTrue:[^ nil].
@@ -132,10 +132,12 @@
 	^ nil
     ].
     (char1 == $I) ifTrue:[
-	byteOrder := #lsb
+	byteOrder := #lsb.
+	msb := false.
     ] ifFalse:[
 	(char1 == $M) ifTrue:[
-	    byteOrder := #msb
+	    byteOrder := #msb.
+	    msb := true.
 	] ifFalse:[
 	    'TIFFReader: not a tiff file' errorPrintNL.
 	    inStream close.
@@ -167,18 +169,18 @@
     "resolutionUnit := 2."
     predictor := 1.
 
-    offset := self readLong + 1.
-    inStream position:offset.
+    offset := inStream nextLongMSB:msb.
+    inStream position:offset + 1.
 
     numberOfTags := self readShort.
     1 to:numberOfTags do:[:index |
 	tagType := self readShort.
 	numberType := self readShort.
-	length := self readLong.
+	length := inStream nextLongMSB:msb.
 	self decodeTiffTag:tagType numberType:numberType length:length
     ].
 
-    offset := self readLong.
+    offset := inStream nextLongMSB:msb.
     (offset ~~ 0) ifTrue:[
 	'TIFFReader: more tags ignored' errorPrintNL
     ].
@@ -361,17 +363,18 @@
 !TIFFReader methodsFor:'private'!
 
 readLongs:n
-    |oldPos offset values|
+    |oldPos offset values msb|
 
+    msb := byteOrder ~~ #lsb.
     values := Array new:n.
     (n == 1) ifTrue:[
-	values at:1 put:self readLong.
+	values at:1 put:(inStream nextLongMSB:msb).
     ] ifFalse:[
-	offset := self readLong.
+	offset := inStream nextLongMSB:msb.
 	oldPos := inStream position.
 	inStream position:(offset + 1).
 	1 to:n do:[:index |
-	    values at:index put:self readLong
+	    values at:index put:(inStream nextLongMSB:msb)
 	].
 	inStream position:oldPos
     ].
@@ -385,22 +388,23 @@
 !
 
 readShorts:n
-    |oldPos offset values|
+    |oldPos offset values msb|
 
+    msb := (byteOrder ~~ #lsb).
     values := Array new:n.
     (n <= 2) ifTrue:[
-	values at:1 put:self readShort.
+	values at:1 put:(inStream nextUnsignedShortMSB:msb).
 	(n == 2) ifTrue:[
-	    values at:2 put:self readShort
+	    values at:2 put:(inStream nextUnsignedShortMSB:msb)
 	] ifFalse:[
-	    self readShort
+	    (inStream nextUnsignedShortMSB:msb)
 	]
     ] ifFalse:[
-	offset := self readLong.
+	offset := inStream nextLongMSB:msb.
 	oldPos := inStream position.
 	inStream position:(offset + 1).
 	1 to:n do:[:index |
-	    values at:index put:self readShort
+	    values at:index put:(inStream nextUnsignedShortMSB:msb)
 	].
 	inStream position:oldPos
     ].
@@ -414,7 +418,7 @@
     (n <= 4) ifTrue:[
 	inStream nextBytes:(n - 1) into:string
     ] ifFalse:[
-	offset := self readLong.
+	offset := inStream nextLongMSB:(byteOrder ~~ #lsb).
 	oldPos := inStream position.
 	inStream position:(offset + 1).
 	inStream nextBytes:(n - 1) into:string.
@@ -424,15 +428,16 @@
 !
 
 readFracts:cnt
-    |oldPos offset values n d|
+    |oldPos offset values n d msb|
 
+    msb := byteOrder ~~ #lsb.
     values := Array new:cnt.
-    offset := self readLong.
+    offset := inStream nextLongMSB:msb.
     oldPos := inStream position.
     inStream position:(offset + 1).
     1 to:cnt do:[:index |
-	n := self readLong.
-	d := self readLong.
+	n := inStream nextLongMSB:msb.
+	d := inStream nextLongMSB:msb.
 	values at:index put:(Fraction numerator:n denominator:d)
     ].
     inStream position:oldPos.
@@ -441,8 +446,12 @@
 
 decodeTiffTag:tagType numberType:numberType length:length
     |offset value valueArray 
-     val map scaleFactor
-     n "{ Class: SmallInteger }" |
+     val map scaleFactor rV gV bV
+     n "{ Class: SmallInteger }"
+     i "{ Class: SmallInteger }"
+     i1 "{ Class: SmallInteger }"
+     i2 "{ Class: SmallInteger }"
+     i3 "{ Class: SmallInteger }" |
 
     (numberType == 3) ifTrue:[
 	"short"
@@ -463,7 +472,7 @@
 		    valueArray := self readFracts:length.
 		    value := valueArray at:1
 		] ifFalse:[
-		    offset := self readLong
+		    offset := (inStream nextLongMSB:(byteOrder ~~ #lsb))
 		]
 	    ]
 	]
@@ -876,21 +885,42 @@
 "
 	'colorMap (size=' print. valueArray size print. ')' printNewline.
 "
+	"
+	 the tiff colormap contains 16bit values;
+	 our colormap expects 8bit values
+	"
 	n := valueArray size // 3.
-	colorMap := Array new:3.
-	colorMap at:1 put:(valueArray copyFrom:1 to:n).
-	colorMap at:2 put:(valueArray copyFrom:n+1 to:2*n).
-	colorMap at:3 put:(valueArray copyFrom:2*n+1 to:3*n).
+"/        colorMap := Array new:3.
+"/        colorMap at:1 put:(valueArray copyFrom:1 to:n).
+"/        colorMap at:2 put:(valueArray copyFrom:n+1 to:2*n).
+"/        colorMap at:3 put:(valueArray copyFrom:2*n+1 to:3*n).
+"/        scaleFactor := 255.0 / 16rFFFF.
+"/        1 to:3 do:[:c |
+"/            map := colorMap at:c.
+"/            1 to:n do:[:e |
+"/                val := map at:e.
+"/                val := (val * scaleFactor) rounded.
+"/                map at:e put:val
+"/            ]
+"/        ].
 
+	rV := ByteArray uninitializedNew:n.
+	gV := ByteArray uninitializedNew:n.
+	bV := ByteArray uninitializedNew:n.
 	scaleFactor := 255.0 / 16rFFFF.
-	1 to:3 do:[:c |
-	    map := colorMap at:c.
-	    1 to:n do:[:e |
-		val := map at:e.
-		val := (val * scaleFactor) rounded.
-		map at:e put:val
-	    ]
+	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 == 332) ifTrue:[
@@ -1027,16 +1057,21 @@
     |n|
 
     colorMapPos := outStream position.
-    colorMap do:[:subMap |
+    #(red green blue) do:[:component |
 	n := 0.
-	subMap do:[:entry |
-	    "my maps are 8 bit - tiff map is 16 bit"
-	    entry isNil ifTrue:[
-		"unused map entry"
-		self writeShort:0
+	colorMap do:[:clr |
+	    |entry|
+
+	    clr isNil ifTrue:[
+		entry := 0
 	    ] ifFalse:[
-		self writeShort:(entry / 255 * 16rFFFF) rounded
+		entry := clr perform:component.
+		"
+		 tiff map is 16 bit - scale from percent to 0..16rFFFF
+		"
+		entry := (entry * 16rFFFF / 100) rounded.
 	    ].
+	    self writeShort:entry.
 	    n := n + 1
 	].
 	"