/*
* $Id: FunctionType2.java,v 1.2 2007-12-20 18:33:34 rbair Exp $
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package com.sun.pdfview.function;
import java.io.IOException;
import com.sun.pdfview.PDFObject;
import com.sun.pdfview.PDFParseException;
/**
* A type 2 function is an exponential interpolation function, which maps
* from one input value to n output values using a simple exponential
* formula.
*/
public class FunctionType2 extends PDFFunction {
/** the function's value at zero for the n outputs */
private float[] c0 = new float[] { 0f };
/** the function's value at one for the n outputs */
private float[] c1 = new float[] { 1f };
/** the exponent */
private float n;
/** Creates a new instance of FunctionType2 */
public FunctionType2() {
super(TYPE_2);
}
/**
* Read the zeros, ones and exponent
*/
protected void parse(PDFObject obj) throws IOException
{
// read the exponent (required)
PDFObject nObj = obj.getDictRef("N");
if (nObj == null) {
throw new PDFParseException("Exponent required for function type 2!");
}
setN(nObj.getFloatValue());
// read the zeros array (optional)
PDFObject cZeroObj = obj.getDictRef("C0");
if (cZeroObj != null) {
PDFObject[] cZeroAry = cZeroObj.getArray();
float[] cZero = new float[cZeroAry.length];
for (int i = 0; i < cZeroAry.length; i++) {
cZero[i] = cZeroAry[i].getFloatValue();
}
setC0(cZero);
}
// read the ones array (optional)
PDFObject cOneObj = obj.getDictRef("C1");
if (cOneObj != null) {
PDFObject[] cOneAry = cOneObj.getArray();
float[] cOne = new float[cOneAry.length];
for (int i = 0; i < cOneAry.length; i++) {
cOne[i] = cOneAry[i].getFloatValue();
}
setC1(cOne);
}
}
/**
* Calculate the function value for the input. For each output (j),
* the function value is:
* C0(j) + x^N * (C1(j) - C0(j))
*/
protected void doFunction(float[] inputs, int inputOffset,
float[] outputs, int outputOffset)
{
// read the input value
float input = inputs[inputOffset];
// calculate the output values
for (int i = 0; i < getNumOutputs(); i++) {
outputs[i + outputOffset] = getC0(i) +
(float) (Math.pow(input, getN()) * (getC1(i) - getC0(i)));
}
}
/**
* Get the exponent
*/
public float getN() {
return n;
}
/**
* Set the exponent
*/
protected void setN(float n) {
this.n = n;
}
/**
* Get the values at zero
*/
public float getC0(int index) {
return c0[index];
}
/**
* Set the values at zero
*/
protected void setC0(float[] c0) {
this.c0 = c0;
}
/**
* Get the values at one
*/
public float getC1(int index) {
return c1[index];
}
/**
* Set the values at one
*/
protected void setC1(float[] c1) {
this.c1 = c1;
}
}