/* |
|
* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. |
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
* |
|
* This code is free software; you can redistribute it and/or modify it |
|
* under the terms of the GNU General Public License version 2 only, as |
|
* published by the Free Software Foundation. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle in the LICENSE file that accompanied this code. |
|
* |
|
* This code 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 |
|
* version 2 for more details (a copy is included in the LICENSE file that |
|
* accompanied this code). |
|
* |
|
* You should have received a copy of the GNU General Public License version |
|
* 2 along with this work; if not, write to the Free Software Foundation, |
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
package javax.imageio.plugins.jpeg; |
|
import javax.imageio.ImageReadParam; |
|
/** |
|
* This class adds the ability to set JPEG quantization and Huffman |
|
* tables when using the built-in JPEG reader plug-in. An instance of |
|
* this class will be returned from the |
|
* <code>getDefaultImageReadParam</code> methods of the built-in JPEG |
|
* <code>ImageReader</code>. |
|
* |
|
* <p> The sole purpose of these additions is to allow the |
|
* specification of tables for use in decoding abbreviated streams. |
|
* The built-in JPEG reader will also accept an ordinary |
|
* <code>ImageReadParam</code>, which is sufficient for decoding |
|
* non-abbreviated streams. |
|
* |
|
* <p> While tables for abbreviated streams are often obtained by |
|
* first reading another abbreviated stream containing only the |
|
* tables, in some applications the tables are fixed ahead of time. |
|
* This class allows the tables to be specified directly from client |
|
* code. If no tables are specified either in the stream or in a |
|
* <code>JPEGImageReadParam</code>, then the stream is presumed to use |
|
* the "standard" visually lossless tables. See {@link JPEGQTable JPEGQTable} |
|
* and {@link JPEGHuffmanTable JPEGHuffmanTable} for more information |
|
* on the default tables. |
|
* |
|
* <p> The default <code>JPEGImageReadParam</code> returned by the |
|
* <code>getDefaultReadParam</code> method of the builtin JPEG reader |
|
* contains no tables. Default tables may be obtained from the table |
|
* classes {@link JPEGQTable JPEGQTable} and |
|
* {@link JPEGHuffmanTable JPEGHuffmanTable}. |
|
* |
|
* <p> If a stream does contain tables, the tables given in a |
|
* <code>JPEGImageReadParam</code> are ignored. Furthermore, if the |
|
* first image in a stream does contain tables and subsequent ones do |
|
* not, then the tables given in the first image are used for all the |
|
* abbreviated images. Once tables have been read from a stream, they |
|
* can be overridden only by tables subsequently read from the same |
|
* stream. In order to specify new tables, the {@link |
|
* javax.imageio.ImageReader#setInput setInput} method of |
|
* the reader must be called to change the stream. |
|
* |
|
* <p> Note that this class does not provide a means for obtaining the |
|
* tables found in a stream. These may be extracted from a stream by |
|
* consulting the IIOMetadata object returned by the reader. |
|
* |
|
* <p> |
|
* For more information about the operation of the built-in JPEG plug-ins, |
|
* see the <A HREF="../../metadata/doc-files/jpeg_metadata.html">JPEG |
|
* metadata format specification and usage notes</A>. |
|
* |
|
*/ |
|
public class JPEGImageReadParam extends ImageReadParam { |
|
private JPEGQTable[] qTables = null; |
|
private JPEGHuffmanTable[] DCHuffmanTables = null; |
|
private JPEGHuffmanTable[] ACHuffmanTables = null; |
|
/** |
|
* Constructs a <code>JPEGImageReadParam</code>. |
|
*/ |
|
public JPEGImageReadParam() { |
|
super(); |
|
} |
|
/** |
|
* Returns <code>true</code> if tables are currently set. |
|
* |
|
* @return <code>true</code> if tables are present. |
|
*/ |
|
public boolean areTablesSet() { |
|
return (qTables != null); |
|
} |
|
/** |
|
* Sets the quantization and Huffman tables to use in decoding |
|
* abbreviated streams. There may be a maximum of 4 tables of |
|
* each type. These tables are ignored once tables are |
|
* encountered in the stream. All arguments must be |
|
* non-<code>null</code>. The two arrays of Huffman tables must |
|
* have the same number of elements. The table specifiers in the |
|
* frame and scan headers in the stream are assumed to be |
|
* equivalent to indices into these arrays. The argument arrays |
|
* are copied by this method. |
|
* |
|
* @param qTables an array of quantization table objects. |
|
* @param DCHuffmanTables an array of Huffman table objects. |
|
* @param ACHuffmanTables an array of Huffman table objects. |
|
* |
|
* @exception IllegalArgumentException if any of the arguments |
|
* is <code>null</code>, has more than 4 elements, or if the |
|
* numbers of DC and AC tables differ. |
|
* |
|
* @see #unsetDecodeTables |
|
*/ |
|
public void setDecodeTables(JPEGQTable[] qTables, |
|
JPEGHuffmanTable[] DCHuffmanTables, |
|
JPEGHuffmanTable[] ACHuffmanTables) { |
|
if ((qTables == null) || |
|
(DCHuffmanTables == null) || |
|
(ACHuffmanTables == null) || |
|
(qTables.length > 4) || |
|
(DCHuffmanTables.length > 4) || |
|
(ACHuffmanTables.length > 4) || |
|
(DCHuffmanTables.length != ACHuffmanTables.length)) { |
|
throw new IllegalArgumentException |
|
("Invalid JPEG table arrays"); |
|
} |
|
this.qTables = (JPEGQTable[])qTables.clone(); |
|
this.DCHuffmanTables = (JPEGHuffmanTable[])DCHuffmanTables.clone(); |
|
this.ACHuffmanTables = (JPEGHuffmanTable[])ACHuffmanTables.clone(); |
|
} |
|
/** |
|
* Removes any quantization and Huffman tables that are currently |
|
* set. |
|
* |
|
* @see #setDecodeTables |
|
*/ |
|
public void unsetDecodeTables() { |
|
this.qTables = null; |
|
this.DCHuffmanTables = null; |
|
this.ACHuffmanTables = null; |
|
} |
|
/** |
|
* Returns a copy of the array of quantization tables set on the |
|
* most recent call to <code>setDecodeTables</code>, or |
|
* <code>null</code> if tables are not currently set. |
|
* |
|
* @return an array of <code>JPEGQTable</code> objects, or |
|
* <code>null</code>. |
|
* |
|
* @see #setDecodeTables |
|
*/ |
|
public JPEGQTable[] getQTables() { |
|
return (qTables != null) ? (JPEGQTable[])qTables.clone() : null; |
|
} |
|
/** |
|
* Returns a copy of the array of DC Huffman tables set on the |
|
* most recent call to <code>setDecodeTables</code>, or |
|
* <code>null</code> if tables are not currently set. |
|
* |
|
* @return an array of <code>JPEGHuffmanTable</code> objects, or |
|
* <code>null</code>. |
|
* |
|
* @see #setDecodeTables |
|
*/ |
|
public JPEGHuffmanTable[] getDCHuffmanTables() { |
|
return (DCHuffmanTables != null) |
|
? (JPEGHuffmanTable[])DCHuffmanTables.clone() |
|
: null; |
|
} |
|
/** |
|
* Returns a copy of the array of AC Huffman tables set on the |
|
* most recent call to <code>setDecodeTables</code>, or |
|
* <code>null</code> if tables are not currently set. |
|
* |
|
* @return an array of <code>JPEGHuffmanTable</code> objects, or |
|
* <code>null</code>. |
|
* |
|
* @see #setDecodeTables |
|
*/ |
|
public JPEGHuffmanTable[] getACHuffmanTables() { |
|
return (ACHuffmanTables != null) |
|
? (JPEGHuffmanTable[])ACHuffmanTables.clone() |
|
: null; |
|
} |
|
} |