| /* |
| * Copyright (c) 2001, 2004, 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.png; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| import java.util.ListResourceBundle; |
| import javax.imageio.ImageTypeSpecifier; |
| import javax.imageio.metadata.IIOMetadataFormat; |
| import javax.imageio.metadata.IIOMetadataFormatImpl; |
| |
| public class PNGMetadataFormat extends IIOMetadataFormatImpl { |
| |
| private static IIOMetadataFormat instance = null; |
| |
| private static String VALUE_0 = "0"; |
| private static String VALUE_1 = "1"; |
| private static String VALUE_12 = "12"; |
| private static String VALUE_23 = "23"; |
| private static String VALUE_31 = "31"; |
| private static String VALUE_59 = "59"; |
| private static String VALUE_60 = "60"; |
| private static String VALUE_255 = "255"; |
| private static String VALUE_MAX_16 = "65535"; // 2^16 - 1 |
| private static String VALUE_MAX_32 = "2147483647"; // 2^32 - 1 |
| |
| private PNGMetadataFormat() { |
| super(PNGMetadata.nativeMetadataFormatName, |
| CHILD_POLICY_SOME); |
| |
| // root -> IHDR |
| addElement("IHDR", PNGMetadata.nativeMetadataFormatName, |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("IHDR", "width", |
| DATATYPE_INTEGER, true, null, |
| VALUE_1, VALUE_MAX_32, true, true); |
| |
| addAttribute("IHDR", "height", |
| DATATYPE_INTEGER, true, null, |
| VALUE_1, VALUE_MAX_32, true, true); |
| |
| addAttribute("IHDR", "bitDepth", |
| DATATYPE_INTEGER, true, null, |
| Arrays.asList(PNGMetadata.IHDR_bitDepths)); |
| |
| String[] colorTypes = { |
| "Grayscale", "RGB", "Palette", "GrayAlpha", "RGBAlpha" |
| }; |
| addAttribute("IHDR", "colorType", |
| DATATYPE_STRING, true, null, |
| Arrays.asList(colorTypes)); |
| |
| addAttribute("IHDR", "compressionMethod", |
| DATATYPE_STRING, true, null, |
| Arrays.asList(PNGMetadata.IHDR_compressionMethodNames)); |
| |
| addAttribute("IHDR", "filterMethod", |
| DATATYPE_STRING, true, null, |
| Arrays.asList(PNGMetadata.IHDR_filterMethodNames)); |
| |
| addAttribute("IHDR", "interlaceMethod", |
| DATATYPE_STRING, true, null, |
| Arrays.asList(PNGMetadata.IHDR_interlaceMethodNames)); |
| |
| // root -> PLTE |
| addElement("PLTE", PNGMetadata.nativeMetadataFormatName, |
| 1, 256); |
| |
| // root -> PLTE -> PLTEEntry |
| addElement("PLTEEntry", "PLTE", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("PLTEEntry", "index", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("PLTEEntry", "red", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("PLTEEntry", "green", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("PLTEEntry", "blue", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| // root -> bKGD |
| addElement("bKGD", PNGMetadata.nativeMetadataFormatName, |
| CHILD_POLICY_CHOICE); |
| |
| // root -> bKGD -> bKGD_Grayscale |
| addElement("bKGD_Grayscale", "bKGD", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("bKGD_Grayscale", "gray", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| // root -> bKGD -> bKGD_RGB |
| addElement("bKGD_RGB", "bKGD", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("bKGD_RGB", "red", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("bKGD_RGB", "green", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("bKGD_RGB", "blue", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| // root -> bKGD -> bKGD_Palette |
| addElement("bKGD_Palette", "bKGD", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("bKGD_Palette", "index", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| // root -> cHRM |
| addElement("cHRM", PNGMetadata.nativeMetadataFormatName, |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("cHRM", "whitePointX", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("cHRM", "whitePointY", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("cHRM", "redX", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("cHRM", "redY", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("cHRM", "greenX", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("cHRM", "greenY", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("cHRM", "blueX", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("cHRM", "blueY", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| // root -> gAMA |
| addElement("gAMA", PNGMetadata.nativeMetadataFormatName, |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("gAMA", "value", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_32, true, true); |
| |
| // root -> hIST |
| addElement("hIST", PNGMetadata.nativeMetadataFormatName, |
| 1, 256); |
| |
| // root -> hISTEntry |
| addElement("hISTEntry", "hIST", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("hISTEntry", "index", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("hISTEntry", "value", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| // root -> iCCP |
| addElement("iCCP", PNGMetadata.nativeMetadataFormatName, |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("iCCP", "profileName", |
| DATATYPE_STRING, true, null); |
| |
| addAttribute("iCCP", "compressionMethod", |
| DATATYPE_STRING, true, null, |
| Arrays.asList(PNGMetadata.iCCP_compressionMethodNames)); |
| |
| addObjectValue("iCCP", byte.class, 0, Integer.MAX_VALUE); |
| |
| // root -> iTXt |
| addElement("iTXt", PNGMetadata.nativeMetadataFormatName, |
| 1, Integer.MAX_VALUE); |
| |
| // root -> iTXt -> iTXtEntry |
| addElement("iTXtEntry", "iTXt", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("iTXtEntry", "keyword", |
| DATATYPE_STRING, true, null); |
| |
| addBooleanAttribute("iTXtEntry", "compressionFlag", |
| false, false); |
| |
| addAttribute("iTXtEntry", "compressionMethod", |
| DATATYPE_STRING, true, null); |
| |
| addAttribute("iTXtEntry", "languageTag", |
| DATATYPE_STRING, true, null); |
| |
| addAttribute("iTXtEntry", "translatedKeyword", |
| DATATYPE_STRING, true, null); |
| |
| addAttribute("iTXtEntry", "text", |
| DATATYPE_STRING, true, null); |
| |
| // root -> pHYS |
| addElement("pHYS", PNGMetadata.nativeMetadataFormatName, |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("pHYS", "pixelsPerUnitXAxis", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_32, true, true); |
| addAttribute("pHYS", "pixelsPerUnitYAxis", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_32, true, true); |
| addAttribute("pHYS", "unitSpecifier", |
| DATATYPE_STRING, true, null, |
| Arrays.asList(PNGMetadata.unitSpecifierNames)); |
| |
| // root -> sBIT |
| addElement("sBIT", PNGMetadata.nativeMetadataFormatName, |
| CHILD_POLICY_CHOICE); |
| |
| // root -> sBIT -> sBIT_Grayscale |
| addElement("sBIT_Grayscale", "sBIT", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("sBIT_Grayscale", "gray", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| // root -> sBIT -> sBIT_GrayAlpha |
| addElement("sBIT_GrayAlpha", "sBIT", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("sBIT_GrayAlpha", "gray", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sBIT_GrayAlpha", "alpha", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| // root -> sBIT -> sBIT_RGB |
| addElement("sBIT_RGB", "sBIT", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("sBIT_RGB", "red", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sBIT_RGB", "green", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sBIT_RGB", "blue", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| // root -> sBIT -> sBIT_RGBAlpha |
| addElement("sBIT_RGBAlpha", "sBIT", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("sBIT_RGBAlpha", "red", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sBIT_RGBAlpha", "green", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sBIT_RGBAlpha", "blue", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sBIT_RGBAlpha", "alpha", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| // root -> sBIT -> sBIT_Palette |
| addElement("sBIT_Palette", "sBIT", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("sBIT_Palette", "red", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sBIT_Palette", "green", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sBIT_Palette", "blue", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| // root -> sPLT |
| addElement("sPLT", PNGMetadata.nativeMetadataFormatName, |
| 1, 256); |
| |
| // root -> sPLT -> sPLTEntry |
| addElement("sPLTEntry", "sPLT", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("sPLTEntry", "index", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sPLTEntry", "red", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sPLTEntry", "green", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sPLTEntry", "blue", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("sPLTEntry", "alpha", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| // root -> sRGB |
| addElement("sRGB", PNGMetadata.nativeMetadataFormatName, |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("sRGB", "renderingIntent", |
| DATATYPE_STRING, true, null, |
| Arrays.asList(PNGMetadata.renderingIntentNames)); |
| |
| // root -> tEXt |
| addElement("tEXt", PNGMetadata.nativeMetadataFormatName, |
| 1, Integer.MAX_VALUE); |
| |
| // root -> tEXt -> tEXtEntry |
| addElement("tEXtEntry", "tEXt", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("tEXtEntry", "keyword", |
| DATATYPE_STRING, true, null); |
| |
| addAttribute("tEXtEntry", "value", |
| DATATYPE_STRING, true, null); |
| |
| // root -> tIME |
| addElement("tIME", PNGMetadata.nativeMetadataFormatName, |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("tIME", "year", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("tIME", "month", |
| DATATYPE_INTEGER, true, null, |
| VALUE_1, VALUE_12, true, true); |
| |
| addAttribute("tIME", "day", |
| DATATYPE_INTEGER, true, null, |
| VALUE_1, VALUE_31, true, true); |
| |
| addAttribute("tIME", "hour", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_23, true, true); |
| |
| addAttribute("tIME", "minute", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_59, true, true); |
| |
| addAttribute("tIME", "second", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_60, true, true); |
| |
| // root -> tRNS |
| addElement("tRNS", PNGMetadata.nativeMetadataFormatName, |
| CHILD_POLICY_CHOICE); |
| |
| // root -> tRNS -> tRNS_Grayscale |
| addElement("tRNS_Grayscale", "tRNS", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("tRNS_Grayscale", "gray", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| // root -> tRNS -> tRNS_RGB |
| addElement("tRNS_RGB", "tRNS", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("tRNS_RGB", "red", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("tRNS_RGB", "green", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| addAttribute("tRNS_RGB", "blue", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_MAX_16, true, true); |
| |
| // root -> tRNS -> tRNS_Palette |
| addElement("tRNS_Palette", "tRNS", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("tRNS_Palette", "index", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| addAttribute("tRNS_Palette", "alpha", |
| DATATYPE_INTEGER, true, null, |
| VALUE_0, VALUE_255, true, true); |
| |
| // root -> zTXt |
| addElement("zTXt", PNGMetadata.nativeMetadataFormatName, |
| 1, Integer.MAX_VALUE); |
| |
| // root -> zTXt -> zTXtEntry |
| addElement("zTXtEntry", "zTXt", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("zTXtEntry", "keyword", |
| DATATYPE_STRING, true, null); |
| |
| addAttribute("zTXtEntry", "compressionMethod", |
| DATATYPE_STRING, true, null, |
| Arrays.asList(PNGMetadata.zTXt_compressionMethodNames)); |
| |
| addAttribute("zTXtEntry", "text", |
| DATATYPE_STRING, true, null); |
| |
| // root -> UnknownChunks |
| addElement("UnknownChunks", PNGMetadata.nativeMetadataFormatName, |
| 1, Integer.MAX_VALUE); |
| |
| // root -> UnknownChunks -> UnknownChunk |
| addElement("UnknownChunk", "UnknownChunks", |
| CHILD_POLICY_EMPTY); |
| |
| addAttribute("UnknownChunk", "type", |
| DATATYPE_STRING, true, null); |
| |
| addObjectValue("UnknownChunk", byte.class, 0, Integer.MAX_VALUE); |
| } |
| |
| public boolean canNodeAppear(String elementName, |
| ImageTypeSpecifier imageType) { |
| return true; |
| } |
| |
| public static synchronized IIOMetadataFormat getInstance() { |
| if (instance == null) { |
| instance = new PNGMetadataFormat(); |
| } |
| return instance; |
| } |
| } |