1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-06-03 09:00:48 +00:00
plantuml/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java

526 lines
19 KiB
Java
Raw Normal View History

2015-04-07 18:26:58 +00:00
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
2019-01-16 18:34:41 +00:00
* (C) Copyright 2009-2020, Arnaud Roques
2015-04-07 18:26:58 +00:00
*
2016-03-06 16:47:34 +00:00
* Project Info: http://plantuml.com
2015-04-07 18:26:58 +00:00
*
2017-03-15 19:13:31 +00:00
* 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
*
2015-04-07 18:26:58 +00:00
* 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 net.sourceforge.plantuml.ugraphic;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.geom.Dimension2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
2019-09-14 18:12:04 +00:00
import java.util.Random;
2015-04-07 18:26:58 +00:00
import java.util.Set;
import javax.swing.ImageIcon;
import net.sourceforge.plantuml.AnimatedGifEncoder;
import net.sourceforge.plantuml.AnnotatedWorker;
2015-04-07 18:26:58 +00:00
import net.sourceforge.plantuml.CMapData;
2021-03-23 14:11:20 +00:00
import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.CornerParam;
2015-04-07 18:26:58 +00:00
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.EmptyImageBuilder;
import net.sourceforge.plantuml.FileFormat;
2015-05-31 18:56:03 +00:00
import net.sourceforge.plantuml.FileFormatOption;
2015-04-07 18:26:58 +00:00
import net.sourceforge.plantuml.FileUtils;
import net.sourceforge.plantuml.ISkinParam;
2021-03-23 14:11:20 +00:00
import net.sourceforge.plantuml.LineParam;
import net.sourceforge.plantuml.Scale;
import net.sourceforge.plantuml.SvgCharSizeHack;
import net.sourceforge.plantuml.TitledDiagram;
2015-04-07 18:26:58 +00:00
import net.sourceforge.plantuml.Url;
2021-03-23 14:11:20 +00:00
import net.sourceforge.plantuml.UseStyle;
2015-04-07 18:26:58 +00:00
import net.sourceforge.plantuml.anim.AffineTransformation;
import net.sourceforge.plantuml.anim.Animation;
import net.sourceforge.plantuml.api.ImageDataAbstract;
2015-04-07 18:26:58 +00:00
import net.sourceforge.plantuml.api.ImageDataComplex;
import net.sourceforge.plantuml.api.ImageDataSimple;
2016-07-25 19:25:28 +00:00
import net.sourceforge.plantuml.braille.UGraphicBraille;
2015-04-07 18:26:58 +00:00
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.eps.EpsStrategy;
2016-08-25 20:45:37 +00:00
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.graphic.TextBlock;
2015-04-07 18:26:58 +00:00
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.mjpeg.MJPEGGenerator;
2020-05-30 15:20:23 +00:00
import net.sourceforge.plantuml.security.ImageIO;
import net.sourceforge.plantuml.security.SFile;
2021-03-23 14:11:20 +00:00
import net.sourceforge.plantuml.skin.rose.Rose;
import net.sourceforge.plantuml.style.ClockwiseTopRightBottomLeft;
2021-03-23 14:11:20 +00:00
import net.sourceforge.plantuml.style.PName;
import net.sourceforge.plantuml.style.SName;
import net.sourceforge.plantuml.style.Style;
import net.sourceforge.plantuml.style.StyleSignature;
import net.sourceforge.plantuml.svek.TextBlockBackcolored;
2021-01-10 20:52:19 +00:00
import net.sourceforge.plantuml.svg.LengthAdjust;
2020-03-18 10:50:02 +00:00
import net.sourceforge.plantuml.ugraphic.color.ColorMapper;
2021-03-23 14:11:20 +00:00
import net.sourceforge.plantuml.ugraphic.color.ColorMapperIdentity;
2020-03-18 10:50:02 +00:00
import net.sourceforge.plantuml.ugraphic.color.HColor;
import net.sourceforge.plantuml.ugraphic.color.HColorBackground;
import net.sourceforge.plantuml.ugraphic.color.HColorGradient;
import net.sourceforge.plantuml.ugraphic.color.HColorSimple;
import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
import net.sourceforge.plantuml.ugraphic.debug.UGraphicDebug;
2015-04-07 18:26:58 +00:00
import net.sourceforge.plantuml.ugraphic.eps.UGraphicEps;
import net.sourceforge.plantuml.ugraphic.g2d.UGraphicG2d;
import net.sourceforge.plantuml.ugraphic.hand.UGraphicHandwritten;
import net.sourceforge.plantuml.ugraphic.html5.UGraphicHtml5;
import net.sourceforge.plantuml.ugraphic.svg.UGraphicSvg;
import net.sourceforge.plantuml.ugraphic.tikz.UGraphicTikz;
2018-06-25 19:05:58 +00:00
import net.sourceforge.plantuml.ugraphic.txt.UGraphicTxt;
2015-04-07 18:26:58 +00:00
import net.sourceforge.plantuml.ugraphic.visio.UGraphicVdx;
public class ImageBuilder {
private double top;
private double right;
private double bottom;
private double left;
2015-04-07 18:26:58 +00:00
2021-03-23 14:11:20 +00:00
private Animation animation;
private boolean annotations;
private HColor backcolor = HColorUtils.WHITE;
2021-03-23 14:11:20 +00:00
private HColor borderColor;
private double borderCorner;
private UStroke borderStroke;
private ColorMapper colorMapper = new ColorMapperIdentity();
private int dpi = 96;
private boolean handwritten;
private LengthAdjust lengthAdjust = LengthAdjust.defaultValue();;
private TitledDiagram titledDiagram;
2015-04-07 18:26:58 +00:00
private UDrawable udrawable;
private final FileFormatOption fileFormatOption;
2021-03-23 14:11:20 +00:00
private Scale scale;
2021-03-23 13:06:33 +00:00
private long seed = 42;
private int status = 0;
2021-03-23 14:11:20 +00:00
private SvgCharSizeHack svgCharSizeHack = SvgCharSizeHack.NO_HACK;
private boolean svgDimensionStyle = true;
private String metadata;
2019-09-14 18:12:04 +00:00
private boolean randomPixel;
private String warningOrError;
2021-03-23 13:06:33 +00:00
public static ImageBuilder plainImageBuilder(UDrawable drawable, FileFormatOption fileFormatOption) {
2021-03-23 14:11:20 +00:00
return new ImageBuilder(drawable, fileFormatOption);
}
public static ImageBuilder plainPngBuilder(UDrawable drawable) {
2021-03-23 13:06:33 +00:00
return plainImageBuilder(drawable, new FileFormatOption(FileFormat.PNG));
}
// TODO do something with "index"
public static ImageBuilder styledImageBuilder(TitledDiagram diagram, UDrawable drawable, int index,
2021-03-23 13:06:33 +00:00
FileFormatOption fileFormatOption) {
2021-03-23 14:11:20 +00:00
return new ImageBuilder(drawable, fileFormatOption)
.styled(diagram);
}
2021-03-23 14:11:20 +00:00
private ImageBuilder(UDrawable drawable, FileFormatOption fileFormatOption) {
this.udrawable = drawable;
this.fileFormatOption = fileFormatOption;
if (drawable instanceof TextBlockBackcolored) {
backcolor = ((TextBlockBackcolored) drawable).getBackcolor();
}
}
public ImageBuilder annotations(boolean annotations) {
this.annotations = annotations;
return this;
}
public ImageBuilder backcolor(HColor backcolor) {
this.backcolor = backcolor;
return this;
}
public ImageBuilder blackBackcolor() {
return backcolor(HColorUtils.BLACK);
}
public ImageBuilder margin(ClockwiseTopRightBottomLeft margin) {
this.top = margin.getTop();
this.right = margin.getRight();
this.bottom = margin.getBottom();
this.left = margin.getLeft();
return this;
}
public ImageBuilder metadata(String metadata) {
this.metadata = metadata;
return this;
}
2016-11-04 21:39:29 +00:00
public ImageBuilder randomPixel() {
this.randomPixel = true;
return this;
}
2021-03-23 13:06:33 +00:00
public ImageBuilder seed(long seed) {
this.seed = seed;
return this;
}
public ImageBuilder status(int status) {
this.status = status;
return this;
}
public ImageBuilder warningOrError(String warningOrError) {
this.warningOrError = warningOrError;
return this;
}
2021-03-23 14:11:20 +00:00
private ImageBuilder styled(TitledDiagram diagram) {
final ISkinParam skinParam = diagram.getSkinParam();
animation = diagram.getAnimation();
annotations = true;
backcolor = calculateBackColor(diagram);
borderColor = new Rose().getHtmlColor(skinParam, ColorParam.diagramBorder);
borderCorner = skinParam.getRoundCorner(CornerParam.diagramBorder, null);
borderStroke = calculateBorderStroke(borderColor, skinParam);
colorMapper = skinParam.getColorMapper();
dpi = skinParam.getDpi();
handwritten = skinParam.handwritten();
lengthAdjust = skinParam.getlengthAdjust();
margin(calculateDiagramMargin(diagram));
metadata = fileFormatOption.isWithMetadata() ? diagram.getMetadata() : null;
scale = diagram.getScale();
seed = diagram.seed();
svgCharSizeHack = skinParam;
svgDimensionStyle = skinParam.svgDimensionStyle();
titledDiagram = diagram;
warningOrError = diagram.getWarningOrError();
return this;
}
public ImageData write(OutputStream os) throws IOException {
if (annotations && titledDiagram != null) {
if (!(udrawable instanceof TextBlock)) throw new IllegalStateException("udrawable is not a TextBlock");
final ISkinParam skinParam = titledDiagram.getSkinParam();
final StringBounder stringBounder = fileFormatOption.getDefaultStringBounder(skinParam);
final AnnotatedWorker annotatedWorker = new AnnotatedWorker(titledDiagram, skinParam, stringBounder);
udrawable = annotatedWorker.addAdd((TextBlock) udrawable);
}
2021-03-23 13:06:33 +00:00
final ImageData imageData = writeImageTOBEMOVED(fileFormatOption, os);
((ImageDataAbstract) imageData).setStatus(status);
return imageData;
2015-04-07 18:26:58 +00:00
}
public byte[] writeByteArray() throws IOException {
try (final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
write(baos);
return baos.toByteArray();
}
2015-04-07 18:26:58 +00:00
}
2021-03-23 13:06:33 +00:00
public ImageData writeImageTOBEMOVED(OutputStream os) throws IOException {
return writeImageTOBEMOVED(fileFormatOption, os);
}
2021-03-23 13:06:33 +00:00
public ImageData writeImageTOBEMOVED(FileFormatOption fileFormatOption, OutputStream os)
2017-04-19 18:30:16 +00:00
throws IOException {
2015-05-31 18:56:03 +00:00
final FileFormat fileFormat = fileFormatOption.getFileFormat();
2015-04-07 18:26:58 +00:00
if (fileFormat == FileFormat.MJPEG) {
2021-03-23 14:11:20 +00:00
return writeImageMjpeg(os, fileFormatOption.getDefaultStringBounder(svgCharSizeHack));
2015-04-07 18:26:58 +00:00
} else if (fileFormat == FileFormat.ANIMATED_GIF) {
2021-03-23 14:11:20 +00:00
return writeImageAnimatedGif(os, fileFormatOption.getDefaultStringBounder(svgCharSizeHack));
2015-04-07 18:26:58 +00:00
}
2021-03-23 14:11:20 +00:00
return writeImageInternal(fileFormatOption, os, animation);
2016-11-04 21:39:29 +00:00
}
2021-03-23 13:06:33 +00:00
private ImageData writeImageInternal(FileFormatOption fileFormatOption, OutputStream os,
2017-04-19 18:30:16 +00:00
Animation animationArg) throws IOException {
2021-03-23 14:11:20 +00:00
Dimension2D dim = getFinalDimension(fileFormatOption.getDefaultStringBounder(svgCharSizeHack));
2015-04-07 18:26:58 +00:00
double dx = 0;
double dy = 0;
2016-03-06 16:47:34 +00:00
if (animationArg != null) {
2021-03-23 14:11:20 +00:00
final MinMax minmax = animationArg.getMinMax(dim);
2016-03-06 16:47:34 +00:00
animationArg.setDimension(dim);
2015-04-07 18:26:58 +00:00
dim = minmax.getDimension();
dx = -minmax.getMinX();
dy = -minmax.getMinY();
}
2021-03-23 13:06:33 +00:00
final UGraphic2 ug = createUGraphic(fileFormatOption, dim, animationArg, dx, dy);
2020-09-30 20:57:58 +00:00
UGraphic ug2 = ug;
2020-12-06 21:43:09 +00:00
2020-09-30 20:57:58 +00:00
if (borderStroke != null) {
2021-03-23 14:11:20 +00:00
final HColor color = borderColor == null ? HColorUtils.BLACK : borderColor;
2020-12-06 21:43:09 +00:00
final double width = dim.getWidth() - borderStroke.getThickness();
final double height = dim.getHeight() - borderStroke.getThickness();
2021-03-23 14:11:20 +00:00
final URectangle shape = new URectangle(width, height).rounded(borderCorner);
2020-09-30 20:57:58 +00:00
ug2.apply(color).apply(borderStroke).draw(shape);
2016-09-29 19:51:18 +00:00
}
2020-09-30 20:57:58 +00:00
if (randomPixel) {
drawRandomPoint(ug2);
}
ug2 = ug2.apply(new UTranslate(left, top));
final UGraphic ugDecored = handwritten(ug2);
udrawable.drawU(ugDecored);
ugDecored.flushUg();
ug.writeImageTOBEMOVED(os, metadata, 96);
2020-09-30 20:57:58 +00:00
os.flush();
if (ug instanceof UGraphicG2d) {
final Set<Url> urls = ((UGraphicG2d) ug).getAllUrlsEncountered();
if (urls.size() > 0) {
2021-03-23 14:11:20 +00:00
final CMapData cmap = CMapData.cmapString(urls, dpi);
return new ImageDataComplex(dim, cmap, warningOrError);
2015-04-07 18:26:58 +00:00
}
}
2020-09-30 20:57:58 +00:00
return new ImageDataSimple(dim);
2015-04-07 18:26:58 +00:00
}
2019-09-14 18:12:04 +00:00
private void drawRandomPoint(UGraphic ug2) {
final Random rnd = new Random();
final int red = rnd.nextInt(40);
final int green = rnd.nextInt(40);
final int blue = rnd.nextInt(40);
final Color c = new Color(red, green, blue);
2020-03-18 10:50:02 +00:00
final HColor color = new HColorSimple(c, false);
2020-04-19 16:04:39 +00:00
ug2.apply(color).apply(color.bg()).draw(new URectangle(1, 1));
2019-09-14 18:12:04 +00:00
}
2016-08-25 20:45:37 +00:00
public Dimension2D getFinalDimension(StringBounder stringBounder) {
2019-05-24 19:59:31 +00:00
final Dimension2D dim;
2019-09-14 18:12:04 +00:00
final LimitFinder limitFinder = new LimitFinder(stringBounder, true);
udrawable.drawU(limitFinder);
dim = new Dimension2DDouble(limitFinder.getMaxX(), limitFinder.getMaxY());
return new Dimension2DDouble(dim.getWidth() + 1 + left + right, dim.getHeight() + 1 + top + bottom);
2016-03-06 16:47:34 +00:00
}
2015-04-07 18:26:58 +00:00
private UGraphic handwritten(UGraphic ug) {
2021-03-23 14:11:20 +00:00
if (handwritten) {
2015-04-07 18:26:58 +00:00
return new UGraphicHandwritten(ug);
}
2021-03-22 18:00:32 +00:00
// if (OptionFlags.OMEGA_CROSSING) {
// return new UGraphicCrossing(ug);
// } else {
return ug;
// }
2015-04-07 18:26:58 +00:00
}
2016-08-25 20:45:37 +00:00
private ImageData writeImageMjpeg(OutputStream os, StringBounder stringBounder) throws IOException {
2015-04-07 18:26:58 +00:00
2016-08-25 20:45:37 +00:00
final LimitFinder limitFinder = new LimitFinder(stringBounder, true);
2015-04-07 18:26:58 +00:00
udrawable.drawU(limitFinder);
final Dimension2D dim = new Dimension2DDouble(limitFinder.getMaxX() + 1 + left + right,
limitFinder.getMaxY() + 1 + top + bottom);
2015-04-07 18:26:58 +00:00
2020-05-30 15:20:23 +00:00
final SFile f = new SFile("c:/tmp.avi");
2015-04-07 18:26:58 +00:00
final int nbframe = 100;
2020-03-18 10:50:02 +00:00
final MJPEGGenerator m = new MJPEGGenerator(f, getAviImage(null).getWidth(null),
getAviImage(null).getHeight(null), 12.0, nbframe);
2015-04-07 18:26:58 +00:00
for (int i = 0; i < nbframe; i++) {
// AffineTransform at = AffineTransform.getRotateInstance(1.0);
AffineTransform at = AffineTransform.getTranslateInstance(dim.getWidth() / 2, dim.getHeight() / 2);
at.rotate(90.0 * Math.PI / 180.0 * i / 100);
at.translate(-dim.getWidth() / 2, -dim.getHeight() / 2);
// final AffineTransform at = AffineTransform.getTranslateInstance(i, 0);
// final ImageIcon ii = new ImageIcon(getAviImage(at));
// m.addImage(ii.getImage());
throw new UnsupportedOperationException();
}
m.finishAVI();
FileUtils.copyToStream(f, os);
return new ImageDataSimple(dim);
}
2016-08-25 20:45:37 +00:00
private ImageData writeImageAnimatedGif(OutputStream os, StringBounder stringBounder) throws IOException {
2015-04-07 18:26:58 +00:00
2016-08-25 20:45:37 +00:00
final LimitFinder limitFinder = new LimitFinder(stringBounder, true);
2015-04-07 18:26:58 +00:00
udrawable.drawU(limitFinder);
final Dimension2D dim = new Dimension2DDouble(limitFinder.getMaxX() + 1 + left + right,
limitFinder.getMaxY() + 1 + top + bottom);
2015-04-07 18:26:58 +00:00
2021-03-23 14:11:20 +00:00
final MinMax minmax = animation.getMinMax(dim);
2015-04-07 18:26:58 +00:00
final AnimatedGifEncoder e = new AnimatedGifEncoder();
// e.setQuality(1);
e.setRepeat(0);
e.start(os);
// e.setDelay(1000); // 1 frame per sec
// e.setDelay(100); // 10 frame per sec
e.setDelay(60); // 16 frame per sec
// e.setDelay(50); // 20 frame per sec
2021-03-23 14:11:20 +00:00
for (AffineTransformation at : animation.getAll()) {
2015-04-07 18:26:58 +00:00
final ImageIcon ii = new ImageIcon(getAviImage(at));
e.addFrame((BufferedImage) ii.getImage());
}
e.finish();
return new ImageDataSimple(dim);
}
private Image getAviImage(AffineTransformation affineTransform) throws IOException {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
2021-03-23 13:06:33 +00:00
writeImageInternal(new FileFormatOption(FileFormat.PNG), baos, Animation.singleton(affineTransform));
2015-04-07 18:26:58 +00:00
baos.close();
final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
final Image im = ImageIO.read(bais);
bais.close();
return im;
}
2021-03-23 13:06:33 +00:00
private UGraphic2 createUGraphic(FileFormatOption option, final Dimension2D dim, Animation animationArg,
2020-12-06 21:43:09 +00:00
double dx, double dy) {
2021-03-23 14:11:20 +00:00
final double scaleFactor = (scale == null ? 1 : scale.getScale(dim.getWidth(), dim.getHeight())) * dpi / 96.0;
2020-12-06 21:43:09 +00:00
final FileFormat fileFormat = option.getFileFormat();
2015-04-07 18:26:58 +00:00
switch (fileFormat) {
case PNG:
return createUGraphicPNG(colorMapper, scaleFactor, dim, backcolor, animationArg, dx, dy,
2020-12-06 21:43:09 +00:00
option.getWatermark());
2015-04-07 18:26:58 +00:00
case SVG:
return createUGraphicSVG(colorMapper, scaleFactor, dim, backcolor, option.getSvgLinkTarget(),
2021-03-23 14:11:20 +00:00
option.getHoverColor(), option.getPreserveAspectRatio(), lengthAdjust);
2015-04-07 18:26:58 +00:00
case EPS:
return new UGraphicEps(colorMapper, EpsStrategy.getDefault2());
case EPS_TEXT:
return new UGraphicEps(colorMapper, EpsStrategy.WITH_MACRO_AND_TEXT);
case HTML5:
return new UGraphicHtml5(colorMapper);
case VDX:
return new UGraphicVdx(colorMapper);
case LATEX:
return new UGraphicTikz(colorMapper, scaleFactor, true, option.getTikzFontDistortion());
2016-03-06 16:47:34 +00:00
case LATEX_NO_PREAMBLE:
return new UGraphicTikz(colorMapper, scaleFactor, false, option.getTikzFontDistortion());
2016-07-25 19:25:28 +00:00
case BRAILLE_PNG:
return new UGraphicBraille(colorMapper, fileFormat);
2019-04-21 20:40:01 +00:00
case UTXT:
2018-06-25 19:05:58 +00:00
case ATXT:
return new UGraphicTxt();
case DEBUG:
return new UGraphicDebug();
2015-04-07 18:26:58 +00:00
default:
throw new UnsupportedOperationException(fileFormat.toString());
}
}
private UGraphic2 createUGraphicSVG(ColorMapper colorMapper, double scaleFactor, Dimension2D dim,
2021-03-23 13:06:33 +00:00
final HColor suggested, String svgLinkTarget, String hover, String preserveAspectRatio,
LengthAdjust lengthAdjust) {
2020-04-26 18:31:41 +00:00
HColor backColor = HColorUtils.WHITE;
if (suggested instanceof HColorSimple) {
backColor = suggested;
2015-04-07 18:26:58 +00:00
}
final UGraphicSvg ug;
2020-04-26 18:31:41 +00:00
if (suggested instanceof HColorGradient) {
2021-03-23 14:11:20 +00:00
ug = new UGraphicSvg(svgDimensionStyle, dim, colorMapper, (HColorGradient) suggested, false, scaleFactor,
svgLinkTarget, hover, seed, preserveAspectRatio, svgCharSizeHack, lengthAdjust);
2020-04-26 18:31:41 +00:00
} else if (backColor == null || colorMapper.toColor(backColor).equals(Color.WHITE)) {
2021-03-23 14:11:20 +00:00
ug = new UGraphicSvg(svgDimensionStyle, dim, colorMapper, false, scaleFactor, svgLinkTarget, hover, seed,
preserveAspectRatio, svgCharSizeHack, lengthAdjust);
2015-04-07 18:26:58 +00:00
} else {
2020-06-07 10:03:18 +00:00
final String tmp = colorMapper.toSvg(backColor);
2021-03-23 14:11:20 +00:00
ug = new UGraphicSvg(svgDimensionStyle, dim, colorMapper, tmp, false, scaleFactor, svgLinkTarget, hover, seed,
preserveAspectRatio, svgCharSizeHack, lengthAdjust);
2015-04-07 18:26:58 +00:00
}
return ug;
}
private UGraphic2 createUGraphicPNG(ColorMapper colorMapper, double scaleFactor, final Dimension2D dim,
2020-04-26 18:31:41 +00:00
HColor mybackcolor, Animation affineTransforms, double dx, double dy, String watermark) {
2015-04-07 18:26:58 +00:00
Color backColor = Color.WHITE;
2020-03-18 10:50:02 +00:00
if (mybackcolor instanceof HColorSimple) {
2020-04-26 18:31:41 +00:00
backColor = colorMapper.toColor(mybackcolor);
2020-03-18 10:50:02 +00:00
} else if (mybackcolor instanceof HColorBackground) {
2015-04-07 18:26:58 +00:00
backColor = null;
}
final EmptyImageBuilder builder = new EmptyImageBuilder(watermark, (int) (dim.getWidth() * scaleFactor),
(int) (dim.getHeight() * scaleFactor), backColor);
2015-04-07 18:26:58 +00:00
final Graphics2D graphics2D = builder.getGraphics2D();
final UGraphicG2d ug = new UGraphicG2d(colorMapper, graphics2D, scaleFactor,
2020-03-18 10:50:02 +00:00
affineTransforms == null ? null : affineTransforms.getFirst(), dx, dy);
2015-04-07 18:26:58 +00:00
ug.setBufferedImage(builder.getBufferedImage());
final BufferedImage im = ((UGraphicG2d) ug).getBufferedImage();
2020-03-18 10:50:02 +00:00
if (mybackcolor instanceof HColorGradient) {
ug.apply(mybackcolor.bg()).draw(new URectangle(im.getWidth() / scaleFactor, im.getHeight() / scaleFactor));
2015-04-07 18:26:58 +00:00
}
return ug;
}
2021-03-23 14:11:20 +00:00
private static HColor calculateBackColor(TitledDiagram diagram) {
if (UseStyle.useBetaStyle()) {
final Style style = StyleSignature
.of(SName.root, SName.document, diagram.getUmlDiagramType().getStyleName())
.getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder());
HColor backgroundColor = style.value(PName.BackGroundColor)
.asColor(diagram.getSkinParam().getIHtmlColorSet());
if (backgroundColor == null) {
backgroundColor = HColorUtils.transparent();
}
return backgroundColor;
}
return diagram.getSkinParam().getBackgroundColor(false);
}
private static UStroke calculateBorderStroke(HColor borderColor, ISkinParam skinParam) {
final UStroke thickness = skinParam.getThickness(LineParam.diagramBorder, null);
return (thickness == null && borderColor != null) ? new UStroke() : thickness;
}
private static ClockwiseTopRightBottomLeft calculateDiagramMargin(TitledDiagram diagram) {
if (UseStyle.useBetaStyle()) {
final Style style = StyleSignature.of(SName.root, SName.document)
.getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder());
if (style.hasValue(PName.Margin)) {
return style.getMargin();
}
}
return diagram.getDefaultMargins();
}
2015-04-07 18:26:58 +00:00
}