float[] srcMinVal, float[]srcMaxVal,
float[] dstMinVal, float[]dstMaxVal) {
LCMSImageLayout srcIL, dstIL;
// Can't pass src and dst directly to CMM, so process per scanline
SampleModel srcSM = src.getSampleModel();
SampleModel dstSM = dst.getSampleModel();
int srcTransferType = src.getTransferType();
int dstTransferType = dst.getTransferType();
boolean srcIsFloat, dstIsFloat;
if ((srcTransferType == DataBuffer.TYPE_FLOAT) ||
(srcTransferType == DataBuffer.TYPE_DOUBLE)) {
srcIsFloat = true;
} else {
srcIsFloat = false;
}
if ((dstTransferType == DataBuffer.TYPE_FLOAT) ||
(dstTransferType == DataBuffer.TYPE_DOUBLE)) {
dstIsFloat = true;
} else {
dstIsFloat = false;
}
int w = src.getWidth();
int h = src.getHeight();
int srcNumBands = src.getNumBands();
int dstNumBands = dst.getNumBands();
float[] srcScaleFactor = new float[srcNumBands];
float[] dstScaleFactor = new float[dstNumBands];
float[] srcUseMinVal = new float[srcNumBands];
float[] dstUseMinVal = new float[dstNumBands];
for (int i = 0; i < srcNumBands; i++) {
if (srcIsFloat) {
srcScaleFactor[i] = 65535.0f / (srcMaxVal[i] - srcMinVal[i]);
srcUseMinVal[i] = srcMinVal[i];
} else {
if (srcTransferType == DataBuffer.TYPE_SHORT) {
srcScaleFactor[i] = 65535.0f / 32767.0f;
} else {
srcScaleFactor[i] = 65535.0f /
((float) ((1 << srcSM.getSampleSize(i)) - 1));
}
srcUseMinVal[i] = 0.0f;
}
}
for (int i = 0; i < dstNumBands; i++) {
if (dstIsFloat) {
dstScaleFactor[i] = (dstMaxVal[i] - dstMinVal[i]) / 65535.0f;
dstUseMinVal[i] = dstMinVal[i];
} else {
if (dstTransferType == DataBuffer.TYPE_SHORT) {
dstScaleFactor[i] = 32767.0f / 65535.0f;
} else {
dstScaleFactor[i] =
((float) ((1 << dstSM.getSampleSize(i)) - 1)) /
65535.0f;
}
dstUseMinVal[i] = 0.0f;
}
}