Author: damjan
Date: Wed Sep 14 23:25:47 2016
New Revision: 1760815

URL: http://svn.apache.org/viewvc?rev=1760815&view=rev
Log:
Store and use the cardinality of tags (1 vs more) when setting and getting
TIFF field values.


Added:
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoBytes.java
   (with props)
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoDoubles.java
   (with props)
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoFloats.java
   (with props)
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoLongs.java
   (with props)
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoRationals.java
   (with props)
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoSBytes.java
   (with props)
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoSLongs.java
   (with props)
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoSRationals.java
   (with props)
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoSShorts.java
   (with props)
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoShorts.java
   (with props)
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoUndefineds.java
   (with props)
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoUnknowns.java
   (with props)
Modified:
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffDirectory.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageMetadata.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffReader.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/AdobePageMaker6TagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/AdobePhotoshopTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/DcfTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/DngTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/ExifTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/GeoTiffTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/GpsTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/HylaFaxTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/MicrosoftHdPhotoTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/MicrosoftTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/MolecularDynamicsGelTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/Rfc2301TagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/Tiff4TagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/TiffEpTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/TiffTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/WangTagConstants.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoByte.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoDirectory.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoDouble.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoFloat.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoGpsText.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoLong.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoRational.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoSByte.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoSLong.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoSRational.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoSShort.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoShort.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoUndefined.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoUnknown.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoXpString.java
    
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/write/TiffOutputDirectory.java
    
commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffReadWriteTagsTest.java

Modified: 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffDirectory.java
URL: 
http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffDirectory.java?rev=1760815&r1=1760814&r2=1760815&view=diff
==============================================================================
--- 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffDirectory.java
 (original)
+++ 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffDirectory.java
 Wed Sep 14 23:25:47 2016
@@ -34,17 +34,27 @@ import org.apache.commons.imaging.format
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfo;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoAscii;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoByte;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoBytes;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoDouble;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoDoubles;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoFloat;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoFloats;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoGpsText;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoLong;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoLongs;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoRational;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoRationals;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSByte;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSBytes;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSLong;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSLongs;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSRational;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSRationals;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSShort;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSShorts;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoShort;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoShortOrLong;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoShorts;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoXpString;
 
 public class TiffDirectory extends TiffElement {
@@ -190,15 +200,6 @@ public class TiffDirectory extends TiffE
         return field.getValue();
     }
 
-    public byte getSingleFieldValue(final TagInfoByte tag) throws 
ImageReadException {
-        final byte[] result = getFieldValue(tag, true);
-        if (result.length != 1) {
-            throw new ImageReadException("Field \"" + tag.name
-                    + "\" has incorrect length " + result.length);
-        }
-        return result[0];
-    }
-
     public String getSingleFieldValue(final TagInfoAscii tag)
             throws ImageReadException {
         final String[] result = getFieldValue(tag, true);
@@ -209,25 +210,6 @@ public class TiffDirectory extends TiffE
         return result[0];
     }
 
-    public short getSingleFieldValue(final TagInfoShort tag)
-            throws ImageReadException {
-        final short[] result = getFieldValue(tag, true);
-        if (result.length != 1) {
-            throw new ImageReadException("Field \"" + tag.name
-                    + "\" has incorrect length " + result.length);
-        }
-        return result[0];
-    }
-
-    public int getSingleFieldValue(final TagInfoLong tag) throws 
ImageReadException {
-        final int[] result = getFieldValue(tag, true);
-        if (result.length != 1) {
-            throw new ImageReadException("Field \"" + tag.name
-                    + "\" has incorrect length " + result.length);
-        }
-        return result[0];
-    }
-    
     public int getSingleFieldValue(final TagInfoShortOrLong tag) throws 
ImageReadException {
         final int[] result = getFieldValue(tag, true);
         if (result.length != 1) {
@@ -237,75 +219,24 @@ public class TiffDirectory extends TiffE
         return result[0];
     }
 
-    public RationalNumber getSingleFieldValue(final TagInfoRational tag)
-            throws ImageReadException {
-        final RationalNumber[] result = getFieldValue(tag, true);
-        if (result.length != 1) {
-            throw new ImageReadException("Field \"" + tag.name
-                    + "\" has incorrect length " + result.length);
-        }
-        return result[0];
-    }
-
-    public byte getSingleFieldValue(final TagInfoSByte tag) throws 
ImageReadException {
-        final byte[] result = getFieldValue(tag, true);
-        if (result.length != 1) {
-            throw new ImageReadException("Field \"" + tag.name
-                    + "\" has incorrect length " + result.length);
-        }
-        return result[0];
-    }
-
-    public short getSingleFieldValue(final TagInfoSShort tag)
+    public byte getFieldValue(final TagInfoByte tag)
             throws ImageReadException {
-        final short[] result = getFieldValue(tag, true);
-        if (result.length != 1) {
-            throw new ImageReadException("Field \"" + tag.name
-                    + "\" has incorrect length " + result.length);
-        }
-        return result[0];
-    }
-
-    public int getSingleFieldValue(final TagInfoSLong tag) throws 
ImageReadException {
-        final int[] result = getFieldValue(tag, true);
-        if (result.length != 1) {
-            throw new ImageReadException("Field \"" + tag.name
-                    + "\" has incorrect length " + result.length);
-        }
-        return result[0];
-    }
-
-    public RationalNumber getSingleFieldValue(final TagInfoSRational tag)
-            throws ImageReadException {
-        final RationalNumber[] result = getFieldValue(tag, true);
-        if (result.length != 1) {
-            throw new ImageReadException("Field \"" + tag.name
-                    + "\" has incorrect length " + result.length);
+        final TiffField field = findField(tag);
+        if (field == null) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" is missing");
         }
-        return result[0];
-    }
-
-    public float getSingleFieldValue(final TagInfoFloat tag)
-            throws ImageReadException {
-        final float[] result = getFieldValue(tag, true);
-        if (result.length != 1) {
-            throw new ImageReadException("Field \"" + tag.name
-                    + "\" has incorrect length " + result.length);
+        if (!tag.dataTypes.contains(field.getFieldType())) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" has incorrect type " + 
field.getFieldType().getName());
         }
