import org.apache.batik.svggen.SVGGeneratorContext;
import org.apache.batik.svggen.SVGGraphics2D;
import org.apache.batik.svggen.SVGIDGenerator;
+import org.eclipse.swt.SWT;
import org.simantics.Simantics;
import org.simantics.datatypes.literal.GUID;
import org.simantics.db.ReadGraph;
}
public static String renderSVG3(ICanvasContext ctx, double width, double height) {
- return renderSVG0(width, height, ctx, p0 -> p0.stream().collect(Collectors.toMap(p1 -> p1, p2 -> p2)));
+ return renderSVG0(width, height, SWT.LEFT, SWT.TOP, ctx, p0 -> p0.stream().collect(Collectors.toMap(p1 -> p1, p2 -> p2)));
}
/**
*/
private static final Function1<Set<?>, Map<?, ?>> mapper = p0 -> p0.stream().collect(Collectors.toMap(p1 -> p1, p2 -> p2));
+
+ /**
+ * Renders CanvasContext to SVG.
+ * @param ctx
+ * @param width Width of output image. Use -1 for autosize.
+ * @param height Height of output image. Use -1 for autosize.
+ * @param ax horizontal alignment. SWT.LEFT SWT.CENTER SWT.RIGHT are accepted values. Value is not used with autosize.
+ * @param ay vertical alignment. SWT.TOP SWT.CENTER SWT.BOTTOM are accepted values. Value is not used with autosize.
+ * @return
+ */
+ public static String renderSVG(ICanvasContext ctx, double width, double height, int ax, int ay) {
+ return renderSVG0(width, height, ax, ay, ctx, mapper);
+ }
+
public static String renderSVG(ICanvasContext ctx, double width, double height) {
- return renderSVG0(width, height, ctx, mapper);
+ return renderSVG(ctx,width,height, SWT.LEFT, SWT.TOP);
}
public static String renderSVG(ICanvasContext ctx) {
- return renderSVG(ctx, -1, -1);
+ return renderSVG(ctx, -1, -1, SWT.LEFT, SWT.TOP);
}
public static String renderSVGMapIdentifiers(ICanvasContext ctx) {
* @return
*/
public static String renderSVGMapIdentifiers(ICanvasContext ctx, double width, double height) {
- return renderSVG0(width, height, ctx, new Function1<Set<?>, Map<?, ?>>() {
+ return renderSVG0(width, height, SWT.LEFT, SWT.TOP, ctx, new Function1<Set<?>, Map<?, ?>>() {
@Override
public Map<?, ?> apply(Set<?> p0) {
- private static String renderSVG0(double width, double height, ICanvasContext ctx, Function1<Set<?>, Map<?, ?>> mappingFunction) {
+ private static String renderSVG0(double width, double height, int ax, int ay, ICanvasContext ctx, Function1<Set<?>, Map<?, ?>> mappingFunction) {
// Get a DOMImplementation.
DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();
// get the bounds of the content
Rectangle2D content = rtreeBounds;
+// int ax = SWT.LEFT;
+// int ay = SWT.TOP;
+// int ax = SWT.CENTER;
+// int ay = SWT.CENTER;
if (content != null) {
// To account for dynamic padding of selection rectangles (5 units + stroke width)
AffineTransform tr = new AffineTransform();
tr.translate(offset, offset);
tr.scale(scale, scale);
- tr.translate(-content.getX(), -content.getY());
+ double dx = -content.getX();
+ double dy = -content.getY();
+ if (width > 0.0 && height > 0.0) {
+ if (ax == SWT.LEFT) {
+ dx = -content.getX();
+ } else if (ax == SWT.RIGHT) {
+ double t = ((width - 2*offset)/scale - content.getWidth());
+ dx = -content.getX() + t;
+ } else {
+ double t = ((width - 2*offset)/scale - content.getWidth()) *0.5;
+ dx = -content.getX() + t;
+ }
+ if (ay == SWT.TOP) {
+ dy = -content.getY();
+ } else if (ay == SWT.BOTTOM) {
+ double t = ((height - 2*offset)/scale - content.getHeight());
+ dy = -content.getY() + t;
+ } else {
+ double t = ((height - 2*offset)/scale - content.getHeight()) * 0.5;
+ dy = -content.getY() + t;
+ }
+ }
+ tr.translate(dx, dy);
tr.getMatrix(matrix);
svgGenerator.setSVGCanvasSize(new Dimension((int)Math.ceil(scale * content.getWidth()) + 2*offset, (int)Math.ceil(scale * content.getHeight()) + 2*offset));
} else {