/* * Copyright 2006-2017 ICEsoft Technologies Canada Corp. * * Licensed 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.icepdf.core.io; import java.io.IOException; import java.io.InputStream; /** * When decoding CCITTFaxDecode images via JAI, we sometimes have * to zero pad the input data, otherwise JAI will fail instead * of it gracefully assuming zero data itself. * As well, with some inline images, we can have some trailing * whitespace that should be removed. * It's typical to have to remove the whitespace and add the zeros. * * @author Mark Collette * @since 2.2 */ public class ZeroPaddedInputStream extends InputStream { private InputStream in; public ZeroPaddedInputStream(InputStream in) { this.in = in; } // // Methods from InputStream // public int read() throws IOException { int r = in.read(); //System.out.println("ZPIS.read() r: " + r); if (r < 0) return 0; return r; } public int read(byte[] buffer) throws IOException { return read(buffer, 0, buffer.length); } public int read(byte[] buffer, int offset, int length) throws IOException { int readIn = in.read(buffer, offset, length); //System.out.println("ZPIS.read( "+length+" ) readIn: " + readIn); if (readIn < length) { //String str = new String( buffer, offset, Math.max(0, readIn) ); //System.out.println( str ); //System.out.println("-----------"); //System.out.println( org.icepdf.core.util.Utils.convertByteArrayToHexString(buffer, offset, Math.max(0, readIn), true, 0, '0') ); if (readIn > 0) { while ((buffer[offset + readIn - 1] == 0x0A || buffer[offset + readIn - 1] == 0x0D || buffer[offset + readIn - 1] == 0x20) && readIn > 0) readIn--; return readIn; } int end = offset + length; for (int current = offset + Math.max(0, readIn); current < end; current++) buffer[current] = 0; } return length; } public void close() throws IOException { in.close(); } public int available() throws IOException { int a = in.available(); //System.out.println("ZPIS.available() : " + a); if (a <= 0) a = 1; return a; } public void mark(int readLimit) { in.mark(readLimit); } public boolean markSupported() { return in.markSupported(); } public void reset() throws IOException { in.reset(); } public long skip(long n) throws IOException { long s = in.skip(n); //System.out.println("ZPIS.skip( " + n + " ) : " + s); return s; } }