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