1/* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18package javax.imageio.metadata; 19 20import javax.imageio.ImageTypeSpecifier; 21import java.util.ArrayList; 22 23/** 24 * The class IIOStandardMetadataFormat describes the rules of the standard 25 * metadata format. 26 * 27 * @since Android 1.0 28 */ 29class IIOStandardMetadataFormat extends IIOMetadataFormatImpl { 30 31 /** 32 * Instantiates a new IIOStandardMetadataFormat. 33 */ 34 public IIOStandardMetadataFormat() { 35 super(standardMetadataFormatName, CHILD_POLICY_SOME); 36 buildDTD(); 37 } 38 39 @Override 40 public boolean canNodeAppear(String elementName, ImageTypeSpecifier imageType) { 41 return true; 42 } 43 44 /** 45 * Builds the DTD that describes the standard metadata format. 46 */ 47 private void buildDTD() { 48 // CHROMA 49 addElement("Chroma", standardMetadataFormatName, CHILD_POLICY_SOME); 50 51 addElement("ColorSpaceType", "Chroma", CHILD_POLICY_EMPTY); 52 53 ArrayList<String> values = new ArrayList<String>(27); 54 values.add("XYZ"); 55 values.add("Lab"); 56 values.add("Luv"); 57 values.add("YCbCr"); 58 values.add("Yxy"); 59 values.add("YCCK"); 60 values.add("PhotoYCC"); 61 values.add("RGB"); 62 values.add("GRAY"); 63 values.add("HSV"); 64 values.add("HLS"); 65 values.add("CMYK"); 66 values.add("CMY"); 67 values.add("2CLR"); 68 values.add("3CLR"); 69 values.add("4CLR"); 70 values.add("5CLR"); 71 values.add("6CLR"); 72 values.add("7CLR"); 73 values.add("8CLR"); 74 values.add("9CLR"); 75 values.add("ACLR"); 76 values.add("BCLR"); 77 values.add("CCLR"); 78 values.add("DCLR"); 79 values.add("ECLR"); 80 values.add("FCLR"); 81 addAttribute("ColorSpaceType", "name", DATATYPE_STRING, true, null, values); 82 83 addElement("NumChannels", "Chroma", CHILD_POLICY_EMPTY); 84 addAttribute("NumChannels", "value", DATATYPE_INTEGER, true, 0, Integer.MAX_VALUE); // list 85 // - 86 // why 87 // ? 88 89 addElement("Gamma", "Chroma", CHILD_POLICY_EMPTY); 90 addAttribute("Gamma", "value", DATATYPE_FLOAT, true, null); 91 92 addElement("BlackIsZero", "Chroma", CHILD_POLICY_EMPTY); 93 addBooleanAttribute("BlackIsZero", "value", true, true); 94 95 addElement("Palette", "Chroma", 0, Integer.MAX_VALUE); // CHILD_POLICY_REPEAT 96 addElement("PaletteEntry", "Palette", CHILD_POLICY_EMPTY); 97 addAttribute("PaletteEntry", "index", DATATYPE_INTEGER, true, null); 98 addAttribute("PaletteEntry", "red", DATATYPE_INTEGER, true, null); 99 addAttribute("PaletteEntry", "green", DATATYPE_INTEGER, true, null); 100 addAttribute("PaletteEntry", "blue", DATATYPE_INTEGER, true, null); 101 addAttribute("PaletteEntry", "alpha", DATATYPE_INTEGER, false, "255"); 102 103 addElement("BackgroundIndex", "Chroma", CHILD_POLICY_EMPTY); 104 addAttribute("BackgroundIndex", "value", DATATYPE_INTEGER, true, null); 105 106 addElement("BackgroundColor", "Chroma", CHILD_POLICY_EMPTY); 107 addAttribute("BackgroundColor", "red", DATATYPE_INTEGER, true, null); 108 addAttribute("BackgroundColor", "green", DATATYPE_INTEGER, true, null); 109 addAttribute("BackgroundColor", "blue", DATATYPE_INTEGER, true, null); 110 111 // COMPRESSION 112 addElement("Compression", standardMetadataFormatName, CHILD_POLICY_SOME); 113 114 addElement("CompressionTypeName", "Compression", CHILD_POLICY_EMPTY); 115 addAttribute("CompressionTypeName", "value", DATATYPE_STRING, true, null); 116 117 addElement("Lossless", "Compression", CHILD_POLICY_EMPTY); 118 addBooleanAttribute("Lossless", "value", true, true); 119 120 addElement("NumProgressiveScans", "Compression", CHILD_POLICY_EMPTY); 121 addAttribute("NumProgressiveScans", "value", DATATYPE_INTEGER, true, null); 122 123 addElement("BitRate", "Compression", CHILD_POLICY_EMPTY); 124 addAttribute("BitRate", "value", DATATYPE_FLOAT, true, null); 125 126 // DATA 127 addElement("Data", standardMetadataFormatName, CHILD_POLICY_SOME); 128 129 addElement("PlanarConfiguration", "Data", CHILD_POLICY_EMPTY); 130 values = new ArrayList<String>(4); 131 values.add("PixelInterleaved"); 132 values.add("PlaneInterleaved"); 133 values.add("LineInterleaved"); 134 values.add("TileInterleaved"); 135 addAttribute("PlanarConfiguration", "value", DATATYPE_STRING, true, null, values); 136 137 addElement("SampleFormat", "Data", CHILD_POLICY_EMPTY); 138 values = new ArrayList<String>(4); 139 values.add("SignedIntegral"); 140 values.add("UnsignedIntegral"); 141 values.add("Real"); 142 values.add("Index"); 143 addAttribute("SampleFormat", "value", DATATYPE_STRING, true, null, values); 144 145 addElement("BitsPerSample", "Data", CHILD_POLICY_EMPTY); 146 addAttribute("BitsPerSample", "value", DATATYPE_INTEGER, true, 1, Integer.MAX_VALUE); // list 147 148 addElement("SignificantBitsPerSample", "Data", CHILD_POLICY_EMPTY); 149 addAttribute("SignificantBitsPerSample", "value", DATATYPE_INTEGER, true, 1, 150 Integer.MAX_VALUE); // list 151 152 addElement("SampleMSB", "Data", CHILD_POLICY_EMPTY); 153 addAttribute("SampleMSB", "value", DATATYPE_INTEGER, true, 1, Integer.MAX_VALUE); // list 154 155 // DIMENSION 156 addElement("Dimension", standardMetadataFormatName, CHILD_POLICY_SOME); 157 158 addElement("PixelAspectRatio", "Dimension", CHILD_POLICY_EMPTY); 159 addAttribute("PixelAspectRatio", "value", DATATYPE_FLOAT, true, null); 160 161 addElement("ImageOrientation", "Dimension", CHILD_POLICY_EMPTY); 162 values = new ArrayList<String>(8); 163 values.add("Normal"); 164 values.add("Rotate90"); 165 values.add("Rotate180"); 166 values.add("Rotate270"); 167 values.add("FlipH"); 168 values.add("FlipV"); 169 values.add("FlipHRotate90"); 170 values.add("FlipVRotate90"); 171 addAttribute("ImageOrientation", "value", DATATYPE_STRING, true, null, values); 172 173 addElement("HorizontalPixelSize", "Dimension", CHILD_POLICY_EMPTY); 174 addAttribute("HorizontalPixelSize", "value", DATATYPE_FLOAT, true, null); 175 176 addElement("VerticalPixelSize", "Dimension", CHILD_POLICY_EMPTY); 177 addAttribute("VerticalPixelSize", "value", DATATYPE_FLOAT, true, null); 178 179 addElement("HorizontalPhysicalPixelSpacing", "Dimension", CHILD_POLICY_EMPTY); 180 addAttribute("HorizontalPhysicalPixelSpacing", "value", DATATYPE_FLOAT, true, null); 181 182 addElement("VerticalPhysicalPixelSpacing", "Dimension", CHILD_POLICY_EMPTY); 183 addAttribute("VerticalPhysicalPixelSpacing", "value", DATATYPE_FLOAT, true, null); 184 185 addElement("HorizontalPosition", "Dimension", CHILD_POLICY_EMPTY); 186 addAttribute("HorizontalPosition", "value", DATATYPE_FLOAT, true, null); 187 188 addElement("VerticalPosition", "Dimension", CHILD_POLICY_EMPTY); 189 addAttribute("VerticalPosition", "value", DATATYPE_FLOAT, true, null); 190 191 addElement("HorizontalPixelOffset", "Dimension", CHILD_POLICY_EMPTY); 192 addAttribute("HorizontalPixelOffset", "value", DATATYPE_INTEGER, true, null); 193 194 addElement("VerticalPixelOffset", "Dimension", CHILD_POLICY_EMPTY); 195 addAttribute("VerticalPixelOffset", "value", DATATYPE_INTEGER, true, null); 196 197 addElement("HorizontalScreenSize", "Dimension", CHILD_POLICY_EMPTY); 198 addAttribute("HorizontalScreenSize", "value", DATATYPE_INTEGER, true, null); 199 200 addElement("VerticalScreenSize", "Dimension", CHILD_POLICY_EMPTY); 201 addAttribute("VerticalScreenSize", "value", DATATYPE_INTEGER, true, null); 202 203 // DOCUMENT 204 addElement("Document", standardMetadataFormatName, CHILD_POLICY_SOME); 205 206 addElement("FormatVersion", "Document", CHILD_POLICY_EMPTY); 207 addAttribute("FormatVersion", "value", DATATYPE_STRING, true, null); 208 209 addElement("SubimageInterpretation", "Document", CHILD_POLICY_EMPTY); 210 values = new ArrayList<String>(14); 211 values.add("Standalone"); 212 values.add("SinglePage"); 213 values.add("FullResolution"); 214 values.add("ReducedResolution"); 215 values.add("PyramidLayer"); 216 values.add("Preview"); 217 values.add("VolumeSlice"); 218 values.add("ObjectView"); 219 values.add("Panorama"); 220 values.add("AnimationFrame"); 221 values.add("TransparencyMask"); 222 values.add("CompositingLayer"); 223 values.add("SpectralSlice"); 224 values.add("Unknown"); 225 addAttribute("SubimageInterpretation", "value", DATATYPE_STRING, true, null, values); 226 227 addElement("ImageCreationTime", "Document", CHILD_POLICY_EMPTY); 228 addAttribute("ImageCreationTime", "year", DATATYPE_INTEGER, true, null); 229 addAttribute("ImageCreationTime", "month", DATATYPE_INTEGER, true, null, "1", "12", true, 230 true); 231 addAttribute("ImageCreationTime", "day", DATATYPE_INTEGER, true, null, "1", "31", true, 232 true); 233 addAttribute("ImageCreationTime", "hour", DATATYPE_INTEGER, false, "0", "0", "23", true, 234 true); 235 addAttribute("ImageCreationTime", "minute", DATATYPE_INTEGER, false, "0", "0", "59", true, 236 true); 237 addAttribute("ImageCreationTime", "second", DATATYPE_INTEGER, false, "0", "0", "60", true, 238 true); 239 240 addElement("ImageModificationTime", "Document", CHILD_POLICY_EMPTY); 241 addAttribute("ImageModificationTime", "year", DATATYPE_INTEGER, true, null); 242 addAttribute("ImageModificationTime", "month", DATATYPE_INTEGER, true, null, "1", "12", 243 true, true); 244 addAttribute("ImageModificationTime", "day", DATATYPE_INTEGER, true, null, "1", "31", true, 245 true); 246 addAttribute("ImageModificationTime", "hour", DATATYPE_INTEGER, false, "0", "0", "23", 247 true, true); 248 addAttribute("ImageModificationTime", "minute", DATATYPE_INTEGER, false, "0", "0", "59", 249 true, true); 250 addAttribute("ImageModificationTime", "second", DATATYPE_INTEGER, false, "0", "0", "60", 251 true, true); 252 253 // TEXT 254 addElement("Text", standardMetadataFormatName, 0, Integer.MAX_VALUE); // CHILD_POLICY_REPEAT 255 256 addElement("TextEntry", "Text", CHILD_POLICY_EMPTY); 257 addAttribute("TextEntry", "keyword", DATATYPE_STRING, false, null); 258 addAttribute("TextEntry", "value", DATATYPE_STRING, true, null); 259 addAttribute("TextEntry", "language", DATATYPE_STRING, false, null); 260 addAttribute("TextEntry", "encoding", DATATYPE_STRING, false, null); 261 values = new ArrayList<String>(5); 262 values.add("none"); 263 values.add("lzw"); 264 values.add("zip"); 265 values.add("bzip"); 266 values.add("other"); 267 addAttribute("TextEntry", "compression", DATATYPE_STRING, false, "none", values); 268 269 // TRANSPARENCY 270 addElement("Transparency", standardMetadataFormatName, CHILD_POLICY_SOME); 271 272 addElement("Alpha", "Transparency", CHILD_POLICY_EMPTY); 273 values = new ArrayList<String>(3); 274 values.add("none"); 275 values.add("premultiplied"); 276 values.add("nonpremultiplied"); 277 addAttribute("Alpha", "value", DATATYPE_STRING, false, "none", values); 278 279 addElement("TransparentIndex", "Transparency", CHILD_POLICY_EMPTY); 280 addAttribute("TransparentIndex", "value", DATATYPE_INTEGER, true, null); 281 282 addElement("TransparentColor", "Transparency", CHILD_POLICY_EMPTY); 283 addAttribute("TransparentColor", "value", DATATYPE_INTEGER, true, 0, Integer.MAX_VALUE); 284 285 addElement("TileTransparencies", "Transparency", 0, Integer.MAX_VALUE); // CHILD_POLICY_REPEAT 286 287 addElement("TransparentTile", "TileTransparencies", CHILD_POLICY_EMPTY); 288 addAttribute("TransparentTile", "x", DATATYPE_INTEGER, true, null); 289 addAttribute("TransparentTile", "y", DATATYPE_INTEGER, true, null); 290 291 addElement("TileOpacities", "Transparency", 0, Integer.MAX_VALUE); // CHILD_POLICY_REPEAT 292 293 addElement("OpaqueTile", "TileOpacities", CHILD_POLICY_EMPTY); 294 addAttribute("OpaqueTile", "x", DATATYPE_INTEGER, true, null); 295 addAttribute("OpaqueTile", "y", DATATYPE_INTEGER, true, null); 296 } 297} 298