Author: lehmi
Date: Sat Jun 27 13:39:53 2020
New Revision: 1879271

URL: http://svn.apache.org/viewvc?rev=1879271&view=rev
Log:
PDFBOX-4883: optimize internal representation of float values based on a 
proposal by Alfred Faltiska, remove method doubleValue 

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSInteger.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSInteger.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSNumber.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java?rev=1879271&r1=1879270&r2=1879271&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java 
(original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java Sat 
Jun 27 13:39:53 2020
@@ -25,11 +25,11 @@ import java.nio.charset.StandardCharsets
  * This class represents a floating point number in a PDF document.
  *
  * @author Ben Litchfield
- * 
+ *
  */
 public class COSFloat extends COSNumber
 {
-    private BigDecimal value;
+    private Float value;
     private String valueAsString;
 
     /**
@@ -39,10 +39,7 @@ public class COSFloat extends COSNumber
      */
     public COSFloat( float aFloat )
     {
-        // use a BigDecimal as intermediate state to avoid 
-        // a floating point string representation of the float value
-        value = new BigDecimal(String.valueOf(aFloat));
-        valueAsString = removeNullDigits(value.toPlainString());
+        value = aFloat;
     }
 
     /**
@@ -56,9 +53,8 @@ public class COSFloat extends COSNumber
     {
         try
         {
-            valueAsString = aFloat; 
-            value = new BigDecimal( valueAsString );
-            checkMinMaxValues();
+            valueAsString = aFloat;
+            value = Float.parseFloat(aFloat);
         }
         catch( NumberFormatException e )
         {
@@ -78,37 +74,41 @@ public class COSFloat extends COSNumber
             {
                 throw new IOException("Error expected floating point number 
actual='" + aFloat + "'", e);
             }
+
             try
             {
-                value = new BigDecimal(valueAsString);
-                checkMinMaxValues();
+                value = Float.parseFloat(valueAsString);
             }
             catch (NumberFormatException e2)
             {
                 throw new IOException("Error expected floating point number 
actual='" + aFloat + "'", e2);
             }
         }
+        checkMinMaxValues();
     }
-    
+
+
     private void checkMinMaxValues()
     {
-        int signum = value.signum();
-        // don't check 0 values
-        if (signum != 0)
-        {
-            double doubleValue = value.doubleValue();
-            // check for huge values
-            if (Math.abs(doubleValue) > Float.MAX_VALUE)
-            {
-                value = BigDecimal.valueOf(signum * Float.MAX_VALUE);
-                valueAsString = value.toPlainString();
-            }
-            // check for very small values
-            else if (Math.abs(doubleValue) < Float.MIN_NORMAL)
-            {
-                value = BigDecimal.valueOf(signum * Float.MIN_NORMAL);
-                valueAsString = value.toPlainString();
-            }
+        if (value == Float.POSITIVE_INFINITY)
+        {
+            value = Float.MAX_VALUE;
+        }
+        else if (value == Float.NEGATIVE_INFINITY)
+        {
+            value = -Float.MAX_VALUE;
+        }
+        else if (value > 0 && value < Float.MIN_NORMAL)
+        {
+            value = Float.MIN_NORMAL;
+        }
+        else if (value < 0 && value > -Float.MIN_NORMAL)
+        {
+            value = -Float.MIN_NORMAL;
+        }
+        else if (value == 0 && valueAsString.matches(".*[1-9].*"))
+        {
+            value = valueAsString.startsWith("-") ? -Float.MIN_NORMAL : 
Float.MIN_NORMAL;
         }
     }
     
@@ -134,18 +134,7 @@ public class COSFloat extends COSNumber
     @Override
     public float floatValue()
     {
-        return value.floatValue();
-    }
-
-    /**
-     * The value of the double object that this one wraps.
-     *
-     * @return The double of this object.
-     */
-    @Override
-    public double doubleValue()
-    {
-        return value.doubleValue();
+        return value;
     }
 
     /**
@@ -176,8 +165,8 @@ public class COSFloat extends COSNumber
     @Override
     public boolean equals( Object o )
     {
-        return o instanceof COSFloat && 
-                Float.floatToIntBits(((COSFloat)o).value.floatValue()) == 
Float.floatToIntBits(value.floatValue());
+        return o instanceof COSFloat &&
+                Float.floatToIntBits(((COSFloat)o).value) == 
Float.floatToIntBits(value);
     }
 
     /**
@@ -195,7 +184,20 @@ public class COSFloat extends COSNumber
     @Override
     public String toString()
     {
-        return "COSFloat{" + valueAsString + "}";
+        return "COSFloat{" + formatString() + "}";
+    }
+
+    /**
+     * Builds, if needed, and returns the a string representation of the 
current value.
+     * @return current value as string.
+     */
+    private String formatString()
+    {
+        if (valueAsString == null)
+        {
+            valueAsString = removeNullDigits(new 
BigDecimal(String.valueOf(value)).toPlainString());
+        }
+        return valueAsString;
     }
 
     /**
@@ -219,6 +221,6 @@ public class COSFloat extends COSNumber
      */
     public void writePDF( OutputStream output ) throws IOException
     {
-        output.write(valueAsString.getBytes(StandardCharsets.ISO_8859_1));
+        output.write(formatString().getBytes(StandardCharsets.ISO_8859_1));
     }
 }

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSInteger.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSInteger.java?rev=1879271&r1=1879270&r2=1879271&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSInteger.java 
(original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSInteger.java Sat 
Jun 27 13:39:53 2020
@@ -141,17 +141,6 @@ public final class COSInteger extends CO
     }
 
     /**
-     * polymorphic access to value as float.
-     *
-     * @return The double value of this object.
-     */
-    @Override
-    public double doubleValue()
-    {
-        return value;
-    }
-
-    /**
      * Polymorphic access to value as int
      * This will get the integer value of this object.
      *

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java?rev=1879271&r1=1879270&r2=1879271&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java 
(original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java Sat 
Jun 27 13:39:53 2020
@@ -33,13 +33,6 @@ public abstract class COSNumber extends
     public abstract float floatValue();
 
     /**
-     * This will get the double value of this number.
-     *
-     * @return The double value of this number.
-     */
-    public abstract double doubleValue();
-
-    /**
      * This will get the integer value of this number.
      *
      * @return The integer value of this number.

Modified: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java?rev=1879271&r1=1879270&r2=1879271&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java 
(original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java 
Sat Jun 27 13:39:53 2020
@@ -89,7 +89,7 @@ public class TestCOSFloat extends TestCO
                 }
                 catch (AssertionError a)
                 {
-                    fail("num = " + num + ", seed = " + seed);
+                    fail("num = " + num + ", seed = " + seed + ", message: " + 
a.getMessage());
                 }
             }
         }
@@ -173,26 +173,6 @@ public class TestCOSFloat extends TestCO
         new FloatValueTester().runTests();
     }
 
-    class DoubleValueTester extends BaseTester
-    {
-
-        @Override
-        void runTest(float num)
-        {
-            COSFloat testFloat = new COSFloat(num);
-            // compare the string representation instead of the numeric values 
-            // as the cast from float to double adds some more fraction digits
-            assertEquals(Float.toString(num), 
Double.toString(testFloat.doubleValue()));
-        }
-
-    }
-
-    @Override
-    public void testDoubleValue()
-    {
-        new DoubleValueTester().runTests();
-    }
-
     class IntValueTester extends BaseTester
     {
 
@@ -427,6 +407,15 @@ public class TestCOSFloat extends TestCO
         }
     }
 
+    public void testStubOperatorMinMaxValues()
+    {
+        float largeValue = 32768f;
+        float largeNegativeValue = -32768f;
+
+        assertEquals(largeValue, new COSFloat(largeValue).floatValue());
+        assertEquals(largeNegativeValue, new 
COSFloat(largeNegativeValue).floatValue());
+    }
+
     private String floatToString(float value)
     {
         // use a BigDecimal as intermediate state to avoid 

Modified: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSInteger.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSInteger.java?rev=1879271&r1=1879270&r2=1879271&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSInteger.java 
(original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSInteger.java 
Sat Jun 27 13:39:53 2020
@@ -104,15 +104,6 @@ public class TestCOSInteger extends Test
     }
 
     @Override
-    public void testDoubleValue()
-    {
-        for (int i = -1000; i < 3000; i += 200)
-        {
-            assertEquals((double) i, COSInteger.get(i).doubleValue());
-        }
-    }
-
-    @Override
     public void testIntValue()
     {
         for (int i = -1000; i < 3000; i += 200)

Modified: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSNumber.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSNumber.java?rev=1879271&r1=1879270&r2=1879271&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSNumber.java 
(original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSNumber.java 
Sat Jun 27 13:39:53 2020
@@ -30,11 +30,6 @@ public abstract class TestCOSNumber exte
     public abstract void testFloatValue();
 
     /**
-     * Test doubleValue() - test that the correct double value is returned.
-     */
-    public abstract void testDoubleValue();
-
-    /**
      * Test intValue() - test that the correct int value is returned.
      */
     public abstract void testIntValue();


Reply via email to