jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java
author bpb
Mon, 23 Nov 2015 12:26:12 -0800
changeset 34416 68c0d866db5d
child 35302 e4d2275861c3
permissions -rw-r--r--
8143342: Integrate Java Image I/O support for TIFF per JEP 262 Summary: Port TIFF reader and writer plugins from JAI Image I/O Tools to JDK 9 Reviewed-by: prr, serb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     1
/*
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     2
 * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     4
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    10
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    15
 * accompanied this code).
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    16
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    20
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    23
 * questions.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    24
 */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    25
package javax.imageio.plugins.tiff;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    26
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    27
import java.util.ArrayList;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    28
import java.util.Arrays;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    29
import java.util.Iterator;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    30
import java.util.List;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    31
import java.util.Map;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    32
import java.util.TreeMap;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    33
import javax.imageio.metadata.IIOInvalidTreeException;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    34
import javax.imageio.metadata.IIOMetadata;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    35
import javax.imageio.metadata.IIOMetadataFormatImpl;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    36
import com.sun.imageio.plugins.tiff.TIFFIFD;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    37
import com.sun.imageio.plugins.tiff.TIFFImageMetadata;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    38
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    39
/**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    40
 * A convenience class for simplifying interaction with TIFF native
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    41
 * image metadata. A TIFF image metadata tree represents an Image File
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    42
 * Directory (IFD) from a TIFF 6.0 stream. An IFD consists of a number of
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    43
 * IFD Entries each of which associates an identifying tag number with
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    44
 * a compatible value. A <code>TIFFDirectory</code> instance corresponds
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    45
 * to an IFD and contains a set of {@link TIFFField}s each of which
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    46
 * corresponds to an IFD Entry in the IFD.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    47
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    48
 * <p>When reading, a <code>TIFFDirectory</code> may be created by passing
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    49
 * the value returned by {@link javax.imageio.ImageReader#getImageMetadata
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    50
 * ImageReader.getImageMetadata()} to {@link #createFromMetadata
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    51
 * createFromMetadata()}. The {@link TIFFField}s in the directory may then
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    52
 * be obtained using the accessor methods provided in this class.</p>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    53
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    54
 * <p>When writing, an {@link IIOMetadata} object for use by one of the
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    55
 * <code>write()</code> methods of {@link javax.imageio.ImageWriter} may be
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    56
 * created from a <code>TIFFDirectory</code> by {@link #getAsMetadata()}.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    57
 * The <code>TIFFDirectory</code> itself may be created by construction or
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    58
 * from the <code>IIOMetadata</code> object returned by
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    59
 * {@link javax.imageio.ImageWriter#getDefaultImageMetadata
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    60
 * ImageWriter.getDefaultImageMetadata()}. The <code>TIFFField</code>s in the
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    61
 * directory may be set using the mutator methods provided in this class.</p>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    62
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    63
 * <p>A <code>TIFFDirectory</code> is aware of the tag numbers in the
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    64
 * group of {@link TIFFTagSet}s associated with it. When
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    65
 * a <code>TIFFDirectory</code> is created from a native image metadata
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    66
 * object, these tag sets are derived from the <tt>tagSets</tt> attribute
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    67
 * of the <tt>TIFFIFD</tt> node.</p>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    68
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    69
 * <p>A <code>TIFFDirectory</code> might also have a parent {@link TIFFTag}.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    70
 * This will occur if the directory represents an IFD other than the root
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    71
 * IFD of the image. The parent tag is the tag of the IFD Entry which is a
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    72
 * pointer to the IFD represented by this <code>TIFFDirectory</code>. The
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    73
 * {@link TIFFTag#isIFDPointer} method of this parent <code>TIFFTag</code>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    74
 * must return <code>true</code>.  When a <code>TIFFDirectory</code> is
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    75
 * created from a native image metadata object, the parent tag set is set
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    76
 * from the <tt>parentTagName</tt> attribute of the corresponding
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    77
 * <tt>TIFFIFD</tt> node. Note that a <code>TIFFDirectory</code> instance
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    78
 * which has a non-<code>null</code> parent tag will be contained in the
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    79
 * data field of a <code>TIFFField</code> instance which has a tag field
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    80
 * equal to the contained directory's parent tag.</p>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    81
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    82
 * <p>As an example consider an Exif image. The <code>TIFFDirectory</code>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    83
 * instance corresponding to the Exif IFD in the Exif stream would have parent
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    84
 * tag {@link ExifParentTIFFTagSet#TAG_EXIF_IFD_POINTER TAG_EXIF_IFD_POINTER}
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    85
 * and would include {@link ExifTIFFTagSet} in its group of known tag sets.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    86
 * The <code>TIFFDirectory</code> corresponding to this Exif IFD will be
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    87
 * contained in the data field of a <code>TIFFField</code> which will in turn
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    88
 * be contained in the <code>TIFFDirectory</code> corresponding to the primary
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    89
 * IFD of the Exif image which will itself have a <code>null</code>-valued
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    90
 * parent tag.</p>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    91
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    92
 * <p><b>Note that this implementation is not synchronized. </b>If multiple
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    93
 * threads use a <code>TIFFDirectory</code> instance concurrently, and at
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    94
 * least one of the threads modifies the directory, for example, by adding
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    95
 * or removing <code>TIFFField</code>s or <code>TIFFTagSet</code>s, it
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    96
 * <i>must</i> be synchronized externally.</p>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    97
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    98
 * @since 1.9
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    99
 * @see   IIOMetadata
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   100
 * @see   TIFFField
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   101
 * @see   TIFFTag
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   102
 * @see   TIFFTagSet
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   103
 */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   104
