in modules/awt/src/main/java/common/java/awt/image/BandCombineOp.java [299:476]
private int ippFilter(Raster src, WritableRaster dst) {
boolean invertChannels;
boolean inPlace = (src == dst);
int type;
int srcStride, dstStride;
int offsets[] = null;
int srcBands = src.getNumBands();
int dstBands = dst.getNumBands();
if (
dstBands != 3 ||
(srcBands != 3 &&
!(srcBands == 4 &&
matrix[0][3] == 0 &&
matrix[1][3] == 0 &&
matrix[2][3] == 0)
)
) {
return slowFilter(src, dst);
}
SampleModel srcSM = src.getSampleModel();
SampleModel dstSM = dst.getSampleModel();
if (
srcSM instanceof SinglePixelPackedSampleModel &&
dstSM instanceof SinglePixelPackedSampleModel
) {
// Check SinglePixelPackedSampleModel
SinglePixelPackedSampleModel sppsm1 = (SinglePixelPackedSampleModel) srcSM;
SinglePixelPackedSampleModel sppsm2 = (SinglePixelPackedSampleModel) dstSM;
if (
sppsm1.getDataType() != DataBuffer.TYPE_INT ||
sppsm2.getDataType() != DataBuffer.TYPE_INT
) {
return slowFilter(src, dst);
}
// Check sample models
if (
!Arrays.equals(sppsm2.getBitOffsets(), offsets3c) ||
!Arrays.equals(sppsm2.getBitMasks(), masks3c)
) {
return slowFilter(src, dst);
}
if (srcBands == 3) {
if (
!Arrays.equals(sppsm1.getBitOffsets(), offsets3c) ||
!Arrays.equals(sppsm1.getBitMasks(), masks3c)
) {
return slowFilter(src, dst);
}
} else if (srcBands == 4) {
if (
!Arrays.equals(sppsm1.getBitOffsets(), offsets4ac) ||
!Arrays.equals(sppsm1.getBitMasks(), masks4ac)
) {
return slowFilter(src, dst);
}
}
type = TYPE_BYTE4AC;
invertChannels = true;
srcStride = sppsm1.getScanlineStride() * 4;
dstStride = sppsm2.getScanlineStride() * 4;
} else if (
srcSM instanceof PixelInterleavedSampleModel &&
dstSM instanceof PixelInterleavedSampleModel
) {
if (srcBands != 3) {
return slowFilter(src, dst);
}
int srcDataType = srcSM.getDataType();
switch (srcDataType) {
case DataBuffer.TYPE_BYTE:
type = TYPE_BYTE3C;
break;
case DataBuffer.TYPE_USHORT:
type = TYPE_USHORT3C;
break;
case DataBuffer.TYPE_SHORT:
type = TYPE_SHORT3C;
break;
default:
return slowFilter(src, dst);
}
// Check PixelInterleavedSampleModel
PixelInterleavedSampleModel pism1 = (PixelInterleavedSampleModel) srcSM;
PixelInterleavedSampleModel pism2 = (PixelInterleavedSampleModel) dstSM;
if (
srcDataType != pism2.getDataType() ||
pism1.getPixelStride() != 3 ||
pism2.getPixelStride() != 3 ||
!Arrays.equals(pism1.getBandOffsets(), pism2.getBandOffsets())
) {
return slowFilter(src, dst);
}
if (Arrays.equals(pism1.getBandOffsets(), piInvOffsets)) {
invertChannels = true;
} else if (Arrays.equals(pism1.getBandOffsets(), piOffsets)) {
invertChannels = false;
} else {
return slowFilter(src, dst);
}
int dataTypeSize = DataBuffer.getDataTypeSize(srcDataType) / 8;
srcStride = pism1.getScanlineStride() * dataTypeSize;
dstStride = pism2.getScanlineStride() * dataTypeSize;
} else { // XXX - todo - IPP allows support for planar data also
return slowFilter(src, dst);
}
// Fill offsets if there's a child raster
if (src.getParent() != null || dst.getParent() != null) {
if (src.getSampleModelTranslateX() != 0 || src.getSampleModelTranslateY() != 0 ||
dst.getSampleModelTranslateX() != 0 || dst.getSampleModelTranslateY() != 0) {
offsets = new int[4];
offsets[0] = -src.getSampleModelTranslateX() + src.getMinX();
offsets[1] = -src.getSampleModelTranslateY() + src.getMinY();
offsets[2] = -dst.getSampleModelTranslateX() + dst.getMinX();
offsets[3] = -dst.getSampleModelTranslateY() + dst.getMinY();
}
}
Object srcData, dstData;
AwtImageBackdoorAccessor dbAccess = AwtImageBackdoorAccessor.getInstance();
try {
srcData = dbAccess.getData(src.getDataBuffer());
dstData = dbAccess.getData(dst.getDataBuffer());
} catch (IllegalArgumentException e) {
return -1; // Unknown data buffer type
}
float ippMatrix[] = new float[12];
if (invertChannels) {
// IPP treats big endian integers like BGR, so we have to
// swap columns 1 and 3 and rows 1 and 3
for (int i = 0; i < mxHeight; i++) {
ippMatrix[i*4] = matrix[2-i][2];
ippMatrix[i*4+1] = matrix[2-i][1];
ippMatrix[i*4+2] = matrix[2-i][0];
if (mxWidth == 4) {
ippMatrix[i*4+3] = matrix[2-i][3];
} else if (mxWidth == 5) {
ippMatrix[i*4+3] = matrix[2-i][4];
}
}
} else {
for (int i = 0; i < mxHeight; i++) {
ippMatrix[i*4] = matrix[i][0];
ippMatrix[i*4+1] = matrix[i][1];
ippMatrix[i*4+2] = matrix[i][2];
if (mxWidth == 4) {
ippMatrix[i*4+3] = matrix[i][3];
} else if (mxWidth == 5) {
ippMatrix[i*4+3] = matrix[i][4];
}
}
}
return ippColorTwist(
srcData, src.getWidth(), src.getHeight(), srcStride,
dstData, dst.getWidth(), dst.getHeight(), dstStride,
ippMatrix, type, offsets, inPlace);
}