001: /*
002: * $Id: Predictor.java,v 1.2 2007/12/20 18:33:33 rbair Exp $
003: *
004: * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005: * Santa Clara, California 95054, U.S.A. All rights reserved.
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2.1 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this library; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
020: */
021:
022: package com.sun.pdfview.decode;
023:
024: import java.nio.ByteBuffer;
025:
026: import java.io.IOException;
027:
028: import com.sun.pdfview.PDFObject;
029: import com.sun.pdfview.PDFParseException;
030:
031: /**
032: * The abstract superclass of various predictor objects that undo well-known
033: * prediction algorithms.
034: */
035: public abstract class Predictor {
036: /** well known algorithms */
037: public static final int TIFF = 0;
038: public static final int PNG = 1;
039:
040: /** the algorithm to use */
041: private int algorithm;
042:
043: /** the number of colors per sample */
044: private int colors = 1;
045:
046: /** the number of bits per color component */
047: private int bpc = 8;
048:
049: /** the number of columns per row */
050: private int columns = 1;
051:
052: /**
053: * Create an instance of a predictor. Use <code>getPredictor()</code>
054: * instead of this.
055: */
056: protected Predictor(int algorithm) {
057: this .algorithm = algorithm;
058: }
059:
060: /**
061: * Actually perform this algorithm on decoded image data.
062: * Subclasses must implement this method
063: */
064: public abstract ByteBuffer unpredict(ByteBuffer imageData)
065: throws IOException;
066:
067: /**
068: * Get an instance of a predictor
069: *
070: * @param params the filter parameters
071: */
072: public static Predictor getPredictor(PDFObject params)
073: throws IOException {
074: // get the algorithm (required)
075: PDFObject algorithmObj = params.getDictRef("Predictor");
076: if (algorithmObj == null) {
077: // no predictor
078: return null;
079: }
080: int algorithm = algorithmObj.getIntValue();
081:
082: // create the predictor object
083: Predictor predictor = null;
084: switch (algorithm) {
085: case 1:
086: // no predictor
087: return null;
088: case 2:
089: throw new PDFParseException("Tiff Predictor not supported");
090: case 10:
091: case 11:
092: case 12:
093: case 13:
094: case 14:
095: case 15:
096: predictor = new PNGPredictor();
097: break;
098: default:
099: throw new PDFParseException("Unknown predictor: "
100: + algorithm);
101: }
102:
103: // read the colors (optional)
104: PDFObject colorsObj = params.getDictRef("Colors");
105: if (colorsObj != null) {
106: predictor.setColors(colorsObj.getIntValue());
107: }
108:
109: // read the bits per component (optional)
110: PDFObject bpcObj = params.getDictRef("BitsPerComponent");
111: if (bpcObj != null) {
112: predictor.setBitsPerComponent(bpcObj.getIntValue());
113: }
114:
115: // read the columns (optional)
116: PDFObject columnsObj = params.getDictRef("Columns");
117: if (columnsObj != null) {
118: predictor.setColumns(columnsObj.getIntValue());
119: }
120:
121: // all set
122: return predictor;
123: }
124:
125: /**
126: * Get the algorithm in use
127: *
128: * @return one of the known algorithm types
129: */
130: public int getAlgorithm() {
131: return algorithm;
132: }
133:
134: /**
135: * Get the number of colors per sample
136: */
137: public int getColors() {
138: return colors;
139: }
140:
141: /**
142: * Set the number of colors per sample
143: */
144: protected void setColors(int colors) {
145: this .colors = colors;
146: }
147:
148: /**
149: * Get the number of bits per color component
150: */
151: public int getBitsPerComponent() {
152: return bpc;
153: }
154:
155: /**
156: * Set the number of bits per color component
157: */
158: public void setBitsPerComponent(int bpc) {
159: this .bpc = bpc;
160: }
161:
162: /**
163: * Get the number of columns
164: */
165: public int getColumns() {
166: return columns;
167: }
168:
169: /**
170: * Set the number of columns
171: */
172: public void setColumns(int columns) {
173: this.columns = columns;
174: }
175: }
|