mirror of
https://github.com/octoleo/plantuml.git
synced 2024-11-25 06:17:33 +00:00
This commit is contained in:
parent
4888ac976d
commit
1c650bb2f9
135
src/com/plantuml/wasm/Canvas.java
Normal file
135
src/com/plantuml/wasm/Canvas.java
Normal file
@ -0,0 +1,135 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2023, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package com.plantuml.wasm;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Frame;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.RenderingHints;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.BlockUml;
|
||||
import net.sourceforge.plantuml.BlockUmlBuilder;
|
||||
import net.sourceforge.plantuml.ErrorUml;
|
||||
import net.sourceforge.plantuml.core.Diagram;
|
||||
import net.sourceforge.plantuml.error.PSystemError;
|
||||
import net.sourceforge.plantuml.klimt.URectangle;
|
||||
import net.sourceforge.plantuml.klimt.color.ColorMapper;
|
||||
import net.sourceforge.plantuml.klimt.color.HColor;
|
||||
import net.sourceforge.plantuml.klimt.color.HColors;
|
||||
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
||||
import net.sourceforge.plantuml.preproc.Defines;
|
||||
import net.sourceforge.plantuml.ugraphic.g2d.UGraphicG2d;
|
||||
|
||||
public class Canvas {
|
||||
|
||||
public static Frame frame;
|
||||
public static Graphics2D g2d;
|
||||
private static int frameWidth;
|
||||
private static int frameHeight;
|
||||
|
||||
public static int initCanvas(int width, int height) throws IOException {
|
||||
WasmLog.start = System.currentTimeMillis();
|
||||
WasmLog.log("initCanvas");
|
||||
if (g2d == null) {
|
||||
frameWidth = width;
|
||||
frameHeight = height;
|
||||
frame = new Frame();
|
||||
frame.setUndecorated(true);
|
||||
frame.setSize(frameWidth, frameHeight);
|
||||
frame.setLayout(null);
|
||||
frame.setVisible(true);
|
||||
g2d = (Graphics2D) frame.getGraphics();
|
||||
WasmLog.log("initCanvas done = " + frame);
|
||||
return 45;
|
||||
}
|
||||
WasmLog.log("initCanvas skipped because it has already been done");
|
||||
return 47;
|
||||
}
|
||||
|
||||
public static int convertCanvas(int width, int height, String text) throws IOException {
|
||||
WasmLog.start = System.currentTimeMillis();
|
||||
|
||||
WasmLog.log("1frame= " + frame);
|
||||
if (g2d == null) {
|
||||
frameWidth = width;
|
||||
frameHeight = height;
|
||||
frame = new Frame();
|
||||
frame.setUndecorated(true);
|
||||
frame.setSize(frameWidth, frameHeight);
|
||||
frame.setLayout(null);
|
||||
frame.setVisible(true);
|
||||
g2d = (Graphics2D) frame.getGraphics();
|
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
|
||||
WasmLog.log("3frame= " + frame);
|
||||
return 45;
|
||||
}
|
||||
|
||||
final BlockUmlBuilder builder = new BlockUmlBuilder(Collections.<String>emptyList(), UTF_8,
|
||||
Defines.createEmpty(), new StringReader(text), null, "string");
|
||||
List<BlockUml> blocks = builder.getBlockUmls();
|
||||
|
||||
WasmLog.log("...loading data...");
|
||||
|
||||
final Diagram system = blocks.get(0).getDiagram();
|
||||
|
||||
if (system instanceof PSystemError) {
|
||||
final ErrorUml error = ((PSystemError) system).getFirstError();
|
||||
WasmLog.log("[" + error.getPosition() + "] " + error.getError());
|
||||
return -242;
|
||||
}
|
||||
WasmLog.log("...processing...");
|
||||
|
||||
final HColor back = HColors.simple(Color.WHITE);
|
||||
final StringBounder stringBounder = new StringBounderCanvas(g2d);
|
||||
final UGraphicG2d ug = new UGraphicG2d(back, ColorMapper.IDENTITY, stringBounder, g2d, 1.0);
|
||||
// ug.apply(back).apply(back.bg()).draw(new URectangle(frameWidth,
|
||||
// frameHeight));
|
||||
ug.apply(HColors.RED).apply(back.bg()).draw(new URectangle(frameWidth, frameHeight));
|
||||
WasmLog.log("system= " + system.getClass().getName());
|
||||
|
||||
system.exportDiagramGraphic(ug);
|
||||
|
||||
return 43;
|
||||
}
|
||||
|
||||
}
|
@ -47,6 +47,7 @@ public class RunInit {
|
||||
cheerpjPath = argsArray[0];
|
||||
System.err.println("RunInit: " + Version.versionString());
|
||||
System.err.println("cheerpjPath is " + cheerpjPath);
|
||||
WasmLog.log("Loading completed!");
|
||||
}
|
||||
|
||||
}
|
||||
|
69
src/com/plantuml/wasm/StringBounderCanvas.java
Normal file
69
src/com/plantuml/wasm/StringBounderCanvas.java
Normal file
@ -0,0 +1,69 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2023, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package com.plantuml.wasm;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.FontMetrics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
|
||||
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
||||
import net.sourceforge.plantuml.klimt.font.StringBounderRaw;
|
||||
import net.sourceforge.plantuml.klimt.font.UFont;
|
||||
|
||||
public class StringBounderCanvas extends StringBounderRaw {
|
||||
|
||||
private final Graphics2D g2d;
|
||||
|
||||
public StringBounderCanvas(Graphics2D g2d) {
|
||||
super(g2d.getFontRenderContext());
|
||||
this.g2d = g2d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matchesProperty(String propertyName) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected XDimension2D calculateDimensionInternal(UFont font, String text) {
|
||||
final Font javaFont = font.getUnderlayingFont();
|
||||
final FontMetrics fm = g2d.getFontMetrics(javaFont);
|
||||
final Rectangle2D rect = fm.getStringBounds(text, g2d);
|
||||
return new XDimension2D(rect.getWidth(), rect.getHeight());
|
||||
}
|
||||
|
||||
}
|
@ -35,22 +35,40 @@
|
||||
*/
|
||||
package com.plantuml.wasm;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.BlockUml;
|
||||
import net.sourceforge.plantuml.BlockUmlBuilder;
|
||||
import net.sourceforge.plantuml.ErrorUml;
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.SourceStringReader;
|
||||
import net.sourceforge.plantuml.core.DiagramDescription;
|
||||
import net.sourceforge.plantuml.core.Diagram;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.error.PSystemError;
|
||||
import net.sourceforge.plantuml.preproc.Defines;
|
||||
|
||||
public class Utils {
|
||||
|
||||
public static int convertPng(String pathOut, String text) throws IOException {
|
||||
final FileFormatOption format = new FileFormatOption(FileFormat.PNG);
|
||||
text = cleanText(text);
|
||||
return doTheJob(pathOut, text, format);
|
||||
WasmLog.start = System.currentTimeMillis();
|
||||
WasmLog.log("Starting processing");
|
||||
int ret = 42;
|
||||
try {
|
||||
final FileFormatOption format = new FileFormatOption(FileFormat.PNG);
|
||||
text = cleanText(text);
|
||||
ret = doTheJob(pathOut, text, format);
|
||||
} catch (Throwable t) {
|
||||
WasmLog.log("Fatal error " + t);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
private static String cleanText(String text) {
|
||||
@ -62,22 +80,37 @@ public class Utils {
|
||||
return text;
|
||||
}
|
||||
|
||||
// public static int convertSvg(String pathOut, String text) throws IOException {
|
||||
// final FileFormatOption format = new FileFormatOption(FileFormat.SVG);
|
||||
// text = cleanText(text);
|
||||
// return doTheJob(pathOut, text, format);
|
||||
// }
|
||||
|
||||
private static int doTheJob(String pathOut, String text, final FileFormatOption format)
|
||||
throws FileNotFoundException, IOException {
|
||||
final SourceStringReader sr = new SourceStringReader(text);
|
||||
|
||||
final BlockUmlBuilder builder = new BlockUmlBuilder(Collections.<String>emptyList(), UTF_8,
|
||||
Defines.createEmpty(), new StringReader(text), null, "string");
|
||||
List<BlockUml> blocks = builder.getBlockUmls();
|
||||
|
||||
if (blocks.size() == 0)
|
||||
return 142;
|
||||
|
||||
final FileOutputStream fos = new FileOutputStream(new File(pathOut));
|
||||
DiagramDescription description = sr.outputImage(fos, format);
|
||||
fos.close();
|
||||
if (description.getDescription() != null && description.getDescription().contains("error"))
|
||||
return 1;
|
||||
WasmLog.log("...loading data...");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int convertSvg(String pathOut, String text) throws IOException {
|
||||
final FileFormatOption format = new FileFormatOption(FileFormat.SVG);
|
||||
text = cleanText(text);
|
||||
return doTheJob(pathOut, text, format);
|
||||
final Diagram system = blocks.get(0).getDiagram();
|
||||
if (system instanceof PSystemError) {
|
||||
final ErrorUml error = ((PSystemError) system).getFirstError();
|
||||
WasmLog.log("[" + error.getPosition() + "] " + error.getError());
|
||||
return -242;
|
||||
} else {
|
||||
WasmLog.log("...processing...");
|
||||
final ImageData imageData = system.exportDiagram(fos, 0, format);
|
||||
WasmLog.log("Done!");
|
||||
fos.close();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
65
src/com/plantuml/wasm/WasmLog.java
Normal file
65
src/com/plantuml/wasm/WasmLog.java
Normal file
@ -0,0 +1,65 @@
|
||||
/* ========================================================================
|
||||
* PlantUML : a free UML diagram generator
|
||||
* ========================================================================
|
||||
*
|
||||
* (C) Copyright 2009-2023, Arnaud Roques
|
||||
*
|
||||
* Project Info: http://plantuml.com
|
||||
*
|
||||
* If you like this project or if you find it useful, you can support us at:
|
||||
*
|
||||
* http://plantuml.com/patreon (only 1$ per month!)
|
||||
* http://plantuml.com/paypal
|
||||
*
|
||||
* This file is part of PlantUML.
|
||||
*
|
||||
* PlantUML is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* PlantUML distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
* USA.
|
||||
*
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
*
|
||||
*/
|
||||
package com.plantuml.wasm;
|
||||
|
||||
//::uncomment when WASM
|
||||
//import com.leaningtech.client.Document;
|
||||
//import com.leaningtech.client.Element;
|
||||
//import com.leaningtech.client.Global;
|
||||
//::done
|
||||
|
||||
public class WasmLog {
|
||||
|
||||
public static long start;
|
||||
|
||||
public static void log(String message) {
|
||||
// ::uncomment when WASM
|
||||
// if (start > 0) {
|
||||
// final long duration = System.currentTimeMillis() - start;
|
||||
// message = "(" + duration + " ms) " + message;
|
||||
// }
|
||||
// System.err.print(message);
|
||||
// final Document document = Global.document;
|
||||
// if (document == null)
|
||||
// return;
|
||||
// final Element messageJava = document.getElementById(Global.JSString("message-java"));
|
||||
// if (messageJava == null)
|
||||
// return;
|
||||
// messageJava.set_textContent(Global.JSString(message));
|
||||
// ::done
|
||||
}
|
||||
|
||||
}
|
@ -41,6 +41,7 @@ import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Objects;
|
||||
|
||||
import net.sourceforge.plantuml.api.ImageDataSimple;
|
||||
import net.sourceforge.plantuml.command.Command;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.ProtectedCommand;
|
||||
@ -51,13 +52,18 @@ import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.cucadiagram.DisplayPositioned;
|
||||
import net.sourceforge.plantuml.cucadiagram.DisplayPositionned;
|
||||
import net.sourceforge.plantuml.graphic.VerticalAlignment;
|
||||
import net.sourceforge.plantuml.klimt.UText;
|
||||
import net.sourceforge.plantuml.klimt.UTranslate;
|
||||
import net.sourceforge.plantuml.klimt.color.ColorMapper;
|
||||
import net.sourceforge.plantuml.klimt.color.NoSuchColorException;
|
||||
import net.sourceforge.plantuml.klimt.font.FontConfiguration;
|
||||
import net.sourceforge.plantuml.klimt.font.UFont;
|
||||
import net.sourceforge.plantuml.klimt.geom.HorizontalAlignment;
|
||||
import net.sourceforge.plantuml.stats.StatsUtilsIncrement;
|
||||
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
|
||||
import net.sourceforge.plantuml.text.BackSlash;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.utils.BlocLines;
|
||||
import net.sourceforge.plantuml.version.License;
|
||||
import net.sourceforge.plantuml.version.Version;
|
||||
@ -221,4 +227,13 @@ public abstract class AbstractPSystem implements Diagram {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageData exportDiagramGraphic(UGraphic ug) {
|
||||
final UFont font = UFont.monospaced(14);
|
||||
final FontConfiguration fc = FontConfiguration.blackBlueTrue(font);
|
||||
final UText text = new UText("Not implemented yet for " + getClass().getName(), fc);
|
||||
ug.apply(new UTranslate(10, 10)).draw(text);
|
||||
return new ImageDataSimple(100, 100);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -47,6 +47,8 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.plantuml.wasm.WasmLog;
|
||||
|
||||
import net.sourceforge.plantuml.preproc.Defines;
|
||||
import net.sourceforge.plantuml.preproc.FileWithSuffix;
|
||||
import net.sourceforge.plantuml.preproc.ImportedFiles;
|
||||
@ -136,6 +138,7 @@ public final class BlockUmlBuilder implements DefinitionsContainer {
|
||||
if (paused)
|
||||
current.add(s);
|
||||
|
||||
WasmLog.log("...text loaded...");
|
||||
final BlockUml uml = new BlockUml(current, defines.cloneMe(), null, this, charset);
|
||||
usedFiles.addAll(uml.getIncluded());
|
||||
blocks.add(uml);
|
||||
|
@ -129,7 +129,7 @@ public enum FileFormat {
|
||||
return "." + StringUtils.goLowerCase(name());
|
||||
}
|
||||
|
||||
final static private BufferedImage imDummy = new BufferedImage(800, 100, BufferedImage.TYPE_INT_RGB);
|
||||
final static private BufferedImage imDummy = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
|
||||
final static public Graphics2D gg = imDummy.createGraphics();
|
||||
static {
|
||||
// KEY_FRACTIONALMETRICS
|
||||
@ -159,7 +159,7 @@ public enum FileFormat {
|
||||
}
|
||||
|
||||
private StringBounder getSvgStringBounder(final SvgCharSizeHack charSizeHack) {
|
||||
return new StringBounderRaw() {
|
||||
return new StringBounderRaw(FileFormat.gg.getFontRenderContext()) {
|
||||
public String toString() {
|
||||
return "FileFormat::getSvgStringBounder";
|
||||
}
|
||||
@ -177,7 +177,7 @@ public enum FileFormat {
|
||||
}
|
||||
|
||||
private StringBounder getNormalStringBounder() {
|
||||
return new StringBounderRaw() {
|
||||
return new StringBounderRaw(FileFormat.gg.getFontRenderContext()) {
|
||||
public String toString() {
|
||||
return "FileFormat::getNormalStringBounder";
|
||||
}
|
||||
@ -202,7 +202,7 @@ public enum FileFormat {
|
||||
|
||||
// ::comment when WASM
|
||||
private StringBounder getBrailleStringBounder() {
|
||||
return new StringBounderRaw() {
|
||||
return new StringBounderRaw(FileFormat.gg.getFontRenderContext()) {
|
||||
public String toString() {
|
||||
return "FileFormat::getBrailleStringBounder";
|
||||
}
|
||||
@ -228,7 +228,7 @@ public enum FileFormat {
|
||||
}
|
||||
|
||||
private StringBounder getTikzStringBounder(final TikzFontDistortion tikzFontDistortion) {
|
||||
return new StringBounderRaw() {
|
||||
return new StringBounderRaw(FileFormat.gg.getFontRenderContext()) {
|
||||
public String toString() {
|
||||
return "FileFormat::getTikzStringBounder";
|
||||
}
|
||||
|
@ -40,6 +40,8 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.plantuml.wasm.WasmLog;
|
||||
|
||||
import net.sourceforge.plantuml.acearth.PSystemXearthFactory;
|
||||
import net.sourceforge.plantuml.activitydiagram.ActivityDiagramFactory;
|
||||
import net.sourceforge.plantuml.activitydiagram3.ActivityDiagramFactory3;
|
||||
@ -113,6 +115,8 @@ public class PSystemBuilder {
|
||||
final public Diagram createPSystem(List<StringLocated> source, List<StringLocated> rawSource,
|
||||
Map<String, String> skinParam) {
|
||||
|
||||
WasmLog.log("..compiling diagram...");
|
||||
|
||||
final long now = System.currentTimeMillis();
|
||||
|
||||
Diagram result = null;
|
||||
@ -137,6 +141,7 @@ public class PSystemBuilder {
|
||||
if (diagramType != systemFactory.getDiagramType())
|
||||
continue;
|
||||
|
||||
WasmLog.log("...trying " + systemFactory.getClass().getName() + " ...");
|
||||
final Diagram sys = systemFactory.createSystem(umlSource, skinParam);
|
||||
if (isOk(sys)) {
|
||||
result = sys;
|
||||
@ -173,7 +178,7 @@ public class PSystemBuilder {
|
||||
// ::comment when WASM
|
||||
factories.add(new BpmDiagramFactory(DiagramType.BPM));
|
||||
// ::done
|
||||
|
||||
|
||||
// factories.add(new PostIdDiagramFactory());
|
||||
factories.add(new PSystemLicenseFactory());
|
||||
factories.add(new PSystemVersionFactory());
|
||||
|
@ -35,12 +35,17 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.asciiart;
|
||||
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
||||
import net.sourceforge.plantuml.klimt.font.StringBounderRaw;
|
||||
import net.sourceforge.plantuml.klimt.font.UFont;
|
||||
|
||||
public class TextStringBounder extends StringBounderRaw {
|
||||
|
||||
public TextStringBounder() {
|
||||
super(FileFormat.gg.getFontRenderContext());
|
||||
}
|
||||
|
||||
protected XDimension2D calculateDimensionInternal(UFont font, String text) {
|
||||
final int length1 = text.codePointCount(0, text.length());
|
||||
final int length2 = text.length();
|
||||
|
@ -83,6 +83,7 @@ import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
|
||||
import net.sourceforge.plantuml.svek.CucaDiagramFileMaker;
|
||||
import net.sourceforge.plantuml.svek.CucaDiagramFileMakerSvek;
|
||||
import net.sourceforge.plantuml.text.BackSlash;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.xmi.CucaDiagramXmiMaker;
|
||||
import net.sourceforge.plantuml.xmlsc.StateDiagramScxmlMaker;
|
||||
|
||||
@ -422,6 +423,13 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
|
||||
}
|
||||
// ::done
|
||||
|
||||
@Override
|
||||
final public ImageData exportDiagramGraphic(UGraphic ug) {
|
||||
|
||||
final CucaDiagramFileMaker maker = new CucaDiagramFileMakerSmetana(this, ug.getStringBounder());
|
||||
return maker.createOneGraphic(ug);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption)
|
||||
throws IOException {
|
||||
|
@ -169,18 +169,18 @@ public class CommandCreateClassMultilines extends CommandMultilines2<ClassDiagra
|
||||
|
||||
final Quark quark = diagram.quarkInContext(idShort, true);
|
||||
|
||||
Display display = Display.getWithNewlines(displayString);
|
||||
if (Display.isNull(display))
|
||||
display = Display.getWithNewlines(quark.getName()).withCreoleMode(CreoleMode.SIMPLE_LINE);
|
||||
|
||||
EntityImp entity = (EntityImp) quark.getData();
|
||||
|
||||
Display display = Display.getWithNewlines(displayString);
|
||||
if (entity == null) {
|
||||
if (Display.isNull(display))
|
||||
display = Display.getWithNewlines(quark.getName()).withCreoleMode(CreoleMode.SIMPLE_LINE);
|
||||
entity = diagram.reallyCreateLeaf(quark, display, type, null);
|
||||
} else {
|
||||
if (entity.muteToType(type, null) == false)
|
||||
return CommandExecutionResult.error("Cannot create " + idShort + " because it already exists");
|
||||
entity.setDisplay(display);
|
||||
if (Display.isNull(display) == false)
|
||||
entity.setDisplay(display);
|
||||
}
|
||||
|
||||
diagram.setLastEntity(entity);
|
||||
|
@ -37,6 +37,8 @@ package net.sourceforge.plantuml.command;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import com.plantuml.wasm.WasmLog;
|
||||
|
||||
import net.sourceforge.plantuml.core.Diagram;
|
||||
import net.sourceforge.plantuml.log.Logme;
|
||||
import net.sourceforge.plantuml.utils.BlocLines;
|
||||
@ -53,6 +55,7 @@ public class ProtectedCommand<S extends Diagram> implements Command<S> {
|
||||
|
||||
public CommandExecutionResult execute(S system, BlocLines lines) {
|
||||
try {
|
||||
WasmLog.log("...running " + cmd.getClass().getName() + " ...");
|
||||
final CommandExecutionResult result = cmd.execute(system, lines);
|
||||
// if (result.isOk()) {
|
||||
// // TRACECOMMAND
|
||||
|
@ -41,6 +41,7 @@ import java.io.OutputStream;
|
||||
import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.api.ApiStable;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
|
||||
/**
|
||||
* Represents a single diagram. A Diagram could be a UML (sequence diagram,
|
||||
@ -67,6 +68,8 @@ public interface Diagram {
|
||||
*/
|
||||
ImageData exportDiagram(OutputStream os, int num, FileFormatOption fileFormat) throws IOException;
|
||||
|
||||
ImageData exportDiagramGraphic(UGraphic ug);
|
||||
|
||||
/**
|
||||
* Number of images in this diagram (usually, 1)
|
||||
*
|
||||
|
@ -558,4 +558,9 @@ public class CucaDiagramFileMakerElk implements CucaDiagramFileMaker {
|
||||
return ent.getSvekImage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageData createOneGraphic(UGraphic ug) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -38,13 +38,18 @@ package net.sourceforge.plantuml.klimt.font;
|
||||
import java.awt.font.FontRenderContext;
|
||||
import java.awt.font.LineMetrics;
|
||||
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
||||
import net.sourceforge.plantuml.text.RichText;
|
||||
import net.sourceforge.plantuml.text.StyledString;
|
||||
|
||||
public abstract class StringBounderRaw implements StringBounder {
|
||||
|
||||
private final FontRenderContext frc;
|
||||
|
||||
protected StringBounderRaw(FontRenderContext frc) {
|
||||
this.frc = frc;
|
||||
}
|
||||
|
||||
public final XDimension2D calculateDimension(UFont font, String text) {
|
||||
if (RichText.isRich(text)) {
|
||||
double width = 0;
|
||||
@ -63,7 +68,6 @@ public abstract class StringBounderRaw implements StringBounder {
|
||||
protected abstract XDimension2D calculateDimensionInternal(UFont font, String text);
|
||||
|
||||
public double getDescent(UFont font, String text) {
|
||||
final FontRenderContext frc = FileFormat.gg.getFontRenderContext();
|
||||
final LineMetrics lineMetrics = font.getUnderlayingFont().getLineMetrics(text, frc);
|
||||
final double descent = lineMetrics.getDescent();
|
||||
return descent;
|
||||
|
@ -338,6 +338,25 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageData createOneGraphic(UGraphic ug) {
|
||||
for (EntityImp leaf : diagram.getLeafsvalues())
|
||||
printEntityNew(leaf);
|
||||
|
||||
Z.open();
|
||||
try {
|
||||
final TextBlock textBlock = getTextBlock();
|
||||
textBlock.drawU(ug);
|
||||
final XDimension2D dim = textBlock.calculateDimension(ug.getStringBounder());
|
||||
return new ImageDataSimple(dim);
|
||||
} catch (Throwable e) {
|
||||
SmetanaDebug.printMe();
|
||||
return ImageDataSimple.error();
|
||||
} finally {
|
||||
Z.close();
|
||||
}
|
||||
}
|
||||
|
||||
private ImageData createFileLocked(OutputStream os, List<String> dotStrings, FileFormatOption fileFormatOption)
|
||||
throws IOException {
|
||||
|
||||
@ -346,48 +365,7 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
||||
|
||||
Z.open();
|
||||
try {
|
||||
final ST_Agraph_s g = agopen(new CString("g"), Z.z().Agdirected, null);
|
||||
|
||||
// printCluster(g, root);
|
||||
exportEntities(g, getUnpackagedEntities());
|
||||
exportGroups(g, diagram.getEntityFactory().getRootGroup());
|
||||
|
||||
// for (ILeaf leaf : diagram.getLeafsvalues()) {
|
||||
// final Shape shape = bibliotekon.getShape(leaf);
|
||||
// final Agnode_s node = agnode(g, new CString(shape.getUid()), true);
|
||||
// agsafeset(node, new CString("shape"), new CString("box"), new CString(""));
|
||||
// final String width = "" + (shape.getWidth() / 72);
|
||||
// final String height = "" + (shape.getHeight() / 72);
|
||||
// agsafeset(node, new CString("width"), new CString(width), new CString(""));
|
||||
// agsafeset(node, new CString("height"), new CString(height), new CString(""));
|
||||
// nodes.put(leaf, node);
|
||||
// // System.err
|
||||
// // .println("NODE " + leaf.getUid() + " [shape=box, width=" + width + ",
|
||||
// height=" + height + "]");
|
||||
// }
|
||||
//
|
||||
for (Link link : diagram.getLinks()) {
|
||||
// System.err.println("link=" + link);
|
||||
final ST_Agedge_s e = createEdge(g, link);
|
||||
// System.err.println("Agedge_s=" + e);
|
||||
if (e != null)
|
||||
edges.put(link, e);
|
||||
|
||||
}
|
||||
|
||||
final ST_GVC_s gvc = gvContext();
|
||||
SmetanaDebug.reset();
|
||||
gvLayoutJobs(gvc, g);
|
||||
SmetanaDebug.printMe();
|
||||
|
||||
// for (Agedge_s e : edges.values()) {
|
||||
// DebugUtils.printDebugEdge(e);
|
||||
// }
|
||||
|
||||
final MinMax minMax = TextBlockUtils.getMinMax(new Drawing(null, null), stringBounder, false);
|
||||
|
||||
// imageBuilder.setUDrawable(new Drawing(new YMirror(dim.getHeight())));
|
||||
final TextBlock drawable = new Drawing(new YMirror(minMax.getMaxY()), minMax);
|
||||
final TextBlock drawable = getTextBlock();
|
||||
return diagram.createImageBuilder(fileFormatOption).drawable(drawable).write(os);
|
||||
} catch (Throwable e) {
|
||||
SmetanaDebug.printMe();
|
||||
@ -399,6 +377,52 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
||||
}
|
||||
}
|
||||
|
||||
private TextBlock getTextBlock() {
|
||||
final ST_Agraph_s g = agopen(new CString("g"), Z.z().Agdirected, null);
|
||||
|
||||
// printCluster(g, root);
|
||||
exportEntities(g, getUnpackagedEntities());
|
||||
exportGroups(g, diagram.getEntityFactory().getRootGroup());
|
||||
|
||||
// for (ILeaf leaf : diagram.getLeafsvalues()) {
|
||||
// final Shape shape = bibliotekon.getShape(leaf);
|
||||
// final Agnode_s node = agnode(g, new CString(shape.getUid()), true);
|
||||
// agsafeset(node, new CString("shape"), new CString("box"), new CString(""));
|
||||
// final String width = "" + (shape.getWidth() / 72);
|
||||
// final String height = "" + (shape.getHeight() / 72);
|
||||
// agsafeset(node, new CString("width"), new CString(width), new CString(""));
|
||||
// agsafeset(node, new CString("height"), new CString(height), new CString(""));
|
||||
// nodes.put(leaf, node);
|
||||
// // System.err
|
||||
// // .println("NODE " + leaf.getUid() + " [shape=box, width=" + width + ",
|
||||
// height=" + height + "]");
|
||||
// }
|
||||
//
|
||||
for (Link link : diagram.getLinks()) {
|
||||
// System.err.println("link=" + link);
|
||||
final ST_Agedge_s e = createEdge(g, link);
|
||||
// System.err.println("Agedge_s=" + e);
|
||||
if (e != null)
|
||||
edges.put(link, e);
|
||||
|
||||
}
|
||||
|
||||
final ST_GVC_s gvc = gvContext();
|
||||
SmetanaDebug.reset();
|
||||
gvLayoutJobs(gvc, g);
|
||||
SmetanaDebug.printMe();
|
||||
|
||||
// for (Agedge_s e : edges.values()) {
|
||||
// DebugUtils.printDebugEdge(e);
|
||||
// }
|
||||
|
||||
final MinMax minMax = TextBlockUtils.getMinMax(new Drawing(null, null), stringBounder, false);
|
||||
|
||||
// imageBuilder.setUDrawable(new Drawing(new YMirror(dim.getHeight())));
|
||||
final TextBlock drawable = new Drawing(new YMirror(minMax.getMaxY()), minMax);
|
||||
return drawable;
|
||||
}
|
||||
|
||||
private void exportGroups(ST_Agraph_s graph, EntityImp parent) {
|
||||
for (EntityImp g : diagram.getChildrenGroups(parent)) {
|
||||
if (g.isRemoved())
|
||||
|
@ -71,6 +71,7 @@ import net.sourceforge.plantuml.sequencediagram.teoz.SequenceDiagramFileMakerTeo
|
||||
import net.sourceforge.plantuml.skin.rose.Rose;
|
||||
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
|
||||
import net.sourceforge.plantuml.ugraphic.ImageBuilder;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.xmi.SequenceDiagramXmiMaker;
|
||||
|
||||
public class SequenceDiagram extends UmlDiagram {
|
||||
@ -283,6 +284,12 @@ public class SequenceDiagram extends UmlDiagram {
|
||||
return sequenceDiagramPngMaker.createOne(os, index, fileFormat.isWithMetadata());
|
||||
}
|
||||
|
||||
@Override
|
||||
final public ImageData exportDiagramGraphic(UGraphic ug) {
|
||||
final FileMaker sequenceDiagramPngMaker = getSequenceDiagramPngMaker(0, new FileFormatOption(FileFormat.PNG));
|
||||
return sequenceDiagramPngMaker.createOneGraphic(ug);
|
||||
}
|
||||
|
||||
// support for CommandReturn
|
||||
private final Stack<AbstractMessage> activationState = new Stack<>();
|
||||
|
||||
|
@ -39,10 +39,13 @@ import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
|
||||
public interface FileMaker {
|
||||
|
||||
ImageData createOne(OutputStream os, int index, boolean isWithMetadata) throws IOException;
|
||||
|
||||
ImageData createOneGraphic(UGraphic ug);
|
||||
|
||||
public int getNbPages();
|
||||
}
|
@ -45,6 +45,7 @@ import java.util.Map;
|
||||
import net.sourceforge.plantuml.AnnotatedBuilder;
|
||||
import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.ISkinParam;
|
||||
import net.sourceforge.plantuml.api.ImageDataSimple;
|
||||
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.cucadiagram.Display;
|
||||
@ -133,8 +134,21 @@ public class SequenceDiagramFileMakerPuma2 implements FileMaker {
|
||||
newpageHeight, title);
|
||||
}
|
||||
|
||||
public ImageData createOne(OutputStream os, final int index, boolean isWithMetadata) throws IOException {
|
||||
@Override
|
||||
public ImageData createOneGraphic(UGraphic ug) {
|
||||
final UDrawable drawable = createUDrawable(0);
|
||||
drawable.drawU(ug);
|
||||
return new ImageDataSimple(100, 100);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageData createOne(OutputStream os, final int index, boolean isWithMetadata) throws IOException {
|
||||
final UDrawable drawable = createUDrawable(index);
|
||||
return diagram.createImageBuilder(fileFormatOption).drawable(drawable).write(os);
|
||||
}
|
||||
|
||||
private UDrawable createUDrawable(final int index) {
|
||||
final Page page = pages.get(index);
|
||||
final AnnotatedBuilder builder = new AnnotatedBuilder(diagram, diagram.getSkinParam(), stringBounder);
|
||||
double pageHeight = page.getHeight();
|
||||
@ -206,7 +220,7 @@ public class SequenceDiagramFileMakerPuma2 implements FileMaker {
|
||||
}
|
||||
|
||||
};
|
||||
return diagram.createImageBuilder(fileFormatOption).drawable(drawable).write(os);
|
||||
return drawable;
|
||||
}
|
||||
|
||||
private void drawFooter(SequenceDiagramArea area, UGraphic ug, int page) {
|
||||
|
@ -56,6 +56,7 @@ import net.sourceforge.plantuml.security.SecurityUtils;
|
||||
import net.sourceforge.plantuml.sequencediagram.Event;
|
||||
import net.sourceforge.plantuml.sequencediagram.Participant;
|
||||
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.txt.UGraphicTxt;
|
||||
|
||||
public class SequenceDiagramTxtMaker implements FileMaker {
|
||||
@ -141,4 +142,10 @@ public class SequenceDiagramTxtMaker implements FileMaker {
|
||||
public int getNbPages() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageData createOneGraphic(UGraphic ug) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -285,4 +285,9 @@ public class SequenceDiagramFileMakerTeoz implements FileMaker {
|
||||
printAligned(ug, diagram.getFooterOrHeaderTeoz(FontParam.FOOTER).getHorizontalAlignment(), footer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageData createOneGraphic(UGraphic ug) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -41,9 +41,12 @@ import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
|
||||
public interface CucaDiagramFileMaker {
|
||||
|
||||
public ImageData createFile(OutputStream os, List<String> dotStrings, FileFormatOption fileFormatOption)
|
||||
throws IOException;
|
||||
|
||||
public ImageData createOneGraphic(UGraphic ug);
|
||||
}
|
||||
|
@ -54,6 +54,7 @@ import net.sourceforge.plantuml.cucadiagram.dot.CucaDiagramSimplifierState;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DotData;
|
||||
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
||||
import net.sourceforge.plantuml.log.Logme;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
|
||||
public final class CucaDiagramFileMakerSvek implements CucaDiagramFileMaker {
|
||||
// ::remove file when WASM
|
||||
@ -74,6 +75,11 @@ public final class CucaDiagramFileMakerSvek implements CucaDiagramFileMaker {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageData createOneGraphic(UGraphic ug) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
private GeneralImageBuilder createDotDataImageBuilder(DotMode dotMode, StringBounder stringBounder) {
|
||||
final DotData dotData = new DotData(diagram.getEntityFactory().getRootGroup(), getOrderedLinks(),
|
||||
diagram.getLeafsvalues(), diagram.getUmlDiagramType(), diagram.getSkinParam(), diagram, diagram,
|
||||
|
@ -50,6 +50,8 @@ import java.util.Set;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
|
||||
import com.plantuml.wasm.WasmLog;
|
||||
|
||||
import net.sourceforge.plantuml.AnimatedGifEncoder;
|
||||
import net.sourceforge.plantuml.AnnotatedBuilder;
|
||||
import net.sourceforge.plantuml.AnnotatedWorker;
|
||||
@ -291,7 +293,7 @@ public class ImageBuilder {
|
||||
/ 96.0;
|
||||
if (scaleFactor <= 0)
|
||||
throw new IllegalStateException("Bad scaleFactor");
|
||||
|
||||
WasmLog.log("...image drawing...");
|
||||
// ::comment when WASM
|
||||
UGraphic ug = createUGraphic(dim, animationArg, dx, dy, scaleFactor,
|
||||
titledDiagram == null ? new Pragma() : titledDiagram.getPragma());
|
||||
|
@ -36,6 +36,7 @@ package net.sourceforge.plantuml.ugraphic.debug;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.awt.geom.XDimension2D;
|
||||
import net.sourceforge.plantuml.klimt.font.StringBounderRaw;
|
||||
@ -44,6 +45,10 @@ import net.sourceforge.plantuml.klimt.font.UFont;
|
||||
public class StringBounderDebug extends StringBounderRaw {
|
||||
// ::remove folder when WASM
|
||||
|
||||
public StringBounderDebug() {
|
||||
super(FileFormat.gg.getFontRenderContext());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected XDimension2D calculateDimensionInternal(UFont font, String text) {
|
||||
final Random rnd = new Random(StringUtils.seed(text));
|
||||
|
@ -81,7 +81,7 @@ public class Version {
|
||||
}
|
||||
|
||||
public static int beta() {
|
||||
final int beta = 1;
|
||||
final int beta = 2;
|
||||
return beta;
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,7 @@ import net.sourceforge.plantuml.core.ImageData;
|
||||
import net.sourceforge.plantuml.log.Logme;
|
||||
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
|
||||
import net.sourceforge.plantuml.sequencediagram.graphic.FileMaker;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.xml.XmlFactories;
|
||||
|
||||
public final class SequenceDiagramXmiMaker implements FileMaker {
|
||||
@ -54,9 +55,9 @@ public final class SequenceDiagramXmiMaker implements FileMaker {
|
||||
xmi = new XmiSequenceDiagramArgo(diagram, document);
|
||||
else
|
||||
xmi = new XmiSequenceDiagramStandard(diagram, document);
|
||||
|
||||
|
||||
xmi.build();
|
||||
|
||||
|
||||
try {
|
||||
writeDocument(document, os);
|
||||
} catch (TransformerException | ParserConfigurationException e) {
|
||||
@ -64,8 +65,7 @@ public final class SequenceDiagramXmiMaker implements FileMaker {
|
||||
}
|
||||
return imageData;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public int getNbPages() {
|
||||
return 1;
|
||||
@ -83,4 +83,9 @@ public final class SequenceDiagramXmiMaker implements FileMaker {
|
||||
transformer.transform(source, resultat);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageData createOneGraphic(UGraphic ug) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user