src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java
Print this page
rev 9230 : imported patch 8033716
@@ -50,10 +50,11 @@
import java.util.ListIterator;
import java.io.IOException;
import java.awt.color.ICC_Profile;
import java.awt.color.ICC_ColorSpace;
import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.Point;
/**
* Metadata for the JPEG plug-in.
@@ -67,11 +68,11 @@
/**
* A copy of <code>markerSequence</code>, created the first time the
* <code>markerSequence</code> is modified. This is used by reset
* to restore the original state.
*/
- private List resetSequence = null;
+ private List<MarkerSegment> resetSequence = null;
/**
* Set to <code>true</code> when reading a thumbnail stored as
* JPEG. This is used to enforce the prohibition of JFIF thumbnails
* containing any JFIF marker segments, and to ensure generation of
@@ -98,11 +99,11 @@
* of the list if it is present, and any JFXX or APP2ICC marker
* segments are subordinate to the JFIF marker segment. This
* list is package visible so that the writer can access it.
* @see #MarkerSegment
*/
- List markerSequence = new ArrayList();
+ List<MarkerSegment> markerSequence = new ArrayList<>();
/**
* Indicates whether this object represents stream or image
* metadata. Package-visible so the writer can see it.
*/
@@ -643,13 +644,13 @@
/**
* Returns the first MarkerSegment object in the list
* with the given tag, or null if none is found.
*/
MarkerSegment findMarkerSegment(int tag) {
- Iterator iter = markerSequence.iterator();
+ Iterator<MarkerSegment> iter = markerSequence.iterator();
while (iter.hasNext()) {
- MarkerSegment seg = (MarkerSegment)iter.next();
+ MarkerSegment seg = iter.next();
if (seg.tag == tag) {
return seg;
}
}
return null;
@@ -657,23 +658,23 @@
/**
* Returns the first or last MarkerSegment object in the list
* of the given class, or null if none is found.
*/
- MarkerSegment findMarkerSegment(Class cls, boolean first) {
+ MarkerSegment findMarkerSegment(Class<? extends MarkerSegment> cls, boolean first) {
if (first) {
- Iterator iter = markerSequence.iterator();
+ Iterator<MarkerSegment> iter = markerSequence.iterator();
while (iter.hasNext()) {
- MarkerSegment seg = (MarkerSegment)iter.next();
+ MarkerSegment seg = iter.next();
if (cls.isInstance(seg)) {
return seg;
}
}
} else {
- ListIterator iter = markerSequence.listIterator(markerSequence.size());
+ ListIterator<MarkerSegment> iter = markerSequence.listIterator(markerSequence.size());
while (iter.hasPrevious()) {
- MarkerSegment seg = (MarkerSegment)iter.previous();
+ MarkerSegment seg = iter.previous();
if (cls.isInstance(seg)) {
return seg;
}
}
}
@@ -682,35 +683,35 @@
/**
* Returns the index of the first or last MarkerSegment in the list
* of the given class, or -1 if none is found.
*/
- private int findMarkerSegmentPosition(Class cls, boolean first) {
+ private int findMarkerSegmentPosition(Class<? extends MarkerSegment> cls, boolean first) {
if (first) {
- ListIterator iter = markerSequence.listIterator();
+ ListIterator<MarkerSegment> iter = markerSequence.listIterator();
for (int i = 0; iter.hasNext(); i++) {
- MarkerSegment seg = (MarkerSegment)iter.next();
+ MarkerSegment seg = iter.next();
if (cls.isInstance(seg)) {
return i;
}
}
} else {
- ListIterator iter = markerSequence.listIterator(markerSequence.size());
+ ListIterator<MarkerSegment> iter = markerSequence.listIterator(markerSequence.size());
for (int i = markerSequence.size()-1; iter.hasPrevious(); i--) {
- MarkerSegment seg = (MarkerSegment)iter.previous();
+ MarkerSegment seg = iter.previous();
if (cls.isInstance(seg)) {
return i;
}
}
}
return -1;
}
private int findLastUnknownMarkerSegmentPosition() {
- ListIterator iter = markerSequence.listIterator(markerSequence.size());
+ ListIterator<MarkerSegment> iter = markerSequence.listIterator(markerSequence.size());
for (int i = markerSequence.size()-1; iter.hasPrevious(); i--) {
- MarkerSegment seg = (MarkerSegment)iter.previous();
+ MarkerSegment seg = iter.previous();
if (seg.unknown == true) {
return i;
}
}
return -1;
@@ -731,18 +732,18 @@
}
/**
* Returns a deep copy of the current marker sequence.
*/
- private List cloneSequence() {
+ private List<MarkerSegment> cloneSequence() {
if (markerSequence == null) {
return null;
}
- List retval = new ArrayList(markerSequence.size());
- Iterator iter = markerSequence.iterator();
+ List<MarkerSegment> retval = new ArrayList<>(markerSequence.size());
+ Iterator<MarkerSegment> iter = markerSequence.iterator();
while(iter.hasNext()) {
- MarkerSegment seg = (MarkerSegment)iter.next();
+ MarkerSegment seg = iter.next();
retval.add(seg.clone());
}
return retval;
}
@@ -772,11 +773,11 @@
}
IIOMetadataNode getNativeTree() {
IIOMetadataNode root;
IIOMetadataNode top;
- Iterator iter = markerSequence.iterator();
+ Iterator<MarkerSegment> iter = markerSequence.iterator();
if (isStream) {
root = new IIOMetadataNode(JPEG.nativeStreamMetadataFormatName);
top = root;
} else {
IIOMetadataNode sequence = new IIOMetadataNode("markerSequence");
@@ -795,11 +796,11 @@
root = sequence;
}
top = sequence;
}
while(iter.hasNext()) {
- MarkerSegment seg = (MarkerSegment) iter.next();
+ MarkerSegment seg = iter.next();
top.appendChild(seg.getNativeNode());
}
return root;
}
@@ -959,13 +960,13 @@
lossless.setAttribute("value", "FALSE");
compression.appendChild(lossless);
// NumProgressiveScans - count sos segments
int sosCount = 0;
- Iterator iter = markerSequence.iterator();
+ Iterator<MarkerSegment> iter = markerSequence.iterator();
while (iter.hasNext()) {
- MarkerSegment ms = (MarkerSegment) iter.next();
+ MarkerSegment ms = iter.next();
if (ms.tag == JPEG.SOS) {
sosCount++;
}
}
if (sosCount != 0) {
@@ -1026,13 +1027,13 @@
protected IIOMetadataNode getStandardTextNode() {
IIOMetadataNode text = null;
// Add a text entry for each COM Marker Segment
if (findMarkerSegment(JPEG.COM) != null) {
text = new IIOMetadataNode("Text");
- Iterator iter = markerSequence.iterator();
+ Iterator<MarkerSegment> iter = markerSequence.iterator();
while (iter.hasNext()) {
- MarkerSegment seg = (MarkerSegment) iter.next();
+ MarkerSegment seg = iter.next();
if (seg.tag == JPEG.COM) {
COMMarkerSegment com = (COMMarkerSegment) seg;
IIOMetadataNode entry = new IIOMetadataNode("TextEntry");
entry.setAttribute("keyword", "comment");
entry.setAttribute("value", com.getComment());
@@ -1066,11 +1067,11 @@
throw new IllegalArgumentException("null formatName!");
}
if (root == null) {
throw new IllegalArgumentException("null root!");
}
- List copy = null;
+ List<MarkerSegment> copy = null;
if (resetSequence == null) {
resetSequence = cloneSequence(); // Deep copy
copy = resetSequence; // Avoid cloning twice
} else {
copy = cloneSequence();
@@ -1179,16 +1180,16 @@
* If there is no SOS segment, the new DQT segment is added to the end
* of the sequence.
*/
private void mergeDQTNode(Node node) throws IIOInvalidTreeException {
// First collect any existing DQT nodes into a local list
- ArrayList oldDQTs = new ArrayList();
- Iterator iter = markerSequence.iterator();
+ ArrayList<DQTMarkerSegment> oldDQTs = new ArrayList<>();
+ Iterator<MarkerSegment> iter = markerSequence.iterator();
while (iter.hasNext()) {
- MarkerSegment seg = (MarkerSegment) iter.next();
+ MarkerSegment seg = iter.next();
if (seg instanceof DQTMarkerSegment) {
- oldDQTs.add(seg);
+ oldDQTs.add((DQTMarkerSegment) seg);
}
}
if (!oldDQTs.isEmpty()) {
NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
@@ -1199,14 +1200,13 @@
0, 3,
true);
DQTMarkerSegment dqt = null;
int tableIndex = -1;
for (int j = 0; j < oldDQTs.size(); j++) {
- DQTMarkerSegment testDQT = (DQTMarkerSegment) oldDQTs.get(j);
+ DQTMarkerSegment testDQT = oldDQTs.get(j);
for (int k = 0; k < testDQT.tables.size(); k++) {
- DQTMarkerSegment.Qtable testTable =
- (DQTMarkerSegment.Qtable) testDQT.tables.get(k);
+ DQTMarkerSegment.Qtable testTable = testDQT.tables.get(k);
if (childID == testTable.tableID) {
dqt = testDQT;
tableIndex = k;
break;
}
@@ -1214,11 +1214,11 @@
if (dqt != null) break;
}
if (dqt != null) {
dqt.tables.set(tableIndex, dqt.getQtableFromNode(child));
} else {
- dqt = (DQTMarkerSegment) oldDQTs.get(oldDQTs.size()-1);
+ dqt = oldDQTs.get(oldDQTs.size()-1);
dqt.tables.add(dqt.getQtableFromNode(child));
}
}
} else {
DQTMarkerSegment newGuy = new DQTMarkerSegment(node);
@@ -1255,16 +1255,16 @@
* If there is no SOS segment, the new DHT segment is added to the end
* of the sequence.
*/
private void mergeDHTNode(Node node) throws IIOInvalidTreeException {
// First collect any existing DQT nodes into a local list
- ArrayList oldDHTs = new ArrayList();
- Iterator iter = markerSequence.iterator();
+ ArrayList<DHTMarkerSegment> oldDHTs = new ArrayList<>();
+ Iterator<MarkerSegment> iter = markerSequence.iterator();
while (iter.hasNext()) {
- MarkerSegment seg = (MarkerSegment) iter.next();
+ MarkerSegment seg = iter.next();
if (seg instanceof DHTMarkerSegment) {
- oldDHTs.add(seg);
+ oldDHTs.add((DHTMarkerSegment) seg);
}
}
if (!oldDHTs.isEmpty()) {
NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
@@ -1281,14 +1281,13 @@
0, 1,
true);
DHTMarkerSegment dht = null;
int tableIndex = -1;
for (int j = 0; j < oldDHTs.size(); j++) {
- DHTMarkerSegment testDHT = (DHTMarkerSegment) oldDHTs.get(j);
+ DHTMarkerSegment testDHT = oldDHTs.get(j);
for (int k = 0; k < testDHT.tables.size(); k++) {
- DHTMarkerSegment.Htable testTable =
- (DHTMarkerSegment.Htable) testDHT.tables.get(k);
+ DHTMarkerSegment.Htable testTable = testDHT.tables.get(k);
if ((childID == testTable.tableID) &&
(childClass == testTable.tableClass)) {
dht = testDHT;
tableIndex = k;
break;
@@ -1297,11 +1296,11 @@
if (dht != null) break;
}
if (dht != null) {
dht.tables.set(tableIndex, dht.getHtableFromNode(child));
} else {
- dht = (DHTMarkerSegment) oldDHTs.get(oldDHTs.size()-1);
+ dht = oldDHTs.get(oldDHTs.size()-1);
dht.tables.add(dht.getHtableFromNode(child));
}
}
} else {
DHTMarkerSegment newGuy = new DHTMarkerSegment(node);
@@ -1733,12 +1732,12 @@
idsDiffer = true;
}
}
if (idsDiffer) {
// update the ids in each SOS marker segment
- for (Iterator iter = markerSequence.iterator(); iter.hasNext();) {
- MarkerSegment seg = (MarkerSegment) iter.next();
+ for (Iterator<MarkerSegment> iter = markerSequence.iterator(); iter.hasNext();) {
+ MarkerSegment seg = iter.next();
if (seg instanceof SOSMarkerSegment) {
SOSMarkerSegment target = (SOSMarkerSegment) seg;
for (int i = 0; i < target.componentSpecs.length; i++) {
int oldSelector =
target.componentSpecs[i].componentSelector;
@@ -1786,15 +1785,15 @@
updateHtables = true;
}
}
if (updateQtables) {
- List tableSegments = new ArrayList();
- for (Iterator iter = markerSequence.iterator(); iter.hasNext();) {
- MarkerSegment seg = (MarkerSegment) iter.next();
+ List<DQTMarkerSegment> tableSegments = new ArrayList<>();
+ for (Iterator<MarkerSegment> iter = markerSequence.iterator(); iter.hasNext();) {
+ MarkerSegment seg = iter.next();
if (seg instanceof DQTMarkerSegment) {
- tableSegments.add(seg);
+ tableSegments.add((DQTMarkerSegment) seg);
}
}
// If there are no tables, don't add them, as the metadata encodes an
// abbreviated stream.
// If we are not subsampling, we just need one, so don't do anything
@@ -1804,52 +1803,49 @@
// luminance table, extract the scaling factor, and generate a
// scaled "standard" chrominance table.
// Find the table with selector 1.
boolean found = false;
- for (Iterator iter = tableSegments.iterator(); iter.hasNext();) {
- DQTMarkerSegment testdqt = (DQTMarkerSegment) iter.next();
- for (Iterator tabiter = testdqt.tables.iterator();
+ for (Iterator<DQTMarkerSegment> iter = tableSegments.iterator(); iter.hasNext();) {
+ DQTMarkerSegment testdqt = iter.next();
+ for (Iterator<DQTMarkerSegment.Qtable> tabiter = testdqt.tables.iterator();
tabiter.hasNext();) {
- DQTMarkerSegment.Qtable tab =
- (DQTMarkerSegment.Qtable) tabiter.next();
+ DQTMarkerSegment.Qtable tab = tabiter.next();
if (tab.tableID == 1) {
found = true;
}
}
}
if (!found) {
// find the table with selector 0. There should be one.
DQTMarkerSegment.Qtable table0 = null;
- for (Iterator iter = tableSegments.iterator(); iter.hasNext();) {
- DQTMarkerSegment testdqt = (DQTMarkerSegment) iter.next();
- for (Iterator tabiter = testdqt.tables.iterator();
+ for (Iterator<DQTMarkerSegment> iter = tableSegments.iterator(); iter.hasNext();) {
+ DQTMarkerSegment testdqt = iter.next();
+ for (Iterator<DQTMarkerSegment.Qtable> tabiter = testdqt.tables.iterator();
tabiter.hasNext();) {
- DQTMarkerSegment.Qtable tab =
- (DQTMarkerSegment.Qtable) tabiter.next();
+ DQTMarkerSegment.Qtable tab = tabiter.next();
if (tab.tableID == 0) {
table0 = tab;
}
}
}
// Assuming that the table with id 0 is a luminance table,
// compute a new chrominance table of the same quality and
// add it to the last DQT segment
- DQTMarkerSegment dqt =
- (DQTMarkerSegment) tableSegments.get(tableSegments.size()-1);
+ DQTMarkerSegment dqt = tableSegments.get(tableSegments.size()-1);
dqt.tables.add(dqt.getChromaForLuma(table0));
}
}
}
if (updateHtables) {
- List tableSegments = new ArrayList();
- for (Iterator iter = markerSequence.iterator(); iter.hasNext();) {
- MarkerSegment seg = (MarkerSegment) iter.next();
+ List<DHTMarkerSegment> tableSegments = new ArrayList<>();
+ for (Iterator<MarkerSegment> iter = markerSequence.iterator(); iter.hasNext();) {
+ MarkerSegment seg = iter.next();
if (seg instanceof DHTMarkerSegment) {
- tableSegments.add(seg);
+ tableSegments.add((DHTMarkerSegment) seg);
}
}
// If there are no tables, don't add them, as the metadata encodes an
// abbreviated stream.
// If we are not subsampling, we just need one, so don't do anything
@@ -1858,26 +1854,25 @@
// tables. If there is only one, add a
// "standard " chrominance table.
// find a table with selector 1. AC/DC is irrelevant
boolean found = false;
- for (Iterator iter = tableSegments.iterator(); iter.hasNext();) {
- DHTMarkerSegment testdht = (DHTMarkerSegment) iter.next();
- for (Iterator tabiter = testdht.tables.iterator();
+ for (Iterator<DHTMarkerSegment> iter = tableSegments.iterator(); iter.hasNext();) {
+ DHTMarkerSegment testdht = iter.next();
+ for (Iterator<DHTMarkerSegment.Htable> tabiter = testdht.tables.iterator();
tabiter.hasNext();) {
- DHTMarkerSegment.Htable tab =
- (DHTMarkerSegment.Htable) tabiter.next();
+ DHTMarkerSegment.Htable tab = tabiter.next();
if (tab.tableID == 1) {
found = true;
}
}
}
if (!found) {
// Create new standard dc and ac chrominance tables and add them
// to the last DHT segment
DHTMarkerSegment lastDHT =
- (DHTMarkerSegment) tableSegments.get(tableSegments.size()-1);
+ tableSegments.get(tableSegments.size()-1);
lastDHT.addHtable(JPEGHuffmanTable.StdDCLuminance, true, 1);
lastDHT.addHtable(JPEGHuffmanTable.StdACLuminance, true, 1);
}
}
}
@@ -2179,11 +2174,11 @@
private void setFromNativeTree(Node root) throws IIOInvalidTreeException {
if (resetSequence == null) {
resetSequence = markerSequence;
}
- markerSequence = new ArrayList();
+ markerSequence = new ArrayList<>();
// Build a whole new marker sequence from the tree
String name = root.getNodeName();
if (name != ((isStream) ? JPEG.nativeStreamMetadataFormatName
@@ -2308,14 +2303,14 @@
/**
* Returns the total number of bands referenced in all SOS marker
* segments, including 0 if there are no SOS marker segments.
*/
private int countScanBands() {
- List ids = new ArrayList();
- Iterator iter = markerSequence.iterator();
+ List<Integer> ids = new ArrayList<>();
+ Iterator<MarkerSegment> iter = markerSequence.iterator();
while(iter.hasNext()) {
- MarkerSegment seg = (MarkerSegment)iter.next();
+ MarkerSegment seg = iter.next();
if (seg instanceof SOSMarkerSegment) {
SOSMarkerSegment sos = (SOSMarkerSegment) seg;
SOSMarkerSegment.ScanComponentSpec [] specs = sos.componentSpecs;
for (int i = 0; i < specs.length; i++) {
Integer id = new Integer(specs[i].componentSelector);
@@ -2332,11 +2327,11 @@
///// Writer support
void writeToStream(ImageOutputStream ios,
boolean ignoreJFIF,
boolean forceJFIF,
- List thumbnails,
+ List<? extends BufferedImage> thumbnails,
ICC_Profile iccProfile,
boolean ignoreAdobe,
int newAdobeTransform,
JPEGImageWriter writer)
throws IOException {
@@ -2358,13 +2353,13 @@
(JPEGImageWriter.WARNING_METADATA_ADJUSTED_FOR_THUMB);
}
}
}
// Iterate over each MarkerSegment
- Iterator iter = markerSequence.iterator();
+ Iterator<MarkerSegment> iter = markerSequence.iterator();
while(iter.hasNext()) {
- MarkerSegment seg = (MarkerSegment)iter.next();
+ MarkerSegment seg = iter.next();
if (seg instanceof JFIFMarkerSegment) {
if (ignoreJFIF == false) {
JFIFMarkerSegment jfif = (JFIFMarkerSegment) seg;
jfif.writeWithThumbs(ios, thumbnails, writer);
if (iccProfile != null) {
@@ -2407,11 +2402,11 @@
}
}
public void print() {
for (int i = 0; i < markerSequence.size(); i++) {
- MarkerSegment seg = (MarkerSegment) markerSequence.get(i);
+ MarkerSegment seg = markerSequence.get(i);
seg.print();
}
}
}