WindowsIconReader.st
changeset 41 66edc847b9c8
parent 36 3a7ec58dff8e
child 53 4f5e734bc59f
--- a/WindowsIconReader.st	Sat Feb 18 16:32:43 1995 +0100
+++ b/WindowsIconReader.st	Sat Feb 18 16:52:52 1995 +0100
@@ -21,7 +21,7 @@
 COPYRIGHT (c) 1993 by Claus Gittinger
 	      All Rights Reserved
 
-$Header: /cvs/stx/stx/libview2/WindowsIconReader.st,v 1.10 1995-02-06 00:39:48 claus Exp $
+$Header: /cvs/stx/stx/libview2/WindowsIconReader.st,v 1.11 1995-02-18 15:52:37 claus Exp $
 '!
 
 !WindowsIconReader class methodsFor:'documentation'!
@@ -42,7 +42,7 @@
 
 version
 "
-$Header: /cvs/stx/stx/libview2/WindowsIconReader.st,v 1.10 1995-02-06 00:39:48 claus Exp $
+$Header: /cvs/stx/stx/libview2/WindowsIconReader.st,v 1.11 1995-02-18 15:52:37 claus Exp $
 "
 !
 
@@ -60,43 +60,57 @@
     Image fileFormats at:'.ico'  put:self.
 ! !
 
-!WindowsIconReader methodsFor:'reading from file'!
+!WindowsIconReader class methodsFor:'reading from file'!
 
 fromOS2File: aFilename 
-    inStream := self class streamReadingFile:aFilename.
-    inStream isNil ifTrue:[^ nil].
-    inStream binary.
-    ^ self fromOS2Stream.
+    |reader stream|
+
+    stream := self streamReadingFile:aFilename.
+    stream isNil ifTrue:[^ nil].
+    reader := (self new) fromOS2Stream:aStream.
+    stream close.
+    reader notNil ifTrue:[^ reader image].
+    ^ nil
 !
 
 fromWindowsBMPFile: aFilename 
-    inStream := self class streamReadingFile:aFilename.
-    inStream isNil ifTrue:[^ nil].
-    inStream binary.
-    ^ self fromWindowsBMPStream.
+    |reader stream|
+
+    stream := self class streamReadingFile:aFilename.
+    stream isNil ifTrue:[^ nil].
+    reader := (self new) fromWindowsBMPStream:aStream.
+    stream close.
+    reader notNil ifTrue:[^ reader image].
+    ^ nil
 !
 
 fromWindowsICOFile: aFilename 
-    inStream := self class streamReadingFile:aFilename.
-    inStream isNil ifTrue:[^ nil].
-    ^ self fromWindowsICOStream.
+    |reader stream|
+
+    stream := self class streamReadingFile:aFilename.
+    stream isNil ifTrue:[^ nil].
+    reader := (self new) fromWindowsICOStream:aStream.
+    stream close.
+    reader notNil ifTrue:[^ reader image].
+    ^ nil
 
     "
      Image fromFile:'/phys/clam2//LocalLibrary/Images/WIN_icons/ibm.ico'.
     "
 !
 
-fromWindowsICOStream
+fromWindowsICOStream:aStream
     | header inDepth
       rawMap rMap gMap bMap srcIndex dstIndex
       data4 mask tmp bytesPerRow nColor|
 
-    inStream binary.
+    inStream := aStream.
+    aStream binary.
 
     "read the header"
 
     header := ByteArray uninitializedNew:(6 + 16 + 40).
-    inStream nextBytes:(6 + 16 + 40) into:header.
+    aStream nextBytes:(6 + 16 + 40) into:header.
     width := header at:(6+1).
     height := header at:(7+1).
     nColor := header at:(8+1).
@@ -110,7 +124,7 @@
     "read the colormap"
 
     rawMap := ByteArray uninitializedNew:(16*4).
-    inStream nextBytes:(16*4) into:rawMap.
+    aStream nextBytes:(16*4) into:rawMap.
     rMap := Array new:16.
     gMap := Array new:16.
     bMap := Array new:16.
@@ -129,13 +143,13 @@
 
     bytesPerRow := width * inDepth + 7 // 8.
     data4 := ByteArray uninitializedNew:(height * bytesPerRow).
-    inStream nextBytes:(height * bytesPerRow) into:data4.
+    aStream nextBytes:(height * bytesPerRow) into:data4.
 
     "read mask"
 
 "
     mask := ByteArray new:(width * height / 8).
-    inStream nextBytes:(width * height / 8) into:mask.
+    aStream nextBytes:(width * height / 8) into:mask.
 "
 
     "stupid: last row first"
@@ -160,27 +174,28 @@
     photometric := #palette.
     samplesPerPixel := 1.
     bitsPerSample := #(8).
