366 lines · 11.6 KB · Java
RawDownload
/* * 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;    }}