commentary
authorClaus Gittinger <cg@exept.de>
Tue, 23 Apr 1996 12:36:29 +0200
changeset 201 c707ed0db1d0
parent 200 33e4adf6fd59
child 202 651db5018d9c
commentary
PCXReader.st
--- a/PCXReader.st	Tue Apr 23 12:33:51 1996 +0200
+++ b/PCXReader.st	Tue Apr 23 12:36:29 1996 +0200
@@ -10,13 +10,11 @@
  hereby transferred.
 "
 
-'From Smalltalk/X, Version:2.10.4 on 18-feb-1995 at 2:18:45 am'!
-
 ImageReader subclass:#PCXReader
-	 instanceVariableNames:''
-	 classVariableNames:''
-	 poolDictionaries:''
-	 category:'Graphics-Images support'
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Graphics-Images support'
 !
 
 !PCXReader class methodsFor:'documentation'!
@@ -35,46 +33,37 @@
 "
 !
 
-version
-    ^ '$Header: /cvs/stx/stx/libview2/PCXReader.st,v 1.11 1996-04-07 00:40:40 cg Exp $'
-!
-
 documentation
 "
     this class provides methods for loading 8-plane PCX bitmap files.
+
     Due to not having too many examples for testing, this could fail
-    to read some files. (especially, I have no uncompressed files
-    for testing).
-    Also, only 8-bit (i.e. 256 color) PCX images are supported.
+    to read some files. 
+    (especially, I have no uncompressed files for testing).
+
+    Only 8-bit (i.e. 256 color) PCX images are supported.
+    Image writing is not supported.
+
+    [See also:]
+        BlitImageReader FaceReader GIFReader JPEGReader PBMReader 
+        ST80FormReader SunRasterReader TIFFReader WindowsIconReader 
+        XBMreader XPMReader XWDReader 
 "
 ! !
 
 !PCXReader class methodsFor:'initialization'!
 
 initialize
-    "tell Image-class, that a new fileReader is present"
+    "tell Image-class, that a new fileReader is present
+     for the '.pcx' and '.PCX' extensions."
 
-    Image fileFormats at:'.pcx'  put:self.
+    Image fileFormats at:'.pcx' put:self.
+    Image fileFormats at:'.PCX' put:self.
+
 ! !
 
 !PCXReader class methodsFor:'testing'!
 
-isValidPCXHeader:aHeader
-    "return true, if aHeader looks like a PCX image header"
-
-    "check id"
-    ((aHeader at:1) ~~ 16r0A) ifTrue:[
-	^ false
-    ].
-
-    "check version"
-    (#(0 2 3 5) includes:(aHeader at:2)) ifFalse:[
-	^ false
-    ].
-
-    ^ true
-!
-
 isValidImageFile:aFilename
     "return true, if aFilename contains a PCX image"
 
@@ -94,11 +83,57 @@
     ^ true
 
     "Modified: 17.9.1995 / 17:32:07 / claus"
+!
+
+isValidPCXHeader:aHeader
+    "return true, if aHeader looks like a PCX image header"
+
+    "check id"
+    ((aHeader at:1) ~~ 16r0A) ifTrue:[
+	^ false
+    ].
+
+    "check version"
+    (#(0 2 3 5) includes:(aHeader at:2)) ifFalse:[
+	^ false
+    ].
+
+    ^ true
 ! !
 
 !PCXReader methodsFor:'reading from file'!
 
+fromStream:aStream
+    "read an image in pcx format from aStream"
+
+    |fileSize header img|
+
+    inStream := aStream.
+
+    inStream binary.
+    fileSize := aStream size.
+
+    fileSize < 128 ifTrue:[
+        self error:'PCXREADER: short file'.
+        ^ nil
+    ].
+
+    header := ByteArray uninitializedNew:128.
+    aStream nextBytes:128 into:header.
+
+    (self class isValidPCXHeader:header) ifFalse:[
+        self error:'PCXREADER: wrong header'.
+        ^ nil
+    ].
+
+    img := self fromStreamWithHeader:header.
+    ^ img
+!
+
 fromStreamWithHeader:header 
+    "read an raw image in pcx format from aStream.
+     The header has already been read into the header argument."
+
     | inDepth version compression nPlanes xmin ymin xmax ymax
       paletteType rawMap rMap gMap bMap 
       endIndex    "{Class: SmallInteger }"
