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/12/02 10:57:50 UTC

svn commit: r1416148 - in /commons/proper/imaging/trunk/src: main/java/org/apache/commons/imaging/formats/png/ main/java/org/apache/commons/imaging/formats/png/transparencyfilters/ main/java/org/apache/commons/imaging/formats/tiff/ main/java/org/apache...

Author: damjan
Date: Sun Dec  2 09:57:49 2012
New Revision: 1416148

URL: http://svn.apache.org/viewvc?rev=1416148&view=rev
Log:
When not in strict mode, allow errors when reading
subdirectory tags (and ignore the tags in that case).

Jira issue key: IMAGING-90


Added:
    commons/proper/imaging/trunk/src/test/data/images/tiff/6/
    commons/proper/imaging/trunk/src/test/data/images/tiff/6/bad-interoperability.asm
    commons/proper/imaging/trunk/src/test/data/images/tiff/6/bad-interoperability.tiff   (with props)
Modified:
    commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngConstants.java
    commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngWriter.java
    commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/transparencyfilters/TransparencyFilterIndexedColor.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/palette/MedianCutQuantizer.java
    commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/PaletteFactory.java

Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngConstants.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngConstants.java?rev=1416148&r1=1416147&r2=1416148&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngConstants.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngConstants.java Sun Dec  2 09:57:49 2012
@@ -28,6 +28,8 @@ public interface PngConstants extends Im
             new byte[] { 73, 72, 68, 82 });
     public final static BinaryConstant PLTE_CHUNK_TYPE = new BinaryConstant(
             new byte[] { 80, 76, 84, 69 });
+    public final static BinaryConstant TRNS_CHUNK_TYPE = new BinaryConstant(
+            new byte[] { 't', 'R', 'N', 'S'});
     public final static BinaryConstant IEND_CHUNK_TYPE = new BinaryConstant(
             new byte[] { 73, 69, 78, 68 });
     public final static BinaryConstant IDAT_CHUNK_TYPE = new BinaryConstant(

Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngWriter.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngWriter.java?rev=1416148&r1=1416147&r2=1416148&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngWriter.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngWriter.java Sun Dec  2 09:57:49 2012
@@ -48,22 +48,20 @@ public class PngWriter implements PngCon
     }
 
     /*
-     * 1. IHDR: image header, which is the first chunk in a PNG datastream. 2.
-     * PLTE: palette table associated with indexed PNG images. 3. IDAT: image
-     * data chunks. 4. IEND: image trailer, which is the last chunk in a PNG
-     * datastream.
-     * 
-     * The remaining 14 chunk types are termed ancillary chunk types, which
-     * encoders may generate and decoders may interpret.
-     * 
-     * 1. Transparency information: tRNS (see 11.3.2: Transparency information).
-     * 2. Colour space information: cHRM, gAMA, iCCP, sBIT, sRGB (see 11.3.3:
-     * Colour space information). 3. Textual information: iTXt, tEXt, zTXt (see
-     * 11.3.4: Textual information). 4. Miscellaneous information: bKGD, hIST,
-     * pHYs, sPLT (see 11.3.5: Miscellaneous information). 5. Time information:
-     * tIME (see 11.3.6: Time stamp information).
-     */
-
+     1. IHDR: image header, which is the first chunk in a PNG datastream.
+     2. PLTE: palette table associated with indexed PNG images.
+     3. IDAT: image data chunks.
+     4. IEND: image trailer, which is the last chunk in a PNG datastream.
+
+     The remaining 14 chunk types are termed ancillary chunk types, which encoders may generate and decoders may interpret.
+
+     1. Transparency information: tRNS (see 11.3.2: Transparency information).
+     2. Colour space information: cHRM, gAMA, iCCP, sBIT, sRGB (see 11.3.3: Colour space information).
+     3. Textual information: iTXt, tEXt, zTXt (see 11.3.4: Textual information).
+     4. Miscellaneous information: bKGD, hIST, pHYs, sPLT (see 11.3.5: Miscellaneous information).
+     5. Time information: tIME (see 11.3.6: Time stamp information).
+    */
+    
     private final void writeInt(OutputStream os, int value) throws IOException {
         os.write(0xff & (value >> 24));
         os.write(0xff & (value >> 16));
@@ -80,26 +78,14 @@ public class PngWriter implements PngCon
             os.write(data);
         }
 
