/*
* @(#)IndexedColorFormat.java 1.15 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package javax.media.format;
import java.awt.Dimension;
import javax.media.Format;
/**
* Describes indexed color video data.
*
* @since JMF 2.0
*/
public class IndexedColorFormat extends VideoFormat {
/** Increment value of the array index from the first pixel on line n
to the first pixel on line n+1. */
protected int lineStride = NOT_SPECIFIED;
protected byte [] redValues = null;
protected byte [] greenValues = null;
protected byte [] blueValues = null;
protected int mapSize = NOT_SPECIFIED;
private static String ENCODING = VideoFormat.IRGB;
/**
* Constructs an <CODE>IndexedColorFormat</CODE> object with the specified parameters.
* @param size A <CODE>Dimension</CODE> that specifies the frame size.
* @param maxDataLength The maximum size of a data chunk.
* @param dataType The type of data. For example, byte array.
* @param frameRate The frame rate.
* @param lineStride The number elements between adjacent rows of pixels.
* @param mapSize The number of bits required per pixel.
* @param red The mask for the red component.
* @param green The mask for the green component.
* @param blue The mask for the blue component.
*/
public IndexedColorFormat(Dimension size, int maxDataLength, Class dataType,
float frameRate,
int lineStride,
int mapSize,
byte [] red, byte [] green, byte [] blue) {
super(ENCODING, size, maxDataLength, dataType, frameRate);
this.lineStride = lineStride;
this.redValues = red;
this.greenValues = green;
this.blueValues = blue;
this.mapSize = mapSize;
}
/**
* Gets the number of bits required per pixel.
* @return An integer representing the number of bits per pixel.
*/
public int getMapSize() {
return mapSize;
}
/**
* Gets the mask for the red component.
* @return A byte array containing the mask for the red component.
*/
public byte [] getRedValues() {
return redValues;
}
/**
* Gets the mask for the green component.
* @return A byte array containing the mask for the green component.
*/
public byte [] getGreenValues() {
return greenValues;
}
/**
* Gets the mask for the blue component.
* @return A byte array containing the mask for the blue component.
*/
public byte [] getBlueValues() {
return blueValues;
}
/**
* Gets the line stride--the number of array elements between adjacent rows of pixels.
* @return An integer representing the line stride.
*/
public int getLineStride() {
return lineStride;
}
/**
* Creates a clone of this <CODE>IndexedColorFormat</CODE> by copying each format
* attribute to the clone.
* @return A clone of this <CODE>IndexedColorFormat</CODE>.
*/
public Object clone() {
IndexedColorFormat f = new IndexedColorFormat(size,
maxDataLength,
dataType,
frameRate,
lineStride,
mapSize,
redValues,
greenValues,
blueValues);
f.copy(this);
return f;
}
/**
* Copies the attributes from the specified <CODE>Format</CODE> into
* this <CODE>H261Format</CODE>.
* @param f The <CODE>Format</CODE> to copy the attributes from.
*/
protected void copy(Format f) {
super.copy(f);
if (f instanceof IndexedColorFormat) {
IndexedColorFormat other = (IndexedColorFormat) f;
mapSize = other.mapSize;
redValues = other.redValues;
greenValues = other.greenValues;
blueValues = other.blueValues;
lineStride = other.lineStride;
}
}
/**
* Compares the specified <CODE>Format</CODE> with this <code>H261Format</code>.
* Returns <CODE>true</CODE> only if the specified <CODE>Format</CODE>
* is a <CODE>H261Format</CODE> object and all of
* its attributes are identical to
* the attributes in this <code>H261Format</code>.
* @param format The <CODE>Format</CODE> to compare.
* @return true if the specified <CODE>Format</CODE> is the same as this one.
*/
public boolean equals(Object format) {
if (format instanceof IndexedColorFormat) {
IndexedColorFormat other = (IndexedColorFormat) format;
return super.equals(format) &&
mapSize == other.mapSize &&
redValues == other.redValues &&
greenValues == other.greenValues &&
blueValues == other.blueValues &&
lineStride == other.lineStride;
} else
return false;
}
/**
* Checks whether or not the specified <CODE>Format</CODE> <EM>matches</EM>
* this <CODE>H261Format</CODE>.
* Matches only compares the attributes that are defined in the specified
* <CODE>Format</CODE>,
* unspecified attributes are ignored.
* <p>
* The two <CODE>Format</CODE> objects do not have to be of the same class
* to match. For example, if "A" are "B" are being compared, a
* match is possible if "A" is derived from "B"
* or "B" is derived from "A". (The compared attributes must still match,
* or <CODE>matches</CODE> fails.)
* @param format The <CODE>Format</CODE> to compare with this one.
* @return <CODE>true</CODE> if the specified <CODE>Format</CODE>
* matches this one, <CODE>false</CODE> if it does not.
*/
public boolean matches(Format format) {
if (!super.matches(format))
return false;
if (!(format instanceof IndexedColorFormat))
return true;
IndexedColorFormat other = (IndexedColorFormat) format;
return
(mapSize == NOT_SPECIFIED || other.mapSize == NOT_SPECIFIED ||
mapSize == other.mapSize) &&
(redValues == null || other.redValues == null ||
redValues.equals(other.redValues)) &&
(greenValues == null || other.greenValues == null ||
greenValues.equals(other.greenValues)) &&
(blueValues == null || other.blueValues == null ||
blueValues.equals(other.blueValues)) &&
(lineStride == NOT_SPECIFIED || other.lineStride == NOT_SPECIFIED ||
lineStride == other.lineStride) ;
}
/**
* Finds the attributes shared by two matching <CODE>Format</CODE> objects.
* If the specified <CODE>Format</CODE> does not match this one, the result
* is undefined.
* @param The matching <CODE>Format</CODE> to intersect with this
* <CODE>H261Format</CODE>.
* @return A <CODE>Format</CODE> object
* with its attributes set to those attributes common to both
* <CODE>Format</CODE> objects.
* @see #matches
*/
public Format intersects(Format format) {
Format fmt;
if ((fmt = super.intersects(format)) == null)
return null;
if (!(format instanceof IndexedColorFormat))
return fmt;
IndexedColorFormat other = (IndexedColorFormat)format;
IndexedColorFormat res = (IndexedColorFormat)fmt;
res.mapSize = (mapSize != NOT_SPECIFIED ?
mapSize : other.mapSize);
res.redValues = (redValues != null ?
redValues : other.redValues);
res.greenValues = (greenValues != null ?
greenValues : other.greenValues);
res.blueValues = (blueValues != null ?
blueValues : other.blueValues);
res.lineStride = (lineStride != NOT_SPECIFIED ?
lineStride : other.lineStride);
return res;
}
/**
* Generate a format that's less restrictive than this format but
* contains the basic attributes that will make this resulting format
* useful for format matching.
* @return A <CODE>Format</CODE> that's less restrictive than the
* this format.
*/
public Format relax() {
IndexedColorFormat fmt;
if ((fmt = (IndexedColorFormat)super.relax()) == null)
return null;
fmt.lineStride = NOT_SPECIFIED;
return fmt;
}
}
|