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 */ 045package com.github.jaiimageio.jpeg2000.impl; 046 047import javax.imageio.metadata.IIOInvalidTreeException; 048import javax.imageio.metadata.IIOMetadataNode; 049 050import org.w3c.dom.Node; 051import org.w3c.dom.NodeList; 052 053/** This class is defined to represent a File Type Box of JPEG JP2 file 054 * format. A File Type Box has a length, and a fixed type of "ftyp". 055 * 056 * The content of a file type box contains the brand ("jp2 " for JP2 file", 057 * the minor version (0 for JP2 file format), and a compatibility list (one of 058 * which should be "jp2 " if brand is not "jp2 ".) 059 */ 060public class FileTypeBox extends Box { 061 /** Cache the element names for this box's xml definition */ 062 private static String[] elementNames = {"Brand", 063 "MinorVersion", 064 "CompatibilityList"}; 065 066 /** This method will be called by the getNativeNodeForSimpleBox of the 067 * class Box to get the element names. 068 */ 069 public static String[] getElementNames() { 070 return elementNames; 071 } 072 073 /** The element values. */ 074 private int brand; 075 private int minorVersion; 076 private int[] compatibility; 077 078 /** Constructs a <code>FileTypeBox</code> from the provided brand, minor 079 * version and compatibility list. 080 */ 081 public FileTypeBox(int br, int minorVersion, int[] comp) { 082 super(16 + (comp == null ? 0 : (comp.length << 2)), 0x66747970, null); 083 this.brand = br; 084 this.minorVersion = minorVersion; 085 this.compatibility = comp; 086 } 087 088 /** Constructs a <code>FileTypeBox</code> from the provided byte array. 089 */ 090 public FileTypeBox(byte[] data) { 091 super(8 + data.length, 0x66747970, data); 092 } 093 094 /** Constructs a <code>FileTypeBox</code> from 095 * <code>org.w3c.dom.Node</code>. 096 */ 097 public FileTypeBox(Node node) throws IIOInvalidTreeException { 098 super(node); 099 NodeList children = node.getChildNodes(); 100 101 for (int i = 0; i < children.getLength(); i++) { 102 Node child = children.item(i); 103 String name = child.getNodeName(); 104 105 if ("Brand".equals(name)) { 106 brand = Box.getIntElementValue(child); 107 } 108 109 if ("MinorVersion".equals(name)) { 110 minorVersion = Box.getIntElementValue(child); 111 } 112 113 if ("CompatibilityList".equals(name)) { 114 compatibility = Box.getIntArrayElementValue(child); 115 } 116 } 117 } 118 119 /** Returns the brand of this file type box. */ 120 public int getBrand() { 121 return brand; 122 } 123 124 /** Returns the minor version of this file type box. */ 125 public int getMinorVersion() { 126 return minorVersion; 127 } 128 129 /** Returns the compatibilty list of this file type box. */ 130 public int[] getCompatibilityList() { 131 return compatibility; 132 } 133 134 /** Creates an <code>IIOMetadataNode</code> from this file type box. 135 * The format of this node is defined in the XML dtd and xsd 136 * for the JP2 image file. 137 */ 138 public IIOMetadataNode getNativeNode() { 139 return getNativeNodeForSimpleBox(); 140 } 141 142 protected void parse(byte[] data) { 143 if (data == null) 144 return; 145 brand = ((data[0] & 0xFF) << 24) | ((data[1] & 0xFF) << 16) | 146 ((data[2] & 0xFF) << 8) | (data[3] & 0xFF); 147 148 minorVersion = ((data[4] & 0xFF) << 24) | ((data[5] & 0xFF) << 16) | 149 ((data[6] & 0xFF) << 8) | (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 = 166 new byte[8 + 167 (compatibility != null ? (compatibility.length << 2) : 0)]; 168 169 copyInt(data, 0, brand); 170 copyInt(data, 4, minorVersion); 171 if (compatibility != null) 172 for (int i = 0, j = 8; i < compatibility.length; i++, j += 4) 173 copyInt(data, j, compatibility[i]); 174 } 175}