|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package com.sun.imageio.plugins.gif; |
|
|
|
import javax.imageio.metadata.IIOInvalidTreeException; |
|
import javax.imageio.metadata.IIOMetadataNode; |
|
import javax.imageio.metadata.IIOMetadataFormatImpl; |
|
import org.w3c.dom.Node; |
|
|
|
// TODO - document elimination of globalColorTableFlag |
|
|
|
public class GIFStreamMetadata extends GIFMetadata { |
|
|
|
|
|
static final String |
|
nativeMetadataFormatName = "javax_imageio_gif_stream_1.0"; |
|
|
|
static final String[] versionStrings = { "87a", "89a" }; |
|
|
|
public String version; |
|
public int logicalScreenWidth; |
|
public int logicalScreenHeight; |
|
public int colorResolution; |
|
public int pixelAspectRatio; |
|
|
|
public int backgroundColorIndex; |
|
public boolean sortFlag; |
|
|
|
static final String[] colorTableSizes = { |
|
"2", "4", "8", "16", "32", "64", "128", "256" |
|
}; |
|
|
|
|
|
public byte[] globalColorTable = null; |
|
|
|
protected GIFStreamMetadata(boolean standardMetadataFormatSupported, |
|
String nativeMetadataFormatName, |
|
String nativeMetadataFormatClassName, |
|
String[] extraMetadataFormatNames, |
|
String[] extraMetadataFormatClassNames) |
|
{ |
|
super(standardMetadataFormatSupported, |
|
nativeMetadataFormatName, |
|
nativeMetadataFormatClassName, |
|
extraMetadataFormatNames, |
|
extraMetadataFormatClassNames); |
|
} |
|
|
|
public GIFStreamMetadata() { |
|
this(true, |
|
nativeMetadataFormatName, |
|
"com.sun.imageio.plugins.gif.GIFStreamMetadataFormat", |
|
null, null); |
|
|
|
} |
|
|
|
public boolean isReadOnly() { |
|
return true; |
|
} |
|
|
|
public Node getAsTree(String formatName) { |
|
if (formatName.equals(nativeMetadataFormatName)) { |
|
return getNativeTree(); |
|
} else if (formatName.equals |
|
(IIOMetadataFormatImpl.standardMetadataFormatName)) { |
|
return getStandardTree(); |
|
} else { |
|
throw new IllegalArgumentException("Not a recognized format!"); |
|
} |
|
} |
|
|
|
private Node getNativeTree() { |
|
IIOMetadataNode node; |
|
IIOMetadataNode root = |
|
new IIOMetadataNode(nativeMetadataFormatName); |
|
|
|
node = new IIOMetadataNode("Version"); |
|
node.setAttribute("value", version); |
|
root.appendChild(node); |
|
|
|
|
|
node = new IIOMetadataNode("LogicalScreenDescriptor"); |
|
|
|
|
|
|
|
*/ |
|
node.setAttribute("logicalScreenWidth", |
|
logicalScreenWidth == UNDEFINED_INTEGER_VALUE ? |
|
"" : Integer.toString(logicalScreenWidth)); |
|
node.setAttribute("logicalScreenHeight", |
|
logicalScreenHeight == UNDEFINED_INTEGER_VALUE ? |
|
"" : Integer.toString(logicalScreenHeight)); |
|
|
|
node.setAttribute("colorResolution", |
|
colorResolution == UNDEFINED_INTEGER_VALUE ? |
|
"" : Integer.toString(colorResolution)); |
|
node.setAttribute("pixelAspectRatio", |
|
Integer.toString(pixelAspectRatio)); |
|
root.appendChild(node); |
|
|
|
if (globalColorTable != null) { |
|
node = new IIOMetadataNode("GlobalColorTable"); |
|
int numEntries = globalColorTable.length/3; |
|
node.setAttribute("sizeOfGlobalColorTable", |
|
Integer.toString(numEntries)); |
|
node.setAttribute("backgroundColorIndex", |
|
Integer.toString(backgroundColorIndex)); |
|
node.setAttribute("sortFlag", |
|
sortFlag ? "TRUE" : "FALSE"); |
|
|
|
for (int i = 0; i < numEntries; i++) { |
|
IIOMetadataNode entry = |
|
new IIOMetadataNode("ColorTableEntry"); |
|
entry.setAttribute("index", Integer.toString(i)); |
|
int r = globalColorTable[3*i] & 0xff; |
|
int g = globalColorTable[3*i + 1] & 0xff; |
|
int b = globalColorTable[3*i + 2] & 0xff; |
|
entry.setAttribute("red", Integer.toString(r)); |
|
entry.setAttribute("green", Integer.toString(g)); |
|
entry.setAttribute("blue", Integer.toString(b)); |
|
node.appendChild(entry); |
|
} |
|
root.appendChild(node); |
|
} |
|
|
|
return root; |
|
} |
|
|
|
public IIOMetadataNode getStandardChromaNode() { |
|
IIOMetadataNode chroma_node = new IIOMetadataNode("Chroma"); |
|
IIOMetadataNode node = null; |
|
|
|
node = new IIOMetadataNode("ColorSpaceType"); |
|
node.setAttribute("name", "RGB"); |
|
chroma_node.appendChild(node); |
|
|
|
node = new IIOMetadataNode("BlackIsZero"); |
|
node.setAttribute("value", "TRUE"); |
|
chroma_node.appendChild(node); |
|
|
|
// NumChannels not in stream |
|
// Gamma not in format |
|
|
|
if (globalColorTable != null) { |
|
node = new IIOMetadataNode("Palette"); |
|
int numEntries = globalColorTable.length/3; |
|
for (int i = 0; i < numEntries; i++) { |
|
IIOMetadataNode entry = |
|
new IIOMetadataNode("PaletteEntry"); |
|
entry.setAttribute("index", Integer.toString(i)); |
|
entry.setAttribute("red", |
|
Integer.toString(globalColorTable[3*i] & 0xff)); |
|
entry.setAttribute("green", |
|
Integer.toString(globalColorTable[3*i + 1] & 0xff)); |
|
entry.setAttribute("blue", |
|
Integer.toString(globalColorTable[3*i + 2] & 0xff)); |
|
node.appendChild(entry); |
|
} |
|
chroma_node.appendChild(node); |
|
|
|
|
|
node = new IIOMetadataNode("BackgroundIndex"); |
|
node.setAttribute("value", Integer.toString(backgroundColorIndex)); |
|
chroma_node.appendChild(node); |
|
} |
|
|
|
return chroma_node; |
|
} |
|
|
|
public IIOMetadataNode getStandardCompressionNode() { |
|
IIOMetadataNode compression_node = new IIOMetadataNode("Compression"); |
|
IIOMetadataNode node = null; |
|
|
|
node = new IIOMetadataNode("CompressionTypeName"); |
|
node.setAttribute("value", "lzw"); |
|
compression_node.appendChild(node); |
|
|
|
node = new IIOMetadataNode("Lossless"); |
|
node.setAttribute("value", "TRUE"); |
|
compression_node.appendChild(node); |
|
|
|
// NumProgressiveScans not in stream |
|
// BitRate not in format |
|
|
|
return compression_node; |
|
} |
|
|
|
public IIOMetadataNode getStandardDataNode() { |
|
IIOMetadataNode data_node = new IIOMetadataNode("Data"); |
|
IIOMetadataNode node = null; |
|
|
|
// PlanarConfiguration |
|
|
|
node = new IIOMetadataNode("SampleFormat"); |
|
node.setAttribute("value", "Index"); |
|
data_node.appendChild(node); |
|
|
|
node = new IIOMetadataNode("BitsPerSample"); |
|
node.setAttribute("value", |
|
colorResolution == UNDEFINED_INTEGER_VALUE ? |
|
"" : Integer.toString(colorResolution)); |
|
data_node.appendChild(node); |
|
|
|
// SignificantBitsPerSample |
|
// SampleMSB |
|
|
|
return data_node; |
|
} |
|
|
|
public IIOMetadataNode getStandardDimensionNode() { |
|
IIOMetadataNode dimension_node = new IIOMetadataNode("Dimension"); |
|
IIOMetadataNode node = null; |
|
|
|
node = new IIOMetadataNode("PixelAspectRatio"); |
|
float aspectRatio = 1.0F; |
|
if (pixelAspectRatio != 0) { |
|
aspectRatio = (pixelAspectRatio + 15)/64.0F; |
|
} |
|
node.setAttribute("value", Float.toString(aspectRatio)); |
|
dimension_node.appendChild(node); |
|
|
|
node = new IIOMetadataNode("ImageOrientation"); |
|
node.setAttribute("value", "Normal"); |
|
dimension_node.appendChild(node); |
|
|
|
// HorizontalPixelSize not in format |
|
// VerticalPixelSize not in format |
|
// HorizontalPhysicalPixelSpacing not in format |
|
// VerticalPhysicalPixelSpacing not in format |
|
// HorizontalPosition not in format |
|
// VerticalPosition not in format |
|
// HorizontalPixelOffset not in stream |
|
// VerticalPixelOffset not in stream |
|
|
|
node = new IIOMetadataNode("HorizontalScreenSize"); |
|
node.setAttribute("value", |
|
logicalScreenWidth == UNDEFINED_INTEGER_VALUE ? |
|
"" : Integer.toString(logicalScreenWidth)); |
|
dimension_node.appendChild(node); |
|
|
|
node = new IIOMetadataNode("VerticalScreenSize"); |
|
node.setAttribute("value", |
|
logicalScreenHeight == UNDEFINED_INTEGER_VALUE ? |
|
"" : Integer.toString(logicalScreenHeight)); |
|
dimension_node.appendChild(node); |
|
|
|
return dimension_node; |
|
} |
|
|
|
public IIOMetadataNode getStandardDocumentNode() { |
|
IIOMetadataNode document_node = new IIOMetadataNode("Document"); |
|
IIOMetadataNode node = null; |
|
|
|
node = new IIOMetadataNode("FormatVersion"); |
|
node.setAttribute("value", version); |
|
document_node.appendChild(node); |
|
|
|
// SubimageInterpretation not in format |
|
// ImageCreationTime not in format |
|
// ImageModificationTime not in format |
|
|
|
return document_node; |
|
} |
|
|
|
public IIOMetadataNode getStandardTextNode() { |
|
|
|
return null; |
|
} |
|
|
|
public IIOMetadataNode getStandardTransparencyNode() { |
|
|
|
return null; |
|
} |
|
|
|
public void setFromTree(String formatName, Node root) |
|
throws IIOInvalidTreeException |
|
{ |
|
throw new IllegalStateException("Metadata is read-only!"); |
|
} |
|
|
|
protected void mergeNativeTree(Node root) throws IIOInvalidTreeException |
|
{ |
|
throw new IllegalStateException("Metadata is read-only!"); |
|
} |
|
|
|
protected void mergeStandardTree(Node root) throws IIOInvalidTreeException |
|
{ |
|
throw new IllegalStateException("Metadata is read-only!"); |
|
} |
|
|
|
public void reset() { |
|
throw new IllegalStateException("Metadata is read-only!"); |
|
} |
|
} |