in src/main/java/org/apache/commons/imaging/formats/icns/IcnsDecoder.java [243:318]
private static BufferedImage decodeImageImpl(final IcnsType imageType,
final IcnsElement imageElement,
final IcnsElement[] icnsElements) throws ImagingException {
final int expectedSize = (imageType.getWidth() * imageType.getHeight()
* imageType.getBitsPerPixel() + 7) / 8;
byte[] imageData;
if (imageElement.data.length < expectedSize) {
if (imageType.getBitsPerPixel() != 32) {
throw new ImagingException("Short image data but not a 32 bit compressed type");
}
imageData = Rle24Compression.decompress(
imageType.getWidth(), imageType.getHeight(),
imageElement.data);
} else {
imageData = imageElement.data;
}
final ImageBuilder imageBuilder = new ImageBuilder(imageType.getWidth(),
imageType.getHeight(), true);
switch (imageType.getBitsPerPixel()) {
case 1:
decode1BPPImage(imageType, imageData, imageBuilder);
break;
case 4:
decode4BPPImage(imageType, imageData, imageBuilder);
break;
case 8:
decode8BPPImage(imageType, imageData, imageBuilder);
break;
case 32:
decode32BPPImage(imageType, imageData, imageBuilder);
break;
default:
throw new ImagingException("Unsupported bit depth " + imageType.getBitsPerPixel());
}
IcnsType maskType;
IcnsElement maskElement = null;
if (imageType.hasMask()) {
maskType = imageType;
maskElement = imageElement;
} else {
maskType = IcnsType.find8BPPMaskType(imageType);
if (maskType != null) {
for (final IcnsElement icnsElement : icnsElements) {
if (icnsElement.type == maskType.getType()) {
maskElement = icnsElement;
break;
}
}
}
if (maskElement == null) {
maskType = IcnsType.find1BPPMaskType(imageType);
if (maskType != null) {
for (final IcnsElement icnsElement : icnsElements) {
if (icnsElement.type == maskType.getType()) {
maskElement = icnsElement;
break;
}
}
}
}
}
if (maskElement != null) {
if (maskType.getBitsPerPixel() == 1) {
apply1BPPMask(maskElement.data, imageBuilder);
} else if (maskType.getBitsPerPixel() == 8) {
apply8BPPMask(maskElement.data, imageBuilder);
} else {
throw new ImagingException("Unsupported mask bit depth " + maskType.getBitsPerPixel());
}
}
return imageBuilder.getBufferedImage();
}