- /*
- * @(#)JPEGQTable.java 1.6 00/02/02
- *
- * Copyright 1998-2000 Sun Microsystems, Inc. All Rights Reserved.
- *
- * This software is the proprietary information of Sun Microsystems, Inc.
- * Use is subject to license terms.
- *
- */
-
- /**********************************************************************
- **********************************************************************
- **********************************************************************
- *** COPYRIGHT (c) 1997-1998 Eastman Kodak Company. ***
- *** As an unpublished work pursuant to Title 17 of the United ***
- *** States Code. All rights reserved. ***
- **********************************************************************
- **********************************************************************
- **********************************************************************/
-
- package com.sun.image.codec.jpeg;
-
-
-
- /** Class to encapsulate the JPEG quantization tables.
- * <p>
- * 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.
- * <p>
- */
- public class JPEGQTable {
-
- /** Quantization step for each coefficient in zig-zag order */
- private int quantval[];
-
- /** The number of coefficients in a DCT block */
- private static final byte QTABLESIZE = 64;
-
- /**
- * This is the sample luminance quantization table given in the
- * JPEG spec section K.1, expressed in zigzag order. The spec says
- * that the values given produce "good" quality, and when divided
- * by 2, "very good" quality.
- */
- public static final JPEGQTable StdLuminance = new JPEGQTable();
- static {
- int [] lumVals = {
- 16, 11, 12, 14, 12, 10, 16, 14,
- 13, 14, 18, 17, 16, 19, 24, 40,
- 26, 24, 22, 22, 24, 49, 35, 37,
- 29, 40, 58, 51, 61, 60, 57, 51,
- 56, 55, 64, 72, 92, 78, 64, 68,
- 87, 69, 55, 56, 80, 109, 81, 87,
- 95, 98, 103, 104, 103, 62, 77, 113,
- 121, 112, 100, 120, 92, 101, 103, 99
- };
-
- StdLuminance.quantval = lumVals;
- }
-
- /**
- * This is the sample luminance quantization table given in the
- * JPEG spec section K.1, expressed in zigzag order. The spec says
- * that the values given produce "good" quality, and when divided
- * by 2, "very good" quality.
- */
- public static final JPEGQTable StdChrominance = new JPEGQTable();
- static {
- int [] chromVals = {
- 17, 18, 18, 24, 21, 24, 47, 26,
- 26, 47, 99, 66, 56, 66, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99
- };
- StdChrominance.quantval = chromVals;
- }
-
-
- /**
- * Constructs an empty quantization table. This is used to create
- * the Std Q-Tables.
- */
- private JPEGQTable() {
- quantval = new int[QTABLESIZE];
- }
-
- /**
- * Constructs an quantization table from the array that was
- * passed. The coefficents must be in zig-zag order. The array
- * must be of length 64.
- * @param table the quantization table (this is copied).
- */
- public JPEGQTable( int table[] ) {
- if ( table.length != QTABLESIZE ) {
- throw new IllegalArgumentException
- ("Quantization table is the wrong size.");
- } else {
- quantval = new int[QTABLESIZE];
- System.arraycopy( table, 0, quantval, 0, QTABLESIZE );
- }
- }
-
-
- /**
- * Returns the current quantization table as an array of ints in
- * zig zag order.
- * @return A copy of the contained quantization table.
- */
- public int[] getTable() {
- int[] table = new int[QTABLESIZE];
- System.arraycopy( quantval, 0, table, 0, QTABLESIZE );
- return table;
- }
-
- /**
- * Returns a new Quantization table where the values are
- * multiplied by scaleFactor and then clamped to the range
- * 1..32767 (or to 1..255 if forceBaseline is 'true'). <P>
-
- * Values less than one tend to improve the quality level of the
- * table, and values greater than one degrade the quality level of
- * the table.
-
- * @param scaleFactor the multiplication factor for the table
- * @param forceBaseline if true the values will be clamped
- * to the range [1 .. 255]
- * @return A new Q-Table that is a linear multiple of this Q-Table
- */
- public JPEGQTable getScaledInstance(float scaleFactor,
- boolean forceBaseline ) {
- long max = (forceBaseline)?255L:32767L;
- int []ret = new int[QTABLESIZE];
-
- for (int i=0; i<QTABLESIZE; i++ ) {
- long holder = (long)((quantval[i] * scaleFactor) + 0.5);
-
- // limit to valid range
- if (holder <= 0L) holder = 1L;
-
- // Max quantizer for 12 bits
- if (holder > max ) holder = max;
-
- ret[i] = (int)holder;
- }
- return new JPEGQTable(ret);
- }
- }