-"/    colorMap := Array with:rMap with:gMap with:bMap.
     colorMap := Colormap redVector:rMap greenVector:gMap blueVector:bMap.
-    inStream close.
 
     "
      WindowsIconReader new fromWindowsICOFile:'/phys/clam2//LocalLibrary/Images/WIN_icons/ibm.ico'.
     "
 !
 
-fromWindowsBMPStream 
+fromWindowsBMPStream:aStream 
     | fileSize header inDepth inPlanes compression
       imgSize resH resV numColor numImportantColor
       dataStart
       rawMap rMap gMap bMap srcIndex dstIndex
       data4 mask tmp bytesPerRow fourBytesPerColorInfo|
 
-    fileSize := inStream size.
+    inStream := aStream.
+    aStream binary.
+
+    fileSize := aStream size.
     "read the header"
 
     header := ByteArray uninitializedNew:16r54.
-    inStream nextBytes:18 into:header.
+    aStream nextBytes:18 into:header.
 
     ((header at:(16r0E + 1)) == 40) ifTrue:[    "header-size"
 	"
@@ -189,7 +204,7 @@
 	"
 	'BMP: Win3.x or OS/2 vsn 2 format' errorPrintNL.
 
-	inStream nextBytes:(40-4) into:header startingAt:19.
+	aStream nextBytes:(40-4) into:header startingAt:19.
 
 	width := header wordAt:(16r12 + 1).  "(header at:19) + ((header at:20) * 256).   "
 	height := header wordAt:(16r16 + 1). "(header at:23) + ((header at:24) * 256).   "
@@ -210,7 +225,7 @@
 	    'BMP: missing nColor in header - assume ' errorPrint. numColor errorPrintNL
 	].
 	rawMap := ByteArray uninitializedNew:(numColor * 4).
-	inStream nextBytes:(numColor * 4) into:rawMap.
+	aStream nextBytes:(numColor * 4) into:rawMap.
 	fourBytesPerColorInfo := true.
 	dataStart := header wordAt:(16r0A + 1)
     ] ifFalse:[
@@ -219,7 +234,7 @@
 	     its an OS/2 (vsn1.2) BMP file
 	    "
 	   'BMP: OS/2 vsn 1.2 format' errorPrintNL.
-	    inStream nextBytes:(12-4) into:header startingAt:19.
+	    aStream nextBytes:(12-4) into:header startingAt:19.
 
 	    width := header wordAt:(16r12 + 1).  "(header at:19) + ((header at:20) * 256).   "
 	    height := header wordAt:(16r14 + 1). "(header at:21) + ((header at:22) * 256).   "
@@ -227,13 +242,12 @@
 	    inDepth := header wordAt:(16r18 + 1).
 	    numColor := 1 bitShift:inDepth.
 	    rawMap := ByteArray uninitializedNew:(numColor * 3).
-	    inStream nextBytes:(numColor * 3) into:rawMap.
+	    aStream nextBytes:(numColor * 3) into:rawMap.
 	    fourBytesPerColorInfo := false.
 	    compression := 0.
 	    dataStart := header wordAt:(16r0A + 1)
 	] ifFalse:[
 	    'BMP: unknown format' errorPrintNL.
-	    inStream close.
 	    ^ nil
 	].
     ].
@@ -263,12 +277,10 @@
     compression ~~ 0 ifTrue:[
 	'BMP compression type ' errorPrint. compression errorPrint.
 	'not supported' errorPrintNL.
-	inStream close.
 	^ nil
     ].
     inPlanes ~~ 1 ifTrue:[
 	'BMP only 1 plane images supported' errorPrintNL.
-	inStream close.
 	^ nil
     ].
 
@@ -277,14 +289,14 @@
     bytesPerRow := width * inDepth + 7 // 8.
     data4 := ByteArray uninitializedNew:(height * bytesPerRow).
 
-    inStream position:(dataStart + 1).
-    inStream nextBytes:(height * bytesPerRow) into:data4.
+    aStream position:(dataStart + 1).
+    aStream nextBytes:(height * bytesPerRow) into:data4.
 
     "read mask"
 
 "
     mask := ByteArray new:(width * height / 8).
-    inStream nextBytes:(width * height / 8) into:mask.
+    aStream nextBytes:(width * height / 8) into:mask.
 "
 
     "stupid: last row first"
@@ -309,56 +321,51 @@
     photometric := #palette.
     samplesPerPixel := 1.
     bitsPerSample := #(8).
-"/    colorMap := Array with:rMap with:gMap with:bMap.
     colorMap := Colormap redVector:rMap greenVector:gMap blueVector:bMap.
-    inStream close.
 !
 
-fromFile: aFilename 
+fromStream:aStream 
     | fileSize header |
 
