001: /**
002: * Copyright (c) 2006, www.pdfbox.org
003: * All rights reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions are met:
007: *
008: * 1. Redistributions of source code must retain the above copyright notice,
009: * this list of conditions and the following disclaimer.
010: * 2. 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: * 3. Neither the name of pdfbox; nor the names of its
014: * contributors may be used to endorse or promote products derived from this
015: * software without specific prior written permission.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
018: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
019: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
020: * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
021: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
024: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: *
028: * http://www.pdfbox.org
029: *
030: */package org.pdfbox.pdmodel.common.function;
031:
032: import java.io.IOException;
033:
034: import org.pdfbox.cos.COSBase;
035: import org.pdfbox.cos.COSDictionary;
036: import org.pdfbox.cos.COSObject;
037: import org.pdfbox.cos.COSStream;
038: import org.pdfbox.pdmodel.common.COSObjectable;
039: import org.pdfbox.pdmodel.common.PDRange;
040: import org.pdfbox.pdmodel.common.PDStream;
041:
042: /**
043: * This class represents a function in a PDF document.
044: *
045: * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
046: * @version $Revision: 1.3 $
047: */
048: public abstract class PDFunction implements COSObjectable {
049: /**
050: * Create the correct PD Model function based on the COS base function.
051: *
052: * @param function The COS function dictionary.
053: *
054: * @return The PDModel Function object.
055: *
056: * @throws IOException If we are unable to create the PDFunction object.
057: */
058: public static PDFunction create(COSBase function)
059: throws IOException {
060: PDFunction retval = null;
061: if (function instanceof COSObject) {
062: function = ((COSObject) function).getCOSObject();
063: }
064: if (function instanceof COSDictionary) {
065: COSDictionary funcDic = (COSDictionary) function;
066: int functionType = funcDic.getInt("FunctionType");
067: if (function instanceof COSStream) {
068: if (functionType == 0) {
069: retval = new PDFunctionType0(new PDStream(
070: (COSStream) function));
071: } else if (functionType == 4) {
072: retval = new PDFunctionType4(new PDStream(
073: (COSStream) function));
074: } else {
075: throw new IOException(
076: "Error: Unknown stream function type "
077: + functionType);
078: }
079: } else {
080: if (functionType == 2) {
081: retval = new PDFunctionType2(funcDic);
082: } else if (functionType == 3) {
083: retval = new PDFunctionType3(funcDic);
084: } else {
085: throw new IOException(
086: "Error: Unknown dictionary function type "
087: + functionType);
088: }
089: }
090:
091: } else {
092: throw new IOException(
093: "Error: Unknown COS type for function " + function);
094: }
095: return retval;
096: }
097:
098: /**
099: * This will get the number of output parameters that
100: * have a range specified. A range for output parameters
101: * is optional so this may return zero for a function
102: * that does have output parameters, this will simply return the
103: * number that have the rnage specified.
104: *
105: * @return The number of input parameters that have a range
106: * specified.
107: */
108: public abstract int getNumberOfOutputParameters();
109:
110: /**
111: * This will get the range for a certain output parameters. This is will never
112: * return null. If it is not present then the range 0 to 0 will
113: * be returned.
114: *
115: * @param n The output parameter number to get the range for.
116: *
117: * @return The range for this component.
118: */
119: public abstract PDRange getRangeForOutput(int n);
120:
121: /**
122: * This will set the a range for output parameter.
123: *
124: * @param range The new range for the output parameter.
125: * @param n The ouput parameter number to set the range for.
126: */
127: public abstract void setRangeForOutput(PDRange range, int n);
128:
129: /**
130: * This will get the number of input parameters that
131: * have a domain specified.
132: *
133: * @return The number of input parameters that have a domain
134: * specified.
135: */
136: public abstract int getNumberOfInputParameters();
137:
138: /**
139: * This will get the range for a certain input parameter. This is will never
140: * return null. If it is not present then the range 0 to 0 will
141: * be returned.
142: *
143: * @param n The parameter number to get the domain for.
144: *
145: * @return The domain range for this component.
146: */
147: public abstract PDRange getDomainForInput(int n);
148:
149: /**
150: * This will set the domain for the input values.
151: *
152: * @param range The new range for the input.
153: * @param n The number of the input parameter to set the domain for.
154: */
155: public abstract void setDomainForInput(PDRange range, int n);
156:
157: }
|