#BUGFIX by cg
authorClaus Gittinger <cg@exept.de>
Tue, 29 Aug 2017 02:19:30 +0200
changeset 3994 8ab8729d5dec
parent 3993 921798977590
child 3995 ab4741a8e8f5
#BUGFIX by cg class: PCXReader added: #readCompressedDepth24Data changed: #readCompressedData #readCompressedData_2
PCXReader.st
--- a/PCXReader.st	Mon Aug 28 19:31:18 2017 +0200
+++ b/PCXReader.st	Tue Aug 29 02:19:30 2017 +0200
@@ -168,6 +168,10 @@
     |bendIndex rowStartIndex  endIndex byte nByte value idx2
      srcIndex dstIndex srcRowStartIndex dstRowStartIndex bytesPerPane planeData imageBytesPerRow|
 
+    (nPlanes > 1 and:[depth == 8]) ifTrue:[
+        ^ self readCompressedDepth24Data.
+    ].
+    
     imageBytesPerRow := (((width * depth) + 7) // 8).
     
     bytesPerPane := height * (imageBytesPerRow max:sourceBytesPerRow).
@@ -215,7 +219,7 @@
             ].
         ].
         "/ rowStartIndex := endIndex.
-        rowStartIndex := rowStartIndex + imageBytesPerRow.
+        rowStartIndex := rowStartIndex + (imageBytesPerRow * nPlanes).
     ].
     nBuffer := endIndex - bufferIndex.
 
@@ -316,7 +320,70 @@
 "/        ].
 "/    ].
 
-    "Modified (format): / 28-08-2017 / 18:01:46 / cg"
+    "Modified: / 29-08-2017 / 02:13:12 / cg"
+!
+
+readCompressedDepth24Data
+    |bEndIndex rowStartIndex rowBytes endIndex byte nByte value idx2
+     srcIndex dstIndex imageBytesPerRow|
+
+    imageBytesPerRow := (((width * depth * nPlanes) + 7) // 8).
+    
+    data := ByteArray new:(nPlanes*width*height).
+    
+    buffer := ByteArray uninitializedNew:4096.
+    bufferIndex := 1.
+    bEndIndex := 1.
+
+    rowBytes := ByteArray new:(sourceBytesPerRow * nPlanes).
+    
+    rowStartIndex := 1.
+    1 to:height do:[:row |
+        dstIndex := 1.
+        endIndex := 1 + (sourceBytesPerRow * nPlanes).
+        [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:[
+                rowBytes 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.
+                rowBytes from:dstIndex to:idx2 put:value.
+                dstIndex := dstIndex + nByte.
+            ].
+        ].
+
+        dstIndex := rowStartIndex.
+        srcIndex := 1.
+        1 to:width do:[:x |
+            data at:dstIndex put:(rowBytes at:x).
+            data at:dstIndex+1 put:(rowBytes at:x+sourceBytesPerRow).
+            data at:dstIndex+2 put:(rowBytes at:x+sourceBytesPerRow+sourceBytesPerRow).
+            dstIndex := dstIndex + 3.
+        ].
+        "/ data replaceFrom:rowStartIndex to:rowStartIndex+(sourceBytesPerRow*nPlanes)-1 with:rowBytes startingAt:1.
+        
+        "/ rowStartIndex := endIndex.
+        rowStartIndex := rowStartIndex + imageBytesPerRow.
+    ].
+    nBuffer := endIndex - bufferIndex.
+    depth := depth * nPlanes.
+
+    "Created: / 29-08-2017 / 02:13:07 / cg"
 !
 
 readRestAfterHeader