From eb76441a05eee907b6d3b27a9aa6e322fb6d4f5a Mon Sep 17 00:00:00 2001 From: James Ball Date: Sun, 25 Oct 2020 17:29:25 +0000 Subject: [PATCH] Refactor function definitions and merge repetitive functions --- src/parser/SvgParser.java | 192 +++++++++++--------------------------- 1 file changed, 53 insertions(+), 139 deletions(-) diff --git a/src/parser/SvgParser.java b/src/parser/SvgParser.java index c571ffe..b5db85f 100644 --- a/src/parser/SvgParser.java +++ b/src/parser/SvgParser.java @@ -42,38 +42,30 @@ public class SvgParser extends FileParser { shapes = new ArrayList<>(); commandMap = new HashMap<>(); - commandMap.put('M', this::parseMoveToAbsolute); - commandMap.put('m', this::parseMoveToRelative); - commandMap.put('L', this::parseLineToAbsolute); - commandMap.put('l', this::parseLineToRelative); - commandMap.put('H', this::parseHorizontalLineToAbsolute); - commandMap.put('h', this::parseHorizontalLineToRelative); - commandMap.put('V', this::parseVerticalLineToAbsolute); - commandMap.put('v', this::parseVerticalLineToRelative); - commandMap.put('C', this::parseCubicCurveToAbsolute); - commandMap.put('c', this::parseCubicCurveToRelative); - commandMap.put('S', this::parseSmoothCurveToAbsolute); - commandMap.put('s', this::parseSmoothCurveToRelative); - commandMap.put('Q', this::parseQuadraticCurveToAbsolute); - commandMap.put('q', this::parseQuadraticCurveToRelative); - commandMap.put('T', this::parseSmoothQuadraticCurveToAbsolute); - commandMap.put('t', this::parseSmoothQuadraticCurveToRelative); - commandMap.put('A', this::parseEllipticalArcAbsolute); - commandMap.put('a', this::parseEllipticalArcRelative); + commandMap.put('M', (args) -> parseMoveTo(args, true)); + commandMap.put('m', (args) -> parseMoveTo(args, false)); + commandMap.put('L', (args) -> parseLineTo(args, true, true, true)); + commandMap.put('l', (args) -> parseLineTo(args, false, true, true)); + commandMap.put('H', (args) -> parseLineTo(args, true, true, false)); + commandMap.put('h', (args) -> parseLineTo(args, false, true, false)); + commandMap.put('V', (args) -> parseLineTo(args, true, false, true)); + commandMap.put('v', (args) -> parseLineTo(args, false, false, true)); + commandMap.put('C', (args) -> parseCurveTo(args, true, true, false)); + commandMap.put('c', (args) -> parseCurveTo(args, false, true, false)); + commandMap.put('S', (args) -> parseCurveTo(args, true, true, true)); + commandMap.put('s', (args) -> parseCurveTo(args, false, true, true)); + commandMap.put('Q', (args) -> parseCurveTo(args, true, false, false)); + commandMap.put('q', (args) -> parseCurveTo(args, false, false, false)); + commandMap.put('T', (args) -> parseCurveTo(args, true, false, true)); + commandMap.put('t', (args) -> parseCurveTo(args, false, false, true)); + commandMap.put('A', (args) -> parseEllipticalArc(args, true)); + commandMap.put('a', (args) -> parseEllipticalArc(args, false)); commandMap.put('Z', this::parseClosePath); commandMap.put('z', this::parseClosePath); parseFile(path); } - private List parseMoveToAbsolute(List args) { - return parseMoveTo(args, true); - } - - private List parseMoveToRelative(List args) { - return parseMoveTo(args, false); - } - private List parseMoveTo(List args, boolean isAbsolute) { if (args.size() % 2 != 0 || args.size() < 2) { throw new IllegalArgumentException("SVG moveto command has incorrect number of arguments."); @@ -85,13 +77,13 @@ public class SvgParser extends FileParser { currPoint = vec; initialPoint = currPoint; if (args.size() > 2) { - return parseLineToAbsolute(args.subList(2, args.size() - 1)); + return parseLineTo(args.subList(2, args.size() - 1), true, true, true); } } else { currPoint = currPoint.translate(vec); initialPoint = currPoint; if (args.size() > 2) { - return parseLineToRelative(args.subList(2, args.size() - 1)); + return parseLineTo(args.subList(2, args.size() - 1), false, true, true); } } @@ -104,53 +96,35 @@ public class SvgParser extends FileParser { return List.of(line); } - private List parseLineToAbsolute(List args) { - return parseLineTo(args, true); - } + private List parseLineTo(List args, boolean isAbsolute, + boolean isHorizontal, boolean isVertical) { + int expectedArgs = isHorizontal && isVertical ? 2 : 1; - private List parseLineToRelative(List args) { - return parseLineTo(args, false); - } - - private List parseLineTo(List args, boolean isAbsolute) { - if (args.size() % 2 != 0 || args.size() < 2) { + if (args.size() % expectedArgs != 0 || args.size() < expectedArgs) { throw new IllegalArgumentException("SVG lineto command has incorrect number of arguments."); } List lines = new ArrayList<>(); - for (int i = 0; i < args.size(); i += 2) { - Vector2 newPoint = new Vector2(args.get(i), args.get(i + 1)); - - if (!isAbsolute) { - newPoint = currPoint.translate(newPoint); - } - - lines.add(new Line(currPoint, newPoint)); - currPoint = newPoint; - } - - return lines; - } - - private List parseHorizontalLineToAbsolute(List args) { - return parseHorizontalLineTo(args, true); - } - - private List parseHorizontalLineToRelative(List args) { - return parseHorizontalLineTo(args, false); - } - - private List parseHorizontalLineTo(List args, boolean isAbsolute) { - List lines = new ArrayList<>(); - - for (Float point : args) { - Vector2 newPoint; + for (int i = 0; i < args.size(); i += expectedArgs) { + Vector2 newPoint = currPoint; if (isAbsolute) { - newPoint = new Vector2(point, currPoint.getY()); + if (isHorizontal && isVertical) { + newPoint = new Vector2(args.get(i), args.get(i + 1)); + } else if (isHorizontal) { + newPoint = new Vector2(args.get(i), currPoint.getY()); + } else if (isVertical) { + newPoint = new Vector2(currPoint.getX(), args.get(i)); + } } else { - newPoint = currPoint.translate(new Vector2(point, 0)); + if (isHorizontal && isVertical) { + newPoint = currPoint.translate(newPoint); + } else if (isHorizontal) { + newPoint = currPoint.translate(new Vector2(args.get(i), 0)); + } else if (isVertical) { + newPoint = currPoint.translate(new Vector2(0, args.get(i))); + } } lines.add(new Line(currPoint, newPoint)); @@ -160,66 +134,8 @@ public class SvgParser extends FileParser { return lines; } - private List parseVerticalLineToAbsolute(List args) { - return parseVerticalLineTo(args, true); - } - - private List parseVerticalLineToRelative(List args) { - return parseVerticalLineTo(args, false); - } - - private List parseVerticalLineTo(List args, boolean isAbsolute) { - List lines = new ArrayList<>(); - - for (Float point : args) { - Vector2 newPoint; - - if (isAbsolute) { - newPoint = new Vector2(currPoint.getX(), point); - } else { - newPoint = currPoint.translate(new Vector2(0, point)); - } - - lines.add(new Line(currPoint, newPoint)); - currPoint = newPoint; - } - - return lines; - } - - private List parseCubicCurveToAbsolute(List args) { - return parseCurveTo(args, true, true, false); - } - - private List parseCubicCurveToRelative(List args) { - return parseCurveTo(args, false, true, false); - } - - private List parseSmoothCurveToAbsolute(List args) { - return parseCurveTo(args, true, true, true); - } - - private List parseSmoothCurveToRelative(List args) { - return parseCurveTo(args, false, true, true); - } - - private List parseQuadraticCurveToAbsolute(List args) { - return parseCurveTo(args, true, false, false); - } - - private List parseQuadraticCurveToRelative(List args) { - return parseCurveTo(args, false, false, false); - } - - private List parseSmoothQuadraticCurveToAbsolute(List args) { - return parseCurveTo(args, true, false, true); - } - - private List parseSmoothQuadraticCurveToRelative(List args) { - return parseCurveTo(args, false, false, true); - } - - private List parseCurveTo(List args, boolean isAbsolute, boolean isCubic, boolean isSmooth) { + private List parseCurveTo(List args, boolean isAbsolute, boolean isCubic, + boolean isSmooth) { int expectedArgs = isCubic ? 4 : 2; if (!isSmooth) { expectedArgs += 2; @@ -237,9 +153,11 @@ public class SvgParser extends FileParser { if (isSmooth) { if (isCubic) { - controlPoint1 = prevCubicControlPoint == null ? currPoint : prevCubicControlPoint.reflectRelativeToVector(currPoint); + controlPoint1 = prevCubicControlPoint == null ? currPoint + : prevCubicControlPoint.reflectRelativeToVector(currPoint); } else { - controlPoint1 = prevQuadraticControlPoint == null ? currPoint : prevQuadraticControlPoint.reflectRelativeToVector(currPoint); + controlPoint1 = prevQuadraticControlPoint == null ? currPoint + : prevQuadraticControlPoint.reflectRelativeToVector(currPoint); } } else { controlPoint1 = new Vector2(args.get(i), args.get(i + 1)); @@ -249,7 +167,8 @@ public class SvgParser extends FileParser { controlPoint2 = new Vector2(args.get(i + 2), args.get(i + 3)); } - Vector2 newPoint = new Vector2(args.get(i + expectedArgs - 2), args.get(i + expectedArgs - 1)); + Vector2 newPoint = new Vector2(args.get(i + expectedArgs - 2), + args.get(i + expectedArgs - 1)); if (!isAbsolute) { controlPoint1 = currPoint.translate(controlPoint1); @@ -271,17 +190,12 @@ public class SvgParser extends FileParser { return curves; } - private List parseEllipticalArcAbsolute(List args) { - return parseEllipticalArc(args, true); - } - - private List parseEllipticalArcRelative(List args) { - return parseEllipticalArc(args, false); - } - private List parseEllipticalArc(List args, boolean isAbsolute) { + // TODO: Properly implement + if (args.size() % 7 != 0 || args.size() < 7) { - throw new IllegalArgumentException("SVG elliptical arc command has incorrect number of arguments."); + throw new IllegalArgumentException( + "SVG elliptical arc command has incorrect number of arguments."); } List lineToArgs = new ArrayList<>(); @@ -291,7 +205,7 @@ public class SvgParser extends FileParser { lineToArgs.add(args.get(i + 6)); } - return parseLineTo(lineToArgs, isAbsolute); + return parseLineTo(lineToArgs, isAbsolute, true, true); } private Document getSvgDocument(String path)