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 org.pdfbox.cos.COSArray;
033: import org.pdfbox.cos.COSBase;
034: import org.pdfbox.cos.COSFloat;
035: import org.pdfbox.cos.COSName;
036: import org.pdfbox.cos.COSStream;
037: import org.pdfbox.pdmodel.PDDocument;
038: import org.pdfbox.pdmodel.common.PDRange;
039: import org.pdfbox.pdmodel.common.PDStream;
040:
041: /**
042: * This class represents a function in a PDF document.
043: *
044: * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
045: * @version $Revision: 1.3 $
046: */
047: public abstract class PDStreamFunction extends PDFunction {
048: private PDStream function = null;
049:
050: /**
051: * Constructor to create a new blank function, should only be called by
052: * subclasses.
053: *
054: * @param doc The document that this function is part of.
055: * @param functionType An integer describing the function type, only 0,2,3,4
056: * are defined by the PDF sepc.
057: */
058: protected PDStreamFunction(PDDocument doc, int functionType) {
059: function = new PDStream(doc);
060: function.getStream().setInt("FunctionType", functionType);
061: }
062:
063: /**
064: * Constructor.
065: *
066: * @param functionDictionary The prepopulated function dictionary.
067: */
068: public PDStreamFunction(PDStream functionDictionary) {
069: function = functionDictionary;
070: }
071:
072: /**
073: * Convert this standard java object to a COS object.
074: *
075: * @return The cos object that matches this Java object.
076: */
077: public COSBase getCOSObject() {
078: return function.getCOSObject();
079: }
080:
081: /**
082: * This will get the underlying array value.
083: *
084: * @return The cos object that this object wraps.
085: */
086: public COSStream getCOSStream() {
087: return function.getStream();
088: }
089:
090: private COSArray getRangeArray(String fieldName, int n) {
091: COSArray rangeArray = (COSArray) function.getStream()
092: .getDictionaryObject(COSName.getPDFName("Range"));
093: if (rangeArray == null) {
094: rangeArray = new COSArray();
095: function.getStream().setItem(fieldName, rangeArray);
096: while (rangeArray.size() < n * 2) {
097: rangeArray.add(new COSFloat(0));
098: rangeArray.add(new COSFloat(0));
099: }
100: }
101: return rangeArray;
102: }
103:
104: /**
105: * This will get the number of output parameters that
106: * have a range specified. A range for output parameters
107: * is optional so this may return zero for a function
108: * that does have output parameters, this will simply return the
109: * number that have the rnage specified.
110: *
111: * @return The number of input parameters that have a range
112: * specified.
113: */
114: public int getNumberOfOutputParameters() {
115: COSArray array = getRangeArray("Range", 0);
116: return array.size() / 2;
117: }
118:
119: /**
120: * This will get the range for a certain output parameters. This is will never
121: * return null. If it is not present then the range 0 to 0 will
122: * be returned.
123: *
124: * @param n The output parameter number to get the range for.
125: *
126: * @return The range for this component.
127: */
128: public PDRange getRangeForOutput(int n) {
129: COSArray rangeArray = getRangeArray("Range", n);
130: return new PDRange(rangeArray, n);
131: }
132:
133: /**
134: * This will set the a range for output parameter.
135: *
136: * @param range The new range for the output parameter.
137: * @param n The ouput parameter number to set the range for.
138: */
139: public void setRangeForOutput(PDRange range, int n) {
140: COSArray rangeArray = getRangeArray("Range", n);
141: rangeArray.set(n * 2, new COSFloat(range.getMin()));
142: rangeArray.set(n * 2 + 1, new COSFloat(range.getMax()));
143: }
144:
145: /**
146: * This will get the number of input parameters that
147: * have a domain specified.
148: *
149: * @return The number of input parameters that have a domain
150: * specified.
151: */
152: public int getNumberOfInputParameters() {
153: COSArray array = getRangeArray("Domain", 0);
154: return array.size() / 2;
155: }
156:
157: /**
158: * This will get the range for a certain input parameter. This is will never
159: * return null. If it is not present then the range 0 to 0 will
160: * be returned.
161: *
162: * @param n The parameter number to get the domain for.
163: *
164: * @return The domain range for this component.
165: */
166: public PDRange getDomainForInput(int n) {
167: COSArray rangeArray = getRangeArray("Domain", n);
168: return new PDRange(rangeArray, n);
169: }
170:
171: /**
172: * This will set the domain for the input values.
173: *
174: * @param range The new range for the input.
175: * @param n The number of the input parameter to set the domain for.
176: */
177: public void setDomainForInput(PDRange range, int n) {
178: COSArray rangeArray = getRangeArray("Domain", n);
179: rangeArray.set(n * 2, new COSFloat(range.getMin()));
180: rangeArray.set(n * 2 + 1, new COSFloat(range.getMax()));
181: }
182: }
|