diff dwt/internal/image/PngLzBlockReader.d @ 34:5123b17c98ef

Ported dwt.events.*, dwt.graphics.GC, Region, dwt.internal.image.*
author Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
date Sun, 14 Sep 2008 01:45:57 +0200
parents e831403a80a9
children
line wrap: on
line diff
--- a/dwt/internal/image/PngLzBlockReader.d	Fri Sep 12 13:53:21 2008 +0200
+++ b/dwt/internal/image/PngLzBlockReader.d	Sun Sep 14 01:45:57 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -7,10 +7,13 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
  *******************************************************************************/
-module dwt.internal.image;
+module dwt.internal.image.PngLzBlockReader;
 
-import java.io.IOException;
+import dwt.internal.image.PngDecodingDataStream;
+import dwt.internal.image.PngHuffmanTables;
 
 public class PngLzBlockReader {
     bool isLastBlock;
@@ -18,41 +21,41 @@
     int uncompressedBytesRemaining;
     PngDecodingDataStream stream;
     PngHuffmanTables huffmanTables;
-    
+
     byte[] window;
     int windowIndex;
     int copyIndex;
     int copyBytesRemaining;
-    
-    static final int UNCOMPRESSED = 0;
-    static final int COMPRESSED_FIXED = 1;
-    static final int COMPRESSED_DYNAMIC = 2;
+
+    static const int UNCOMPRESSED = 0;
+    static const int COMPRESSED_FIXED = 1;
+    static const int COMPRESSED_DYNAMIC = 2;
 
-    static final int END_OF_COMPRESSED_BLOCK = 256;
-    static final int FIRST_LENGTH_CODE = 257;
-    static final int LAST_LENGTH_CODE = 285;
-    static final int FIRST_DISTANCE_CODE = 1;
-    static final int LAST_DISTANCE_CODE = 29;
-    static final int FIRST_CODE_LENGTH_CODE = 4;
-    static final int LAST_CODE_LENGTH_CODE = 19;
+    static const int END_OF_COMPRESSED_BLOCK = 256;
+    static const int FIRST_LENGTH_CODE = 257;
+    static const int LAST_LENGTH_CODE = 285;
+    static const int FIRST_DISTANCE_CODE = 1;
+    static const int LAST_DISTANCE_CODE = 29;
+    static const int FIRST_CODE_LENGTH_CODE = 4;
+    static const int LAST_CODE_LENGTH_CODE = 19;
 
-    static final int[] lengthBases = {
-        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 
+    static const int[] lengthBases = [
+        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27,
         31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258
-    } ; 
-    static final int[] extraLengthBits = {
-        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 
+    ];
+    static const int[] extraLengthBits = [
+        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
         3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0,
-    };
-    static final int[] distanceBases = {
+    ];
+    static const int[] distanceBases = [
         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129,
         193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097,
         6145, 8193, 12289, 16385, 24577,
-    };
-    static final int[] extraDistanceBits = {
+    ];
+    static const int[] extraDistanceBits = [
         0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,  7,
         8,  8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13,
-    };  
+    ];
 
 
 this(PngDecodingDataStream stream) {
@@ -62,13 +65,13 @@
 
 void setWindowSize(int windowSize) {
     window = new byte[windowSize];
-}   
+}
 
-void readNextBlockHeader() {
+void readNextBlockHeader()  {
     isLastBlock = stream.getNextIdatBit() !is 0;
     compressionType = cast(byte)(stream.getNextIdatBits(2) & 0xFF);
-    if (compressionType > 2) stream.error();    
-    
+    if (compressionType > 2) stream.error();
+
     if (compressionType is UNCOMPRESSED) {
         byte b1 = stream.getNextIdatByte();
         byte b2 = stream.getNextIdatByte();
@@ -83,7 +86,7 @@
     }
 }
 
-byte getNextByte() {
+byte getNextByte()  {
     if (compressionType is UNCOMPRESSED) {
         if (uncompressedBytesRemaining is 0) {
             readNextBlockHeader();
@@ -103,43 +106,43 @@
     }
 }
 
-private void assertBlockAtEnd() {
+private void assertBlockAtEnd()  {
     if (compressionType is UNCOMPRESSED) {
         if (uncompressedBytesRemaining > 0) stream.error();
     } else if (copyBytesRemaining > 0 ||
-        (huffmanTables.getNextLiteralValue(stream) !is END_OF_COMPRESSED_BLOCK)) 
+        (huffmanTables.getNextLiteralValue(stream) !is END_OF_COMPRESSED_BLOCK))
     {
-        stream.error();     
+        stream.error();
     }
 }
-void assertCompressedDataAtEnd() {
-    assertBlockAtEnd();     
+void assertCompressedDataAtEnd()  {
+    assertBlockAtEnd();
     while (!isLastBlock) {
         readNextBlockHeader();
         assertBlockAtEnd();
-    }   
+    }
 }
 
-private byte getNextCompressedByte() {
+private byte getNextCompressedByte()  {
     if (copyBytesRemaining > 0) {
         byte value = window[copyIndex];
         window[windowIndex] = value;
         copyBytesRemaining--;
-        
+
         copyIndex++;
-        windowIndex++;      
+        windowIndex++;
         if (copyIndex is window.length) copyIndex = 0;
         if (windowIndex is window.length) windowIndex = 0;
 
-        return value;       
+        return value;
     }
-    
+
     int value = huffmanTables.getNextLiteralValue(stream);
     if (value < END_OF_COMPRESSED_BLOCK) {
         window[windowIndex] = cast(byte) (value & 0xFF);
         windowIndex++;
         if (windowIndex >= window.length) windowIndex = 0;
-        return cast(byte) (value & 0xFF);       
+        return cast(byte) (value & 0xFF);
     } else if (value is END_OF_COMPRESSED_BLOCK) {
         readNextBlockHeader();
         return getNextByte();
@@ -149,7 +152,7 @@
         if (extraBits > 0) {
             length += stream.getNextIdatBits(extraBits);
         }
-        
+
         value = huffmanTables.getNextDistanceValue(stream);
         if (value > LAST_DISTANCE_CODE) stream.error();
         extraBits = extraDistanceBits[value];
@@ -157,7 +160,7 @@
         if (extraBits > 0) {
             distance += stream.getNextIdatBits(extraBits);
         }
-        
+
         copyIndex = windowIndex - distance;
         if (copyIndex < 0) copyIndex += window.length;
 
@@ -168,5 +171,5 @@
         return 0;
     }
 }
-    
+
 }