|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package com.sun.imageio.plugins.jpeg; |
|
|
|
import javax.imageio.metadata.IIOMetadataFormat; |
|
import javax.imageio.metadata.IIOMetadataFormatImpl; |
|
import javax.imageio.ImageTypeSpecifier; |
|
|
|
import java.awt.color.ICC_Profile; |
|
import java.awt.color.ColorSpace; |
|
import java.awt.image.ColorModel; |
|
|
|
import java.util.List; |
|
import java.util.ArrayList; |
|
|
|
public class JPEGImageMetadataFormat extends JPEGMetadataFormat { |
|
|
|
private static JPEGImageMetadataFormat theInstance = null; |
|
|
|
private JPEGImageMetadataFormat() { |
|
super(JPEG.nativeImageMetadataFormatName, |
|
CHILD_POLICY_ALL); |
|
|
|
addElement("JPEGvariety", |
|
JPEG.nativeImageMetadataFormatName, |
|
CHILD_POLICY_CHOICE); |
|
|
|
addElement("markerSequence", |
|
JPEG.nativeImageMetadataFormatName, |
|
CHILD_POLICY_SEQUENCE); |
|
|
|
addElement("app0JFIF", "JPEGvariety", CHILD_POLICY_SOME); |
|
|
|
addStreamElements("markerSequence"); |
|
|
|
addElement("app14Adobe", "markerSequence", CHILD_POLICY_EMPTY); |
|
|
|
addElement("sof", "markerSequence", 1, 4); |
|
|
|
addElement("sos", "markerSequence", 1, 4); |
|
|
|
addElement("JFXX", "app0JFIF", 1, Integer.MAX_VALUE); |
|
|
|
addElement("app0JFXX", "JFXX", CHILD_POLICY_CHOICE); |
|
|
|
addElement("app2ICC", "app0JFIF", CHILD_POLICY_EMPTY); |
|
|
|
addAttribute("app0JFIF", |
|
"majorVersion", |
|
DATATYPE_INTEGER, |
|
false, |
|
"1", |
|
"0", "255", |
|
true, true); |
|
addAttribute("app0JFIF", |
|
"minorVersion", |
|
DATATYPE_INTEGER, |
|
false, |
|
"2", |
|
"0", "255", |
|
true, true); |
|
List resUnits = new ArrayList(); |
|
resUnits.add("0"); |
|
resUnits.add("1"); |
|
resUnits.add("2"); |
|
addAttribute("app0JFIF", |
|
"resUnits", |
|
DATATYPE_INTEGER, |
|
false, |
|
"0", |
|
resUnits); |
|
addAttribute("app0JFIF", |
|
"Xdensity", |
|
DATATYPE_INTEGER, |
|
false, |
|
"1", |
|
"1", "65535", |
|
true, true); |
|
addAttribute("app0JFIF", |
|
"Ydensity", |
|
DATATYPE_INTEGER, |
|
false, |
|
"1", |
|
"1", "65535", |
|
true, true); |
|
addAttribute("app0JFIF", |
|
"thumbWidth", |
|
DATATYPE_INTEGER, |
|
false, |
|
"0", |
|
"0", "255", |
|
true, true); |
|
addAttribute("app0JFIF", |
|
"thumbHeight", |
|
DATATYPE_INTEGER, |
|
false, |
|
"0", |
|
"0", "255", |
|
true, true); |
|
|
|
addElement("JFIFthumbJPEG", "app0JFXX", CHILD_POLICY_SOME); |
|
addElement("JFIFthumbPalette", "app0JFXX", CHILD_POLICY_EMPTY); |
|
addElement("JFIFthumbRGB", "app0JFXX", CHILD_POLICY_EMPTY); |
|
|
|
List codes = new ArrayList(); |
|
codes.add("16"); |
|
codes.add("17"); |
|
codes.add("19"); |
|
addAttribute("app0JFXX", |
|
"extensionCode", |
|
DATATYPE_INTEGER, |
|
false, |
|
null, |
|
codes); |
|
|
|
addChildElement("markerSequence", "JFIFthumbJPEG"); |
|
|
|
addAttribute("JFIFthumbPalette", |
|
"thumbWidth", |
|
DATATYPE_INTEGER, |
|
false, |
|
null, |
|
"0", "255", |
|
true, true); |
|
addAttribute("JFIFthumbPalette", |
|
"thumbHeight", |
|
DATATYPE_INTEGER, |
|
false, |
|
null, |
|
"0", "255", |
|
true, true); |
|
|
|
addAttribute("JFIFthumbRGB", |
|
"thumbWidth", |
|
DATATYPE_INTEGER, |
|
false, |
|
null, |
|
"0", "255", |
|
true, true); |
|
addAttribute("JFIFthumbRGB", |
|
"thumbHeight", |
|
DATATYPE_INTEGER, |
|
false, |
|
null, |
|
"0", "255", |
|
true, true); |
|
|
|
addObjectValue("app2ICC", ICC_Profile.class, false, null); |
|
|
|
addAttribute("app14Adobe", |
|
"version", |
|
DATATYPE_INTEGER, |
|
false, |
|
"100", |
|
"100", "255", |
|
true, true); |
|
addAttribute("app14Adobe", |
|
"flags0", |
|
DATATYPE_INTEGER, |
|
false, |
|
"0", |
|
"0", "65535", |
|
true, true); |
|
addAttribute("app14Adobe", |
|
"flags1", |
|
DATATYPE_INTEGER, |
|
false, |
|
"0", |
|
"0", "65535", |
|
true, true); |
|
|
|
List transforms = new ArrayList(); |
|
transforms.add("0"); |
|
transforms.add("1"); |
|
transforms.add("2"); |
|
addAttribute("app14Adobe", |
|
"transform", |
|
DATATYPE_INTEGER, |
|
true, |
|
null, |
|
transforms); |
|
|
|
addElement("componentSpec", "sof", CHILD_POLICY_EMPTY); |
|
|
|
List procs = new ArrayList(); |
|
procs.add("0"); |
|
procs.add("1"); |
|
procs.add("2"); |
|
addAttribute("sof", |
|
"process", |
|
DATATYPE_INTEGER, |
|
false, |
|
null, |
|
procs); |
|
addAttribute("sof", |
|
"samplePrecision", |
|
DATATYPE_INTEGER, |
|
false, |
|
"8"); |
|
addAttribute("sof", |
|
"numLines", |
|
DATATYPE_INTEGER, |
|
false, |
|
null, |
|
"0", "65535", |
|
true, true); |
|
addAttribute("sof", |
|
"samplesPerLine", |
|
DATATYPE_INTEGER, |
|
false, |
|
null, |
|
"0", "65535", |
|
true, true); |
|
List comps = new ArrayList(); |
|
comps.add("1"); |
|
comps.add("2"); |
|
comps.add("3"); |
|
comps.add("4"); |
|
addAttribute("sof", |
|
"numFrameComponents", |
|
DATATYPE_INTEGER, |
|
false, |
|
null, |
|
comps); |
|
|
|
addAttribute("componentSpec", |
|
"componentId", |
|
DATATYPE_INTEGER, |
|
true, |
|
null, |
|
"0", "255", |
|
true, true); |
|
addAttribute("componentSpec", |
|
"HsamplingFactor", |
|
DATATYPE_INTEGER, |
|
true, |
|
null, |
|
"1", "255", |
|
true, true); |
|
addAttribute("componentSpec", |
|
"VsamplingFactor", |
|
DATATYPE_INTEGER, |
|
true, |
|
null, |
|
"1", "255", |
|
true, true); |
|
List tabids = new ArrayList(); |
|
tabids.add("0"); |
|
tabids.add("1"); |
|
tabids.add("2"); |
|
tabids.add("3"); |
|
addAttribute("componentSpec", |
|
"QtableSelector", |
|
DATATYPE_INTEGER, |
|
true, |
|
null, |
|
tabids); |
|
|
|
addElement("scanComponentSpec", "sos", CHILD_POLICY_EMPTY); |
|
|
|
addAttribute("sos", |
|
"numScanComponents", |
|
DATATYPE_INTEGER, |
|
true, |
|
null, |
|
comps); |
|
addAttribute("sos", |
|
"startSpectralSelection", |
|
DATATYPE_INTEGER, |
|
false, |
|
"0", |
|
"0", "63", |
|
true, true); |
|
addAttribute("sos", |
|
"endSpectralSelection", |
|
DATATYPE_INTEGER, |
|
false, |
|
"63", |
|
"0", "63", |
|
true, true); |
|
addAttribute("sos", |
|
"approxHigh", |
|
DATATYPE_INTEGER, |
|
false, |
|
"0", |
|
"0", "15", |
|
true, true); |
|
addAttribute("sos", |
|
"approxLow", |
|
DATATYPE_INTEGER, |
|
false, |
|
"0", |
|
"0", "15", |
|
true, true); |
|
|
|
addAttribute("scanComponentSpec", |
|
"componentSelector", |
|
DATATYPE_INTEGER, |
|
true, |
|
null, |
|
"0", "255", |
|
true, true); |
|
addAttribute("scanComponentSpec", |
|
"dcHuffTable", |
|
DATATYPE_INTEGER, |
|
true, |
|
null, |
|
tabids); |
|
addAttribute("scanComponentSpec", |
|
"acHuffTable", |
|
DATATYPE_INTEGER, |
|
true, |
|
null, |
|
tabids); |
|
} |
|
|
|
public boolean canNodeAppear(String elementName, |
|
ImageTypeSpecifier imageType) { |
|
|
|
if (elementName.equals(getRootName()) |
|
|| elementName.equals("JPEGvariety") |
|
|| isInSubtree(elementName, "markerSequence")) { |
|
return true; |
|
} |
|
|
|
// If it is an element in the app0jfif subtree, just check |
|
|
|
if ((isInSubtree(elementName, "app0JFIF")) |
|
&& JPEG.isJFIFcompliant(imageType, true)) { |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
|
|
public static synchronized IIOMetadataFormat getInstance() { |
|
if (theInstance == null) { |
|
theInstance = new JPEGImageMetadataFormat(); |
|
} |
|
return theInstance; |
|
} |
|
} |