- /*
- * @(#)JPEGImageMetadataFormat.java 1.12 03/12/19
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
- 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;
- }
- }