@@ -121,8 +156,8 @@
     compression := header at:3.
 "/    'compression=' print. compression printNL.
     (#(0 1) includes:compression) ifFalse:[
-	self error:'PCXREADER: unknown compression'.
-	^ nil
+        self error:'PCXREADER: unknown compression'.
+        ^ nil
     ].
     inDepth := header at:4.
 "/    'depth=' print. inDepth printNL.
@@ -138,10 +173,10 @@
      So its not (yet) implemented
     "
     ((inDepth ~~ 8) or:[nPlanes ~~ 1]) ifTrue:[
-	'PCXReader: depth: ' errorPrint. inDepth errorPrint. 
-	' planes:' errorPrint. nPlanes errorPrintNL.
-	'PCXReader: can only handle 1-plane 256 color images' errorPrintNL.
-	^ nil
+        'PCXReader: depth: ' errorPrint. inDepth errorPrint. 
+        ' planes:' errorPrint. nPlanes errorPrintNL.
+        'PCXReader: can only handle 1-plane 256 color images' errorPrintNL.
+        ^ nil
     ].
 
     xmin := header wordAt:5 MSB:false. 
@@ -155,132 +190,132 @@
 "/    'height=' print. width printNL.
 
     (version == 2) ifTrue:[
-	"read the 16-entry colormap"
+        "read the 16-entry colormap"
 
-	rawMap := ByteArray uninitializedNew:(16*3).
-	rawMap replaceFrom:1 to:(16*3) with:header startingAt:17.
-	rMap := Array new:16.
-	gMap := Array new:16.
-	bMap := Array new:16.
-	srcIndex := 1.
-	1 to:16 do:[:i |
-	    rMap at:i put:(rawMap at:srcIndex).
-	    srcIndex := srcIndex + 1.
-	    gMap at:i put:(rawMap at:srcIndex).
-	    srcIndex := srcIndex + 1.
-	    bMap at:i put:(rawMap at:srcIndex).
-	    srcIndex := srcIndex + 1.
-	].
+        rawMap := ByteArray uninitializedNew:(16*3).
+        rawMap replaceFrom:1 to:(16*3) with:header startingAt:17.
+        rMap := Array new:16.
+        gMap := Array new:16.
+        bMap := Array new:16.
+        srcIndex := 1.
+        1 to:16 do:[:i |
+            rMap at:i put:(rawMap at:srcIndex).
+            srcIndex := srcIndex + 1.
+            gMap at:i put:(rawMap at:srcIndex).
+            srcIndex := srcIndex + 1.
+            bMap at:i put:(rawMap at:srcIndex).
+            srcIndex := srcIndex + 1.
+        ].
     ].
 
     compression == 1 ifTrue:[
-	data := dataBytes := ByteArray uninitializedNew:(height * srcBytesPerRow).
+        data := dataBytes := ByteArray uninitializedNew:(height * srcBytesPerRow).
 
-	buffer := ByteArray uninitializedNew:4096.
-	bufferIndex := 1.
-	bendIndex := 1.
+        buffer := ByteArray uninitializedNew:4096.
+        bufferIndex := 1.
+        bendIndex := 1.
 
-	rowIndex := 1.
-	h := height.
-	1 to:h do:[:row |
-	    dstIndex := rowIndex.
-	    endIndex := dstIndex + srcBytesPerRow.
-	    [dstIndex < endIndex] whileTrue:[
-		bufferIndex == bendIndex ifTrue:[
-		    nBuffer := inStream nextBytes:4096 into:buffer.
-		    bufferIndex := 1.
-		    bendIndex := nBuffer + 1.
-		].
-		byte := buffer at:bufferIndex.
-		bufferIndex := bufferIndex + 1.
-		((byte bitAnd:2r11000000) ~~ 2r11000000) ifTrue:[
-		    dataBytes at:dstIndex put:byte.
-		    dstIndex := dstIndex + 1.
-		] ifFalse:[
-		    nByte := byte bitAnd:2r00111111.
-		    bufferIndex == bendIndex ifTrue:[
-			nBuffer := inStream nextBytes:4096 into:buffer.
-			bufferIndex := 1.
-			bendIndex := nBuffer + 1.
-		    ].
-		    value := buffer at:bufferIndex.
-		    bufferIndex := bufferIndex + 1.
-		    idx2 := ((dstIndex + nByte) min:endIndex) - 1.
-		    dataBytes from:dstIndex to:idx2 put:value.
-		    dstIndex := dstIndex + nByte.
-		].
-	    ].
-	    rowIndex := endIndex.
-	].
+        rowIndex := 1.
+        h := height.
+        1 to:h do:[:row |
+            dstIndex := rowIndex.
+            endIndex := dstIndex + srcBytesPerRow.
+            [dstIndex < endIndex] whileTrue:[
+                bufferIndex == bendIndex ifTrue:[
+                    nBuffer := inStream nextBytes:4096 into:buffer.
+                    bufferIndex := 1.
+                    bendIndex := nBuffer + 1.
+                ].
+                byte := buffer at:bufferIndex.
+                bufferIndex := bufferIndex + 1.
+                ((byte bitAnd:2r11000000) ~~ 2r11000000) ifTrue:[
+                    dataBytes at:dstIndex put:byte.
+                    dstIndex := dstIndex + 1.
+                ] ifFalse:[
+                    nByte := byte bitAnd:2r00111111.
+                    bufferIndex == bendIndex ifTrue:[
+                        nBuffer := inStream nextBytes:4096 into:buffer.
+                        bufferIndex := 1.
+                        bendIndex := nBuffer + 1.
+                    ].
+                    value := buffer at:bufferIndex.
+                    bufferIndex := bufferIndex + 1.
+                    idx2 := ((dstIndex + nByte) min:endIndex) - 1.
+                    dataBytes from:dstIndex to:idx2 put:value.
+                    dstIndex := dstIndex + nByte.
+                ].
+            ].
+            rowIndex := endIndex.
+        ].
 
-	"/ have to compress - above code reads srcBytesPerRow
-	"/ (to keep in sync with RLE); but we want width bytesPerRow
-	"/ Can compress in the data-area; leftover pixels are simply ignored
-	"/ by other image processing code
-	"/
-	srcBytesPerRow ~~ width ifTrue:[
-	    dstIndex := width + 1.
-	    srcIndex := srcBytesPerRow + 1.
-	    2 to:h do:[:row |
-		dataBytes replaceFrom:dstIndex to:dstIndex+width-1 with:dataBytes startingAt:srcIndex.
-		dstIndex := dstIndex + width.
-		srcIndex := srcIndex + srcBytesPerRow
-	    ]
-	].
-	nBuffer := endIndex - bufferIndex.
+        "/ have to compress - above code reads srcBytesPerRow
+        "/ (to keep in sync with RLE); but we want width bytesPerRow
+        "/ Can compress in the data-area; leftover pixels are simply ignored
+        "/ by other image processing code
+        "/
+        srcBytesPerRow ~~ width ifTrue:[
+            dstIndex := width + 1.
+            srcIndex := srcBytesPerRow + 1.
+            2 to:h do:[:row |
+                dataBytes replaceFrom:dstIndex to:dstIndex+width-1 with:dataBytes startingAt:srcIndex.
+                dstIndex := dstIndex + width.
+                srcIndex := srcIndex + srcBytesPerRow
+            ]
+        ].
+        nBuffer := endIndex - bufferIndex.
     ] ifFalse:[
-	"
-	 actually untested ...
-	"
-	data := dataBytes := ByteArray uninitializedNew:(height * width).
-	srcBytesPerRow ~~ width ifTrue:[
-	    dstIndex := 1.
-	    1 to:h do:[:row |
-		inStream nextBytes:width into:data startingAt:dstIndex.
-		dstIndex := dstIndex + width.
-		inStream skip:(srcBytesPerRow - width).
-	    ]
-	] ifFalse:[
-	    inStream nextBytes:(height * width) into:data.
-	].
-	nBuffer := 0.
+        "
+         actually untested ...
+        "
+        data := dataBytes := ByteArray uninitializedNew:(height * width).
+        srcBytesPerRow ~~ width ifTrue:[
+            dstIndex := 1.
+            1 to:h do:[:row |
+                inStream nextBytes:width into:data startingAt:dstIndex.
+                dstIndex := dstIndex + width.
+                inStream skip:(srcBytesPerRow - width).
+            ]
+        ] ifFalse:[
+            inStream nextBytes:(height * width) into:data.
+        ].
+        nBuffer := 0.
     ].
 
     (version == 5) ifTrue:[
-	"read the 256-entry colormap"
+        "read the 256-entry colormap"
 
-	nBuffer ~~ 0 ifTrue:[
-	    byte := buffer at:bufferIndex.
-	    bufferIndex := bufferIndex + 1. nBuffer := nBuffer - 1.
-	] ifFalse:[
-	    byte := inStream next
-	].
+        nBuffer ~~ 0 ifTrue:[
+            byte := buffer at:bufferIndex.
+            bufferIndex := bufferIndex + 1. nBuffer := nBuffer - 1.
+        ] ifFalse:[
+            byte := inStream next
+        ].
 
-	byte == 16r0C ifFalse:[
-	   'PCXREADER: no valid 256-entry palette (got' errorPrint. 
-	   byte errorPrint. '; expected ' errorPrint. 16rC0 errorPrint. ')' errorPrintNL.
-	].
-	rawMap := ByteArray uninitializedNew:(256*3).
-	nBuffer ~~ 0 ifTrue:[
-	    rawMap replaceFrom:1 to:(256*3) with:buffer startingAt:bufferIndex.
-	    nBuffer < (256*3) ifTrue:[
-		inStream nextBytes:((256*3)-nBuffer) into:rawMap startingAt:nBuffer+1
-	    ]
-	] ifFalse:[
-	    inStream nextBytes:(256*3) into:rawMap.
-	].
-	rMap := Array new:256.
-	gMap := Array new:256.
-	bMap := Array new:256.
-	srcIndex := 1.
-	1 to:256 do:[:i |
-	    rMap at:i put:(rawMap at:srcIndex).
-	    srcIndex := srcIndex + 1.
-	    gMap at:i put:(rawMap at:srcIndex).
-	    srcIndex := srcIndex + 1.
-	    bMap at:i put:(rawMap at:srcIndex).
-	    srcIndex := srcIndex + 1.
-	].
+        byte == 16r0C ifFalse:[
+           'PCXREADER: no valid 256-entry palette (got' errorPrint. 
+           byte errorPrint. '; expected ' errorPrint. 16rC0 errorPrint. ')' errorPrintNL.
+        ].
+        rawMap := ByteArray uninitializedNew:(256*3).
+        nBuffer ~~ 0 ifTrue:[
+            rawMap replaceFrom:1 to:(256*3) with:buffer startingAt:bufferIndex.
+            nBuffer < (256*3) ifTrue:[
+                inStream nextBytes:((256*3)-nBuffer) into:rawMap startingAt:nBuffer+1
+            ]
+        ] ifFalse:[
+            inStream nextBytes:(256*3) into:rawMap.
+        ].
+        rMap := Array new:256.
+        gMap := Array new:256.
+        bMap := Array new:256.
+        srcIndex := 1.
+        1 to:256 do:[:i |
+            rMap at:i put:(rawMap at:srcIndex).
+            srcIndex := srcIndex + 1.
+            gMap at:i put:(rawMap at:srcIndex).
+            srcIndex := srcIndex + 1.
+            bMap at:i put:(rawMap at:srcIndex).
+            srcIndex := srcIndex + 1.
+        ].
     ].
 
     photometric := #palette.
@@ -293,31 +328,11 @@
      i := Image fromFile:'somefile.pcx'.
      i inspect.
     "
-!
-
-fromStream:aStream 
-    | fileSize header img |
-
-    inStream := aStream.
-
-    inStream binary.
-    fileSize := aStream size.
-
-    fileSize < 128 ifTrue:[
-	self error:'PCXREADER: short file'.
-	^ nil
-    ].
-
-    header := ByteArray uninitializedNew:128.
-    aStream nextBytes:128 into:header.
-
-    (self class isValidPCXHeader:header) ifFalse:[
-	self error:'PCXREADER: wrong header'.
-	^ nil
-    ].
-
-    img := self fromStreamWithHeader:header.
-    ^ img
 ! !
 
+!PCXReader class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libview2/PCXReader.st,v 1.12 1996-04-23 10:36:29 cg Exp $'
+! !
 PCXReader initialize!