/*
 * @(#)LookupTable.java	1.28 10/03/23
 *
 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package java.awt.image;


/**
 * This abstract class defines a lookup table object.  ByteLookupTable
 * and ShortLookupTable are subclasses, which
 * contain byte and short data, respectively.  A lookup table
 * contains data arrays for one or more bands (or components) of an image
 * (for example, separate arrays for R, G, and B),
 * and it contains an offset which will be subtracted from the
 * input values before indexing into the arrays.  This allows an array
 * smaller than the native data size to be provided for a
 * constrained input.  If there is only one array in the lookup
 * table, it will be applied to all bands.  All arrays must be the
 * same size.
 * 
 * @see ByteLookupTable
 * @see ShortLookupTable
 * @see LookupOp
 * @version 10 Feb 1997
 */
public abstract class LookupTable extends Object{

    /**
     * Constants
     */  
 
    int  numComponents;
    int  offset;
    int  numEntries;

    /**
     * Constructs a new LookupTable from the number of components and an offset
     * into the lookup table.
     * @param offset the offset to subtract from input values before indexing
     *        into the data arrays for this <code>LookupTable</code>
     * @param numComponents the number of data arrays in this
     *        <code>LookupTable</code>
     * @throws IllegalArgumentException if <code>offset</code> is less than 0
     *         or if <code>numComponents</code> is less than 1
     */
    protected LookupTable(int offset, int numComponents) {
        if (offset < 0) {
            throw new
                IllegalArgumentException("Offset must be greater than 0");
        }
        if (numComponents < 1) {
            throw new IllegalArgumentException("Number of components must "+
                                               " be at least 1");
        }
        this.numComponents = numComponents;
	this.offset = offset;
    }

    /**
     * Returns the number of components in the lookup table.
     * @return the number of components in this <code>LookupTable</code>.
     */
    public int getNumComponents() {
        return numComponents;
    }

    /**
     * Returns the offset.  
     * @return the offset of this <code>LookupTable</code>.
     */
    public int getOffset() {
        return offset;
    }

    /**
     * Returns an <code>int</code> array of components for 
     * one pixel.  The <code>dest</code> array contains the 
     * result of the lookup and is returned.  If dest is 
     * <code>null</code>, a new array is allocated.  The 
     * source and destination can be equal. 
     * @param src the source array of components of one pixel
     * @param dest the destination array of components for one pixel,
     *        translated with this <code>LookupTable</code>
     * @return an <code>int</code> array of components for one 
     *         pixel.
     */
    public abstract int[] lookupPixel(int[] src, int[] dest);
    
}
