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;
}
}
|