-        return result[0];
-    }
-
-    public double getSingleFieldValue(final TagInfoDouble tag)
-            throws ImageReadException {
-        final double[] result = getFieldValue(tag, true);
-        if (result.length != 1) {
-            throw new ImageReadException("Field \"" + tag.name
-                    + "\" has incorrect length " + result.length);
+        if (field.getCount() != 1) {
+            throw new ImageReadException("Field \"" + tag.name + "\" has wrong 
count " + field.getCount());
         }
-        return result[0];
+        return field.getByteArrayValue()[0];
     }
 
-    public byte[] getFieldValue(final TagInfoByte tag, final boolean mustExist)
+    public byte[] getFieldValue(final TagInfoBytes tag, final boolean 
mustExist)
             throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
@@ -350,7 +281,25 @@ public class TiffDirectory extends TiffE
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public short[] getFieldValue(final TagInfoShort tag, final boolean 
mustExist)
+    public short getFieldValue(final TagInfoShort tag)
+            throws ImageReadException {
+        final TiffField field = findField(tag);
+        if (field == null) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" is missing");
+        }
+        if (!tag.dataTypes.contains(field.getFieldType())) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" has incorrect type " + 
field.getFieldType().getName());
+        }
+        if (field.getCount() != 1) {
+            throw new ImageReadException("Field \"" + tag.name + "\" has wrong 
count " + field.getCount());
+        }
+        final byte[] bytes = field.getByteArrayValue();
+        return tag.getValue(field.getByteOrder(), bytes);
+    }
+
+    public short[] getFieldValue(final TagInfoShorts tag, final boolean 
mustExist)
             throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
@@ -373,7 +322,25 @@ public class TiffDirectory extends TiffE
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public int[] getFieldValue(final TagInfoLong tag, final boolean mustExist)
+    public int getFieldValue(final TagInfoLong tag)
+            throws ImageReadException {
+        final TiffField field = findField(tag);
+        if (field == null) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" is missing");
+        }
+        if (!tag.dataTypes.contains(field.getFieldType())) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" has incorrect type " + 
field.getFieldType().getName());
+        }
+        if (field.getCount() != 1) {
+            throw new ImageReadException("Field \"" + tag.name + "\" has wrong 
count " + field.getCount());
+        }
+        final byte[] bytes = field.getByteArrayValue();
+        return tag.getValue(field.getByteOrder(), bytes);
+    }
+
+    public int[] getFieldValue(final TagInfoLongs tag, final boolean mustExist)
             throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
@@ -395,7 +362,7 @@ public class TiffDirectory extends TiffE
         final byte[] bytes = field.getByteArrayValue();
         return tag.getValue(field.getByteOrder(), bytes);
     }
-    
+
     public int[] getFieldValue(final TagInfoShortOrLong tag, final boolean 
mustExist)
             throws ImageReadException {
         final TiffField field = findField(tag);
@@ -423,7 +390,25 @@ public class TiffDirectory extends TiffE
         }
     }
 
-    public RationalNumber[] getFieldValue(final TagInfoRational tag, final 
boolean mustExist)
+    public RationalNumber getFieldValue(final TagInfoRational tag)
+            throws ImageReadException {
+        final TiffField field = findField(tag);
+        if (field == null) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" is missing");
+        }
+        if (!tag.dataTypes.contains(field.getFieldType())) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" has incorrect type " + 
field.getFieldType().getName());
+        }
+        if (field.getCount() != 1) {
+            throw new ImageReadException("Field \"" + tag.name + "\" has wrong 
count " + field.getCount());
+        }
+        final byte[] bytes = field.getByteArrayValue();
+        return tag.getValue(field.getByteOrder(), bytes);
+    }
+
+    public RationalNumber[] getFieldValue(final TagInfoRationals tag, final 
boolean mustExist)
             throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
@@ -446,7 +431,24 @@ public class TiffDirectory extends TiffE
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public byte[] getFieldValue(final TagInfoSByte tag, final boolean 
mustExist)
+    public byte getFieldValue(final TagInfoSByte tag)
+            throws ImageReadException {
+        final TiffField field = findField(tag);
+        if (field == null) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" is missing");
+        }
+        if (!tag.dataTypes.contains(field.getFieldType())) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" has incorrect type " + 
field.getFieldType().getName());
+        }
+        if (field.getCount() != 1) {
+            throw new ImageReadException("Field \"" + tag.name + "\" has wrong 
count " + field.getCount());
+        }
+        return field.getByteArrayValue()[0];
+    }
+
+    public byte[] getFieldValue(final TagInfoSBytes tag, final boolean 
mustExist)
             throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
@@ -468,7 +470,25 @@ public class TiffDirectory extends TiffE
         return field.getByteArrayValue();
     }
 
-    public short[] getFieldValue(final TagInfoSShort tag, final boolean 
mustExist)
+    public short getFieldValue(final TagInfoSShort tag)
+            throws ImageReadException {
+        final TiffField field = findField(tag);
+        if (field == null) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" is missing");
+        }
+        if (!tag.dataTypes.contains(field.getFieldType())) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" has incorrect type " + 
field.getFieldType().getName());
+        }
+        if (field.getCount() != 1) {
+            throw new ImageReadException("Field \"" + tag.name + "\" has wrong 
count " + field.getCount());
+        }
+        final byte[] bytes = field.getByteArrayValue();
+        return tag.getValue(field.getByteOrder(), bytes);
+    }
+
+    public short[] getFieldValue(final TagInfoSShorts tag, final boolean 
mustExist)
             throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
