int numberOfInputValues = input.length;
int numberOfOutputValues = getNumberOfOutputParameters();
int[] intInputValuesPrevious = new int[numberOfInputValues];
int[] intInputValuesNext = new int[numberOfInputValues];
for (int i=0; i<numberOfInputValues; i++) {
PDRange domain = getDomainForInput(i);
PDRange encode = getEncodeForParameter(i);
input[i] = clipToRange(input[i], domain.getMin(), domain.getMax());
input[i] = interpolate(input[i], domain.getMin(), domain.getMax(), encode.getMin(), encode.getMax());
input[i] = clipToRange(input[i], 0, sizeValues[i]-1);
intInputValuesPrevious[i] = (int)Math.floor(input[i]);
intInputValuesNext[i] = (int)Math.ceil(input[i]);
}
float[] outputValuesPrevious = null;
float[] outputValuesNext = null;
outputValuesPrevious = getSample(intInputValuesPrevious);
outputValuesNext = getSample(intInputValuesNext);
float[] outputValues = new float[numberOfOutputValues];
for (int i=0;i<numberOfOutputValues;i++)
{
PDRange range = getRangeForOutput(i);
PDRange decode = getDecodeForParameter(i);
// TODO using only a linear interpolation.
// See "Order" entry in table 3.36 of the PDF reference
outputValues[i] = (outputValuesPrevious[i] + outputValuesNext[i]) / 2;
outputValues[i] = interpolate(outputValues[i], 0, (float)Math.pow(2, bitsPerSample), decode.getMin(), decode.getMax());
outputValues[i] = clipToRange(outputValues[i], range.getMin(), range.getMax());
}
return outputValues;
}