001/*
002 * $RCSfile: EXIFTIFFTagSet.java,v $
003 *
004 * 
005 * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
006 * 
007 * Redistribution and use in source and binary forms, with or without
008 * modification, are permitted provided that the following conditions
009 * are met: 
010 * 
011 * - Redistribution of source code must retain the above copyright 
012 *   notice, this  list of conditions and the following disclaimer.
013 * 
014 * - Redistribution in binary form must reproduce the above copyright
015 *   notice, this list of conditions and the following disclaimer in 
016 *   the documentation and/or other materials provided with the
017 *   distribution.
018 * 
019 * Neither the name of Sun Microsystems, Inc. or the names of 
020 * contributors may be used to endorse or promote products derived 
021 * from this software without specific prior written permission.
022 * 
023 * This software is provided "AS IS," without a warranty of any 
024 * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
025 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
026 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
027 * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
028 * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
029 * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
030 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
031 * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
032 * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
033 * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
034 * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
035 * POSSIBILITY OF SUCH DAMAGES. 
036 * 
037 * You acknowledge that this software is not designed or intended for 
038 * use in the design, construction, operation or maintenance of any 
039 * nuclear facility. 
040 *
041 * $Revision: 1.4 $
042 * $Date: 2005/10/28 16:56:45 $
043 * $State: Exp $
044 */
045package com.github.jaiimageio.plugins.tiff;
046
047import java.util.ArrayList;
048import java.util.List;
049
050/**
051 * A class representing the tags found in an EXIF IFD.  EXIF is a
052 * standard for annotating images used by most digital camera
053 * manufacturers.  The EXIF specification may be found at
054 * <a href="http://www.exif.org/Exif2-2.PDF">
055 * <code>http://www.exif.org/Exif2-2.PDF</code>
056 * </a>.
057 *
058 * <p> The definitions of the data types referenced by the field
059 * definitions may be found in the {@link TIFFTag
060 * <code>TIFFTag</code>} class.
061 */
062public class EXIFTIFFTagSet extends TIFFTagSet {
063
064    private static EXIFTIFFTagSet theInstance = null;
065
066    /**
067     * A tag pointing to a GPS info IFD (type LONG).
068     *
069     * @deprecated Superseded by
070     * {@link EXIFParentTIFFTagSet#TAG_GPS_INFO_IFD_POINTER}
071     */
072    public static final int TAG_GPS_INFO_IFD_POINTER = 34853;
073
074    /** A tag pointing to an interoperability IFD (type LONG). */
075    public static final int TAG_INTEROPERABILITY_IFD_POINTER = 40965;
076
077    /**
078     * A tag containing the EXIF version number (type UNDEFINED, count =
079     * 4).  Conformance to the EXIF 2.1 standard is indicated using
080     * the ASCII value "0210" (with no terminating NUL).
081     *
082     * @see #EXIF_VERSION_2_1
083     * @see #EXIF_VERSION_2_2
084     */
085    public static final int TAG_EXIF_VERSION = 36864;
086
087    /**
088     * An array of bytes containing the values <code>{'0', '2', '1',
089     * '0'}</code> to be used with the "EXIFVersion" tag to indicate
090     * EXIF version 2.1.
091     *
092     * @see #TAG_EXIF_VERSION
093     */
094    public static byte[] EXIF_VERSION_2_1 = { '0', '2', '1', '0' };
095
096    /**
097     * An array of bytes containing the values <code>{'0', '2', '2',
098     * '0'}</code> to be used with the "EXIFVersion" tag to indicate
099     * EXIF version 2.2.
100     *
101     * @see #TAG_EXIF_VERSION
102     */
103    public static byte[] EXIF_VERSION_2_2 = { '0', '2', '2', '0' };
104
105    /**
106     * A tag indicating the FlashPix version number (type UNDEFINED,
107     * count = 4).
108     */
109    public static final int TAG_FLASHPIX_VERSION = 40960;
110
111    /**
112     * A tag indicating the color space information (type SHORT).  The
113     * legal values are given by the <code>COLOR_SPACE_*</code>
114     * constants.
115     *
116     * @see #COLOR_SPACE_SRGB
117     * @see #COLOR_SPACE_UNCALIBRATED
118     */
119    public static final int TAG_COLOR_SPACE = 40961;
120
121    /**
122     * A value to be used with the "ColorSpace" tag.
123     *
124     * @see #TAG_COLOR_SPACE
125     */
126    public static final int COLOR_SPACE_SRGB = 1;
127
128    /**
129     * A value to be used with the "ColorSpace" tag.
130     *
131     * @see #TAG_COLOR_SPACE
132     */
133    public static final int COLOR_SPACE_UNCALIBRATED = 0xFFFF;
134
135    /**
136     * A tag containing the components configuration information (type
137     * UNDEFINED, count = 4).
138     *
139     * @see #COMPONENTS_CONFIGURATION_DOES_NOT_EXIST
140     * @see #COMPONENTS_CONFIGURATION_Y
141     * @see #COMPONENTS_CONFIGURATION_CB
142     * @see #COMPONENTS_CONFIGURATION_CR
143     * @see #COMPONENTS_CONFIGURATION_R
144     * @see #COMPONENTS_CONFIGURATION_G
145     * @see #COMPONENTS_CONFIGURATION_B
146     */
147    public static final int TAG_COMPONENTS_CONFIGURATION = 37121;
148
149    /**
150     * A value to be used with the "ComponentsConfiguration" tag.
151     *
152     * @see #TAG_COMPONENTS_CONFIGURATION
153     */
154    public static final int COMPONENTS_CONFIGURATION_DOES_NOT_EXIST = 0;
155
156    /**
157     * A value to be used with the "ComponentsConfiguration" tag.
158     *
159     * @see #TAG_COMPONENTS_CONFIGURATION
160     */
161    public static final int COMPONENTS_CONFIGURATION_Y = 1;
162
163    /**
164     * A value to be used with the "ComponentsConfiguration" tag.
165     *
166     * @see #TAG_COMPONENTS_CONFIGURATION
167     */
168    public static final int COMPONENTS_CONFIGURATION_CB = 2;
169
170    /**
171     * A value to be used with the "ComponentsConfiguration" tag.
172     *
173     * @see #TAG_COMPONENTS_CONFIGURATION
174     */
175    public static final int COMPONENTS_CONFIGURATION_CR = 3;
176
177    /**
178     * A value to be used with the "ComponentsConfiguration" tag.
179     *
180     * @see #TAG_COMPONENTS_CONFIGURATION
181     */
182    public static final int COMPONENTS_CONFIGURATION_R = 4;
183
184    /**
185     * A value to be used with the "ComponentsConfiguration" tag.
186     *
187     * @see #TAG_COMPONENTS_CONFIGURATION
188     */
189    public static final int COMPONENTS_CONFIGURATION_G = 5;
190
191    /**
192     * A value to be used with the "ComponentsConfiguration" tag.
193     *
194     * @see #TAG_COMPONENTS_CONFIGURATION
195     */
196    public static final int COMPONENTS_CONFIGURATION_B = 6;
197
198    /**
199     * A tag indicating the number of compressed bits per pixel
200     * (type RATIONAL).
201     */
202    public static final int TAG_COMPRESSED_BITS_PER_PIXEL = 37122;
203
204    /**
205     * A tag indicating the pixel X dimension (type SHORT or LONG).
206     * This value records the valid width of the meaningful image for
207     * a compressed file, whether or not there is padding or a restart
208     * marker.
209     */
210    public static final int TAG_PIXEL_X_DIMENSION = 40962;
211
212    /**
213     * A tag indicating the pixel Y dimension (type SHORT or LONG).
214     * This value records the valid height of the meaningful image for
215     * a compressed file, whether or not there is padding or a restart
216     * marker.
217     */
218    public static final int TAG_PIXEL_Y_DIMENSION = 40963;
219
220    /**
221     * A tag indicating a manufacturer-defined maker note (type
222     * UNDEFINED).
223     */
224    public static final int TAG_MAKER_NOTE = 37500;
225
226    /**
227     * A tag indicating a manufacturer-defined marker note (type
228     * UNDEFINED).
229     *
230     * @deprecated Superseded by {@link #TAG_MAKER_NOTE}.
231     */
232    public static final int TAG_MARKER_NOTE = TAG_MAKER_NOTE;
233
234    /**
235     * A tag indicating a user comment (type UNDEFINED).  The first 8
236     * bytes are used to specify the character encoding.
237     */
238    public static final int TAG_USER_COMMENT = 37510;
239
240    /**
241     * A tag indicating the name of a related sound file (type ASCII).
242     */
243    public static final int TAG_RELATED_SOUND_FILE = 40964;
244
245    /**
246     * A tag indicating the date and time when the original image was
247     * generated (type ASCII).
248     */
249    public static final int TAG_DATE_TIME_ORIGINAL = 36867;
250
251    /**
252     * A tag indicating the date and time when the image was stored as
253     * digital data (type ASCII).
254     */
255    public static final int TAG_DATE_TIME_DIGITIZED = 36868;
256
257    /**
258     * A tag used to record fractions of seconds for the "DateTime" tag
259     * (type ASCII).
260     */
261    public static final int TAG_SUB_SEC_TIME = 37520;
262
263    /**
264     * A tag used to record fractions of seconds for the
265     * "DateTimeOriginal" tag (type ASCII).
266     */
267    public static final int TAG_SUB_SEC_TIME_ORIGINAL = 37521;
268
269    /**
270     * A tag used to record fractions of seconds for the
271     * "DateTimeDigitized" tag (type ASCII).
272     */
273    public static final int TAG_SUB_SEC_TIME_DIGITIZED = 37522;
274
275    /**
276     * A tag indicating the exposure time, in seconds (type RATIONAL).
277     */
278    public static final int TAG_EXPOSURE_TIME = 33434;
279
280    /**
281     * A tag indicating the F number (type RATIONAL).
282     */
283    public static final int TAG_F_NUMBER = 33437;
284
285    /**
286     * A tag indicating the class of the programs used to set exposure
287     * when the picture was taken (type SHORT).
288     *
289     * @see #EXPOSURE_PROGRAM_NOT_DEFINED
290     * @see #EXPOSURE_PROGRAM_MANUAL
291     * @see #EXPOSURE_PROGRAM_NORMAL_PROGRAM
292     * @see #EXPOSURE_PROGRAM_APERTURE_PRIORITY
293     * @see #EXPOSURE_PROGRAM_SHUTTER_PRIORITY
294     * @see #EXPOSURE_PROGRAM_CREATIVE_PROGRAM
295     * @see #EXPOSURE_PROGRAM_ACTION_PROGRAM
296     * @see #EXPOSURE_PROGRAM_PORTRAIT_MODE
297     * @see #EXPOSURE_PROGRAM_LANDSCAPE_MODE
298     * @see #EXPOSURE_PROGRAM_MAX_RESERVED
299     */
300    public static final int TAG_EXPOSURE_PROGRAM = 34850;
301
302    /**
303     * A value to be used with the "ExposureProgram" tag.
304     *
305     * @see #TAG_EXPOSURE_PROGRAM
306     */
307    public static final int EXPOSURE_PROGRAM_NOT_DEFINED = 0;
308
309    /**
310     * A value to be used with the "ExposureProgram" tag.
311     *
312     * @see #TAG_EXPOSURE_PROGRAM
313     */
314    public static final int EXPOSURE_PROGRAM_MANUAL = 1;
315
316    /**
317     * A value to be used with the "ExposureProgram" tag.
318     *
319     * @see #TAG_EXPOSURE_PROGRAM
320     */
321    public static final int EXPOSURE_PROGRAM_NORMAL_PROGRAM = 2;
322
323    /**
324     * A value to be used with the "ExposureProgram" tag.
325     *
326     * @see #TAG_EXPOSURE_PROGRAM
327     */
328    public static final int EXPOSURE_PROGRAM_APERTURE_PRIORITY = 3;
329
330    /**
331     * A value to be used with the "ExposureProgram" tag.
332     *
333     * @see #TAG_EXPOSURE_PROGRAM
334     */
335    public static final int EXPOSURE_PROGRAM_SHUTTER_PRIORITY = 4;
336
337    /**
338     * A value to be used with the "ExposureProgram" tag.
339     *
340     * @see #TAG_EXPOSURE_PROGRAM
341     */
342    public static final int EXPOSURE_PROGRAM_CREATIVE_PROGRAM = 5;
343
344    /**
345     * A value to be used with the "ExposureProgram" tag.
346     *
347     * @see #TAG_EXPOSURE_PROGRAM
348     */
349    public static final int EXPOSURE_PROGRAM_ACTION_PROGRAM = 6;
350
351    /**
352     * A value to be used with the "ExposureProgram" tag.
353     *
354     * @see #TAG_EXPOSURE_PROGRAM
355     */
356    public static final int EXPOSURE_PROGRAM_PORTRAIT_MODE = 7;
357
358    /**
359     * A value to be used with the "ExposureProgram" tag.
360     *
361     * @see #TAG_EXPOSURE_PROGRAM
362     */
363    public static final int EXPOSURE_PROGRAM_LANDSCAPE_MODE = 8;
364
365    /**
366     * A value to be used with the "ExposureProgram" tag.
367     *
368     * @see #TAG_EXPOSURE_PROGRAM
369     */
370    public static final int EXPOSURE_PROGRAM_MAX_RESERVED = 255;
371
372    /**
373     * A tag indicating the spectral sensitivity of each channel of
374     * the camera used (type ASCII).  The tag value is an ASCII string
375     * compatible with the ASTM standard.
376     */
377    public static final int TAG_SPECTRAL_SENSITIVITY = 34852;
378
379    /**
380     * A tag indicating the ISO speed and ISO latitude of the camera
381     * or input device, as specified in ISO 12232<sup>xiv</sup> (type
382     * SHORT).
383     */
384    public static final int TAG_ISO_SPEED_RATINGS= 34855;
385
386    /**
387     * A tag indicating the optoelectric conversion function,
388     * specified in ISO 14254<sup>xv</sup> (type UNDEFINED).  OECF is
389     * the relationship between the camera optical input and the image
390     * values.
391     */
392    public static final int TAG_OECF = 34856;
393
394    /**
395     * A tag indicating the shutter speed (type SRATIONAL).
396     */
397    public static final int TAG_SHUTTER_SPEED_VALUE = 37377;
398
399    /**
400     * A tag indicating the lens aperture (type RATIONAL).
401     */
402    public static final int TAG_APERTURE_VALUE = 37378;
403
404    /**
405     * A tag indicating the value of brightness (type SRATIONAL).
406     */
407    public static final int TAG_BRIGHTNESS_VALUE = 37379;
408
409    /**
410     * A tag indicating the exposure bias (type SRATIONAL).
411     */
412    public static final int TAG_EXPOSURE_BIAS_VALUE = 37380;
413
414    /**
415     * A tag indicating the smallest F number of the lens (type
416     * RATIONAL).
417     */
418    public static final int TAG_MAX_APERTURE_VALUE = 37381;
419
420    /**
421     * A tag indicating the distance to the subject, in meters (type
422     * RATIONAL).
423     */
424    public static final int TAG_SUBJECT_DISTANCE = 37382;
425
426    /**
427     * A tag indicating the metering mode (type SHORT).
428     *
429     * @see #METERING_MODE_UNKNOWN
430     * @see #METERING_MODE_AVERAGE
431     * @see #METERING_MODE_CENTER_WEIGHTED_AVERAGE
432     * @see #METERING_MODE_SPOT
433     * @see #METERING_MODE_MULTI_SPOT
434     * @see #METERING_MODE_PATTERN
435     * @see #METERING_MODE_PARTIAL
436     * @see #METERING_MODE_MIN_RESERVED
437     * @see #METERING_MODE_MAX_RESERVED
438     * @see #METERING_MODE_OTHER
439     */
440    public static final int TAG_METERING_MODE = 37383;
441
442    /**
443     * A value to be used with the "MeteringMode" tag.
444     *
445     * @see #TAG_METERING_MODE
446     */
447    public static final int METERING_MODE_UNKNOWN = 0;
448
449    /**
450     * A value to be used with the "MeteringMode" tag.
451     *
452     * @see #TAG_METERING_MODE
453     */
454    public static final int METERING_MODE_AVERAGE = 1;
455
456    /**
457     * A value to be used with the "MeteringMode" tag.
458     *
459     * @see #TAG_METERING_MODE
460     */
461    public static final int METERING_MODE_CENTER_WEIGHTED_AVERAGE = 2;
462
463    /**
464     * A value to be used with the "MeteringMode" tag.
465     *
466     * @see #TAG_METERING_MODE
467     */
468    public static final int METERING_MODE_SPOT = 3;
469
470    /**
471     * A value to be used with the "MeteringMode" tag.
472     *
473     * @see #TAG_METERING_MODE
474     */
475    public static final int METERING_MODE_MULTI_SPOT = 4;
476
477    /**
478     * A value to be used with the "MeteringMode" tag.
479     *
480     * @see #TAG_METERING_MODE
481     */
482    public static final int METERING_MODE_PATTERN = 5;
483
484    /**
485     * A value to be used with the "MeteringMode" tag.
486     *
487     * @see #TAG_METERING_MODE
488     */
489    public static final int METERING_MODE_PARTIAL = 6;
490
491    /**
492     * A value to be used with the "MeteringMode" tag.
493     *
494     * @see #TAG_METERING_MODE
495     */
496    public static final int METERING_MODE_MIN_RESERVED = 7;
497
498    /**
499     * A value to be used with the "MeteringMode" tag.
500     *
501     * @see #TAG_METERING_MODE
502     */
503    public static final int METERING_MODE_MAX_RESERVED = 254;
504
505    /**
506     * A value to be used with the "MeteringMode" tag.
507     *
508     * @see #TAG_METERING_MODE
509     */
510    public static final int METERING_MODE_OTHER = 255;
511
512    /**
513     * A tag indicatingthe kind of light source (type SHORT).
514     *
515     * @see #LIGHT_SOURCE_UNKNOWN
516     * @see #LIGHT_SOURCE_DAYLIGHT
517     * @see #LIGHT_SOURCE_FLUORESCENT
518     * @see #LIGHT_SOURCE_TUNGSTEN
519     * @see #LIGHT_SOURCE_STANDARD_LIGHT_A
520     * @see #LIGHT_SOURCE_STANDARD_LIGHT_B
521     * @see #LIGHT_SOURCE_STANDARD_LIGHT_C
522     * @see #LIGHT_SOURCE_D55
523     * @see #LIGHT_SOURCE_D65
524     * @see #LIGHT_SOURCE_D75
525     * @see #LIGHT_SOURCE_OTHER
526     */
527    public static final int TAG_LIGHT_SOURCE = 37384;
528
529    /**
530     * A value to be used with the "LightSource" tag.
531     *
532     * @see #TAG_LIGHT_SOURCE
533     */
534    public static final int LIGHT_SOURCE_UNKNOWN = 0;
535
536    /**
537     * A value to be used with the "LightSource" tag.
538     *
539     * @see #TAG_LIGHT_SOURCE
540     */
541    public static final int LIGHT_SOURCE_DAYLIGHT = 1;
542
543    /**
544     * A value to be used with the "LightSource" tag.
545     *
546     * @see #TAG_LIGHT_SOURCE
547     */
548    public static final int LIGHT_SOURCE_FLUORESCENT = 2;
549
550    /**
551     * A value to be used with the "LightSource" tag.
552     *
553     * @see #TAG_LIGHT_SOURCE
554     */
555    public static final int LIGHT_SOURCE_TUNGSTEN = 3;
556
557    /**
558     * A value to be used with the "LightSource" tag.
559     *
560     * @see #TAG_LIGHT_SOURCE
561     */
562    public static final int LIGHT_SOURCE_FLASH = 4;
563
564    /**
565     * A value to be used with the "LightSource" tag.
566     *
567     * @see #TAG_LIGHT_SOURCE
568     */
569    public static final int LIGHT_SOURCE_FINE_WEATHER = 9;
570
571    /**
572     * A value to be used with the "LightSource" tag.
573     *
574     * @see #TAG_LIGHT_SOURCE
575     */
576    public static final int LIGHT_SOURCE_CLOUDY_WEATHER = 10;
577
578    /**
579     * A value to be used with the "LightSource" tag.
580     *
581     * @see #TAG_LIGHT_SOURCE
582     */
583    public static final int LIGHT_SOURCE_SHADE = 11;
584
585    /**
586     * A value to be used with the "LightSource" tag.
587     *
588     * @see #TAG_LIGHT_SOURCE
589     */
590    public static final int LIGHT_SOURCE_DAYLIGHT_FLUORESCENT = 12;
591
592    /**
593     * A value to be used with the "LightSource" tag.
594     *
595     * @see #TAG_LIGHT_SOURCE
596     */
597    public static final int LIGHT_SOURCE_DAY_WHITE_FLUORESCENT = 13;
598
599    /**
600     * A value to be used with the "LightSource" tag.
601     *
602     * @see #TAG_LIGHT_SOURCE
603     */
604    public static final int LIGHT_SOURCE_COOL_WHITE_FLUORESCENT = 14;
605
606    /**
607     * A value to be used with the "LightSource" tag.
608     *
609     * @see #TAG_LIGHT_SOURCE
610     */
611    public static final int LIGHT_SOURCE_WHITE_FLUORESCENT = 15;
612
613    /**
614     * A value to be used with the "LightSource" tag.
615     *
616     * @see #TAG_LIGHT_SOURCE
617     */
618    public static final int LIGHT_SOURCE_STANDARD_LIGHT_A = 17;
619
620    /**
621     * A value to be used with the "LightSource" tag.
622     *
623     * @see #TAG_LIGHT_SOURCE
624     */
625    public static final int LIGHT_SOURCE_STANDARD_LIGHT_B = 18;
626
627    /**
628     * A value to be used with the "LightSource" tag.
629     *
630     * @see #TAG_LIGHT_SOURCE
631     */
632    public static final int LIGHT_SOURCE_STANDARD_LIGHT_C = 19;
633
634    /**
635     * A value to be used with the "LightSource" tag.
636     *
637     * @see #TAG_LIGHT_SOURCE
638     */
639    public static final int LIGHT_SOURCE_D55 = 20;
640
641    /**
642     * A value to be used with the "LightSource" tag.
643     *
644     * @see #TAG_LIGHT_SOURCE
645     */
646    public static final int LIGHT_SOURCE_D65 = 21;
647
648    /**
649     * A value to be used with the "LightSource" tag.
650     *
651     * @see #TAG_LIGHT_SOURCE
652     */
653    public static final int LIGHT_SOURCE_D75 = 22;
654
655    /**
656     * A value to be used with the "LightSource" tag.
657     *
658     * @see #TAG_LIGHT_SOURCE
659     */
660    public static final int LIGHT_SOURCE_D50 = 23;
661
662    /**
663     * A value to be used with the "LightSource" tag.
664     *
665     * @see #TAG_LIGHT_SOURCE
666     */
667    public static final int LIGHT_SOURCE_ISO_STUDIO_TUNGSTEN = 24;
668
669    /**
670     * A value to be used with the "LightSource" tag.
671     *
672     * @see #TAG_LIGHT_SOURCE
673     */
674    public static final int LIGHT_SOURCE_OTHER = 255;
675
676    /**
677     * A tag indicating the flash firing status and flash return
678     * status (type SHORT).
679     *
680     * @see #FLASH_DID_NOT_FIRE
681     * @see #FLASH_FIRED
682     * @see #FLASH_STROBE_RETURN_LIGHT_NOT_DETECTED
683     * @see #FLASH_STROBE_RETURN_LIGHT_DETECTED
684     */
685    public static final int TAG_FLASH = 37385;
686
687    /**
688     * A value to be used with the "Flash" tag, indicating that the
689     * flash did not fire.
690     *
691     * @see #TAG_FLASH
692     */
693    public static final int FLASH_DID_NOT_FIRE = 0x0;
694
695    /**
696     * A value to be used with the "Flash" tag, indicating that the
697     * flash fired, but the strobe return status is unknown.
698     *
699     * @see #TAG_FLASH
700     */
701    public static final int FLASH_FIRED = 0x1;
702
703    /**
704     * A value to be used with the "Flash" tag, indicating that the
705     * flash fired, but the strobe return light was not detected.
706     *
707     * @see #TAG_FLASH
708     */
709    public static final int FLASH_STROBE_RETURN_LIGHT_NOT_DETECTED = 0x5;
710
711    /**
712     * A value to be used with the "Flash" tag, indicating that the
713     * flash fired, and the strobe return light was detected.
714     *
715     * @see #TAG_FLASH
716     */
717    public static final int FLASH_STROBE_RETURN_LIGHT_DETECTED = 0x7;
718
719    /**
720     * A mask to be used with the "Flash" tag, indicating that the
721     * flash fired.
722     *
723     * @see #TAG_FLASH
724     */
725    public static final int FLASH_MASK_FIRED = 0x1;
726
727    /**
728     * A mask to be used with the "Flash" tag, indicating strobe return
729     * light not detected.
730     *
731     * @see #TAG_FLASH
732     */
733    public static final int FLASH_MASK_RETURN_NOT_DETECTED = 0x4;
734
735    /**
736     * A mask to be used with the "Flash" tag, indicating strobe return
737     * light detected.
738     *
739     * @see #TAG_FLASH
740     */
741    public static final int FLASH_MASK_RETURN_DETECTED = 0x6;
742
743    /**
744     * A mask to be used with the "Flash" tag, indicating compulsory flash
745     * firing mode.
746     *
747     * @see #TAG_FLASH
748     */
749    public static final int FLASH_MASK_MODE_FLASH_FIRING = 0x8;
750
751    /**
752     * A mask to be used with the "Flash" tag, indicating compulsory flash
753     * suppression mode.
754     *
755     * @see #TAG_FLASH
756     */
757    public static final int FLASH_MASK_MODE_FLASH_SUPPRESSION = 0x10;
758
759    /**
760     * A mask to be used with the "Flash" tag, indicating auto mode.
761     *
762     * @see #TAG_FLASH
763     */
764    public static final int FLASH_MASK_MODE_AUTO = 0x18;
765
766    /**
767     * A mask to be used with the "Flash" tag, indicating no flash function
768     * present.
769     *
770     * @see #TAG_FLASH
771     */
772    public static final int FLASH_MASK_FUNCTION_NOT_PRESENT = 0x20;
773
774    /**
775     * A mask to be used with the "Flash" tag, indicating red-eye reduction
776     * supported.
777     *
778     * @see #TAG_FLASH
779     */
780    public static final int FLASH_MASK_RED_EYE_REDUCTION = 0x40;
781
782    /**
783     * A tag indicating the actual focal length of the lens, in
784     * millimeters (type RATIONAL).
785     */
786    public static final int TAG_FOCAL_LENGTH = 37386;
787
788    /**
789     * A tag indicating the location and area of the main subject in
790     * the overall scene.
791     */
792    public static final int TAG_SUBJECT_AREA = 37396;
793
794    /**
795     * A tag indicating the strobe energy at the time the image was
796     * captured, as measured in Beam Candle Power Seconds (BCPS) (type
797     * RATIONAL).
798     */
799    public static final int TAG_FLASH_ENERGY = 41483;
800
801    /**
802     * A tag indicating the camera or input device spatial frequency
803     * table and SFR values in the direction of image width, image
804     * height, and diagonal direction, as specified in ISO
805     * 12233<sup>xvi</sup> (type UNDEFINED).
806     */
807    public static final int TAG_SPATIAL_FREQUENCY_RESPONSE = 41484;
808
809    /**
810     * Indicates the number of pixels in the image width (X) direction
811     * per FocalPlaneResolutionUnit on the camera focal plane (type
812     * RATIONAL).
813     */
814    public static final int TAG_FOCAL_PLANE_X_RESOLUTION = 41486;
815
816    /**
817     * Indicate the number of pixels in the image height (Y) direction
818     * per FocalPlaneResolutionUnit on the camera focal plane (type
819     * RATIONAL).
820     */
821    public static final int TAG_FOCAL_PLANE_Y_RESOLUTION = 41487;
822
823    /**
824     * Indicates the unit for measuring FocalPlaneXResolution and
825     * FocalPlaneYResolution (type SHORT).
826     *
827     * @see #FOCAL_PLANE_RESOLUTION_UNIT_NONE
828     * @see #FOCAL_PLANE_RESOLUTION_UNIT_INCH
829     * @see #FOCAL_PLANE_RESOLUTION_UNIT_CENTIMETER
830     */
831    public static final int TAG_FOCAL_PLANE_RESOLUTION_UNIT = 41488;
832
833    /**
834     * A value to be used with the "FocalPlaneResolutionUnit" tag.
835     *
836     * @see #TAG_FOCAL_PLANE_RESOLUTION_UNIT
837     */
838    public static final int FOCAL_PLANE_RESOLUTION_UNIT_NONE = 1;
839
840    /**
841     * A value to be used with the "FocalPlaneXResolution" tag.
842     *
843     * @see #TAG_FOCAL_PLANE_RESOLUTION_UNIT
844     */
845    public static final int FOCAL_PLANE_RESOLUTION_UNIT_INCH = 2;
846
847    /**
848     * A value to be used with the "FocalPlaneXResolution" tag.
849     *
850     * @see #TAG_FOCAL_PLANE_RESOLUTION_UNIT
851     */
852    public static final int FOCAL_PLANE_RESOLUTION_UNIT_CENTIMETER = 3;
853
854    /**
855     * A tag indicating the column and row of the center pixel of the
856     * main subject in the scene (type SHORT, count = 2).
857     */
858    public static final int TAG_SUBJECT_LOCATION = 41492;
859
860    /**
861     * A tag indicating the exposure index selected on the camera or
862     * input device at the time the image was captured (type
863     * RATIONAL).
864     */
865    public static final int TAG_EXPOSURE_INDEX = 41493;
866
867    /**
868     * A tag indicating the sensor type on the camera or input device
869     * (type SHORT).
870     *
871     * @see #SENSING_METHOD_NOT_DEFINED
872     * @see #SENSING_METHOD_ONE_CHIP_COLOR_AREA_SENSOR
873     * @see #SENSING_METHOD_TWO_CHIP_COLOR_AREA_SENSOR
874     * @see #SENSING_METHOD_THREE_CHIP_COLOR_AREA_SENSOR
875     * @see #SENSING_METHOD_COLOR_SEQUENTIAL_AREA_SENSOR
876     * @see #SENSING_METHOD_TRILINEAR_SENSOR
877     * @see #SENSING_METHOD_COLOR_SEQUENTIAL_LINEAR_SENSOR
878     */
879    public static final int TAG_SENSING_METHOD = 41495;
880
881    /**
882     * A value to be used with the "SensingMethod" tag.
883     *
884     * @see #TAG_SENSING_METHOD
885     */
886    public static final int SENSING_METHOD_NOT_DEFINED = 1;
887
888    /**
889     * A value to be used with the "SensingMethod" tag.
890     *
891     * @see #TAG_SENSING_METHOD
892     */
893    public static final int SENSING_METHOD_ONE_CHIP_COLOR_AREA_SENSOR = 2;
894
895    /**
896     * A value to be used with the "SensingMethod" tag.
897     *
898     * @see #TAG_SENSING_METHOD
899     */
900    public static final int SENSING_METHOD_TWO_CHIP_COLOR_AREA_SENSOR = 3;
901
902    /**
903     * A value to be used with the "SensingMethod" tag.
904     *
905     * @see #TAG_SENSING_METHOD
906     */
907    public static final int SENSING_METHOD_THREE_CHIP_COLOR_AREA_SENSOR = 4;
908
909    /**
910     * A value to be used with the "SensingMethod" tag.
911     *
912     * @see #TAG_SENSING_METHOD
913     */
914    public static final int SENSING_METHOD_COLOR_SEQUENTIAL_AREA_SENSOR = 5;
915
916    /**
917     * A value to be used with the "SensingMethod" tag.
918     *
919     * @see #TAG_SENSING_METHOD
920     */
921    public static final int SENSING_METHOD_TRILINEAR_SENSOR = 7;
922
923    /**
924     * A value to be used with the "SensingMethod" tag.
925     *
926     * @see #TAG_SENSING_METHOD
927     */
928    public static final int SENSING_METHOD_COLOR_SEQUENTIAL_LINEAR_SENSOR = 8;
929
930    /**
931     * A tag indicating the image source (type UNDEFINED).
932     *
933     * @see #FILE_SOURCE_DSC
934     */
935    public static final int TAG_FILE_SOURCE = 41728;
936
937    /**
938     * A value to be used with the "FileSource" tag.
939     *
940     * @see #TAG_FILE_SOURCE
941     */
942    public static final int FILE_SOURCE_DSC = 3;
943
944    /**
945     * A tag indicating the type of scene (type UNDEFINED).
946     *
947     * @see #SCENE_TYPE_DSC
948     */
949    public static final int TAG_SCENE_TYPE = 41729;
950
951    /**
952     * A value to be used with the "SceneType" tag.
953     *
954     * @see #TAG_SCENE_TYPE
955     */
956    public static final int SCENE_TYPE_DSC = 1;
957
958    /**
959     * A tag indicating the color filter array geometric pattern of
960     * the image sensor when a one-chip color area sensor if used
961     * (type UNDEFINED).
962     */
963    public static final int TAG_CFA_PATTERN = 41730;
964
965    /**
966     * A tag indicating the use of special processing on image data,
967     * such as rendering geared to output.
968     */
969    public static final int TAG_CUSTOM_RENDERED = 41985;
970
971    /**
972     * A value to be used with the "CustomRendered" tag.
973     *
974     * @see #TAG_CUSTOM_RENDERED
975     */
976    public static final int CUSTOM_RENDERED_NORMAL = 0;
977
978    /**
979     * A value to be used with the "CustomRendered" tag.
980     *
981     * @see #TAG_CUSTOM_RENDERED
982     */
983    public static final int CUSTOM_RENDERED_CUSTOM = 1;
984
985    /**
986     * A tag indicating the exposure mode set when the image was shot.
987     */
988    public static final int TAG_EXPOSURE_MODE = 41986;
989
990    /**
991     * A value to be used with the "ExposureMode" tag.
992     *
993     * @see #TAG_EXPOSURE_MODE
994     */
995    public static final int EXPOSURE_MODE_AUTO_EXPOSURE = 0;
996
997    /**
998     * A value to be used with the "ExposureMode" tag.
999     *
1000     * @see #TAG_EXPOSURE_MODE
1001     */
1002    public static final int EXPOSURE_MODE_MANUAL_EXPOSURE = 1;
1003
1004    /**
1005     * A value to be used with the "ExposureMode" tag.
1006     *
1007     * @see #TAG_EXPOSURE_MODE
1008     */
1009    public static final int EXPOSURE_MODE_AUTO_BRACKET = 2;
1010
1011    /**
1012     * A tag indicating the white balance mode set when the image was shot.
1013     */
1014    public static final int TAG_WHITE_BALANCE = 41987;
1015
1016    /**
1017     * A value to be used with the "WhiteBalance" tag.
1018     *
1019     * @see #TAG_WHITE_BALANCE
1020     */
1021    public static final int WHITE_BALANCE_AUTO = 0;
1022
1023    /**
1024     * A value to be used with the "WhiteBalance" tag.
1025     *
1026     * @see #TAG_WHITE_BALANCE
1027     */
1028    public static final int WHITE_BALANCE_MANUAL = 1;
1029
1030    /**
1031     * A tag indicating the digital zoom ratio when the image was shot.
1032     */
1033    public static final int TAG_DIGITAL_ZOOM_RATIO = 41988;
1034
1035    /**
1036     * A tag indicating the equivalent focal length assuming a 35mm film
1037     * camera, in millimeters.
1038     */
1039    public static final int TAG_FOCAL_LENGTH_IN_35MM_FILM = 41989;
1040
1041    /**
1042     * A tag indicating the type of scene that was shot.
1043     */
1044    public static final int TAG_SCENE_CAPTURE_TYPE = 41990;
1045
1046    /**
1047     * A value to be used with the "SceneCaptureType" tag.
1048     *
1049     * @see #TAG_SCENE_CAPTURE_TYPE
1050     */
1051    public static final int SCENE_CAPTURE_TYPE_STANDARD = 0;
1052
1053    /**
1054     * A value to be used with the "SceneCaptureType" tag.
1055     *
1056     * @see #TAG_SCENE_CAPTURE_TYPE
1057     */
1058    public static final int SCENE_CAPTURE_TYPE_LANDSCAPE = 1;
1059
1060    /**
1061     * A value to be used with the "SceneCaptureType" tag.
1062     *
1063     * @see #TAG_SCENE_CAPTURE_TYPE
1064     */
1065    public static final int SCENE_CAPTURE_TYPE_PORTRAIT = 2;
1066
1067    /**
1068     * A value to be used with the "SceneCaptureType" tag.
1069     *
1070     * @see #TAG_SCENE_CAPTURE_TYPE
1071     */
1072    public static final int SCENE_CAPTURE_TYPE_NIGHT_SCENE = 3;
1073
1074    /**
1075     * A tag indicating the degree of overall image gain adjustment.
1076     */
1077    public static final int TAG_GAIN_CONTROL = 41991;
1078
1079    /**
1080     * A value to be used with the "GainControl" tag.
1081     *
1082     * @see #TAG_GAIN_CONTROL
1083     */
1084    public static final int GAIN_CONTROL_NONE = 0;
1085
1086    /**
1087     * A value to be used with the "GainControl" tag.
1088     *
1089     * @see #TAG_GAIN_CONTROL
1090     */
1091    public static final int GAIN_CONTROL_LOW_GAIN_UP = 1;
1092
1093    /**
1094     * A value to be used with the "GainControl" tag.
1095     *
1096     * @see #TAG_GAIN_CONTROL
1097     */
1098    public static final int GAIN_CONTROL_HIGH_GAIN_UP = 2;
1099
1100    /**
1101     * A value to be used with the "GainControl" tag.
1102     *
1103     * @see #TAG_GAIN_CONTROL
1104     */
1105    public static final int GAIN_CONTROL_LOW_GAIN_DOWN = 3;
1106
1107    /**
1108     * A value to be used with the "GainControl" tag.
1109     *
1110     * @see #TAG_GAIN_CONTROL
1111     */
1112    public static final int GAIN_CONTROL_HIGH_GAIN_DOWN = 4;
1113
1114    /**
1115     * A tag indicating the direction of contrast processing applied
1116     * by the camera when the image was shot.
1117     */
1118    public static final int TAG_CONTRAST = 41992;
1119
1120    /**
1121     * A value to be used with the "Contrast" tag.
1122     *
1123     * @see #TAG_CONTRAST
1124     */
1125    public static final int CONTRAST_NORMAL = 0;
1126
1127    /**
1128     * A value to be used with the "Contrast" tag.
1129     *
1130     * @see #TAG_CONTRAST
1131     */
1132    public static final int CONTRAST_SOFT = 1;
1133
1134    /**
1135     * A value to be used with the "Contrast" tag.
1136     *
1137     * @see #TAG_CONTRAST
1138     */
1139    public static final int CONTRAST_HARD = 2;
1140
1141    /**
1142     * A tag indicating the direction of saturation processing
1143     * applied by the camera when the image was shot.
1144     */
1145    public static final int TAG_SATURATION = 41993;
1146
1147    /**
1148     * A value to be used with the "Saturation" tag.
1149     *
1150     * @see #TAG_SATURATION
1151     */
1152    public static final int SATURATION_NORMAL = 0;
1153
1154    /**
1155     * A value to be used with the "Saturation" tag.
1156     *
1157     * @see #TAG_SATURATION
1158     */
1159    public static final int SATURATION_LOW = 1;
1160
1161    /**
1162     * A value to be used with the "Saturation" tag.
1163     *
1164     * @see #TAG_SATURATION
1165     */
1166    public static final int SATURATION_HIGH = 2;
1167
1168    /**
1169     * A tag indicating the direction of sharpness processing
1170     * applied by the camera when the image was shot.
1171     */
1172    public static final int TAG_SHARPNESS = 41994;
1173
1174    /**
1175     * A value to be used with the "Sharpness" tag.
1176     *
1177     * @see #TAG_SHARPNESS
1178     */
1179    public static final int SHARPNESS_NORMAL = 0;
1180
1181    /**
1182     * A value to be used with the "Sharpness" tag.
1183     *
1184     * @see #TAG_SHARPNESS
1185     */
1186    public static final int SHARPNESS_SOFT = 1;
1187
1188    /**
1189     * A value to be used with the "Sharpness" tag.
1190     *
1191     * @see #TAG_SHARPNESS
1192     */
1193    public static final int SHARPNESS_HARD = 2;
1194
1195    /**
1196     * A tag indicating information on the picture-taking conditions
1197     * of a particular camera model.
1198     */
1199    public static final int TAG_DEVICE_SETTING_DESCRIPTION = 41995;
1200
1201    /**
1202     * A tag indicating the distance to the subject.
1203     */
1204    public static final int TAG_SUBJECT_DISTANCE_RANGE = 41996;
1205
1206    /**
1207     * A value to be used with the "SubjectDistanceRange" tag.
1208     *
1209     * @see #TAG_SUBJECT_DISTANCE_RANGE
1210     */
1211    public static final int SUBJECT_DISTANCE_RANGE_UNKNOWN = 0;
1212
1213    /**
1214     * A value to be used with the "SubjectDistanceRange" tag.
1215     *
1216     * @see #TAG_SUBJECT_DISTANCE_RANGE
1217     */
1218    public static final int SUBJECT_DISTANCE_RANGE_MACRO = 1;
1219
1220    /**
1221     * A value to be used with the "SubjectDistanceRange" tag.
1222     *
1223     * @see #TAG_SUBJECT_DISTANCE_RANGE
1224     */
1225    public static final int SUBJECT_DISTANCE_RANGE_CLOSE_VIEW = 2;
1226
1227    /**
1228     * A value to be used with the "SubjectDistanceRange" tag.
1229     *
1230     * @see #TAG_SUBJECT_DISTANCE_RANGE
1231     */
1232    public static final int SUBJECT_DISTANCE_RANGE_DISTANT_VIEW = 3;
1233
1234    /**
1235     * A tag indicating an identifier assigned uniquely to each image.
1236     */
1237    public static final int TAG_IMAGE_UNIQUE_ID = 42016;
1238
1239    // EXIF 2.1 private
1240
1241    // GPS Attribute Information
1242    //     0 - GPSVersionID                       (BYTE/4)
1243    //     1 - GPSLatitudeRef                     (ASCII/2)
1244    //     2 - GPSLatitude                        (RATIONAL/3)
1245    //     3 - GPSLongitudeRef                    (ASCII/2)
1246    //     4 - GPSLongitude                       (RATIONAL/3)
1247    //     5 - GPSAltitudeRef                     (BYTE/1)
1248    //     6 - GPSAltitude                        (RATIONAL/1)
1249    //     7 - GPSTimeStamp                       (RATIONAL/3)
1250    //     8 - GPSSatellites                      (ASCII/any)
1251    //     9 - GPSStatus                          (ASCII/2)
1252    //    10 - GPSMeasureMode                     (ASCII/2)
1253    //    11 - GPSDOP                             (RATIONAL/1)
1254    //    12 - GPSSpeedRef                        (ASCII/2)
1255    //    13 - GPSSpeed                           (RATIONAL/1)
1256    //    14 - GPSTrackRef                        (ASCII/2)
1257    //    15 - GPSTrack                           (RATIONAL/1)
1258    //    16 - GPSImgDirectionRef                 (ASCII/2)
1259    //    17 - GPSImgDirection                    (RATIONAL/1)
1260    //    18 - GPSMapDatum                        (ASCII/any)
1261    //    19 - GPSDestLatitudeRef                 (ASCII/2)
1262    //    20 - GPSDestLatitude                    (RATIONAL/3)
1263    //    21 - GPSDestLongitudeRef                (ASCII/2)
1264    //    22 - GPSDestLongitude                   (RATIONAL/3)
1265    //    23 - GPSDestBearingRef                  (ASCII/2)
1266    //    24 - GPSDestBearing                     (RATIONAL/1)
1267    //    25 - GPSDestDistanceRef                 (ASCII/2)
1268    //    26 - GPSDestDistance                    (RATIONAL/1)
1269
1270    // EXIF Interoperability Information ???
1271    
1272    //     0 - Interoperability Index             (ASCII/any)
1273
1274    // EXIF tags
1275
1276    static class EXIFVersion extends TIFFTag {
1277        
1278        public EXIFVersion() {
1279            super("EXIFversion",
1280                  TAG_EXIF_VERSION,
1281                  1 << TIFFTag.TIFF_UNDEFINED);
1282        }
1283    }
1284
1285    static class FlashPixVersion extends TIFFTag {
1286
1287        public FlashPixVersion() {
1288            super("FlashPixVersion",
1289                  TAG_FLASHPIX_VERSION,
1290                  1 << TIFFTag.TIFF_UNDEFINED);
1291        }
1292    }
1293
1294    static class ColorSpace extends TIFFTag {
1295
1296        public ColorSpace() {
1297            super("ColorSpace",
1298                  TAG_COLOR_SPACE,
1299                  1 << TIFFTag.TIFF_SHORT);
1300
1301            addValueName(COLOR_SPACE_SRGB, "sRGB");
1302            addValueName(COLOR_SPACE_UNCALIBRATED, "Uncalibrated");
1303        }
1304    }
1305
1306    static class ComponentsConfiguration extends TIFFTag {
1307
1308        public ComponentsConfiguration() {
1309            super("ComponentsConfiguration",
1310                  TAG_COMPONENTS_CONFIGURATION,
1311                  1 << TIFFTag.TIFF_UNDEFINED);
1312            
1313            addValueName(COMPONENTS_CONFIGURATION_DOES_NOT_EXIST,
1314                         "DoesNotExist");
1315            addValueName(COMPONENTS_CONFIGURATION_Y, "Y");
1316            addValueName(COMPONENTS_CONFIGURATION_CB, "Cb");
1317            addValueName(COMPONENTS_CONFIGURATION_CR, "Cr");
1318            addValueName(COMPONENTS_CONFIGURATION_R, "R");
1319            addValueName(COMPONENTS_CONFIGURATION_G, "G");
1320            addValueName(COMPONENTS_CONFIGURATION_B, "B");
1321        }
1322    }
1323
1324    static class CompressedBitsPerPixel extends TIFFTag {
1325
1326        public CompressedBitsPerPixel() {
1327            super("CompressedBitsPerPixel",
1328                  TAG_COMPRESSED_BITS_PER_PIXEL,
1329                  1 << TIFFTag.TIFF_RATIONAL);
1330        }
1331    }
1332
1333    static class PixelXDimension extends TIFFTag {
1334
1335        public PixelXDimension() {
1336            super("PixelXDimension",
1337                  TAG_PIXEL_X_DIMENSION,
1338                  (1 << TIFFTag.TIFF_SHORT) |
1339                  (1 << TIFFTag.TIFF_LONG));
1340        }
1341    }
1342
1343    static class PixelYDimension extends TIFFTag {
1344
1345        public PixelYDimension() {
1346            super("PixelYDimension",
1347                  TAG_PIXEL_Y_DIMENSION,
1348                  (1 << TIFFTag.TIFF_SHORT) |
1349                  (1 << TIFFTag.TIFF_LONG));
1350        }
1351    }
1352
1353    static class MakerNote extends TIFFTag {
1354
1355        public MakerNote() {
1356            super("MakerNote",
1357                  TAG_MAKER_NOTE,
1358                  1 << TIFFTag.TIFF_UNDEFINED);
1359        }
1360    }
1361
1362    static class UserComment extends TIFFTag {
1363
1364        public UserComment() {
1365            super("UserComment",
1366                  TAG_USER_COMMENT,
1367                  1 << TIFFTag.TIFF_UNDEFINED);
1368        }
1369    }
1370
1371    static class RelatedSoundFile extends TIFFTag {
1372
1373        public RelatedSoundFile() {
1374            super("RelatedSoundFile",
1375                  TAG_RELATED_SOUND_FILE,
1376                  1 << TIFFTag.TIFF_ASCII);
1377        }
1378    }
1379
1380    static class DateTimeOriginal extends TIFFTag {
1381
1382        public DateTimeOriginal() {
1383            super("DateTimeOriginal",
1384                  TAG_DATE_TIME_ORIGINAL,
1385                  1 << TIFFTag.TIFF_ASCII);
1386        }
1387    }
1388
1389    static class DateTimeDigitized extends TIFFTag {
1390
1391        public DateTimeDigitized() {
1392            super("DateTimeDigitized",
1393                  TAG_DATE_TIME_DIGITIZED,
1394                  1 << TIFFTag.TIFF_ASCII);
1395        }
1396    }
1397
1398    static class SubSecTime extends TIFFTag {
1399
1400        public SubSecTime() {
1401            super("SubSecTime",
1402                  TAG_SUB_SEC_TIME,
1403                  1 << TIFFTag.TIFF_ASCII);
1404        }
1405    }
1406
1407    static class SubSecTimeOriginal extends TIFFTag {
1408
1409        public SubSecTimeOriginal() {
1410            super("SubSecTimeOriginal",
1411                  TAG_SUB_SEC_TIME_ORIGINAL,
1412                  1 << TIFFTag.TIFF_ASCII);
1413        }
1414    }
1415
1416    static class SubSecTimeDigitized extends TIFFTag {
1417
1418        public SubSecTimeDigitized() {
1419            super("SubSecTimeDigitized",
1420                  TAG_SUB_SEC_TIME_DIGITIZED,
1421                  1 << TIFFTag.TIFF_ASCII);
1422        }
1423    }
1424
1425    static class ExposureTime extends TIFFTag {
1426
1427        public ExposureTime() {
1428            super("ExposureTime",
1429                  TAG_EXPOSURE_TIME,
1430                  1 << TIFFTag.TIFF_RATIONAL);
1431        }
1432    }
1433
1434    static class FNumber extends TIFFTag {
1435
1436        public FNumber() {
1437            super("FNumber",
1438                  TAG_F_NUMBER,
1439                  1 << TIFFTag.TIFF_RATIONAL);
1440        }
1441    }
1442
1443    static class ExposureProgram extends TIFFTag {
1444
1445        public ExposureProgram() {
1446            super("ExposureProgram",
1447                  TAG_EXPOSURE_PROGRAM,
1448                  1 << TIFFTag.TIFF_SHORT);
1449
1450            addValueName(EXPOSURE_PROGRAM_NOT_DEFINED, "Not Defined");
1451            addValueName(EXPOSURE_PROGRAM_MANUAL, "Manual");
1452            addValueName(EXPOSURE_PROGRAM_NORMAL_PROGRAM, "Normal Program");
1453            addValueName(EXPOSURE_PROGRAM_APERTURE_PRIORITY,
1454                         "Aperture Priority");
1455            addValueName(EXPOSURE_PROGRAM_SHUTTER_PRIORITY,
1456                         "Shutter Priority");
1457            addValueName(EXPOSURE_PROGRAM_CREATIVE_PROGRAM,
1458                         "Creative Program");
1459            addValueName(EXPOSURE_PROGRAM_ACTION_PROGRAM, "Action Program");
1460            addValueName(EXPOSURE_PROGRAM_PORTRAIT_MODE, "Portrait Mode");
1461            addValueName(EXPOSURE_PROGRAM_LANDSCAPE_MODE, "Landscape Mode");
1462        }
1463    }
1464
1465    static class SpectralSensitivity extends TIFFTag {
1466        public SpectralSensitivity() {
1467            super("SpectralSensitivity",
1468                  TAG_SPECTRAL_SENSITIVITY,
1469                  1 << TIFFTag.TIFF_ASCII);
1470        }
1471    }
1472
1473    static class ISOSpeedRatings extends TIFFTag {
1474
1475        public ISOSpeedRatings() {
1476            super("ISOSpeedRatings",
1477                  TAG_ISO_SPEED_RATINGS,
1478                  1 << TIFFTag.TIFF_SHORT);
1479        }
1480    }
1481
1482    static class OECF extends TIFFTag {
1483
1484        public OECF() {
1485            super("OECF",
1486                  TAG_OECF,
1487                  1 << TIFFTag.TIFF_UNDEFINED);
1488        }
1489    }
1490
1491    static class ShutterSpeedValue extends TIFFTag {
1492
1493        public ShutterSpeedValue() {
1494            super("ShutterSpeedValue",
1495                  TAG_SHUTTER_SPEED_VALUE,
1496                  1 << TIFFTag.TIFF_SRATIONAL);
1497        }
1498    }
1499
1500    static class ApertureValue extends TIFFTag {
1501
1502        public ApertureValue() {
1503            super("ApertureValue",
1504                  TAG_APERTURE_VALUE,
1505                  1 << TIFFTag.TIFF_RATIONAL);
1506        }
1507    }
1508
1509    static class BrightnessValue extends TIFFTag {
1510
1511        public BrightnessValue() {
1512            super("BrightnessValue",
1513                  TAG_BRIGHTNESS_VALUE,
1514                  1 << TIFFTag.TIFF_SRATIONAL);
1515        }
1516    }
1517
1518    static class ExposureBiasValue extends TIFFTag {
1519
1520        public ExposureBiasValue() {
1521            super("ExposureBiasValue",
1522                  TAG_EXPOSURE_BIAS_VALUE,
1523                  1 << TIFFTag.TIFF_SRATIONAL);
1524        }
1525    }
1526
1527    static class MaxApertureValue extends TIFFTag {
1528
1529        public MaxApertureValue() {
1530            super("MaxApertureValue",
1531                  TAG_MAX_APERTURE_VALUE,
1532                  1 << TIFFTag.TIFF_RATIONAL);
1533        }
1534    }
1535
1536    static class SubjectDistance extends TIFFTag {
1537
1538        public SubjectDistance() {
1539            super("SubjectDistance",
1540                  TAG_SUBJECT_DISTANCE,
1541                  1 << TIFFTag.TIFF_RATIONAL);
1542        }
1543    }
1544
1545    static class MeteringMode extends TIFFTag {
1546
1547        public MeteringMode() {
1548            super("MeteringMode",
1549                  TAG_METERING_MODE,
1550                  1 << TIFFTag.TIFF_SHORT);
1551            
1552            addValueName(METERING_MODE_UNKNOWN, "Unknown");
1553            addValueName(METERING_MODE_AVERAGE, "Average");
1554            addValueName(METERING_MODE_CENTER_WEIGHTED_AVERAGE,
1555                         "CenterWeightedAverage");
1556            addValueName(METERING_MODE_SPOT, "Spot");
1557            addValueName(METERING_MODE_MULTI_SPOT, "MultiSpot");
1558            addValueName(METERING_MODE_PATTERN, "Pattern");
1559            addValueName(METERING_MODE_PARTIAL, "Partial");
1560            addValueName(METERING_MODE_OTHER, "Other");
1561        }
1562    }
1563
1564    static class LightSource extends TIFFTag {
1565
1566        public LightSource() {
1567            super("LightSource",
1568                  TAG_LIGHT_SOURCE,
1569                  1 << TIFFTag.TIFF_SHORT);
1570
1571            addValueName(LIGHT_SOURCE_UNKNOWN, "Unknown");
1572            addValueName(LIGHT_SOURCE_DAYLIGHT, "Daylight");
1573            addValueName(LIGHT_SOURCE_FLUORESCENT, "Fluorescent");
1574            addValueName(LIGHT_SOURCE_TUNGSTEN, "Tungsten");
1575            addValueName(LIGHT_SOURCE_STANDARD_LIGHT_A, "Standard Light A");
1576            addValueName(LIGHT_SOURCE_STANDARD_LIGHT_B, "Standard Light B");
1577            addValueName(LIGHT_SOURCE_STANDARD_LIGHT_C, "Standard Light C");
1578            addValueName(LIGHT_SOURCE_D55, "D55");
1579            addValueName(LIGHT_SOURCE_D65, "D65");
1580            addValueName(LIGHT_SOURCE_D75, "D75");
1581            addValueName(LIGHT_SOURCE_OTHER, "Other");
1582        }
1583    }
1584
1585    static class Flash extends TIFFTag {
1586
1587        public Flash() {
1588            super("Flash",
1589                  TAG_FLASH,
1590                  1 << TIFFTag.TIFF_SHORT);
1591        
1592            addValueName(FLASH_DID_NOT_FIRE, "Flash Did Not Fire");
1593            addValueName(FLASH_FIRED, "Flash Fired");
1594            addValueName(FLASH_STROBE_RETURN_LIGHT_NOT_DETECTED,
1595                         "Strobe Return Light Not Detected");
1596            addValueName(FLASH_STROBE_RETURN_LIGHT_DETECTED,
1597                         "Strobe Return Light Detected");
1598        }
1599    }
1600
1601    static class FocalLength extends TIFFTag {
1602
1603        public FocalLength() {
1604            super("FocalLength",
1605                  TAG_FOCAL_LENGTH,
1606                  1 << TIFFTag.TIFF_RATIONAL);
1607        }
1608    }
1609
1610    static class SubjectArea extends TIFFTag {
1611
1612        public SubjectArea() {
1613            super("SubjectArea",
1614                  TAG_SUBJECT_AREA,
1615                  1 << TIFFTag.TIFF_SHORT);
1616        }
1617    }
1618
1619    static class FlashEnergy extends TIFFTag {
1620
1621        public FlashEnergy() {
1622            super("FlashEnergy",
1623                  TAG_FLASH_ENERGY,
1624                  1 << TIFFTag.TIFF_RATIONAL);
1625        }
1626    }
1627
1628    static class SpatialFrequencyResponse extends TIFFTag {
1629
1630        public SpatialFrequencyResponse() {
1631            super("SpatialFrequencyResponse",
1632                  TAG_SPATIAL_FREQUENCY_RESPONSE,
1633                  1 << TIFFTag.TIFF_UNDEFINED);
1634        }
1635    }
1636
1637    static class FocalPlaneXResolution extends TIFFTag {
1638
1639        public FocalPlaneXResolution() {
1640            super("FocalPlaneXResolution",
1641                  TAG_FOCAL_PLANE_X_RESOLUTION,
1642                  1 << TIFFTag.TIFF_RATIONAL);
1643        }
1644    }
1645
1646    static class FocalPlaneYResolution extends TIFFTag {
1647
1648        public FocalPlaneYResolution() {
1649            super("FocalPlaneYResolution",
1650                  TAG_FOCAL_PLANE_Y_RESOLUTION,
1651                  1 << TIFFTag.TIFF_RATIONAL);
1652        }
1653    }
1654
1655    static class FocalPlaneResolutionUnit extends TIFFTag {
1656
1657        public FocalPlaneResolutionUnit() {
1658            super("FocalPlaneResolutionUnit",
1659                  TAG_FOCAL_PLANE_RESOLUTION_UNIT,
1660                  1 << TIFFTag.TIFF_SHORT);
1661
1662            addValueName(FOCAL_PLANE_RESOLUTION_UNIT_NONE, "None");
1663            addValueName(FOCAL_PLANE_RESOLUTION_UNIT_INCH, "Inch");
1664            addValueName(FOCAL_PLANE_RESOLUTION_UNIT_CENTIMETER, "Centimeter");
1665        }
1666    }
1667
1668    static class SubjectLocation extends TIFFTag {
1669
1670        public SubjectLocation() {
1671            super("SubjectLocation",
1672                  TAG_SUBJECT_LOCATION,
1673                  1 << TIFFTag.TIFF_SHORT);
1674        }
1675    }
1676
1677    static class ExposureIndex extends TIFFTag {
1678
1679        public ExposureIndex() {
1680            super("ExposureIndex",
1681                  TAG_EXPOSURE_INDEX,
1682                  1 << TIFFTag.TIFF_RATIONAL);
1683        }
1684    }
1685
1686    static class SensingMethod extends TIFFTag {
1687
1688        public SensingMethod() {
1689            super("SensingMethod",
1690                  TAG_SENSING_METHOD,
1691                  1 << TIFFTag.TIFF_SHORT);
1692            
1693            addValueName(SENSING_METHOD_NOT_DEFINED, "Not Defined");
1694            addValueName(SENSING_METHOD_ONE_CHIP_COLOR_AREA_SENSOR,
1695                         "One-chip color area sensor");
1696            addValueName(SENSING_METHOD_TWO_CHIP_COLOR_AREA_SENSOR,
1697                         "Two-chip color area sensor");
1698            addValueName(SENSING_METHOD_THREE_CHIP_COLOR_AREA_SENSOR,
1699                         "Three-chip color area sensor");
1700            addValueName(SENSING_METHOD_COLOR_SEQUENTIAL_AREA_SENSOR,
1701                         "Color sequential area sensor");
1702            addValueName(SENSING_METHOD_TRILINEAR_SENSOR, "Trilinear sensor");
1703            addValueName(SENSING_METHOD_COLOR_SEQUENTIAL_LINEAR_SENSOR,
1704                         "Color sequential linear sensor");
1705        }
1706    }
1707
1708    static class FileSource extends TIFFTag {
1709
1710        public FileSource() {
1711            super("FileSource",
1712                  TAG_FILE_SOURCE,
1713                  1 << TIFFTag.TIFF_UNDEFINED);
1714
1715            addValueName(FILE_SOURCE_DSC, "DSC");
1716        }
1717    }
1718
1719    static class SceneType extends TIFFTag {
1720
1721        public SceneType() {
1722            super("SceneType",
1723                  TAG_SCENE_TYPE,
1724                  1 << TIFFTag.TIFF_UNDEFINED);
1725
1726            addValueName(SCENE_TYPE_DSC, "A directly photographed image");
1727        }
1728    }
1729
1730    static class CFAPattern extends TIFFTag {
1731
1732        public CFAPattern() {
1733            super("CFAPattern",
1734                  TAG_CFA_PATTERN,
1735                  1 << TIFFTag.TIFF_UNDEFINED);
1736        }
1737    }
1738
1739    static class CustomRendered extends TIFFTag {
1740
1741        public CustomRendered() {
1742            super("CustomRendered",
1743                  TAG_CUSTOM_RENDERED,
1744                  1 << TIFFTag.TIFF_SHORT);
1745
1746            addValueName(CUSTOM_RENDERED_NORMAL, "Normal process");
1747            addValueName(CUSTOM_RENDERED_CUSTOM, "Custom process");
1748        }
1749    }
1750
1751    static class ExposureMode extends TIFFTag {
1752
1753        public ExposureMode() {
1754            super("ExposureMode",
1755                  TAG_EXPOSURE_MODE,
1756                  1 << TIFFTag.TIFF_SHORT);
1757
1758            addValueName(EXPOSURE_MODE_AUTO_EXPOSURE, "Auto exposure");
1759            addValueName(EXPOSURE_MODE_MANUAL_EXPOSURE, "Manual exposure");
1760            addValueName(EXPOSURE_MODE_AUTO_BRACKET, "Auto bracket");
1761        }
1762    }
1763
1764    static class WhiteBalance extends TIFFTag {
1765
1766        public WhiteBalance() {
1767            super("WhiteBalance",
1768                  TAG_WHITE_BALANCE,
1769                  1 << TIFFTag.TIFF_SHORT);
1770
1771            addValueName(WHITE_BALANCE_AUTO, "Auto white balance");
1772            addValueName(WHITE_BALANCE_MANUAL, "Manual white balance");
1773        }
1774    }
1775
1776    static class DigitalZoomRatio extends TIFFTag {
1777
1778        public DigitalZoomRatio() {
1779            super("DigitalZoomRatio",
1780                  TAG_DIGITAL_ZOOM_RATIO,
1781                  1 << TIFFTag.TIFF_RATIONAL);
1782        }
1783    }
1784
1785    static class FocalLengthIn35mmFilm extends TIFFTag {
1786
1787        public FocalLengthIn35mmFilm() {
1788            super("FocalLengthIn35mmFilm",
1789                  TAG_FOCAL_LENGTH_IN_35MM_FILM,
1790                  1 << TIFFTag.TIFF_SHORT);
1791        }
1792    }
1793
1794    static class SceneCaptureType extends TIFFTag {
1795
1796        public SceneCaptureType() {
1797            super("SceneCaptureType",
1798                  TAG_SCENE_CAPTURE_TYPE,
1799                  1 << TIFFTag.TIFF_SHORT);
1800
1801            addValueName(SCENE_CAPTURE_TYPE_STANDARD, "Standard");
1802            addValueName(SCENE_CAPTURE_TYPE_LANDSCAPE, "Landscape");
1803            addValueName(SCENE_CAPTURE_TYPE_PORTRAIT, "Portrait");
1804            addValueName(SCENE_CAPTURE_TYPE_NIGHT_SCENE, "Night scene");
1805        }
1806    }
1807
1808    static class GainControl extends TIFFTag {
1809
1810        public GainControl() {
1811            super("GainControl",
1812                  TAG_GAIN_CONTROL,
1813                  1 << TIFFTag.TIFF_SHORT);
1814
1815            addValueName(GAIN_CONTROL_NONE, "None");
1816            addValueName(GAIN_CONTROL_LOW_GAIN_UP, "Low gain up");
1817            addValueName(GAIN_CONTROL_HIGH_GAIN_UP, "High gain up");
1818            addValueName(GAIN_CONTROL_LOW_GAIN_DOWN, "Low gain down");
1819            addValueName(GAIN_CONTROL_HIGH_GAIN_DOWN, "High gain down");
1820        }
1821    }
1822
1823    static class Contrast extends TIFFTag {
1824
1825        public Contrast() {
1826            super("Contrast",
1827                  TAG_CONTRAST,
1828                  1 << TIFFTag.TIFF_SHORT);
1829
1830            addValueName(CONTRAST_NORMAL, "Normal");
1831            addValueName(CONTRAST_SOFT, "Soft");
1832            addValueName(CONTRAST_HARD, "Hard");
1833        }
1834    }
1835
1836    static class Saturation extends TIFFTag {
1837
1838        public Saturation() {
1839            super("Saturation",
1840                  TAG_SATURATION,
1841                  1 << TIFFTag.TIFF_SHORT);
1842
1843            addValueName(SATURATION_NORMAL, "Normal");
1844            addValueName(SATURATION_LOW, "Low saturation");
1845            addValueName(SATURATION_HIGH, "High saturation");
1846        }
1847    }
1848
1849    static class Sharpness extends TIFFTag {
1850
1851        public Sharpness() {
1852            super("Sharpness",
1853                  TAG_SHARPNESS,
1854                  1 << TIFFTag.TIFF_SHORT);
1855
1856            addValueName(SHARPNESS_NORMAL, "Normal");
1857            addValueName(SHARPNESS_SOFT, "Soft");
1858            addValueName(SHARPNESS_HARD, "Hard");
1859        }
1860    }
1861
1862    static class DeviceSettingDescription extends TIFFTag {
1863
1864        public DeviceSettingDescription() {
1865            super("DeviceSettingDescription",
1866                  TAG_DEVICE_SETTING_DESCRIPTION,
1867                  1 << TIFFTag.TIFF_UNDEFINED);
1868        }
1869    }
1870
1871    static class SubjectDistanceRange extends TIFFTag {
1872
1873        public SubjectDistanceRange() {
1874            super("SubjectDistanceRange",
1875                  TAG_SUBJECT_DISTANCE_RANGE,
1876                  1 << TIFFTag.TIFF_SHORT);
1877
1878            addValueName(SUBJECT_DISTANCE_RANGE_UNKNOWN, "unknown");
1879            addValueName(SUBJECT_DISTANCE_RANGE_MACRO, "Macro");
1880            addValueName(SUBJECT_DISTANCE_RANGE_CLOSE_VIEW, "Close view");
1881            addValueName(SUBJECT_DISTANCE_RANGE_DISTANT_VIEW, "Distant view");
1882        }
1883    }
1884
1885    static class ImageUniqueID extends TIFFTag {
1886
1887        public ImageUniqueID() {
1888            super("ImageUniqueID",
1889                  TAG_IMAGE_UNIQUE_ID,
1890                  1 << TIFFTag.TIFF_ASCII);
1891        }
1892    }
1893
1894    static class InteroperabilityIFD extends TIFFTag {
1895        public InteroperabilityIFD() {
1896            super("InteroperabilityIFD",
1897                  TAG_INTEROPERABILITY_IFD_POINTER,
1898                  1 << TIFFTag.TIFF_LONG,
1899                  EXIFInteroperabilityTagSet.getInstance());
1900        }
1901    }
1902
1903    private static List tags;
1904
1905    private static void initTags() {
1906        tags = new ArrayList(42);
1907
1908        tags.add(new EXIFTIFFTagSet.EXIFVersion());
1909        tags.add(new EXIFTIFFTagSet.FlashPixVersion());
1910        tags.add(new EXIFTIFFTagSet.ColorSpace());
1911        tags.add(new EXIFTIFFTagSet.ComponentsConfiguration());
1912        tags.add(new EXIFTIFFTagSet.CompressedBitsPerPixel());
1913        tags.add(new EXIFTIFFTagSet.PixelXDimension());
1914        tags.add(new EXIFTIFFTagSet.PixelYDimension());
1915        tags.add(new EXIFTIFFTagSet.MakerNote());
1916        tags.add(new EXIFTIFFTagSet.UserComment());
1917        tags.add(new EXIFTIFFTagSet.RelatedSoundFile());
1918        tags.add(new EXIFTIFFTagSet.DateTimeOriginal());
1919        tags.add(new EXIFTIFFTagSet.DateTimeDigitized());
1920        tags.add(new EXIFTIFFTagSet.SubSecTime());
1921        tags.add(new EXIFTIFFTagSet.SubSecTimeOriginal());
1922        tags.add(new EXIFTIFFTagSet.SubSecTimeDigitized());
1923        tags.add(new EXIFTIFFTagSet.ExposureTime());
1924        tags.add(new EXIFTIFFTagSet.FNumber());
1925        tags.add(new EXIFTIFFTagSet.ExposureProgram());
1926        tags.add(new EXIFTIFFTagSet.SpectralSensitivity());
1927        tags.add(new EXIFTIFFTagSet.ISOSpeedRatings());
1928        tags.add(new EXIFTIFFTagSet.OECF());
1929        tags.add(new EXIFTIFFTagSet.ShutterSpeedValue());
1930        tags.add(new EXIFTIFFTagSet.ApertureValue());
1931        tags.add(new EXIFTIFFTagSet.BrightnessValue());
1932        tags.add(new EXIFTIFFTagSet.ExposureBiasValue());
1933        tags.add(new EXIFTIFFTagSet.MaxApertureValue());
1934        tags.add(new EXIFTIFFTagSet.SubjectDistance());
1935        tags.add(new EXIFTIFFTagSet.MeteringMode());
1936        tags.add(new EXIFTIFFTagSet.LightSource());
1937        tags.add(new EXIFTIFFTagSet.Flash());
1938        tags.add(new EXIFTIFFTagSet.FocalLength());
1939        tags.add(new EXIFTIFFTagSet.SubjectArea());
1940        tags.add(new EXIFTIFFTagSet.FlashEnergy());
1941        tags.add(new EXIFTIFFTagSet.SpatialFrequencyResponse());
1942        tags.add(new EXIFTIFFTagSet.FocalPlaneXResolution());
1943        tags.add(new EXIFTIFFTagSet.FocalPlaneYResolution());
1944        tags.add(new EXIFTIFFTagSet.FocalPlaneResolutionUnit());
1945        tags.add(new EXIFTIFFTagSet.SubjectLocation());
1946        tags.add(new EXIFTIFFTagSet.ExposureIndex());
1947        tags.add(new EXIFTIFFTagSet.SensingMethod());
1948        tags.add(new EXIFTIFFTagSet.FileSource());
1949        tags.add(new EXIFTIFFTagSet.SceneType());
1950        tags.add(new EXIFTIFFTagSet.CFAPattern());
1951        tags.add(new EXIFTIFFTagSet.CustomRendered());
1952        tags.add(new EXIFTIFFTagSet.ExposureMode());
1953        tags.add(new EXIFTIFFTagSet.WhiteBalance());
1954        tags.add(new EXIFTIFFTagSet.DigitalZoomRatio());
1955        tags.add(new EXIFTIFFTagSet.FocalLengthIn35mmFilm());
1956        tags.add(new EXIFTIFFTagSet.SceneCaptureType());
1957        tags.add(new EXIFTIFFTagSet.GainControl());
1958        tags.add(new EXIFTIFFTagSet.Contrast());
1959        tags.add(new EXIFTIFFTagSet.Saturation());
1960        tags.add(new EXIFTIFFTagSet.Sharpness());
1961        tags.add(new EXIFTIFFTagSet.DeviceSettingDescription());
1962        tags.add(new EXIFTIFFTagSet.SubjectDistanceRange());
1963        tags.add(new EXIFTIFFTagSet.ImageUniqueID());
1964        tags.add(new EXIFTIFFTagSet.InteroperabilityIFD());
1965    }
1966
1967    private EXIFTIFFTagSet() {
1968        super(tags);
1969    }
1970
1971    /**
1972     * Returns a shared instance of an <code>EXIFTIFFTagSet</code>.
1973     *
1974     * @return an <code>EXIFTIFFTagSet</code> instance.
1975     */
1976    public synchronized static EXIFTIFFTagSet getInstance() {
1977        if (theInstance == null) {
1978            initTags();
1979            theInstance = new EXIFTIFFTagSet();
1980            tags = null;
1981        }
1982        return theInstance;
1983    }
1984}