private static BufferedImage decodeImageImpl()

in src/main/java/org/apache/commons/imaging/formats/icns/IcnsDecoder.java [202:272]


    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;
        final 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();
    }