1 /*
2  * Copyright (c) 2003, 2004, Oracle and/or its affiliates. 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.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package com.sun.imageio.plugins.bmp;
27 
28 import java.util.Arrays;
29 import javax.imageio.ImageTypeSpecifier;
30 import javax.imageio.metadata.IIOMetadataFormat;
31 import javax.imageio.metadata.IIOMetadataFormatImpl;
32 
33 public class BMPMetadataFormat extends IIOMetadataFormatImpl {
34 
35     private static IIOMetadataFormat instance = null;
36 
BMPMetadataFormat()37     private BMPMetadataFormat() {
38         super(BMPMetadata.nativeMetadataFormatName,
39               CHILD_POLICY_SOME);
40 
41         // root -> ImageDescriptor
42         addElement("ImageDescriptor",
43                    BMPMetadata.nativeMetadataFormatName,
44                    CHILD_POLICY_EMPTY);
45         addAttribute("ImageDescriptor", "bmpVersion",
46                      DATATYPE_STRING, true, null);
47         addAttribute("ImageDescriptor", "width",
48                      DATATYPE_INTEGER, true, null,
49                      "0", "65535", true, true);
50         addAttribute("ImageDescriptor", "height",
51                      DATATYPE_INTEGER, true, null,
52                      "1", "65535", true, true);
53         addAttribute("ImageDescriptor", "bitsPerPixel",
54                      DATATYPE_INTEGER, true, null,
55                      "1", "65535", true, true);
56         addAttribute("ImageDescriptor", "compression",
57                       DATATYPE_INTEGER, false, null);
58         addAttribute("ImageDescriptor", "imageSize",
59                      DATATYPE_INTEGER, true, null,
60                      "1", "65535", true, true);
61 
62         addElement("PixelsPerMeter",
63                    BMPMetadata.nativeMetadataFormatName,
64                    CHILD_POLICY_EMPTY);
65         addAttribute("PixelsPerMeter", "X",
66                      DATATYPE_INTEGER, false, null,
67                      "1", "65535", true, true);
68         addAttribute("PixelsPerMeter", "Y",
69                      DATATYPE_INTEGER, false, null,
70                      "1", "65535", true, true);
71 
72         addElement("ColorsUsed",
73                    BMPMetadata.nativeMetadataFormatName,
74                    CHILD_POLICY_EMPTY);
75         addAttribute("ColorsUsed", "value",
76                      DATATYPE_INTEGER, true, null,
77                      "0", "65535", true, true);
78 
79         addElement("ColorsImportant",
80                    BMPMetadata.nativeMetadataFormatName,
81                    CHILD_POLICY_EMPTY);
82         addAttribute("ColorsImportant", "value",
83                      DATATYPE_INTEGER, false, null,
84                      "0", "65535", true, true);
85 
86         addElement("BI_BITFIELDS_Mask",
87                    BMPMetadata.nativeMetadataFormatName,
88                    CHILD_POLICY_EMPTY);
89         addAttribute("BI_BITFIELDS_Mask", "red",
90                      DATATYPE_INTEGER, false, null,
91                      "0", "65535", true, true);
92         addAttribute("BI_BITFIELDS_Mask", "green",
93                      DATATYPE_INTEGER, false, null,
94                      "0", "65535", true, true);
95         addAttribute("BI_BITFIELDS_Mask", "blue",
96                      DATATYPE_INTEGER, false, null,
97                      "0", "65535", true, true);
98 
99         addElement("ColorSpace",
100                    BMPMetadata.nativeMetadataFormatName,
101                    CHILD_POLICY_EMPTY);
102         addAttribute("ColorSpace", "value",
103                      DATATYPE_INTEGER, false, null,
104                      "0", "65535", true, true);
105 
106         addElement("LCS_CALIBRATED_RGB",
107                    BMPMetadata.nativeMetadataFormatName,
108                    CHILD_POLICY_EMPTY);
109 
110         /// Should the max value be 1.7976931348623157e+308 ?
111         addAttribute("LCS_CALIBRATED_RGB", "redX",
112                      DATATYPE_DOUBLE, false, null,
113                      "0", "65535", true, true);
114         addAttribute("LCS_CALIBRATED_RGB", "redY",
115                      DATATYPE_DOUBLE, false, null,
116                      "0", "65535", true, true);
117         addAttribute("LCS_CALIBRATED_RGB", "redZ",
118                      DATATYPE_DOUBLE, false, null,
119                      "0", "65535", true, true);
120         addAttribute("LCS_CALIBRATED_RGB", "greenX",
121                      DATATYPE_DOUBLE, false, null,
122                      "0", "65535", true, true);
123         addAttribute("LCS_CALIBRATED_RGB", "greenY",
124                      DATATYPE_DOUBLE, false, null,
125                      "0", "65535", true, true);
126         addAttribute("LCS_CALIBRATED_RGB", "greenZ",
127                      DATATYPE_DOUBLE, false, null,
128                      "0", "65535", true, true);
129         addAttribute("LCS_CALIBRATED_RGB", "blueX",
130                      DATATYPE_DOUBLE, false, null,
131                      "0", "65535", true, true);
132         addAttribute("LCS_CALIBRATED_RGB", "blueY",
133                      DATATYPE_DOUBLE, false, null,
134                      "0", "65535", true, true);
135         addAttribute("LCS_CALIBRATED_RGB", "blueZ",
136                      DATATYPE_DOUBLE, false, null,
137                      "0", "65535", true, true);
138 
139         addElement("LCS_CALIBRATED_RGB_GAMMA",
140                    BMPMetadata.nativeMetadataFormatName,
141                    CHILD_POLICY_EMPTY);
142         addAttribute("LCS_CALIBRATED_RGB_GAMMA","red",
143                      DATATYPE_INTEGER, false, null,
144                      "0", "65535", true, true);
145         addAttribute("LCS_CALIBRATED_RGB_GAMMA","green",
146                      DATATYPE_INTEGER, false, null,
147                      "0", "65535", true, true);
148         addAttribute("LCS_CALIBRATED_RGB_GAMMA","blue",
149                      DATATYPE_INTEGER, false, null,
150                      "0", "65535", true, true);
151 
152         addElement("Intent",
153                    BMPMetadata.nativeMetadataFormatName,
154                    CHILD_POLICY_EMPTY);
155         addAttribute("Intent", "value",
156                      DATATYPE_INTEGER, false, null,
157                      "0", "65535", true, true);
158 
159         // root -> Palette
160         addElement("Palette",
161                    BMPMetadata.nativeMetadataFormatName,
162                    2, 256);
163         addAttribute("Palette", "sizeOfPalette",
164                      DATATYPE_INTEGER, true, null);
165         addBooleanAttribute("Palette", "sortFlag",
166                             false, false);
167 
168         // root -> Palette -> PaletteEntry
169         addElement("PaletteEntry", "Palette",
170                    CHILD_POLICY_EMPTY);
171         addAttribute("PaletteEntry", "index",
172                      DATATYPE_INTEGER, true, null,
173                      "0", "255", true, true);
174         addAttribute("PaletteEntry", "red",
175                      DATATYPE_INTEGER, true, null,
176                      "0", "255", true, true);
177         addAttribute("PaletteEntry", "green",
178                      DATATYPE_INTEGER, true, null,
179                      "0", "255", true, true);
180         addAttribute("PaletteEntry", "blue",
181                      DATATYPE_INTEGER, true, null,
182                      "0", "255", true, true);
183 
184 
185         // root -> CommentExtensions
186         addElement("CommentExtensions",
187                    BMPMetadata.nativeMetadataFormatName,
188                    1, Integer.MAX_VALUE);
189 
190         // root -> CommentExtensions -> CommentExtension
191         addElement("CommentExtension", "CommentExtensions",
192                    CHILD_POLICY_EMPTY);
193         addAttribute("CommentExtension", "value",
194                      DATATYPE_STRING, true, null);
195     }
196 
canNodeAppear(String elementName, ImageTypeSpecifier imageType)197     public boolean canNodeAppear(String elementName,
198                                  ImageTypeSpecifier imageType) {
199         return true;
200     }
201 
getInstance()202     public static synchronized IIOMetadataFormat getInstance() {
203         if (instance == null) {
204             instance = new BMPMetadataFormat();
205         }
206         return instance;
207     }
208 }
209