You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sebb <se...@gmail.com> on 2011/12/10 11:31:32 UTC
Re: svn commit: r1212757 - in /commons/proper/sanselan/trunk/src:
main/java/org/apache/sanselan/common/ main/java/org/apache/sanselan/common/itu_t4/
main/java/org/apache/sanselan/formats/tiff/datareaders/ test/data/images/tiff/3/
On 10 December 2011 10:14, <da...@apache.org> wrote:
> Author: damjan
> Date: Sat Dec 10 10:14:26 2011
> New Revision: 1212757
>
> URL: http://svn.apache.org/viewvc?rev=1212757&view=rev
> Log:
> Add support for TIFF files with compression=2,
> (CCITT Group 3 1-Dimensional Modified Huffman
> run length encoding), and a sample image
> that tests this. CCITT is now the ITU,
> so the naming reflects this.
>
> Jira issue key: SANSELAN-48
>
>
> Added:
> commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BitArrayOutputStream.java
> commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/
> commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/HuffmanTree.java
> commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/HuffmanTreeException.java
> commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/T4Compression.java
> commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/T4_T6_Tables.java
The java files need EOL properties.
> commons/proper/sanselan/trunk/src/test/data/images/tiff/3/
> commons/proper/sanselan/trunk/src/test/data/images/tiff/3/1pagefax.tif (with props)
> commons/proper/sanselan/trunk/src/test/data/images/tiff/3/info.txt
Likewise the txt file.
Have you set up SVN correctly?
http://www.apache.org/dev/version-control.html#https-svn-config
> Modified:
> commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BitInputStreamFlexible.java
> commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReader.java
> commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderStrips.java
> commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderTiled.java
>
> Added: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BitArrayOutputStream.java
> URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BitArrayOutputStream.java?rev=1212757&view=auto
> ==============================================================================
> --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BitArrayOutputStream.java (added)
> +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BitArrayOutputStream.java Sat Dec 10 10:14:26 2011
> @@ -0,0 +1,82 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements. See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.sanselan.common;
> +
> +public class BitArrayOutputStream {
> + private byte[] buffer;
> + private int bytesWritten = 0;
> + private int cache = 0;
> + private int cacheMask = 0x80;
> +
> + public BitArrayOutputStream() {
> + buffer = new byte[16];
> + }
> +
> + public BitArrayOutputStream(int size) {
> + buffer = new byte[size];
> + }
> +
> + public int size() {
> + return bytesWritten;
> + }
> +
> + public byte[] toByteArray() {
> + flush();
> + if (bytesWritten == buffer.length) {
> + return buffer;
> + }
> + byte[] out = new byte[bytesWritten];
> + System.arraycopy(buffer, 0, out, 0, bytesWritten);
> + return out;
> + }
> +
> + public void close() {
> + flush();
> + }
> +
> + public void flush() {
> + if (cacheMask != 0x80) {
> + writeByte(cache);
> + cache = 0;
> + cacheMask = 0x80;
> + }
> + }
> +
> + public void write(int b) {
> + flush();
> + writeByte(b);
> + }
> +
> + public void writeBit(int bit) {
> + if (bit != 0) {
> + cache |= cacheMask;
> + }
> + cacheMask >>>= 1;
> + if (cacheMask == 0) {
> + flush();
> + }
> + }
> +
> + private void writeByte(int b) {
> + if (bytesWritten >= buffer.length) {
> + byte[] bigger = new byte[buffer.length * 2];
> + System.arraycopy(buffer, 0, bigger, 0, bytesWritten);
> + buffer = bigger;
> + }
> + buffer[bytesWritten++] = (byte)b;
> + }
> +}
>
> Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BitInputStreamFlexible.java
> URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BitInputStreamFlexible.java?rev=1212757&r1=1212756&r2=1212757&view=diff
> ==============================================================================
> --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BitInputStreamFlexible.java (original)
> +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/BitInputStreamFlexible.java Sat Dec 10 10:14:26 2011
> @@ -73,9 +73,9 @@ public class BitInputStreamFlexible exte
> cache = is.read();
> if (cache < 0)
> throw new IOException("couldn't read bits");
> - System.out.println("cache 1: " + cache + " ("
> - + Integer.toHexString(cache) + ", "
> - + Integer.toBinaryString(cache) + ")");
> +// System.out.println("cache 1: " + cache + " ("
> +// + Integer.toHexString(cache) + ", "
> +// + Integer.toBinaryString(cache) + ")");
> bytesRead++;
> result = (result << 8) | (0xff & cache);
> count -= 8;
> @@ -85,9 +85,9 @@ public class BitInputStreamFlexible exte
> cache = is.read();
> if (cache < 0)
> throw new IOException("couldn't read bits");
> - System.out.println("cache 2: " + cache + " ("
> - + Integer.toHexString(cache) + ", "
> - + Integer.toBinaryString(cache) + ")");
> +// System.out.println("cache 2: " + cache + " ("
> +// + Integer.toHexString(cache) + ", "
> +// + Integer.toBinaryString(cache) + ")");
> bytesRead++;
> cacheBitsRemaining = 8 - count;
> result = (result << count)
>
> Added: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/HuffmanTree.java
> URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/HuffmanTree.java?rev=1212757&view=auto
> ==============================================================================
> --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/HuffmanTree.java (added)
> +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/HuffmanTree.java Sat Dec 10 10:14:26 2011
> @@ -0,0 +1,89 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements. See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.sanselan.common.itu_t4;
> +
> +import java.io.IOException;
> +import java.util.ArrayList;
> +
> +import org.apache.sanselan.common.BitInputStreamFlexible;
> +
> +/**
> + * A Huffman tree implemented as 1 array for high locality of reference.
> + */
> +public class HuffmanTree {
> + private static class Node {
> + boolean isEmpty = true;
> + Object value = null;
> + }
> + private ArrayList nodes = new ArrayList();
> +
> + public final void insert(String pattern, Object value) throws HuffmanTreeException {
> + int position = 0;
> + Node node = growAndGetNode(position);
> + if (node.value != null) {
> + throw new HuffmanTreeException("Can't add child to a leaf");
> + }
> + for(int patternPosition = 0; patternPosition < pattern.length(); patternPosition++) {
> + char nextChar = pattern.charAt(patternPosition);
> + if (nextChar == '0') {
> + position = (position << 1) + 1;
> + } else {
> + position = (position + 1) << 1;
> + }
> + node = growAndGetNode(position);
> + if (node.value != null) {
> + throw new HuffmanTreeException("Can't add child to a leaf");
> + }
> + }
> + node.value = value;
> + }
> +
> + private Node growAndGetNode(int position) {
> + while (position >= nodes.size()) {
> + nodes.add(new Node());
> + }
> + Node node = (Node) nodes.get(position);
> + node.isEmpty = false;
> + return node;
> + }
> +
> + public final Object decode(BitInputStreamFlexible bitStream) throws HuffmanTreeException {
> + int position = 0;
> + Node node = (Node) nodes.get(0);
> + while (node.value == null) {
> + int nextBit;
> + try {
> + nextBit = bitStream.readBits(1);
> + } catch (IOException ioEx) {
> + throw new HuffmanTreeException("Error reading stream for huffman tree", ioEx);
> + }
> + if (nextBit == 0) {
> + position = (position << 1) + 1;
> + } else {
> + position = (position + 1) << 1;
> + }
> + if (position >= nodes.size()) {
> + throw new HuffmanTreeException("Invalid bit pattern");
> + }
> + node = (Node) nodes.get(position);
> + if (node.isEmpty) {
> + throw new HuffmanTreeException("Invalid bit pattern");
> + }
> + }
> + return node.value;
> + }
> +}
>
> Added: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/HuffmanTreeException.java
> URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/HuffmanTreeException.java?rev=1212757&view=auto
> ==============================================================================
> --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/HuffmanTreeException.java (added)
> +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/HuffmanTreeException.java Sat Dec 10 10:14:26 2011
> @@ -0,0 +1,29 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements. See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.sanselan.common.itu_t4;
> +
> +public class HuffmanTreeException extends Exception {
> + private static final long serialVersionUID = 1L;
> +
> + public HuffmanTreeException(String message) {
> + super(message);
> + }
> +
> + public HuffmanTreeException(String message, Throwable throwable) {
> + super(message, throwable);
> + }
> +}
>
> Added: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/T4Compression.java
> URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/T4Compression.java?rev=1212757&view=auto
> ==============================================================================
> --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/T4Compression.java (added)
> +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/T4Compression.java Sat Dec 10 10:14:26 2011
> @@ -0,0 +1,104 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements. See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.sanselan.common.itu_t4;
> +
> +import java.io.ByteArrayInputStream;
> +
> +import org.apache.sanselan.ImageReadException;
> +import org.apache.sanselan.common.BitArrayOutputStream;
> +import org.apache.sanselan.common.BitInputStreamFlexible;
> +
> +
> +public class T4Compression {
> + private static final HuffmanTree whiteRunLengths = new HuffmanTree();
> + private static final HuffmanTree blackRunLengths = new HuffmanTree();
> +
> + static {
> + try {
> + for (int i = 0; i < T4_T6_Tables.whiteTerminatingCodes.length; i++) {
> + T4_T6_Tables.Entry entry = T4_T6_Tables.whiteTerminatingCodes[i];
> + whiteRunLengths.insert(entry.bitString, entry.value);
> + }
> + for (int i = 0; i < T4_T6_Tables.whiteMakeUpCodes.length; i++) {
> + T4_T6_Tables.Entry entry = T4_T6_Tables.whiteMakeUpCodes[i];
> + whiteRunLengths.insert(entry.bitString, entry.value);
> + }
> + for (int i = 0; i < T4_T6_Tables.blackTerminatingCodes.length; i++) {
> + T4_T6_Tables.Entry entry = T4_T6_Tables.blackTerminatingCodes[i];
> + blackRunLengths.insert(entry.bitString, entry.value);
> + }
> + for (int i = 0; i < T4_T6_Tables.blackMakeUpCodes.length; i++) {
> + T4_T6_Tables.Entry entry = T4_T6_Tables.blackMakeUpCodes[i];
> + blackRunLengths.insert(entry.bitString, entry.value);
> + }
> + for (int i = 0; i < T4_T6_Tables.additionalMakeUpCodes.length; i++) {
> + T4_T6_Tables.Entry entry = T4_T6_Tables.additionalMakeUpCodes[i];
> + whiteRunLengths.insert(entry.bitString, entry.value);
> + blackRunLengths.insert(entry.bitString, entry.value);
> + }
> + } catch (HuffmanTreeException cannotHappen) {
> + }
> + }
> +
> + public static byte[] decompress1D(byte[] compressed, int width, int height) throws ImageReadException {
> + BitInputStreamFlexible inputStream = new BitInputStreamFlexible(
> + new ByteArrayInputStream(compressed));
> + BitArrayOutputStream outputStream = new BitArrayOutputStream();
> + for (int y = 0; y < height; y++) {
> + int totalRunLength = 0;
> + boolean isWhite = true;
> + boolean isTerminated = false;
> + int rowLength;
> + for (rowLength = 0; rowLength < width || !isTerminated;) {
> + Integer runLength;
> + int color;
> + try {
> + if (isWhite) {
> + runLength = (Integer)whiteRunLengths.decode(inputStream);
> + color = 0x00;
> + } else {
> + runLength = (Integer)blackRunLengths.decode(inputStream);
> + color = 0x01;
> + }
> + } catch (HuffmanTreeException huffmanException) {
> + throw new ImageReadException("Decompression error", huffmanException);
> + }
> +
> + totalRunLength += runLength.intValue();
> + rowLength += runLength.intValue();
> + if (runLength.intValue() <= 63) {
> + for (int i = 0; i < totalRunLength; i++) {
> + outputStream.writeBit(color);
> + }
> + totalRunLength = 0;
> + isWhite = !isWhite;
> + isTerminated = true;
> + } else {
> + isTerminated = false;
> + }
> + }
> +
> + if (rowLength == width) {
> + inputStream.flushCache();
> + outputStream.flush();
> + } else if (rowLength > width) {
> + throw new ImageReadException("Unrecoverable row length error in image row " + y);
> + }
> + }
> + return outputStream.toByteArray();
> + }
> +}
>
> Added: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/T4_T6_Tables.java
> URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/T4_T6_Tables.java?rev=1212757&view=auto
> ==============================================================================
> --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/T4_T6_Tables.java (added)
> +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/common/itu_t4/T4_T6_Tables.java Sat Dec 10 10:14:26 2011
> @@ -0,0 +1,241 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements. See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.sanselan.common.itu_t4;
> +
> +public class T4_T6_Tables {
> + public static class Entry {
> + String bitString;
> + Integer value;
> +
> + public Entry(String bitString, Integer value) {
> + this.bitString = bitString;
> + this.value = value;
> + }
> + }
> +
> + public static final Entry[] whiteTerminatingCodes = {
> + new Entry("00110101", Integer.valueOf(0)),
> + new Entry("000111", Integer.valueOf(1)),
> + new Entry("0111", Integer.valueOf(2)),
> + new Entry("1000", Integer.valueOf(3)),
> + new Entry("1011", Integer.valueOf(4)),
> + new Entry("1100", Integer.valueOf(5)),
> + new Entry("1110", Integer.valueOf(6)),
> + new Entry("1111", Integer.valueOf(7)),
> + new Entry("10011", Integer.valueOf(8)),
> + new Entry("10100", Integer.valueOf(9)),
> + new Entry("00111", Integer.valueOf(10)),
> + new Entry("01000", Integer.valueOf(11)),
> + new Entry("001000", Integer.valueOf(12)),
> + new Entry("000011", Integer.valueOf(13)),
> + new Entry("110100", Integer.valueOf(14)),
> + new Entry("110101", Integer.valueOf(15)),
> + new Entry("101010", Integer.valueOf(16)),
> + new Entry("101011", Integer.valueOf(17)),
> + new Entry("0100111", Integer.valueOf(18)),
> + new Entry("0001100", Integer.valueOf(19)),
> + new Entry("0001000", Integer.valueOf(20)),
> + new Entry("0010111", Integer.valueOf(21)),
> + new Entry("0000011", Integer.valueOf(22)),
> + new Entry("0000100", Integer.valueOf(23)),
> + new Entry("0101000", Integer.valueOf(24)),
> + new Entry("0101011", Integer.valueOf(25)),
> + new Entry("0010011", Integer.valueOf(26)),
> + new Entry("0100100", Integer.valueOf(27)),
> + new Entry("0011000", Integer.valueOf(28)),
> + new Entry("00000010", Integer.valueOf(29)),
> + new Entry("00000011", Integer.valueOf(30)),
> + new Entry("00011010", Integer.valueOf(31)),
> + new Entry("00011011", Integer.valueOf(32)),
> + new Entry("00010010", Integer.valueOf(33)),
> + new Entry("00010011", Integer.valueOf(34)),
> + new Entry("00010100", Integer.valueOf(35)),
> + new Entry("00010101", Integer.valueOf(36)),
> + new Entry("00010110", Integer.valueOf(37)),
> + new Entry("00010111", Integer.valueOf(38)),
> + new Entry("00101000", Integer.valueOf(39)),
> + new Entry("00101001", Integer.valueOf(40)),
> + new Entry("00101010", Integer.valueOf(41)),
> + new Entry("00101011", Integer.valueOf(42)),
> + new Entry("00101100", Integer.valueOf(43)),
> + new Entry("00101101", Integer.valueOf(44)),
> + new Entry("00000100", Integer.valueOf(45)),
> + new Entry("00000101", Integer.valueOf(46)),
> + new Entry("00001010", Integer.valueOf(47)),
> + new Entry("00001011", Integer.valueOf(48)),
> + new Entry("01010010", Integer.valueOf(49)),
> + new Entry("01010011", Integer.valueOf(50)),
> + new Entry("01010100", Integer.valueOf(51)),
> + new Entry("01010101", Integer.valueOf(52)),
> + new Entry("00100100", Integer.valueOf(53)),
> + new Entry("00100101", Integer.valueOf(54)),
> + new Entry("01011000", Integer.valueOf(55)),
> + new Entry("01011001", Integer.valueOf(56)),
> + new Entry("01011010", Integer.valueOf(57)),
> + new Entry("01011011", Integer.valueOf(58)),
> + new Entry("01001010", Integer.valueOf(59)),
> + new Entry("01001011", Integer.valueOf(60)),
> + new Entry("00110010", Integer.valueOf(61)),
> + new Entry("00110011", Integer.valueOf(62)),
> + new Entry("00110100", Integer.valueOf(63)),
> + };
> +
> + public static final Entry[] blackTerminatingCodes = {
> + new Entry("0000110111", Integer.valueOf(0)),
> + new Entry("010", Integer.valueOf(1)),
> + new Entry("11", Integer.valueOf(2)),
> + new Entry("10", Integer.valueOf(3)),
> + new Entry("011", Integer.valueOf(4)),
> + new Entry("0011", Integer.valueOf(5)),
> + new Entry("0010", Integer.valueOf(6)),
> + new Entry("00011", Integer.valueOf(7)),
> + new Entry("000101", Integer.valueOf(8)),
> + new Entry("000100", Integer.valueOf(9)),
> + new Entry("0000100", Integer.valueOf(10)),
> + new Entry("0000101", Integer.valueOf(11)),
> + new Entry("0000111", Integer.valueOf(12)),
> + new Entry("00000100", Integer.valueOf(13)),
> + new Entry("00000111", Integer.valueOf(14)),
> + new Entry("000011000", Integer.valueOf(15)),
> + new Entry("0000010111", Integer.valueOf(16)),
> + new Entry("0000011000", Integer.valueOf(17)),
> + new Entry("0000001000", Integer.valueOf(18)),
> + new Entry("00001100111", Integer.valueOf(19)),
> + new Entry("00001101000", Integer.valueOf(20)),
> + new Entry("00001101100", Integer.valueOf(21)),
> + new Entry("00000110111", Integer.valueOf(22)),
> + new Entry("00000101000", Integer.valueOf(23)),
> + new Entry("00000010111", Integer.valueOf(24)),
> + new Entry("00000011000", Integer.valueOf(25)),
> + new Entry("000011001010", Integer.valueOf(26)),
> + new Entry("000011001011", Integer.valueOf(27)),
> + new Entry("000011001100", Integer.valueOf(28)),
> + new Entry("000011001101", Integer.valueOf(29)),
> + new Entry("000001101000", Integer.valueOf(30)),
> + new Entry("000001101001", Integer.valueOf(31)),
> + new Entry("000001101010", Integer.valueOf(32)),
> + new Entry("000001101011", Integer.valueOf(33)),
> + new Entry("000011010010", Integer.valueOf(34)),
> + new Entry("000011010011", Integer.valueOf(35)),
> + new Entry("000011010100", Integer.valueOf(36)),
> + new Entry("000011010101", Integer.valueOf(37)),
> + new Entry("000011010110", Integer.valueOf(38)),
> + new Entry("000011010111", Integer.valueOf(39)),
> + new Entry("000001101100", Integer.valueOf(40)),
> + new Entry("000001101101", Integer.valueOf(41)),
> + new Entry("000011011010", Integer.valueOf(42)),
> + new Entry("000011011011", Integer.valueOf(43)),
> + new Entry("000001010100", Integer.valueOf(44)),
> + new Entry("000001010101", Integer.valueOf(45)),
> + new Entry("000001010110", Integer.valueOf(46)),
> + new Entry("000001010111", Integer.valueOf(47)),
> + new Entry("000001100100", Integer.valueOf(48)),
> + new Entry("000001100101", Integer.valueOf(49)),
> + new Entry("000001010010", Integer.valueOf(50)),
> + new Entry("000001010011", Integer.valueOf(51)),
> + new Entry("000000100100", Integer.valueOf(52)),
> + new Entry("000000110111", Integer.valueOf(53)),
> + new Entry("000000111000", Integer.valueOf(54)),
> + new Entry("000000100111", Integer.valueOf(55)),
> + new Entry("000000101000", Integer.valueOf(56)),
> + new Entry("000001011000", Integer.valueOf(57)),
> + new Entry("000001011001", Integer.valueOf(58)),
> + new Entry("000000101011", Integer.valueOf(59)),
> + new Entry("000000101100", Integer.valueOf(60)),
> + new Entry("000001011010", Integer.valueOf(61)),
> + new Entry("000001100110", Integer.valueOf(62)),
> + new Entry("000001100111", Integer.valueOf(63)),
> + };
> +
> + public static final Entry[] whiteMakeUpCodes = {
> + new Entry("11011", Integer.valueOf(64)),
> + new Entry("10010", Integer.valueOf(128)),
> + new Entry("010111", Integer.valueOf(192)),
> + new Entry("0110111", Integer.valueOf(256)),
> + new Entry("00110110", Integer.valueOf(320)),
> + new Entry("00110111", Integer.valueOf(384)),
> + new Entry("01100100", Integer.valueOf(448)),
> + new Entry("01100101", Integer.valueOf(512)),
> + new Entry("01101000", Integer.valueOf(576)),
> + new Entry("01100111", Integer.valueOf(640)),
> + new Entry("011001100", Integer.valueOf(704)),
> + new Entry("011001101", Integer.valueOf(768)),
> + new Entry("011010010", Integer.valueOf(832)),
> + new Entry("011010011", Integer.valueOf(896)),
> + new Entry("011010100", Integer.valueOf(960)),
> + new Entry("011010101", Integer.valueOf(1024)),
> + new Entry("011010110", Integer.valueOf(1088)),
> + new Entry("011010111", Integer.valueOf(1152)),
> + new Entry("011011000", Integer.valueOf(1216)),
> + new Entry("011011001", Integer.valueOf(1280)),
> + new Entry("011011010", Integer.valueOf(1344)),
> + new Entry("011011011", Integer.valueOf(1408)),
> + new Entry("010011000", Integer.valueOf(1472)),
> + new Entry("010011001", Integer.valueOf(1536)),
> + new Entry("010011010", Integer.valueOf(1600)),
> + new Entry("011000", Integer.valueOf(1664)),
> + new Entry("010011011", Integer.valueOf(1728)),
> + new Entry("000000000001", Integer.valueOf(0)) // EOL
> + };
> +
> + public static final Entry[] blackMakeUpCodes = {
> + new Entry("0000001111", Integer.valueOf(64)),
> + new Entry("000011001000", Integer.valueOf(128)),
> + new Entry("000011001001", Integer.valueOf(192)),
> + new Entry("000001011011", Integer.valueOf(256)),
> + new Entry("000000110011", Integer.valueOf(320)),
> + new Entry("000000110100", Integer.valueOf(384)),
> + new Entry("000000110101", Integer.valueOf(448)),
> + new Entry("0000001101100", Integer.valueOf(512)),
> + new Entry("0000001101101", Integer.valueOf(576)),
> + new Entry("0000001001010", Integer.valueOf(640)),
> + new Entry("0000001001011", Integer.valueOf(704)),
> + new Entry("0000001001100", Integer.valueOf(768)),
> + new Entry("0000001001101", Integer.valueOf(832)),
> + new Entry("0000001110010", Integer.valueOf(896)),
> + new Entry("0000001110011", Integer.valueOf(960)),
> + new Entry("0000001110100", Integer.valueOf(1024)),
> + new Entry("0000001110101", Integer.valueOf(1088)),
> + new Entry("0000001110110", Integer.valueOf(1152)),
> + new Entry("0000001110111", Integer.valueOf(1216)),
> + new Entry("0000001010010", Integer.valueOf(1280)),
> + new Entry("0000001010011", Integer.valueOf(1344)),
> + new Entry("0000001010100", Integer.valueOf(1408)),
> + new Entry("0000001010101", Integer.valueOf(1472)),
> + new Entry("0000001011010", Integer.valueOf(1536)),
> + new Entry("0000001011011", Integer.valueOf(1600)),
> + new Entry("0000001100100", Integer.valueOf(1664)),
> + new Entry("0000001100101", Integer.valueOf(1728)),
> + new Entry("00000000000", Integer.valueOf(0)) // EOL
> + };
> +
> + public static final Entry[] additionalMakeUpCodes = {
> + new Entry("00000001000", Integer.valueOf(1792)),
> + new Entry("00000001100", Integer.valueOf(1856)),
> + new Entry("00000001101", Integer.valueOf(1920)),
> + new Entry("000000010010", Integer.valueOf(1984)),
> + new Entry("000000010011", Integer.valueOf(2048)),
> + new Entry("000000010100", Integer.valueOf(2112)),
> + new Entry("000000010101", Integer.valueOf(2176)),
> + new Entry("000000010110", Integer.valueOf(2240)),
> + new Entry("000000010111", Integer.valueOf(2304)),
> + new Entry("000000011100", Integer.valueOf(2368)),
> + new Entry("000000011101", Integer.valueOf(2432)),
> + new Entry("000000011110", Integer.valueOf(2496)),
> + new Entry("000000011111", Integer.valueOf(2560)),
> + };
> +}
>
> Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReader.java
> URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReader.java?rev=1212757&r1=1212756&r2=1212757&view=diff
> ==============================================================================
> --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReader.java (original)
> +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReader.java Sat Dec 10 10:14:26 2011
> @@ -25,6 +25,7 @@ import org.apache.sanselan.ImageReadExce
> import org.apache.sanselan.common.BinaryConstants;
> import org.apache.sanselan.common.BitInputStream;
> import org.apache.sanselan.common.PackBits;
> +import org.apache.sanselan.common.itu_t4.T4Compression;
> import org.apache.sanselan.common.mylzw.MyLZWDecompressor;
> import org.apache.sanselan.formats.tiff.constants.TiffConstants;
> import org.apache.sanselan.formats.tiff.photometricinterpreters.PhotometricInterpreter;
> @@ -37,14 +38,18 @@ public abstract class DataReader impleme
>
> protected final int predictor;
> protected final int samplesPerPixel;
> + protected final int width, height;
>
> public DataReader(PhotometricInterpreter photometricInterpreter,
> - int bitsPerSample[], int predictor, int samplesPerPixel)
> + int bitsPerSample[], int predictor, int samplesPerPixel,
> + int width, int height)
> {
> this.photometricInterpreter = photometricInterpreter;
> this.bitsPerSample = bitsPerSample;
> this.samplesPerPixel = samplesPerPixel;
> this.predictor = predictor;
> + this.width = width;
> + this.height = height;
> last = new int[samplesPerPixel];
> }
>
> @@ -101,11 +106,10 @@ public abstract class DataReader impleme
> {
> switch (compression)
> {
> - case 1 : // None;
> + case TIFF_COMPRESSION_UNCOMPRESSED : // None;
> return compressed;
> - case 2 : // CCITT Group 3 1-Dimensional Modified Huffman run-length encoding.
> - throw new ImageReadException("Tiff: unknown compression: "
> - + compression);
> + case TIFF_COMPRESSION_CCITT_1D : // CCITT Group 3 1-Dimensional Modified Huffman run-length encoding.
> + return T4Compression.decompress1D(compressed, width, height);
> case TIFF_COMPRESSION_LZW : // LZW
> {
> InputStream is = new ByteArrayInputStream(compressed);
> @@ -132,7 +136,7 @@ public abstract class DataReader impleme
> }
>
> default :
> - throw new ImageReadException("Tiff: unknown compression: "
> + throw new ImageReadException("Tiff: unknown/unsupported compression: "
> + compression);
> }
> }
>
> Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderStrips.java
> URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderStrips.java?rev=1212757&r1=1212756&r2=1212757&view=diff
> ==============================================================================
> --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderStrips.java (original)
> +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderStrips.java Sat Dec 10 10:14:26 2011
> @@ -29,7 +29,6 @@ public final class DataReaderStrips exte
> {
>
> private final int bitsPerPixel;
> - private final int width, height;
> private final int compression;
> private final int rowsPerStrip;
>
> @@ -40,11 +39,9 @@ public final class DataReaderStrips exte
> int samplesPerPixel, int width, int height, int compression,
> int rowsPerStrip, TiffImageData.Strips imageData)
> {
> - super(photometricInterpreter, bitsPerSample, predictor, samplesPerPixel);
> + super(photometricInterpreter, bitsPerSample, predictor, samplesPerPixel, width, height);
>
> this.bitsPerPixel = bitsPerPixel;
> - this.width = width;
> - this.height = height;
> this.compression = compression;
> this.rowsPerStrip = rowsPerStrip;
> this.imageData = imageData;
>
> Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderTiled.java
> URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderTiled.java?rev=1212757&r1=1212756&r2=1212757&view=diff
> ==============================================================================
> --- commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderTiled.java (original)
> +++ commons/proper/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderTiled.java Sat Dec 10 10:14:26 2011
> @@ -33,8 +33,6 @@ public final class DataReaderTiled exten
>
> private final int bitsPerPixel;
>
> - private final int width, height;
> -
> private final int compression;
>
> private final TiffImageData.Tiles imageData;
> @@ -44,14 +42,12 @@ public final class DataReaderTiled exten
> int bitsPerSample[], int predictor, int samplesPerPixel, int width,
> int height, int compression, TiffImageData.Tiles imageData)
> {
> - super(photometricInterpreter, bitsPerSample, predictor, samplesPerPixel);
> + super(photometricInterpreter, bitsPerSample, predictor, samplesPerPixel, width, height);
>
> this.tileWidth = tileWidth;
> this.tileLength = tileLength;
>
> this.bitsPerPixel = bitsPerPixel;
> - this.width = width;
> - this.height = height;
> this.compression = compression;
>
> this.imageData = imageData;
>
> Added: commons/proper/sanselan/trunk/src/test/data/images/tiff/3/1pagefax.tif
> URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/test/data/images/tiff/3/1pagefax.tif?rev=1212757&view=auto
> ==============================================================================
> Binary file - no diff available.
>
> Propchange: commons/proper/sanselan/trunk/src/test/data/images/tiff/3/1pagefax.tif
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added: commons/proper/sanselan/trunk/src/test/data/images/tiff/3/info.txt
> URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/test/data/images/tiff/3/info.txt?rev=1212757&view=auto
> ==============================================================================
> --- commons/proper/sanselan/trunk/src/test/data/images/tiff/3/info.txt (added)
> +++ commons/proper/sanselan/trunk/src/test/data/images/tiff/3/info.txt Sat Dec 10 10:14:26 2011
> @@ -0,0 +1,9 @@
> +1pagefax.tiff
> +-------------
> +Contributed to the project by Damjan Jovanovic
> +
> +This is a completely blank standard resolution fax,
> +in compression=2 format.
> +
> +It was generated from a similarly blank PDF using Ghostscript:
> +gs -q -sDEVICE=tiffcrle -r204x98 -dBATCH -dPDFFitPage -dNOPAUSE -sOutputFile=1pagefax.tif 1pagefax.pdf
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org