| /* | |
| * Copyright (c) 2000, 2014, 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} methods of the built-in JPEG | |
| * {@code ImageReader}. | |
| * | |
| * <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}, 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}, 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} returned by the | |
| * {@code getDefaultReadParam} 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} 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}. | |
| */ | |
| public JPEGImageReadParam() { | |
| super(); | |
| } | |
| /** | |
| * Returns {@code true} if tables are currently set. | |
| * | |
| * @return {@code true} 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}. 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. | |
| * | |
| * @throws IllegalArgumentException if any of the arguments | |
| * is {@code null}, 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 = qTables.clone(); | |
| this.DCHuffmanTables = DCHuffmanTables.clone(); | |
| this.ACHuffmanTables = 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}, or | |
| * {@code null} if tables are not currently set. | |
| * | |
| * @return an array of {@code JPEGQTable} objects, or | |
| * {@code null}. | |
| * | |
| * @see #setDecodeTables | |
| */ | |
| public JPEGQTable[] getQTables() { | |
| return (qTables != null) ? qTables.clone() : null; | |
| } | |
| /** | |
| * Returns a copy of the array of DC Huffman tables set on the | |
| * most recent call to {@code setDecodeTables}, or | |
| * {@code null} if tables are not currently set. | |
| * | |
| * @return an array of {@code JPEGHuffmanTable} objects, or | |
| * {@code null}. | |
| * | |
| * @see #setDecodeTables | |
| */ | |
| public JPEGHuffmanTable[] getDCHuffmanTables() { | |
| return (DCHuffmanTables != null) | |
| ? DCHuffmanTables.clone() | |
| : null; | |
| } | |
| /** | |
| * Returns a copy of the array of AC Huffman tables set on the | |
| * most recent call to {@code setDecodeTables}, or | |
| * {@code null} if tables are not currently set. | |
| * | |
| * @return an array of {@code JPEGHuffmanTable} objects, or | |
| * {@code null}. | |
| * | |
| * @see #setDecodeTables | |
| */ | |
| public JPEGHuffmanTable[] getACHuffmanTables() { | |
| return (ACHuffmanTables != null) | |
| ? ACHuffmanTables.clone() | |
| : null; | |
| } | |
| } |