diff --git a/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java b/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java index 84dcc4ea..948fc36f 100644 --- a/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java +++ b/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java @@ -317,18 +317,24 @@ public class TIFFUtilities { } private long write(ImageOutputStream outputStream, EXIFWriter exifWriter) throws IOException { - writeDirectoryData(IFD, outputStream); - - ArrayList newIFD = new ArrayList(); - Iterator it = IFD.iterator(); - while (it.hasNext()) { - newIFD.add(it.next()); - } - + List newIFD = writeDirectoryData(IFD, outputStream); return exifWriter.writeIFD(newIFD, outputStream); } - private void writeDirectoryData(Directory IFD, ImageOutputStream outputStream) throws IOException { + private List writeDirectoryData(Directory IFD, ImageOutputStream outputStream) throws IOException { + ArrayList newIFD = new ArrayList(); + Iterator it = IFD.iterator(); + while (it.hasNext()) { + Entry e = it.next(); + if (e.getValue() instanceof Directory) { + List subIFD = writeDirectoryData((Directory) e.getValue(), outputStream); + new TIFFEntry((Integer) e.getIdentifier(), new AbstractDirectory(subIFD) { + }); + } + + newIFD.add(e); + } + Entry stripOffsetsEntry = IFD.getEntryById(TIFF.TAG_STRIP_OFFSETS); long[] offsets = getValueAsLongArray(stripOffsetsEntry); @@ -337,8 +343,8 @@ public class TIFFUtilities { int[] newOffsets = writeData(offsets, byteCounts, outputStream); - IFD.remove(stripOffsetsEntry); - IFD.add(new TIFFEntry(TIFF.TAG_STRIP_OFFSETS, newOffsets)); + newIFD.remove(stripOffsetsEntry); + newIFD.add(new TIFFEntry(TIFF.TAG_STRIP_OFFSETS, newOffsets)); Entry oldJpegData = IFD.getEntryById(TIFF.TAG_JPEG_INTERCHANGE_FORMAT); Entry oldJpegDataLength = IFD.getEntryById(TIFF.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH); @@ -348,8 +354,8 @@ public class TIFFUtilities { byteCounts = getValueAsLongArray(oldJpegDataLength); newOffsets = writeData(offsets, byteCounts, outputStream); } - IFD.remove(oldJpegData); - IFD.add(new TIFFEntry(TIFF.TAG_JPEG_INTERCHANGE_FORMAT, newOffsets)); + newIFD.remove(oldJpegData); + newIFD.add(new TIFFEntry(TIFF.TAG_JPEG_INTERCHANGE_FORMAT, newOffsets)); } Entry oldJpegTable; @@ -361,8 +367,8 @@ public class TIFFUtilities { byteCounts = new long[tableOffsets.length]; Arrays.fill(byteCounts, 64); newOffsets = writeData(tableOffsets, byteCounts, outputStream); - IFD.remove(oldJpegTable); - IFD.add(new TIFFEntry(TIFF.TAG_OLD_JPEG_AC_TABLES, newOffsets)); + newIFD.remove(oldJpegTable); + newIFD.add(new TIFFEntry(TIFF.TAG_OLD_JPEG_AC_TABLES, newOffsets)); } oldJpegTable = IFD.getEntryById(TIFF.TAG_OLD_JPEG_Q_TABLES); @@ -371,8 +377,8 @@ public class TIFFUtilities { byteCounts = new long[tableOffsets.length]; Arrays.fill(byteCounts, 64); newOffsets = writeData(tableOffsets, byteCounts, outputStream); - IFD.remove(oldJpegTable); - IFD.add(new TIFFEntry(TIFF.TAG_OLD_JPEG_Q_TABLES, newOffsets)); + newIFD.remove(oldJpegTable); + newIFD.add(new TIFFEntry(TIFF.TAG_OLD_JPEG_Q_TABLES, newOffsets)); } oldJpegTable = IFD.getEntryById(TIFF.TAG_OLD_JPEG_DC_TABLES); @@ -381,17 +387,11 @@ public class TIFFUtilities { byteCounts = new long[tableOffsets.length]; Arrays.fill(byteCounts, 64); newOffsets = writeData(tableOffsets, byteCounts, outputStream); - IFD.remove(oldJpegTable); - IFD.add(new TIFFEntry(TIFF.TAG_OLD_JPEG_DC_TABLES, newOffsets)); + newIFD.remove(oldJpegTable); + newIFD.add(new TIFFEntry(TIFF.TAG_OLD_JPEG_DC_TABLES, newOffsets)); } - Iterator it = IFD.iterator(); - while (it.hasNext()) { - Entry e = it.next(); - if (e.getValue() instanceof Directory) { - writeDirectoryData((Directory) e.getValue(), outputStream); - } - } + return newIFD; } private int[] writeData(long[] offsets, long[] byteCounts, ImageOutputStream outputStream) throws IOException { @@ -502,10 +502,6 @@ public class TIFFUtilities { } newIDFData.add(new TIFFEntry(TIFF.TAG_ORIENTATION, (short) orientation)); IFD = new AbstractDirectory(newIDFData) { - @Override - public boolean isReadOnly() { - return false; - } }; } } diff --git a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/exif/IFD.java b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/exif/IFD.java index 58dd0332..0340517d 100644 --- a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/exif/IFD.java +++ b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/exif/IFD.java @@ -44,8 +44,4 @@ final class IFD extends AbstractDirectory { protected IFD(final Collection pEntries) { super(pEntries); } - @Override - public boolean isReadOnly() { - return false; - } }