< prev index next >
src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java
Print this page
*** 47,56 ****
--- 47,102 ----
private long stripOrTileByteCountsPosition = -1;
private long stripOrTileOffsetsPosition = -1;
private long lastPosition = -1;
+ //
+ // A set of tag numbers corresponding to tags essential to decoding
+ // the image and metadata required to interpret its samples.
+ //
+ private static volatile Set<Integer> essentialTags = null;
+
+ private static void initializeEssentialTags() {
+ Set<Integer> tags = essentialTags;
+ if (tags == null) {
+ essentialTags = tags = Set.of(
+ BaselineTIFFTagSet.TAG_BITS_PER_SAMPLE,
+ BaselineTIFFTagSet.TAG_COLOR_MAP,
+ BaselineTIFFTagSet.TAG_COMPRESSION,
+ BaselineTIFFTagSet.TAG_EXTRA_SAMPLES,
+ BaselineTIFFTagSet.TAG_FILL_ORDER,
+ BaselineTIFFTagSet.TAG_ICC_PROFILE,
+ BaselineTIFFTagSet.TAG_IMAGE_LENGTH,
+ BaselineTIFFTagSet.TAG_IMAGE_WIDTH,
+ BaselineTIFFTagSet.TAG_JPEG_AC_TABLES,
+ BaselineTIFFTagSet.TAG_JPEG_DC_TABLES,
+ BaselineTIFFTagSet.TAG_JPEG_INTERCHANGE_FORMAT,
+ BaselineTIFFTagSet.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH,
+ BaselineTIFFTagSet.TAG_JPEG_PROC,
+ BaselineTIFFTagSet.TAG_JPEG_Q_TABLES,
+ BaselineTIFFTagSet.TAG_JPEG_RESTART_INTERVAL,
+ BaselineTIFFTagSet.TAG_JPEG_TABLES,
+ BaselineTIFFTagSet.TAG_PHOTOMETRIC_INTERPRETATION,
+ BaselineTIFFTagSet.TAG_PLANAR_CONFIGURATION,
+ BaselineTIFFTagSet.TAG_PREDICTOR,
+ BaselineTIFFTagSet.TAG_REFERENCE_BLACK_WHITE,
+ BaselineTIFFTagSet.TAG_ROWS_PER_STRIP,
+ BaselineTIFFTagSet.TAG_SAMPLES_PER_PIXEL,
+ BaselineTIFFTagSet.TAG_SAMPLE_FORMAT,
+ BaselineTIFFTagSet.TAG_STRIP_BYTE_COUNTS,
+ BaselineTIFFTagSet.TAG_STRIP_OFFSETS,
+ BaselineTIFFTagSet.TAG_T4_OPTIONS,
+ BaselineTIFFTagSet.TAG_T6_OPTIONS,
+ BaselineTIFFTagSet.TAG_TILE_BYTE_COUNTS,
+ BaselineTIFFTagSet.TAG_TILE_LENGTH,
+ BaselineTIFFTagSet.TAG_TILE_OFFSETS,
+ BaselineTIFFTagSet.TAG_TILE_WIDTH,
+ BaselineTIFFTagSet.TAG_Y_CB_CR_COEFFICIENTS,
+ BaselineTIFFTagSet.TAG_Y_CB_CR_SUBSAMPLING
+ );
+ }
+ }
/**
* Converts a {@code TIFFDirectory} to a {@code TIFFIFD}.
*/
public static TIFFIFD getDirectoryAsIFD(TIFFDirectory dir) {
*** 505,514 ****
--- 551,569 ----
long streamLength = stream.length();
boolean haveStreamLength = streamLength != -1;
List<TIFFTagSet> tagSetList = getTagSetList();
+ boolean ensureEssentialTags = false;
+ TIFFTagSet baselineTagSet = null;
+ if (isPrimaryIFD && ignoreUnknownFields
+ && !tagSetList.contains(BaselineTIFFTagSet.getInstance())) {
+ ensureEssentialTags = true;
+ initializeEssentialTags();
+ baselineTagSet = BaselineTIFFTagSet.getInstance();
+ }
+
List<Object> entries = new ArrayList<>();
Object[] entryData = new Object[1]; // allocate once for later reuse.
// Read the IFD entries, loading the field values which are no more than
// four bytes long, and storing the 4-byte offsets for the others.
*** 528,537 ****
--- 583,597 ----
long longCount = stream.readUnsignedInt();
// Get the associated TIFFTag.
TIFFTag tag = getTag(tagNumber, tagSetList);
+ if (tag == null && ensureEssentialTags
+ && essentialTags.contains(tagNumber)) {
+ tag = baselineTagSet.getTag(tagNumber);
+ }
+
// Ignore unknown fields, fields with unknown type, and fields
// with count out of int range.
if((tag == null && ignoreUnknownFields)
|| (tag != null && !tag.isDataTypeOK(type))
|| longCount > Integer.MAX_VALUE) {
< prev index next >