From af70109e4f565527a81a4c3af1c49bbc6154c391 Mon Sep 17 00:00:00 2001 From: James Ball Date: Mon, 26 Oct 2020 20:59:05 +0000 Subject: [PATCH] Fix SVG scaling and split numbers with multiple decimal points correctly --- src/parser/SvgParser.java | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/parser/SvgParser.java b/src/parser/SvgParser.java index b00add9..325ab03 100644 --- a/src/parser/SvgParser.java +++ b/src/parser/SvgParser.java @@ -11,6 +11,7 @@ import java.util.List; import java.util.Map; import java.util.Vector; import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collectors; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -87,6 +88,7 @@ public class SvgParser extends FileParser { private String[] preProcessPath(String path) throws IllegalArgumentException { // Replace all commas with spaces and then remove unnecessary whitespace path = path.replace(',', ' '); + path = path.replace("-", " -"); path = path.replaceAll("\\s+", " "); path = path.replaceAll("(^\\s|\\s$)", ""); @@ -129,6 +131,28 @@ public class SvgParser extends FileParser { .collect(Collectors.toList()); } + private static List splitCommand(String command) { + List nums = new ArrayList<>(); + String[] decimalSplit = command.split("\\."); + + try { + if (decimalSplit.length == 1) { + nums.add(Float.parseFloat(decimalSplit[0])); + } else { + nums.add(Float.parseFloat(decimalSplit[0] + "." + decimalSplit[1])); + + for (int i = 2; i < decimalSplit.length; i++) { + nums.add(Float.parseFloat("." + decimalSplit[i])); + } + } + } catch (Exception e) { + System.out.println(Arrays.toString(decimalSplit)); + System.out.println(command); + } + + return nums; + } + @Override protected void parseFile(String filePath) throws ParserConfigurationException, IOException, SAXException, IllegalArgumentException { @@ -157,7 +181,8 @@ public class SvgParser extends FileParser { if (commandChar != 'z' && commandChar != 'Z') { // Split the command into number strings and convert them into floats. nums = Arrays.stream(command.substring(1).split(" ")) - .map(Float::parseFloat) + .filter(Predicate.not(String::isBlank)) + .flatMap((numString) -> splitCommand(numString).stream()) .collect(Collectors.toList()); } @@ -287,15 +312,15 @@ public class SvgParser extends FileParser { : prevQuadraticControlPoint.reflectRelativeToVector(currPoint); } } else { - controlPoint1 = new Vector2(args.get(i), args.get(i + 1)); + controlPoint1 = new Vector2(args.get(i) / width, args.get(i + 1) / height); } if (isCubic) { - controlPoint2 = new Vector2(args.get(i + 2), args.get(i + 3)); + controlPoint2 = new Vector2(args.get(i + 2) / width, args.get(i + 3) / height); } - Vector2 newPoint = new Vector2(args.get(i + expectedArgs - 2), - args.get(i + expectedArgs - 1)); + Vector2 newPoint = new Vector2(args.get(i + expectedArgs - 2) / width, + args.get(i + expectedArgs - 1) / height); if (!isAbsolute) { controlPoint1 = currPoint.translate(controlPoint1);