summaryrefslogtreecommitdiffstats
path: root/awt/javax/imageio/plugins/jpeg/JPEGImageWriteParam.java
blob: b9799112e04da306bb3506becf6bfd5d1b803eb7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package javax.imageio.plugins.jpeg;

import org.apache.harmony.x.imageio.plugins.jpeg.JPEGConsts;

import javax.imageio.ImageWriteParam;
import java.util.Locale;

/**
 * The JPEGImageWriteParam class allows to set JPEG Huffman tables and
 * quantization when using the JPEG writer plug-in.
 * 
 * @since Android 1.0
 */
public class JPEGImageWriteParam extends ImageWriteParam {

    /**
     * The Constant COMP_QUALITY_VALUES.
     */
    private static final float[] COMP_QUALITY_VALUES = {
            0.05f, 0.75f, 0.95f
    };

    /**
     * The Constant COMP_QUALITY_DESCRIPTIONS.
     */
    private static final String[] COMP_QUALITY_DESCRIPTIONS = {
            "Minimum useful", "Visually lossless", "Maximum useful"
    };

    /**
     * The q tables.
     */
    private JPEGQTable[] qTables;

    /**
     * The dc huffman tables.
     */
    private JPEGHuffmanTable[] dcHuffmanTables;

    /**
     * The ac huffman tables.
     */
    private JPEGHuffmanTable[] acHuffmanTables;

    /**
     * The optimize huffman tables.
     */
    private boolean optimizeHuffmanTables;

    /**
     * Instantiates a new JPEGImageWriteParam object with the specified Locale.
     * 
     * @param locale
     *            the Locale.
     */
    public JPEGImageWriteParam(Locale locale) {
        super(locale);

        canWriteProgressive = true;
        progressiveMode = ImageWriteParam.MODE_DISABLED;

        canWriteCompressed = true;
        compressionTypes = new String[] {
            "JPEG"
        };
        compressionType = compressionTypes[0];
        compressionQuality = JPEGConsts.DEFAULT_JPEG_COMPRESSION_QUALITY;
    }

    /**
     * Returns true if tables are set, false otherwise.
     * 
     * @return true, if tables are set, false otherwise.
     */
    public boolean areTablesSet() {
        return qTables != null;
    }

    /**
     * Sets the quantization and Huffman tables for using in encoding streams.
     * 
     * @param qTables
     *            the quantization tables.
     * @param DCHuffmanTables
     *            the standart DC Huffman tables.
     * @param ACHuffmanTables
     *            the standart AC huffman tables.
     */
    public void setEncodeTables(JPEGQTable[] qTables, JPEGHuffmanTable[] DCHuffmanTables,
            JPEGHuffmanTable[] ACHuffmanTables) {
        if (qTables == null || DCHuffmanTables == null || ACHuffmanTables == null) {
            throw new IllegalArgumentException("Invalid JPEG table arrays");
        }
        if (DCHuffmanTables.length != ACHuffmanTables.length) {
            throw new IllegalArgumentException("Invalid JPEG table arrays");
        }
        if (qTables.length > 4 || DCHuffmanTables.length > 4) {
            throw new IllegalArgumentException("Invalid JPEG table arrays");
        }

        // Do the shallow copy, it should be enough
        this.qTables = qTables.clone();
        dcHuffmanTables = DCHuffmanTables.clone();
        acHuffmanTables = ACHuffmanTables.clone();
    }

    /**
     * Unset all encoded tables.
     */
    public void unsetEncodeTables() {
        qTables = null;
        dcHuffmanTables = null;
        acHuffmanTables = null;
    }

    /**
     * Gets the DC Huffman tables.
     * 
     * @return the DC Huffman tables which are set, or null.
     */
    public JPEGHuffmanTable[] getDCHuffmanTables() {
        return dcHuffmanTables == null ? null : dcHuffmanTables.clone();
    }

    /**
     * Gets the AC Huffman tables.
     * 
     * @return the AC Huffman tables which are set, or null.
     */
    public JPEGHuffmanTable[] getACHuffmanTables() {
        return acHuffmanTables == null ? null : acHuffmanTables.clone();
    }

    /**
     * Gets the quantization tables.
     * 
     * @return the quantization tables, or null.
     */
    public JPEGQTable[] getQTables() {
        return qTables == null ? null : qTables.clone();
    }

    @Override
    public String[] getCompressionQualityDescriptions() {
        super.getCompressionQualityDescriptions();
        return COMP_QUALITY_DESCRIPTIONS.clone();
    }

    @Override
    public float[] getCompressionQualityValues() {
        super.getCompressionQualityValues();
        return COMP_QUALITY_VALUES.clone();
    }

    /**
     * Sets the flag indicated that the writer will generate optimized Huffman
     * tables for the image as part of the writing process.
     * 
     * @param optimize
     *            the flag of optimizing huffman tables.
     */
    public void setOptimizeHuffmanTables(boolean optimize) {
        optimizeHuffmanTables = optimize;
    }

    /**
     * Returns true if the writer generates optimized Huffman tables, false
     * otherwise.
     * 
     * @return true, if the writer generates optimized Huffman tables, false
     *         otherwise.
     */
    public boolean getOptimizeHuffmanTables() {
        return optimizeHuffmanTables;
    }

    @Override
    public boolean isCompressionLossless() {
        if (getCompressionMode() != MODE_EXPLICIT) {
            throw new IllegalStateException("Compression mode not MODE_EXPLICIT!");
        }
        return false;
    }

    @Override
    public void unsetCompression() {
        if (getCompressionMode() != MODE_EXPLICIT) {
            throw new IllegalStateException("Compression mode not MODE_EXPLICIT!");
        }
        compressionQuality = JPEGConsts.DEFAULT_JPEG_COMPRESSION_QUALITY;
    }
}