@@ -491,7 +511,25 @@ public class TiffDirectory extends TiffE
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public int[] getFieldValue(final TagInfoSLong tag, final boolean mustExist)
+    public int getFieldValue(final TagInfoSLong tag)
+            throws ImageReadException {
+        final TiffField field = findField(tag);
+        if (field == null) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" is missing");
+        }
+        if (!tag.dataTypes.contains(field.getFieldType())) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" has incorrect type " + 
field.getFieldType().getName());
+        }
+        if (field.getCount() != 1) {
+            throw new ImageReadException("Field \"" + tag.name + "\" has wrong 
count " + field.getCount());
+        }
+        final byte[] bytes = field.getByteArrayValue();
+        return tag.getValue(field.getByteOrder(), bytes);
+    }
+
+    public int[] getFieldValue(final TagInfoSLongs tag, final boolean 
mustExist)
             throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
@@ -514,7 +552,24 @@ public class TiffDirectory extends TiffE
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public RationalNumber[] getFieldValue(final TagInfoSRational tag,
+    public RationalNumber getFieldValue(final TagInfoSRational tag) throws 
ImageReadException {
+        final TiffField field = findField(tag);
+        if (field == null) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" is missing");
+        }
+        if (!tag.dataTypes.contains(field.getFieldType())) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" has incorrect type " + 
field.getFieldType().getName());
+        }
+        if (field.getCount() != 1) {
+            throw new ImageReadException("Field \"" + tag.name + "\" has wrong 
count " + field.getCount());
+        }
+        final byte[] bytes = field.getByteArrayValue();
+        return tag.getValue(field.getByteOrder(), bytes);
+    }
+
+    public RationalNumber[] getFieldValue(final TagInfoSRationals tag,
             final boolean mustExist) throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
@@ -537,7 +592,25 @@ public class TiffDirectory extends TiffE
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public float[] getFieldValue(final TagInfoFloat tag, final boolean 
mustExist)
+    public float getFieldValue(final TagInfoFloat tag)
+            throws ImageReadException {
+        final TiffField field = findField(tag);
+        if (field == null) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" is missing");
+        }
+        if (!tag.dataTypes.contains(field.getFieldType())) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" has incorrect type " + 
field.getFieldType().getName());
+        }
+        if (field.getCount() != 1) {
+            throw new ImageReadException("Field \"" + tag.name + "\" has wrong 
count " + field.getCount());
+        }
+        final byte[] bytes = field.getByteArrayValue();
+        return tag.getValue(field.getByteOrder(), bytes);
+    }
+
+    public float[] getFieldValue(final TagInfoFloats tag, final boolean 
mustExist)
             throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
