File: ExifGateway.java

package info (click to toggle)
gpsprune 17-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 3,984 kB
  • ctags: 5,218
  • sloc: java: 39,403; sh: 25; makefile: 17; python: 15
file content (108 lines) | stat: -rw-r--r-- 3,189 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package tim.prune.jpeg;

import java.io.File;
import javax.swing.JOptionPane;
import tim.prune.I18nManager;

/**
 * Skeleton gateway to the Exif functions.
 * This is required by Debian to divert Exif handling
 * to the external libmetadata-extractor-java library
 * instead of the included modified routines.
 *
 * Switching between internal and external libraries is
 * handled by the ExifLibrarySwitch
 */
public abstract class ExifGateway
{
	/** Library object to call */
	private static ExifLibrary _exifLibrary = null;
	/** Flag to set whether failure warning has already been shown */
	private static boolean _exifFailWarned = false;

	/** Static block to initialise library */
	static
	{
		String libraryClass = ExifLibrarySwitch.USE_INTERNAL_LIBRARY?"InternalExifLibrary":"ExternalExifLibrary";
		try
		{
			_exifLibrary = (ExifLibrary) Class.forName("tim.prune.jpeg." + libraryClass).newInstance();
		}
		catch (Throwable nolib) {_exifLibrary = null;}
	}


	/**
	 * Get the Jpeg data from the given file
	 * @param inFile file to read
	 * @return jpeg data, or null if none found
	 */
	public static JpegData getJpegData(File inFile)
	{
		try
		{
			// Call library (if found)
			if (_exifLibrary != null) {
				JpegData data = _exifLibrary.getJpegData(inFile);
				return data;
			}
		}
		catch (LinkageError nolib) {
			System.err.println("Link: " + nolib.getMessage());
			nolib.printStackTrace();
		}
		// Not successful - warn if necessary
		if (!_exifFailWarned)
		{
			JOptionPane.showMessageDialog(null, I18nManager.getText("error.jpegload.exifreadfailed"),
				I18nManager.getText("error.jpegload.dialogtitle"), JOptionPane.WARNING_MESSAGE);
			_exifFailWarned = true;
		}
		return null;
	}

	/**
	 * @return key to use to describe library, matching key for about dialog
	 */
	public static String getDescriptionKey()
	{
		String key = ExifLibrarySwitch.USE_INTERNAL_LIBRARY?"internal":"external";
		if (_exifLibrary == null || !_exifLibrary.looksOK()) {key = key + ".failed";}
		return key;
	}


	/**
	 * @param inNumerator numerator from Rational
	 * @param inDenominator denominator from Rational
	 * @return the value of the specified number as a positive <code>double</code>.
	 * Prevents interpretation of 32 bit numbers as negative, and forces a positive answer
	 */
	public static final double convertToPositiveValue(int inNumerator, int inDenominator)
	{
		if (inDenominator == 0) return 0.0;
		double numeratorDbl = inNumerator;
		double denomDbl = inDenominator;
		if (inNumerator >= 0)
			return numeratorDbl / denomDbl;
		final double correction = Math.pow(2.0, 32);
		numeratorDbl += correction;
		if (inDenominator < 0) denomDbl += correction;
		return numeratorDbl / denomDbl;
	}


	/**
	 * @param inNumerator numerator from Rational
	 * @param inDenominator denominator from Rational
	 * @return the value of the specified number as a positive <code>double</code>.
	 * Forces a positive answer
	 */
	public static final double convertToPositiveValue(long inNumerator, long inDenominator)
	{
		if (inDenominator == 0L) return 0.0;
		final double numeratorDbl = inNumerator;
		final double denomDbl = inDenominator;
		return numeratorDbl / denomDbl;
	}
}