]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/jpeg/ExifGateway.java
Version 15.2, November 2013
[GpsPrune.git] / tim / prune / jpeg / ExifGateway.java
index 5420ea6762fe9d0c534e2a7aa72a8f7dc4c43561..c11ba2e69ec7c3f1d7ead5bd7a549ec3ea6ce318 100644 (file)
@@ -1,9 +1,7 @@
 package tim.prune.jpeg;
 
 import java.io.File;
-
 import javax.swing.JOptionPane;
-
 import tim.prune.I18nManager;
 
 /**
@@ -12,19 +10,11 @@ import tim.prune.I18nManager;
  * to the external libmetadata-extractor-java library
  * instead of the included modified routines.
  *
- * To use the internal routines, set the USE_INTERNAL_LIBRARY flag to true
- * and include the internal classes in the compiled jar.
- * To use the external library, set the USE_INTERNAL_LIBRARY flag to false
- * and do not export the internal classes.
+ * Switching between internal and external libraries is
+ * handled by the ExifLibrarySwitch
  */
 public abstract class ExifGateway
 {
-       // *********************************************************
-       // TODO: Check this exif library flag before releasing!
-       /** Flag to specify internal or external library */
-       private static final boolean USE_INTERNAL_LIBRARY = true;
-       // *********************************************************
-
        /** Library object to call */
        private static ExifLibrary _exifLibrary = null;
        /** Flag to set whether failure warning has already been shown */
@@ -33,7 +23,7 @@ public abstract class ExifGateway
        /** Static block to initialise library */
        static
        {
-               String libraryClass = USE_INTERNAL_LIBRARY?"InternalExifLibrary":"ExternalExifLibrary";
+               String libraryClass = ExifLibrarySwitch.USE_INTERNAL_LIBRARY?"InternalExifLibrary":"ExternalExifLibrary";
                try
                {
                        _exifLibrary = (ExifLibrary) Class.forName("tim.prune.jpeg." + libraryClass).newInstance();
@@ -57,7 +47,10 @@ public abstract class ExifGateway
                                return data;
                        }
                }
-               catch (LinkageError nolib) {}
+               catch (LinkageError nolib) {
+                       System.err.println("Link: " + nolib.getMessage());
+                       nolib.printStackTrace();
+               }
                // Not successful - warn if necessary
                if (!_exifFailWarned)
                {
@@ -73,8 +66,43 @@ public abstract class ExifGateway
         */
        public static String getDescriptionKey()
        {
-               String key = USE_INTERNAL_LIBRARY?"internal":"external";
+               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;
+       }
 }