in java/org/libjpegturbo/turbojpeg/TJDecompressor.java [941:1015]
public void decompress8(BufferedImage dstImage) throws TJException {
if (dstImage == null)
throw new IllegalArgumentException("Invalid argument in decompress8()");
if (yuvImage != null) {
if (dstImage.getWidth() != yuvImage.getWidth() ||
dstImage.getHeight() != yuvImage.getHeight())
throw new IllegalArgumentException("BufferedImage dimensions do not match the dimensions of the source image.");
} else {
if (scalingFactor.getScaled(getJPEGWidth()) != dstImage.getWidth() ||
scalingFactor.getScaled(getJPEGHeight()) != dstImage.getHeight())
throw new IllegalArgumentException("BufferedImage dimensions do not match the scaled JPEG dimensions.");
}
int pixelFormat; boolean intPixels = false;
if (byteOrder == null)
byteOrder = ByteOrder.nativeOrder();
switch (dstImage.getType()) {
case BufferedImage.TYPE_3BYTE_BGR:
pixelFormat = TJ.PF_BGR; break;
case BufferedImage.TYPE_4BYTE_ABGR:
case BufferedImage.TYPE_4BYTE_ABGR_PRE:
pixelFormat = TJ.PF_XBGR; break;
case BufferedImage.TYPE_BYTE_GRAY:
pixelFormat = TJ.PF_GRAY; break;
case BufferedImage.TYPE_INT_BGR:
if (byteOrder == ByteOrder.BIG_ENDIAN)
pixelFormat = TJ.PF_XBGR;
else
pixelFormat = TJ.PF_RGBX;
intPixels = true; break;
case BufferedImage.TYPE_INT_RGB:
if (byteOrder == ByteOrder.BIG_ENDIAN)
pixelFormat = TJ.PF_XRGB;
else
pixelFormat = TJ.PF_BGRX;
intPixels = true; break;
case BufferedImage.TYPE_INT_ARGB:
case BufferedImage.TYPE_INT_ARGB_PRE:
if (byteOrder == ByteOrder.BIG_ENDIAN)
pixelFormat = TJ.PF_ARGB;
else
pixelFormat = TJ.PF_BGRA;
intPixels = true; break;
default:
throw new IllegalArgumentException("Unsupported BufferedImage format");
}
WritableRaster wr = dstImage.getRaster();
if (intPixels) {
SinglePixelPackedSampleModel sm =
(SinglePixelPackedSampleModel)dstImage.getSampleModel();
int stride = sm.getScanlineStride();
DataBufferInt db = (DataBufferInt)wr.getDataBuffer();
int[] buf = db.getData();
if (yuvImage != null) {
checkSubsampling();
decodeYUV8(yuvImage.getPlanes(), yuvImage.getOffsets(),
yuvImage.getStrides(), buf, 0, 0, yuvImage.getWidth(),
stride, yuvImage.getHeight(), pixelFormat);
} else {
if (jpegBuf == null)
throw new IllegalStateException(NO_ASSOC_ERROR);
decompress8(jpegBuf, jpegBufSize, buf, 0, 0, stride, pixelFormat);
}
} else {
ComponentSampleModel sm =
(ComponentSampleModel)dstImage.getSampleModel();
int pixelSize = sm.getPixelStride();
if (pixelSize != TJ.getPixelSize(pixelFormat))
throw new IllegalArgumentException("Inconsistency between pixel format and pixel size in BufferedImage");
int pitch = sm.getScanlineStride();
DataBufferByte db = (DataBufferByte)wr.getDataBuffer();
byte[] buf = db.getData();
decompress8(buf, 0, 0, pitch, pixelFormat);
}
}