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