@@ -560,7 +633,25 @@ public class TiffDirectory extends TiffE
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public double[] getFieldValue(final TagInfoDouble tag, final boolean 
mustExist)
+    public double getFieldValue(final TagInfoDouble tag)
+            throws ImageReadException {
+        final TiffField field = findField(tag);
+        if (field == null) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" is missing");
+        }
+        if (!tag.dataTypes.contains(field.getFieldType())) {
+            throw new ImageReadException("Required field \"" + tag.name
+                    + "\" has incorrect type " + 
field.getFieldType().getName());
+        }
+        if (field.getCount() != 1) {
+            throw new ImageReadException("Field \"" + tag.name + "\" has wrong 
count " + field.getCount());
+        }
+        final byte[] bytes = field.getByteArrayValue();
+        return tag.getValue(field.getByteOrder(), bytes);
+    }
+
+    public double[] getFieldValue(final TagInfoDoubles tag, final boolean 
mustExist)
             throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {

Modified: 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageMetadata.java
URL: 
http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageMetadata.java?rev=1760815&r1=1760814&r2=1760815&view=diff
==============================================================================
--- 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageMetadata.java
 (original)
+++ 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageMetadata.java
 Wed Sep 14 23:25:47 2016
@@ -33,16 +33,16 @@ import org.apache.commons.imaging.format
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfo;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoAscii;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoByte;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoDouble;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoFloat;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoDoubles;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoFloats;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoGpsText;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoLong;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoRational;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSByte;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSLong;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSRational;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSShort;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoShort;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoLongs;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoRationals;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSBytes;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSLongs;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSRationals;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSShorts;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoShorts;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoXpString;
 import org.apache.commons.imaging.formats.tiff.write.TiffOutputDirectory;
 import org.apache.commons.imaging.formats.tiff.write.TiffOutputField;
@@ -299,7 +299,7 @@ public class TiffImageMetadata extends G
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public short[] getFieldValue(final TagInfoShort tag) throws 
ImageReadException {
+    public short[] getFieldValue(final TagInfoShorts tag) throws 
ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
             return null;
@@ -311,7 +311,7 @@ public class TiffImageMetadata extends G
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public int[] getFieldValue(final TagInfoLong tag) throws 
ImageReadException {
+    public int[] getFieldValue(final TagInfoLongs tag) throws 
ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
             return null;
@@ -323,7 +323,7 @@ public class TiffImageMetadata extends G
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public RationalNumber[] getFieldValue(final TagInfoRational tag)
+    public RationalNumber[] getFieldValue(final TagInfoRationals tag)
             throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
@@ -336,7 +336,7 @@ public class TiffImageMetadata extends G
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public byte[] getFieldValue(final TagInfoSByte tag) throws 
ImageReadException {
+    public byte[] getFieldValue(final TagInfoSBytes tag) throws 
ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
             return null;
@@ -347,7 +347,7 @@ public class TiffImageMetadata extends G
         return field.getByteArrayValue();
     }
 
-    public short[] getFieldValue(final TagInfoSShort tag) throws 
ImageReadException {
+    public short[] getFieldValue(final TagInfoSShorts tag) throws 
ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
             return null;
@@ -359,7 +359,7 @@ public class TiffImageMetadata extends G
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public int[] getFieldValue(final TagInfoSLong tag) throws 
ImageReadException {
+    public int[] getFieldValue(final TagInfoSLongs tag) throws 
ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
             return null;
@@ -371,7 +371,7 @@ public class TiffImageMetadata extends G
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public RationalNumber[] getFieldValue(final TagInfoSRational tag)
+    public RationalNumber[] getFieldValue(final TagInfoSRationals tag)
             throws ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
@@ -384,7 +384,7 @@ public class TiffImageMetadata extends G
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public float[] getFieldValue(final TagInfoFloat tag) throws 
ImageReadException {
+    public float[] getFieldValue(final TagInfoFloats tag) throws 
ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
             return null;
@@ -396,7 +396,7 @@ public class TiffImageMetadata extends G
         return tag.getValue(field.getByteOrder(), bytes);
     }
 
-    public double[] getFieldValue(final TagInfoDouble tag) throws 
ImageReadException {
+    public double[] getFieldValue(final TagInfoDoubles tag) throws 
ImageReadException {
         final TiffField field = findField(tag);
         if (field == null) {
             return null;

Modified: 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java
URL: 
http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java?rev=1760815&r1=1760814&r2=1760815&view=diff
==============================================================================
--- 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java
 (original)
+++ 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffImageParser.java
 Wed Sep 14 23:25:47 2016
@@ -253,9 +253,12 @@ public class TiffImageParser extends Ima
 
         final ImageInfo.ColorType colorType = ImageInfo.ColorType.RGB;
 
-        final short[] compressionFieldValues = 
directory.getFieldValue(TiffTagConstants.TIFF_TAG_COMPRESSION, false);
-        final short compressionFieldValue = compressionFieldValues != null ?
-            compressionFieldValues[0] : TIFF_COMPRESSION_UNCOMPRESSED_1;
+        final short compressionFieldValue;
+        if (directory.findField(TiffTagConstants.TIFF_TAG_COMPRESSION) != 
null) {
+            compressionFieldValue = 
directory.getFieldValue(TiffTagConstants.TIFF_TAG_COMPRESSION);
+        } else {
+            compressionFieldValue = TIFF_COMPRESSION_UNCOMPRESSED_1;
+        }
         final int compression = 0xffff & compressionFieldValue;
         ImageInfo.CompressionAlgorithm compressionAlgorithm;
 
@@ -544,12 +547,14 @@ public class TiffImageParser extends Ima
             throw new ImageReadException("TIFF missing entries");
         }
 
-        final int photometricInterpretation = 0xffff & 
directory.getSingleFieldValue(
+        final int photometricInterpretation = 0xffff & directory.getFieldValue(
                 TiffTagConstants.TIFF_TAG_PHOTOMETRIC_INTERPRETATION);
-        final short[] compressionFieldValues = directory.getFieldValue(
-                TiffTagConstants.TIFF_TAG_COMPRESSION, false);
-        final short compressionFieldValue = compressionFieldValues != null ?
-                compressionFieldValues[0] : TIFF_COMPRESSION_UNCOMPRESSED_1;
+        final short compressionFieldValue;
+        if (directory.findField(TiffTagConstants.TIFF_TAG_COMPRESSION) != 
null) {
+            compressionFieldValue = 
directory.getFieldValue(TiffTagConstants.TIFF_TAG_COMPRESSION);
+        } else {
+            compressionFieldValue = TIFF_COMPRESSION_UNCOMPRESSED_1;
+        }
         final int compression = 0xffff & compressionFieldValue;
         final int width = 
directory.getSingleFieldValue(TiffTagConstants.TIFF_TAG_IMAGE_WIDTH);
         final int height = 
directory.getSingleFieldValue(TiffTagConstants.TIFF_TAG_IMAGE_LENGTH);      

Modified: 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffReader.java
URL: 
http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffReader.java?rev=1760815&r1=1760814&r2=1760815&view=diff
==============================================================================
--- 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffReader.java
 (original)
+++ 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/TiffReader.java
 Wed Sep 14 23:25:47 2016
@@ -43,7 +43,7 @@ import org.apache.commons.imaging.format
 import 
org.apache.commons.imaging.formats.tiff.constants.TiffDirectoryConstants;
 import org.apache.commons.imaging.formats.tiff.constants.TiffTagConstants;
 import org.apache.commons.imaging.formats.tiff.fieldtypes.FieldType;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoLong;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoDirectory;
 
 public class TiffReader extends BinaryFileParser {
 
@@ -228,7 +228,7 @@ public class TiffReader extends BinaryFi
             }
 
             if (listener.readOffsetDirectories()) {
-                final TagInfoLong[] offsetFields = {
+                final TagInfoDirectory[] offsetFields = {
                         ExifTagConstants.EXIF_TAG_EXIF_OFFSET,
                         ExifTagConstants.EXIF_TAG_GPSINFO,
                         ExifTagConstants.EXIF_TAG_INTEROP_OFFSET
@@ -239,14 +239,14 @@ public class TiffReader extends BinaryFi
                         TiffDirectoryConstants.DIRECTORY_TYPE_INTEROPERABILITY
                 };
                 for (int i = 0; i < offsetFields.length; i++) {
-                    final TagInfoLong offsetField = offsetFields[i];
+                    final TagInfoDirectory offsetField = offsetFields[i];
                     final TiffField field = directory.findField(offsetField);
                     if (field != null) {
                         long subDirectoryOffset;
                         int subDirectoryType;
                         boolean subDirectoryRead = false;
                         try {
-                            subDirectoryOffset = 
directory.getSingleFieldValue(offsetField);
+                            subDirectoryOffset = 
directory.getFieldValue(offsetField);
                             subDirectoryType = directoryTypes[i];
                             subDirectoryRead = readDirectory(byteSource,
                                     subDirectoryOffset, subDirectoryType,

Modified: 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/AdobePageMaker6TagConstants.java
URL: 
http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/AdobePageMaker6TagConstants.java?rev=1760815&r1=1760814&r2=1760815&view=diff
==============================================================================
--- 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/AdobePageMaker6TagConstants.java
 (original)
+++ 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/AdobePageMaker6TagConstants.java
 Wed Sep 14 23:25:47 2016
@@ -22,9 +22,9 @@ import java.util.List;
 
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfo;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoAscii;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoByte;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoLongOrIFD;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoBytes;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoLong;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoLongOrIFD;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoShort;
 
 /**
@@ -40,27 +40,27 @@ public final class AdobePageMaker6TagCon
             "SubIFDs",  0x014a, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN, true);
 
-    public static final TagInfoByte TIFF_TAG_CLIP_PATH = new TagInfoByte(
+    public static final TagInfoBytes TIFF_TAG_CLIP_PATH = new TagInfoBytes(
             "ClipPath",  0x0157, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final TagInfoLong TIFF_TAG_XCLIP_PATH_UNITS = new 
TagInfoLong(
-            "XClipPathUnits", 0x0158, 1,
+            "XClipPathUnits", 0x0158,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final TagInfoLong TIFF_TAG_YCLIP_PATH_UNITS = new 
TagInfoLong(
-            "YClipPathUnits", 0x0159, 1,
+            "YClipPathUnits", 0x0159,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final TagInfoShort TIFF_TAG_INDEXED = new TagInfoShort(
-            "Indexed", 0x015a, 1,
+            "Indexed", 0x015a,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final int INDEXED_VALUE_NOT_INDEXED = 0;
     public static final int INDEXED_VALUE_INDEXED = 1;
 
     public static final TagInfoShort TIFF_TAG_OPIPROXY = new TagInfoShort(
-            "OPIProxy", 0x015f, 1,
+            "OPIProxy", 0x015f,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
     public static final int 
OPIPROXY_VALUE_HIGHER_RESOLUTION_IMAGE_DOES_NOT_EXIST = 0;
     public static final int OPIPROXY_VALUE_HIGHER_RESOLUTION_IMAGE_EXISTS = 1;

Modified: 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/AdobePhotoshopTagConstants.java
URL: 
http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/AdobePhotoshopTagConstants.java?rev=1760815&r1=1760814&r2=1760815&view=diff
==============================================================================
--- 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/AdobePhotoshopTagConstants.java
 (original)
+++ 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/AdobePhotoshopTagConstants.java
 Wed Sep 14 23:25:47 2016
@@ -21,7 +21,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfo;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoUndefined;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoUndefineds;
 
 /**
  * TIFF specification supplement 2
@@ -32,12 +32,12 @@ import org.apache.commons.imaging.format
  */
 public final class AdobePhotoshopTagConstants {
 
-    public final static TagInfoUndefined EXIF_TAG_JPEGTABLES = new 
TagInfoUndefined(
+    public final static TagInfoUndefineds EXIF_TAG_JPEGTABLES = new 
TagInfoUndefineds(
             "JPEGTables", 0x015b, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public final static TagInfoUndefined EXIF_TAG_IMAGE_SOURCE_DATA = new 
TagInfoUndefined(
-            "ImageSourceData", 0x935c, 1,
+    public final static TagInfoUndefineds EXIF_TAG_IMAGE_SOURCE_DATA = new 
TagInfoUndefineds(
+            "ImageSourceData", 0x935c, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
     public final static List<TagInfo> ALL_ADOBE_PHOTOSHOP_TAGS =

Modified: 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/DcfTagConstants.java
URL: 
http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/DcfTagConstants.java?rev=1760815&r1=1760814&r2=1760815&view=diff
==============================================================================
--- 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/DcfTagConstants.java
 (original)
+++ 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/DcfTagConstants.java
 Wed Sep 14 23:25:47 2016
@@ -45,7 +45,7 @@ public final class DcfTagConstants {
             TiffDirectoryType.EXIF_DIRECTORY_INTEROP_IFD);
 
     public static final TagInfoShort EXIF_TAG_COLOR_SPACE = new TagInfoShort(
-            "ColorSpace", 0xa001, 1, 
TiffDirectoryType.EXIF_DIRECTORY_EXIF_IFD);
+            "ColorSpace", 0xa001, TiffDirectoryType.EXIF_DIRECTORY_EXIF_IFD);
     public static final int COLOR_SPACE_VALUE_SRGB = 1;
     public static final int COLOR_SPACE_VALUE_ADOBE_RGB = 2;
     public static final int COLOR_SPACE_VALUE_UNCALIBRATED = 65535;

Modified: 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/DngTagConstants.java
URL: 
http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/DngTagConstants.java?rev=1760815&r1=1760814&r2=1760815&view=diff
==============================================================================
--- 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/DngTagConstants.java
 (original)
+++ 
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/constants/DngTagConstants.java
 Wed Sep 14 23:25:47 2016
@@ -23,17 +23,21 @@ import java.util.List;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfo;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoAscii;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoAsciiOrByte;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoByte;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoDouble;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoFloat;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoBytes;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoDoubles;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoFloats;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoLong;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoLongs;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoRational;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoRationals;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSRational;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoSRationals;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoShort;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoShortOrLong;
 import 
org.apache.commons.imaging.formats.tiff.taginfos.TagInfoShortOrLongOrRational;
 import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoShortOrRational;
-import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoUndefined;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoShorts;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoUndefineds;
 
 /**
  * Digital Negative (DNG) Specification
@@ -42,11 +46,11 @@ import org.apache.commons.imaging.format
  */
 public final class DngTagConstants {
 
-    public static final TagInfoByte EXIF_TAG_DNG_VERSION = new TagInfoByte(
+    public static final TagInfoBytes EXIF_TAG_DNG_VERSION = new TagInfoBytes(
             "DNGVersion", 0xc612, 4,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
-    public static final TagInfoByte EXIF_TAG_DNG_BACKWARD_VERSION = new 
TagInfoByte(
+    public static final TagInfoBytes EXIF_TAG_DNG_BACKWARD_VERSION = new 
TagInfoBytes(
             "DNGBackwardVersion", 0xc613, 4,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
@@ -58,12 +62,12 @@ public final class DngTagConstants {
             "LocalizedCameraModel", 0xc615, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
-    public static final TagInfoByte EXIF_TAG_CFAPLANE_COLOR = new TagInfoByte(
+    public static final TagInfoBytes EXIF_TAG_CFAPLANE_COLOR = new 
TagInfoBytes(
             "CFAPlaneColor", 0xc616, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final TagInfoShort EXIF_TAG_CFALAYOUT = new TagInfoShort(
-            "CFALayout", 0xc617, 1,
+            "CFALayout", 0xc617,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
     public static final int CFALAYOUT_VALUE_RECTANGULAR = 1;
     public static final int CFALAYOUT_VALUE_EVEN_COLUMNS_OFFSET_DOWN_1_2_ROW = 
2;
@@ -75,23 +79,23 @@ public final class DngTagConstants {
     public static final int 
CFALAYOUT_VALUE_EVEN_ROWS_OFFSET_DOWN_1_2_ROW_EVEN_COLUMNS_OFFSET_LEFT_1_2_COLUMN
 = 8;
     public static final int 
CFALAYOUT_VALUE_EVEN_ROWS_OFFSET_DOWN_1_2_ROW_EVEN_COLUMNS_OFFSET_RIGHT_1_2_COLUMN
 = 9;
 
-    public static final TagInfoShort EXIF_TAG_LINEARIZATION_TABLE = new 
TagInfoShort(
+    public static final TagInfoShorts EXIF_TAG_LINEARIZATION_TABLE = new 
TagInfoShorts(
             "LinearizationTable", 0xc618, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoShort EXIF_TAG_BLACK_LEVEL_REPEAT_DIM = new 
TagInfoShort(
-            "BlackLevelRepeatDim", 0xc619,
-            2, TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
+    public static final TagInfoShorts EXIF_TAG_BLACK_LEVEL_REPEAT_DIM = new 
TagInfoShorts(
+            "BlackLevelRepeatDim", 0xc619, 2,
+            TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final TagInfoShortOrLongOrRational EXIF_TAG_BLACK_LEVEL = 
new TagInfoShortOrLongOrRational(
             "BlackLevel", 0xc61a, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoSRational EXIF_TAG_BLACK_LEVEL_DELTA_H = new 
TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_BLACK_LEVEL_DELTA_H = new 
TagInfoSRationals(
             "BlackLevelDeltaH", 0xc61b, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoSRational EXIF_TAG_BLACK_LEVEL_DELTA_V = new 
TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_BLACK_LEVEL_DELTA_V = new 
TagInfoSRationals(
             "BlackLevelDeltaV", 0xc61c, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
@@ -99,7 +103,7 @@ public final class DngTagConstants {
             "WhiteLevel", 0xc61d, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoRational EXIF_TAG_DEFAULT_SCALE = new 
TagInfoRational(
+    public static final TagInfoRationals EXIF_TAG_DEFAULT_SCALE = new 
TagInfoRationals(
             "DefaultScale", 0xc61e, 2,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
@@ -111,31 +115,31 @@ public final class DngTagConstants {
             "DefaultCropSize", 0xc620, 2,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoSRational EXIF_TAG_COLOR_MATRIX_1 = new 
TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_COLOR_MATRIX_1 = new 
TagInfoSRationals(
             "ColorMatrix1", 0xc621, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoSRational EXIF_TAG_COLOR_MATRIX_2 = new 
TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_COLOR_MATRIX_2 = new 
TagInfoSRationals(
             "ColorMatrix2", 0xc622, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoSRational EXIF_TAG_CAMERA_CALIBRATION_1 = new 
TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_CAMERA_CALIBRATION_1 = new 
TagInfoSRationals(
             "CameraCalibration1", 0xc623, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoSRational EXIF_TAG_CAMERA_CALIBRATION_2 = new 
TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_CAMERA_CALIBRATION_2 = new 
TagInfoSRationals(
             "CameraCalibration2", 0xc624, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoSRational EXIF_TAG_REDUCTION_MATRIX_1 = new 
TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_REDUCTION_MATRIX_1 = new 
TagInfoSRationals(
             "ReductionMatrix1", 0xc625, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoSRational EXIF_TAG_REDUCTION_MATRIX_2 = new 
TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_REDUCTION_MATRIX_2 = new 
TagInfoSRationals(
             "ReductionMatrix2", 0xc626, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoRational EXIF_TAG_ANALOG_BALANCE = new 
TagInfoRational(
+    public static final TagInfoRationals EXIF_TAG_ANALOG_BALANCE = new 
TagInfoRationals(
             "AnalogBalance", 0xc627, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
@@ -143,62 +147,62 @@ public final class DngTagConstants {
             "AsShotNeutral", 0xc628, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
-    public static final TagInfoRational EXIF_TAG_AS_SHOT_WHITE_XY = new 
TagInfoRational(
+    public static final TagInfoRationals EXIF_TAG_AS_SHOT_WHITE_XY = new 
TagInfoRationals(
             "AsShotWhiteXY", 0xc629, 2,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
     public static final TagInfoSRational EXIF_TAG_BASELINE_EXPOSURE = new 
TagInfoSRational(
-            "BaselineExposure", 0xc62a, 1,
+            "BaselineExposure", 0xc62a,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
     public static final TagInfoRational EXIF_TAG_BASELINE_NOISE = new 
TagInfoRational(
-            "BaselineNoise", 0xc62b, 1,
+            "BaselineNoise", 0xc62b,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
     public static final TagInfoRational EXIF_TAG_BASELINE_SHARPNESS = new 
TagInfoRational(
-            "BaselineSharpness", 0xc62c, 1,
+            "BaselineSharpness", 0xc62c,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
     public static final TagInfoLong EXIF_TAG_BAYER_GREEN_SPLIT = new 
TagInfoLong(
-            "BayerGreenSplit", 0xc62d, 1,
+            "BayerGreenSplit", 0xc62d,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final TagInfoRational EXIF_TAG_LINEAR_RESPONSE_LIMIT = new 
TagInfoRational(
-            "LinearResponseLimit", 0xc62e, 1,
+            "LinearResponseLimit", 0xc62e,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
     public static final TagInfoAscii EXIF_TAG_CAMERA_SERIAL_NUMBER = new 
TagInfoAscii(
             "CameraSerialNumber", 0xc62f, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
-    public static final TagInfoRational EXIF_TAG_DNG_LENS_INFO = new 
TagInfoRational(
+    public static final TagInfoRationals EXIF_TAG_DNG_LENS_INFO = new 
TagInfoRationals(
             "DNGLensInfo", 0xc630, 4,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
     public static final TagInfoRational EXIF_TAG_CHROMA_BLUR_RADIUS = new 
TagInfoRational(
-            "ChromaBlurRadius", 0xc631, 1,
+            "ChromaBlurRadius", 0xc631,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final TagInfoRational EXIF_TAG_ANTI_ALIAS_STRENGTH = new 
TagInfoRational(
-            "AntiAliasStrength", 0xc632, 1,
+            "AntiAliasStrength", 0xc632,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final TagInfoRational EXIF_TAG_SHADOW_SCALE = new 
TagInfoRational(
-            "ShadowScale", 0xc633, 1,
+            "ShadowScale", 0xc633,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
-    public static final TagInfoByte EXIF_TAG_DNG_PRIVATE_DATA = new 
TagInfoByte(
+    public static final TagInfoBytes EXIF_TAG_DNG_PRIVATE_DATA = new 
TagInfoBytes(
             "DNGPrivateData", 0xc634, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
     public static final TagInfoShort EXIF_TAG_MAKER_NOTE_SAFETY = new 
TagInfoShort(
-            "MakerNoteSafety", 0xc635, 1,
+            "MakerNoteSafety", 0xc635,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
     public static final int MAKER_NOTE_SAFETY_VALUE_UNSAFE = 0;
     public static final int MAKER_NOTE_SAFETY_VALUE_SAFE = 1;
 
     public static final TagInfoShort EXIF_TAG_CALIBRATION_ILLUMINANT_1 = new 
TagInfoShort(
-            "CalibrationIlluminant1", 0xc65a, 1,
+            "CalibrationIlluminant1", 0xc65a,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
     public static final int CALIBRATION_ILLUMINANT_1_VALUE_DAYLIGHT = 1;
     public static final int CALIBRATION_ILLUMINANT_1_VALUE_FLUORESCENT = 2;
@@ -222,7 +226,7 @@ public final class DngTagConstants {
     public static final int CALIBRATION_ILLUMINANT_1_VALUE_OTHER = 255;
 
     public static final TagInfoShort EXIF_TAG_CALIBRATION_ILLUMINANT_2 = new 
TagInfoShort(
-            "CalibrationIlluminant2", 0xc65b, 1,
+            "CalibrationIlluminant2", 0xc65b,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
     public static final int CALIBRATION_ILLUMINANT_2_VALUE_DAYLIGHT = 1;
     public static final int CALIBRATION_ILLUMINANT_2_VALUE_FLUORESCENT = 2;
@@ -246,10 +250,10 @@ public final class DngTagConstants {
     public static final int CALIBRATION_ILLUMINANT_2_VALUE_OTHER = 255;
 
     public static final TagInfoRational EXIF_TAG_BEST_QUALITY_SCALE = new 
TagInfoRational(
-            "BestQualityScale", 0xc65c, 1,
+            "BestQualityScale", 0xc65c,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoByte EXIF_TAG_RAW_DATA_UNIQUE_ID = new 
TagInfoByte(
+    public static final TagInfoBytes EXIF_TAG_RAW_DATA_UNIQUE_ID = new 
TagInfoBytes(
             "RawDataUniqueID", 0xc65d, 16,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
@@ -257,7 +261,7 @@ public final class DngTagConstants {
             "OriginalRawFileName", 0xc68b, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
-    public static final TagInfoUndefined EXIF_TAG_ORIGINAL_RAW_FILE_DATA = new 
TagInfoUndefined(
+    public static final TagInfoUndefineds EXIF_TAG_ORIGINAL_RAW_FILE_DATA = 
new TagInfoUndefineds(
             "OriginalRawFileData", 0xc68c, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
@@ -269,24 +273,24 @@ public final class DngTagConstants {
             "MaskedAreas", 0xc68e, 4,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoUndefined EXIF_TAG_AS_SHOT_ICCPROFILE = new 
TagInfoUndefined(
+    public static final TagInfoUndefineds EXIF_TAG_AS_SHOT_ICCPROFILE = new 
TagInfoUndefineds(
             "AsShotICCProfile", 0xc68f, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoSRational EXIF_TAG_AS_SHOT_PRE_PROFILE_MATRIX = 
new TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_AS_SHOT_PRE_PROFILE_MATRIX 
= new TagInfoSRationals(
             "AsShotPreProfileMatrix", 0xc690, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
-    public static final TagInfoUndefined EXIF_TAG_CURRENT_ICCPROFILE = new 
TagInfoUndefined(
+    public static final TagInfoUndefineds EXIF_TAG_CURRENT_ICCPROFILE = new 
TagInfoUndefineds(
             "CurrentICCProfile", 0xc691, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
-    public static final TagInfoSRational EXIF_TAG_CURRENT_PRE_PROFILE_MATRIX = 
new TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_CURRENT_PRE_PROFILE_MATRIX 
= new TagInfoSRationals(
             "CurrentPreProfileMatrix", 0xc692, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
     public static final TagInfoShort EXIF_TAG_COLORIMETRIC_REFERENCE = new 
TagInfoShort(
-            "ColorimetricReference", 0xc6bf, 1,
+            "ColorimetricReference", 0xc6bf,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
     public static final short COLORIMETRIC_REFERENCE_VALUE_SCENE_REFERRED = 0;
     public static final short COLORIMETRIC_REFERENCE_VALUE_OUTPUT_REFERRED = 1;
@@ -299,7 +303,7 @@ public final class DngTagConstants {
             "ProfileCalibrationSignature", 0xc6f4, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
-    public static final TagInfoLong EXIF_TAG_EXTRA_CAMERA_PROFILES = new 
TagInfoLong(
+    public static final TagInfoLongs EXIF_TAG_EXTRA_CAMERA_PROFILES = new 
TagInfoLongs(
             "ExtraCameraProfiles", 0xc6f5, -1,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
@@ -308,31 +312,31 @@ public final class DngTagConstants {
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
     public static final TagInfoRational EXIF_TAG_NOISE_REDUCTION_APPLIED = new 
TagInfoRational(
-            "NoiseReductionApplied", 0xc6f7, 1,
+            "NoiseReductionApplied", 0xc6f7,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final TagInfoAscii EXIF_TAG_PROFILE_NAME = new TagInfoAscii(
             "ProfileName", 0xc6f8, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoLong EXIF_TAG_PROFILE_HUE_SAT_MAP_DIMS = new 
TagInfoLong(
+    public static final TagInfoLongs EXIF_TAG_PROFILE_HUE_SAT_MAP_DIMS = new 
TagInfoLongs(
             "ProfileHueSatMapDims", 0xc6f9, 3,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoFloat EXIF_TAG_PROFILE_HUE_SAT_MAP_DATA1 = new 
TagInfoFloat(
+    public static final TagInfoFloats EXIF_TAG_PROFILE_HUE_SAT_MAP_DATA1 = new 
TagInfoFloats(
             "ProfileHueSatMapData1", 0xc6fa, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoFloat EXIF_TAG_PROFILE_HUE_SAT_MAP_DATA2 = new 
TagInfoFloat(
+    public static final TagInfoFloats EXIF_TAG_PROFILE_HUE_SAT_MAP_DATA2 = new 
TagInfoFloats(
             "ProfileHueSatMapData2", 0xc6fb, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoFloat EXIF_TAG_PROFILE_TONE_CURVE = new 
TagInfoFloat(
+    public static final TagInfoFloats EXIF_TAG_PROFILE_TONE_CURVE = new 
TagInfoFloats(
             "ProfileToneCurve", 0xc6fc, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final TagInfoLong EXIF_TAG_PROFILE_EMBED_POLICY = new 
TagInfoLong(
-            "ProfileEmbedPolicy", 0xc6fd, 1,
+            "ProfileEmbedPolicy", 0xc6fd,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
     public static final int PROFILE_EMBED_POLICY_VALUE_ALLOW_COPYING = 0;
     public static final int PROFILE_EMBED_POLICY_VALUE_EMBED_IF_USED = 1;
@@ -343,11 +347,11 @@ public final class DngTagConstants {
             "ProfileCopyright", 0xc6fe, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoSRational EXIF_TAG_FORWARD_MATRIX1 = new 
TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_FORWARD_MATRIX1 = new 
TagInfoSRationals(
             "ForwardMatrix1", 0xc714, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoSRational EXIF_TAG_FORWARD_MATRIX2 = new 
TagInfoSRational(
+    public static final TagInfoSRationals EXIF_TAG_FORWARD_MATRIX2 = new 
TagInfoSRationals(
             "ForwardMatrix2", 0xc715, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
@@ -363,12 +367,12 @@ public final class DngTagConstants {
             "PreviewSettingsName", 0xc718, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoByte EXIF_TAG_PREVIEW_SETTINGS_DIGEST = new 
TagInfoByte(
+    public static final TagInfoBytes EXIF_TAG_PREVIEW_SETTINGS_DIGEST = new 
TagInfoBytes(
             "PreviewSettingsDigest", 0xc719, 16,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
     public static final TagInfoLong EXIF_TAG_PREVIEW_COLORSPACE = new 
TagInfoLong(
-            "PreviewColorspace", 0xc71a, 1,
+            "PreviewColorspace", 0xc71a,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
     public static final int PREVIEW_COLORSPACE_VALUE_UNKNOWN = 0;
     public static final int PREVIEW_COLORSPACE_VALUE_GRAY_GAMMA_2_2 = 1;
@@ -380,11 +384,11 @@ public final class DngTagConstants {
             "PreviewDateTime", 0xc71b, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoByte EXIF_TAG_RAW_IMAGE_DIGEST = new 
TagInfoByte(
+    public static final TagInfoBytes EXIF_TAG_RAW_IMAGE_DIGEST = new 
TagInfoBytes(
             "RawImageDigest", 0xc71c, 16,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
-    public static final TagInfoByte EXIF_TAG_ORIGINAL_RAW_FILE_DIGEST = new 
TagInfoByte(
+    public static final TagInfoBytes EXIF_TAG_ORIGINAL_RAW_FILE_DIGEST = new 
TagInfoBytes(
             "OriginalRawFileDigest", 0xc71d, 16,
             TiffDirectoryType.EXIF_DIRECTORY_IFD0);
 
@@ -396,27 +400,27 @@ public final class DngTagConstants {
             "RowInterleaveFactor", 0xc71f, 1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoLong EXIF_TAG_PROFILE_LOOK_TABLE_DIMS = new 
TagInfoLong(
+    public static final TagInfoLongs EXIF_TAG_PROFILE_LOOK_TABLE_DIMS = new 
TagInfoLongs(
             "ProfileLookTableDims", 0xc725, 3,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoFloat EXIF_TAG_PROFILE_LOOK_TABLE_DATA = new 
TagInfoFloat(
+    public static final TagInfoFloats EXIF_TAG_PROFILE_LOOK_TABLE_DATA = new 
TagInfoFloats(
             "ProfileLookTableData", 0xc726, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoUndefined EXIF_TAG_OPCODE_LIST_1 = new 
TagInfoUndefined(
+    public static final TagInfoUndefineds EXIF_TAG_OPCODE_LIST_1 = new 
TagInfoUndefineds(
             "OpcodeList1", 0xc740, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoUndefined EXIF_TAG_OPCODE_LIST_2 = new 
TagInfoUndefined(
+    public static final TagInfoUndefineds EXIF_TAG_OPCODE_LIST_2 = new 
TagInfoUndefineds(
             "OpcodeList2", 0xc741, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoUndefined EXIF_TAG_OPCODE_LIST_3 = new 
TagInfoUndefined(
+    public static final TagInfoUndefineds EXIF_TAG_OPCODE_LIST_3 = new 
TagInfoUndefineds(
             "OpcodeList3", 0xc74E, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 
-    public static final TagInfoDouble EXIF_TAG_NOISE_PROFILE = new 
TagInfoDouble(
+    public static final TagInfoDoubles EXIF_TAG_NOISE_PROFILE = new 
TagInfoDoubles(
             "NoiseProfile", 0xc761, -1,
             TiffDirectoryType.EXIF_DIRECTORY_UNKNOWN);
 


Reply via email to