You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2016/04/03 19:41:11 UTC

svn commit: r1737599 - in /pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff: CharStringHandler.java Type1CharString.java Type2CharString.java

Author: lehmi
Date: Sun Apr  3 17:41:11 2016
New Revision: 1737599

URL: http://svn.apache.org/viewvc?rev=1737599&view=rev
Log:
PDFBOX-3273: replace List<Integer> with List<Number> to increase accuracy

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringHandler.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharString.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringHandler.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringHandler.java?rev=1737599&r1=1737598&r2=1737599&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringHandler.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringHandler.java Sun Apr  3 17:41:11 2016
@@ -35,14 +35,14 @@ public abstract class CharStringHandler
      * @param sequence of CharStringCommands
      *
      */
-    public List<Integer> handleSequence(List<Object> sequence)
+    public List<Number> handleSequence(List<Object> sequence)
     {
-        Stack<Integer> stack = new Stack<Integer>();
+        Stack<Number> stack = new Stack<Number>();
         for (Object obj : sequence)
         {
             if (obj instanceof CharStringCommand)
             {
-                List<Integer> results = handleCommand(stack, (CharStringCommand)obj);
+                List<Number> results = handleCommand(stack, (CharStringCommand)obj);
                 stack.clear();  // this is basically returning the new stack
                 if (results != null)
                 {
@@ -63,5 +63,5 @@ public abstract class CharStringHandler
      * @param numbers a list of numbers
      * @param command the CharStringCommand
      */
-    public abstract List<Integer> handleCommand(List<Integer> numbers, CharStringCommand command);
+    public abstract List<Number> handleCommand(List<Number> numbers, CharStringCommand command);
 }
\ No newline at end of file

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharString.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharString.java?rev=1737599&r1=1737598&r2=1737599&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharString.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharString.java Sun Apr  3 17:41:11 2016
@@ -139,7 +139,7 @@ public class Type1CharString
         width = 0;
         CharStringHandler handler = new CharStringHandler() {
             @Override
-            public List<Integer> handleCommand(List<Integer> numbers, CharStringCommand command)
+            public List<Number> handleCommand(List<Number> numbers, CharStringCommand command)
             {
                 return Type1CharString.this.handleCommand(numbers, command);
             }
@@ -147,7 +147,7 @@ public class Type1CharString
         handler.handleSequence(type1Sequence);
     }
 
-    private List<Integer> handleCommand(List<Integer> numbers, CharStringCommand command)
+    private List<Number> handleCommand(List<Number> numbers, CharStringCommand command)
     {
         commandCount++;
         String name = CharStringCommand.TYPE1_VOCABULARY.get(command.getKey());
@@ -158,7 +158,7 @@ public class Type1CharString
             {
                 if (isFlex)
                 {
-                    flexPoints.add(new Point2D.Float(numbers.get(0), numbers.get(1)));
+                    flexPoints.add(new Point2D.Float(numbers.get(0).floatValue(), numbers.get(1).floatValue()));
                 }
                 else
                 {
@@ -173,7 +173,7 @@ public class Type1CharString
                 if (isFlex)
                 {
                     // not in the Type 1 spec, but exists in some fonts
-                    flexPoints.add(new Point2D.Float(0, numbers.get(0)));
+                    flexPoints.add(new Point2D.Float(0f, numbers.get(0).floatValue()));
                 }
                 else
                 {
@@ -188,7 +188,7 @@ public class Type1CharString
                 if (isFlex)
                 {
                     // not in the Type 1 spec, but exists in some fonts
-                    flexPoints.add(new Point2D.Float(numbers.get(0), 0));
+                    flexPoints.add(new Point2D.Float(numbers.get(0).floatValue(), 0f));
                 }
                 else
                 {
@@ -233,8 +233,8 @@ public class Type1CharString
         {
             if (numbers.size() >= 3)
             {
-                leftSideBearing = new Point2D.Float(numbers.get(0), numbers.get(1));
-                width = numbers.get(2);
+                leftSideBearing = new Point2D.Float(numbers.get(0).floatValue(), numbers.get(1).floatValue());
+                width = numbers.get(2).intValue();
                 current.setLocation(leftSideBearing);
             }
         }
@@ -242,8 +242,8 @@ public class Type1CharString
         {
             if (numbers.size() >= 2)
             {
-                leftSideBearing = new Point2D.Float(numbers.get(0), 0);
-                width = numbers.get(1);
+                leftSideBearing = new Point2D.Float(numbers.get(0).floatValue(), 0);
+                width = numbers.get(1).intValue();
                 current.setLocation(leftSideBearing);
             }
         }
@@ -281,17 +281,17 @@ public class Type1CharString
         {
             if (numbers.size() >= 1)
             {
-                callothersubr(numbers.get(0));
+                callothersubr(numbers.get(0).intValue());
             }
         }
         else if ("div".equals(name))
         {
-            int b = numbers.get(numbers.size() -1);
-            int a = numbers.get(numbers.size() -2);
+            float b = numbers.get(numbers.size() -1).floatValue();
+            float a = numbers.get(numbers.size() -2).floatValue();
 
-            int result = Math.round(a / (float) b); // TODO loss of precision, result should be float
+            float result = a / b;
 
-            List<Integer> list = new ArrayList<Integer>(numbers);
+            List<Number> list = new ArrayList<Number>(numbers);
             list.remove(list.size() - 1);
             list.remove(list.size() - 1);
             list.add(result);
@@ -330,9 +330,9 @@ public class Type1CharString
      * Sets the current absolute point without performing a moveto.
      * Used only with results from callothersubr
      */
-    private void setcurrentpoint(int x, int y)
+    private void setcurrentpoint(Number x, Number y)
     {
-        current.setLocation(x, y);
+        current.setLocation(x.floatValue(), y.floatValue());
     }
 
     /**

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java?rev=1737599&r1=1737598&r2=1737599&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type2CharString.java Sun Apr  3 17:41:11 2016
@@ -31,8 +31,8 @@ import org.apache.fontbox.type1.Type1Cha
  */
 public class Type2CharString extends Type1CharString
 {
-    private int defWidthX = 0;
-    private int nominalWidthX = 0;
+    private float defWidthX = 0;
+    private float nominalWidthX = 0;
     private int pathCount = 0;
     private final List<Object> type2sequence;
     private final int gid;
@@ -84,7 +84,7 @@ public class Type2CharString extends Typ
         pathCount = 0;
         CharStringHandler handler = new CharStringHandler() {
             @Override
-            public List<Integer> handleCommand(List<Integer> numbers, CharStringCommand command)
+            public List<Number> handleCommand(List<Number> numbers, CharStringCommand command)
             {
                 return Type2CharString.this.handleCommand(numbers, command);
             }
@@ -93,7 +93,7 @@ public class Type2CharString extends Typ
     }
 
     @SuppressWarnings(value = { "unchecked" })
-    private List<Integer> handleCommand(List<Integer> numbers, CharStringCommand command)
+    private List<Number> handleCommand(List<Number> numbers, CharStringCommand command)
     {
         commandCount++;
         String name = CharStringCommand.TYPE2_VOCABULARY.get(command.getKey());
@@ -167,24 +167,24 @@ public class Type2CharString extends Typ
         }
         else if ("hflex".equals(name))
         {
-            List<Integer> first = Arrays.asList(numbers.get(0), 0,
+            List<Number> first = Arrays.asList(numbers.get(0), 0,
                     numbers.get(1), numbers.get(2), numbers.get(3), 0);
-            List<Integer> second = Arrays.asList(numbers.get(4), 0,
-                    numbers.get(5), -numbers.get(2),
+            List<Number> second = Arrays.asList(numbers.get(4), 0,
+                    numbers.get(5), -(numbers.get(2).floatValue()),
                     numbers.get(6), 0);
             addCommandList(Arrays.asList(first, second), new CharStringCommand(8));
         } 
         else if ("flex".equals(name))
         {
-            List<Integer> first = numbers.subList(0, 6);
-            List<Integer> second = numbers.subList(6, 12);
+            List<Number> first = numbers.subList(0, 6);
+            List<Number> second = numbers.subList(6, 12);
             addCommandList(Arrays.asList(first, second), new CharStringCommand(8));
         }
         else if ("hflex1".equals(name))
         {
-            List<Integer> first = Arrays.asList(numbers.get(0), numbers.get(1), 
+            List<Number> first = Arrays.asList(numbers.get(0), numbers.get(1), 
                     numbers.get(2), numbers.get(3), numbers.get(4), 0);
-            List<Integer> second = Arrays.asList(numbers.get(5), 0,
+            List<Number> second = Arrays.asList(numbers.get(5), 0,
                     numbers.get(6), numbers.get(7), numbers.get(8), 0);
             addCommandList(Arrays.asList(first, second), new CharStringCommand(8));
         }
@@ -194,11 +194,11 @@ public class Type2CharString extends Typ
             int dy = 0;
             for(int i = 0; i < 5; i++)
             {
-                dx += numbers.get(i * 2);
-                dy += numbers.get(i * 2 + 1);
+                dx += numbers.get(i * 2).intValue();
+                dy += numbers.get(i * 2 + 1).intValue();
             }
-            List<Integer> first = numbers.subList(0, 6);
-            List<Integer> second = Arrays.asList(numbers.get(6), numbers.get(7), numbers.get(8), 
+            List<Number> first = numbers.subList(0, 6);
+            List<Number> second = Arrays.asList(numbers.get(6), numbers.get(7), numbers.get(8), 
                     numbers.get(9), (Math.abs(dx) > Math.abs(dy) ? numbers.get(10) : -dx), 
                     (Math.abs(dx) > Math.abs(dy) ? -dy : numbers.get(10)));
             addCommandList(Arrays.asList(first, second), new CharStringCommand(8));
@@ -250,20 +250,19 @@ public class Type2CharString extends Typ
         return null;
     }
 
-    private List<Integer> clearStack(List<Integer> numbers, boolean flag)
+    private List<Number> clearStack(List<Number> numbers, boolean flag)
     {
         if (type1Sequence.isEmpty())
         {
             if (flag)
             {
-                addCommand(Arrays.asList(0, numbers.get(0) + nominalWidthX),
+                addCommand(asNumberList(0f, numbers.get(0).floatValue() + nominalWidthX),
                         new CharStringCommand(13));
-
                 numbers = numbers.subList(1, numbers.size());
             } 
             else
             {
-                addCommand(Arrays.asList(0, defWidthX),
+                addCommand(asNumberList(0f, defWidthX),
                     new CharStringCommand(13));
             }
         }
@@ -274,7 +273,7 @@ public class Type2CharString extends Typ
      * @param numbers  
      * @param horizontal 
      */
-    private void expandStemHints(List<Integer> numbers, boolean horizontal)
+    private void expandStemHints(List<Number> numbers, boolean horizontal)
     {
         // TODO
     }
@@ -297,11 +296,11 @@ public class Type2CharString extends Typ
         CharStringCommand closepathCommand = new CharStringCommand(9);
         if (command != null && !closepathCommand.equals(command))
         {
-            addCommand(Collections.<Integer> emptyList(), closepathCommand);
+            addCommand(Collections.<Number> emptyList(), closepathCommand);
         }
     }
 
-    private void drawAlternatingLine(List<Integer> numbers, boolean horizontal)
+    private void drawAlternatingLine(List<Number> numbers, boolean horizontal)
     {
         while (numbers.size() > 0)
         {
@@ -312,7 +311,7 @@ public class Type2CharString extends Typ
         }
     }
 
-    private void drawAlternatingCurve(List<Integer> numbers, boolean horizontal)
+    private void drawAlternatingCurve(List<Number> numbers, boolean horizontal)
     {
         while (numbers.size() > 0)
         {
@@ -336,7 +335,7 @@ public class Type2CharString extends Typ
         }
     }
 
-    private void drawCurve(List<Integer> numbers, boolean horizontal)
+    private void drawCurve(List<Number> numbers, boolean horizontal)
     {
         while (numbers.size() > 0)
         {
@@ -361,20 +360,30 @@ public class Type2CharString extends Typ
         }
     }
 
-    private void addCommandList(List<List<Integer>> numbers, CharStringCommand command)
+    private void addCommandList(List<List<Number>> numbers, CharStringCommand command)
     {
-        for (List<Integer> ns : numbers)
+        for (List<Number> ns : numbers)
         {
             addCommand(ns, command);
         }
     }
 
-    private void addCommand(List<Integer> numbers, CharStringCommand command)
+    private void addCommand(List<Number> numbers, CharStringCommand command)
     {
         type1Sequence.addAll(numbers);
         type1Sequence.add(command);
     }
 
+    private List<Number> asNumberList(Float... a)
+    {
+        List<Number> list = new ArrayList<Number>(a.length);
+        for(int i = 0; i < a.length; i++)
+        {
+            list.add(a[i]);
+        }
+        return list;
+    }
+
     private static <E> List<List<E>> split(List<E> list, int size)
     {
         List<List<E>> result = new ArrayList<List<E>>();