package com.github.gcacace.signaturepad.utils; public class SvgBuilder { private final StringBuilder mSvgPathsBuilder = new StringBuilder(); private SvgPathBuilder mCurrentPathBuilder = null; public SvgBuilder() { } public void clear() { mSvgPathsBuilder.setLength(0); mCurrentPathBuilder = null; } public String build(final int width, final int height) { if (isPathStarted()) { appendCurrentPath(); } return (new StringBuilder()) .append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n") .append("<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.2\" baseProfile=\"tiny\" ") .append("height=\"") .append(height) .append("\" ") .append("width=\"") .append(width) .append("\">") .append("<g ") .append("stroke-linejoin=\"round\" ") .append("stroke-linecap=\"round\" ") .append("fill=\"none\" ") .append("stroke=\"black\"") .append(">") .append(mSvgPathsBuilder) .append("</g>") .append("</svg>") .toString(); } public SvgBuilder append(final Bezier curve, final float strokeWidth) { final Integer roundedStrokeWidth = Math.round(strokeWidth); final SvgPoint curveStartSvgPoint = new SvgPoint(curve.startPoint); final SvgPoint curveControlSvgPoint1 = new SvgPoint(curve.control1); final SvgPoint curveControlSvgPoint2 = new SvgPoint(curve.control2); final SvgPoint curveEndSvgPoint = new SvgPoint(curve.endPoint); if (!isPathStarted()) { startNewPath(roundedStrokeWidth, curveStartSvgPoint); } if (!curveStartSvgPoint.equals(mCurrentPathBuilder.getLastPoint()) || !roundedStrokeWidth.equals(mCurrentPathBuilder.getStrokeWidth())) { appendCurrentPath(); startNewPath(roundedStrokeWidth, curveStartSvgPoint); } mCurrentPathBuilder.append(curveControlSvgPoint1, curveControlSvgPoint2, curveEndSvgPoint); return this; } private void startNewPath(Integer roundedStrokeWidth, SvgPoint curveStartSvgPoint) { mCurrentPathBuilder = new SvgPathBuilder(curveStartSvgPoint, roundedStrokeWidth); } private void appendCurrentPath() { mSvgPathsBuilder.append(mCurrentPathBuilder); } private boolean isPathStarted() { return mCurrentPathBuilder != null; } }