You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by da...@apache.org on 2012/02/18 07:43:35 UTC

svn commit: r1245871 [4/5] - in /commons/proper/sanselan/trunk: ./ src/main/java/org/apache/commons/sanselan/common/ src/main/java/org/apache/commons/sanselan/formats/jpeg/ src/main/java/org/apache/commons/sanselan/formats/tiff/ src/main/java/org/apach...

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoAny.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoAny.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoAny.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoAny.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoAny extends TagInfo {
+    public TagInfoAny(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_ANY, length, directoryType);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoAny.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoAscii.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoAscii.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoAscii.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoAscii.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,51 @@
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import java.io.UnsupportedEncodingException;
+
+import org.apache.commons.sanselan.ImageWriteException;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoAscii extends TagInfo {
+    public TagInfoAscii(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_ASCII, length, directoryType);
+    }
+    
+    public String[] getValue(int byteOrder, byte[] bytes) {
+        int nullCount = 1;
+        for (int i = 0; i < bytes.length - 1; i++) {
+            if (bytes[i] == 0) {
+                nullCount++;
+            }
+        }
+        String[] strings = new String[nullCount + 1];
+        int stringsAdded = 0;
+        strings[0] = ""; // if we have a 0 length string
+        int nextStringPos = 0;
+        // According to the Exiftool FAQ, http://www.metadataworkinggroup.org
+        // specifies that the TIFF ASCII fields are actually UTF-8.
+        // Exiftool however allows you to configure the charset used.
+        for (int i = 0; i < bytes.length; i++) {
+            if (bytes[i] == 0) {
+                try {
+                    String string = new String(bytes, nextStringPos, i - nextStringPos, "UTF-8");
+                    strings[stringsAdded++] = string;
+                } catch (UnsupportedEncodingException unsupportedEncoding) {
+                }
+                nextStringPos = i + 1;
+            }
+        }
+        if (nextStringPos < bytes.length) {
+            // Buggy file, string wasn't null terminated
+            try {
+                String string = new String(bytes, nextStringPos, bytes.length - nextStringPos, "UTF-8");
+                strings[stringsAdded++] = string;
+            } catch (UnsupportedEncodingException unsupportedEncoding) {
+            }
+        }
+        return strings;
+    }
+
+    public byte[] encodeValue(int byteOrder, String... values) throws ImageWriteException {
+        return FIELD_TYPE_ASCII.writeData(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoAscii.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoByte.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoByte.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoByte.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoByte.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import java.util.List;
+
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+import org.apache.commons.sanselan.formats.tiff.fieldtypes.FieldType;
+
+public class TagInfoByte extends TagInfo {
+    public TagInfoByte(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_BYTE, length, directoryType);
+    }
+    
+    public TagInfoByte(String name, int tag, List<FieldType> fieldTypes,
+            int length, TiffDirectoryType directoryType) {
+        super(name, tag, fieldTypes, length, directoryType);
+    }
+
+    public byte[] encodeValue(int byteOrder, byte... values) {
+        return values;
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoByte.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoByteOrShort.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoByteOrShort.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoByteOrShort.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoByteOrShort.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoByteOrShort extends TagInfo {
+    public TagInfoByteOrShort(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_DESCRIPTION_BYTE_OR_SHORT, length, directoryType);
+    }
+    
+    public byte[] encodeValue(int byteOrder, byte... values) {
+        return values;
+    }
+    
+    public byte[] encodeValue(int byteOrder, short... values) {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoByteOrShort.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoDouble.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoDouble.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoDouble.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoDouble.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.ImageWriteException;
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoDouble extends TagInfo {
+    public TagInfoDouble(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_DOUBLE, length, directoryType);
+    }
+    
+    public double[] getValue(int byteOrder, byte[] bytes) {
+        return BinaryConversions.convertToDoubleArray(bytes, byteOrder);
+    }
+    
+    public byte[] encodeValue(int byteOrder, double... values) throws ImageWriteException {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoDouble.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoFloat.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoFloat.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoFloat.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoFloat.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.ImageWriteException;
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoFloat extends TagInfo {
+    public TagInfoFloat(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_FLOAT, length, directoryType);
+    }
+    
+    public float[] getValue(int byteOrder, byte[] bytes) {
+        return BinaryConversions.convertToFloatArray(bytes, byteOrder);
+    }
+    
+    public byte[] encodeValue(int byteOrder, float... values) throws ImageWriteException {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoFloat.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoLong.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoLong.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoLong.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoLong.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.ImageWriteException;
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+
+public class TagInfoLong extends TagInfo {
+    public TagInfoLong(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_LONG, length, directoryType);
+    }
+    
+    public TagInfoLong(String name, int tag, int length, TiffDirectoryType directoryType, boolean isOffset) {
+        super(name, tag, FIELD_TYPE_LONG, length, directoryType, isOffset);
+    }
+    
+    public int[] getValue(int byteOrder, byte[] bytes) {
+        return BinaryConversions.convertToIntArray(bytes, byteOrder);
+    }
+    
+    public byte[] encodeValue(int byteOrder, int... values) throws ImageWriteException {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoLong.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoRational.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoRational.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoRational.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoRational.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.ImageWriteException;
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.common.RationalNumber;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoRational extends TagInfo {
+    public TagInfoRational(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_RATIONAL, length, directoryType);
+    }
+
+    public RationalNumber[] getValue(int byteOrder, byte[] bytes) {
+        return BinaryConversions.convertToRationalArray(bytes, byteOrder);
+    }
+    
+    public byte[] encodeValue(int byteOrder, RationalNumber... values) throws ImageWriteException {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoRational.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSByte.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSByte.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSByte.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSByte.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.ImageWriteException;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoSByte extends TagInfo {
+    public TagInfoSByte(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_SBYTE, length, directoryType);
+    }
+
+    public byte[] encodeValue(int byteOrder, byte... values) throws ImageWriteException {
+        return values;
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSByte.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSLong.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSLong.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSLong.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSLong.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.ImageWriteException;
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoSLong extends TagInfo {
+    public TagInfoSLong(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_SLONG, length, directoryType);
+    }
+    
+    public int[] getValue(int byteOrder, byte[] bytes) {
+        return BinaryConversions.convertToIntArray(bytes, byteOrder);
+    }
+    
+    public byte[] encodeValue(int byteOrder, int... values) throws ImageWriteException {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSLong.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSRational.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSRational.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSRational.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSRational.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.ImageWriteException;
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.common.RationalNumber;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoSRational extends TagInfo {
+    public TagInfoSRational(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_SRATIONAL, length, directoryType);
+    }
+
+    public RationalNumber[] getValue(int byteOrder, byte[] bytes) {
+        return BinaryConversions.convertToRationalArray(bytes, byteOrder);
+    }
+    
+    public byte[] encodeValue(int byteOrder, RationalNumber... values) throws ImageWriteException {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSRational.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSShort.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSShort.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSShort.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSShort.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.ImageWriteException;
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoSShort extends TagInfo {
+    public TagInfoSShort(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_SSHORT, length, directoryType);
+    }
+    
+    public short[] getValue(int byteOrder, byte[] bytes) {
+        return BinaryConversions.convertToShortArray(bytes, byteOrder);
+    }
+    
+    public byte[] encodeValue(int byteOrder, short... values) throws ImageWriteException {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoSShort.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShort.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShort.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShort.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShort.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoShort extends TagInfo {
+    public TagInfoShort(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_SHORT, length, directoryType);
+    }
+    
+    public short[] getValue(int byteOrder, byte[] bytes) {
+        return BinaryConversions.convertToShortArray(bytes, byteOrder);
+    }
+
+    public byte[] encodeValue(int byteOrder, short... values) {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShort.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrLong.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrLong.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrLong.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrLong.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoShortOrLong extends TagInfo {
+    public TagInfoShortOrLong(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_DESCRIPTION_SHORT_OR_LONG, length, directoryType, false);
+    }
+    
+    public TagInfoShortOrLong(String name, int tag, int length, TiffDirectoryType directoryType, boolean isOffset) {
+        super(name, tag, FIELD_TYPE_DESCRIPTION_SHORT_OR_LONG, length, directoryType, isOffset);
+    }
+    
+    public byte[] encodeValue(int byteOrder, short... values) {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+    
+    public byte[] encodeValue(int byteOrder, int... values) {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrLong.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrLongOrRational.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrLongOrRational.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrLongOrRational.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrLongOrRational.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.common.RationalNumber;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoShortOrLongOrRational extends TagInfo {
+    public TagInfoShortOrLongOrRational(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_DESCRIPTION_SHORT_OR_LONG, length, directoryType);
+    }
+    
+    public byte[] encodeValue(int byteOrder, short... values) {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+    
+    public byte[] encodeValue(int byteOrder, int... values) {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+    
+    public byte[] encodeValue(int byteOrder, RationalNumber... values) {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrLongOrRational.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrRational.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrRational.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrRational.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrRational.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import org.apache.commons.sanselan.common.BinaryConversions;
+import org.apache.commons.sanselan.common.RationalNumber;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoShortOrRational extends TagInfo {
+    public TagInfoShortOrRational(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, FIELD_TYPE_DESCRIPTION_SHORT_OR_RATIONAL, length, directoryType, false);
+    }
+    
+    public byte[] encodeValue(int byteOrder, short... values) {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+
+    public byte[] encodeValue(int byteOrder, RationalNumber... values) {
+        return BinaryConversions.convertToByteArray(values, byteOrder);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoShortOrRational.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoText.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoText.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoText.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoText.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,200 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import java.io.UnsupportedEncodingException;
+
+import org.apache.commons.sanselan.ImageReadException;
+import org.apache.commons.sanselan.ImageWriteException;
+import org.apache.commons.sanselan.common.BinaryFileFunctions;
+import org.apache.commons.sanselan.formats.tiff.TiffField;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+import org.apache.commons.sanselan.formats.tiff.fieldtypes.FieldType;
+import org.apache.commons.sanselan.util.Debug;
+
+public final class TagInfoText extends TagInfo
+{
+    public TagInfoText(String name, int tag, FieldType dataType, int length,
+            TiffDirectoryType exifDirectory)
+    {
+        super(name, tag, dataType, length, exifDirectory);
+    }
+
+    public boolean isText()
+    {
+        return true;
+    }
+
+    private static final class TextEncoding
+    {
+        public final byte prefix[];
+        public final String encodingName;
+
+        public TextEncoding(final byte[] prefix, final String encodingName)
+        {
+            this.prefix = prefix;
+            this.encodingName = encodingName;
+        }
+    }
+
+    private static final TagInfoText.TextEncoding TEXT_ENCODING_ASCII = new TextEncoding(
+            new byte[]{
+                    0x41, 0x53, 0x43, 0x49, 0x49, 0x00, 0x00, 0x00,
+            }, "US-ASCII"); // ITU-T T.50 IA5
+    private static final TagInfoText.TextEncoding TEXT_ENCODING_JIS = new TextEncoding(
+            new byte[]{
+                    0x4A, 0x49, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00,
+            }, "JIS"); // JIS X208-1990
+    private static final TagInfoText.TextEncoding TEXT_ENCODING_UNICODE = new TextEncoding(
+            new byte[]{
+                    0x55, 0x4E, 0x49, 0x43, 0x4F, 0x44, 0x45, 0x00,
+            // Which Unicode encoding to use, UTF-8?
+            }, "UTF-8"); // Unicode Standard
+    private static final TagInfoText.TextEncoding TEXT_ENCODING_UNDEFINED = new TextEncoding(
+            new byte[]{
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+            // Try to interpret an undefined text as ISO-8859-1 (Latin)
+            }, "ISO-8859-1"); // Undefined
+    private static final TagInfoText.TextEncoding TEXT_ENCODINGS[] = {
+            TEXT_ENCODING_ASCII, //
+            TEXT_ENCODING_JIS, //
+            TEXT_ENCODING_UNICODE, //
+            TEXT_ENCODING_UNDEFINED, //
+    };
+
+    public byte[] encodeValue(FieldType fieldType, Object value,
+            int byteOrder) throws ImageWriteException
+    {
+        if (!(value instanceof String))
+            throw new ImageWriteException("Text value not String: " + value
+                    + " (" + Debug.getType(value) + ")");
+        String s = (String) value;
+
+        try
+        {
+            // try ASCII, with NO prefix.
+            byte asciiBytes[] = s
+                    .getBytes(TEXT_ENCODING_ASCII.encodingName);
+            String decodedAscii = new String(asciiBytes,
+                    TEXT_ENCODING_ASCII.encodingName);
+            if (decodedAscii.equals(s))
+            {
+                // no unicode/non-ascii values.
+                byte result[] = new byte[asciiBytes.length
+                        + TEXT_ENCODING_ASCII.prefix.length];
+                System.arraycopy(TEXT_ENCODING_ASCII.prefix, 0, result, 0,
+                        TEXT_ENCODING_ASCII.prefix.length);
+                System.arraycopy(asciiBytes, 0, result,
+                        TEXT_ENCODING_ASCII.prefix.length,
+                        asciiBytes.length);
+                return result;
+            }
+            else
+            {
+                // use unicode
+                byte unicodeBytes[] = s
+                        .getBytes(TEXT_ENCODING_UNICODE.encodingName);
+                byte result[] = new byte[unicodeBytes.length
+                        + TEXT_ENCODING_UNICODE.prefix.length];
+                System.arraycopy(TEXT_ENCODING_UNICODE.prefix, 0, result,
+                        0, TEXT_ENCODING_UNICODE.prefix.length);
+                System.arraycopy(unicodeBytes, 0, result,
+                        TEXT_ENCODING_UNICODE.prefix.length,
+                        unicodeBytes.length);
+                return result;
+            }
+        }
+        catch (UnsupportedEncodingException e)
+        {
+            throw new ImageWriteException(e.getMessage(), e);
+        }
+    }
+
+    public Object getValue(TiffField entry) throws ImageReadException
+    {
+        //            Debug.debug("entry.type", entry.type);
+        //            Debug.debug("entry.type", entry.getDescriptionWithoutValue());
+        //            Debug.debug("entry.type", entry.fieldType);
+
+        if (entry.type == FIELD_TYPE_ASCII.type)
+            return FIELD_TYPE_ASCII.getSimpleValue(entry);
+        else if (entry.type == FIELD_TYPE_UNDEFINED.type)
+        { /* do nothing */ }
+        else if (entry.type == FIELD_TYPE_BYTE.type)
+        { /* do nothing */ }
+        else
+        {
+            Debug.debug("entry.type", entry.type);
+            Debug.debug("entry.directoryType", entry.directoryType);
+            Debug.debug("entry.type", entry.getDescriptionWithoutValue());
+            Debug.debug("entry.type", entry.fieldType);
+            throw new ImageReadException("Text field not encoded as bytes.");
+        }
+
+        byte bytes[] = entry.fieldType.getRawBytes(entry);
+        if (bytes.length < 8)
+        {
+            try
+            {
+                // try ASCII, with NO prefix.
+                return new String(bytes, "US-ASCII");
+            }
+            catch (UnsupportedEncodingException e)
+            {
+                throw new ImageReadException(
+                        "Text field missing encoding prefix.");
+            }
+        }
+
+        for (int i = 0; i < TEXT_ENCODINGS.length; i++)
+        {
+            TagInfoText.TextEncoding encoding = TEXT_ENCODINGS[i];
+            if (BinaryFileFunctions.compareBytes(bytes, 0, encoding.prefix,
+                    0, encoding.prefix.length))
+            {
+                try
+                {
+                    //                        Debug.debug("encodingName", encoding.encodingName);
+                    return new String(bytes, encoding.prefix.length,
+                            bytes.length - encoding.prefix.length,
+                            encoding.encodingName);
+                }
+                catch (UnsupportedEncodingException e)
+                {
+                    throw new ImageReadException(e.getMessage(), e);
+                }
+            }
+        }
+
+        //                        Debug.debug("entry.tag", entry.tag + " (0x" + Integer.toHexString(entry.tag ) +")");
+        //                        Debug.debug("entry.type", entry.type);
+        //                        Debug.debug("bytes", bytes, 10);
+        //            throw new ImageReadException(
+        //                    "Unknown Text encoding prefix.");
+
+        try
+        {
+            // try ASCII, with NO prefix.
+            return new String(bytes, "US-ASCII");
+        }
+        catch (UnsupportedEncodingException e)
+        {
+            throw new ImageReadException("Unknown text encoding prefix.");
+        }
+
+    }
+}
\ No newline at end of file

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoText.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoUndefined.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoUndefined.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoUndefined.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoUndefined.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import java.util.Arrays;
+
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public class TagInfoUndefined extends TagInfoByte {
+    public TagInfoUndefined(String name, int tag, int length, TiffDirectoryType directoryType) {
+        super(name, tag, Arrays.asList(FIELD_TYPE_UNDEFINED), length, directoryType);
+    }
+}

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoUndefined.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoUnknown.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoUnknown.java?rev=1245871&view=auto
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoUnknown.java (added)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoUnknown.java Sat Feb 18 06:43:33 2012
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.sanselan.formats.tiff.taginfos;
+
+import java.util.Arrays;
+
+import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+
+public final class TagInfoUnknown extends TagInfoByte {
+    public TagInfoUnknown(String name, int tag, int length, TiffDirectoryType exifDirectory) {
+        super(name, tag, Arrays.asList(FIELD_TYPE_UNKNOWN), length, exifDirectory);
+    }
+
+    public boolean isUnknown() {
+        return true;
+    }
+}
\ No newline at end of file

Propchange: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/taginfos/TagInfoUnknown.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterBase.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterBase.java?rev=1245871&r1=1245870&r2=1245871&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterBase.java (original)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterBase.java Sat Feb 18 06:43:33 2012
@@ -30,6 +30,7 @@ import org.apache.commons.sanselan.Image
 import org.apache.commons.sanselan.common.BinaryConstants;
 import org.apache.commons.sanselan.common.BinaryOutputStream;
 import org.apache.commons.sanselan.common.PackBits;
+import org.apache.commons.sanselan.common.RationalNumberUtilities;
 import org.apache.commons.sanselan.common.itu_t4.T4AndT6Compression;
 import org.apache.commons.sanselan.common.mylzw.MyLzwCompressor;
 import org.apache.commons.sanselan.formats.tiff.TiffElement;
@@ -140,19 +141,19 @@ public abstract class TiffImageWriterBas
                             + ") appears twice in directory.");
                 fieldTags.add(fieldKey);
 
-                if (field.tag == ExifTagConstants.EXIF_OFFSET.tagInfo.tag)
+                if (field.tag == ExifTagConstants.EXIF_TAG_EXIF_OFFSET.tag)
                 {
                     if (exifDirectoryOffsetField != null)
                         throw new ImageWriteException(
                                 "More than one Exif directory offset field.");
                     exifDirectoryOffsetField = field;
-                } else if (field.tag == ExifTagConstants.INTEROP_OFFSET.tagInfo.tag)
+                } else if (field.tag == ExifTagConstants.EXIF_TAG_INTEROP_OFFSET.tag)
                 {
                     if (interoperabilityDirectoryOffsetField != null)
                         throw new ImageWriteException(
                                 "More than one Interoperability directory offset field.");
                     interoperabilityDirectoryOffsetField = field;
-                } else if (field.tag == ExifTagConstants.GPSINFO.tagInfo.tag)
+                } else if (field.tag == ExifTagConstants.EXIF_TAG_GPSINFO.tag)
                 {
                     if (gpsDirectoryOffsetField != null)
                         throw new ImageWriteException(
@@ -208,7 +209,7 @@ public abstract class TiffImageWriterBas
             if (interoperabilityDirectoryOffsetField == null)
             {
                 interoperabilityDirectoryOffsetField = TiffOutputField
-                        .createOffsetField(ExifTagConstants.INTEROP_OFFSET.tagInfo, byteOrder);
+                        .createOffsetField(ExifTagConstants.EXIF_TAG_INTEROP_OFFSET, byteOrder);
                 exifDirectory.add(interoperabilityDirectoryOffsetField);
             }
 
@@ -227,7 +228,7 @@ public abstract class TiffImageWriterBas
             if (exifDirectoryOffsetField == null)
             {
                 exifDirectoryOffsetField = TiffOutputField.createOffsetField(
-                        ExifTagConstants.EXIF_OFFSET.tagInfo, byteOrder);
+                        ExifTagConstants.EXIF_TAG_EXIF_OFFSET, byteOrder);
                 rootDirectory.add(exifDirectoryOffsetField);
             }
 
@@ -244,7 +245,7 @@ public abstract class TiffImageWriterBas
             if (gpsDirectoryOffsetField == null)
             {
                 gpsDirectoryOffsetField = TiffOutputField.createOffsetField(
-                        ExifTagConstants.GPSINFO.tagInfo, byteOrder);
+                        ExifTagConstants.EXIF_TAG_GPSINFO, byteOrder);
                 rootDirectory.add(gpsDirectoryOffsetField);
             }
 
@@ -410,57 +411,20 @@ public abstract class TiffImageWriterBas
         // WriteField stripOffsetsField;
 
         {
-            {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.IMAGE_WIDTH.tagInfo, FIELD_TYPE_LONG, 1,
-                        FIELD_TYPE_LONG.writeData(new int[] { width, },
-                                byteOrder));
-                directory.add(field);
-            }
-            {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.IMAGE_LENGTH.tagInfo, FIELD_TYPE_LONG, 1,
-                        FIELD_TYPE_LONG.writeData(new int[] { height, },
-                                byteOrder));
-                directory.add(field);
-            }
-            {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.PHOTOMETRIC_INTERPRETATION.tagInfo, FIELD_TYPE_SHORT,
-                        1, FIELD_TYPE_SHORT.writeData(
-                                new int[] { photometricInterpretation, },
-                                byteOrder));
-                directory.add(field);
-            }
-            {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.COMPRESSION.tagInfo, FIELD_TYPE_SHORT, 1,
-                        FIELD_TYPE_SHORT.writeData(new int[] { compression, },
-                                byteOrder));
-                directory.add(field);
-            }
-            {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.SAMPLES_PER_PIXEL.tagInfo, FIELD_TYPE_SHORT, 1,
-                        FIELD_TYPE_SHORT.writeData(
-                                new int[] { samplesPerPixel, }, byteOrder));
-                directory.add(field);
-            }
+
+            directory.add(TiffTagConstants.TIFF_TAG_IMAGE_WIDTH, width);
+            directory.add(TiffTagConstants.TIFF_TAG_IMAGE_LENGTH, height);
+            directory.add(TiffTagConstants.TIFF_TAG_PHOTOMETRIC_INTERPRETATION, (short)photometricInterpretation);
+            directory.add(TiffTagConstants.TIFF_TAG_COMPRESSION, (short)compression);
+            directory.add(TiffTagConstants.TIFF_TAG_SAMPLES_PER_PIXEL, (short)samplesPerPixel);
             
             if (samplesPerPixel == 3)
             {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.BITS_PER_SAMPLE.tagInfo, FIELD_TYPE_SHORT, 3,
-                        FIELD_TYPE_SHORT.writeData(new int[] { bitsPerSample,
-                                bitsPerSample, bitsPerSample, }, byteOrder));
-                directory.add(field);
+                directory.add(TiffTagConstants.TIFF_TAG_BITS_PER_SAMPLE, (short)bitsPerSample,
+                        (short)bitsPerSample, (short)bitsPerSample);
             } else if (samplesPerPixel == 1)
             {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.BITS_PER_SAMPLE.tagInfo, FIELD_TYPE_SHORT, 1,
-                        FIELD_TYPE_SHORT.writeData(
-                                new int[] { bitsPerSample, }, byteOrder));
-                directory.add(field);
+                directory.add(TiffTagConstants.TIFF_TAG_BITS_PER_SAMPLE, (short)bitsPerSample);
             }
             // {
             // stripOffsetsField = new WriteField(TIFF_TAG_STRIP_OFFSETS,
@@ -475,62 +439,24 @@ public abstract class TiffImageWriterBas
             // WRITE_BYTE_ORDER));
             // directory.add(field);
             // }
-            {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.ROWS_PER_STRIP.tagInfo, FIELD_TYPE_LONG, 1,
-                        FIELD_TYPE_LONG.writeData(new int[] { rowsPerStrip, },
-                                byteOrder));
-                directory.add(field);
-            }
-
-            {
-                int resolutionUnit = 2;// inches.
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.RESOLUTION_UNIT.tagInfo, FIELD_TYPE_SHORT, 1,
-                        FIELD_TYPE_SHORT.writeData(
-                                new int[] { resolutionUnit, }, byteOrder));
-                directory.add(field);
-            }
-
-            {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.XRESOLUTION.tagInfo, FIELD_TYPE_RATIONAL, 1,
-                        FIELD_TYPE_RATIONAL
-                                .writeData(xResolution.intValue(), 1, byteOrder));
-                directory.add(field);
-            }
-
-            {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.YRESOLUTION.tagInfo, FIELD_TYPE_RATIONAL, 1,
-                        FIELD_TYPE_RATIONAL
-                                .writeData(yResolution.intValue(), 1, byteOrder));
-                directory.add(field);
-            }
-            
+            directory.add(TiffTagConstants.TIFF_TAG_ROWS_PER_STRIP, rowsPerStrip);
+            directory.add(TiffTagConstants.TIFF_TAG_RESOLUTION_UNIT, (short)2); // inches
+            directory.add(TiffTagConstants.TIFF_TAG_XRESOLUTION,
+                    RationalNumberUtilities.getRationalNumber(xResolution.doubleValue()));
+            directory.add(TiffTagConstants.TIFF_TAG_YRESOLUTION,
+                    RationalNumberUtilities.getRationalNumber(yResolution.doubleValue()));
             if (t4Options != 0) {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.T4_OPTIONS.tagInfo, FIELD_TYPE_LONG, 1,
-                        FIELD_TYPE_LONG
-                                .writeData(Integer.valueOf(t4Options), byteOrder));
-                directory.add(field);
+                directory.add(TiffTagConstants.TIFF_TAG_T4_OPTIONS, t4Options);
             }
             if (t6Options != 0) {
-                TiffOutputField field = new TiffOutputField(
-                        TiffTagConstants.T6_OPTIONS.tagInfo, FIELD_TYPE_LONG, 1,
-                        FIELD_TYPE_LONG
-                                .writeData(Integer.valueOf(t6Options), byteOrder));
-                directory.add(field);
+                directory.add(TiffTagConstants.TIFF_TAG_T6_OPTIONS, t6Options);
             }
 
 
             if (null != xmpXml)
             {
                 byte xmpXmlBytes[] = xmpXml.getBytes("utf-8");
-
-                TiffOutputField field = new TiffOutputField(TiffTagConstants.XMP.tagInfo,
-                        FIELD_TYPE_BYTE, xmpXmlBytes.length, xmpXmlBytes);
-                directory.add(field);
+                directory.add(TiffTagConstants.TIFF_TAG_XMP, xmpXmlBytes);
             }
 
         }

Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterLossless.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterLossless.java?rev=1245871&r1=1245870&r2=1245871&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterLossless.java (original)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffImageWriterLossless.java Sat Feb 18 06:43:33 2012
@@ -143,7 +143,7 @@ public class TiffImageWriterLossless ext
                 for (int f = 0; f < fields.size(); f++)
                 {
                     TiffField field = fields.get(f);
-                    if (field.tag == ExifTagConstants.MAKER_NOTE.tagInfo.tag) {
+                    if (field.tag == ExifTagConstants.EXIF_TAG_MAKER_NOTE.tag) {
                         // Some maker notes reference values stored
                         // inside the maker note itself
                         // using addresses relative to the beginning

Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputDirectory.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputDirectory.java?rev=1245871&r1=1245870&r2=1245871&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputDirectory.java (original)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputDirectory.java Sat Feb 18 06:43:33 2012
@@ -24,23 +24,41 @@ import java.util.List;
 
 import org.apache.commons.sanselan.ImageWriteException;
 import org.apache.commons.sanselan.common.BinaryOutputStream;
+import org.apache.commons.sanselan.common.RationalNumber;
 import org.apache.commons.sanselan.formats.tiff.JpegImageData;
 import org.apache.commons.sanselan.formats.tiff.TiffDirectory;
 import org.apache.commons.sanselan.formats.tiff.TiffElement;
 import org.apache.commons.sanselan.formats.tiff.TiffImageData;
 import org.apache.commons.sanselan.formats.tiff.constants.TagConstantsUtils;
-import org.apache.commons.sanselan.formats.tiff.constants.TagInfo;
 import org.apache.commons.sanselan.formats.tiff.constants.TiffConstants;
 import org.apache.commons.sanselan.formats.tiff.constants.TiffDirectoryType;
+import org.apache.commons.sanselan.formats.tiff.constants.TiffFieldTypeConstants;
 import org.apache.commons.sanselan.formats.tiff.constants.TiffTagConstants;
 import org.apache.commons.sanselan.formats.tiff.fieldtypes.FieldType;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfo;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoAscii;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoByte;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoByteOrShort;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoDouble;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoFloat;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoLong;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoRational;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoSByte;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoSLong;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoSRational;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoSShort;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoShort;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoShortOrLong;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoShortOrLongOrRational;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoShortOrRational;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfoText;
 
 public final class TiffOutputDirectory extends TiffOutputItem implements
         TiffConstants
 {
     public final int type;
     private final List<TiffOutputField> fields = new ArrayList<TiffOutputField>();
-
+    private final int byteOrder;
     private TiffOutputDirectory nextDirectory = null;
 
     public void setNextDirectory(TiffOutputDirectory nextDirectory)
@@ -48,11 +66,239 @@ public final class TiffOutputDirectory e
         this.nextDirectory = nextDirectory;
     }
 
-    public TiffOutputDirectory(final int type)
+    public TiffOutputDirectory(final int type, final int byteOrder)
     {
         this.type = type;
+        this.byteOrder = byteOrder;
+    }
+    
+    public void add(TagInfoByte tagInfo, byte... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_BYTE, values.length, bytes);
+        add(tiffOutputField);
+    }
+    
+    public void add(TagInfoAscii tagInfo, String... values) throws ImageWriteException {
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        if (tagInfo.length > 0 && tagInfo.length != bytes.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " byte(s), not " + values.length);
+        }
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_ASCII, bytes.length, bytes);
+        add(tiffOutputField);
+    }
+    
+    public void add(TagInfoShort tagInfo, short... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_SHORT, values.length, bytes);
+        add(tiffOutputField);
+    }
+    
+    public void add(TagInfoLong tagInfo, int... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_LONG, values.length, bytes);
+        add(tiffOutputField);
+    }
+    
+    public void add(TagInfoRational tagInfo, RationalNumber... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_RATIONAL, values.length, bytes);
+        add(tiffOutputField);
+    }
+    
+    public void add(TagInfoSByte tagInfo, byte... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_SBYTE, values.length, bytes);
+        add(tiffOutputField);
+    }
+    
+    public void add(TagInfoSShort tagInfo, short... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_SSHORT, values.length, bytes);
+        add(tiffOutputField);
+    }
+    
+    public void add(TagInfoSLong tagInfo, int... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_SLONG, values.length, bytes);
+        add(tiffOutputField);
     }
 
