private List analyzeOldTiff()

in src/main/java/org/apache/commons/imaging/formats/tiff/write/TiffImageWriterLossless.java [94:154]


    private List<AbstractTiffElement> analyzeOldTiff(final Map<Integer, TiffOutputField> frozenFields) throws ImagingException, IOException {
        try {
            final ByteSource byteSource = ByteSource.array(exifBytes);
            final FormatCompliance formatCompliance = FormatCompliance.getDefault();
            final TiffContents contents = new TiffReader(false).readContents(byteSource, new TiffImagingParameters(), formatCompliance);

            final List<AbstractTiffElement> elements = new ArrayList<>();

            final List<TiffDirectory> directories = contents.directories;
            for (final TiffDirectory directory : directories) {
                elements.add(directory);

                for (final TiffField field : directory.getDirectoryEntries()) {
                    final AbstractTiffElement oversizeValue = field.getOversizeValueElement();
                    if (oversizeValue != null) {
                        final TiffOutputField frozenField = frozenFields.get(field.getTag());
                        if (frozenField != null && frozenField.getSeperateValue() != null && Arrays.equals(frozenField.getData(), field.getByteArrayValue())) {
                            frozenField.getSeperateValue().setOffset(field.getOffset());
                        } else {
                            elements.add(oversizeValue);
                        }
                    }
                }

                final JpegImageData jpegImageData = directory.getJpegImageData();
                if (jpegImageData != null) {
                    elements.add(jpegImageData);
                }

                final AbstractTiffImageData abstractTiffImageData = directory.getTiffImageData();
                if (abstractTiffImageData != null) {
                    final DataElement[] data = abstractTiffImageData.getImageData();
                    Collections.addAll(elements, data);
                }
            }

            elements.sort(AbstractTiffElement.COMPARATOR);

            final List<AbstractTiffElement> rewritableElements = new ArrayList<>();
            final int tolerance = 3;
            AbstractTiffElement start = null;
            long index = -1;
            for (final AbstractTiffElement element : elements) {
                final long lastElementByte = element.offset + element.length;
                if (start == null) {
                    start = element;
                } else if (element.offset - index > tolerance) {
                    rewritableElements.add(new AbstractTiffElement.Stub(start.offset, (int) (index - start.offset)));
                    start = element;
                }
                index = lastElementByte;
            }
            if (null != start) {
                rewritableElements.add(new AbstractTiffElement.Stub(start.offset, (int) (index - start.offset)));
            }

            return rewritableElements;
        } catch (final ImagingException e) {
            throw new ImagingException(e.getMessage(), e);
        }
    }