/* * 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 = "2200"; /** * 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; } }