-        // Debug.debug("writeChunk chunkType", chunkType);
-        // Debug.debug("writeChunk data", data);
-
-        {
-            PngCrc png_crc = new PngCrc();
+        PngCrc png_crc = new PngCrc();
 
-            long crc1 = png_crc.start_partial_crc(chunkType, chunkType.length);
-            long crc2 = data == null ? crc1 : png_crc.continue_partial_crc(
-                    crc1, data, data.length);
-            int crc = (int) png_crc.finish_partial_crc(crc2);
-
-            // Debug.debug("crc1", crc1 + " (" + Long.toHexString(crc1)
-            // + ")");
-            // Debug.debug("crc2", crc2 + " (" + Long.toHexString(crc2)
-            // + ")");
-            // Debug.debug("crc3", crc + " (" + Integer.toHexString(crc)
-            // + ")");
+        long crc1 = png_crc.start_partial_crc(chunkType, chunkType.length);
+        long crc2 = data == null ? crc1 : png_crc.continue_partial_crc(
+                crc1, data, data.length);
+        int crc = (int) png_crc.finish_partial_crc(crc2);
 
-            writeInt(os, crc);
-        }
+        writeInt(os, crc);
     }
 
     private static class ImageHeader {
@@ -264,6 +250,16 @@ public class PngWriter implements PngCon
 
         writeChunk(os, PLTE_CHUNK_TYPE.toByteArray(), bytes);
     }