-    inStream := self class streamReadingFile:aFilename.
-    inStream isNil ifTrue:[^ nil].
+    inStream := aStream.
 
-    inStream binary.
-    fileSize := inStream size.
+    aStream binary.
+    fileSize := aStream size.
 
     fileSize < 16 ifTrue:[
-	inStream close.
-	self error:'WINREADER: short file'.
+	'WINREADER: short file' errorPrintNL.
 	^ nil
     ].
 
     header := ByteArray uninitializedNew:4.
-    inStream nextBytes:4 into:header.
+    aStream nextBytes:4 into:header.
 
     (header startsWith:#(66 77)) ifTrue:[     "BM"
-	inStream position:1.
+	aStream position:1.
 	'WINREADER: Win3.x or OS/2 vsn 2 BM format' errorPrintNL.
-	^ self fromWindowsBMPStream
+	^ self fromWindowsBMPStream:aStream
     ].
     (header startsWith:#(66 65)) ifTrue:[     "BA"
-	inStream position:1.
+	aStream position:1.
 	'WINREADER: OS/2 vsn 2 BA format' errorPrintNL.
-	^ self fromOS2Stream
+	^ self fromOS2Stream:aStream
     ].
     (header startsWith:#(73 67)) ifTrue:[     "IC"
-	inStream position:1.
+	aStream position:1.
 	'WINREADER: OS/2 IC format' errorPrintNL.
-	^ self fromOS2Stream
+	^ self fromOS2Stream:aStream
     ].
     (header startsWith:#(80 84)) ifTrue:[     "PT"
-	inStream position:1.
+	aStream position:1.
 	'WINREADER: OS/2 PT format' errorPrintNL.
-	^ self fromOS2Stream
+	^ self fromOS2Stream:aStream
     ].
     (header startsWith:#(0 0 1 0)) ifTrue:[
-	inStream position:1.
+	aStream position:1.
 	'WINREADER: Win3.x ICO format' errorPrintNL.
-	^ self fromWindowsICOStream
+	^ self fromWindowsICOStream:aStream
     ].
-    self error:'WINREADER: format not supported'.
-    inStream close.
+    'WINREADER: format not supported' errorPrintNL.
     ^ nil
 
     "
@@ -366,26 +373,27 @@
     "
 !
 
-fromOS2Stream 
+fromOS2Stream:aStream
     | header inDepth
       rawMap rMap gMap bMap srcIndex dstIndex
       data4 mask tmp bytesPerRow nColors nByte|
 
-    inStream binary.
+    inStream := aStream.
+    aStream binary.
 
     "read the header"
 
     header := ByteArray uninitializedNew:8r110.
-    inStream nextBytes:16 into:header.
+    aStream nextBytes:16 into:header.
 
     (header startsWith:#(73 67)) ifTrue:[
 	"IC format"
-	inStream nextBytes:10 into:header startingAt:17.
+	aStream nextBytes:10 into:header startingAt:17.
 	width := header at:7.
 	height := header at:9.
 	inDepth := 2 "header at:11". "where is it"
     ] ifFalse:[
-	inStream nextBytes:(8r110-16) into:header startingAt:17.
+	aStream nextBytes:(8r110-16) into:header startingAt:17.
 	width := header at:8r101.
 	height := header at:8r103.
 	inDepth := header at:8r107.
@@ -396,7 +404,7 @@
     nColors := 1 bitShift:inDepth.
 
     rawMap := ByteArray uninitializedNew:(nColors*3).
-    inStream nextBytes:(nColors*3) into:rawMap.
+    aStream nextBytes:(nColors*3) into:rawMap.
     rMap := Array new:nColors.
     gMap := Array new:nColors.
     bMap := Array new:nColors.
@@ -414,17 +422,17 @@
 
     nByte := width * height + 7 // 8.
     mask := ByteArray uninitializedNew:nByte.
-    inStream nextBytes:nByte into:mask.
+    aStream nextBytes:nByte into:mask.
 
     "what is this"
 
-    inStream nextBytes:nByte into:mask.
+    aStream nextBytes:nByte into:mask.
 
     "read the data bits"
 
     bytesPerRow := width * inDepth + 7 // 8.
     data4 := ByteArray uninitializedNew:(height * bytesPerRow).
-    inStream nextBytes:(height * bytesPerRow) into:data4.
+    aStream nextBytes:(height * bytesPerRow) into:data4.
 
     "stupid: last row first"
 
@@ -448,9 +456,7 @@
     photometric := #palette.
     samplesPerPixel := 1.
     bitsPerSample := #(8).
-"/    colorMap := Array with:rMap with:gMap with:bMap.
     colorMap := Colormap redVector:rMap greenVector:gMap blueVector:bMap.
-    inStream close.
 
     "
      |i f|