001: /*
002: * $RCSfile: FileTypeBox.java,v $
003: *
004: *
005: * Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved.
006: *
007: * Redistribution and use in source and binary forms, with or without
008: * modification, are permitted provided that the following conditions
009: * are met:
010: *
011: * - Redistribution of source code must retain the above copyright
012: * notice, this list of conditions and the following disclaimer.
013: *
014: * - Redistribution in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * Neither the name of Sun Microsystems, Inc. or the names of
020: * contributors may be used to endorse or promote products derived
021: * from this software without specific prior written permission.
022: *
023: * This software is provided "AS IS," without a warranty of any
024: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
025: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
026: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
027: * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
028: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
029: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
030: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
031: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
032: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
033: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
034: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
035: * POSSIBILITY OF SUCH DAMAGES.
036: *
037: * You acknowledge that this software is not designed or intended for
038: * use in the design, construction, operation or maintenance of any
039: * nuclear facility.
040: *
041: * $Revision: 1.1 $
042: * $Date: 2005/02/11 05:01:32 $
043: * $State: Exp $
044: */
045: package com.sun.media.imageioimpl.plugins.jpeg2000;
046:
047: import javax.imageio.metadata.IIOInvalidTreeException;
048: import javax.imageio.metadata.IIOMetadataNode;
049: import org.w3c.dom.Node;
050: import org.w3c.dom.NodeList;
051:
052: /** This class is defined to represent a File Type Box of JPEG JP2 file
053: * format. A File Type Box has a length, and a fixed type of "ftyp".
054: *
055: * The content of a file type box contains the brand ("jp2 " for JP2 file",
056: * the minor version (0 for JP2 file format), and a compatibility list (one of
057: * which should be "jp2 " if brand is not "jp2 ".)
058: */
059: public class FileTypeBox extends Box {
060: /** Cache the element names for this box's xml definition */
061: private static String[] elementNames = { "Brand", "MinorVersion",
062: "CompatibilityList" };
063:
064: /** This method will be called by the getNativeNodeForSimpleBox of the
065: * class Box to get the element names.
066: */
067: public static String[] getElementNames() {
068: return elementNames;
069: }
070:
071: /** The element values. */
072: private int brand;
073: private int minorVersion;
074: private int[] compatibility;
075:
076: /** Constructs a <code>FileTypeBox</code> from the provided brand, minor
077: * version and compatibility list.
078: */
079: public FileTypeBox(int br, int minorVersion, int[] comp) {
080: super (16 + (comp == null ? 0 : (comp.length << 2)), 0x66747970,
081: null);
082: this .brand = br;
083: this .minorVersion = minorVersion;
084: this .compatibility = comp;
085: }
086:
087: /** Constructs a <code>FileTypeBox</code> from the provided byte array.
088: */
089: public FileTypeBox(byte[] data) {
090: super (8 + data.length, 0x66747970, data);
091: }
092:
093: /** Constructs a <code>FileTypeBox</code> from
094: * <code>org.w3c.dom.Node</code>.
095: */
096: public FileTypeBox(Node node) throws IIOInvalidTreeException {
097: super (node);
098: NodeList children = node.getChildNodes();
099:
100: for (int i = 0; i < children.getLength(); i++) {
101: Node child = children.item(i);
102: String name = child.getNodeName();
103:
104: if ("Brand".equals(name)) {
105: brand = Box.getIntElementValue(child);
106: }
107:
108: if ("MinorVersion".equals(name)) {
109: minorVersion = Box.getIntElementValue(child);
110: }
111:
112: if ("CompatibilityList".equals(name)) {
113: compatibility = Box.getIntArrayElementValue(child);
114: }
115: }
116: }
117:
118: /** Returns the brand of this file type box. */
119: public int getBrand() {
120: return brand;
121: }
122:
123: /** Returns the minor version of this file type box. */
124: public int getMinorVersion() {
125: return minorVersion;
126: }
127:
128: /** Returns the compatibilty list of this file type box. */
129: public int[] getCompatibilityList() {
130: return compatibility;
131: }
132:
133: /** Creates an <code>IIOMetadataNode</code> from this file type box.
134: * The format of this node is defined in the XML dtd and xsd
135: * for the JP2 image file.
136: */
137: public IIOMetadataNode getNativeNode() {
138: return getNativeNodeForSimpleBox();
139: }
140:
141: protected void parse(byte[] data) {
142: if (data == null)
143: return;
144: brand = ((data[0] & 0xFF) << 24) | ((data[1] & 0xFF) << 16)
145: | ((data[2] & 0xFF) << 8) | (data[3] & 0xFF);
146:
147: minorVersion = ((data[4] & 0xFF) << 24)
148: | ((data[5] & 0xFF) << 16) | ((data[6] & 0xFF) << 8)
149: | (data[7] & 0xFF);
150:
151: int len = (data.length - 8) / 4;
152: if (len > 0) {
153: compatibility = new int[len];
154: for (int i = 0, j = 8; i < len; i++, j += 4)
155: compatibility[i] = ((data[j] & 0xFF) << 24)
156: | ((data[j + 1] & 0xFF) << 16)
157: | ((data[j + 2] & 0xFF) << 8)
158: | (data[j + 3] & 0xFF);
159: }
160: }
161:
162: protected void compose() {
163: if (data != null)
164: return;
165: data = new byte[8 + (compatibility != null ? (compatibility.length << 2)
166: : 0)];
167:
168: copyInt(data, 0, brand);
169: copyInt(data, 4, minorVersion);
170: if (compatibility != null)
171: for (int i = 0, j = 8; i < compatibility.length; i++, j += 4)
172: copyInt(data, j, compatibility[i]);
173: }
174: }
|