1. /*
  2. * @(#)StandardMetadataFormat.java 1.9 03/12/19
  3. *
  4. * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package com.sun.imageio.plugins.common;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import javax.imageio.ImageTypeSpecifier;
  11. import javax.imageio.metadata.IIOMetadataFormatImpl;
  12. public class StandardMetadataFormat extends IIOMetadataFormatImpl {
  13. // Utility method for nodes with a single atttribute named "value"
  14. private void addSingleAttributeElement(String elementName,
  15. String parentName,
  16. int dataType) {
  17. addElement(elementName, parentName, CHILD_POLICY_EMPTY);
  18. addAttribute(elementName, "value", dataType, true, null);
  19. }
  20. public StandardMetadataFormat() {
  21. super(standardMetadataFormatName, CHILD_POLICY_SOME);
  22. List values;
  23. // root -> Chroma
  24. addElement("Chroma", standardMetadataFormatName,
  25. CHILD_POLICY_SOME);
  26. // root -> Chroma -> ColorSpaceType
  27. addElement("ColorSpaceType", "Chroma",
  28. CHILD_POLICY_EMPTY);
  29. values = new ArrayList();
  30. values.add("XYZ");
  31. values.add("Lab");
  32. values.add("Luv");
  33. values.add("YCbCr");
  34. values.add("Yxy");
  35. values.add("YCCK");
  36. values.add("PhotoYCC");
  37. values.add("RGB");
  38. values.add("GRAY");
  39. values.add("HSV");
  40. values.add("HLS");
  41. values.add("CMYK");
  42. values.add("CMY");
  43. values.add("2CLR");
  44. values.add("3CLR");
  45. values.add("4CLR");
  46. values.add("5CLR");
  47. values.add("6CLR");
  48. values.add("7CLR");
  49. values.add("8CLR");
  50. values.add("9CLR");
  51. values.add("ACLR");
  52. values.add("BCLR");
  53. values.add("CCLR");
  54. values.add("DCLR");
  55. values.add("ECLR");
  56. values.add("FCLR");
  57. addAttribute("ColorSpaceType",
  58. "name",
  59. DATATYPE_STRING,
  60. true,
  61. null,
  62. values);
  63. // root -> Chroma -> NumChannels
  64. addElement("NumChannels", "Chroma",
  65. CHILD_POLICY_EMPTY);
  66. addAttribute("NumChannels", "value",
  67. DATATYPE_INTEGER,
  68. true,
  69. 0, Integer.MAX_VALUE);
  70. // root -> Chroma -> Gamma
  71. addElement("Gamma", "Chroma", CHILD_POLICY_EMPTY);
  72. addAttribute("Gamma", "value",
  73. DATATYPE_FLOAT, true, null);
  74. // root -> Chroma -> BlackIsZero
  75. addElement("BlackIsZero", "Chroma", CHILD_POLICY_EMPTY);
  76. addBooleanAttribute("BlackIsZero", "value", true, true);
  77. // root -> Chroma -> Palette
  78. addElement("Palette", "Chroma", 0, Integer.MAX_VALUE);
  79. // root -> Chroma -> PaletteEntry
  80. addElement("PaletteEntry", "Palette", CHILD_POLICY_EMPTY);
  81. addAttribute("PaletteEntry", "index", DATATYPE_INTEGER,
  82. true, null);
  83. addAttribute("PaletteEntry", "red", DATATYPE_INTEGER,
  84. true, null);
  85. addAttribute("PaletteEntry", "green", DATATYPE_INTEGER,
  86. true, null);
  87. addAttribute("PaletteEntry", "blue", DATATYPE_INTEGER,
  88. true, null);
  89. addAttribute("PaletteEntry", "alpha", DATATYPE_INTEGER,
  90. false, "255");
  91. // root -> Chroma -> BackgroundIndex
  92. addElement("BackgroundIndex", "Chroma", CHILD_POLICY_EMPTY);
  93. addAttribute("BackgroundIndex", "value", DATATYPE_INTEGER,
  94. true, null);
  95. // root -> Chroma -> BackgroundColor
  96. addElement("BackgroundColor", "Chroma", CHILD_POLICY_EMPTY);
  97. addAttribute("BackgroundColor", "red", DATATYPE_INTEGER,
  98. true, null);
  99. addAttribute("BackgroundColor", "green", DATATYPE_INTEGER,
  100. true, null);
  101. addAttribute("BackgroundColor", "blue", DATATYPE_INTEGER,
  102. true, null);
  103. // root -> Compression
  104. addElement("Compression", standardMetadataFormatName,
  105. CHILD_POLICY_SOME);
  106. // root -> Compression -> CompressionTypeName
  107. addSingleAttributeElement("CompressionTypeName",
  108. "Compression",
  109. DATATYPE_STRING);
  110. // root -> Compression -> Lossless
  111. addElement("Lossless", "Compression", CHILD_POLICY_EMPTY);
  112. addBooleanAttribute("Lossless", "value", true, true);
  113. // root -> Compression -> NumProgressiveScans
  114. addSingleAttributeElement("NumProgressiveScans",
  115. "Compression",
  116. DATATYPE_INTEGER);
  117. // root -> Compression -> BitRate
  118. addSingleAttributeElement("BitRate",
  119. "Compression",
  120. DATATYPE_FLOAT);
  121. // root -> Data
  122. addElement("Data", standardMetadataFormatName,
  123. CHILD_POLICY_SOME);
  124. // root -> Data -> PlanarConfiguration
  125. addElement("PlanarConfiguration", "Data", CHILD_POLICY_EMPTY);
  126. values = new ArrayList();
  127. values.add("PixelInterleaved");
  128. values.add("PlaneInterleaved");
  129. values.add("LineInterleaved");
  130. values.add("TileInterleaved");
  131. addAttribute("PlanarConfiguration", "value",
  132. DATATYPE_STRING,
  133. true,
  134. null,
  135. values);
  136. // root -> Data -> SampleFormat
  137. addElement("SampleFormat", "Data", CHILD_POLICY_EMPTY);
  138. values = new ArrayList();
  139. values.add("SignedIntegral");
  140. values.add("UnsignedIntegral");
  141. values.add("Real");
  142. values.add("Index");
  143. addAttribute("SampleFormat", "value",
  144. DATATYPE_STRING,
  145. true,
  146. null,
  147. values);
  148. // root -> Data -> BitsPerSample
  149. addElement("BitsPerSample", "Data",
  150. CHILD_POLICY_EMPTY);
  151. addAttribute("BitsPerSample", "value",
  152. DATATYPE_INTEGER,
  153. true,
  154. 1, Integer.MAX_VALUE);
  155. // root -> Data -> SignificantBitsPerSample
  156. addElement("SignificantBitsPerSample", "Data", CHILD_POLICY_EMPTY);
  157. addAttribute("SignificantBitsPerSample", "value",
  158. DATATYPE_INTEGER,
  159. true,
  160. 1, Integer.MAX_VALUE);
  161. // root -> Data -> SampleMSB
  162. addElement("SampleMSB", "Data",
  163. CHILD_POLICY_EMPTY);
  164. addAttribute("SampleMSB", "value",
  165. DATATYPE_INTEGER,
  166. true,
  167. 1, Integer.MAX_VALUE);
  168. // root -> Dimension
  169. addElement("Dimension", standardMetadataFormatName,
  170. CHILD_POLICY_SOME);
  171. // root -> Dimension -> PixelAspectRatio
  172. addSingleAttributeElement("PixelAspectRatio",
  173. "Dimension",
  174. DATATYPE_FLOAT);
  175. // root -> Dimension -> ImageOrientation
  176. addElement("ImageOrientation", "Dimension",
  177. CHILD_POLICY_EMPTY);
  178. values = new ArrayList();
  179. values.add("Normal");
  180. values.add("Rotate90");
  181. values.add("Rotate180");
  182. values.add("Rotate270");
  183. values.add("FlipH");
  184. values.add("FlipV");
  185. values.add("FlipHRotate90");
  186. values.add("FlipVRotate90");
  187. addAttribute("ImageOrientation", "value",
  188. DATATYPE_STRING,
  189. true,
  190. null,
  191. values);
  192. // root -> Dimension -> HorizontalPixelSize
  193. addSingleAttributeElement("HorizontalPixelSize",
  194. "Dimension",
  195. DATATYPE_FLOAT);
  196. // root -> Dimension -> VerticalPixelSize
  197. addSingleAttributeElement("VerticalPixelSize",
  198. "Dimension",
  199. DATATYPE_FLOAT);
  200. // root -> Dimension -> HorizontalPhysicalPixelSpacing
  201. addSingleAttributeElement("HorizontalPhysicalPixelSpacing",
  202. "Dimension",
  203. DATATYPE_FLOAT);
  204. // root -> Dimension -> VerticalPhysicalPixelSpacing
  205. addSingleAttributeElement("VerticalPhysicalPixelSpacing",
  206. "Dimension",
  207. DATATYPE_FLOAT);
  208. // root -> Dimension -> HorizontalPosition
  209. addSingleAttributeElement("HorizontalPosition",
  210. "Dimension",
  211. DATATYPE_FLOAT);
  212. // root -> Dimension -> VerticalPosition
  213. addSingleAttributeElement("VerticalPosition",
  214. "Dimension",
  215. DATATYPE_FLOAT);
  216. // root -> Dimension -> HorizontalPixelOffset
  217. addSingleAttributeElement("HorizontalPixelOffset",
  218. "Dimension",
  219. DATATYPE_INTEGER);
  220. // root -> Dimension -> VerticalPixelOffset
  221. addSingleAttributeElement("VerticalPixelOffset",
  222. "Dimension",
  223. DATATYPE_INTEGER);
  224. // root -> Dimension -> HorizontalScreenSize
  225. addSingleAttributeElement("HorizontalScreenSize",
  226. "Dimension",
  227. DATATYPE_INTEGER);
  228. // root -> Dimension -> VerticalScreenSize
  229. addSingleAttributeElement("VerticalScreenSize",
  230. "Dimension",
  231. DATATYPE_INTEGER);
  232. // root -> Document
  233. addElement("Document", standardMetadataFormatName,
  234. CHILD_POLICY_SOME);
  235. // root -> Document -> FormatVersion
  236. addElement("FormatVersion", "Document",
  237. CHILD_POLICY_EMPTY);
  238. addAttribute("FormatVersion", "value",
  239. DATATYPE_STRING,
  240. true,
  241. null);
  242. // root -> Document -> SubimageInterpretation
  243. addElement("SubimageInterpretation", "Document",
  244. CHILD_POLICY_EMPTY);
  245. values = new ArrayList();
  246. values.add("Standalone");
  247. values.add("SinglePage");
  248. values.add("FullResolution");
  249. values.add("ReducedResolution");
  250. values.add("PyramidLayer");
  251. values.add("Preview");
  252. values.add("VolumeSlice");
  253. values.add("ObjectView");
  254. values.add("Panorama");
  255. values.add("AnimationFrame");
  256. values.add("TransparencyMask");
  257. values.add("CompositingLayer");
  258. values.add("SpectralSlice");
  259. values.add("Unknown");
  260. addAttribute("SubimageInterpretation", "value",
  261. DATATYPE_STRING,
  262. true,
  263. null,
  264. values);
  265. // root -> Document -> ImageCreationTime
  266. addElement("ImageCreationTime", "Document",
  267. CHILD_POLICY_EMPTY);
  268. addAttribute("ImageCreationTime", "year",
  269. DATATYPE_INTEGER,
  270. true,
  271. null);
  272. addAttribute("ImageCreationTime", "month",
  273. DATATYPE_INTEGER,
  274. true,
  275. null,
  276. "1", "12", true, true);
  277. addAttribute("ImageCreationTime", "day",
  278. DATATYPE_INTEGER,
  279. true,
  280. null,
  281. "1", "31", true, true);
  282. addAttribute("ImageCreationTime", "hour",
  283. DATATYPE_INTEGER,
  284. false,
  285. "0",
  286. "0", "23", true, true);
  287. addAttribute("ImageCreationTime", "minute",
  288. DATATYPE_INTEGER,
  289. false,
  290. "0",
  291. "0", "59", true, true);
  292. // second = 60 denotes leap second
  293. addAttribute("ImageCreationTime", "second",
  294. DATATYPE_INTEGER,
  295. false,
  296. "0",
  297. "0", "60", true, true);
  298. // root -> Document -> ImageModificationTime
  299. addElement("ImageModificationTime", "Document",
  300. CHILD_POLICY_EMPTY);
  301. addAttribute("ImageModificationTime", "year",
  302. DATATYPE_INTEGER,
  303. true,
  304. null);
  305. addAttribute("ImageModificationTime", "month",
  306. DATATYPE_INTEGER,
  307. true,
  308. null,
  309. "1", "12", true, true);
  310. addAttribute("ImageModificationTime", "day",
  311. DATATYPE_INTEGER,
  312. true,
  313. null,
  314. "1", "31", true, true);
  315. addAttribute("ImageModificationTime", "hour",
  316. DATATYPE_INTEGER,
  317. false,
  318. "0",
  319. "0", "23", true, true);
  320. addAttribute("ImageModificationTime", "minute",
  321. DATATYPE_INTEGER,
  322. false,
  323. "0",
  324. "0", "59", true, true);
  325. // second = 60 denotes leap second
  326. addAttribute("ImageModificationTime", "second",
  327. DATATYPE_INTEGER,
  328. false,
  329. "0",
  330. "0", "60", true, true);
  331. // root -> Text
  332. addElement("Text", standardMetadataFormatName,
  333. 0, Integer.MAX_VALUE);
  334. // root -> Text -> TextEntry
  335. addElement("TextEntry", "Text", CHILD_POLICY_EMPTY);
  336. addAttribute("TextEntry", "keyword",
  337. DATATYPE_STRING,
  338. false,
  339. null);
  340. addAttribute("TextEntry", "value",
  341. DATATYPE_STRING,
  342. true,
  343. null);
  344. addAttribute("TextEntry", "language",
  345. DATATYPE_STRING,
  346. false,
  347. null);
  348. addAttribute("TextEntry", "encoding",
  349. DATATYPE_STRING,
  350. false,
  351. null);
  352. values = new ArrayList();
  353. values.add("none");
  354. values.add("lzw");
  355. values.add("zip");
  356. values.add("bzip");
  357. values.add("other");
  358. addAttribute("TextEntry", "compression",
  359. DATATYPE_STRING,
  360. false,
  361. "none",
  362. values);
  363. // root -> Transparency
  364. addElement("Transparency", standardMetadataFormatName,
  365. CHILD_POLICY_SOME);
  366. // root -> Transparency -> Alpha
  367. addElement("Alpha", "Transparency", CHILD_POLICY_EMPTY);
  368. values = new ArrayList();
  369. values.add("none");
  370. values.add("premultiplied");
  371. values.add("nonpremultiplied");
  372. addAttribute("Alpha", "value",
  373. DATATYPE_STRING,
  374. false,
  375. "none",
  376. values);
  377. // root -> Transparency -> TransparentIndex
  378. addSingleAttributeElement("TransparentIndex", "Transparency",
  379. DATATYPE_INTEGER);
  380. // root -> Transparency -> TransparentColor
  381. addElement("TransparentColor", "Transparency",
  382. CHILD_POLICY_EMPTY);
  383. addAttribute("TransparentColor", "value",
  384. DATATYPE_INTEGER,
  385. true,
  386. 0, Integer.MAX_VALUE);
  387. // root -> Transparency -> TileTransparencies
  388. addElement("TileTransparencies", "Transparency",
  389. 0, Integer.MAX_VALUE);
  390. // root -> Transparency -> TileTransparencies -> TransparentTile
  391. addElement("TransparentTile", "TileTransparencies",
  392. CHILD_POLICY_EMPTY);
  393. addAttribute("TransparentTile", "x",
  394. DATATYPE_INTEGER,
  395. true,
  396. null);
  397. addAttribute("TransparentTile", "y",
  398. DATATYPE_INTEGER,
  399. true,
  400. null);
  401. // root -> Transparency -> TileOpacities
  402. addElement("TileOpacities", "Transparency",
  403. 0, Integer.MAX_VALUE);
  404. // root -> Transparency -> TileOpacities -> OpaqueTile
  405. addElement("OpaqueTile", "TileOpacities",
  406. CHILD_POLICY_EMPTY);
  407. addAttribute("OpaqueTile", "x",
  408. DATATYPE_INTEGER,
  409. true,
  410. null);
  411. addAttribute("OpaqueTile", "y",
  412. DATATYPE_INTEGER,
  413. true,
  414. null);
  415. }
  416. public boolean canNodeAppear(String elementName,
  417. ImageTypeSpecifier imageType) {
  418. return true;
  419. }
  420. }