Hi,

I committed this patch to implement JPEGQTable and eliminate unnecessary
fields in JPEGHuffmanTable.  I also committed a new JPEGQTable test to
Mauve.

Tom

2006-03-30  Thomas Fitzsimmons  <[EMAIL PROTECTED]>

        * javax/imageio/plugins/jpeg/JPEGQTable.java: New file.
        * javax/imageio/plugins/jpeg/JPEGHuffmanTable.java
        (ACChrominanceLengths, ACChrominanceValues, ACLuminanceLengths,
        ACLuminanceValues, DCChrominanceLengths, DCChrominanceValues,
        DCLuminanceLengths, DCLuminanceValues): Remove fields.

Index: javax/imageio/plugins/jpeg/JPEGHuffmanTable.java
===================================================================
RCS file: /sources/classpath/classpath/javax/imageio/plugins/jpeg/JPEGHuffmanTable.java,v
retrieving revision 1.1
diff -u -r1.1 JPEGHuffmanTable.java
--- javax/imageio/plugins/jpeg/JPEGHuffmanTable.java	10 Mar 2006 06:13:14 -0000	1.1
+++ javax/imageio/plugins/jpeg/JPEGHuffmanTable.java	31 Mar 2006 01:59:44 -0000
@@ -45,119 +45,113 @@
  */
 public class JPEGHuffmanTable
 {
+  /**
+   * Huffman code lengths.
+   */
   private short[] lengths;
 
+  /**
+   * Huffman values.
+   */
   private short[] values;
 
-  private static short[] ACChrominanceLengths = { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5,
-                                                  4, 4, 0, 1, 2, 0x77 };
-
-  private static short[] ACChrominanceValues = { 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 };
-
-  private static short[] ACLuminanceLengths = { 0, 2, 1, 3, 3, 2, 4, 3, 5, 5,
-                                                4, 4, 0, 0, 1, 0x7d };
-
-  private static short[] ACLuminanceValues = { 0x01, 0x02, 0x03, 0x00, 0x04,
-                                               0x11, 0x05, 0x12, 0x21, 0x31,
-                                               0x41, 0x06, 0x13, 0x51, 0x61,
-                                               0x07, 0x22, 0x71, 0x14, 0x32,
-                                               0x81, 0x91, 0xa1, 0x08, 0x23,
-                                               0x42, 0xb1, 0xc1, 0x15, 0x52,
-                                               0xd1, 0xf0, 0x24, 0x33, 0x62,
-                                               0x72, 0x82, 0x09, 0x0a, 0x16,
-                                               0x17, 0x18, 0x19, 0x1a, 0x25,
-                                               0x26, 0x27, 0x28, 0x29, 0x2a,
-                                               0x34, 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, 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, 0xe1, 0xe2, 0xe3,
-                                               0xe4, 0xe5, 0xe6, 0xe7, 0xe8,
-                                               0xe9, 0xea, 0xf1, 0xf2, 0xf3,
-                                               0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
-                                               0xf9, 0xfa };
-
-  private static short[] DCChrominanceLengths = { 0, 3, 1, 1, 1, 1, 1, 1, 1, 1,
-                                                  1, 0, 0, 0, 0, 0 };
-
-  private static short[] DCChrominanceValues = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
-                                                 10, 11 };
-
-  private static short[] DCLuminanceLengths = { 0, 1, 5, 1, 1, 1, 1, 1, 1, 0,
-                                                0, 0, 0, 0, 0, 0 };
-
-  private static short[] DCLuminanceValues = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
-                                               10, 11 };
-
   /**
    * The standard JPEG AC chrominance Huffman table.
    */
   public static final JPEGHuffmanTable StdACChrominance =
-    new JPEGHuffmanTable(ACChrominanceLengths, ACChrominanceValues);
+      new JPEGHuffmanTable(new short[] { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5,
+                                         4, 4, 0, 1, 2, 0x77 },
+                           new short[]  { 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 });
 
   /**
    * The standard JPEG AC luminance Huffman table.
    */
   public static final JPEGHuffmanTable StdACLuminance =
-    new JPEGHuffmanTable(ACLuminanceLengths, ACLuminanceValues);
+      new JPEGHuffmanTable(new short[] { 0, 2, 1, 3, 3, 2, 4, 3, 5, 5,
+                                         4, 4, 0, 0, 1, 0x7d },
+                           new short[] { 0x01, 0x02, 0x03, 0x00, 0x04,
+                                         0x11, 0x05, 0x12, 0x21, 0x31,
+                                         0x41, 0x06, 0x13, 0x51, 0x61,
+                                         0x07, 0x22, 0x71, 0x14, 0x32,
+                                         0x81, 0x91, 0xa1, 0x08, 0x23,
+                                         0x42, 0xb1, 0xc1, 0x15, 0x52,
+                                         0xd1, 0xf0, 0x24, 0x33, 0x62,
+                                         0x72, 0x82, 0x09, 0x0a, 0x16,
+                                         0x17, 0x18, 0x19, 0x1a, 0x25,
+                                         0x26, 0x27, 0x28, 0x29, 0x2a,
+                                         0x34, 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, 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, 0xe1, 0xe2, 0xe3,
+                                         0xe4, 0xe5, 0xe6, 0xe7, 0xe8,
+                                         0xe9, 0xea, 0xf1, 0xf2, 0xf3,
+                                         0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+                                         0xf9, 0xfa });
 
   /**
    * The standard JPEG DC chrominance Huffman table.
    */
   public static final JPEGHuffmanTable StdDCChrominance =
