#BUGFIX by cg
class: PCXReader
added: #readCompressedDepth24Data
changed:
#readCompressedData
#readCompressedData_2
--- 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