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