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();