bug fix: palette is padded after RLE data.
authorClaus Gittinger <cg@exept.de>
Fri, 15 Mar 2002 17:52:43 +0100
changeset 1562 3b444efb61ee
parent 1561 942de18a3e3e
child 1563 166f840701bf
bug fix: palette is padded after RLE data.
PCXReader.st
--- 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!