blob: 174eb7ae028614c79bdd1060a5515f360d6ae240 [file] [log] [blame]
/*
* Copyright (c) 2005, 2016, 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.tiff;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
* A class representing the tags found in an Exif GPS Info IFD.
*
* <p> The definitions of the data types referenced by the field
* definitions may be found in the {@link TIFFTag TIFFTag} class.
*
* @since 9
* @see ExifTIFFTagSet
*/
public final class ExifGPSTagSet extends TIFFTagSet {
private static ExifGPSTagSet theInstance = null;
/**
* A tag indicating the GPS tag version (type BYTE, count = 4).
*
* @see #GPS_VERSION_2_2
*/
public static final int TAG_GPS_VERSION_ID = 0;
/**
* A value to be used with the "GPSVersionID" tag to indicate GPS version
* 2.2. The value equals the US-ASCII encoding of the byte array
* {@code {'2', '2', '0', '0'}}.
*
* @see #TAG_GPS_VERSION_ID
*/
public static final String GPS_VERSION_2_2 =
new String(new byte[] { '2', '2', '0', '0' },
StandardCharsets.US_ASCII);
/**
* A tag indicating the North or South latitude (type ASCII, count = 2).
*
* @see #LATITUDE_REF_NORTH
* @see #LATITUDE_REF_SOUTH
*/
public static final int TAG_GPS_LATITUDE_REF = 1;
/**
* A tag indicating the Latitude (type RATIONAL, count = 3).
*/
public static final int TAG_GPS_LATITUDE = 2;
/**
* A tag indicating the East or West Longitude (type ASCII, count = 2).
*
* @see #LONGITUDE_REF_EAST
* @see #LONGITUDE_REF_WEST
*/
public static final int TAG_GPS_LONGITUDE_REF = 3;
/**
* A tag indicating the Longitude (type RATIONAL, count = 3).
*/
public static final int TAG_GPS_LONGITUDE = 4;
/**
* A tag indicating the Altitude reference (type BYTE, count = 1);
*
* @see #ALTITUDE_REF_SEA_LEVEL
* @see #ALTITUDE_REF_SEA_LEVEL_REFERENCE
*/
public static final int TAG_GPS_ALTITUDE_REF = 5;
/**
* A tag indicating the Altitude (type RATIONAL, count = 1).
*/
public static final int TAG_GPS_ALTITUDE = 6;
/**
* A tag indicating the GPS time (atomic clock) (type RATIONAL, count = 3).
*/
public static final int TAG_GPS_TIME_STAMP = 7;
/**
* A tag indicating the GPS satellites used for measurement (type ASCII).
*/
public static final int TAG_GPS_SATELLITES = 8;
/**
* A tag indicating the GPS receiver status (type ASCII, count = 2).
*
* @see #STATUS_MEASUREMENT_IN_PROGRESS
* @see #STATUS_MEASUREMENT_INTEROPERABILITY
*/
public static final int TAG_GPS_STATUS = 9;
/**
* A tag indicating the GPS measurement mode (type ASCII, count = 2).
*
* @see #MEASURE_MODE_2D
* @see #MEASURE_MODE_3D
*/
public static final int TAG_GPS_MEASURE_MODE = 10;
/**
* A tag indicating the Measurement precision (type RATIONAL, count = 1).
*/
public static final int TAG_GPS_DOP = 11;
/**
* A tag indicating the Speed unit (type ASCII, count = 2).
*
* @see #SPEED_REF_KILOMETERS_PER_HOUR
* @see #SPEED_REF_MILES_PER_HOUR
* @see #SPEED_REF_KNOTS
*/
public static final int TAG_GPS_SPEED_REF = 12;
/**
* A tag indicating the Speed of GPS receiver (type RATIONAL, count = 1).
*/
public static final int TAG_GPS_SPEED = 13;
/**
* A tag indicating the Reference for direction of movement (type ASCII,
* count = 2).
*
* @see #DIRECTION_REF_TRUE
* @see #DIRECTION_REF_MAGNETIC
*/
public static final int TAG_GPS_TRACK_REF = 14;
/**
* A tag indicating the Direction of movement (type RATIONAL, count = 1).
*/
public static final int TAG_GPS_TRACK = 15;
/**
* A tag indicating the Reference for direction of image (type ASCII,
* count = 2).
*
* @see #DIRECTION_REF_TRUE
* @see #DIRECTION_REF_MAGNETIC
*/
public static final int TAG_GPS_IMG_DIRECTION_REF = 16;
/**
* A tag indicating the Direction of image (type RATIONAL, count = 1).
*/
public static final int TAG_GPS_IMG_DIRECTION = 17;
/**
* A tag indicating the Geodetic survey data used (type ASCII).
*/
public static final int TAG_GPS_MAP_DATUM = 18;
/**
* A tag indicating the Reference for latitude of destination (type
* ASCII, count = 2).
*
* @see #LATITUDE_REF_NORTH
* @see #LATITUDE_REF_SOUTH
*/
public static final int TAG_GPS_DEST_LATITUDE_REF = 19;
/**
* A tag indicating the Latitude of destination (type RATIONAL, count = 3).
*/
public static final int TAG_GPS_DEST_LATITUDE = 20;
/**
* A tag indicating the Reference for longitude of destination (type
* ASCII, count = 2).
*
* @see #LONGITUDE_REF_EAST
* @see #LONGITUDE_REF_WEST
*/
public static final int TAG_GPS_DEST_LONGITUDE_REF = 21;
/**
* A tag indicating the Longitude of destination (type RATIONAL,
* count = 3).
*/
public static final int TAG_GPS_DEST_LONGITUDE = 22;
/**
* A tag indicating the Reference for bearing of destination (type ASCII,
* count = 2).
*
* @see #DIRECTION_REF_TRUE
* @see #DIRECTION_REF_MAGNETIC
*/
public static final int TAG_GPS_DEST_BEARING_REF = 23;
/**
* A tag indicating the Bearing of destination (type RATIONAL, count = 1).
*/
public static final int TAG_GPS_DEST_BEARING = 24;
/**
* A tag indicating the Reference for distance to destination (type ASCII,
* count = 2).
*
* @see #DEST_DISTANCE_REF_KILOMETERS
* @see #DEST_DISTANCE_REF_MILES
* @see #DEST_DISTANCE_REF_KNOTS
*/
public static final int TAG_GPS_DEST_DISTANCE_REF = 25;
/**
* A tag indicating the Distance to destination (type RATIONAL, count = 1).
*/
public static final int TAG_GPS_DEST_DISTANCE = 26;
/**
* A tag indicating the Name of GPS processing method (type UNDEFINED).
*/
public static final int TAG_GPS_PROCESSING_METHOD = 27;
/**
* A tag indicating the Name of GPS area (type UNDEFINED).
*/
public static final int TAG_GPS_AREA_INFORMATION = 28;
/**
* A tag indicating the GPS date (type ASCII, count 11).
*/
public static final int TAG_GPS_DATE_STAMP = 29;
/**
* A tag indicating the GPS differential correction (type SHORT,
* count = 1).
*
* @see #DIFFERENTIAL_CORRECTION_NONE
* @see #DIFFERENTIAL_CORRECTION_APPLIED
*/
public static final int TAG_GPS_DIFFERENTIAL = 30;
/**
* A value to be used with the "GPSLatitudeRef" and
* "GPSDestLatitudeRef" tags.
*
* @see #TAG_GPS_LATITUDE_REF
* @see #TAG_GPS_DEST_LATITUDE_REF
*/
public static final String LATITUDE_REF_NORTH = "N";
/**
* A value to be used with the "GPSLatitudeRef" and
* "GPSDestLatitudeRef" tags.
*
* @see #TAG_GPS_LATITUDE_REF
* @see #TAG_GPS_DEST_LATITUDE_REF
*/
public static final String LATITUDE_REF_SOUTH = "S";
/**
* A value to be used with the "GPSLongitudeRef" and
* "GPSDestLongitudeRef" tags.
*
* @see #TAG_GPS_LONGITUDE_REF
* @see #TAG_GPS_DEST_LONGITUDE_REF
*/
public static final String LONGITUDE_REF_EAST = "E";
/**
* A value to be used with the "GPSLongitudeRef" and
* "GPSDestLongitudeRef" tags.
*
* @see #TAG_GPS_LONGITUDE_REF
* @see #TAG_GPS_DEST_LONGITUDE_REF
*/
public static final String LONGITUDE_REF_WEST = "W";
/**
* A value to be used with the "GPSAltitudeRef" tag.
*
* @see #TAG_GPS_ALTITUDE_REF
*/
public static final int ALTITUDE_REF_SEA_LEVEL = 0;
/**
* A value to be used with the "GPSAltitudeRef" tag.
*
* @see #TAG_GPS_ALTITUDE_REF
*/
public static final int ALTITUDE_REF_SEA_LEVEL_REFERENCE = 1;
/**
* A value to be used with the "GPSStatus" tag.
*
* @see #TAG_GPS_STATUS
*/
public static final String STATUS_MEASUREMENT_IN_PROGRESS = "A";
/**
* A value to be used with the "GPSStatus" tag.
*
* @see #TAG_GPS_STATUS
*/
public static final String STATUS_MEASUREMENT_INTEROPERABILITY = "V";
/**
* A value to be used with the "GPSMeasureMode" tag.
*
* @see #TAG_GPS_MEASURE_MODE
*/
public static final String MEASURE_MODE_2D = "2";
/**
* A value to be used with the "GPSMeasureMode" tag.
*
* @see #TAG_GPS_MEASURE_MODE
*/
public static final String MEASURE_MODE_3D = "3";
/**
* A value to be used with the "GPSSpeedRef" tag.
*
* @see #TAG_GPS_SPEED_REF
*/
public static final String SPEED_REF_KILOMETERS_PER_HOUR = "K";
/**
* A value to be used with the "GPSSpeedRef" tag.
*
* @see #TAG_GPS_SPEED_REF
*/
public static final String SPEED_REF_MILES_PER_HOUR = "M";
/**
* A value to be used with the "GPSSpeedRef" tag.
*
* @see #TAG_GPS_SPEED_REF
*/
public static final String SPEED_REF_KNOTS = "N";
/**
* A value to be used with the "GPSTrackRef", "GPSImgDirectionRef",
* and "GPSDestBearingRef" tags.
*
* @see #TAG_GPS_TRACK_REF
* @see #TAG_GPS_IMG_DIRECTION_REF
* @see #TAG_GPS_DEST_BEARING_REF
*/
public static final String DIRECTION_REF_TRUE = "T";
/**
* A value to be used with the "GPSTrackRef", "GPSImgDirectionRef",
* and "GPSDestBearingRef" tags.
*
* @see #TAG_GPS_TRACK_REF
* @see #TAG_GPS_IMG_DIRECTION_REF
* @see #TAG_GPS_DEST_BEARING_REF
*/
public static final String DIRECTION_REF_MAGNETIC = "M";
/**
* A value to be used with the "GPSDestDistanceRef" tag.
*
* @see #TAG_GPS_DEST_DISTANCE_REF
*/
public static final String DEST_DISTANCE_REF_KILOMETERS = "K";
/**
* A value to be used with the "GPSDestDistanceRef" tag.
*
* @see #TAG_GPS_DEST_DISTANCE_REF
*/
public static final String DEST_DISTANCE_REF_MILES = "M";
/**
* A value to be used with the "GPSDestDistanceRef" tag.
*
* @see #TAG_GPS_DEST_DISTANCE_REF
*/
public static final String DEST_DISTANCE_REF_KNOTS = "N";
/**
* A value to be used with the "GPSDifferential" tag.
*
* @see #TAG_GPS_DIFFERENTIAL
*/
public static final int DIFFERENTIAL_CORRECTION_NONE = 0;
/**
* A value to be used with the "GPSDifferential" tag.
*
* @see #TAG_GPS_DIFFERENTIAL
*/
public static final int DIFFERENTIAL_CORRECTION_APPLIED = 1;
static class GPSVersionID extends TIFFTag {
public GPSVersionID() {
super("GPSVersionID",
TAG_GPS_VERSION_ID,
1 << TIFFTag.TIFF_BYTE);
}
}
static class GPSLatitudeRef extends TIFFTag {
public GPSLatitudeRef() {
super("GPSLatitudeRef",
TAG_GPS_LATITUDE_REF,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSLatitude extends TIFFTag {
public GPSLatitude() {
super("GPSLatitude",
TAG_GPS_LATITUDE,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSLongitudeRef extends TIFFTag {
public GPSLongitudeRef() {
super("GPSLongitudeRef",
TAG_GPS_LONGITUDE_REF,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSLongitude extends TIFFTag {
public GPSLongitude() {
super("GPSLongitude",
TAG_GPS_LONGITUDE,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSAltitudeRef extends TIFFTag {
public GPSAltitudeRef() {
super("GPSAltitudeRef",
TAG_GPS_ALTITUDE_REF,
1 << TIFFTag.TIFF_BYTE);
addValueName(ALTITUDE_REF_SEA_LEVEL, "Sea level");
addValueName(ALTITUDE_REF_SEA_LEVEL_REFERENCE,
"Sea level reference (negative value)");
}
}
static class GPSAltitude extends TIFFTag {
public GPSAltitude() {
super("GPSAltitude",
TAG_GPS_ALTITUDE,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSTimeStamp extends TIFFTag {
public GPSTimeStamp() {
super("GPSTimeStamp",
TAG_GPS_TIME_STAMP,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSSatellites extends TIFFTag {
public GPSSatellites() {
super("GPSSatellites",
TAG_GPS_SATELLITES,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSStatus extends TIFFTag {
public GPSStatus() {
super("GPSStatus",
TAG_GPS_STATUS,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSMeasureMode extends TIFFTag {
public GPSMeasureMode() {
super("GPSMeasureMode",
TAG_GPS_MEASURE_MODE,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSDOP extends TIFFTag {
public GPSDOP() {
super("GPSDOP",
TAG_GPS_DOP,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSSpeedRef extends TIFFTag {
public GPSSpeedRef() {
super("GPSSpeedRef",
TAG_GPS_SPEED_REF,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSSpeed extends TIFFTag {
public GPSSpeed() {
super("GPSSpeed",
TAG_GPS_SPEED,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSTrackRef extends TIFFTag {
public GPSTrackRef() {
super("GPSTrackRef",
TAG_GPS_TRACK_REF,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSTrack extends TIFFTag {
public GPSTrack() {
super("GPSTrack",
TAG_GPS_TRACK,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSImgDirectionRef extends TIFFTag {
public GPSImgDirectionRef() {
super("GPSImgDirectionRef",
TAG_GPS_IMG_DIRECTION_REF,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSImgDirection extends TIFFTag {
public GPSImgDirection() {
super("GPSImgDirection",
TAG_GPS_IMG_DIRECTION,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSMapDatum extends TIFFTag {
public GPSMapDatum() {
super("GPSMapDatum",
TAG_GPS_MAP_DATUM,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSDestLatitudeRef extends TIFFTag {
public GPSDestLatitudeRef() {
super("GPSDestLatitudeRef",
TAG_GPS_DEST_LATITUDE_REF,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSDestLatitude extends TIFFTag {
public GPSDestLatitude() {
super("GPSDestLatitude",
TAG_GPS_DEST_LATITUDE,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSDestLongitudeRef extends TIFFTag {
public GPSDestLongitudeRef() {
super("GPSDestLongitudeRef",
TAG_GPS_DEST_LONGITUDE_REF,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSDestLongitude extends TIFFTag {
public GPSDestLongitude() {
super("GPSDestLongitude",
TAG_GPS_DEST_LONGITUDE,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSDestBearingRef extends TIFFTag {
public GPSDestBearingRef() {
super("GPSDestBearingRef",
TAG_GPS_DEST_BEARING_REF,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSDestBearing extends TIFFTag {
public GPSDestBearing() {
super("GPSDestBearing",
TAG_GPS_DEST_BEARING,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSDestDistanceRef extends TIFFTag {
public GPSDestDistanceRef() {
super("GPSDestDistanceRef",
TAG_GPS_DEST_DISTANCE_REF,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSDestDistance extends TIFFTag {
public GPSDestDistance() {
super("GPSDestDistance",
TAG_GPS_DEST_DISTANCE,
1 << TIFFTag.TIFF_RATIONAL);
}
}
static class GPSProcessingMethod extends TIFFTag {
public GPSProcessingMethod() {
super("GPSProcessingMethod",
TAG_GPS_PROCESSING_METHOD,
1 << TIFFTag.TIFF_UNDEFINED);
}
}
static class GPSAreaInformation extends TIFFTag {
public GPSAreaInformation() {
super("GPSAreaInformation",
TAG_GPS_AREA_INFORMATION,
1 << TIFFTag.TIFF_UNDEFINED);
}
}
static class GPSDateStamp extends TIFFTag {
public GPSDateStamp() {
super("GPSDateStamp",
TAG_GPS_DATE_STAMP,
1 << TIFFTag.TIFF_ASCII);
}
}
static class GPSDifferential extends TIFFTag {
public GPSDifferential() {
super("GPSDifferential",
TAG_GPS_DIFFERENTIAL,
1 << TIFFTag.TIFF_SHORT);
addValueName(DIFFERENTIAL_CORRECTION_NONE,
"Measurement without differential correction");
addValueName(DIFFERENTIAL_CORRECTION_APPLIED,
"Differential correction applied");
}
}
private static List<TIFFTag> initTags() {
ArrayList<TIFFTag> tags = new ArrayList<TIFFTag>(31);
tags.add(new GPSVersionID());
tags.add(new GPSLatitudeRef());
tags.add(new GPSLatitude());
tags.add(new GPSLongitudeRef());
tags.add(new GPSLongitude());
tags.add(new GPSAltitudeRef());
tags.add(new GPSAltitude());
tags.add(new GPSTimeStamp());
tags.add(new GPSSatellites());
tags.add(new GPSStatus());
tags.add(new GPSMeasureMode());
tags.add(new GPSDOP());
tags.add(new GPSSpeedRef());
tags.add(new GPSSpeed());
tags.add(new GPSTrackRef());
tags.add(new GPSTrack());
tags.add(new GPSImgDirectionRef());
tags.add(new GPSImgDirection());
tags.add(new GPSMapDatum());
tags.add(new GPSDestLatitudeRef());
tags.add(new GPSDestLatitude());
tags.add(new GPSDestLongitudeRef());
tags.add(new GPSDestLongitude());
tags.add(new GPSDestBearingRef());
tags.add(new GPSDestBearing());
tags.add(new GPSDestDistanceRef());
tags.add(new GPSDestDistance());
tags.add(new GPSProcessingMethod());
tags.add(new GPSAreaInformation());
tags.add(new GPSDateStamp());
tags.add(new GPSDifferential());
return tags;
}
private ExifGPSTagSet() {
super(initTags());
}
/**
* Returns a shared instance of an {@code ExifGPSTagSet}.
*
* @return an {@code ExifGPSTagSet} instance.
*/
public synchronized static ExifGPSTagSet getInstance() {
if (theInstance == null) {
theInstance = new ExifGPSTagSet();
}
return theInstance;
}
}