jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java
author bpb
Tue, 03 Jan 2017 14:15:15 -0800
changeset 43087 9d78f6cdb8d5
parent 42749 91fb907a8732
child 43316 5285aed28df8
permissions -rw-r--r--
8172153: Create workaround for failure to use ICC profile contained in a TIFF field Summary: Work around errors due to using an embedded ICC profile from the metadata Reviewed-by: prr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     1
/*
43087
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
     2
 * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     4
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    10
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    15
 * accompanied this code).
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    16
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    20
 *
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    23
 * questions.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    24
 */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    25
package com.sun.imageio.plugins.tiff;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    26
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    27
import java.awt.Point;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    28
import java.awt.Rectangle;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    29
import java.awt.color.ColorSpace;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    30
import java.awt.color.ICC_ColorSpace;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    31
import java.awt.color.ICC_Profile;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    32
import java.awt.image.BufferedImage;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    33
import java.awt.image.ColorModel;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    34
import java.awt.image.ComponentColorModel;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    35
import java.awt.image.Raster;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    36
import java.awt.image.RenderedImage;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    37
import java.awt.image.SampleModel;
40438
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
    38
import java.io.EOFException;
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    39
import java.io.IOException;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    40
import java.nio.ByteOrder;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    41
import java.util.ArrayList;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    42
import java.util.HashMap;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    43
import java.util.Iterator;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    44
import java.util.List;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    45
import javax.imageio.IIOException;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    46
import javax.imageio.ImageIO;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    47
import javax.imageio.ImageReader;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    48
import javax.imageio.ImageReadParam;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    49
import javax.imageio.ImageTypeSpecifier;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    50
import javax.imageio.metadata.IIOMetadata;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    51
import javax.imageio.spi.ImageReaderSpi;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    52
import javax.imageio.stream.ImageInputStream;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    53
import org.w3c.dom.Node;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    54
import com.sun.imageio.plugins.common.ImageUtil;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    55
import javax.imageio.plugins.tiff.BaselineTIFFTagSet;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    56
import javax.imageio.plugins.tiff.TIFFField;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    57
import javax.imageio.plugins.tiff.TIFFImageReadParam;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    58
import javax.imageio.plugins.tiff.TIFFTagSet;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    59
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    60
public class TIFFImageReader extends ImageReader {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    61
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    62
    // A somewhat arbitrary upper bound on SamplesPerPixel. Hyperspectral
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    63
    // images as of this writing appear to be under 300 bands so this should
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    64
    // account for those cases should they arise.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    65
    private static final int SAMPLES_PER_PIXEL_MAX = 1024;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    66
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    67
    // In baseline TIFF the largest data types are 64-bit long and double.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    68
    private static final int BITS_PER_SAMPLE_MAX = 64;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    69
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    70
    // The current ImageInputStream source.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    71
    private ImageInputStream stream = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    72
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    73
    // True if the file header has been read.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    74
    private boolean gotHeader = false;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    75
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    76
    private ImageReadParam imageReadParam = getDefaultReadParam();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    77
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    78
    // Stream metadata, or null.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    79
    private TIFFStreamMetadata streamMetadata = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    80
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    81
    // The current image index.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    82
    private int currIndex = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    83
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    84
    // Metadata for image at 'currIndex', or null.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    85
    private TIFFImageMetadata imageMetadata = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    86
36448
a07e108d5722 8149593: Change <code>foo</code> to {@code foo} in TIFF plugin classes
bpb
parents: 34416
diff changeset
    87
    // A {@code List} of {@code Long}s indicating the stream
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    88
    // positions of the start of the IFD for each image.  Entries
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    89
    // are added as needed.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    90
    private List<Long> imageStartPosition = new ArrayList<Long>();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    91
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    92
    // The number of images in the stream, if known, otherwise -1.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    93
    private int numImages = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    94
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    95
    // The ImageTypeSpecifiers of the images in the stream.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    96
    // Contains a map of Integers to Lists.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    97
    private HashMap<Integer, List<ImageTypeSpecifier>> imageTypeMap
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    98
            = new HashMap<Integer, List<ImageTypeSpecifier>>();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
    99
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   100
    private BufferedImage theImage = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   101
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   102
    private int width = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   103
    private int height = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   104
    private int numBands = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   105
    private int tileOrStripWidth = -1, tileOrStripHeight = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   106
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   107
    private int planarConfiguration = BaselineTIFFTagSet.PLANAR_CONFIGURATION_CHUNKY;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   108
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   109
    private int compression;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   110
    private int photometricInterpretation;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   111
    private int samplesPerPixel;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   112
    private int[] sampleFormat;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   113
    private int[] bitsPerSample;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   114
    private int[] extraSamples;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   115
    private char[] colorMap;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   116
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   117
    private int sourceXOffset;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   118
    private int sourceYOffset;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   119
    private int srcXSubsampling;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   120
    private int srcYSubsampling;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   121
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   122
    private int dstWidth;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   123
    private int dstHeight;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   124
    private int dstMinX;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   125
    private int dstMinY;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   126
    private int dstXOffset;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   127
    private int dstYOffset;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   128
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   129
    private int tilesAcross;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   130
    private int tilesDown;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   131
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   132
    private int pixelsRead;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   133
    private int pixelsToRead;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   134
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   135
    public TIFFImageReader(ImageReaderSpi originatingProvider) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   136
        super(originatingProvider);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   137
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   138
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   139
    public void setInput(Object input,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   140
            boolean seekForwardOnly,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   141
            boolean ignoreMetadata) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   142
        super.setInput(input, seekForwardOnly, ignoreMetadata);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   143
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   144
        // Clear all local values based on the previous stream contents.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   145
        resetLocal();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   146
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   147
        if (input != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   148
            if (!(input instanceof ImageInputStream)) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   149
                throw new IllegalArgumentException("input not an ImageInputStream!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   150
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   151
            this.stream = (ImageInputStream) input;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   152
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   153
            this.stream = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   154
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   155
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   156
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   157
    // Do not seek to the beginning of the stream so as to allow users to
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   158
    // point us at an IFD within some other file format
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   159
    private void readHeader() throws IIOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   160
        if (gotHeader) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   161
            return;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   162
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   163
        if (stream == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   164
            throw new IllegalStateException("Input not set!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   165
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   166
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   167
        // Create an object to store the stream metadata
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   168
        this.streamMetadata = new TIFFStreamMetadata();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   169
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   170
        try {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   171
            int byteOrder = stream.readUnsignedShort();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   172
            if (byteOrder == 0x4d4d) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   173
                streamMetadata.byteOrder = ByteOrder.BIG_ENDIAN;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   174
                stream.setByteOrder(ByteOrder.BIG_ENDIAN);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   175
            } else if (byteOrder == 0x4949) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   176
                streamMetadata.byteOrder = ByteOrder.LITTLE_ENDIAN;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   177
                stream.setByteOrder(ByteOrder.LITTLE_ENDIAN);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   178
            } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   179
                processWarningOccurred(
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   180
                        "Bad byte order in header, assuming little-endian");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   181
                streamMetadata.byteOrder = ByteOrder.LITTLE_ENDIAN;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   182
                stream.setByteOrder(ByteOrder.LITTLE_ENDIAN);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   183
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   184
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   185
            int magic = stream.readUnsignedShort();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   186
            if (magic != 42) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   187
                processWarningOccurred(
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   188
                        "Bad magic number in header, continuing");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   189
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   190
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   191
            // Seek to start of first IFD
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   192
            long offset = stream.readUnsignedInt();
40438
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   193
            stream.seek(offset);
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   194
            imageStartPosition.add(Long.valueOf(offset));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   195
        } catch (IOException e) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   196
            throw new IIOException("I/O error reading header!", e);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   197
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   198
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   199
        gotHeader = true;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   200
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   201
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   202
    private int locateImage(int imageIndex) throws IIOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   203
        readHeader();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   204
40438
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   205
        // Find closest known index
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   206
        int index = Math.min(imageIndex, imageStartPosition.size() - 1);
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   207
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   208
        try {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   209
            // Seek to that position
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   210
            Long l = imageStartPosition.get(index);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   211
            stream.seek(l.longValue());
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   212
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   213
            // Skip IFDs until at desired index or last image found
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   214
            while (index < imageIndex) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   215
                int count = stream.readUnsignedShort();
40438
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   216
                // If zero-entry IFD, decrement the index and exit the loop
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   217
                if (count == 0) {
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   218
                    imageIndex = index > 0 ? index - 1 : 0;
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   219
                    break;
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   220
                }
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   221
                stream.skipBytes(12 * count);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   222
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   223
                long offset = stream.readUnsignedInt();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   224
                if (offset == 0) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   225
                    return index;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   226
                }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   227
40438
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   228
                stream.seek(offset);
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   229
                imageStartPosition.add(Long.valueOf(offset));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   230
                ++index;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   231
            }
40438
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   232
        } catch (EOFException eofe) {
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   233
            forwardWarningMessage("Ignored " + eofe);
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   234
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   235
            // Ran off the end of stream: decrement index
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   236
            imageIndex = index > 0 ? index - 1 : 0;
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   237
        } catch (IOException ioe) {
4abe842e6c48 8145014: "IIOException: Couldn't seek!" when calling TIFFImageReader.getNumImages()
bpb
parents: 36448
diff changeset
   238
            throw new IIOException("Couldn't seek!", ioe);
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   239
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   240
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   241
        if (currIndex != imageIndex) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   242
            imageMetadata = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   243
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   244
        currIndex = imageIndex;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   245
        return imageIndex;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   246
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   247
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   248
    public int getNumImages(boolean allowSearch) throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   249
        if (stream == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   250
            throw new IllegalStateException("Input not set!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   251
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   252
        if (seekForwardOnly && allowSearch) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   253
            throw new IllegalStateException("seekForwardOnly and allowSearch can't both be true!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   254
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   255
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   256
        if (numImages > 0) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   257
            return numImages;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   258
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   259
        if (allowSearch) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   260
            this.numImages = locateImage(Integer.MAX_VALUE) + 1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   261
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   262
        return numImages;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   263
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   264
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   265
    public IIOMetadata getStreamMetadata() throws IIOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   266
        readHeader();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   267
        return streamMetadata;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   268
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   269
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   270
    // Throw an IndexOutOfBoundsException if index < minIndex,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   271
    // and bump minIndex if required.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   272
    private void checkIndex(int imageIndex) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   273
        if (imageIndex < minIndex) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   274
            throw new IndexOutOfBoundsException("imageIndex < minIndex!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   275
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   276
        if (seekForwardOnly) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   277
            minIndex = imageIndex;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   278
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   279
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   280
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   281
    // Verify that imageIndex is in bounds, find the image IFD, read the
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   282
    // image metadata, initialize instance variables from the metadata.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   283
    private void seekToImage(int imageIndex) throws IIOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   284
        checkIndex(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   285
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   286
        int index = locateImage(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   287
        if (index != imageIndex) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   288
            throw new IndexOutOfBoundsException("imageIndex out of bounds!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   289
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   290
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   291
        readMetadata();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   292
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   293
        initializeFromMetadata();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   294
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   295
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   296
    // Stream must be positioned at start of IFD for 'currIndex'
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   297
    private void readMetadata() throws IIOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   298
        if (stream == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   299
            throw new IllegalStateException("Input not set!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   300
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   301
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   302
        if (imageMetadata != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   303
            return;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   304
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   305
        try {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   306
            // Create an object to store the image metadata
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   307
            List<TIFFTagSet> tagSets;
42749
91fb907a8732 8154058: [TIFF] ignoreMetadata parameter of TIFFImageReader's setInput() method affects TIFFImageReadParam in non-obvious way
bpb
parents: 42197
diff changeset
   308
            boolean readUnknownTags = false;
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   309
            if (imageReadParam instanceof TIFFImageReadParam) {
42749
91fb907a8732 8154058: [TIFF] ignoreMetadata parameter of TIFFImageReader's setInput() method affects TIFFImageReadParam in non-obvious way
bpb
parents: 42197
diff changeset
   310
                TIFFImageReadParam tp = (TIFFImageReadParam)imageReadParam;
91fb907a8732 8154058: [TIFF] ignoreMetadata parameter of TIFFImageReader's setInput() method affects TIFFImageReadParam in non-obvious way
bpb
parents: 42197
diff changeset
   311
                tagSets = tp.getAllowedTagSets();
91fb907a8732 8154058: [TIFF] ignoreMetadata parameter of TIFFImageReader's setInput() method affects TIFFImageReadParam in non-obvious way
bpb
parents: 42197
diff changeset
   312
                readUnknownTags = tp.getReadUnknownTags();
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   313
            } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   314
                tagSets = new ArrayList<TIFFTagSet>(1);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   315
                tagSets.add(BaselineTIFFTagSet.getInstance());
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   316
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   317
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   318
            this.imageMetadata = new TIFFImageMetadata(tagSets);
42749
91fb907a8732 8154058: [TIFF] ignoreMetadata parameter of TIFFImageReader's setInput() method affects TIFFImageReadParam in non-obvious way
bpb
parents: 42197
diff changeset
   319
            imageMetadata.initializeFromStream(stream, ignoreMetadata,
91fb907a8732 8154058: [TIFF] ignoreMetadata parameter of TIFFImageReader's setInput() method affects TIFFImageReadParam in non-obvious way
bpb
parents: 42197
diff changeset
   320
                                               readUnknownTags);
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   321
        } catch (IIOException iioe) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   322
            throw iioe;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   323
        } catch (IOException ioe) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   324
            throw new IIOException("I/O error reading image metadata!", ioe);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   325
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   326
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   327
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   328
    private int getWidth() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   329
        return this.width;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   330
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   331
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   332
    private int getHeight() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   333
        return this.height;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   334
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   335
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   336
    // Returns tile width if image is tiled, else image width
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   337
    private int getTileOrStripWidth() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   338
        TIFFField f
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   339
                = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_TILE_WIDTH);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   340
        return (f == null) ? getWidth() : f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   341
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   342
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   343
    // Returns tile height if image is tiled, else strip height
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   344
    private int getTileOrStripHeight() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   345
        TIFFField f
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   346
                = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_TILE_LENGTH);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   347
        if (f != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   348
            return f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   349
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   350
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   351
        f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_ROWS_PER_STRIP);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   352
        // Default for ROWS_PER_STRIP is 2^32 - 1, i.e., infinity
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   353
        int h = (f == null) ? -1 : f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   354
        return (h == -1) ? getHeight() : h;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   355
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   356
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   357
    private int getPlanarConfiguration() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   358
        TIFFField f
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   359
                = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_PLANAR_CONFIGURATION);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   360
        if (f != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   361
            int planarConfigurationValue = f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   362
            if (planarConfigurationValue
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   363
                    == BaselineTIFFTagSet.PLANAR_CONFIGURATION_PLANAR) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   364
                // Some writers (e.g. Kofax standard Multi-Page TIFF
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   365
                // Storage Filter v2.01.000; cf. bug 4929147) do not
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   366
                // correctly set the value of this field. Attempt to
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   367
                // ascertain whether the value is correctly Planar.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   368
                if (getCompression()
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   369
                        == BaselineTIFFTagSet.COMPRESSION_OLD_JPEG
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   370
                        && imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_JPEG_INTERCHANGE_FORMAT)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   371
                        != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   372
                    // JPEG interchange format cannot have
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   373
                    // PlanarConfiguration value Chunky so reset.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   374
                    processWarningOccurred("PlanarConfiguration \"Planar\" value inconsistent with JPEGInterchangeFormat; resetting to \"Chunky\".");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   375
                    planarConfigurationValue
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   376
                            = BaselineTIFFTagSet.PLANAR_CONFIGURATION_CHUNKY;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   377
                } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   378
                    TIFFField offsetField
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   379
                            = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_TILE_OFFSETS);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   380
                    if (offsetField == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   381
                        // Tiles
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   382
                        offsetField
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   383
                                = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_STRIP_OFFSETS);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   384
                        int tw = getTileOrStripWidth();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   385
                        int th = getTileOrStripHeight();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   386
                        int tAcross = (getWidth() + tw - 1) / tw;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   387
                        int tDown = (getHeight() + th - 1) / th;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   388
                        int tilesPerImage = tAcross * tDown;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   389
                        long[] offsetArray = offsetField.getAsLongs();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   390
                        if (offsetArray != null
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   391
                                && offsetArray.length == tilesPerImage) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   392
                            // Length of offsets array is
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   393
                            // TilesPerImage for Chunky and
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   394
                            // SamplesPerPixel*TilesPerImage for Planar.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   395
                            processWarningOccurred("PlanarConfiguration \"Planar\" value inconsistent with TileOffsets field value count; resetting to \"Chunky\".");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   396
                            planarConfigurationValue
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   397
                                    = BaselineTIFFTagSet.PLANAR_CONFIGURATION_CHUNKY;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   398
                        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   399
                    } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   400
                        // Strips
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   401
                        int rowsPerStrip = getTileOrStripHeight();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   402
                        int stripsPerImage
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   403
                                = (getHeight() + rowsPerStrip - 1) / rowsPerStrip;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   404
                        long[] offsetArray = offsetField.getAsLongs();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   405
                        if (offsetArray != null
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   406
                                && offsetArray.length == stripsPerImage) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   407
                            // Length of offsets array is
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   408
                            // StripsPerImage for Chunky and
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   409
                            // SamplesPerPixel*StripsPerImage for Planar.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   410
                            processWarningOccurred("PlanarConfiguration \"Planar\" value inconsistent with StripOffsets field value count; resetting to \"Chunky\".");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   411
                            planarConfigurationValue
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   412
                                    = BaselineTIFFTagSet.PLANAR_CONFIGURATION_CHUNKY;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   413
                        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   414
                    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   415
                }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   416
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   417
            return planarConfigurationValue;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   418
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   419
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   420
        return BaselineTIFFTagSet.PLANAR_CONFIGURATION_CHUNKY;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   421
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   422
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   423
    private long getTileOrStripOffset(int tileIndex) throws IIOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   424
        TIFFField f
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   425
                = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_TILE_OFFSETS);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   426
        if (f == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   427
            f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_STRIP_OFFSETS);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   428
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   429
        if (f == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   430
            f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_JPEG_INTERCHANGE_FORMAT);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   431
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   432
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   433
        if (f == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   434
            throw new IIOException("Missing required strip or tile offsets field.");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   435
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   436
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   437
        return f.getAsLong(tileIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   438
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   439
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   440
    private long getTileOrStripByteCount(int tileIndex) throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   441
        TIFFField f
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   442
                = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_TILE_BYTE_COUNTS);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   443
        if (f == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   444
            f
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   445
                    = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_STRIP_BYTE_COUNTS);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   446
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   447
        if (f == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   448
            f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   449
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   450
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   451
        long tileOrStripByteCount;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   452
        if (f != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   453
            tileOrStripByteCount = f.getAsLong(tileIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   454
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   455
            processWarningOccurred("TIFF directory contains neither StripByteCounts nor TileByteCounts field: attempting to calculate from strip or tile width and height.");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   456
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   457
            // Initialize to number of bytes per strip or tile assuming
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   458
            // no compression.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   459
            int bitsPerPixel = bitsPerSample[0];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   460
            for (int i = 1; i < samplesPerPixel; i++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   461
                bitsPerPixel += bitsPerSample[i];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   462
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   463
            int bytesPerRow = (getTileOrStripWidth() * bitsPerPixel + 7) / 8;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   464
            tileOrStripByteCount = bytesPerRow * getTileOrStripHeight();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   465
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   466
            // Clamp to end of stream if possible.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   467
            long streamLength = stream.length();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   468
            if (streamLength != -1) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   469
                tileOrStripByteCount
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   470
                        = Math.min(tileOrStripByteCount,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   471
                                streamLength - getTileOrStripOffset(tileIndex));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   472
            } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   473
                processWarningOccurred("Stream length is unknown: cannot clamp estimated strip or tile byte count to EOF.");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   474
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   475
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   476
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   477
        return tileOrStripByteCount;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   478
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   479
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   480
    private int getCompression() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   481
        TIFFField f
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   482
                = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_COMPRESSION);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   483
        if (f == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   484
            return BaselineTIFFTagSet.COMPRESSION_NONE;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   485
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   486
            return f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   487
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   488
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   489
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   490
    public int getWidth(int imageIndex) throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   491
        seekToImage(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   492
        return getWidth();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   493
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   494
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   495
    public int getHeight(int imageIndex) throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   496
        seekToImage(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   497
        return getHeight();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   498
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   499
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   500
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   501
     * Initializes these instance variables from the image metadata:
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   502
     * <pre>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   503
     * compression
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   504
     * width
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   505
     * height
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   506
     * samplesPerPixel
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   507
     * numBands
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   508
     * colorMap
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   509
     * photometricInterpretation
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   510
     * sampleFormat
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   511
     * bitsPerSample
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   512
     * extraSamples
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   513
     * tileOrStripWidth
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   514
     * tileOrStripHeight
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   515
     * </pre>
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   516
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   517
    private void initializeFromMetadata() throws IIOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   518
        TIFFField f;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   519
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   520
        // Compression
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   521
        f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_COMPRESSION);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   522
        if (f == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   523
            processWarningOccurred("Compression field is missing; assuming no compression");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   524
            compression = BaselineTIFFTagSet.COMPRESSION_NONE;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   525
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   526
            compression = f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   527
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   528
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   529
        // Whether key dimensional information is absent.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   530
        boolean isMissingDimension = false;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   531
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   532
        // ImageWidth -> width
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   533
        f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_IMAGE_WIDTH);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   534
        if (f != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   535
            this.width = f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   536
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   537
            processWarningOccurred("ImageWidth field is missing.");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   538
            isMissingDimension = true;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   539
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   540
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   541
        // ImageLength -> height
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   542
        f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_IMAGE_LENGTH);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   543
        if (f != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   544
            this.height = f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   545
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   546
            processWarningOccurred("ImageLength field is missing.");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   547
            isMissingDimension = true;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   548
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   549
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   550
        // SamplesPerPixel
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   551
        f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_SAMPLES_PER_PIXEL);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   552
        if (f != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   553
            samplesPerPixel = f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   554
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   555
            samplesPerPixel = 1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   556
            isMissingDimension = true;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   557
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   558
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   559
        // If any dimension is missing and there is a JPEG stream available
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   560
        // get the information from it.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   561
        int defaultBitDepth = 1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   562
        if (isMissingDimension
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   563
                && (f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_JPEG_INTERCHANGE_FORMAT)) != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   564
            Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("JPEG");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   565
            if (iter != null && iter.hasNext()) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   566
                ImageReader jreader = iter.next();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   567
                try {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   568
                    stream.mark();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   569
                    stream.seek(f.getAsLong(0));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   570
                    jreader.setInput(stream);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   571
                    if (imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_IMAGE_WIDTH) == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   572
                        this.width = jreader.getWidth(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   573
                    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   574
                    if (imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_IMAGE_LENGTH) == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   575
                        this.height = jreader.getHeight(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   576
                    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   577
                    ImageTypeSpecifier imageType = jreader.getRawImageType(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   578
                    if (imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_SAMPLES_PER_PIXEL) == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   579
                        this.samplesPerPixel =
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   580
                            imageType != null ?
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   581
                                imageType.getSampleModel().getNumBands() : 3;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   582
                    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   583
                    stream.reset();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   584
                    defaultBitDepth =
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   585
                        imageType != null ?
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   586
                        imageType.getColorModel().getComponentSize(0) : 8;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   587
                } catch (IOException e) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   588
                    // Ignore it and proceed: an error will occur later.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   589
                }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   590
                jreader.dispose();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   591
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   592
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   593
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   594
        if (samplesPerPixel < 1) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   595
            throw new IIOException("Samples per pixel < 1!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   596
        } else if (samplesPerPixel > SAMPLES_PER_PIXEL_MAX) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   597
            throw new IIOException
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   598
                ("Samples per pixel (" + samplesPerPixel
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   599
                + ") greater than allowed maximum ("
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   600
                + SAMPLES_PER_PIXEL_MAX + ")");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   601
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   602
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   603
        // SamplesPerPixel -> numBands
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   604
        numBands = samplesPerPixel;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   605
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   606
        // ColorMap
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   607
        this.colorMap = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   608
        f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_COLOR_MAP);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   609
        if (f != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   610
            // Grab color map
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   611
            colorMap = f.getAsChars();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   612
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   613
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   614
        // PhotometricInterpretation
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   615
        f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_PHOTOMETRIC_INTERPRETATION);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   616
        if (f == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   617
            if (compression == BaselineTIFFTagSet.COMPRESSION_CCITT_RLE
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   618
                    || compression == BaselineTIFFTagSet.COMPRESSION_CCITT_T_4
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   619
                    || compression == BaselineTIFFTagSet.COMPRESSION_CCITT_T_6) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   620
                processWarningOccurred("PhotometricInterpretation field is missing; "
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   621
                        + "assuming WhiteIsZero");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   622
                photometricInterpretation
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   623
                        = BaselineTIFFTagSet.PHOTOMETRIC_INTERPRETATION_WHITE_IS_ZERO;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   624
            } else if (this.colorMap != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   625
                photometricInterpretation
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   626
                        = BaselineTIFFTagSet.PHOTOMETRIC_INTERPRETATION_PALETTE_COLOR;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   627
            } else if (samplesPerPixel == 3 || samplesPerPixel == 4) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   628
                photometricInterpretation
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   629
                        = BaselineTIFFTagSet.PHOTOMETRIC_INTERPRETATION_RGB;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   630
            } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   631
                processWarningOccurred("PhotometricInterpretation field is missing; "
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   632
                        + "assuming BlackIsZero");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   633
                photometricInterpretation
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   634
                        = BaselineTIFFTagSet.PHOTOMETRIC_INTERPRETATION_BLACK_IS_ZERO;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   635
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   636
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   637
            photometricInterpretation = f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   638
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   639
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   640
        // SampleFormat
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   641
        boolean replicateFirst = false;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   642
        int first = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   643
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   644
        f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_SAMPLE_FORMAT);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   645
        sampleFormat = new int[samplesPerPixel];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   646
        replicateFirst = false;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   647
        if (f == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   648
            replicateFirst = true;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   649
            first = BaselineTIFFTagSet.SAMPLE_FORMAT_UNDEFINED;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   650
        } else if (f.getCount() != samplesPerPixel) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   651
            replicateFirst = true;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   652
            first = f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   653
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   654
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   655
        for (int i = 0; i < samplesPerPixel; i++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   656
            sampleFormat[i] = replicateFirst ? first : f.getAsInt(i);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   657
            if (sampleFormat[i]
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   658
                    != BaselineTIFFTagSet.SAMPLE_FORMAT_UNSIGNED_INTEGER
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   659
                    && sampleFormat[i]
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   660
                    != BaselineTIFFTagSet.SAMPLE_FORMAT_SIGNED_INTEGER
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   661
                    && sampleFormat[i]
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   662
                    != BaselineTIFFTagSet.SAMPLE_FORMAT_FLOATING_POINT
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   663
                    && sampleFormat[i]
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   664
                    != BaselineTIFFTagSet.SAMPLE_FORMAT_UNDEFINED) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   665
                processWarningOccurred(
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   666
                        "Illegal value for SAMPLE_FORMAT, assuming SAMPLE_FORMAT_UNDEFINED");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   667
                sampleFormat[i] = BaselineTIFFTagSet.SAMPLE_FORMAT_UNDEFINED;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   668
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   669
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   670
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   671
        // BitsPerSample
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   672
        f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_BITS_PER_SAMPLE);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   673
        this.bitsPerSample = new int[samplesPerPixel];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   674
        replicateFirst = false;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   675
        if (f == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   676
            replicateFirst = true;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   677
            first = defaultBitDepth;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   678
        } else if (f.getCount() != samplesPerPixel) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   679
            replicateFirst = true;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   680
            first = f.getAsInt(0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   681
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   682
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   683
        for (int i = 0; i < samplesPerPixel; i++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   684
            // Replicate initial value if not enough values provided
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   685
            bitsPerSample[i] = replicateFirst ? first : f.getAsInt(i);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   686
            if (bitsPerSample[i] > BITS_PER_SAMPLE_MAX) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   687
                throw new IIOException
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   688
                    ("Bits per sample (" + bitsPerSample[i]
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   689
                    + ") greater than allowed maximum ("
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   690
                    + BITS_PER_SAMPLE_MAX + ")");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   691
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   692
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   693
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   694
        // ExtraSamples
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   695
        this.extraSamples = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   696
        f = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_EXTRA_SAMPLES);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   697
        if (f != null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   698
            extraSamples = f.getAsInts();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   699
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   700
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   701
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   702
    public Iterator<ImageTypeSpecifier> getImageTypes(int imageIndex) throws IIOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   703
        List<ImageTypeSpecifier> l; // List of ImageTypeSpecifiers
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   704
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   705
        Integer imageIndexInteger = Integer.valueOf(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   706
        if (imageTypeMap.containsKey(imageIndexInteger)) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   707
            // Return the cached ITS List.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   708
            l = imageTypeMap.get(imageIndexInteger);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   709
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   710
            // Create a new ITS List.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   711
            l = new ArrayList<ImageTypeSpecifier>(1);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   712
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   713
            // Create the ITS and cache if for later use so that this method
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   714
            // always returns an Iterator containing the same ITS objects.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   715
            seekToImage(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   716
            ImageTypeSpecifier itsRaw
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   717
                    = TIFFDecompressor.getRawImageTypeSpecifier(photometricInterpretation,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   718
                            compression,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   719
                            samplesPerPixel,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   720
                            bitsPerSample,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   721
                            sampleFormat,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   722
                            extraSamples,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   723
                            colorMap);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   724
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   725
            // Check for an ICCProfile field.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   726
            TIFFField iccProfileField
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   727
                    = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_ICC_PROFILE);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   728
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   729
            // If an ICCProfile field is present change the ImageTypeSpecifier
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   730
            // to use it if the data layout is component type.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   731
            if (iccProfileField != null
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   732
                    && itsRaw.getColorModel() instanceof ComponentColorModel) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   733
                // Get the raw sample and color information.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   734
                ColorModel cmRaw = itsRaw.getColorModel();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   735
                ColorSpace csRaw = cmRaw.getColorSpace();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   736
                SampleModel smRaw = itsRaw.getSampleModel();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   737
43087
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   738
                ColorSpace iccColorSpace = null;
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   739
                try {
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   740
                    // Create a ColorSpace from the profile.
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   741
                    byte[] iccProfileValue = iccProfileField.getAsBytes();
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   742
                    ICC_Profile iccProfile
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   743
                        = ICC_Profile.getInstance(iccProfileValue);
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   744
                    iccColorSpace = new ICC_ColorSpace(iccProfile);
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   745
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   746
                    // Workaround for JDK-8145241: test a conversion and fall
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   747
                    // back to a standard ColorSpace if it fails. This
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   748
                    // workaround could be removed if JDK-8145241 is fixed.
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   749
                    float[] rgb =
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   750
                        iccColorSpace.toRGB(new float[] {1.0F, 1.0F, 1.0F});
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   751
                } catch (Exception iccProfileException) {
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   752
                    processWarningOccurred("Superseding bad ICC profile: "
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   753
                        + iccProfileException.getMessage());
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   754
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   755
                    if (iccColorSpace != null) {
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   756
                        switch (iccColorSpace.getType()) {
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   757
                            case ColorSpace.TYPE_GRAY:
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   758
                                iccColorSpace =
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   759
                                    ColorSpace.getInstance(ColorSpace.CS_GRAY);
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   760
                                break;
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   761
                            case ColorSpace.TYPE_RGB:
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   762
                                iccColorSpace =
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   763
                                    ColorSpace.getInstance(ColorSpace.CS_sRGB);
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   764
                                break;
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   765
                            default:
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   766
                                iccColorSpace = csRaw;
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   767
                                break;
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   768
                        }
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   769
                    } else {
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   770
                        iccColorSpace = csRaw;
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   771
                    }
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   772
                }
9d78f6cdb8d5 8172153: Create workaround for failure to use ICC profile contained in a TIFF field
bpb
parents: 42749
diff changeset
   773
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   774
                // Get the number of samples per pixel and the number
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   775
                // of color components.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   776
                int numBands = smRaw.getNumBands();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   777
                int numComponents = iccColorSpace.getNumComponents();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   778
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   779
                // Replace the ColorModel with the ICC ColorModel if the
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   780
                // numbers of samples and color components are amenable.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   781
                if (numBands == numComponents
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   782
                        || numBands == numComponents + 1) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   783
                    // Set alpha flags.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   784
                    boolean hasAlpha = numComponents != numBands;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   785
                    boolean isAlphaPre
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   786
                            = hasAlpha && cmRaw.isAlphaPremultiplied();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   787
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   788
                    // Create a ColorModel of the same class and with
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   789
                    // the same transfer type.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   790
                    ColorModel iccColorModel
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   791
                            = new ComponentColorModel(iccColorSpace,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   792
                                    cmRaw.getComponentSize(),
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   793
                                    hasAlpha,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   794
                                    isAlphaPre,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   795
                                    cmRaw.getTransparency(),
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   796
                                    cmRaw.getTransferType());
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   797
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   798
                    // Prepend the ICC profile-based ITS to the List. The
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   799
                    // ColorModel and SampleModel are guaranteed to be
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   800
                    // compatible as the old and new ColorModels are both
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   801
                    // ComponentColorModels with the same transfer type
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   802
                    // and the same number of components.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   803
                    l.add(new ImageTypeSpecifier(iccColorModel, smRaw));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   804
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   805
                    // Append the raw ITS to the List if and only if its
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   806
                    // ColorSpace has the same type and number of components
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   807
                    // as the ICC ColorSpace.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   808
                    if (csRaw.getType() == iccColorSpace.getType()
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   809
                            && csRaw.getNumComponents()
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   810
                            == iccColorSpace.getNumComponents()) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   811
                        l.add(itsRaw);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   812
                    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   813
                } else { // ICCProfile not compatible with SampleModel.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   814
                    // Append the raw ITS to the List.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   815
                    l.add(itsRaw);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   816
                }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   817
            } else { // No ICCProfile field or raw ColorModel not component.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   818
                // Append the raw ITS to the List.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   819
                l.add(itsRaw);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   820
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   821
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   822
            // Cache the ITS List.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   823
            imageTypeMap.put(imageIndexInteger, l);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   824
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   825
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   826
        return l.iterator();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   827
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   828
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   829
    public IIOMetadata getImageMetadata(int imageIndex) throws IIOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   830
        seekToImage(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   831
        TIFFImageMetadata im
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   832
                = new TIFFImageMetadata(imageMetadata.getRootIFD().getTagSetList());
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   833
        Node root
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   834
                = imageMetadata.getAsTree(TIFFImageMetadata.NATIVE_METADATA_FORMAT_NAME);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   835
        im.setFromTree(TIFFImageMetadata.NATIVE_METADATA_FORMAT_NAME, root);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   836
        return im;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   837
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   838
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   839
    public IIOMetadata getStreamMetadata(int imageIndex) throws IIOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   840
        readHeader();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   841
        TIFFStreamMetadata sm = new TIFFStreamMetadata();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   842
        Node root = sm.getAsTree(TIFFStreamMetadata.NATIVE_METADATA_FORMAT_NAME);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   843
        sm.setFromTree(TIFFStreamMetadata.NATIVE_METADATA_FORMAT_NAME, root);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   844
        return sm;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   845
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   846
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   847
    public boolean isRandomAccessEasy(int imageIndex) throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   848
        if (currIndex != -1) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   849
            seekToImage(currIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   850
            return getCompression() == BaselineTIFFTagSet.COMPRESSION_NONE;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   851
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   852
            return false;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   853
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   854
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   855
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   856
    // Thumbnails
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   857
    public boolean readSupportsThumbnails() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   858
        return false;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   859
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   860
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   861
    public boolean hasThumbnails(int imageIndex) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   862
        return false;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   863
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   864
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   865
    public int getNumThumbnails(int imageIndex) throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   866
        return 0;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   867
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   868
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   869
    public ImageReadParam getDefaultReadParam() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   870
        return new TIFFImageReadParam();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   871
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   872
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   873
    public boolean isImageTiled(int imageIndex) throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   874
        seekToImage(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   875
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   876
        TIFFField f
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   877
                = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_TILE_WIDTH);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   878
        return f != null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   879
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   880
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   881
    public int getTileWidth(int imageIndex) throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   882
        seekToImage(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   883
        return getTileOrStripWidth();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   884
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   885
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   886
    public int getTileHeight(int imageIndex) throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   887
        seekToImage(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   888
        return getTileOrStripHeight();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   889
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   890
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   891
    public BufferedImage readTile(int imageIndex, int tileX, int tileY)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   892
            throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   893
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   894
        int w = getWidth(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   895
        int h = getHeight(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   896
        int tw = getTileWidth(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   897
        int th = getTileHeight(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   898
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   899
        int x = tw * tileX;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   900
        int y = th * tileY;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   901
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   902
        if (tileX < 0 || tileY < 0 || x >= w || y >= h) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   903
            throw new IllegalArgumentException("Tile indices are out of bounds!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   904
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   905
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   906
        if (x + tw > w) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   907
            tw = w - x;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   908
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   909
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   910
        if (y + th > h) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   911
            th = h - y;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   912
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   913
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   914
        ImageReadParam param = getDefaultReadParam();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   915
        Rectangle tileRect = new Rectangle(x, y, tw, th);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   916
        param.setSourceRegion(tileRect);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   917
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   918
        return read(imageIndex, param);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   919
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   920
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   921
    public boolean canReadRaster() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   922
        return false;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   923
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   924
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   925
    public Raster readRaster(int imageIndex, ImageReadParam param)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   926
            throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   927
        throw new UnsupportedOperationException();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   928
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   929
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   930
    private int[] sourceBands;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   931
    private int[] destinationBands;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   932
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   933
    private TIFFDecompressor decompressor;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   934
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   935
    // floor(num/den)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   936
    private static int ifloor(int num, int den) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   937
        if (num < 0) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   938
            num -= den - 1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   939
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   940
        return num / den;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   941
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   942
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   943
    // ceil(num/den)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   944
    private static int iceil(int num, int den) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   945
        if (num > 0) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   946
            num += den - 1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   947
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   948
        return num / den;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   949
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   950
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   951
    private void prepareRead(int imageIndex, ImageReadParam param)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   952
            throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   953
        if (stream == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   954
            throw new IllegalStateException("Input not set!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   955
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   956
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   957
        // A null ImageReadParam means we use the default
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   958
        if (param == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   959
            param = getDefaultReadParam();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   960
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   961
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   962
        this.imageReadParam = param;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   963
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   964
        seekToImage(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   965
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   966
        this.tileOrStripWidth = getTileOrStripWidth();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   967
        this.tileOrStripHeight = getTileOrStripHeight();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   968
        this.planarConfiguration = getPlanarConfiguration();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   969
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   970
        this.sourceBands = param.getSourceBands();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   971
        if (sourceBands == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   972
            sourceBands = new int[numBands];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   973
            for (int i = 0; i < numBands; i++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   974
                sourceBands[i] = i;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   975
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   976
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   977
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   978
        // Initialize the destination image
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   979
        Iterator<ImageTypeSpecifier> imageTypes = getImageTypes(imageIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   980
        ImageTypeSpecifier theImageType
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   981
                = ImageUtil.getDestinationType(param, imageTypes);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   982
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   983
        int destNumBands = theImageType.getSampleModel().getNumBands();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   984
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   985
        this.destinationBands = param.getDestinationBands();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   986
        if (destinationBands == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   987
            destinationBands = new int[destNumBands];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   988
            for (int i = 0; i < destNumBands; i++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   989
                destinationBands[i] = i;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   990
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   991
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   992
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   993
        if (sourceBands.length != destinationBands.length) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   994
            throw new IllegalArgumentException(
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   995
                    "sourceBands.length != destinationBands.length");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   996
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   997
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   998
        for (int i = 0; i < sourceBands.length; i++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
   999
            int sb = sourceBands[i];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1000
            if (sb < 0 || sb >= numBands) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1001
                throw new IllegalArgumentException(
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1002
                        "Source band out of range!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1003
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1004
            int db = destinationBands[i];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1005
            if (db < 0 || db >= destNumBands) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1006
                throw new IllegalArgumentException(
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1007
                        "Destination band out of range!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1008
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1009
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1010
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1011
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1012
    public RenderedImage readAsRenderedImage(int imageIndex,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1013
            ImageReadParam param)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1014
            throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1015
        prepareRead(imageIndex, param);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1016
        return new TIFFRenderedImage(this, imageIndex, imageReadParam,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1017
                width, height);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1018
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1019
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1020
    private void decodeTile(int ti, int tj, int band) throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1021
        // Compute the region covered by the strip or tile
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1022
        Rectangle tileRect = new Rectangle(ti * tileOrStripWidth,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1023
                tj * tileOrStripHeight,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1024
                tileOrStripWidth,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1025
                tileOrStripHeight);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1026
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1027
        // Clip against the image bounds if the image is not tiled. If it
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1028
        // is tiled, the tile may legally extend beyond the image bounds.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1029
        if (!isImageTiled(currIndex)) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1030
            tileRect
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1031
                    = tileRect.intersection(new Rectangle(0, 0, width, height));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1032
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1033
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1034
        // Return if the intersection is empty.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1035
        if (tileRect.width <= 0 || tileRect.height <= 0) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1036
            return;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1037
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1038
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1039
        int srcMinX = tileRect.x;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1040
        int srcMinY = tileRect.y;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1041
        int srcWidth = tileRect.width;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1042
        int srcHeight = tileRect.height;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1043
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1044
        // Determine dest region that can be derived from the
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1045
        // source region
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1046
        dstMinX = iceil(srcMinX - sourceXOffset, srcXSubsampling);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1047
        int dstMaxX = ifloor(srcMinX + srcWidth - 1 - sourceXOffset,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1048
                srcXSubsampling);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1049
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1050
        dstMinY = iceil(srcMinY - sourceYOffset, srcYSubsampling);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1051
        int dstMaxY = ifloor(srcMinY + srcHeight - 1 - sourceYOffset,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1052
                srcYSubsampling);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1053
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1054
        dstWidth = dstMaxX - dstMinX + 1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1055
        dstHeight = dstMaxY - dstMinY + 1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1056
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1057
        dstMinX += dstXOffset;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1058
        dstMinY += dstYOffset;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1059
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1060
        // Clip against image bounds
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1061
        Rectangle dstRect = new Rectangle(dstMinX, dstMinY,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1062
                dstWidth, dstHeight);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1063
        dstRect
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1064
                = dstRect.intersection(theImage.getRaster().getBounds());
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1065
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1066
        dstMinX = dstRect.x;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1067
        dstMinY = dstRect.y;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1068
        dstWidth = dstRect.width;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1069
        dstHeight = dstRect.height;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1070
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1071
        if (dstWidth <= 0 || dstHeight <= 0) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1072
            return;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1073
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1074
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1075
        // Backwards map dest region to source to determine
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1076
        // active source region
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1077
        int activeSrcMinX = (dstMinX - dstXOffset) * srcXSubsampling
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1078
                + sourceXOffset;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1079
        int sxmax
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1080
                = (dstMinX + dstWidth - 1 - dstXOffset) * srcXSubsampling
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1081
                + sourceXOffset;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1082
        int activeSrcWidth = sxmax - activeSrcMinX + 1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1083
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1084
        int activeSrcMinY = (dstMinY - dstYOffset) * srcYSubsampling
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1085
                + sourceYOffset;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1086
        int symax
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1087
                = (dstMinY + dstHeight - 1 - dstYOffset) * srcYSubsampling
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1088
                + sourceYOffset;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1089
        int activeSrcHeight = symax - activeSrcMinY + 1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1090
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1091
        decompressor.setSrcMinX(srcMinX);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1092
        decompressor.setSrcMinY(srcMinY);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1093
        decompressor.setSrcWidth(srcWidth);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1094
        decompressor.setSrcHeight(srcHeight);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1095
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1096
        decompressor.setDstMinX(dstMinX);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1097
        decompressor.setDstMinY(dstMinY);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1098
        decompressor.setDstWidth(dstWidth);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1099
        decompressor.setDstHeight(dstHeight);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1100
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1101
        decompressor.setActiveSrcMinX(activeSrcMinX);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1102
        decompressor.setActiveSrcMinY(activeSrcMinY);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1103
        decompressor.setActiveSrcWidth(activeSrcWidth);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1104
        decompressor.setActiveSrcHeight(activeSrcHeight);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1105
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1106
        int tileIndex = tj * tilesAcross + ti;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1107
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1108
        if (planarConfiguration
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1109
                == BaselineTIFFTagSet.PLANAR_CONFIGURATION_PLANAR) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1110
            tileIndex += band * tilesAcross * tilesDown;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1111
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1112
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1113
        long offset = getTileOrStripOffset(tileIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1114
        long byteCount = getTileOrStripByteCount(tileIndex);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1115
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1116
        decompressor.setStream(stream);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1117
        decompressor.setOffset(offset);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1118
        decompressor.setByteCount((int) byteCount);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1119
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1120
        decompressor.beginDecoding();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1121
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1122
        stream.mark();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1123
        decompressor.decode();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1124
        stream.reset();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1125
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1126
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1127
    private void reportProgress() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1128
        // Report image progress/update to listeners after each tile
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1129
        pixelsRead += dstWidth * dstHeight;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1130
        processImageProgress(100.0f * pixelsRead / pixelsToRead);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1131
        processImageUpdate(theImage,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1132
                dstMinX, dstMinY, dstWidth, dstHeight,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1133
                1, 1,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1134
                destinationBands);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1135
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1136
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1137
    public BufferedImage read(int imageIndex, ImageReadParam param)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1138
            throws IOException {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1139
        prepareRead(imageIndex, param);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1140
        this.theImage = getDestination(param,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1141
                getImageTypes(imageIndex),
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1142
                width, height);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1143
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1144
        srcXSubsampling = imageReadParam.getSourceXSubsampling();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1145
        srcYSubsampling = imageReadParam.getSourceYSubsampling();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1146
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1147
        Point p = imageReadParam.getDestinationOffset();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1148
        dstXOffset = p.x;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1149
        dstYOffset = p.y;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1150
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1151
        // This could probably be made more efficient...
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1152
        Rectangle srcRegion = new Rectangle(0, 0, 0, 0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1153
        Rectangle destRegion = new Rectangle(0, 0, 0, 0);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1154
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1155
        computeRegions(imageReadParam, width, height, theImage,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1156
                srcRegion, destRegion);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1157
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1158
        // Initial source pixel, taking source region and source
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1159
        // subsamplimg offsets into account
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1160
        sourceXOffset = srcRegion.x;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1161
        sourceYOffset = srcRegion.y;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1162
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1163
        pixelsToRead = destRegion.width * destRegion.height;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1164
        pixelsRead = 0;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1165
41010
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1166
        clearAbortRequest();
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1167
        processImageStarted(imageIndex);
41010
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1168
        if (abortRequested()) {
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1169
            processReadAborted();
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1170
            return theImage;
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1171
        }
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1172
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1173
        tilesAcross = (width + tileOrStripWidth - 1) / tileOrStripWidth;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1174
        tilesDown = (height + tileOrStripHeight - 1) / tileOrStripHeight;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1175
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1176
        int compression = getCompression();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1177
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1178
        // Set the decompressor
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1179
        if (compression == BaselineTIFFTagSet.COMPRESSION_NONE) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1180
            // Get the fillOrder field.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1181
            TIFFField fillOrderField
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1182
                    = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_FILL_ORDER);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1183
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1184
            // Set the decompressor based on the fill order.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1185
            if (fillOrderField != null && fillOrderField.getAsInt(0) == 2) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1186
                this.decompressor = new TIFFLSBDecompressor();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1187
            } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1188
                this.decompressor = new TIFFNullDecompressor();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1189
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1190
        } else if (compression
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1191
                == BaselineTIFFTagSet.COMPRESSION_CCITT_T_6) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1192
            this.decompressor = new TIFFFaxDecompressor();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1193
        } else if (compression
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1194
                == BaselineTIFFTagSet.COMPRESSION_CCITT_T_4) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1195
            this.decompressor = new TIFFFaxDecompressor();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1196
        } else if (compression
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1197
                == BaselineTIFFTagSet.COMPRESSION_CCITT_RLE) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1198
            this.decompressor = new TIFFFaxDecompressor();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1199
        } else if (compression
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1200
                == BaselineTIFFTagSet.COMPRESSION_PACKBITS) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1201
            this.decompressor = new TIFFPackBitsDecompressor();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1202
        } else if (compression
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1203
                == BaselineTIFFTagSet.COMPRESSION_LZW) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1204
            TIFFField predictorField
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1205
                    = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_PREDICTOR);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1206
            int predictor = ((predictorField == null)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1207
                    ? BaselineTIFFTagSet.PREDICTOR_NONE
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1208
                    : predictorField.getAsInt(0));
42197
3fa9da09d5b6 8154093: [TIFF] NPE when reading LZW-compressed image
bpb
parents: 41010
diff changeset
  1209
3fa9da09d5b6 8154093: [TIFF] NPE when reading LZW-compressed image
bpb
parents: 41010
diff changeset
  1210
            TIFFField fillOrderField
3fa9da09d5b6 8154093: [TIFF] NPE when reading LZW-compressed image
bpb
parents: 41010
diff changeset
  1211
                    = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_FILL_ORDER);
3fa9da09d5b6 8154093: [TIFF] NPE when reading LZW-compressed image
bpb
parents: 41010
diff changeset
  1212
            int fillOrder = ((fillOrderField == null)
3fa9da09d5b6 8154093: [TIFF] NPE when reading LZW-compressed image
bpb
parents: 41010
diff changeset
  1213
                    ? BaselineTIFFTagSet.FILL_ORDER_LEFT_TO_RIGHT
3fa9da09d5b6 8154093: [TIFF] NPE when reading LZW-compressed image
bpb
parents: 41010
diff changeset
  1214
                    : fillOrderField.getAsInt(0));
3fa9da09d5b6 8154093: [TIFF] NPE when reading LZW-compressed image
bpb
parents: 41010
diff changeset
  1215
3fa9da09d5b6 8154093: [TIFF] NPE when reading LZW-compressed image
bpb
parents: 41010
diff changeset
  1216
            this.decompressor = new TIFFLZWDecompressor(predictor, fillOrder);
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1217
        } else if (compression
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1218
                == BaselineTIFFTagSet.COMPRESSION_JPEG) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1219
            this.decompressor = new TIFFJPEGDecompressor();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1220
        } else if (compression
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1221
                == BaselineTIFFTagSet.COMPRESSION_ZLIB
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1222
                || compression
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1223
                == BaselineTIFFTagSet.COMPRESSION_DEFLATE) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1224
            TIFFField predictorField
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1225
                    = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_PREDICTOR);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1226
            int predictor = ((predictorField == null)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1227
                    ? BaselineTIFFTagSet.PREDICTOR_NONE
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1228
                    : predictorField.getAsInt(0));
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1229
            this.decompressor = new TIFFDeflateDecompressor(predictor);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1230
        } else if (compression
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1231
                == BaselineTIFFTagSet.COMPRESSION_OLD_JPEG) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1232
            TIFFField JPEGProcField
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1233
                    = imageMetadata.getTIFFField(BaselineTIFFTagSet.TAG_JPEG_PROC);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1234
            if (JPEGProcField == null) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1235
                processWarningOccurred("JPEGProc field missing; assuming baseline sequential JPEG process.");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1236
            } else if (JPEGProcField.getAsInt(0)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1237
                    != BaselineTIFFTagSet.JPEG_PROC_BASELINE) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1238
                throw new IIOException("Old-style JPEG supported for baseline sequential JPEG process only!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1239
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1240
            this.decompressor = new TIFFOldJPEGDecompressor();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1241
            //throw new IIOException("Old-style JPEG not supported!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1242
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1243
            throw new IIOException("Unsupported compression type (tag value = "
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1244
                    + compression + ")!");
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1245
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1246
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1247
        if (photometricInterpretation
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1248
                == BaselineTIFFTagSet.PHOTOMETRIC_INTERPRETATION_Y_CB_CR
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1249
                && compression != BaselineTIFFTagSet.COMPRESSION_JPEG
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1250
                && compression != BaselineTIFFTagSet.COMPRESSION_OLD_JPEG) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1251
            boolean convertYCbCrToRGB
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1252
                    = theImage.getColorModel().getColorSpace().getType()
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1253
                    == ColorSpace.TYPE_RGB;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1254
            TIFFDecompressor wrappedDecompressor
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1255
                    = this.decompressor instanceof TIFFNullDecompressor
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1256
                            ? null : this.decompressor;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1257
            this.decompressor
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1258
                    = new TIFFYCbCrDecompressor(wrappedDecompressor,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1259
                            convertYCbCrToRGB);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1260
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1261
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1262
        TIFFColorConverter colorConverter = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1263
        if (photometricInterpretation
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1264
                == BaselineTIFFTagSet.PHOTOMETRIC_INTERPRETATION_CIELAB
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1265
                && theImage.getColorModel().getColorSpace().getType()
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1266
                == ColorSpace.TYPE_RGB) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1267
            colorConverter = new TIFFCIELabColorConverter();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1268
        } else if (photometricInterpretation
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1269
                == BaselineTIFFTagSet.PHOTOMETRIC_INTERPRETATION_Y_CB_CR
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1270
                && !(this.decompressor instanceof TIFFYCbCrDecompressor)
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1271
                && compression != BaselineTIFFTagSet.COMPRESSION_JPEG
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1272
                && compression != BaselineTIFFTagSet.COMPRESSION_OLD_JPEG) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1273
            colorConverter = new TIFFYCbCrColorConverter(imageMetadata);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1274
        }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1275
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1276
        decompressor.setReader(this);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1277
        decompressor.setMetadata(imageMetadata);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1278
        decompressor.setImage(theImage);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1279
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1280
        decompressor.setPhotometricInterpretation(photometricInterpretation);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1281
        decompressor.setCompression(compression);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1282
        decompressor.setSamplesPerPixel(samplesPerPixel);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1283
        decompressor.setBitsPerSample(bitsPerSample);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1284
        decompressor.setSampleFormat(sampleFormat);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1285
        decompressor.setExtraSamples(extraSamples);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1286
        decompressor.setColorMap(colorMap);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1287
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1288
        decompressor.setColorConverter(colorConverter);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1289
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1290
        decompressor.setSourceXOffset(sourceXOffset);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1291
        decompressor.setSourceYOffset(sourceYOffset);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1292
        decompressor.setSubsampleX(srcXSubsampling);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1293
        decompressor.setSubsampleY(srcYSubsampling);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1294
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1295
        decompressor.setDstXOffset(dstXOffset);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1296
        decompressor.setDstYOffset(dstYOffset);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1297
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1298
        decompressor.setSourceBands(sourceBands);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1299
        decompressor.setDestinationBands(destinationBands);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1300
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1301
        // Compute bounds on the tile indices for this source region.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1302
        int minTileX
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1303
                = TIFFImageWriter.XToTileX(srcRegion.x, 0, tileOrStripWidth);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1304
        int minTileY
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1305
                = TIFFImageWriter.YToTileY(srcRegion.y, 0, tileOrStripHeight);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1306
        int maxTileX
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1307
                = TIFFImageWriter.XToTileX(srcRegion.x + srcRegion.width - 1,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1308
                        0, tileOrStripWidth);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1309
        int maxTileY
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1310
                = TIFFImageWriter.YToTileY(srcRegion.y + srcRegion.height - 1,
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1311
                        0, tileOrStripHeight);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1312
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1313
        if (planarConfiguration
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1314
                == BaselineTIFFTagSet.PLANAR_CONFIGURATION_PLANAR) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1315
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1316
            decompressor.setPlanar(true);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1317
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1318
            int[] sb = new int[1];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1319
            int[] db = new int[1];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1320
            for (int tj = minTileY; tj <= maxTileY; tj++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1321
                for (int ti = minTileX; ti <= maxTileX; ti++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1322
                    for (int band = 0; band < numBands; band++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1323
                        sb[0] = sourceBands[band];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1324
                        decompressor.setSourceBands(sb);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1325
                        db[0] = destinationBands[band];
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1326
                        decompressor.setDestinationBands(db);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1327
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1328
                        decodeTile(ti, tj, band);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1329
                    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1330
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1331
                    reportProgress();
41010
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1332
                    if (abortRequested()) {
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1333
                        processReadAborted();
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1334
                        return theImage;
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1335
                    }
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1336
                }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1337
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1338
        } else {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1339
            for (int tj = minTileY; tj <= maxTileY; tj++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1340
                for (int ti = minTileX; ti <= maxTileX; ti++) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1341
                    decodeTile(ti, tj, -1);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1342
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1343
                    reportProgress();
41010
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1344
                    if (abortRequested()) {
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1345
                        processReadAborted();
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1346
                        return theImage;
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1347
                    }
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1348
                }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1349
            }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1350
        }
41010
9824689edeb1 4924727: reader.abort() method does not work when called inside imageStarted for PNG
jdv
parents: 40438
diff changeset
  1351
        processImageComplete();
34416
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1352
        return theImage;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1353
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1354
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1355
    public void reset() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1356
        super.reset();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1357
        resetLocal();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1358
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1359
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1360
    protected void resetLocal() {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1361
        stream = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1362
        gotHeader = false;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1363
        imageReadParam = getDefaultReadParam();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1364
        streamMetadata = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1365
        currIndex = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1366
        imageMetadata = null;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1367
        imageStartPosition = new ArrayList<Long>();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1368
        numImages = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1369
        imageTypeMap = new HashMap<Integer, List<ImageTypeSpecifier>>();
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1370
        width = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1371
        height = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1372
        numBands = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1373
        tileOrStripWidth = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1374
        tileOrStripHeight = -1;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1375
        planarConfiguration = BaselineTIFFTagSet.PLANAR_CONFIGURATION_CHUNKY;
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1376
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1377
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1378
    /**
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1379
     * Package scope method to allow decompressors, for example, to emit warning
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1380
     * messages.
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1381
     */
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1382
    void forwardWarningMessage(String warning) {
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1383
        processWarningOccurred(warning);
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1384
    }
68c0d866db5d 8143342: Integrate Java Image I/O support for TIFF per JEP 262
bpb
parents:
diff changeset
  1385
}