-    new JPEGHuffmanTable(DCChrominanceLengths, DCChrominanceValues);
+      new JPEGHuffmanTable(new short[] { 0, 3, 1, 1, 1, 1, 1, 1, 1, 1,
+                                         1, 0, 0, 0, 0, 0 },
+                           new short[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+                                         10, 11 });
 
   /**
    * The standard JPEG DC luminance Huffman table.
    */
   public static final JPEGHuffmanTable StdDCLuminance =
-    new JPEGHuffmanTable(DCLuminanceLengths, DCLuminanceValues);
+      new JPEGHuffmanTable(new short[] { 0, 1, 5, 1, 1, 1, 1, 1, 1, 0,
+                                         0, 0, 0, 0, 0, 0 },
+                           new short[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+                                         10, 11 });
 
   /**
    * Construct and initialize a Huffman table. Copies are created of
Index: javax/imageio/plugins/jpeg/JPEGQTable.java
===================================================================
RCS file: javax/imageio/plugins/jpeg/JPEGQTable.java
diff -N javax/imageio/plugins/jpeg/JPEGQTable.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ javax/imageio/plugins/jpeg/JPEGQTable.java	31 Mar 2006 01:59:44 -0000
@@ -0,0 +1,179 @@
+/* JPEGQTable.java --
+ Copyright (C)  2006  Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING.  If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library.  Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module.  An independent module is a module which is not derived from
+ or based on this library.  If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so.  If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package javax.imageio.plugins.jpeg;
+
+/**
+ * The JPEGQTable class represents a quantization table that can be
+ * used to encode or decode a JPEG stream.  The standard JPEG
+ * luminance and chrominance quantization tables are provided as
+ * static fields.  Table entries are stored in natural order, not
+ * zig-zag order.
+ */
+public class JPEGQTable
+{
+  /**
+   * The table entries, stored in natural order.
+   */
+  private int[] table;
+
+  /**
+   * The standard JPEG luminance quantization table.  Values are
+   * stored in natural order.
+   */
+  public static final JPEGQTable K1Luminance = new JPEGQTable(new int[]
+      {
+        16, 11, 10, 16,  24,  40,  51,  61,
+        12, 12, 14, 19,  26,  58,  60,  55,
+        14, 13, 16, 24,  40,  57,  69,  56,
+        14, 17, 22, 29,  51,  87,  80,  62,
+        18, 22, 37, 56,  68, 109, 103,  77,
+        24, 35, 55, 64,  81, 104, 113,  92,
+        49, 64, 78, 87, 103, 121, 120, 101,
+        72, 92, 95, 98, 112, 100, 103,  99
+      });
+
+  /**
+   * The standard JPEG luminance quantization table, scaled by
+   * one-half.  Values are stored in natural order.
+   */
+  public static final JPEGQTable K1Div2Luminance =
+    K1Luminance.getScaledInstance(0.5f, true);
+
+  /**
+   * The standard JPEG chrominance quantization table.  Values are
+   * stored in natural order.
+   */
+  public static final JPEGQTable K2Chrominance = new JPEGQTable(new int[]
+      {
+        17, 18, 24, 47, 99, 99, 99, 99,
+        18, 21, 26, 66, 99, 99, 99, 99,
+        24, 26, 56, 99, 99, 99, 99, 99,
+        47, 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
+      });
+
+  /**
+   * The standard JPEG chrominance quantization table, scaled by
+   * one-half.  Values are stored in natural order.
+   */
+  public static final JPEGQTable K2Div2Chrominance =
+    K2Chrominance.getScaledInstance(0.5f, true);
+
+  /**
+   * Construct a new JPEG quantization table.
+   *
+   * @param table the 64-element value table, stored in natural order.
+   *
+   * @throws IllegalArgumentException if the table is null or if
+   * table's length is not equal to 64.
+   */
+  public JPEGQTable(int[] table)
+  {
+    if (table == null || table.length != 64)
+      throw new IllegalArgumentException("invalid JPEG quantization table");
+
+    this.table = new int[table.length];
+    System.arraycopy(table, 0, this.table, 0, table.length);
+  }
+
+  /**
+   * Retrieve a copy of the quantization values for this table.
+   *
+   * @return a copy of the quantization value array
+   */
+  public int[] getTable()
+  {
+    int[] tableCopy = new int[table.length];
+    System.arraycopy(table, 0, tableCopy, 0, table.length);
+    return tableCopy;
+  }
+
+  /**
+   * Retrieve a copy of this JPEG quantization table with every value
+   * scaled by the given scale factor, and clamped from 1 to 255
+   * baseline or from 1 to 32767 otherwise.
+   *
+   * @param scaleFactor the factor by which to scale this table
+   * @param forceBaseline clamp scaled values to a maximum of 255 if
+   * true, 32767 if false
+   *
+   * @return a new scaled JPEG quantization table
+   */
+  public JPEGQTable getScaledInstance(float scaleFactor,
+                                      boolean forceBaseline)
+  {
+    int[] scaledTable = getTable();
+    int max = forceBaseline ? 255 : 32767;
+
+    for (int i = 0; i < scaledTable.length; i++)
+      {
+        scaledTable[i] = Math.round (scaleFactor * (float) scaledTable[i]);
+        if (scaledTable[i] < 1)
+          scaledTable[i] = 1;
+        else if (scaledTable[i] > max)
+          scaledTable[i] = max;
+      }
+
+    return new JPEGQTable(scaledTable);
+  }
+
+  /**
+   * Create a string representing this JPEG quantization table.
+   */
+  public String toString()
+  {
+    StringBuffer buffer = new StringBuffer();
+
+    buffer.append("JPEGQTable:\n");
+    for (int i = 0; i < 8; i++)
+      {
+        buffer.append("        ");
+        for (int j = 0; j < 8; j++)
+          {
+            buffer.append(table[i * 8 + j] + " ");
+          }
+        buffer.append("\n");
+      }
+
+    return buffer.toString();
+  }
+}

Reply via email to