--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SunRasterReader.st Fri Jul 16 11:42:12 1993 +0200
@@ -0,0 +1,135 @@
+"
+ COPYRIGHT (c) 1993 by Claus Gittinger
+ All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice. This software may not
+ be provided or otherwise made available to, or used by, any
+ other person. No title to or ownership of the software is
+ hereby transferred.
+"
+
+ImageReader subclass:#SunRasterReader
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Graphics-Support'
+!
+
+SunRasterReader comment:'
+
+COPYRIGHT (c) 1993 by Claus Gittinger
+ All Rights Reserved
+
+this class provides methods for loading Sun Raster file images
+
+%W% %E%
+written Summer 91 by claus
+'!
+
+!SunRasterReader methodsFor:'reading from file'!
+
+fromFile: aFilename
+ | rasterType mapType mapBytes imageWords form depth
+ rMap gMap bMap mapLen
+ bits a b c index|
+
+ inStream := FileStream readonlyFileNamed:aFilename.
+ inStream isNil ifTrue:[
+ 'open error' printNewline.
+ ^ nil
+ ].
+
+ inStream binary.
+
+ ((inStream nextWord = 16r59A6)
+ and:[inStream nextWord = 16r6A95]) ifFalse: [
+"
+ inStream nextLong = 16r59A66A95 ifFalse: [
+"
+ inStream close.
+ self error: 'Not a Sun Raster File (bad magic number)'
+ ].
+
+ width := inStream nextLong.
+ height := inStream nextLong.
+
+ depth := inStream nextLong.
+ inStream nextLong. "Ignore the image length since I can't rely on it anyway."
+ rasterType _ inStream nextLong.
+ mapType := inStream nextLong. "Ignore the raster maptype."
+ mapBytes := inStream nextLong.
+
+ depth = 8 ifTrue: [
+ mapLen := (mapBytes // 3).
+ rMap := ByteArray new:mapLen.
+ gMap := ByteArray new:mapLen.
+ bMap := ByteArray new:mapLen.
+ inStream nextBytes:mapLen into:rMap.
+ inStream nextBytes:mapLen into:gMap.
+ inStream nextBytes:mapLen into:bMap.
+
+ data := ByteArray new:(width * height).
+ inStream nextBytes:(width * height) into:data.
+
+ photometric := #palette.
+ samplesPerPixel := 1.
+ bitsPerSample := #(8).
+ colorMap := Array with:rMap with:gMap with:bMap.
+ inStream close.
+ ^ self
+ ].
+ depth ~~ 1 ifTrue: [
+ inStream close.
+ self error: 'Raster file is not monochrome'
+ ].
+
+ form := nil.
+
+ inStream skip: mapBytes. "Skip the color map."
+ imageWords _ (width / 16) ceiling * height.
+ data := ByteArray new:(imageWords * 2).
+
+ (rasterType between: 0 and: 2) ifFalse: [
+ inStream close.
+ self error: 'Unknown raster file rasterType'
+ ].
+
+ (rasterType = 2) ifFalse: [
+ "no compression of bytes"
+ inStream nextBytes:(imageWords * 2) into:data
+ ] ifTrue: [
+ "run length compression of bytes"
+
+ bits _ ByteArray new: imageWords * 2.
+ index := 1.
+ a _ inStream next.
+ [a notNil] whileTrue: [
+ (a = 128) ifFalse: [
+ bits at:index put: a.
+ index := index + 1
+ ] ifTrue: [
+ b _ inStream next.
+ b = 0 ifTrue: [
+ bits at:index put:128 .
+ index := index + 1
+ ] ifFalse: [
+ c := inStream next.
+ 1 to:(b+1) do:[:i |
+ bits at:index put:c.
+ index := index + 1
+ ]
+ ]
+ ].
+ a _ inStream next
+ ].
+ 1 to: imageWords do: [:i | form bitsWordAt: i put: (bits wordAt: i)]
+ ].
+ photometric := #whiteIs0.
+ samplesPerPixel := 1.
+ bitsPerSample := #(1).
+ inStream close
+
+ "Image fromFile:'../fileIn/bitmaps/founders.im8'"
+! !