--- 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
].
"