FileDocCategorySizeDatePackage
JPEGHuffmanTable.javaAPI DocJava SE 5 API11080Fri Aug 26 14:57:30 BST 2005javax.imageio.plugins.jpeg

JPEGHuffmanTable

public class JPEGHuffmanTable extends Object
A class encapsulating a single JPEG Huffman table. Fields are provided for the "standard" tables from taken from Annex K of the JPEG specification. These are the tables used as defaults. This class differs from the old unsupported com.sun.image.codec.jpeg.JPEGHuffmanTable in two ways:
  1. The lengths arrays for this class do not contain an ignored 0th entry. The lengths array in a JPEG stream does not contain an extra entry, and this class is used to represent the contents of a JPEG stream.
  2. The old class incorrectly referred to Huffman "symbols", while expecting an array of values to be encoded. This class has a getValues method instead of a getSymbols method.

For more information about the operation of the built-in JPEG plug-ins, see the JPEG metadata format specification and usage notes.

version
0.5

Fields Summary
private static final int
HUFF_MAX_LEN
The maximum number of symbol lengths (max symbol length in bits = 16).
private static final int
HUFF_MAX_VALS
The maximum number of values.
private short[]
lengths
lengths[k-1] = number of symbols with length k bits.
private short[]
values
Values in order of increasing length of the corresponding symbols.
public static final JPEGHuffmanTable
StdDCLuminance
The standard DC luminance Huffman table.
public static final JPEGHuffmanTable
StdDCChrominance
The standard DC chrominance Huffman table.
public static final JPEGHuffmanTable
StdACLuminance
The standard AC luminance Huffman table.
public static final JPEGHuffmanTable
StdACChrominance
The standard AC chrominance Huffman table.
Constructors Summary
private JPEGHuffmanTable()
Private constructor used to construct the Standard Huffman tables

     
        short lengths[] =  {
            0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
        short values[] = { 
            0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
            0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
            0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
            0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
            0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
            0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
            0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
            0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
            0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
            0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
            0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
            0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
            0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
            0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
            0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
            0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
            0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
            0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
            0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
            0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
            0xf9, 0xfa };
        
        StdACChrominance.lengths = lengths;
        StdACChrominance.values = values;
        StdACChrominance.checkTable();
    
public JPEGHuffmanTable(short[] lengths, short[] values)
Creates a Huffman table and initializes it. The input arrays are copied. The arrays must describe a possible Huffman table. For example, 3 codes cannot be expressed with a single bit.

param
lengths an array of shorts where lengths[k] is equal to the number of values with corresponding codes of length k + 1 bits.
param
values an array of shorts containing the values in order of increasing code length.
exception
IllegalArgumentException if lengths or values are null, the length of lengths is greater than 16, the length of values is greater than 256, if any value in lengths or values is less than zero, or if the arrays do not describe a valid Huffman table.

        if (lengths == null) {
            throw new IllegalArgumentException("lengths array is null!");
        }
        if (values == null) {
            throw new IllegalArgumentException("values array is null!");
        }
        if (lengths.length > HUFF_MAX_LEN) {
            throw new IllegalArgumentException("lengths array is too long!");
        }
        if (values.length > HUFF_MAX_VALS) {
            throw new IllegalArgumentException("values array is too long");
        }
        for (int i = 1; i < lengths.length; i++) {
            if (lengths[i] < 0) {
                throw new IllegalArgumentException
                    ("Values in lengths array must be non-negative.");
            }
        }
        for (int i = 0; i < values.length; i++) {
            if (values[i] < 0) {
                throw new IllegalArgumentException
                    ("Values in values array must be non-negative.");
            }
        }
        
        this.lengths = (short[])lengths.clone();
        this.values = (short[])values.clone();

        checkTable();
    
Methods Summary
private voidcheckTable()
This checks that the table they gave us isn't 'illegal' It checks that the symbol length counts are possible, and that they gave us at least enough values for the symbol length counts. Eventually this might check that there aren't duplicate values.

        int numVals = 2;
        int sum = 0;

        for (int i = 0; i < lengths.length; i++) {
            sum     += lengths[i];
            numVals -= lengths[i];
            numVals *= 2;
        }
        
        if (numVals < 0) {
            throw new IllegalArgumentException
                ("Invalid Huffman table provided, lengths are incorrect.");
        }
        
        if (sum != values.length) {
            throw new IllegalArgumentException
                ("Invalid Huffman table provided, sum of lengths != values.");
        }
    
public short[]getLengths()
Return an array of shorts containing the number of values for each length in the Huffman table. The returned array is a copy.

return
a short array where array[k-1] is equal to the number of values in the table of length k.
see
#getValues

        return (short[])lengths.clone();
    
public short[]getValues()
Return an array of shorts containing the values arranged by increasing length of their corresponding codes. The interpretation of the array is dependent on the values returned from getLengths. The returned array is a copy.

return
a short array of values.
see
#getLengths

        return (short[])values.clone();
    
public java.lang.StringtoString()

        StringBuffer sb = new StringBuffer();
        sb.append("JPEGHuffmanTable:\nlengths:");
        for (int i = 0; i< lengths.length; i++) {
            sb.append(' ").append(lengths[i]);
        }
        sb.append("\nvalues:");
        for (int i = 0; i< values.length; i++) {
            sb.append(' ").append(values[i]);
        }
        return sb.toString();