1 /*
2  * Copyright (c) 2018, 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.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  * @test
26  * @bug 6686236
27  * @summary Checks whether GIF native metadata format returns appropriate max
28  *          value that could be set for characterCellWidth and
29  *          characterCellHeight attributes of PlainTextExtension node. Besides,
30  *          the test also checks whether IIOInvalidTreeException is thrown when
31  *          incorrect value is set on these two attributes.
32  * @run main GIFCharCellDimensionTest
33  */
34 import javax.imageio.ImageIO;
35 import javax.imageio.ImageWriter;
36 import javax.imageio.ImageTypeSpecifier;
37 import javax.imageio.metadata.IIOInvalidTreeException;
38 import javax.imageio.metadata.IIOMetadata;
39 import javax.imageio.metadata.IIOMetadataNode;
40 import javax.imageio.metadata.IIOMetadataFormat;
41 import java.util.Iterator;
42 import java.awt.image.BufferedImage;
43 import static java.awt.image.BufferedImage.TYPE_4BYTE_ABGR;
44 
45 public class GIFCharCellDimensionTest {
46     // GIF image metadata and native metadata format.
47     private static IIOMetadata imageMetadata = null;
48     private static IIOMetadataFormat metadataFormat = null;
49     private static String formatName = null;
50 
initializeTest()51     private static void initializeTest() {
52         // Initialize the test case by querying GIF image writer for default
53         // image metadata and native metadata format.
54         ImageWriter gifWriter = null;
55         Iterator<ImageWriter> iterGifWriter = null;
56         BufferedImage bufImage = null;
57         ImageTypeSpecifier imageType = null;
58 
59         try {
60             iterGifWriter = ImageIO.getImageWritersBySuffix("GIF");
61             if (iterGifWriter.hasNext()) {
62                 gifWriter = iterGifWriter.next();
63                 bufImage = new BufferedImage(32, 32, TYPE_4BYTE_ABGR);
64 
65                 // Get GIF image metadata
66                 imageMetadata = gifWriter.getDefaultImageMetadata(
67                         ImageTypeSpecifier.createFromRenderedImage(bufImage),
68                         gifWriter.getDefaultWriteParam());
69                 if (imageMetadata == null) {
70                     reportException("Test Failed. Could not get image" +
71                             " metadata.");
72                 }
73 
74                 // Get GIF native metadata format.
75                 formatName = imageMetadata.getNativeMetadataFormatName();
76                 metadataFormat = imageMetadata.getMetadataFormat(formatName);
77                 if (metadataFormat == null) {
78                     reportException("Test Failed. Could not get native" +
79                             " metadata format.");
80                 }
81             } else {
82                 reportException("Test Failed. No GIF image writer found.");
83             }
84         } finally {
85             gifWriter.dispose();
86         }
87     }
88 
createPlainTextExtensionNode(String value)89     private static IIOMetadataNode createPlainTextExtensionNode(String value) {
90         // Create a PlainTextExtensionNode with required values
91         IIOMetadataNode rootNode = null;
92 
93         if (imageMetadata != null && formatName != null) {
94             IIOMetadataNode plainTextNode = null;
95 
96             rootNode = new IIOMetadataNode(formatName);
97             plainTextNode = new IIOMetadataNode("PlainTextExtension");
98             plainTextNode.setAttribute("textGridLeft", "0");
99             plainTextNode.setAttribute("textGridTop", "0");
100             plainTextNode.setAttribute("textGridWidth", "32");
101             plainTextNode.setAttribute("textGridHeight", "32");
102             // Set required values for cell width and cell height
103             plainTextNode.setAttribute("characterCellWidth", value);
104             plainTextNode.setAttribute("characterCellHeight", value);
105             plainTextNode.setAttribute("textForegroundColor", "0");
106             plainTextNode.setAttribute("textBackgroundColor", "1");
107             rootNode.appendChild(plainTextNode);
108         } else {
109             reportException("Test Failed. Un-initialized image metadata.");
110         }
111 
112         return rootNode;
113     }
114 
testCharacterCellDimensions()115     private static void testCharacterCellDimensions() {
116         if (imageMetadata != null && metadataFormat != null) {
117             // Get max permissible value that could be set on characterCellWidth
118             // and characterCellHeight attributes of plain text node.
119             String cellWidth = metadataFormat.getAttributeMaxValue(
120                     "PlainTextExtension",
121                     "characterCellWidth");
122             String cellHeight = metadataFormat.getAttributeMaxValue(
123                     "PlainTextExtension",
124                     "characterCellHeight");
125 
126             // Test fails if the max permissible value is larger than 255
127             int maxCharCellWidth = Integer.parseInt(cellWidth);
128             int maxCharCellHeight = Integer.parseInt(cellHeight);
129             if (maxCharCellWidth > 255 || maxCharCellHeight > 255) {
130                 reportException("Test Failed. Invalid max range for" +
131                         " character cell width or character cell height.");
132             }
133 
134             try {
135                 // Merge a plain text node with incorrect value set on
136                 // characterCellWidth and characterCellHeight attributes.
137                 IIOMetadataNode root = createPlainTextExtensionNode("256");
138                 imageMetadata.setFromTree(formatName, root);
139             } catch (IIOInvalidTreeException exception) {
140                 // No-op. Expected exception was thrown.
141             }
142         } else {
143             reportException("Test Failed. Un-initialized image metadata or" +
144                     " metadata format.");
145         }
146     }
147 
reportException(String message)148     private static void reportException(String message) {
149         // Report an exception with the required message.
150         throw new RuntimeException(message);
151     }
152 
main(String[] args)153     public static void main(String[] args) {
154         // Initialize the test
155         initializeTest();
156 
157         // Test plain text extension node.
158         testCharacterCellDimensions();
159     }
160 }