jdk/src/share/classes/java/awt/image/ShortLookupTable.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
equal deleted inserted replaced
0:fd16c54261b3 2:90ce3da70b43
       
     1 /*
       
     2  * Copyright 1997-2000 Sun Microsystems, Inc.  All Rights Reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Sun designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Sun in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    22  * CA 95054 USA or visit www.sun.com if you need additional information or
       
    23  * have any questions.
       
    24  */
       
    25 
       
    26 package java.awt.image;
       
    27 
       
    28 
       
    29 /**
       
    30  * This class defines a lookup table object.  The output of a
       
    31  * lookup operation using an object of this class is interpreted
       
    32  * as an unsigned short quantity.  The lookup table contains short
       
    33  * data arrays for one or more bands (or components) of an image,
       
    34  * and it contains an offset which will be subtracted from the
       
    35  * input values before indexing the arrays.  This allows an array
       
    36  * smaller than the native data size to be provided for a
       
    37  * constrained input.  If there is only one array in the lookup
       
    38  * table, it will be applied to all bands.
       
    39  *
       
    40  * @see ByteLookupTable
       
    41  * @see LookupOp
       
    42  */
       
    43 public class ShortLookupTable extends LookupTable {
       
    44 
       
    45     /**
       
    46      * Constants
       
    47      */
       
    48 
       
    49     short data[][];
       
    50 
       
    51     /**
       
    52      * Constructs a ShortLookupTable object from an array of short
       
    53      * arrays representing a lookup table for each
       
    54      * band.  The offset will be subtracted from the input
       
    55      * values before indexing into the arrays.  The number of
       
    56      * bands is the length of the data argument.  The
       
    57      * data array for each band is stored as a reference.
       
    58      * @param offset the value subtracted from the input values
       
    59      *        before indexing into the arrays
       
    60      * @param data an array of short arrays representing a lookup
       
    61      *        table for each band
       
    62      */
       
    63     public ShortLookupTable(int offset, short data[][]) {
       
    64         super(offset,data.length);
       
    65         numComponents = data.length;
       
    66         numEntries    = data[0].length;
       
    67         this.data = new short[numComponents][];
       
    68         // Allocate the array and copy the data reference
       
    69         for (int i=0; i < numComponents; i++) {
       
    70             this.data[i] = data[i];
       
    71         }
       
    72     }
       
    73 
       
    74     /**
       
    75      * Constructs a ShortLookupTable object from an array
       
    76      * of shorts representing a lookup table for each
       
    77      * band.  The offset will be subtracted from the input
       
    78      * values before indexing into the array.  The
       
    79      * data array is stored as a reference.
       
    80      * @param offset the value subtracted from the input values
       
    81      *        before indexing into the arrays
       
    82      * @param data an array of shorts
       
    83      */
       
    84     public ShortLookupTable(int offset, short data[]) {
       
    85         super(offset,data.length);
       
    86         numComponents = 1;
       
    87         numEntries    = data.length;
       
    88         this.data     = new short[1][];
       
    89         this.data[0]  = data;
       
    90     }
       
    91 
       
    92     /**
       
    93      * Returns the lookup table data by reference.  If this ShortLookupTable
       
    94      * was constructed using a single short array, the length of the returned
       
    95      * array is one.
       
    96      * @return ShortLookupTable data array.
       
    97      */
       
    98     public final short[][] getTable(){
       
    99         return data;
       
   100     }
       
   101 
       
   102     /**
       
   103      * Returns an array of samples of a pixel, translated with the lookup
       
   104      * table. The source and destination array can be the same array.
       
   105      * Array <code>dst</code> is returned.
       
   106      *
       
   107      * @param src the source array.
       
   108      * @param dst the destination array. This array must be at least as
       
   109      *         long as <code>src</code>.  If <code>dst</code> is
       
   110      *         <code>null</code>, a new array will be allocated having the
       
   111      *         same length as <code>src</code>.
       
   112      * @return the array <code>dst</code>, an <code>int</code> array of
       
   113      *         samples.
       
   114      * @exception ArrayIndexOutOfBoundsException if <code>src</code> is
       
   115      *            longer than <code>dst</code> or if for any element
       
   116      *            <code>i</code> of <code>src</code>,
       
   117      *            <code>(src[i]&0xffff)-offset</code> is either less than
       
   118      *            zero or greater than or equal to the length of the
       
   119      *            lookup table for any band.
       
   120      */
       
   121     public int[] lookupPixel(int[] src, int[] dst){
       
   122         if (dst == null) {
       
   123             // Need to alloc a new destination array
       
   124             dst = new int[src.length];
       
   125         }
       
   126 
       
   127         if (numComponents == 1) {
       
   128             // Apply one LUT to all channels
       
   129             for (int i=0; i < src.length; i++) {
       
   130                 int s = (src[i]&0xffff) - offset;
       
   131                 if (s < 0) {
       
   132                     throw new ArrayIndexOutOfBoundsException("src["+i+
       
   133                                                              "]-offset is "+
       
   134                                                              "less than zero");
       
   135                 }
       
   136                 dst[i] = (int) data[0][s];
       
   137             }
       
   138         }
       
   139         else {
       
   140             for (int i=0; i < src.length; i++) {
       
   141                 int s = (src[i]&0xffff) - offset;
       
   142                 if (s < 0) {
       
   143                     throw new ArrayIndexOutOfBoundsException("src["+i+
       
   144                                                              "]-offset is "+
       
   145                                                              "less than zero");
       
   146                 }
       
   147                 dst[i] = (int) data[i][s];
       
   148             }
       
   149         }
       
   150         return dst;
       
   151     }
       
   152 
       
   153     /**
       
   154      * Returns an array of samples of a pixel, translated with the lookup
       
   155      * table. The source and destination array can be the same array.
       
   156      * Array <code>dst</code> is returned.
       
   157      *
       
   158      * @param src the source array.
       
   159      * @param dst the destination array. This array must be at least as
       
   160      *         long as <code>src</code>.  If <code>dst</code> is
       
   161      *         <code>null</code>, a new array will be allocated having the
       
   162      *         same length as <code>src</code>.
       
   163      * @return the array <code>dst</code>, an <code>int</code> array of
       
   164      *         samples.
       
   165      * @exception ArrayIndexOutOfBoundsException if <code>src</code> is
       
   166      *            longer than <code>dst</code> or if for any element
       
   167      *            <code>i</code> of <code>src</code>,
       
   168      *            <code>(src[i]&0xffff)-offset</code> is either less than
       
   169      *            zero or greater than or equal to the length of the
       
   170      *            lookup table for any band.
       
   171      */
       
   172     public short[] lookupPixel(short[] src, short[] dst){
       
   173         if (dst == null) {
       
   174             // Need to alloc a new destination array
       
   175             dst = new short[src.length];
       
   176         }
       
   177 
       
   178         if (numComponents == 1) {
       
   179             // Apply one LUT to all channels
       
   180             for (int i=0; i < src.length; i++) {
       
   181                 int s = (src[i]&0xffff) - offset;
       
   182                 if (s < 0) {
       
   183                     throw new ArrayIndexOutOfBoundsException("src["+i+
       
   184                                                              "]-offset is "+
       
   185                                                              "less than zero");
       
   186                 }
       
   187                 dst[i] = data[0][s];
       
   188             }
       
   189         }
       
   190         else {
       
   191             for (int i=0; i < src.length; i++) {
       
   192                 int s = (src[i]&0xffff) - offset;
       
   193                 if (s < 0) {
       
   194                     throw new ArrayIndexOutOfBoundsException("src["+i+
       
   195                                                              "]-offset is "+
       
   196                                                              "less than zero");
       
   197                 }
       
   198                 dst[i] = data[i][s];
       
   199             }
       
   200         }
       
   201         return dst;
       
   202     }
       
   203 
       
   204 }