using System;
/// **********************************************************************
/// **********************************************************************
/// **********************************************************************
/// *** COPYRIGHT (c) 1997-1998 Eastman Kodak Company. ***
/// *** As an unpublished work pursuant to Title 17 of the United ***
/// *** States Code. All rights reserved. ***
/// **********************************************************************
/// **********************************************************************
/// **********************************************************************
namespace com.codec.jpeg
{
///
/// JPEGDecodeParam encapsulates tables and options necessary to
/// control decoding JPEG datastreams. Parameters are either set explicitly
/// by the application for encoding, or read from the JPEG header for
/// decoding. In the case of decoding abbreviated data streams the
/// application may need to set some/all of the values it's self.
///
/// When working with BufferedImages, the codec will attempt to
/// generate an appropriate ColorModel for the JPEG COLOR_ID. This is
/// not always possible (example mappings are listed below) . In cases
/// where unsupported conversions are required, or unknown encoded
/// COLOR_ID's are in use, the user must request the data as a Raster
/// and perform the transformations themselves. When decoding into a
/// raster no ColorSpace
/// adjustments are made.
///
/// Note: The color ids described herein are simply enumerated values
/// that influence data processing by the JPEG codec. JPEG compression
/// is by definition color blind. These values are used as hints when
/// decompressing JPEG data. Of particular interest is the default
/// conversion from YCbCr to sRGB when decoding buffered Images.
///
/// Note: because JPEG is mostly color-blind color fidelity can not be
/// garunteed. This will hopefully be rectified in the near future by
/// the wide spread inclusion of ICC-profiles in the JPEG data stream
/// (as a special marker).
///
/// The following is an example of the conversions that take place.
/// This is only a guide to the types of conversions that are allowed.
/// This list is likely to change in the future so it is
/// strongly recommended that you check for thrown
/// ImageFormatExceptions and check the actual ColorModel associated
/// with the BufferedImage returned rather than make assumtions.
///
/// DECODING:
///
/// JPEG (Encoded) Color ID BufferedImage ColorSpace
/// ======================= ========================
/// COLOR_ID_UNKNOWN ** Invalid **
/// COLOR_ID_GRAY CS_GRAY
/// COLOR_ID_RGB CS_sRGB
/// COLOR_ID_YCbCr CS_sRGB
/// COLOR_ID_CMYK ** Invalid **
/// COLOR_ID_PYCC CS_PYCC
/// COLOR_ID_RGBA CS_sRGB (w/ alpha)
/// COLOR_ID_YCbCrA CS_sRGB (w/ alpha)
/// COLOR_ID_RGBA_INVERTED ** Invalid **
/// COLOR_ID_YCbCrA_INVERTED ** Invalid **
/// COLOR_ID_PYCCA CS_PYCC (w/ alpha)
/// COLOR_ID_YCCK ** Invalid **
///
/// If the user needs better control over conversion, the user must
/// request the data as a Raster and handle the conversion of the image
/// data themselves.
///
/// When decoding JFIF files the encoded COLOR_ID will always be one
/// of: COLOR_ID_UNKNOWN, COLOR_ID_GRAY, COLOR_ID_RGB, COLOR_ID_YCbCr,
/// COLOR_ID_CMYK, or COLOR_ID_YCCK
///
/// Note that the classes in the com.sun.image.codec.jpeg package are not
/// part of the core Java APIs. They are a part of Sun's JDK and JRE
/// distributions. Although other licensees may choose to distribute these
/// classes, developers cannot depend on their availability in non-Sun
/// implementations. We expect that equivalent functionality will eventually
/// be available in a core API or standard extension.
///
public abstract class JPEGDecodeParam
{
///
/// Unknown or Undefined Color ID
///
public readonly static int COLOR_ID_UNKNOWN = 0;
///
/// Monochrome
///
public readonly static int COLOR_ID_GRAY = 1;
///
/// Red, Green, and Blue
///
public readonly static int COLOR_ID_RGB = 2;
///
/// YCbCr
///
public readonly static int COLOR_ID_YCbCr = 3;
///
/// CMYK
///
public readonly static int COLOR_ID_CMYK = 4;
///
/// PhotoYCC
///
public readonly static int COLOR_ID_PYCC = 5;
///
/// RGB-Alpha
///
public readonly static int COLOR_ID_RGBA = 6;
///
/// YCbCr-Alpha
///
public readonly static int COLOR_ID_YCbCrA = 7;
///
/// RGB-Alpha with R, G, and B inverted.
///
public readonly static int COLOR_ID_RGBA_INVERTED = 8;
///
/// YCbCr-Alpha with Y, Cb, and Cr inverted.
///
public readonly static int COLOR_ID_YCbCrA_INVERTED = 9;
///
/// PhotoYCC-Alpha
///
public readonly static int COLOR_ID_PYCCA = 10;
///
/// YCbCrK
///
public readonly static int COLOR_ID_YCCK = 11;
///
/// Number of color ids defined.
///
public readonly static int NUM_COLOR_ID = 12;
///
/// Number of allowed Huffman and Quantization Tables
///
public readonly static int NUM_TABLES = 4;
///
/// The X and Y units simply indicate the aspect ratio of the pixels.
///
public readonly static int DENSITY_UNIT_ASPECT_RATIO = 0;
///
/// Pixel density is in pixels per inch.
///
public readonly static int DENSITY_UNIT_DOTS_INCH = 1;
///
/// Pixel density is in pixels per centemeter.
///
public readonly static int DENSITY_UNIT_DOTS_CM = 2;
///
/// The max known value for DENSITY_UNIT
///
public readonly static int NUM_DENSITY_UNIT = 3;
///
/// APP0 marker - JFIF info
///
public readonly static int APP0_MARKER = 0xE0;
///
/// APP1 marker
///
public readonly static int APP1_MARKER = 0xE1;
///
/// APP2 marker
///
public readonly static int APP2_MARKER = 0xE2;
///
/// APP3 marker
///
public readonly static int APP3_MARKER = 0xE3;
///
/// APP4 marker
///
public readonly static int APP4_MARKER = 0xE4;
///
/// APP5 marker
///
public readonly static int APP5_MARKER = 0xE5;
///
/// APP6 marker
///
public readonly static int APP6_MARKER = 0xE6;
///
/// APP7 marker
///
public readonly static int APP7_MARKER = 0xE7;
///
/// APP8 marker
///
public readonly static int APP8_MARKER = 0xE8;
///
/// APP9 marker
///
public readonly static int APP9_MARKER = 0xE9;
///
/// APPA marker
///
public readonly static int APPA_MARKER = 0xEA;
///
/// APPB marker
///
public readonly static int APPB_MARKER = 0xEB;
///
/// APPC marker
///
public readonly static int APPC_MARKER = 0xEC;
///
/// APPD marker
///
public readonly static int APPD_MARKER = 0xED;
///
/// APPE marker - Adobe info
///
public readonly static int APPE_MARKER = 0xEE;
///
/// APPF marker
///
public readonly static int APPF_MARKER = 0xEF;
///
/// Adobe marker indicates presence/need for Adobe marker.
///
public readonly static int COMMENT_MARKER = 0XFE;
///
/// Get the image width
///
/// the width of the image data in pixels.
public abstract int GetWidth();
///
/// Get the image height
///
/// The height of the image data in pixels.
public abstract int GetHeight();
///
/// Return the Horizontal subsampling factor for requested
/// Component. The Subsample factor is the number of input pixels
/// that contribute to each output pixel. This is distinct from
/// the way the JPEG to each output pixel. This is distinct from
/// the way the JPEG standard defines this quantity, because
/// fractional subsampling factors are not allowed, and it was felt
///
/// The component of the encoded image to return the subsampling factor for.
/// The subsample factor.
public abstract int GetHorizontalSubsampling(int component);
///
/// Return the Vertical subsampling factor for requested Component.
/// The Subsample factor is the number of input pixels that contribute to each output pixel.
/// This is distinct from the way the JPEG to each output pixel.
/// This is distinct from the way the JPEG standard defines this quantity, because
/// fractional subsampling factors are not allowed, and it was felt
///
/// The component of the encoded image to return the subsampling factor for.
/// The subsample factor.
public abstract int GetVerticalSubsampling(int component);
///
/// Returns the coefficient quantization tables or NULL if not defined.
/// tableNum must range in value from 0 - 3.
///
/// the index of the table to be returned.
/// Quantization table stored at index tableNum.
public abstract JPEGQTable GetQTable(int tableNum );
///
/// Returns the Quantization table for the requested component.
///
/// the image component of interest.
/// Quantization table associated with component
public abstract JPEGQTable GetQTableForComponent(int component);
///
/// Returns the DC Huffman coding table requested or null if not defined
///
/// the index of the table to be returned.
/// Huffman table stored at index tableNum.
public abstract JPEGHuffmanTable GetDCHuffmanTable( int tableNum );
///
/// Returns the DC Huffman coding table for the requested component.
///
/// the image component of interest.
/// Huffman table associated with component
public abstract JPEGHuffmanTable GetDCHuffmanTableForComponent(int component);
///
/// Returns the AC Huffman coding table requested or null if not defined
///
/// the index of the table to be returned.
/// Huffman table stored at index tableNum.
public abstract JPEGHuffmanTable GetACHuffmanTable( int tableNum );
///
/// Returns the AC Huffman coding table for the requested component.
///
/// the image component of interest.
/// Huffman table associated with component
public abstract JPEGHuffmanTable GetACHuffmanTableForComponent(int component);
///
/// Get the number of the DC Huffman table that will be used for a particular component.
///
/// The Component of interest.
/// The table number of the DC Huffman table for component.
public abstract int GetDCHuffmanComponentMapping(int component);
///
/// Get the number of the AC Huffman table that will be used for a particular component.
///
/// The Component of interest.
/// The table number of the AC Huffman table for component.
public abstract int GetACHuffmanComponentMapping(int component);
///
/// Get the number of the quantization table that will be used for a particular component.
///
/// The Component of interest.
/// The table number of the Quantization table for component.
public abstract int GetQTableComponentMapping(int component);
///
/// Returns true if the image information in the ParamBlock is currently valid.
/// This indicates if image data was read from the stream for decoding and weather
/// image data should be written when encoding.
///
/// true if the image information in the ParamBlock is currently valid.
public abstract bool IsImageInfoValid();
///
/// Returns true if the tables in the ParamBlock are currently valid.
/// This indicates that tables were read from the stream for decoding.
/// When encoding this indicates wether tables should be written to the stream.
///
/// true if the tables in the ParamBlock are currently valid.
public abstract bool IsTableInfoValid();
///
/// Returns true if at least one instance of the marker is present in the Parameter object.
/// For encoding returns true if there is at least one instance of the marker to be written.
///
///
/// The marker of interest.
public abstract bool GetMarker(int marker);
///
/// Returns a 'byte[][]' associated with the requested marker in the parameter object.
/// Each entry in the 'byte[][]' is the data associated with one instance of
/// the marker (each marker can theoretically appear any number of times in a stream).
///
/// The marker of interest.
/// The 'byte[][]' for this marker or null if none available.
public abstract byte[][] GetMarkerData(int marker);
///
/// Returns the JPEG Encoded color id. This is generally speaking only used
/// if you are decoding into Rasters. Note that when decoding into a Raster no
/// color conversion is performed.
///
/// The value of the JPEG encoded data's color id.
public abstract int GetEncodedColorID();
///
/// Returns the number of components for the current encoding COLOR_ID.
///
/// the number of Components
public abstract int GetNumComponents();
///
/// Get the MCUs per restart marker.
///
/// The number of MCUs between restart markers.
public abstract int GetRestartInterval();
///
/// Get the code for pixel size units This value is copied from the APP0 marker.
/// It isn't used by the JPEG codec. If the APP0 marker wasn't present then you
/// can not rely on this value.
///
/// Value indicating the density unit one of the DENSITY_UNIT_* constants.
public abstract int GetDensityUnit();
///
/// Get the horizontal pixel density This value is copied from the APP0 marker.
/// It isn't used by the JPEG code. If the APP0 marker wasn't present then
/// you can not rely on this value.
///
/// The horizontal pixel density, in units described by
public abstract int GetXDensity();
///
/// Get the vertical pixel density This value is copied into the APP0 marker.
/// It isn't used by the JPEG code. If the APP0 marker wasn't present then
/// you can not rely on this value.
///
/// The verticle pixel density, in units described by
public abstract int getYDensity();
}
}