+    
+    private void writeChunkTRNS(OutputStream os, Palette palette) throws IOException {
+        byte[] bytes = new byte[palette.length()];
+        
+        for (int i = 0; i < bytes.length; i++) {
+            bytes[i] = (byte) (0xff & (palette.getEntry(i) >> 24));
+        }
+        
+        writeChunk(os, TRNS_CHUNK_TYPE.toByteArray(), bytes);
+    }
 
     private void writeChunkIEND(OutputStream os) throws IOException {
         writeChunk(os, IEND_CHUNK_TYPE.toByteArray(), null);
@@ -348,21 +344,33 @@ public class PngWriter implements PngCon
     }
 
     /*
-     * between two chunk types indicates alternatives. Table 5.3 — Chunk
-     * ordering rules Critical chunks (shall appear in this order, except PLTE
-     * is optional) Chunk name Multiple allowed Ordering constraints IHDR No
-     * Shall be first PLTE No Before first IDAT IDAT Yes Multiple IDAT chunks
-     * shall be consecutive IEND No Shall be last Ancillary chunks (need not
-     * appear in this order) Chunk name Multiple allowed Ordering constraints
-     * cHRM No Before PLTE and IDAT gAMA No Before PLTE and IDAT iCCP No Before
-     * PLTE and IDAT. If the iCCP chunk is present, the sRGB chunk should not be
-     * present. sBIT No Before PLTE and IDAT sRGB No Before PLTE and IDAT. If
-     * the sRGB chunk is present, the iCCP chunk should not be present. bKGD No
-     * After PLTE; before IDAT hIST No After PLTE; before IDAT tRNS No After
-     * PLTE; before IDAT pHYs No Before IDAT sPLT Yes Before IDAT tIME No None
-     * iTXt Yes None tEXt Yes None zTXt Yes None
-     */
-
+     between two chunk types indicates alternatives.
+     Table 5.3 — Chunk ordering rules Critical chunks
+     (shall appear in this order, except PLTE is optional)
+     Chunk name     Multiple allowed    Ordering constraints
+     IHDR   No  Shall be first
+     PLTE   No  Before first IDAT
+     IDAT   Yes     Multiple IDAT chunks shall be consecutive
+     IEND   No  Shall be last
+     Ancillary chunks
+     (need not appear in this order)
+     Chunk name     Multiple allowed    Ordering constraints
+     cHRM   No  Before PLTE and IDAT
+     gAMA   No  Before PLTE and IDAT
+     iCCP   No  Before PLTE and IDAT. If the iCCP chunk is present, the sRGB chunk should not be present.
+     sBIT   No  Before PLTE and IDAT
+     sRGB   No  Before PLTE and IDAT. If the sRGB chunk is present, the iCCP chunk should not be present.
+     bKGD   No  After PLTE; before IDAT
+     hIST   No  After PLTE; before IDAT
+     tRNS   No  After PLTE; before IDAT
+     pHYs   No  Before IDAT
+     sPLT   Yes     Before IDAT
+     tIME   No  None
+     iTXt   Yes     None
+     tEXt   Yes     None
+     zTXt   Yes     None
+    */
+    
     public void writeImage(BufferedImage src, OutputStream os, Map<String,Object> params)
             throws ImageWriteException, IOException {
         // make copy of params; we'll clear keys as we consume them.
@@ -480,29 +488,25 @@ public class PngWriter implements PngCon
         if (colorType == COLOR_TYPE_INDEXED_COLOR) {
             // PLTE No Before first IDAT
 
-            int max_colors = hasAlpha ? 255 : 256;
-
-            palette = new MedianCutQuantizer(true).process(src, max_colors,
+            palette = new MedianCutQuantizer(!hasAlpha).process(src, 256,
                     verbose);
-            // Palette palette2 = new PaletteFactory().makePaletteSimple(src,
-            // max_colors);
-
-            // palette.dump();
-
             writeChunkPLTE(os, palette);
+            if (hasAlpha) {
+                writeChunkTRNS(os, palette);
+            }
         }
 
         Object pixelDensityObj = params.get(PARAM_KEY_PIXEL_DENSITY);
         if (pixelDensityObj instanceof PixelDensity) {
             PixelDensity pixelDensity = (PixelDensity) pixelDensityObj;
             if (pixelDensity.isUnitless()) {
-                writeChunkPHYS(os, (int) Math.round(pixelDensity
-                        .getRawHorizontalDensity()),
+                writeChunkPHYS(os,
+                        (int) Math.round(pixelDensity.getRawHorizontalDensity()),
                         (int) Math.round(pixelDensity.getRawVerticalDensity()),
                         (byte) 0);
             } else {
-                writeChunkPHYS(os, (int) Math.round(pixelDensity
-                        .horizontalDensityMetres()),
+                writeChunkPHYS(os,
+                        (int) Math.round(pixelDensity.horizontalDensityMetres()),
                         (int) Math.round(pixelDensity.verticalDensityMetres()),
                         (byte) 1);
             }
@@ -628,16 +632,24 @@ public class PngWriter implements PngCon
         }
 
         /*
-         * Ancillary chunks (need not appear in this order) Chunk name Multiple
-         * allowed Ordering constraints cHRM No Before PLTE and IDAT gAMA No
-         * Before PLTE and IDAT iCCP No Before PLTE and IDAT. If the iCCP chunk
-         * is present, the sRGB chunk should not be present. sBIT No Before PLTE
-         * and IDAT sRGB No Before PLTE and IDAT. If the sRGB chunk is present,
-         * the iCCP chunk should not be present. bKGD No After PLTE; before IDAT
-         * hIST No After PLTE; before IDAT tRNS No After PLTE; before IDAT pHYs
-         * No Before IDAT sPLT Yes Before IDAT tIME No None iTXt Yes None tEXt
-         * Yes None zTXt Yes None
-         */
+         Ancillary chunks
+         (need not appear in this order)
+         Chunk name     Multiple allowed    Ordering constraints
+         cHRM           No                  Before PLTE and IDAT
+         gAMA           No                  Before PLTE and IDAT
+         iCCP           No                  Before PLTE and IDAT. If the iCCP chunk is present, the sRGB chunk should not be present.
+         sBIT           No                  Before PLTE and IDAT
+         sRGB           No                  Before PLTE and IDAT. If the sRGB chunk is present, the iCCP chunk should not be present.
+         bKGD           No                  After PLTE; before IDAT
+         hIST           No                  After PLTE; before IDAT
+         tRNS           No                  After PLTE; before IDAT
+         pHYs           No                  Before IDAT
+         sPLT           Yes                 Before IDAT
+         tIME           No                  None
+         iTXt           Yes                 None
+         tEXt           Yes                 None
+         zTXt           Yes                 None
+        */
 
         os.close();
     } // todo: filter types

Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/transparencyfilters/TransparencyFilterIndexedColor.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/transparencyfilters/TransparencyFilterIndexedColor.java?rev=1416148&r1=1416147&r2=1416148&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/transparencyfilters/TransparencyFilterIndexedColor.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/transparencyfilters/TransparencyFilterIndexedColor.java Sun Dec  2 09:57:49 2012
@@ -26,27 +26,19 @@ public class TransparencyFilterIndexedCo
         super(bytes);
     }
 
-    int count = 0;
-
     @Override
     public int filter(int rgb, int index) throws ImageReadException,
             IOException {
         if (index >= bytes.length) {
             return rgb;
-        }
-
-        if ((index < 0) || (index > bytes.length)) {
+        } else if (index < 0) {
             throw new ImageReadException(
-                    "TransparencyFilterIndexedColor index: " + index
-                            + ", bytes.length: " + bytes.length);
+                    "Invalid TransparencyFilterIndexedColor index: " + index);
         }
 
         int alpha = bytes[index];
         int result = ((0xff & alpha) << 24) | (0x00ffffff & rgb);
 
-        if ((count < 100) && (index > 0)) {
-            count++;
-        }
         return result;
     }
 }

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=1416148&r1=1416147&r2=1416148&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 Sun Dec  2 09:57:49 2012
@@ -32,6 +32,7 @@ import org.apache.commons.imaging.format
 import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants;
 import org.apache.commons.imaging.formats.tiff.constants.TiffConstants;
 import org.apache.commons.imaging.formats.tiff.constants.TiffTagConstants;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfoLong;
 import org.apache.commons.imaging.util.Debug;
 
 public class TiffReader extends BinaryFileParser implements TiffConstants {
@@ -245,48 +246,39 @@ public class TiffReader extends BinaryFi
             }
 
             if (listener.readOffsetDirectories()) {
-                List<TiffField> fieldsToRemove = new ArrayList<TiffField>();
-                for (int j = 0; j < fields.size(); j++) {
-                    TiffField entry = fields.get(j);
-
-                    if (entry.tag == ExifTagConstants.EXIF_TAG_EXIF_OFFSET.tag
-                            || entry.tag == ExifTagConstants.EXIF_TAG_GPSINFO.tag
-                            || entry.tag == ExifTagConstants.EXIF_TAG_INTEROP_OFFSET.tag) { /*
-                                                                                             * do
-                                                                                             * nothing
-                                                                                             */
-                    } else {
-                        continue;
-                    }
-
-                    int subDirectoryOffset = ((Number) entry.getValue())
-                            .intValue();
-                    int subDirectoryType;
-                    if (entry.tag == ExifTagConstants.EXIF_TAG_EXIF_OFFSET.tag) {
-                        subDirectoryType = TiffDirectory.DIRECTORY_TYPE_EXIF;
-                    } else if (entry.tag == ExifTagConstants.EXIF_TAG_GPSINFO.tag) {
-                        subDirectoryType = TiffDirectory.DIRECTORY_TYPE_GPS;
-                    } else if (entry.tag == ExifTagConstants.EXIF_TAG_INTEROP_OFFSET.tag) {
-                        subDirectoryType = TiffDirectory.DIRECTORY_TYPE_INTEROPERABILITY;
-                    } else {
-                        throw new ImageReadException(
-                                "Unknown subdirectory type.");
-                    }
-
-                    // Debug.debug("sub dir", subDirectoryOffset);
-                    boolean subDirectoryRead = readDirectory(byteSource,
-                            subDirectoryOffset, subDirectoryType,
-                            formatCompliance, listener, true, visited);
-
-                    if (!subDirectoryRead) {
-                        // Offset field pointed to invalid location.
-                        // This is a bug in certain cameras. Ignore offset
-                        // field.
-                        fieldsToRemove.add(entry);
+                final TagInfoLong[] offsetFields = {
+                        EXIF_TAG_EXIF_OFFSET,
+                        EXIF_TAG_GPSINFO,
+                        EXIF_TAG_INTEROP_OFFSET
+                };
+                final int[] directoryTypes = {
+                        TiffDirectory.DIRECTORY_TYPE_EXIF,
+                        TiffDirectory.DIRECTORY_TYPE_GPS,
+                        TiffDirectory.DIRECTORY_TYPE_INTEROPERABILITY
+                };
+                for (int i = 0; i < offsetFields.length; i++) {
+                    TagInfoLong offsetField = offsetFields[i];
+                    if (directory.findField(offsetField) != null) {
+                        int subDirectoryOffset;
+                        int subDirectoryType;
+                        boolean subDirectoryRead = false;
+                        try {
+                            subDirectoryOffset = directory.getSingleFieldValue(offsetField);
+                            subDirectoryType = directoryTypes[i];
+                            subDirectoryRead = readDirectory(byteSource,
+                                    subDirectoryOffset, subDirectoryType,
+                                    formatCompliance, listener, true, visited);
+    
+                        } catch (ImageReadException imageReadException) {
+                            if (strict) {
+                                throw imageReadException;
+                            }
+                        }
+                        if (!subDirectoryRead) {
+                            fields.remove(offsetField);
+                        }
                     }
-
                 }
-                fields.removeAll(fieldsToRemove);
             }
 
             if (!ignoreNextDirectory && directory.nextDirectoryOffset > 0) {

Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/MedianCutQuantizer.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/MedianCutQuantizer.java?rev=1416148&r1=1416147&r2=1416148&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/MedianCutQuantizer.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/MedianCutQuantizer.java Sun Dec  2 09:57:49 2012
@@ -21,8 +21,10 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.imaging.ImageWriteException;
 import org.apache.commons.imaging.util.Debug;
@@ -89,6 +91,7 @@ public class MedianCutQuantizer {
 
         public final int max_diff;
         public final int diff_total;
+        public final int totalPoints;
 
         public ColorGroup(final List<ColorCount> color_counts)
                 throws ImageWriteException {
@@ -98,8 +101,10 @@ public class MedianCutQuantizer {
                 throw new ImageWriteException("empty color_group");
             }
 
+            int totalPoints = 0;
             for (int i = 0; i < color_counts.size(); i++) {
                 ColorCount color = color_counts.get(i);
+                totalPoints += color.count;
 
                 min_alpha = Math.min(min_alpha, color.alpha);
                 max_alpha = Math.max(max_alpha, color.alpha);
@@ -110,6 +115,7 @@ public class MedianCutQuantizer {
                 min_blue = Math.min(min_blue, color.blue);
                 max_blue = Math.max(max_blue, color.blue);
             }
+            this.totalPoints = totalPoints;
 
             alpha_diff = max_alpha - min_alpha;
             red_diff = max_red - min_red;
@@ -271,21 +277,37 @@ public class MedianCutQuantizer {
 
         final Comparator<ColorGroup> comparator = new Comparator<ColorGroup>() {
             public int compare(ColorGroup cg1, ColorGroup cg2) {
-                if (cg1.max_diff == cg2.max_diff) {
-                    return cg2.diff_total - cg1.diff_total;
-                }
-                return cg2.max_diff - cg1.max_diff;
+                return cg2.totalPoints - cg1.totalPoints;
+//                if (cg1.max_diff == cg2.max_diff) {
+//                    return cg2.diff_total - cg1.diff_total;
+//                }
+//                return cg2.max_diff - cg1.max_diff;
             }
         };
 
+        Set<ColorGroup> ignore = new HashSet<ColorGroup>();
         while (color_groups.size() < max_colors) {
             Collections.sort(color_groups, comparator);
 
             ColorGroup color_group = color_groups.get(0);
-
-            if (color_group.max_diff == 0) {
-                break;
-            }
+//            if (color_group.max_diff == 0) {
+//                for (ColorGroup c : color_groups) {
+//                    System.out.println("max_diff: " + c.max_diff);
+//                }
+//                break;
+//            }
+            
+//            ColorGroup color_group = null;
+//            for (ColorGroup c : color_groups) {
+//                if (c.max_diff > 0) {
+//                    color_group = c;
+//                    break;
+//                }
+//            }
+//            if (color_group == null) {
+//                break;
+//            }
+            
             if (!ignoreAlpha
                     && color_group.alpha_diff > color_group.red_diff
                     && color_group.alpha_diff > color_group.green_diff

Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/PaletteFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/PaletteFactory.java?rev=1416148&r1=1416147&r2=1416148&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/PaletteFactory.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/PaletteFactory.java Sun Dec  2 09:57:49 2012
@@ -334,7 +334,7 @@ public class PaletteFactory {
      * Builds an inexact opaque palette of at most {@code max} colors in {@code src}
      * using a variation of the Median Cut algorithm. Accurate to 6 bits per component,
      * and works by splitting the color bounding box most heavily populated by colors
-     * along the component which splits the colors most evenly.
+     * along the component which splits the colors in that box most evenly.
      * @param src the image whose palette to build
      * @param max the maximum number of colors the palette can contain
      * @return the palette of at most {@code max} colors

Added: commons/proper/imaging/trunk/src/test/data/images/tiff/6/bad-interoperability.asm
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/data/images/tiff/6/bad-interoperability.asm?rev=1416148&view=auto
==============================================================================
--- commons/proper/imaging/trunk/src/test/data/images/tiff/6/bad-interoperability.asm (added)
+++ commons/proper/imaging/trunk/src/test/data/images/tiff/6/bad-interoperability.asm Sun Dec  2 09:57:49 2012
@@ -0,0 +1,115 @@
+; 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.
+
+
+; Assemblers are the perfect tool for generating
+; custom test images as they let us insert offsets
+; to unknown locations easily and totally
+; customize the file byte-by-byte.
+;
+; To generate a TIFF from this, run:
+; nasm -f bin /path/to/this/file.asm -o /path/to/file.tiff
+
+; TIFF header
+db 0x49,0x49
+db 0x2a, 0x00
+db 0x08, 0x00, 0x00, 0x00
+
+; Number of directory entries
+dw 8
+
+; entry 0: tag, type, count, value
+dw 0x0100 ; tag = image width
+dw 3 ; type = short
+dd 1 ; length = 1
+dd 2 ; value = 2
+
+; entry 1
+dw 0x0101 ; tag = image length
+dw 3 ; type = short
+dd 1 ; length = 1
+dd 2 ; value = 2
+
+; entry 2
+dw 0x0103 ; tag = compression
+dw 3
+dd 1
+dd 1 ; no compression, but pack bits tightly
+
+; entry 3
+dw 0x0106 ; tag = PhotometricInterpretation
+dw 3
+dd 1
+dd 1 ; black is zero
+
+; entry 4
+dw 0x0111 ; tag = StripOffsets
+dw 4 ; type = long
+dd 1
+dd $imageStrip1
+
+; entry 5
+dw 0x0117 ; tag = StripByteCounts
+dw 4 ; type = long
+dd 1
+dd 2
+
+; entry 6
+dw 0x0116 ; tag = RowsPerStrip
+dw 4 ; type = long
+dd 1
+dd 2
+
+; entry 7
+dw 0x8769 ; tag = EXIF
+dw 4 ; type = long
+dd 1
+dd $exif
+
+; offset to next directory
+dd 0
+
+
+; values that couldn't fit:
+
+
+; image data
+imageStrip1:
+db 0x80, 0x40
+
+
+; EXIF
+
+exif:
+; number of directory entries:
+dw 1
+
+; entry 0
+dw 0xA005 ; tag = Interoperability
+dw  4 ; type = long
+dd 0 ; bad count of 0
+dd $interoperability
+
+; offset to next directory
+dd 0
+
+interoperability:
+; number of directory entries
+dw 0
+
+; offset to next directory
+dd 0

Added: commons/proper/imaging/trunk/src/test/data/images/tiff/6/bad-interoperability.tiff
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/data/images/tiff/6/bad-interoperability.tiff?rev=1416148&view=auto
==============================================================================
Binary file - no diff available.

Propchange: commons/proper/imaging/trunk/src/test/data/images/tiff/6/bad-interoperability.tiff
------------------------------------------------------------------------------
    svn:mime-type = image/tiff