public class TIFFDirectory implements Cloneable {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   105
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   106
    /** The largest low-valued tag number in the TIFF 6.0 specification. */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   107
    private static final int MAX_LOW_FIELD_TAG_NUM =
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   108
        BaselineTIFFTagSet.TAG_REFERENCE_BLACK_WHITE;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   109
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   110
    /** The <code>TIFFTagSets</code> associated with this directory. */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   111
    private List<TIFFTagSet> tagSets;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   112
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   113
    /** The parent <code>TIFFTag</code> of this directory. */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   114
    private TIFFTag parentTag;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   115
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   116
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   117
     * The fields in this directory which have a low tag number. These are
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   118
     * managed as an array for efficiency as they are the most common fields.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   119
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   120
    private TIFFField[] lowFields = new TIFFField[MAX_LOW_FIELD_TAG_NUM + 1];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   121
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   122
    /** The number of low tag numbered fields in the directory. */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   123
    private int numLowFields = 0;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   124
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   125
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   126
     * A mapping of <code>Integer</code> tag numbers to <code>TIFFField</code>s
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   127
     * for fields which are not low tag numbered.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   128
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   129
    private Map<Integer,TIFFField> highFields = new TreeMap<Integer,TIFFField>();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   130
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   131
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   132
     * Creates a <code>TIFFDirectory</code> instance from the contents of
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   133
     * an image metadata object. The supplied object must support an image
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   134
     * metadata format supported by the TIFF {@link javax.imageio.ImageWriter}
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   135
     * plug-in. This will usually be either the TIFF native image metadata
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   136
     * format <tt>javax_imageio_tiff_image_1.0</tt> or the Java
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   137
     * Image I/O standard metadata format <tt>javax_imageio_1.0</tt>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   138
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   139
     * @param tiffImageMetadata A metadata object which supports a compatible
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   140
     * image metadata format.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   141
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   142
     * @return A <code>TIFFDirectory</code> populated from the contents of
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   143
     * the supplied metadata object.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   144
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   145
     * @throws NullPointerException if <code>tiffImageMetadata</code>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   146
     * is <code>null</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   147
     * @throws IllegalArgumentException if <code>tiffImageMetadata</code>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   148
     * does not support a compatible image metadata format.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   149
     * @throws IIOInvalidTreeException if the supplied metadata object
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   150
     * cannot be parsed.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   151
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   152
    public static TIFFDirectory
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   153
        createFromMetadata(IIOMetadata tiffImageMetadata)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   154
        throws IIOInvalidTreeException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   155
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   156
        if(tiffImageMetadata == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   157
            throw new NullPointerException("tiffImageMetadata == null");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   158
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   159
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   160
        TIFFImageMetadata tim;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   161
        if(tiffImageMetadata instanceof TIFFImageMetadata) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   162
            tim = (TIFFImageMetadata)tiffImageMetadata;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   163
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   164
            // Create a native metadata object.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   165
            ArrayList<TIFFTagSet> l = new ArrayList<TIFFTagSet>(1);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   166
            l.add(BaselineTIFFTagSet.getInstance());
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   167
            tim = new TIFFImageMetadata(l);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   168
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   169
            // Determine the format name to use.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   170
            String formatName = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   171
            if(TIFFImageMetadata.NATIVE_METADATA_FORMAT_NAME.equals
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   172
               (tiffImageMetadata.getNativeMetadataFormatName())) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   173
                formatName = TIFFImageMetadata.NATIVE_METADATA_FORMAT_NAME;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   174
            } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   175
                String[] extraNames =
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   176
                    tiffImageMetadata.getExtraMetadataFormatNames();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   177
                if(extraNames != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   178
                    for(int i = 0; i < extraNames.length; i++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   179
                        if(TIFFImageMetadata.NATIVE_METADATA_FORMAT_NAME.equals
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   180
                           (extraNames[i])) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   181
                            formatName = extraNames[i];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   182
                            break;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   183
                        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   184
                    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   185
                }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   186
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   187
                if(formatName == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   188
                    if(tiffImageMetadata.isStandardMetadataFormatSupported()) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   189
                        formatName =
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   190
                            IIOMetadataFormatImpl.standardMetadataFormatName;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   191
                    } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   192
                        throw new IllegalArgumentException
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   193
                            ("Parameter does not support required metadata format!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   194
                    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   195
                }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   196
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   197
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   198
            // Set the native metadata object from the tree.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   199
            tim.setFromTree(formatName,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   200
                            tiffImageMetadata.getAsTree(formatName));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   201
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   202
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   203
        return tim.getRootIFD();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   204
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   205
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   206
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   207
     * Converts a <code>TIFFDirectory</code> to a <code>TIFFIFD</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   208
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   209
    private static TIFFIFD getDirectoryAsIFD(TIFFDirectory dir) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   210
        if(dir instanceof TIFFIFD) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   211
            return (TIFFIFD)dir;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   212
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   213
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   214
        TIFFIFD ifd = new TIFFIFD(Arrays.asList(dir.getTagSets()),
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   215
                                  dir.getParentTag());
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   216
        TIFFField[] fields = dir.getTIFFFields();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   217
        int numFields = fields.length;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   218
        for(int i = 0; i < numFields; i++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   219
            TIFFField f = fields[i];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   220
            TIFFTag tag = f.getTag();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   221
            if(tag.isIFDPointer()) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   222
                TIFFDirectory subIFD =
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   223
                    getDirectoryAsIFD((TIFFDirectory)f.getData());
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   224
                f = new TIFFField(tag, f.getType(), (long)f.getCount(), subIFD);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   225
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   226
            ifd.addTIFFField(f);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   227
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   228
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   229
        return ifd;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   230
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   231
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   232
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   233
     * Constructs a <code>TIFFDirectory</code> which is aware of a given
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   234
     * group of {@link TIFFTagSet}s. An optional parent {@link TIFFTag}
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   235
     * may also be specified.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   236
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   237
     * @param tagSets The <code>TIFFTagSets</code> associated with this
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   238
     * directory.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   239
     * @param parentTag The parent <code>TIFFTag</code> of this directory;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   240
     * may be <code>null</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   241
     * @throws NullPointerException if <code>tagSets</code> is
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   242
     * <code>null</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   243
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   244
    public TIFFDirectory(TIFFTagSet[] tagSets, TIFFTag parentTag) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   245
        if(tagSets == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   246
            throw new NullPointerException("tagSets == null!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   247
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   248
        this.tagSets = new ArrayList<TIFFTagSet>(tagSets.length);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   249
        int numTagSets = tagSets.length;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   250
        for(int i = 0; i < numTagSets; i++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   251
            this.tagSets.add(tagSets[i]);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   252
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   253
        this.parentTag = parentTag;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   254
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   255
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   256
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   257
     * Returns the {@link TIFFTagSet}s of which this directory is aware.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   258
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   259
     * @return The <code>TIFFTagSet</code>s associated with this
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   260
     * <code>TIFFDirectory</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   261
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   262
    public TIFFTagSet[] getTagSets() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   263
        return tagSets.toArray(new TIFFTagSet[tagSets.size()]);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   264
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   265
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   266
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   267
     * Adds an element to the group of {@link TIFFTagSet}s of which this
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   268
     * directory is aware.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   269
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   270
     * @param tagSet The <code>TIFFTagSet</code> to add.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   271
     * @throws NullPointerException if <code>tagSet</code> is
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   272
     * <code>null</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   273
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   274
    public void addTagSet(TIFFTagSet tagSet) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   275
        if(tagSet == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   276
            throw new NullPointerException("tagSet == null");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   277
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   278
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   279
        if(!tagSets.contains(tagSet)) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   280
            tagSets.add(tagSet);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   281
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   282
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   283
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   284
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   285
     * Removes an element from the group of {@link TIFFTagSet}s of which this
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   286
     * directory is aware.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   287
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   288
     * @param tagSet The <code>TIFFTagSet</code> to remove.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   289
     * @throws NullPointerException if <code>tagSet</code> is
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   290
     * <code>null</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   291
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   292
    public void removeTagSet(TIFFTagSet tagSet) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   293
        if(tagSet == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   294
            throw new NullPointerException("tagSet == null");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   295
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   296
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   297
        if(tagSets.contains(tagSet)) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   298
            tagSets.remove(tagSet);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   299
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   300
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   301
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   302
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   303
     * Returns the parent {@link TIFFTag} of this directory if one
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   304
     * has been defined or <code>null</code> otherwise.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   305
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   306
     * @return The parent <code>TIFFTag</code> of this
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   307
     * <code>TIFFDiectory</code> or <code>null</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   308
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   309
    public TIFFTag getParentTag() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   310
        return parentTag;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   311
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   312
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   313
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   314
     * Returns the {@link TIFFTag} which has tag number equal to
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   315
     * <code>tagNumber</code> or <code>null</code> if no such tag
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   316
     * exists in the {@link TIFFTagSet}s associated with this
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   317
     * directory.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   318
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   319
     * @param tagNumber The tag number of interest.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   320
     * @return The corresponding <code>TIFFTag</code> or <code>null</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   321
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   322
    public TIFFTag getTag(int tagNumber) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   323
        return TIFFIFD.getTag(tagNumber, tagSets);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   324
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   325
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   326
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   327
     * Returns the number of {@link TIFFField}s in this directory.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   328
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   329
     * @return The number of <code>TIFFField</code>s in this
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   330
     * <code>TIFFDirectory</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   331
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   332
    public int getNumTIFFFields() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   333
        return numLowFields + highFields.size();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   334
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   335
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   336
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   337
     * Determines whether a TIFF field with the given tag number is
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   338
     * contained in this directory.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   339
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   340
     * @param tagNumber The tag number.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   341
     * @return Whether a {@link TIFFTag} with tag number equal to
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   342
     * <code>tagNumber</code> is present in this <code>TIFFDirectory</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   343
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   344
    public boolean containsTIFFField(int tagNumber) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   345
        return (tagNumber >= 0 && tagNumber <= MAX_LOW_FIELD_TAG_NUM &&
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   346
                lowFields[tagNumber] != null) ||
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   347
            highFields.containsKey(Integer.valueOf(tagNumber));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   348
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   349
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   350
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   351
     * Adds a TIFF field to the directory.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   352
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   353
     * @param f The field to add.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   354
     * @throws NullPointerException if <code>f</code> is <code>null</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   355
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   356
    public void addTIFFField(TIFFField f) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   357
        if(f == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   358
            throw new NullPointerException("f == null");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   359
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   360
        int tagNumber = f.getTagNumber();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   361
        if(tagNumber >= 0 && tagNumber <= MAX_LOW_FIELD_TAG_NUM) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   362
            if(lowFields[tagNumber] == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   363
                numLowFields++;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   364
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   365
            lowFields[tagNumber] = f;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   366
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   367
            highFields.put(Integer.valueOf(tagNumber), f);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   368
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   369
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   370
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   371
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   372
     * Retrieves a TIFF field from the directory.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   373
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   374
     * @param tagNumber The tag number of the tag associated with the field.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   375
     * @return A <code>TIFFField</code> with the requested tag number of
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   376
     * <code>null</code> if no such field is present.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   377
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   378
    public TIFFField getTIFFField(int tagNumber) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   379
        TIFFField f;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   380
        if(tagNumber >= 0 && tagNumber <= MAX_LOW_FIELD_TAG_NUM) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   381
            f = lowFields[tagNumber];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   382
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   383
            f = highFields.get(Integer.valueOf(tagNumber));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   384
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   385
        return f;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   386
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   387
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   388
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   389
     * Removes a TIFF field from the directory.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   390
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   391
     * @param tagNumber The tag number of the tag associated with the field.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   392
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   393
    public void removeTIFFField(int tagNumber) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   394
        if(tagNumber >= 0 && tagNumber <= MAX_LOW_FIELD_TAG_NUM) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   395
            if(lowFields[tagNumber] != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   396
                numLowFields--;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   397
                lowFields[tagNumber] = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   398
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   399
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   400
            highFields.remove(Integer.valueOf(tagNumber));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   401
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   402
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   403
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   404
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   405
     * Retrieves all TIFF fields from the directory.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   406
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   407
     * @return An array of all TIFF fields in order of numerically increasing
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   408
     * tag number.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   409
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   410
    public TIFFField[] getTIFFFields() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   411
        // Allocate return value.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   412
        TIFFField[] fields = new TIFFField[numLowFields + highFields.size()];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   413
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   414
        // Copy any low-index fields.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   415
        int nextIndex = 0;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   416
        for(int i = 0; i <= MAX_LOW_FIELD_TAG_NUM; i++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   417
            if(lowFields[i] != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   418
                fields[nextIndex++] = lowFields[i];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   419
                if(nextIndex == numLowFields) break;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   420
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   421
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   422
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   423
        // Copy any high-index fields.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   424
        if(!highFields.isEmpty()) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   425
            Iterator<Integer> keys = highFields.keySet().iterator();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   426
            while(keys.hasNext()) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   427
                fields[nextIndex++] = highFields.get(keys.next());
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   428
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   429
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   430
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   431
        return fields;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   432
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   433
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   434
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   435
     * Removes all TIFF fields from the directory.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   436
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   437
    public void removeTIFFFields() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   438
        Arrays.fill(lowFields, (Object)null);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   439
        numLowFields = 0;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   440
        highFields.clear();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   441
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   442
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   443
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   444
     * Converts the directory to a metadata object.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   445
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   446
     * @return A metadata instance initialized from the contents of this
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   447
     * <code>TIFFDirectory</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   448
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   449
    public IIOMetadata getAsMetadata() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   450
        return new TIFFImageMetadata(getDirectoryAsIFD(this));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   451
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   452
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   453
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   454
     * Clones the directory and all the fields contained therein.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   455
     *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   456
     * @return A clone of this <code>TIFFDirectory</code>.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   457
     * @throws CloneNotSupportedException if the instance cannot be cloned.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   458
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   459
    @Override
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   460
    public TIFFDirectory clone() throws CloneNotSupportedException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   461
        TIFFDirectory dir = (TIFFDirectory) super.clone();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   462
        dir.tagSets = new ArrayList<TIFFTagSet>(tagSets);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   463
        dir.parentTag = getParentTag();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   464
        TIFFField[] fields = getTIFFFields();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   465
        for(TIFFField field : fields) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   466
            dir.addTIFFField(field.clone());
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   467
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   468
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   469
        return dir;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   470
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   471
}