in src/main/java/org/apache/commons/imaging/formats/tiff/write/TiffImageWriterLossless.java [90:156]
private List<TiffElement> 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<TiffElement> elements = new ArrayList<>();
final List<TiffDirectory> directories = contents.directories;
for (final TiffDirectory directory : directories) {
elements.add(directory);
for (final TiffField field : directory.getDirectoryEntries()) {
final TiffElement oversizeValue = field.getOversizeValueElement();
if (oversizeValue != null) {
final TiffOutputField frozenField = frozenFields.get(field.getTag());
if (frozenField != null
&& frozenField.getSeperateValue() != null
&& frozenField.bytesEqual(field.getByteArrayValue())) {
frozenField.getSeperateValue().setOffset(field.getOffset());
} else {
elements.add(oversizeValue);
}
}
}
final JpegImageData jpegImageData = directory.getJpegImageData();
if (jpegImageData != null) {
elements.add(jpegImageData);
}
final TiffImageData tiffImageData = directory.getTiffImageData();
if (tiffImageData != null) {
final DataElement[] data = tiffImageData.getImageData();
Collections.addAll(elements, data);
}
}
elements.sort(TiffElement.COMPARATOR);
final List<TiffElement> rewritableElements = new ArrayList<>();
final int tolerance = 3;
TiffElement start = null;
long index = -1;
for (final TiffElement element : elements) {
final long lastElementByte = element.offset + element.length;
if (start == null) {
start = element;
} else if (element.offset - index > tolerance) {
rewritableElements.add(new TiffElement.Stub(start.offset,
(int) (index - start.offset)));
start = element;
}
index = lastElementByte;
}
if (null != start) {
rewritableElements.add(new TiffElement.Stub(start.offset,
(int) (index - start.offset)));
}
return rewritableElements;
} catch (final ImagingException e) {
throw new ImagingException(e.getMessage(), e);
}
}