|
1 /* |
|
2 * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved. |
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
4 * |
|
5 * This code is free software; you can redistribute it and/or modify it |
|
6 * under the terms of the GNU General Public License version 2 only, as |
|
7 * published by the Free Software Foundation. Sun designates this |
|
8 * particular file as subject to the "Classpath" exception as provided |
|
9 * by Sun in the LICENSE file that accompanied this code. |
|
10 * |
|
11 * This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 * version 2 for more details (a copy is included in the LICENSE file that |
|
15 * accompanied this code). |
|
16 * |
|
17 * You should have received a copy of the GNU General Public License version |
|
18 * 2 along with this work; if not, write to the Free Software Foundation, |
|
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 * |
|
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
|
22 * CA 95054 USA or visit www.sun.com if you need additional information or |
|
23 * have any questions. |
|
24 */ |
|
25 |
|
26 package com.sun.imageio.plugins.common; |
|
27 |
|
28 import java.util.ArrayList; |
|
29 import java.util.List; |
|
30 import javax.imageio.ImageTypeSpecifier; |
|
31 import javax.imageio.metadata.IIOMetadataFormatImpl; |
|
32 |
|
33 public class StandardMetadataFormat extends IIOMetadataFormatImpl { |
|
34 |
|
35 // Utility method for nodes with a single atttribute named "value" |
|
36 private void addSingleAttributeElement(String elementName, |
|
37 String parentName, |
|
38 int dataType) { |
|
39 addElement(elementName, parentName, CHILD_POLICY_EMPTY); |
|
40 addAttribute(elementName, "value", dataType, true, null); |
|
41 } |
|
42 |
|
43 public StandardMetadataFormat() { |
|
44 super(standardMetadataFormatName, CHILD_POLICY_SOME); |
|
45 List values; |
|
46 |
|
47 // root -> Chroma |
|
48 addElement("Chroma", standardMetadataFormatName, |
|
49 CHILD_POLICY_SOME); |
|
50 |
|
51 // root -> Chroma -> ColorSpaceType |
|
52 addElement("ColorSpaceType", "Chroma", |
|
53 CHILD_POLICY_EMPTY); |
|
54 |
|
55 values = new ArrayList(); |
|
56 values.add("XYZ"); |
|
57 values.add("Lab"); |
|
58 values.add("Luv"); |
|
59 values.add("YCbCr"); |
|
60 values.add("Yxy"); |
|
61 values.add("YCCK"); |
|
62 values.add("PhotoYCC"); |
|
63 values.add("RGB"); |
|
64 values.add("GRAY"); |
|
65 values.add("HSV"); |
|
66 values.add("HLS"); |
|
67 values.add("CMYK"); |
|
68 values.add("CMY"); |
|
69 values.add("2CLR"); |
|
70 values.add("3CLR"); |
|
71 values.add("4CLR"); |
|
72 values.add("5CLR"); |
|
73 values.add("6CLR"); |
|
74 values.add("7CLR"); |
|
75 values.add("8CLR"); |
|
76 values.add("9CLR"); |
|
77 values.add("ACLR"); |
|
78 values.add("BCLR"); |
|
79 values.add("CCLR"); |
|
80 values.add("DCLR"); |
|
81 values.add("ECLR"); |
|
82 values.add("FCLR"); |
|
83 addAttribute("ColorSpaceType", |
|
84 "name", |
|
85 DATATYPE_STRING, |
|
86 true, |
|
87 null, |
|
88 values); |
|
89 |
|
90 // root -> Chroma -> NumChannels |
|
91 addElement("NumChannels", "Chroma", |
|
92 CHILD_POLICY_EMPTY); |
|
93 addAttribute("NumChannels", "value", |
|
94 DATATYPE_INTEGER, |
|
95 true, |
|
96 0, Integer.MAX_VALUE); |
|
97 |
|
98 // root -> Chroma -> Gamma |
|
99 addElement("Gamma", "Chroma", CHILD_POLICY_EMPTY); |
|
100 addAttribute("Gamma", "value", |
|
101 DATATYPE_FLOAT, true, null); |
|
102 |
|
103 // root -> Chroma -> BlackIsZero |
|
104 addElement("BlackIsZero", "Chroma", CHILD_POLICY_EMPTY); |
|
105 addBooleanAttribute("BlackIsZero", "value", true, true); |
|
106 |
|
107 // root -> Chroma -> Palette |
|
108 addElement("Palette", "Chroma", 0, Integer.MAX_VALUE); |
|
109 |
|
110 // root -> Chroma -> PaletteEntry |
|
111 addElement("PaletteEntry", "Palette", CHILD_POLICY_EMPTY); |
|
112 addAttribute("PaletteEntry", "index", DATATYPE_INTEGER, |
|
113 true, null); |
|
114 addAttribute("PaletteEntry", "red", DATATYPE_INTEGER, |
|
115 true, null); |
|
116 addAttribute("PaletteEntry", "green", DATATYPE_INTEGER, |
|
117 true, null); |
|
118 addAttribute("PaletteEntry", "blue", DATATYPE_INTEGER, |
|
119 true, null); |
|
120 addAttribute("PaletteEntry", "alpha", DATATYPE_INTEGER, |
|
121 false, "255"); |
|
122 |
|
123 // root -> Chroma -> BackgroundIndex |
|
124 addElement("BackgroundIndex", "Chroma", CHILD_POLICY_EMPTY); |
|
125 addAttribute("BackgroundIndex", "value", DATATYPE_INTEGER, |
|
126 true, null); |
|
127 |
|
128 // root -> Chroma -> BackgroundColor |
|
129 addElement("BackgroundColor", "Chroma", CHILD_POLICY_EMPTY); |
|
130 addAttribute("BackgroundColor", "red", DATATYPE_INTEGER, |
|
131 true, null); |
|
132 addAttribute("BackgroundColor", "green", DATATYPE_INTEGER, |
|
133 true, null); |
|
134 addAttribute("BackgroundColor", "blue", DATATYPE_INTEGER, |
|
135 true, null); |
|
136 |
|
137 // root -> Compression |
|
138 addElement("Compression", standardMetadataFormatName, |
|
139 CHILD_POLICY_SOME); |
|
140 |
|
141 // root -> Compression -> CompressionTypeName |
|
142 addSingleAttributeElement("CompressionTypeName", |
|
143 "Compression", |
|
144 DATATYPE_STRING); |
|
145 |
|
146 // root -> Compression -> Lossless |
|
147 addElement("Lossless", "Compression", CHILD_POLICY_EMPTY); |
|
148 addBooleanAttribute("Lossless", "value", true, true); |
|
149 |
|
150 // root -> Compression -> NumProgressiveScans |
|
151 addSingleAttributeElement("NumProgressiveScans", |
|
152 "Compression", |
|
153 DATATYPE_INTEGER); |
|
154 |
|
155 // root -> Compression -> BitRate |
|
156 addSingleAttributeElement("BitRate", |
|
157 "Compression", |
|
158 DATATYPE_FLOAT); |
|
159 |
|
160 // root -> Data |
|
161 addElement("Data", standardMetadataFormatName, |
|
162 CHILD_POLICY_SOME); |
|
163 |
|
164 // root -> Data -> PlanarConfiguration |
|
165 addElement("PlanarConfiguration", "Data", CHILD_POLICY_EMPTY); |
|
166 |
|
167 values = new ArrayList(); |
|
168 values.add("PixelInterleaved"); |
|
169 values.add("PlaneInterleaved"); |
|
170 values.add("LineInterleaved"); |
|
171 values.add("TileInterleaved"); |
|
172 addAttribute("PlanarConfiguration", "value", |
|
173 DATATYPE_STRING, |
|
174 true, |
|
175 null, |
|
176 values); |
|
177 |
|
178 // root -> Data -> SampleFormat |
|
179 addElement("SampleFormat", "Data", CHILD_POLICY_EMPTY); |
|
180 |
|
181 values = new ArrayList(); |
|
182 values.add("SignedIntegral"); |
|
183 values.add("UnsignedIntegral"); |
|
184 values.add("Real"); |
|
185 values.add("Index"); |
|
186 addAttribute("SampleFormat", "value", |
|
187 DATATYPE_STRING, |
|
188 true, |
|
189 null, |
|
190 values); |
|
191 |
|
192 // root -> Data -> BitsPerSample |
|
193 addElement("BitsPerSample", "Data", |
|
194 CHILD_POLICY_EMPTY); |
|
195 addAttribute("BitsPerSample", "value", |
|
196 DATATYPE_INTEGER, |
|
197 true, |
|
198 1, Integer.MAX_VALUE); |
|
199 |
|
200 // root -> Data -> SignificantBitsPerSample |
|
201 addElement("SignificantBitsPerSample", "Data", CHILD_POLICY_EMPTY); |
|
202 addAttribute("SignificantBitsPerSample", "value", |
|
203 DATATYPE_INTEGER, |
|
204 true, |
|
205 1, Integer.MAX_VALUE); |
|
206 |
|
207 // root -> Data -> SampleMSB |
|
208 addElement("SampleMSB", "Data", |
|
209 CHILD_POLICY_EMPTY); |
|
210 addAttribute("SampleMSB", "value", |
|
211 DATATYPE_INTEGER, |
|
212 true, |
|
213 1, Integer.MAX_VALUE); |
|
214 |
|
215 // root -> Dimension |
|
216 addElement("Dimension", standardMetadataFormatName, |
|
217 CHILD_POLICY_SOME); |
|
218 |
|
219 // root -> Dimension -> PixelAspectRatio |
|
220 addSingleAttributeElement("PixelAspectRatio", |
|
221 "Dimension", |
|
222 DATATYPE_FLOAT); |
|
223 |
|
224 // root -> Dimension -> ImageOrientation |
|
225 addElement("ImageOrientation", "Dimension", |
|
226 CHILD_POLICY_EMPTY); |
|
227 |
|
228 values = new ArrayList(); |
|
229 values.add("Normal"); |
|
230 values.add("Rotate90"); |
|
231 values.add("Rotate180"); |
|
232 values.add("Rotate270"); |
|
233 values.add("FlipH"); |
|
234 values.add("FlipV"); |
|
235 values.add("FlipHRotate90"); |
|
236 values.add("FlipVRotate90"); |
|
237 addAttribute("ImageOrientation", "value", |
|
238 DATATYPE_STRING, |
|
239 true, |
|
240 null, |
|
241 values); |
|
242 |
|
243 // root -> Dimension -> HorizontalPixelSize |
|
244 addSingleAttributeElement("HorizontalPixelSize", |
|
245 "Dimension", |
|
246 DATATYPE_FLOAT); |
|
247 |
|
248 // root -> Dimension -> VerticalPixelSize |
|
249 addSingleAttributeElement("VerticalPixelSize", |
|
250 "Dimension", |
|
251 DATATYPE_FLOAT); |
|
252 |
|
253 // root -> Dimension -> HorizontalPhysicalPixelSpacing |
|
254 addSingleAttributeElement("HorizontalPhysicalPixelSpacing", |
|
255 "Dimension", |
|
256 DATATYPE_FLOAT); |
|
257 |
|
258 // root -> Dimension -> VerticalPhysicalPixelSpacing |
|
259 addSingleAttributeElement("VerticalPhysicalPixelSpacing", |
|
260 "Dimension", |
|
261 DATATYPE_FLOAT); |
|
262 |
|
263 // root -> Dimension -> HorizontalPosition |
|
264 addSingleAttributeElement("HorizontalPosition", |
|
265 "Dimension", |
|
266 DATATYPE_FLOAT); |
|
267 |
|
268 // root -> Dimension -> VerticalPosition |
|
269 addSingleAttributeElement("VerticalPosition", |
|
270 "Dimension", |
|
271 DATATYPE_FLOAT); |
|
272 |
|
273 // root -> Dimension -> HorizontalPixelOffset |
|
274 addSingleAttributeElement("HorizontalPixelOffset", |
|
275 "Dimension", |
|
276 DATATYPE_INTEGER); |
|
277 |
|
278 // root -> Dimension -> VerticalPixelOffset |
|
279 addSingleAttributeElement("VerticalPixelOffset", |
|
280 "Dimension", |
|
281 DATATYPE_INTEGER); |
|
282 |
|
283 // root -> Dimension -> HorizontalScreenSize |
|
284 addSingleAttributeElement("HorizontalScreenSize", |
|
285 "Dimension", |
|
286 DATATYPE_INTEGER); |
|
287 |
|
288 // root -> Dimension -> VerticalScreenSize |
|
289 addSingleAttributeElement("VerticalScreenSize", |
|
290 "Dimension", |
|
291 DATATYPE_INTEGER); |
|
292 |
|
293 |
|
294 // root -> Document |
|
295 addElement("Document", standardMetadataFormatName, |
|
296 CHILD_POLICY_SOME); |
|
297 |
|
298 // root -> Document -> FormatVersion |
|
299 addElement("FormatVersion", "Document", |
|
300 CHILD_POLICY_EMPTY); |
|
301 addAttribute("FormatVersion", "value", |
|
302 DATATYPE_STRING, |
|
303 true, |
|
304 null); |
|
305 |
|
306 // root -> Document -> SubimageInterpretation |
|
307 addElement("SubimageInterpretation", "Document", |
|
308 CHILD_POLICY_EMPTY); |
|
309 values = new ArrayList(); |
|
310 values.add("Standalone"); |
|
311 values.add("SinglePage"); |
|
312 values.add("FullResolution"); |
|
313 values.add("ReducedResolution"); |
|
314 values.add("PyramidLayer"); |
|
315 values.add("Preview"); |
|
316 values.add("VolumeSlice"); |
|
317 values.add("ObjectView"); |
|
318 values.add("Panorama"); |
|
319 values.add("AnimationFrame"); |
|
320 values.add("TransparencyMask"); |
|
321 values.add("CompositingLayer"); |
|
322 values.add("SpectralSlice"); |
|
323 values.add("Unknown"); |
|
324 addAttribute("SubimageInterpretation", "value", |
|
325 DATATYPE_STRING, |
|
326 true, |
|
327 null, |
|
328 values); |
|
329 |
|
330 // root -> Document -> ImageCreationTime |
|
331 addElement("ImageCreationTime", "Document", |
|
332 CHILD_POLICY_EMPTY); |
|
333 addAttribute("ImageCreationTime", "year", |
|
334 DATATYPE_INTEGER, |
|
335 true, |
|
336 null); |
|
337 addAttribute("ImageCreationTime", "month", |
|
338 DATATYPE_INTEGER, |
|
339 true, |
|
340 null, |
|
341 "1", "12", true, true); |
|
342 addAttribute("ImageCreationTime", "day", |
|
343 DATATYPE_INTEGER, |
|
344 true, |
|
345 null, |
|
346 "1", "31", true, true); |
|
347 addAttribute("ImageCreationTime", "hour", |
|
348 DATATYPE_INTEGER, |
|
349 false, |
|
350 "0", |
|
351 "0", "23", true, true); |
|
352 addAttribute("ImageCreationTime", "minute", |
|
353 DATATYPE_INTEGER, |
|
354 false, |
|
355 "0", |
|
356 "0", "59", true, true); |
|
357 // second = 60 denotes leap second |
|
358 addAttribute("ImageCreationTime", "second", |
|
359 DATATYPE_INTEGER, |
|
360 false, |
|
361 "0", |
|
362 "0", "60", true, true); |
|
363 |
|
364 // root -> Document -> ImageModificationTime |
|
365 addElement("ImageModificationTime", "Document", |
|
366 CHILD_POLICY_EMPTY); |
|
367 addAttribute("ImageModificationTime", "year", |
|
368 DATATYPE_INTEGER, |
|
369 true, |
|
370 null); |
|
371 addAttribute("ImageModificationTime", "month", |
|
372 DATATYPE_INTEGER, |
|
373 true, |
|
374 null, |
|
375 "1", "12", true, true); |
|
376 addAttribute("ImageModificationTime", "day", |
|
377 DATATYPE_INTEGER, |
|
378 true, |
|
379 null, |
|
380 "1", "31", true, true); |
|
381 addAttribute("ImageModificationTime", "hour", |
|
382 DATATYPE_INTEGER, |
|
383 false, |
|
384 "0", |
|
385 "0", "23", true, true); |
|
386 addAttribute("ImageModificationTime", "minute", |
|
387 DATATYPE_INTEGER, |
|
388 false, |
|
389 "0", |
|
390 "0", "59", true, true); |
|
391 // second = 60 denotes leap second |
|
392 addAttribute("ImageModificationTime", "second", |
|
393 DATATYPE_INTEGER, |
|
394 false, |
|
395 "0", |
|
396 "0", "60", true, true); |
|
397 |
|
398 // root -> Text |
|
399 addElement("Text", standardMetadataFormatName, |
|
400 0, Integer.MAX_VALUE); |
|
401 |
|
402 // root -> Text -> TextEntry |
|
403 addElement("TextEntry", "Text", CHILD_POLICY_EMPTY); |
|
404 addAttribute("TextEntry", "keyword", |
|
405 DATATYPE_STRING, |
|
406 false, |
|
407 null); |
|
408 addAttribute("TextEntry", "value", |
|
409 DATATYPE_STRING, |
|
410 true, |
|
411 null); |
|
412 addAttribute("TextEntry", "language", |
|
413 DATATYPE_STRING, |
|
414 false, |
|
415 null); |
|
416 addAttribute("TextEntry", "encoding", |
|
417 DATATYPE_STRING, |
|
418 false, |
|
419 null); |
|
420 |
|
421 values = new ArrayList(); |
|
422 values.add("none"); |
|
423 values.add("lzw"); |
|
424 values.add("zip"); |
|
425 values.add("bzip"); |
|
426 values.add("other"); |
|
427 addAttribute("TextEntry", "compression", |
|
428 DATATYPE_STRING, |
|
429 false, |
|
430 "none", |
|
431 values); |
|
432 |
|
433 // root -> Transparency |
|
434 addElement("Transparency", standardMetadataFormatName, |
|
435 CHILD_POLICY_SOME); |
|
436 |
|
437 // root -> Transparency -> Alpha |
|
438 addElement("Alpha", "Transparency", CHILD_POLICY_EMPTY); |
|
439 |
|
440 values = new ArrayList(); |
|
441 values.add("none"); |
|
442 values.add("premultiplied"); |
|
443 values.add("nonpremultiplied"); |
|
444 addAttribute("Alpha", "value", |
|
445 DATATYPE_STRING, |
|
446 false, |
|
447 "none", |
|
448 values); |
|
449 |
|
450 // root -> Transparency -> TransparentIndex |
|
451 addSingleAttributeElement("TransparentIndex", "Transparency", |
|
452 DATATYPE_INTEGER); |
|
453 |
|
454 // root -> Transparency -> TransparentColor |
|
455 addElement("TransparentColor", "Transparency", |
|
456 CHILD_POLICY_EMPTY); |
|
457 addAttribute("TransparentColor", "value", |
|
458 DATATYPE_INTEGER, |
|
459 true, |
|
460 0, Integer.MAX_VALUE); |
|
461 |
|
462 // root -> Transparency -> TileTransparencies |
|
463 addElement("TileTransparencies", "Transparency", |
|
464 0, Integer.MAX_VALUE); |
|
465 |
|
466 // root -> Transparency -> TileTransparencies -> TransparentTile |
|
467 addElement("TransparentTile", "TileTransparencies", |
|
468 CHILD_POLICY_EMPTY); |
|
469 addAttribute("TransparentTile", "x", |
|
470 DATATYPE_INTEGER, |
|
471 true, |
|
472 null); |
|
473 addAttribute("TransparentTile", "y", |
|
474 DATATYPE_INTEGER, |
|
475 true, |
|
476 null); |
|
477 |
|
478 // root -> Transparency -> TileOpacities |
|
479 addElement("TileOpacities", "Transparency", |
|
480 0, Integer.MAX_VALUE); |
|
481 |
|
482 // root -> Transparency -> TileOpacities -> OpaqueTile |
|
483 addElement("OpaqueTile", "TileOpacities", |
|
484 CHILD_POLICY_EMPTY); |
|
485 addAttribute("OpaqueTile", "x", |
|
486 DATATYPE_INTEGER, |
|
487 true, |
|
488 null); |
|
489 addAttribute("OpaqueTile", "y", |
|
490 DATATYPE_INTEGER, |
|
491 true, |
|
492 null); |
|
493 } |
|
494 |
|
495 public boolean canNodeAppear(String elementName, |
|
496 ImageTypeSpecifier imageType) { |
|
497 return true; |
|
498 } |
|
499 } |