*** empty log message ***
authorClaus Gittinger <cg@exept.de>
Wed, 16 Apr 1997 22:57:02 +0200
changeset 531 19c16bd5e0bf
parent 530 749f21b7eff4
child 532 66aa3109df17
*** empty log message ***
PCXReader.st
--- a/PCXReader.st	Wed Apr 16 22:27:04 1997 +0200
+++ b/PCXReader.st	Wed Apr 16 22:57:02 1997 +0200
@@ -45,10 +45,10 @@
     Image writing is not supported.
 
     [See also:]
-        Image Form Icon
-        BlitImageReader FaceReader GIFReader JPEGReader PBMReader 
-        ST80FormReader SunRasterReader TargaReader TIFFReader WindowsIconReader 
-        XBMReader XPMReader XWDReader 
+	Image Form Icon
+	BlitImageReader FaceReader GIFReader JPEGReader PBMReader 
+	ST80FormReader SunRasterReader TargaReader TIFFReader WindowsIconReader 
+	XBMReader XPMReader XWDReader 
 "
 ! !
 
@@ -91,12 +91,12 @@
 
     "check magic number"
     ((aHeader at:1) ~~ 16r0A) ifTrue:[
-        ^ false
+	^ false
     ].
 
     "check version"
     (#(0 2 3 5) includes:(aHeader at:2)) ifFalse:[
-        ^ false
+	^ false
     ].
 
     ^ true
@@ -117,16 +117,16 @@
     fileSize := aStream size.
 
     fileSize < 128 ifTrue:[
-        self error:'PCXREADER: short file'.
-        ^ nil
+	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
+	self error:'PCXREADER: wrong header'.
+	^ nil
     ].
 
     img := self fromStreamWithHeader:header.
@@ -155,13 +155,34 @@
       nBuffer     "{Class: SmallInteger }"
       mapSize|
 
+    "/ typedef struct {                         /*header for PCX bitmap files*/
+    "/    unsigned char       signature;          /*PCX file identifier*/
+    "/    unsigned char       version;            /*version compatibility level*/
+    "/    unsigned char       encoding;           /*encoding method*/
+    "/    unsigned char       bitsperpix;         /*bits per pixel, or depth*/
+    "/    unsigned short      Xleft;              /*X position of left edge*/
+    "/    unsigned short      Ytop;               /*Y position of top edge*/
+    "/    unsigned short      Xright;             /*X position of right edge*/
+    "/    unsigned short      Ybottom;            /*Y position of bottom edge*/
+    "/    unsigned short      Xscreensize;        /*X screen res of source image*/
+    "/    unsigned short      Yscreensize;        /*Y screen res of source image*/
+    "/    unsigned char       PCXpalette[16][3];  /*PCX color map*/
+    "/    unsigned char       reserved1;          /*should be 0, 1 if std res fax*/
+    "/    unsigned char       planes;             /*bit planes in image*/
+    "/    unsigned short      linesize;           /*byte delta between scanlines */
+    "/    unsigned short      paletteinfo;            /*0 == undef
+    "/                                                  1 == color
+    "/                                                  2 == grayscale*/
+    "/    unsigned char reserved2[58];            /*fill to struct size of 128*/
+    "/ } PCX_HEADER;
+
     version := header at:2.
 "/    'version=' print. version printNL.
     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.
@@ -178,10 +199,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. 
@@ -195,134 +216,134 @@
 "/    '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:[
-        "
-         uncompressed; 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.
+	"
+	 uncompressed; 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:[
-            mapSize := buffer size - bufferIndex + 1.
-            mapSize := mapSize min:(256*3).
-            rawMap replaceFrom:1 to:mapSize 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:[
+	    mapSize := buffer size - bufferIndex + 1.
+	    mapSize := mapSize min:(256*3).
+	    rawMap replaceFrom:1 to:mapSize 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.
@@ -342,6 +363,6 @@
 !PCXReader class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview2/PCXReader.st,v 1.19 1997-04-16 20:27:04 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview2/PCXReader.st,v 1.20 1997-04-16 20:57:02 cg Exp $'
 ! !
 PCXReader initialize!