private static BufferedImage decodeImageImpl()

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