367 lines
12 KiB
Java
367 lines
12 KiB
Java
/*
|
|
* Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation. Oracle designates this
|
|
* particular file as subject to the "Classpath" exception as provided
|
|
* by Oracle in the LICENSE file that accompanied this code.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
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"); // Hex 10
|
|
codes.add("17"); // Hex 11
|
|
codes.add("19"); // Hex 13
|
|
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) {
|
|
// All images can have these
|
|
if (elementName.equals(getRootName())
|
|
|| elementName.equals("JPEGvariety")
|
|
|| isInSubtree(elementName, "markerSequence")) {
|
|
return true;
|
|
}
|
|
|
|
// If it is an element in the app0jfif subtree, just check
|
|
// that the image type is JFIF compliant.
|
|
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;
|
|
}
|
|
}
|