bug fix: palette is padded after RLE data.
--- a/PCXReader.st Tue Mar 12 15:21:05 2002 +0100
+++ b/PCXReader.st Fri Mar 15 17:52:43 2002 +0100
@@ -10,6 +10,8 @@
hereby transferred.
"
+"{ Package: 'stx:libview2' }"
+
ImageReader subclass:#PCXReader
instanceVariableNames:''
classVariableNames:''
@@ -153,7 +155,7 @@
bufferIndex "{Class: SmallInteger }"
bendIndex "{Class: SmallInteger }"
nBuffer "{Class: SmallInteger }"
- mapSize|
+ mapSize nMaxPad|
"/ typedef struct { /*header for PCX bitmap files*/
"/ unsigned char signature; /*1 PCX file identifier*/
@@ -223,12 +225,16 @@
bMap := ByteArray 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.
+ |r g b|
+
+ r := rawMap at:srcIndex.
+ g := rawMap at:srcIndex+1.
+ b := rawMap at:srcIndex+2.
+
+ rMap at:i put:r.
+ gMap at:i put:g.
+ bMap at:i put:b.
+ srcIndex := srcIndex + 3.
].
].
@@ -315,10 +321,21 @@
byte := inStream next
].
- byte == 16r0C ifFalse:[
- 'PCXREADER: no valid 256-entry palette (got' errorPrint.
- byte errorPrint. '; expected ' errorPrint. 16rC0 errorPrint. ')' errorPrintNL.
+ "/ RLE data is padded - skip over zeros for the 0C-byte
+ nMaxPad := 15.
+ [(byte ~~ 16r0C) and:[nMaxPad > 0]] whileTrue:[
+ 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. ')' errorPrintCR.
+ ].
+
rawMap := ByteArray uninitializedNew:(256*3).
nBuffer ~~ 0 ifTrue:[
mapSize := buffer size - bufferIndex + 1.
@@ -334,13 +351,18 @@
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.
+ |r g b|
+
+ r := rawMap at:srcIndex.
+ g := rawMap at:srcIndex+1.
+ b := rawMap at:srcIndex+2.
+
+ rMap at:i put:r.
+ gMap at:i put:g.
+ bMap at:i put:b.
+ srcIndex := srcIndex + 3.
].
].
@@ -361,6 +383,6 @@
!PCXReader class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libview2/PCXReader.st,v 1.25 1998-02-03 16:59:27 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libview2/PCXReader.st,v 1.26 2002-03-15 16:52:43 cg Exp $'
! !
PCXReader initialize!