1/*
2 * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25package javax.imageio.plugins.tiff;
26
27import java.util.ArrayList;
28import java.util.List;
29
30/**
31 * A class representing the extra tags found in a
32 * <a href="http://tools.ietf.org/html/rfc2306.html">TIFF-F</a> (RFC 2036) file.
33 *
34 * @since 9
35 */
36public final class FaxTIFFTagSet extends TIFFTagSet {
37
38    private static FaxTIFFTagSet theInstance = null;
39
40    /** Tag indicating the number of bad fax lines (type SHORT or LONG). */
41    public static final int TAG_BAD_FAX_LINES = 326;
42
43    /**
44     * Tag indicating the number of lines of clean fax data (type
45     * SHORT).
46     *
47     * @see #CLEAN_FAX_DATA_NO_ERRORS
48     * @see #CLEAN_FAX_DATA_ERRORS_CORRECTED
49     * @see #CLEAN_FAX_DATA_ERRORS_UNCORRECTED
50     */
51    public static final int TAG_CLEAN_FAX_DATA = 327;
52
53    /**
54     * A value to be used with the "CleanFaxData" tag.
55     *
56     * @see #TAG_CLEAN_FAX_DATA
57     */
58    public static final int CLEAN_FAX_DATA_NO_ERRORS = 0;
59
60    /**
61     * A value to be used with the "CleanFaxData" tag.
62     *
63     * @see #TAG_CLEAN_FAX_DATA
64     */
65    public static final int CLEAN_FAX_DATA_ERRORS_CORRECTED = 1;
66
67    /**
68     * A value to be used with the "CleanFaxData" tag.
69     *
70     * @see #TAG_CLEAN_FAX_DATA
71     */
72    public static final int CLEAN_FAX_DATA_ERRORS_UNCORRECTED = 2;
73
74    /**
75     * Tag indicating the number of consecutive bad lines (type
76     * SHORT or LONG).
77     */
78    public static final int TAG_CONSECUTIVE_BAD_LINES = 328;
79
80    static class BadFaxLines extends TIFFTag {
81
82        public BadFaxLines() {
83            super("BadFaxLines",
84                  TAG_BAD_FAX_LINES,
85                  1 << TIFF_SHORT |
86                  1 << TIFF_LONG,
87                  1);
88        }
89    }
90
91    static class CleanFaxData extends TIFFTag {
92
93        public CleanFaxData() {
94            super("CleanFaxData",
95                  TAG_CLEAN_FAX_DATA,
96                  1 << TIFF_SHORT,
97                  1);
98
99            addValueName(CLEAN_FAX_DATA_NO_ERRORS,
100                         "No errors");
101            addValueName(CLEAN_FAX_DATA_ERRORS_CORRECTED,
102                         "Errors corrected");
103            addValueName(CLEAN_FAX_DATA_ERRORS_UNCORRECTED,
104                         "Errors uncorrected");
105        }
106    }
107
108    static class ConsecutiveBadFaxLines extends TIFFTag {
109
110        public ConsecutiveBadFaxLines() {
111            super("ConsecutiveBadFaxLines",
112                  TAG_CONSECUTIVE_BAD_LINES,
113                  1 << TIFF_SHORT |
114                  1 << TIFF_LONG,
115                  1);
116        }
117    }
118
119    private static List<TIFFTag> tags;
120
121    private static void initTags() {
122        tags = new ArrayList<TIFFTag>(42);
123
124        tags.add(new FaxTIFFTagSet.BadFaxLines());
125        tags.add(new FaxTIFFTagSet.CleanFaxData());
126        tags.add(new FaxTIFFTagSet.ConsecutiveBadFaxLines());
127    }
128
129    private FaxTIFFTagSet() {
130        super(tags);
131    }
132
133    /**
134     * Returns a shared instance of a {@code FaxTIFFTagSet}.
135     *
136     * @return a {@code FaxTIFFTagSet} instance.
137     */
138    public synchronized static FaxTIFFTagSet getInstance() {
139        if (theInstance == null) {
140            initTags();
141            theInstance = new FaxTIFFTagSet();
142            tags = null;
143        }
144        return theInstance;
145    }
146}
147