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 double. * 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 double. * 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; } }