001: /*
002: * Copyright (c) 2007, intarsys consulting GmbH
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * - Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * - Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * - Neither the name of intarsys nor the names of its contributors may be used
015: * to endorse or promote products derived from this software without specific
016: * prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
022: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
024: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
025: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
026: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
027: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
028: * POSSIBILITY OF SUCH DAMAGE.
029: */
030: package de.intarsys.pdf.filter;
031:
032: import java.io.IOException;
033: import de.intarsys.pdf.cos.COSBoolean;
034: import de.intarsys.pdf.cos.COSDictionary;
035: import de.intarsys.pdf.cos.COSName;
036: import de.intarsys.pdf.cos.COSNumber;
037: import de.intarsys.pdf.cos.COSStream;
038:
039: /**
040: * The abstract superclass for the implementation of IFilter.
041: */
042: public abstract class Filter extends Object implements IFilter {
043: public static final COSName CN_Filter_A85 = COSName.constant("A85"); //$NON-NLS-1$
044:
045: public static final COSName CN_Filter_AHx = COSName.constant("AHx"); //$NON-NLS-1$
046:
047: public static final COSName CN_Filter_ASCII85Decode = COSName
048: .constant("ASCII85Decode"); //$NON-NLS-1$
049:
050: public static final COSName CN_Filter_ASCIIHexDecode = COSName
051: .constant("ASCIIHexDecode"); //$NON-NLS-1$
052:
053: public static final COSName CN_Filter_CCF = COSName.constant("CCF"); //$NON-NLS-1$
054:
055: public static final COSName CN_Filter_CCITTFaxDecode = COSName
056: .constant("CCITTFaxDecode"); //$NON-NLS-1$
057:
058: public static final COSName CN_Filter_Crypt = COSName
059: .constant("Crypt"); //$NON-NLS-1$
060:
061: public static final COSName CN_Filter_DCT = COSName.constant("DCT"); //$NON-NLS-1$
062:
063: public static final COSName CN_Filter_DCTDecode = COSName
064: .constant("DCTDecode"); //$NON-NLS-1$
065:
066: public static final COSName CN_Filter_Fl = COSName.constant("Fl"); //$NON-NLS-1$
067:
068: //
069: public static final COSName CN_Filter_FlateDecode = COSName
070: .constant("FlateDecode"); //$NON-NLS-1$
071:
072: public static final COSName CN_Filter_JBIG2Decode = COSName
073: .constant("JBIG2Decode"); //$NON-NLS-1$
074:
075: public static final COSName CN_Filter_JPXDecode = COSName
076: .constant("JPXDecode"); //$NON-NLS-1$
077:
078: public static final COSName CN_Filter_LZW = COSName.constant("LZW"); //$NON-NLS-1$
079:
080: public static final COSName CN_Filter_LZWDecode = COSName
081: .constant("LZWDecode"); //$NON-NLS-1$
082:
083: public static final COSName CN_Filter_RL = COSName.constant("RL"); //$NON-NLS-1$
084:
085: public static final COSName CN_Filter_RunLengthDecode = COSName
086: .constant("RunLengthDecode"); //$NON-NLS-1$
087:
088: /** The options defining additional parameters to the filters algorithm */
089: private COSDictionary options;
090:
091: /**
092: * This is the stream where the filter is used.
093: *
094: * <p>
095: * Normally we should not need this one, but there are subtle implementation
096: * problems (see CCITT) where the available libraries need information that
097: * only can be found in this context.
098: * </p>
099: *
100: * <p>
101: * Look at this as if already deprecated.... :-)
102: * </p>
103: */
104: private COSStream stream;
105:
106: /**
107: *
108: */
109: public Filter(COSDictionary paramOptions) {
110: super ();
111:
112: options = paramOptions;
113: }
114:
115: abstract protected byte[] decode(byte[] source) throws IOException;
116:
117: /*
118: * (non-Javadoc)
119: *
120: * @see de.intarsys.pdf.filter.IFilter#decode(byte[], int, int)
121: */
122: public byte[] decode(byte[] source, int offset, int length)
123: throws IOException {
124: if ((offset != 0) || (length != source.length)) {
125: int minLength = Math.min(length, source.length);
126: byte[] temp = new byte[minLength];
127: System.arraycopy(source, offset, temp, 0, minLength);
128: return decode(temp);
129: }
130: return decode(source);
131: }
132:
133: abstract protected byte[] encode(byte[] source) throws IOException;
134:
135: /*
136: * (non-Javadoc)
137: *
138: * @see de.intarsys.pdf.filter.IFilter#encode(byte[], int, int)
139: */
140: public byte[] encode(byte[] source, int offset, int length)
141: throws IOException {
142: if ((offset != 0) || (length != source.length)) {
143: byte[] temp = new byte[length];
144: System.arraycopy(source, offset, temp, 0, length);
145: return encode(temp);
146: }
147: return encode(source);
148: }
149:
150: public boolean getOptionFieldBoolean(COSName name,
151: boolean defaultValue) {
152: COSBoolean value;
153:
154: if (getOptions() == null) {
155: return defaultValue;
156: }
157: value = getOptions().get(name).asBoolean();
158: if (value == null) {
159: return defaultValue;
160: }
161: return value.booleanValue();
162: }
163:
164: /**
165: * @param name
166: * @param defaultValue
167: *
168: * @return the integer value of the entry named #name or the specified
169: * default value if not present
170: */
171: public int getOptionFieldInt(COSName name, int defaultValue) {
172: COSNumber value;
173:
174: if (getOptions() == null) {
175: return defaultValue;
176: }
177: value = getOptions().get(name).asInteger();
178: if (value == null) {
179: return defaultValue;
180: }
181: return value.intValue();
182: }
183:
184: public COSDictionary getOptions() {
185: return options;
186: }
187:
188: public COSStream getStream() {
189: return stream;
190: }
191:
192: public void setStream(COSStream stream) {
193: this.stream = stream;
194: }
195: }
|