+    public void add(TagInfoSRational tagInfo, RationalNumber... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_SRATIONAL, values.length, bytes);
+        add(tiffOutputField);
+    }
+    
+    public void add(TagInfoFloat tagInfo, float... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_FLOAT, values.length, bytes);
+        add(tiffOutputField);
+    }
+
+    public void add(TagInfoDouble tagInfo, double... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_DOUBLE, values.length, bytes);
+        add(tiffOutputField);
+    }
+
+    public void add(TagInfoByteOrShort tagInfo, byte... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_SHORT, values.length, bytes);
+        add(tiffOutputField);
+    }
+
+    public void add(TagInfoByteOrShort tagInfo, short... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_SHORT, values.length, bytes);
+        add(tiffOutputField);
+    }
+
+    public void add(TagInfoShortOrLong tagInfo, short... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_LONG, values.length, bytes);
+        add(tiffOutputField);
+    }
+
+    public void add(TagInfoShortOrLong tagInfo, int... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_LONG, values.length, bytes);
+        add(tiffOutputField);
+    }
+
+    public void add(TagInfoShortOrLongOrRational tagInfo, short... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_RATIONAL, values.length, bytes);
+        add(tiffOutputField);
+    }
+    
+    public void add(TagInfoShortOrLongOrRational tagInfo, int... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_RATIONAL, values.length, bytes);
+        add(tiffOutputField);
+    }
+
+    public void add(TagInfoShortOrLongOrRational tagInfo, RationalNumber... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_RATIONAL, values.length, bytes);
+        add(tiffOutputField);
+    }
+    
+    public void add(TagInfoShortOrRational tagInfo, short... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_RATIONAL, values.length, bytes);
+        add(tiffOutputField);
+    }
+
+    public void add(TagInfoShortOrRational tagInfo, RationalNumber... values) throws ImageWriteException {
+        if (tagInfo.length > 0 && tagInfo.length != values.length) {
+            throw new ImageWriteException("Tag expects " + tagInfo.length +
+                    " value(s), not " + values.length);
+        }
+        byte[] bytes = tagInfo.encodeValue(byteOrder, values);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_RATIONAL, values.length, bytes);
+        add(tiffOutputField);
+    }
+
+    public void add(TagInfoText tagInfo, String value) throws ImageWriteException {
+        byte[] bytes = tagInfo.encodeValue(TiffFieldTypeConstants.FIELD_TYPE_UNKNOWN, value, byteOrder);
+        TiffOutputField tiffOutputField = new TiffOutputField(tagInfo.tag, tagInfo,
+                TiffFieldTypeConstants.FIELD_TYPE_UNKNOWN, bytes.length, bytes);
+        add(tiffOutputField);
+    }
+    
     public void add(TiffOutputField field)
     {
         fields.add(field);
@@ -192,14 +438,14 @@ public final class TiffOutputDirectory e
     {
         // first validate directory fields.
 
-        removeFieldIfPresent(TiffTagConstants.JPEG_INTERCHANGE_FORMAT.tagInfo);
-        removeFieldIfPresent(TiffTagConstants.JPEG_INTERCHANGE_FORMAT_LENGTH.tagInfo);
+        removeFieldIfPresent(TiffTagConstants.TIFF_TAG_JPEG_INTERCHANGE_FORMAT);
+        removeFieldIfPresent(TiffTagConstants.TIFF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH);
 
         TiffOutputField jpegOffsetField = null;
         if (null != jpegImageData)
         {
             jpegOffsetField = new TiffOutputField(
-                    TiffTagConstants.JPEG_INTERCHANGE_FORMAT.tagInfo, FIELD_TYPE_LONG, 1,
+                    TiffTagConstants.TIFF_TAG_JPEG_INTERCHANGE_FORMAT, FIELD_TYPE_LONG, 1,
                     FieldType.getStubLocalValue());
             add(jpegOffsetField);
 
@@ -208,7 +454,7 @@ public final class TiffOutputDirectory e
                     outputSummary.byteOrder);
 
             TiffOutputField jpegLengthField = new TiffOutputField(
-                    TiffTagConstants.JPEG_INTERCHANGE_FORMAT_LENGTH.tagInfo, FIELD_TYPE_LONG,
+                    TiffTagConstants.TIFF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, FIELD_TYPE_LONG,
                     1, lengthValue);
             add(jpegLengthField);
 
@@ -216,10 +462,10 @@ public final class TiffOutputDirectory e
 
         // --------------------------------------------------------------
 
-        removeFieldIfPresent(TiffTagConstants.STRIP_OFFSETS.tagInfo);
-        removeFieldIfPresent(TiffTagConstants.STRIP_BYTE_COUNTS.tagInfo);
-        removeFieldIfPresent(TiffTagConstants.TILE_OFFSETS.tagInfo);
-        removeFieldIfPresent(TiffTagConstants.TILE_BYTE_COUNTS.tagInfo);
+        removeFieldIfPresent(TiffTagConstants.TIFF_TAG_STRIP_OFFSETS);
+        removeFieldIfPresent(TiffTagConstants.TIFF_TAG_STRIP_BYTE_COUNTS);
+        removeFieldIfPresent(TiffTagConstants.TIFF_TAG_TILE_OFFSETS);
+        removeFieldIfPresent(TiffTagConstants.TIFF_TAG_TILE_BYTE_COUNTS);
 
         TiffOutputField imageDataOffsetField;
         ImageDataOffsets imageDataInfo = null;
@@ -231,12 +477,12 @@ public final class TiffOutputDirectory e
             TagInfo byteCountsTag;
             if (stripsNotTiles)
             {
-                offsetTag = TiffTagConstants.STRIP_OFFSETS.tagInfo;
-                byteCountsTag = TiffTagConstants.STRIP_BYTE_COUNTS.tagInfo;
+                offsetTag = TiffTagConstants.TIFF_TAG_STRIP_OFFSETS;
+                byteCountsTag = TiffTagConstants.TIFF_TAG_STRIP_BYTE_COUNTS;
             } else
             {
-                offsetTag = TiffTagConstants.TILE_OFFSETS.tagInfo;
-                byteCountsTag = TiffTagConstants.TILE_BYTE_COUNTS.tagInfo;
+                offsetTag = TiffTagConstants.TIFF_TAG_TILE_OFFSETS;
+                byteCountsTag = TiffTagConstants.TIFF_TAG_TILE_BYTE_COUNTS;
             }
 
             // --------

Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputField.java
URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputField.java?rev=1245871&r1=1245870&r2=1245871&view=diff
==============================================================================
--- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputField.java (original)
+++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/tiff/write/TiffOutputField.java Sat Feb 18 06:43:33 2012
@@ -20,9 +20,9 @@ import java.io.IOException;
 
 import org.apache.commons.sanselan.ImageWriteException;
 import org.apache.commons.sanselan.common.BinaryOutputStream;
-import org.apache.commons.sanselan.formats.tiff.constants.TagInfo;
 import org.apache.commons.sanselan.formats.tiff.constants.TiffConstants;
 import org.apache.commons.sanselan.formats.tiff.fieldtypes.FieldType;
+import org.apache.commons.sanselan.formats.tiff.taginfos.TagInfo;
 
 public class TiffOutputField implements TiffConstants
 {
@@ -62,56 +62,6 @@ public class TiffOutputField implements 
 
     private int sortHint = -1;
 
-    public static TiffOutputField create(TagInfo tagInfo, int byteOrder,
-            Number number) throws ImageWriteException
-    {
-        if (tagInfo.dataTypes == null || tagInfo.dataTypes.length < 1)
-            throw new ImageWriteException("Tag has no default data type.");
-        FieldType fieldType = tagInfo.dataTypes[0];
-
-        if (tagInfo.length != 1)
-            throw new ImageWriteException("Tag does not expect a single value.");
-
-        byte bytes[] = fieldType.writeData(number, byteOrder);
-
-        return new TiffOutputField(tagInfo.tag, tagInfo, fieldType, 1, bytes);
-    }
-
-    public static TiffOutputField create(TagInfo tagInfo, int byteOrder,
-            Number value[]) throws ImageWriteException
-    {
-        if (tagInfo.dataTypes == null || tagInfo.dataTypes.length < 1)
-            throw new ImageWriteException("Tag has no default data type.");
-        FieldType fieldType = tagInfo.dataTypes[0];
-
-        if (tagInfo.length >= 0 && tagInfo.length != value.length)
-            throw new ImageWriteException("Tag expects " + tagInfo.length + " values.");
-
-        byte bytes[] = fieldType.writeData(value, byteOrder);
-
-        return new TiffOutputField(tagInfo.tag, tagInfo, fieldType,
-                value.length, bytes);
-    }
-
-    public static TiffOutputField create(TagInfo tagInfo, int byteOrder,
-            String value) throws ImageWriteException
-    {
-        FieldType fieldType;
-        if (tagInfo.dataTypes == null || tagInfo.dataTypes.length < 1)
-            fieldType = FIELD_TYPE_ASCII;
-        else
-        {
-            if (tagInfo.dataTypes[0] == FIELD_TYPE_ASCII)
-                fieldType = FIELD_TYPE_ASCII;
-            else
-                throw new ImageWriteException("Tag has unexpected data type.");
-        }
-
-        byte bytes[] = fieldType.writeData(value, byteOrder);
-
-        return new TiffOutputField(tagInfo.tag, tagInfo, fieldType, bytes.length, bytes);
-    }
-
     protected static final TiffOutputField createOffsetField(TagInfo tagInfo,
             int byteOrder) throws ImageWriteException
     {