157 lines · 5.4 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 javax.imageio.plugins.jpeg.JPEGQTable;import javax.imageio.plugins.jpeg.JPEGHuffmanTable; import java.util.List;import java.util.ArrayList; abstract class JPEGMetadataFormat extends IIOMetadataFormatImpl {    // 2-byte length reduces max to 65533    private static final int MAX_JPEG_DATA_SIZE = 65533;     String resourceBaseName = this.getClass().getName() + "Resources";     JPEGMetadataFormat(String formatName, int childPolicy) {        super(formatName, childPolicy);        setResourceBaseName(resourceBaseName);    }     // Format shared between image and stream formats    void addStreamElements(String parentName) {        addElement("dqt", parentName, 1, 4);         addElement("dqtable", "dqt", CHILD_POLICY_EMPTY);         addAttribute("dqtable",                     "elementPrecision",                     DATATYPE_INTEGER,                     false,                     "0");        List tabids = new ArrayList();        tabids.add("0");        tabids.add("1");        tabids.add("2");        tabids.add("3");        addAttribute("dqtable",                     "qtableId",                     DATATYPE_INTEGER,                     true,                     null,                     tabids);        addObjectValue("dqtable",                       JPEGQTable.class,                       true,                       null);         addElement("dht", parentName, 1, 4);        addElement("dhtable", "dht", CHILD_POLICY_EMPTY);        List classes = new ArrayList();        classes.add("0");        classes.add("1");        addAttribute("dhtable",                     "class",                     DATATYPE_INTEGER,                     true,                     null,                     classes);        addAttribute("dhtable",                     "htableId",                     DATATYPE_INTEGER,                     true,                     null,                     tabids);        addObjectValue("dhtable",                       JPEGHuffmanTable.class,                       true,                       null);          addElement("dri", parentName, CHILD_POLICY_EMPTY);        addAttribute("dri",                     "interval",                     DATATYPE_INTEGER,                     true,                     null,                     "0", "65535",                     true, true);         addElement("com", parentName, CHILD_POLICY_EMPTY);        addAttribute("com",                     "comment",                     DATATYPE_STRING,                     false,                     null);        addObjectValue("com", byte[].class, 1, MAX_JPEG_DATA_SIZE);         addElement("unknown", parentName, CHILD_POLICY_EMPTY);        addAttribute("unknown",                     "MarkerTag",                     DATATYPE_INTEGER,                     true,                     null,                     "0", "255",                     true, true);        addObjectValue("unknown", byte[].class, 1, MAX_JPEG_DATA_SIZE);    }     public boolean canNodeAppear(String elementName,                                 ImageTypeSpecifier imageType) {        // Just check if it appears in the format        if (isInSubtree(elementName, getRootName())){            return true;        }        return false;    }     /**     * Returns <code>true</code> if the named element occurs in the     * subtree of the format starting with the node named by     * <code>subtreeName</code>, including the node     * itself.  <code>subtreeName</code> may be any node in     * the format.  If it is not, an     * <code>IllegalArgumentException</code> is thrown.     */    protected boolean isInSubtree(String elementName,                                  String subtreeName) {        if (elementName.equals(subtreeName)) {            return true;        }        String [] children = getChildNames(elementName);        for (int i=0; i < children.length; i++) {            if (isInSubtree(elementName, children[i])) {                return true;            }        }        return false;    } }