diff --git a/pom.xml b/pom.xml index d04f0b847..8c7b76ac0 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ net.sourceforge.plantuml plantuml - 1.2020.8-SNAPSHOT + 1.2020.9-SNAPSHOT jar PlantUML diff --git a/src/jcckit/util/ConfigParameters.java b/src/jcckit/util/ConfigParameters.java index 7d28374b3..bfa4ae177 100644 --- a/src/jcckit/util/ConfigParameters.java +++ b/src/jcckit/util/ConfigParameters.java @@ -303,7 +303,7 @@ public class ConfigParameters { static private HColorSet colors = HColorSet.instance(); private Color decodeInternal(String value) { if (colors.getColorIfValid(value)!=null) { - return new ColorMapperIdentity().getMappedColor(colors.getColorIfValid(value)); + return new ColorMapperIdentity().toColor(colors.getColorIfValid(value)); } return Color.decode(value); } diff --git a/src/net/sourceforge/plantuml/AnnotatedWorker.java b/src/net/sourceforge/plantuml/AnnotatedWorker.java index 5c86cc8f7..e70643fc6 100644 --- a/src/net/sourceforge/plantuml/AnnotatedWorker.java +++ b/src/net/sourceforge/plantuml/AnnotatedWorker.java @@ -97,9 +97,9 @@ public class AnnotatedWorker { final double y1 = 10; final double y2 = 10; - final SymbolContext symbolContext = new SymbolContext(getSkinParam().getBackgroundColor(), HColorUtils.BLACK) + final SymbolContext symbolContext = new SymbolContext(getSkinParam().getBackgroundColor(false), HColorUtils.BLACK) .withShadow(getSkinParam().shadowing(null) ? 3 : 0); - final MinMax originalMinMax = TextBlockUtils.getMinMax(original, stringBounder); + final MinMax originalMinMax = TextBlockUtils.getMinMax(original, stringBounder, false); final TextBlock title = mainFrame.create(new FontConfiguration(getSkinParam(), FontParam.CAPTION, null), HorizontalAlignment.CENTER, getSkinParam()); final Dimension2D dimTitle = title.calculateDimension(stringBounder); @@ -118,7 +118,7 @@ public class AnnotatedWorker { } public MinMax getMinMax(StringBounder stringBounder) { - return TextBlockUtils.getMinMax(this, stringBounder); + return TextBlockUtils.getMinMax(this, stringBounder, false); } public Rectangle2D getInnerPosition(String member, StringBounder stringBounder, InnerStrategy strategy) { diff --git a/src/net/sourceforge/plantuml/ColorParam.java b/src/net/sourceforge/plantuml/ColorParam.java index 36c5ddacb..5b6041431 100644 --- a/src/net/sourceforge/plantuml/ColorParam.java +++ b/src/net/sourceforge/plantuml/ColorParam.java @@ -86,6 +86,7 @@ public enum ColorParam { interfaceBackground(HColorUtils.MY_YELLOW, true, ColorType.BACK), interfaceBorder(HColorUtils.MY_RED, ColorType.LINE), arrow(HColorUtils.MY_RED, ColorType.ARROW), + arrowHead(HColorUtils.MY_RED, null), stateBackground(HColorUtils.MY_YELLOW, true, ColorType.BACK), stateBorder(HColorUtils.MY_RED, ColorType.LINE), diff --git a/src/net/sourceforge/plantuml/EmptyImageBuilder.java b/src/net/sourceforge/plantuml/EmptyImageBuilder.java index a7801f8ff..d9beebba2 100644 --- a/src/net/sourceforge/plantuml/EmptyImageBuilder.java +++ b/src/net/sourceforge/plantuml/EmptyImageBuilder.java @@ -36,9 +36,14 @@ package net.sourceforge.plantuml; import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.List; import net.sourceforge.plantuml.cucadiagram.dot.GraphvizUtils; import net.sourceforge.plantuml.ugraphic.UAntiAliasing; @@ -50,11 +55,11 @@ public class EmptyImageBuilder { private final BufferedImage im; private final Graphics2D g2d; - public EmptyImageBuilder(double width, double height, Color background) { - this((int) width, (int) height, background); + public EmptyImageBuilder(String watermark, double width, double height, Color background) { + this(watermark, (int) width, (int) height, background); } - public EmptyImageBuilder(int width, int height, Color background) { + public EmptyImageBuilder(String watermark, int width, int height, Color background) { if (width > GraphvizUtils.getenvImageLimit()) { Log.info("Width too large " + width + ". You should set PLANTUML_LIMIT_SIZE"); width = GraphvizUtils.getenvImageLimit(); @@ -64,18 +69,84 @@ public class EmptyImageBuilder { height = GraphvizUtils.getenvImageLimit(); } Log.info("Creating image " + width + "x" + height); - im = new BufferedImage(width, height, background == null ? BufferedImage.TYPE_INT_ARGB - : BufferedImage.TYPE_INT_RGB); + im = new BufferedImage(width, height, getType(background)); g2d = im.createGraphics(); UAntiAliasing.ANTI_ALIASING_ON.apply(g2d); if (background != null) { g2d.setColor(background); g2d.fillRect(0, 0, width, height); } + if (watermark != null) { + final int gray = 200; + g2d.setColor(new Color(gray, gray, gray)); + printWatermark(watermark, width, height); + } } - public EmptyImageBuilder(int width, int height, Color background, double dpiFactor) { - this(width * dpiFactor, height * dpiFactor, background); + private int getType(Color background) { + if (background == null) { + return BufferedImage.TYPE_INT_ARGB; + } + if (background.getAlpha() != 255) { + return BufferedImage.TYPE_INT_ARGB; + } + return BufferedImage.TYPE_INT_RGB; + } + + private void printWatermark(String watermark, int maxWidth, int maxHeight) { + final Font javaFont = g2d.getFont(); + final FontMetrics fm = g2d.getFontMetrics(javaFont); + final Rectangle2D rect = fm.getStringBounds(watermark, g2d); + final int height = (int) rect.getHeight(); + final int width = (int) rect.getWidth(); + if (height < 2 || width < 2) { + return; + } + if (width <= maxWidth) + for (int y = height; y < maxHeight; y += height + 1) { + for (int x = 0; x < maxWidth; x += width + 10) { + g2d.drawString(watermark, x, y); + } + } + else { + final List withBreaks = withBreaks(watermark, javaFont, fm, maxWidth); + int y = 0; + while (y < maxHeight) { + for (String s : withBreaks) { + g2d.drawString(s, 0, y); + y += (int) fm.getStringBounds(s, g2d).getHeight(); + } + y += 10; + } + } + } + + private int getWidth(String line, Font javaFont, FontMetrics fm) { + final Rectangle2D rect = fm.getStringBounds(line, g2d); + return (int) rect.getWidth(); + } + + private List withBreaks(String watermark, Font javaFont, FontMetrics fm, int maxWidth) { + final String[] words = watermark.split("\\s+"); + final List result = new ArrayList(); + String pending = ""; + for (String word : words) { + final String candidate = pending.length() == 0 ? word : pending + " " + word; + if (getWidth(candidate, javaFont, fm) < maxWidth) { + pending = candidate; + } else { + result.add(pending); + pending = word; + } + } + if (pending.length() > 0) { + result.add(pending); + } + return result; + } + + public EmptyImageBuilder(String watermark, int width, int height, Color background, double dpiFactor) { + this(watermark, width * dpiFactor, height * dpiFactor, background); if (dpiFactor != 1.0) { g2d.setTransform(AffineTransform.getScaleInstance(dpiFactor, dpiFactor)); } diff --git a/src/net/sourceforge/plantuml/FileFormatOption.java b/src/net/sourceforge/plantuml/FileFormatOption.java index dc8ee678a..d876449d6 100644 --- a/src/net/sourceforge/plantuml/FileFormatOption.java +++ b/src/net/sourceforge/plantuml/FileFormatOption.java @@ -58,13 +58,38 @@ public final class FileFormatOption implements Serializable { private final TikzFontDistortion tikzFontDistortion; private final double scale; private final String preserveAspectRatio; + private final String watermark; public double getScaleCoef() { return scale; } public FileFormatOption(FileFormat fileFormat) { - this(fileFormat, null, true, false, "_top", false, null, TikzFontDistortion.getDefault(), 1.0, "none"); + this(fileFormat, null, true, false, "_top", false, null, TikzFontDistortion.getDefault(), 1.0, "none", null); + } + + public FileFormatOption(FileFormat fileFormat, boolean withMetadata) { + this(fileFormat, null, withMetadata, false, "_top", false, null, TikzFontDistortion.getDefault(), 1.0, "none", + null); + } + + private FileFormatOption(FileFormat fileFormat, AffineTransform at, boolean withMetadata, boolean useRedForError, + String svgLinkTarget, boolean debugsvek, String hoverColor, TikzFontDistortion tikzFontDistortion, + double scale, String preserveAspectRatio, String watermark) { + this.hoverColor = hoverColor; + this.watermark = watermark; + this.fileFormat = fileFormat; + this.affineTransform = at; + this.withMetadata = withMetadata; + this.useRedForError = useRedForError; + this.svgLinkTarget = svgLinkTarget; + this.debugsvek = debugsvek; + this.tikzFontDistortion = tikzFontDistortion; + this.scale = scale; + this.preserveAspectRatio = preserveAspectRatio; + if (tikzFontDistortion == null) { + throw new IllegalArgumentException(); + } } public StringBounder getDefaultStringBounder() { @@ -83,56 +108,39 @@ public final class FileFormatOption implements Serializable { return preserveAspectRatio; } - public FileFormatOption(FileFormat fileFormat, boolean withMetadata) { - this(fileFormat, null, withMetadata, false, "_top", false, null, TikzFontDistortion.getDefault(), 1.0, "none"); - } - - private FileFormatOption(FileFormat fileFormat, AffineTransform at, boolean withMetadata, boolean useRedForError, - String svgLinkTarget, boolean debugsvek, String hoverColor, TikzFontDistortion tikzFontDistortion, - double scale, String preserveAspectRatio) { - this.hoverColor = hoverColor; - this.fileFormat = fileFormat; - this.affineTransform = at; - this.withMetadata = withMetadata; - this.useRedForError = useRedForError; - this.svgLinkTarget = svgLinkTarget; - this.debugsvek = debugsvek; - this.tikzFontDistortion = tikzFontDistortion; - this.scale = scale; - this.preserveAspectRatio = preserveAspectRatio; - if (tikzFontDistortion == null) { - throw new IllegalArgumentException(); - } - } - public FileFormatOption withUseRedForError() { return new FileFormatOption(fileFormat, affineTransform, withMetadata, true, svgLinkTarget, debugsvek, - hoverColor, tikzFontDistortion, scale, preserveAspectRatio); + hoverColor, tikzFontDistortion, scale, preserveAspectRatio, watermark); } public FileFormatOption withTikzFontDistortion(TikzFontDistortion tikzFontDistortion) { return new FileFormatOption(fileFormat, affineTransform, withMetadata, true, svgLinkTarget, debugsvek, - hoverColor, tikzFontDistortion, scale, preserveAspectRatio); + hoverColor, tikzFontDistortion, scale, preserveAspectRatio, watermark); } public FileFormatOption withSvgLinkTarget(String svgLinkTarget) { - return new FileFormatOption(fileFormat, affineTransform, withMetadata, useRedForError, svgLinkTarget, - debugsvek, hoverColor, tikzFontDistortion, scale, preserveAspectRatio); + return new FileFormatOption(fileFormat, affineTransform, withMetadata, useRedForError, svgLinkTarget, debugsvek, + hoverColor, tikzFontDistortion, scale, preserveAspectRatio, watermark); } public FileFormatOption withPreserveAspectRatio(String preserveAspectRatio) { - return new FileFormatOption(fileFormat, affineTransform, withMetadata, useRedForError, svgLinkTarget, - debugsvek, hoverColor, tikzFontDistortion, scale, preserveAspectRatio); + return new FileFormatOption(fileFormat, affineTransform, withMetadata, useRedForError, svgLinkTarget, debugsvek, + hoverColor, tikzFontDistortion, scale, preserveAspectRatio, watermark); } public FileFormatOption withHoverColor(String hoverColor) { - return new FileFormatOption(fileFormat, affineTransform, withMetadata, useRedForError, svgLinkTarget, - debugsvek, hoverColor, tikzFontDistortion, scale, preserveAspectRatio); + return new FileFormatOption(fileFormat, affineTransform, withMetadata, useRedForError, svgLinkTarget, debugsvek, + hoverColor, tikzFontDistortion, scale, preserveAspectRatio, watermark); } public FileFormatOption withScale(double scale) { - return new FileFormatOption(fileFormat, affineTransform, withMetadata, useRedForError, svgLinkTarget, - debugsvek, hoverColor, tikzFontDistortion, scale, preserveAspectRatio); + return new FileFormatOption(fileFormat, affineTransform, withMetadata, useRedForError, svgLinkTarget, debugsvek, + hoverColor, tikzFontDistortion, scale, preserveAspectRatio, watermark); + } + + public FileFormatOption withWartermark(String watermark) { + return new FileFormatOption(fileFormat, affineTransform, withMetadata, useRedForError, svgLinkTarget, debugsvek, + hoverColor, tikzFontDistortion, scale, preserveAspectRatio, watermark); } @Override @@ -174,4 +182,8 @@ public final class FileFormatOption implements Serializable { return tikzFontDistortion; } + public final String getWatermark() { + return watermark; + } + } diff --git a/src/net/sourceforge/plantuml/ISkinParam.java b/src/net/sourceforge/plantuml/ISkinParam.java index 92ae31cf0..2f1e2aff0 100644 --- a/src/net/sourceforge/plantuml/ISkinParam.java +++ b/src/net/sourceforge/plantuml/ISkinParam.java @@ -63,7 +63,7 @@ public interface ISkinParam extends ISkinSimple { public boolean useUnderlineForHyperlink(); - public HColor getBackgroundColor(); + public HColor getBackgroundColor(boolean replaceTransparentByWhite); public HColor getHtmlColor(ColorParam param, Stereotype stereotype, boolean clickable); diff --git a/src/net/sourceforge/plantuml/SkinParam.java b/src/net/sourceforge/plantuml/SkinParam.java index 5b3b82ae8..f05477894 100644 --- a/src/net/sourceforge/plantuml/SkinParam.java +++ b/src/net/sourceforge/plantuml/SkinParam.java @@ -263,11 +263,14 @@ public class SkinParam implements ISkinParam { return result; } - public HColor getBackgroundColor() { + public HColor getBackgroundColor(boolean replaceTransparentByWhite) { final HColor result = getHtmlColor(ColorParam.background, null, false); if (result == null) { return HColorUtils.WHITE; } + if (replaceTransparentByWhite && HColorUtils.transparent().equals(result)) { + return HColorUtils.WHITE; + } return result; } @@ -310,8 +313,9 @@ public class SkinParam implements ISkinParam { if (value == null) { return null; } - if (param == ColorParam.background && value.equalsIgnoreCase("transparent")) { - return null; + if ((param == ColorParam.background || param == ColorParam.arrowHead) + && (value.equalsIgnoreCase("transparent") || value.equalsIgnoreCase("none"))) { + return HColorUtils.transparent(); } if (param == ColorParam.background) { return getIHtmlColorSet().getColorIfValid(value); @@ -319,7 +323,7 @@ public class SkinParam implements ISkinParam { assert param != ColorParam.background; // final boolean acceptTransparent = param == ColorParam.background // || param == ColorParam.sequenceGroupBodyBackground || param == ColorParam.sequenceBoxBackground; - return getIHtmlColorSet().getColorIfValid(value, getBackgroundColor()); + return getIHtmlColorSet().getColorIfValid(value, getBackgroundColor(false)); } public char getCircledCharacter(Stereotype stereotype) { diff --git a/src/net/sourceforge/plantuml/SkinParamBackcolored.java b/src/net/sourceforge/plantuml/SkinParamBackcolored.java index fe4e7a983..4d21f8481 100644 --- a/src/net/sourceforge/plantuml/SkinParamBackcolored.java +++ b/src/net/sourceforge/plantuml/SkinParamBackcolored.java @@ -73,11 +73,11 @@ public class SkinParamBackcolored extends SkinParamDelegator { } @Override - public HColor getBackgroundColor() { + public HColor getBackgroundColor(boolean replaceTransparentByWhite) { if (backColorGeneral != null) { return backColorGeneral; } - return super.getBackgroundColor(); + return super.getBackgroundColor(replaceTransparentByWhite); } @Override diff --git a/src/net/sourceforge/plantuml/SkinParamDelegator.java b/src/net/sourceforge/plantuml/SkinParamDelegator.java index 665653c83..c93a070fd 100644 --- a/src/net/sourceforge/plantuml/SkinParamDelegator.java +++ b/src/net/sourceforge/plantuml/SkinParamDelegator.java @@ -71,8 +71,8 @@ public class SkinParamDelegator implements ISkinParam { return skinParam.getHyperlinkColor(); } - public HColor getBackgroundColor() { - return skinParam.getBackgroundColor(); + public HColor getBackgroundColor(boolean replaceTransparentByWhite) { + return skinParam.getBackgroundColor(replaceTransparentByWhite); } public int getCircledCharacterRadius() { diff --git a/src/net/sourceforge/plantuml/StringUtils.java b/src/net/sourceforge/plantuml/StringUtils.java index 5231c61b5..9a508ce1c 100644 --- a/src/net/sourceforge/plantuml/StringUtils.java +++ b/src/net/sourceforge/plantuml/StringUtils.java @@ -49,6 +49,7 @@ import net.sourceforge.plantuml.command.regex.Matcher2; import net.sourceforge.plantuml.command.regex.MyPattern; import net.sourceforge.plantuml.command.regex.Pattern2; import net.sourceforge.plantuml.cucadiagram.Display; +import net.sourceforge.plantuml.svek.DotStringFactory; import net.sourceforge.plantuml.ugraphic.color.ColorMapper; import net.sourceforge.plantuml.ugraphic.color.HColor; import net.sourceforge.plantuml.ugraphic.color.HColorBackground; @@ -385,30 +386,6 @@ public class StringUtils { return Collections.unmodifiableList(result); } - public static String getAsHtml(Color color) { - if (color == null) { - return null; - } - return getAsHtml(color.getRGB()); - } - - public static String getAsSvg(ColorMapper mapper, HColor color) { - if (color == null) { - return "none"; - } - if (color instanceof HColorBackground) { - return ((HColorBackground) color).getSvg(mapper); - } - return getAsHtml(mapper.getMappedColor(color)); - } - - public static String getAsHtml(int color) { - final int v = 0xFFFFFF & color; - String s = "000000" + Integer.toHexString(v).toUpperCase(); - s = s.substring(s.length() - 6); - return "#" + s; - } - public static String getUid(String uid1, int uid2) { return uid1 + String.format("%04d", uid2); } diff --git a/src/net/sourceforge/plantuml/UmlDiagram.java b/src/net/sourceforge/plantuml/UmlDiagram.java index 3e54ebd25..c735de6b2 100644 --- a/src/net/sourceforge/plantuml/UmlDiagram.java +++ b/src/net/sourceforge/plantuml/UmlDiagram.java @@ -189,8 +189,8 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot fileFormatOption = fileFormatOption.withPreserveAspectRatio(getSkinParam().getPreserveAspectRatio()); fileFormatOption = fileFormatOption.withTikzFontDistortion(getSkinParam().getTikzFontDistortion()); if (hover != null) { - fileFormatOption = fileFormatOption.withHoverColor(StringUtils.getAsHtml(getSkinParam().getColorMapper() - .getMappedColor(hover))); + fileFormatOption = fileFormatOption + .withHoverColor(getSkinParam().getColorMapper().toHtml(hover)); } if (fileFormatOption.getFileFormat() == FileFormat.PDF) { @@ -227,8 +227,8 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot strings.addAll(CommandExecutionResult.getStackTrace(exception)); - final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, HColorUtils.WHITE, - metadata, null, 0, 0, null, false); + final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, HColorUtils.WHITE, metadata, + null, 0, 0, null, false); final FlashCodeUtils utils = FlashCodeFactory.getFlashCodeUtils(); final BufferedImage im = utils.exportFlashcode(flash, Color.BLACK, Color.WHITE); @@ -316,7 +316,8 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot final double coef = (nb - 1 - i) * 1.0 / nb; at.setToShear(coef, coef); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - // exportDiagramTOxxBEREMOVED(baos, null, 0, new FileFormatOption(FileFormat.PNG, at)); + // exportDiagramTOxxBEREMOVED(baos, null, 0, new + // FileFormatOption(FileFormat.PNG, at)); baos.close(); final BufferedImage im = ImageIO.read(new ByteArrayInputStream(baos.toByteArray())); m.addImage(im); @@ -411,7 +412,8 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot // final String res = "/skin/" + filename + ".skin"; // final InputStream internalIs = UmlDiagram.class.getResourceAsStream(res); // if (internalIs != null) { - // final BlocLines lines2 = BlocLines.load(internalIs, new LineLocationImpl(filename, null)); + // final BlocLines lines2 = BlocLines.load(internalIs, new + // LineLocationImpl(filename, null)); // return loadSkinInternal(lines2); // } // if (OptionFlags.ALLOW_INCLUDE == false) { @@ -421,7 +423,8 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot // if (f == null || f.exists() == false || f.canRead() == false) { // return CommandExecutionResult.error("Cannot load skin from " + filename); // } - // final BlocLines lines = BlocLines.load(f, new LineLocationImpl(f.getName(), null)); + // final BlocLines lines = BlocLines.load(f, new LineLocationImpl(f.getName(), + // null)); // return loadSkinInternal(lines); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandLink3.java b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandLink3.java index 1a702ab9a..a3c40d47a 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/command/CommandLink3.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/command/CommandLink3.java @@ -65,7 +65,7 @@ public class CommandLink3 extends SingleLineCommand2 { protected CommandExecutionResult executeArg(ActivityDiagram3 diagram, LineLocation location, RegexResult arg) { final HColor color = diagram.getSkinParam().getIHtmlColorSet().getColorIfValid(arg.get("COLOR", 0)); if (color != null) { - diagram.setColorNextArrow(Rainbow.fromColor(color)); + diagram.setColorNextArrow(Rainbow.fromColor(color, null)); } return CommandExecutionResult.ok(); } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/SwimlanesA.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/SwimlanesA.java index d4a300701..bbde3e20b 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/SwimlanesA.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/SwimlanesA.java @@ -325,7 +325,7 @@ public class SwimlanesA extends AbstractTextBlock implements ISwimlanesA, TextBl @Override public MinMax getMinMax(StringBounder stringBounder) { if (cachedMinMax == null) { - cachedMinMax = TextBlockUtils.getMinMax(this, stringBounder); + cachedMinMax = TextBlockUtils.getMinMax(this, stringBounder, false); } return cachedMinMax; } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/SwimlanesAAA.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/SwimlanesAAA.java index e0c35ef14..7969dc40a 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/SwimlanesAAA.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/SwimlanesAAA.java @@ -426,7 +426,7 @@ public class SwimlanesAAA extends AbstractTextBlock implements ISwimlanesA, Text @Override public MinMax getMinMax(StringBounder stringBounder) { if (cachedMinMax == null) { - cachedMinMax = TextBlockUtils.getMinMax(this, stringBounder); + cachedMinMax = TextBlockUtils.getMinMax(this, stringBounder, false); } return cachedMinMax; } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/Worm.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/Worm.java index c988dbc65..72ae426cf 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/Worm.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/Worm.java @@ -53,6 +53,7 @@ import net.sourceforge.plantuml.ugraphic.UPolygon; import net.sourceforge.plantuml.ugraphic.UStroke; import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.color.HColor; +import net.sourceforge.plantuml.ugraphic.color.HColorUtils; import net.sourceforge.plantuml.ugraphic.comp.CompressionMode; public class Worm implements Iterable { @@ -69,18 +70,18 @@ public class Worm implements Iterable { this.ignoreForCompression = true; } - public void drawInternalOneColor(UPolygon startDecoration, UGraphic ug, HtmlColorAndStyle color, double stroke, - Direction emphasizeDirection, UPolygon endDecoration) { - final HColor color2 = color.getColor(); - if (color2 == null) { + public void drawInternalOneColor(UPolygon startDecoration, UGraphic ug, HtmlColorAndStyle colorAndStyle, + double stroke, Direction emphasizeDirection, UPolygon endDecoration) { + final HColor arrowColor = colorAndStyle.getArrowColor(); + if (arrowColor == null) { throw new IllegalArgumentException(); } - final LinkStyle style = color.getStyle(); + final LinkStyle style = colorAndStyle.getStyle(); if (style.isInvisible()) { return; } - ug = ug.apply(color2); - ug = ug.apply(color2.bg()); + ug = ug.apply(arrowColor); + ug = ug.apply(arrowColor.bg()); if (style.isNormal()) { ug = ug.apply(new UStroke(stroke)); } else { @@ -98,6 +99,13 @@ public class Worm implements Iterable { drawLine(ug, line, null); } } + + final HColor arrowHeadColor = colorAndStyle.getArrowHeadColor(); + if (arrowHeadColor != null && arrowHeadColor.equals(HColorUtils.transparent()) == false) { + ug = ug.apply(arrowHeadColor); + ug = ug.apply(arrowHeadColor.bg()); + } + if (startDecoration != null) { ug = ug.apply(new UStroke(1.5)); final Point2D start = points.get(0); @@ -350,7 +358,8 @@ public class Worm implements Iterable { for (int i = 0; i < points.size() - 5; i++) { final List patternAt = getPatternAt(i); if (Arrays.asList(Direction.DOWN, Direction.LEFT, Direction.DOWN, Direction.RIGHT).equals(patternAt) - || Arrays.asList(Direction.DOWN, Direction.RIGHT, Direction.DOWN, Direction.LEFT).equals(patternAt)) { + || Arrays.asList(Direction.DOWN, Direction.RIGHT, Direction.DOWN, Direction.LEFT) + .equals(patternAt)) { final Point2D.Double newPoint = new Point2D.Double(points.get(i + 1).x, points.get(i + 3).y); points.remove(i + 3); points.remove(i + 2); @@ -398,7 +407,8 @@ public class Worm implements Iterable { for (int i = 0; i < points.size() - 4; i++) { final List patternAt = getPatternAt(i); if (Arrays.asList(Direction.DOWN, Direction.RIGHT, Direction.DOWN, Direction.RIGHT).equals(patternAt) - || Arrays.asList(Direction.DOWN, Direction.LEFT, Direction.DOWN, Direction.LEFT).equals(patternAt)) { + || Arrays.asList(Direction.DOWN, Direction.LEFT, Direction.DOWN, Direction.LEFT) + .equals(patternAt)) { final Point2D.Double newPoint = new Point2D.Double(points.get(i + 1).x, points.get(i + 3).y); points.remove(i + 3); points.remove(i + 2); diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileWhile.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileWhile.java index bf3c2087c..1f10d16aa 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileWhile.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/FtileWhile.java @@ -271,7 +271,6 @@ class FtileWhile extends AbstractFtile { snake.emphasizeDirection(Direction.UP); ug.draw(snake); - ug.apply(new UTranslate(x1, y1bis)).draw(new UEmpty(5, Diamond.diamondHalfSize)); } @@ -362,6 +361,7 @@ class FtileWhile extends AbstractFtile { snake.addPoint(x2, y2); ug.draw(snake); + ug.apply(new UTranslate(x1, y1bis)).draw(new UEmpty(5, Diamond.diamondHalfSize)); } } diff --git a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/ConditionalBuilder.java b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/ConditionalBuilder.java index a244eab08..e91e7c1db 100644 --- a/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/ConditionalBuilder.java +++ b/src/net/sourceforge/plantuml/activitydiagram3/ftile/vcompact/cond/ConditionalBuilder.java @@ -112,7 +112,7 @@ public class ConditionalBuilder { this.borderColor = styleDiamond.value(PName.LineColor).asColor(skinParam.getIHtmlColorSet()); this.backColor = styleDiamond.value(PName.BackGroundColor).asColor(skinParam.getIHtmlColorSet()); this.arrowColor = Rainbow - .fromColor(styleArrow.value(PName.LineColor).asColor(skinParam.getIHtmlColorSet())); + .fromColor(styleArrow.value(PName.LineColor).asColor(skinParam.getIHtmlColorSet()), null); this.fontTest = styleDiamond.getFontConfiguration(skinParam.getIHtmlColorSet()); this.fontArrow = styleArrow.getFontConfiguration(skinParam.getIHtmlColorSet()); } else { diff --git a/src/net/sourceforge/plantuml/command/CommandScale.java b/src/net/sourceforge/plantuml/command/CommandScale.java index b0c647f97..d474f782e 100644 --- a/src/net/sourceforge/plantuml/command/CommandScale.java +++ b/src/net/sourceforge/plantuml/command/CommandScale.java @@ -46,10 +46,6 @@ import net.sourceforge.plantuml.command.regex.RegexResult; public class CommandScale extends SingleLineCommand2 { - // public CommandScale() { - // super("(?i)^$"); - // } - public CommandScale() { super(getRegexConcat()); } diff --git a/src/net/sourceforge/plantuml/creole/atom/AtomMath.java b/src/net/sourceforge/plantuml/creole/atom/AtomMath.java index e8d4b87e5..ff9b8a6db 100644 --- a/src/net/sourceforge/plantuml/creole/atom/AtomMath.java +++ b/src/net/sourceforge/plantuml/creole/atom/AtomMath.java @@ -106,8 +106,7 @@ public class AtomMath extends AbstractAtom implements Atom { private Color getColor(HColor color, Color defaultValue) { if (color instanceof HColorSimple) { - return colorMapper.getMappedColor(color); - // return ((HtmlColorSimple) color).getColor999(); + return colorMapper.toColor(color); } return defaultValue; diff --git a/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java b/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java index 0e86ea839..643d9faa6 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java +++ b/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java @@ -128,7 +128,7 @@ public final class EntityFactory { if (g.getColors(skinParam).getColor(ColorType.BACK) == null) { final ColorParam param = symbol == null ? ColorParam.packageBackground : symbol.getColorParamBack(); final HColor c1 = skinParam.getHtmlColor(param, g.getStereotype(), false); - folder.setSpecificColorTOBEREMOVED(ColorType.BACK, c1 == null ? skinParam.getBackgroundColor() : c1); + folder.setSpecificColorTOBEREMOVED(ColorType.BACK, c1 == null ? skinParam.getBackgroundColor(false) : c1); } else { folder.setSpecificColorTOBEREMOVED(ColorType.BACK, g.getColors(skinParam).getColor(ColorType.BACK)); } diff --git a/src/net/sourceforge/plantuml/donors/PSystemDonors.java b/src/net/sourceforge/plantuml/donors/PSystemDonors.java index f89ed7973..61308f145 100644 --- a/src/net/sourceforge/plantuml/donors/PSystemDonors.java +++ b/src/net/sourceforge/plantuml/donors/PSystemDonors.java @@ -71,25 +71,25 @@ public class PSystemDonors extends AbstractPSystem { private static final int COLS = 6; private static final int FREE_LINES = 6; - public static final String DONORS = "6_eA02mFU3XMJYceJdotTlPGzS6YgH0ylZFbdo3X7Mo0347DLH8jYjmdkzS0GG5q3HqzvlQT7lSRwI-Y" - + "AztxfXdHbh_c-7d6K0m4FPw_hePj_hS7Zwa_zqxZk-ioVNvpXqL918Z8CYV51XeoyFvcECytZOzUUWOi" - + "eUgdwBxsVvUkikvULOLPkbkrJf-kK3UsOexfygF0XLEm4rJHe91ZEfLp7GvLZVBgWQyjDCYaSEUtystN" - + "P5QCVeYKJ6riGKPlZD2TazOloOACsd_K9z2YOxgcH2u9nTPB93h_h7HuMK3tQoI-0iaG2pODpA6K8pf1" - + "iNCZXYGfWeREKOp6rX_PyYG4GnvQs8T_r9CZxYcPCGmjafHhe23ZPXo0j4hTcd2skXbGdITR36kIgelZ" - + "8Tnt7AQdd3feU0GiKYoe1QeXo9lG2P_ciruokFIBeeQ__3R9jLa2r5ss1DWtC_eM7aqIvNzwromGTvMo" - + "UKfZgTVU7sDto5rJPXx-Hs-Zb2suryr22XOlBO0VWPwhYKhoyrVMZOKuX6ifVI5TvxOhrr64IpPag5YN" - + "psB9QyuTNN9ZqsAP3XRZ4_ovs8GCjD2LojNG3LfrsQtpXPBKrBX-oAj3-tN0DNLczuxHUY-Ri_p_8gpC" - + "Z8e3TBh4AEX6GC4SJQkXOW4Hc1QwEkGcG2v0kPhSYjNgG_pQ9mZUJ7eW2XiXFH2lFvURN8Gm3MkwFSKC" - + "OFgGKYT9seG8JTe4FOagnKXPXDuEavPXqyRKTT86ZzC6On37T5nz4ZvR2Dp2i4urcft5skSOGt2BxsK-" - + "FUz36LVndMxXFUz9QloG0JlJWXwHAYFgorBsad3JG64MRyb9GtnNsCx5G_S5vvaisi3CsUOuP3PKBYMf" - + "gNzY-A59zxS2MTjURKNUWFGIc8GmCxh1wQt98pMvH98qdEd4s04WgnQVs6-AS6TGTSlBpk8wXCaZLYz2" - + "Xlmk-GIMAhhmT65xT_VZ6SEZo3wSzyAigN7fKdmieERi9YXA2wLwIb6apGaov5Y3dlNMmFQxEXR8rc_L" - + "iEbGUDj4fvKRJ4mXmrMY_sYqI3GguXAz-2GnWB_nyfHwnbW77T_XPODnWAmX2O4gZER8WTFIMDswbh7U" - + "ely_QsspSlxytskooAaddl6g0kWECk8_I57dw6BM3RmDyzNOC0VOO0OJtTdXoWDBxmOI5kp3EwkeAzEC" - + "v4eCbbkKYrPnVAYwhtGFBcP3R5XnKKnHT9_YfBLD8wWKs_Tz4KvoOCv_YYgpKhWgTMfYn8JOxb6SmjXx" - + "ByLTrwn0W-guJE3jgTUtYsckqkTuGQbXk0RafoDooAPvQ45DJPlwH62R6EjxSziXcUQ_IOz-YjREVbOF" - + "GplRlybLeE7R7qAxeISOBX8t3F2xnvpSmCqt5FB6r1rbkPYsSz4zmouHhB3Vz5ra8U6LPQqo4SRSt5ek" - + "F2t4Czk67Bo5xDFLAFg2g2fk80SMctKEOb4fnoDI98Nc72sR4v6s0m00"; + public static final String DONORS = "6nmB0AmFkBcp0hHmgCOwx9qzUsNuYPYXIV3upfH_WeHti04o13LNIRGeSf_iNWC41T0rTFIOstTwt6-a" + + "luYkTE-RPaHR_fhZvnb3CH3qUFww6hRvtnuyvfxff-Ixcz4JPiBaVmA4fYcNj0L8bI6ba87tDyDvlcaC" + + "lVGCM1vLFqNtjV-xT9LrzwfEcBReReNpfn6gCqUZc6Ew_wF0XIZO2QfeKCWndSgv3eUg3dAs4trL54X2" + + "nJk_dTzsJLR5P2wH4gkDRSICpe3kdFH-IGvajFwZVe0F7TCr9RWd59TU8kZyizhXPG73hv7uDHGEiU38" + + "m1nAEoesA6Lk91J22L3eNCLiRFt1aITUM5H12_lmZqPou9wIh65eKOXu00Knp-02IM_KhKdEJXq6LEUP" + + "BOOrITUjyH3fcuU95AsBXll18iA2Ma0DGzw4RlXqd_MIeNk_A1huos-JNBlbG1so9K3RhEXRU3H9LF-d" + + "csUUkCkKpLEQZdhj_J5sXzmrPURqFteVXLp0SsuMKcJnyWBvCUYvcgWbFvVpO24DuJfANqZtkUtYCOjm" + + "oOOCDUlopIoZHb_iIdGsBSPsif0Vy-TM4n9iuQkKHw0djUfeqVb28JKrhX_oUcg_3d9DdGNUCLeV5NEL" + + "_r-4LPYXE46douoYhb-e6BDvDLGiKGHdZ2uFkGaa5-1SJMx7QlKXVkqJH6yb8n3Bng07ulMlbIwNGbWT" + + "wxezpGfW-R1IDuMeBGAQj1jw4bVoaR88lHqcZMKpnj9pqWOVfut6A4xejCOcShCGfCkmJbNDT8dsEQrX" + + "U3M_b_dql1_9UHNNwIRlUH_IwoSPg3Cjw9XK6l5ObhANHBe6gipYB7NL4DyLjlFmq7t1UHQBDZ1pjhaE" + + "MHOQ5vBKr3yn-Q59npj9sQnzjHLx1_4lWtc8P4OHND-UF5AJonJ2bZET09j0LAh59_PRqhWpg8VbP7Eu" + + "3c7beTMBa2I_Ipv1hAfOE5rO6-v-UOOW2lR9UI_CsXgNBYNN0chE7eAyj51LJocEj3b91kQQzAot3hRV" + + "rRd0jtwhZcr0yPqGdTRSO7CAZ3HHVb6WHDAGbV9BJn8J-5y_Jxb7vZha-2ul6na7oIb93Ac2TCSlN3sD" + + "rSlG2jPR_FsprZOhvy__lIOhEVN4irvD41qWed-J0hYSqnZ1sy1VjuyaRqxCi57GsEJAWrel0ea8zk6T" + + "NTIJoupy8aQMMvIBLd5zgBgluXwvM0snOUiYd-BeFiMLrZODKILZt_T5kCZ1EFyjginAuQgMriA8JR7T" + + "ipYviLilnTFMRY23whX3uEoft-wckKgVwmjBJSFJH7uwa4EskaiBQthQD3O3syJOtrlR3acw_oOT_v9U" + + "q_sk7ePsTlucJuF6RtSO_OQHO41axPXWjymvYS2JRoJaZNauoUrYwPEBxYcxKB32VjClayM4LrQqoaIq" + + "vkRMS-vj8Svk6tFO5hPFLwFu5qKr4O5CBZRhdiH2AU21L9A2EMVBL86qdIPDymc9Inq0"; /* * Special thanks to our sponsors and donors: diff --git a/src/net/sourceforge/plantuml/eggs/GraphicsPath.java b/src/net/sourceforge/plantuml/eggs/GraphicsPath.java index 89d1d2107..219b0405b 100644 --- a/src/net/sourceforge/plantuml/eggs/GraphicsPath.java +++ b/src/net/sourceforge/plantuml/eggs/GraphicsPath.java @@ -68,7 +68,7 @@ public class GraphicsPath { } private BufferedImage createImage() { - final EmptyImageBuilder builder = new EmptyImageBuilder(50, 50, Color.WHITE); + final EmptyImageBuilder builder = new EmptyImageBuilder(null, 50, 50, Color.WHITE); final BufferedImage im = builder.getBufferedImage(); final Graphics2D g2d = builder.getGraphics2D(); diff --git a/src/net/sourceforge/plantuml/eggs/PSystemWelcome.java b/src/net/sourceforge/plantuml/eggs/PSystemWelcome.java index 0b89f8def..9798f6d83 100644 --- a/src/net/sourceforge/plantuml/eggs/PSystemWelcome.java +++ b/src/net/sourceforge/plantuml/eggs/PSystemWelcome.java @@ -71,7 +71,7 @@ public class PSystemWelcome extends AbstractPSystem { strings.add(" "); strings.add("\"\"class Example\"\""); strings.add(" "); - strings.add("You will find more information about PlantUML syntax on http://plantuml.com"); + strings.add("You will find more information about PlantUML syntax on https://plantuml.com"); if (position == GraphicPosition.BACKGROUND_CORNER_BOTTOM_RIGHT) { strings.add(" "); strings.add(" "); diff --git a/src/net/sourceforge/plantuml/eps/EpsGraphics.java b/src/net/sourceforge/plantuml/eps/EpsGraphics.java index 4b257f08b..56e3f168f 100644 --- a/src/net/sourceforge/plantuml/eps/EpsGraphics.java +++ b/src/net/sourceforge/plantuml/eps/EpsGraphics.java @@ -330,7 +330,7 @@ public class EpsGraphics { public void epsPolygon(HColorGradient gr, ColorMapper mapper, double... points) { assert points.length % 2 == 0; - setFillColor(mapper.getMappedColor(gr.getColor1())); + setFillColor(mapper.toColor(gr.getColor1())); epsPolygon(points); } @@ -410,8 +410,8 @@ public class EpsGraphics { if (rx == 0 && ry == 0) { simplerectUsed = true; - appendColorShort(mapper.getMappedColor(gr.getColor1())); - appendColorShort(mapper.getMappedColor(gr.getColor2())); + appendColorShort(mapper.toColor(gr.getColor1())); + appendColorShort(mapper.toColor(gr.getColor2())); append(format(width) + " " + format(height) + " " + format(x) + " " + format(y), true); append("100 -1 1 {", true); append("100 div", true); @@ -433,8 +433,8 @@ public class EpsGraphics { append("initclip", true); } else { roundrectUsed = true; - appendColorShort(mapper.getMappedColor(gr.getColor1())); - appendColorShort(mapper.getMappedColor(gr.getColor2())); + appendColorShort(mapper.toColor(gr.getColor1())); + appendColorShort(mapper.toColor(gr.getColor2())); append(format(width) + " " + format(height) + " " + format(x) + " " + format(y) + " " + format((rx + ry) / 2), true); append("100 -1 1 {", true); diff --git a/src/net/sourceforge/plantuml/graph/EntityImageActivityBranch.java b/src/net/sourceforge/plantuml/graph/EntityImageActivityBranch.java index b83d1adb9..ca5d71b95 100644 --- a/src/net/sourceforge/plantuml/graph/EntityImageActivityBranch.java +++ b/src/net/sourceforge/plantuml/graph/EntityImageActivityBranch.java @@ -65,9 +65,9 @@ class EntityImageActivityBranch extends AbstractEntityImage { p.addPoint(size, size * 2); p.addPoint(0, size); - g2d.setColor(colorMapper.getMappedColor(getYellow())); + g2d.setColor(colorMapper.toColor(getYellow())); g2d.fill(p); - g2d.setColor(colorMapper.getMappedColor(getRed())); + g2d.setColor(colorMapper.toColor(getRed())); g2d.draw(p); } } diff --git a/src/net/sourceforge/plantuml/graphic/HtmlColorAndStyle.java b/src/net/sourceforge/plantuml/graphic/HtmlColorAndStyle.java index 3c47e756e..ddb1d32e5 100644 --- a/src/net/sourceforge/plantuml/graphic/HtmlColorAndStyle.java +++ b/src/net/sourceforge/plantuml/graphic/HtmlColorAndStyle.java @@ -47,28 +47,34 @@ import net.sourceforge.plantuml.ugraphic.color.HColorSet; public class HtmlColorAndStyle { - private final HColor color; + private final HColor arrowHeadColor; + private final HColor arrowColor; private final LinkStyle style; @Override public String toString() { - return color + " " + style; + return arrowColor + " " + style; } - public HtmlColorAndStyle(HColor color) { - this(color, LinkStyle.NORMAL()); + public HtmlColorAndStyle(HColor color, HColor arrowHeadColor) { + this(color, LinkStyle.NORMAL(), arrowHeadColor); } - public HtmlColorAndStyle(HColor color, LinkStyle style) { - if (color == null) { + public HtmlColorAndStyle(HColor arrowColor, LinkStyle style, HColor arrowHeadColor) { + if (arrowColor == null) { throw new IllegalArgumentException(); } - this.color = color; + this.arrowHeadColor = arrowHeadColor; + this.arrowColor = arrowColor; this.style = style; } - public HColor getColor() { - return color; + public HColor getArrowColor() { + return arrowColor; + } + + public HColor getArrowHeadColor() { + return arrowHeadColor; } public LinkStyle getStyle() { @@ -80,12 +86,14 @@ public class HtmlColorAndStyle { } public static HtmlColorAndStyle build(ISkinParam skinParam, String definition) { - HColor color; + HColor arrowColor; + HColor arrowHeadColor = null; if (SkinParam.USE_STYLES()) { final Style style = getDefaultStyleDefinitionArrow().getMergedStyle(skinParam.getCurrentStyleBuilder()); - color = style.value(PName.LineColor).asColor(skinParam.getIHtmlColorSet()); + arrowColor = style.value(PName.LineColor).asColor(skinParam.getIHtmlColorSet()); } else { - color = Rainbow.build(skinParam).getColors().get(0).color; + arrowColor = Rainbow.build(skinParam).getColors().get(0).arrowColor; + arrowColor = Rainbow.build(skinParam).getColors().get(0).arrowHeadColor; } LinkStyle style = LinkStyle.NORMAL(); final HColorSet set = skinParam.getIHtmlColorSet(); @@ -97,10 +105,10 @@ public class HtmlColorAndStyle { } final HColor tmpColor = set.getColorIfValid(s); if (tmpColor != null) { - color = tmpColor; + arrowColor = tmpColor; } } - return new HtmlColorAndStyle(color, style); + return new HtmlColorAndStyle(arrowColor, style, arrowHeadColor); } } diff --git a/src/net/sourceforge/plantuml/graphic/Rainbow.java b/src/net/sourceforge/plantuml/graphic/Rainbow.java index 1985d91cc..4450b9cf1 100644 --- a/src/net/sourceforge/plantuml/graphic/Rainbow.java +++ b/src/net/sourceforge/plantuml/graphic/Rainbow.java @@ -67,28 +67,28 @@ public class Rainbow { public static Rainbow none() { return new Rainbow(0); } - - public static Rainbow fromColor(HColor color) { - if (color == null) { + + public static Rainbow fromColor(HColor arrowColor, HColor arrowHeadColor) { + if (arrowColor == null) { return Rainbow.none(); } - return Rainbow.build(new HtmlColorAndStyle(color)); + return Rainbow.build(new HtmlColorAndStyle(arrowColor, arrowHeadColor)); } public static Rainbow build(ISkinParam skinParam) { if (SkinParam.USE_STYLES()) { throw new IllegalStateException(); } - return fromColor(rose.getHtmlColor(skinParam, ColorParam.arrow)); + final HColor arrow = rose.getHtmlColor(skinParam, ColorParam.arrow); + final HColor arrowHead = rose.getHtmlColor(skinParam, null, ColorParam.arrowHead, ColorParam.arrow); + return fromColor(arrow, arrowHead); } public static Rainbow build(Style style, HColorSet set) { final HColor color = style.value(PName.LineColor).asColor(set); - return fromColor(color); + return fromColor(color, null); } - - public Rainbow withDefault(Rainbow defaultColor) { if (this.size() == 0) { return defaultColor; @@ -130,7 +130,7 @@ public class Rainbow { } public HColor getColor() { - return colors.get(0).getColor(); + return colors.get(0).getArrowColor(); } public int getColorArrowSeparationSpace() { diff --git a/src/net/sourceforge/plantuml/graphic/TextBlockUtils.java b/src/net/sourceforge/plantuml/graphic/TextBlockUtils.java index 9564124e9..f32935dca 100644 --- a/src/net/sourceforge/plantuml/graphic/TextBlockUtils.java +++ b/src/net/sourceforge/plantuml/graphic/TextBlockUtils.java @@ -67,13 +67,13 @@ import net.sourceforge.plantuml.ugraphic.color.HColorUtils; public class TextBlockUtils { - public static TextBlock bordered(TextBlock textBlock, UStroke stroke, HColor borderColor, - HColor backgroundColor, double cornersize) { + public static TextBlock bordered(TextBlock textBlock, UStroke stroke, HColor borderColor, HColor backgroundColor, + double cornersize) { return new TextBlockBordered(textBlock, stroke, borderColor, backgroundColor, cornersize); } - public static TextBlock bordered(TextBlock textBlock, UStroke stroke, HColor borderColor, - HColor backgroundColor, double cornersize, double marginX, double marginY) { + public static TextBlock bordered(TextBlock textBlock, UStroke stroke, HColor borderColor, HColor backgroundColor, + double cornersize, double marginX, double marginY) { return new TextBlockBordered(textBlock, stroke, borderColor, backgroundColor, cornersize, marginX, marginY); } @@ -146,8 +146,8 @@ public class TextBlockUtils { // return addBackcolor(mergeTB(b1, b2, horizontalAlignment), b1.getBackcolor()); // } - public static MinMax getMinMax(TextBlock tb, StringBounder stringBounder) { - final LimitFinder limitFinder = new LimitFinder(stringBounder, false); + public static MinMax getMinMax(UDrawable tb, StringBounder stringBounder, boolean initToZero) { + final LimitFinder limitFinder = new LimitFinder(stringBounder, initToZero); tb.drawU(limitFinder); return limitFinder.getMinMax(); } diff --git a/src/net/sourceforge/plantuml/logo/PSystemLogo.java b/src/net/sourceforge/plantuml/logo/PSystemLogo.java index 996d288f9..31bf99d3f 100644 --- a/src/net/sourceforge/plantuml/logo/PSystemLogo.java +++ b/src/net/sourceforge/plantuml/logo/PSystemLogo.java @@ -65,7 +65,7 @@ public class PSystemLogo extends AbstractPSystem { throws IOException { final int width = 640; final int height = 480; - final EmptyImageBuilder builder = new EmptyImageBuilder(width, height, Color.WHITE); + final EmptyImageBuilder builder = new EmptyImageBuilder(fileFormat.getWatermark(), width, height, Color.WHITE); final BufferedImage im = builder.getBufferedImage(); final UGraphic ug = new UGraphicG2d(new ColorMapperIdentity(), builder.getGraphics2D(), 1.0); ((UGraphicG2d) ug).setBufferedImage(im); @@ -82,7 +82,8 @@ public class PSystemLogo extends AbstractPSystem { // private GraphicStrings getGraphicStrings() throws IOException { // final UFont font = new UFont("SansSerif", Font.PLAIN, 12); - // final GraphicStrings result = new GraphicStrings(strings, font, HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, + // final GraphicStrings result = new GraphicStrings(strings, font, + // HtmlColorUtils.BLACK, HtmlColorUtils.WHITE, // image, // GraphicPosition.BOTTOM, false); // result.setMinWidth(200); diff --git a/src/net/sourceforge/plantuml/math/PSystemMath.java b/src/net/sourceforge/plantuml/math/PSystemMath.java index caed05628..3211aeaf6 100644 --- a/src/net/sourceforge/plantuml/math/PSystemMath.java +++ b/src/net/sourceforge/plantuml/math/PSystemMath.java @@ -111,7 +111,7 @@ public class PSystemMath extends AbstractPSystem { private Color getColor(final String col) { final HColor col2 = HColorSet.instance().getColorIfValid(col); - final Color col3 = new ColorMapperIdentity().getMappedColor(col2); + final Color col3 = new ColorMapperIdentity().toColor(col2); return col3; } diff --git a/src/net/sourceforge/plantuml/mindmap/MindMapDiagram.java b/src/net/sourceforge/plantuml/mindmap/MindMapDiagram.java index 0b306498b..850fa4d24 100644 --- a/src/net/sourceforge/plantuml/mindmap/MindMapDiagram.java +++ b/src/net/sourceforge/plantuml/mindmap/MindMapDiagram.java @@ -91,7 +91,7 @@ public class MindMapDiagram extends UmlDiagram { final double dpiFactor = scale == null ? getScaleCoef(fileFormatOption) : scale.getScale(100, 100); final ISkinParam skinParam = getSkinParam(); final ImageBuilder imageBuilder = new ImageBuilder(skinParam.getColorMapper(), dpiFactor, - skinParam.getBackgroundColor(), fileFormatOption.isWithMetadata() ? getMetadata() : null, "", 10, 10, + skinParam.getBackgroundColor(false), fileFormatOption.isWithMetadata() ? getMetadata() : null, "", 10, 10, null, skinParam.handwritten()); TextBlock result = getTextBlock(); diff --git a/src/net/sourceforge/plantuml/nwdiag/NwDiagram.java b/src/net/sourceforge/plantuml/nwdiag/NwDiagram.java index b49c6b86c..7dfa9b66a 100644 --- a/src/net/sourceforge/plantuml/nwdiag/NwDiagram.java +++ b/src/net/sourceforge/plantuml/nwdiag/NwDiagram.java @@ -35,6 +35,7 @@ package net.sourceforge.plantuml.nwdiag; import java.awt.geom.Dimension2D; +import java.awt.geom.Rectangle2D; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; @@ -45,8 +46,11 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import net.sourceforge.plantuml.AnnotatedWorker; import net.sourceforge.plantuml.ColorParam; +import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.FileFormatOption; +import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.Scale; import net.sourceforge.plantuml.SpriteContainerEmpty; import net.sourceforge.plantuml.UmlDiagram; @@ -57,10 +61,14 @@ import net.sourceforge.plantuml.core.ImageData; import net.sourceforge.plantuml.cucadiagram.Display; import net.sourceforge.plantuml.graphic.FontConfiguration; import net.sourceforge.plantuml.graphic.HorizontalAlignment; +import net.sourceforge.plantuml.graphic.InnerStrategy; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; +import net.sourceforge.plantuml.graphic.TextBlockUtils; import net.sourceforge.plantuml.graphic.UDrawable; +import net.sourceforge.plantuml.svek.TextBlockBackcolored; import net.sourceforge.plantuml.ugraphic.ImageBuilder; +import net.sourceforge.plantuml.ugraphic.MinMax; import net.sourceforge.plantuml.ugraphic.UEmpty; import net.sourceforge.plantuml.ugraphic.UFont; import net.sourceforge.plantuml.ugraphic.UGraphic; @@ -176,19 +184,38 @@ public class NwDiagram extends UmlDiagram { final Scale scale = getScale(); final double dpiFactor = scale == null ? 1 : scale.getScale(100, 100); + final ISkinParam skinParam = getSkinParam(); final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), dpiFactor, null, "", "", 0, 0, null, false); - final UDrawable result = getUDrawable(); + TextBlock result = getTextBlock(); + result = new AnnotatedWorker(this, skinParam, fileFormatOption.getDefaultStringBounder()).addAdd(result); imageBuilder.setUDrawable(result); return imageBuilder.writeImageTOBEMOVED(fileFormatOption, 0, os); } - private UDrawable getUDrawable() { - return new UDrawable() { + private TextBlockBackcolored getTextBlock() { + return new TextBlockBackcolored() { public void drawU(UGraphic ug) { drawMe(ug); } + + public Rectangle2D getInnerPosition(String member, StringBounder stringBounder, InnerStrategy strategy) { + return null; + } + + public Dimension2D calculateDimension(StringBounder stringBounder) { + return getTotalDimension(stringBounder); + } + + public MinMax getMinMax(StringBounder stringBounder) { + throw new UnsupportedOperationException(); + } + + public HColor getBackcolor() { + return null; + } + }; } @@ -205,8 +232,17 @@ public class NwDiagram extends UmlDiagram { return new FontConfiguration(font, HColorUtils.BLACK, HColorUtils.BLACK, false); } + private Dimension2D getTotalDimension(StringBounder stringBounder) { + return TextBlockUtils.getMinMax(new UDrawable() { + public void drawU(UGraphic ug) { + drawMe(ug); + } + }, stringBounder, true).getDimension(); + } + + private final double margin = 5; + private void drawMe(UGraphic ug) { - final double margin = 5; ug = ug.apply(new UTranslate(margin, margin)); final StringBounder stringBounder = ug.getStringBounder(); @@ -252,12 +288,11 @@ public class NwDiagram extends UmlDiagram { deltaX += 5; grid.drawU(ug.apply(ColorParam.activityBorder.getDefaultValue()) - .apply(ColorParam.activityBackground.getDefaultValue().bg()) - .apply(new UTranslate(deltaX, deltaY))); + .apply(ColorParam.activityBackground.getDefaultValue().bg()).apply(new UTranslate(deltaX, deltaY))); final Dimension2D dimGrid = grid.calculateDimension(stringBounder); - ug.apply(new UTranslate(dimGrid.getWidth() + deltaX + margin, dimGrid.getHeight() + deltaY + margin)).draw( - new UEmpty(1, 1)); + ug.apply(new UTranslate(dimGrid.getWidth() + deltaX + margin, dimGrid.getHeight() + deltaY + margin)) + .draw(new UEmpty(1, 1)); } diff --git a/src/net/sourceforge/plantuml/postit/PostItDiagram.java b/src/net/sourceforge/plantuml/postit/PostItDiagram.java index fcfc9e343..5a3876899 100644 --- a/src/net/sourceforge/plantuml/postit/PostItDiagram.java +++ b/src/net/sourceforge/plantuml/postit/PostItDiagram.java @@ -116,11 +116,11 @@ public class PostItDiagram extends UmlDiagram { private UGraphic createImage(FileFormatOption fileFormatOption) { final Color backColor = getSkinParam().getColorMapper() - .getMappedColor(this.getSkinParam().getBackgroundColor()); + .toColor(this.getSkinParam().getBackgroundColor(false)); final FileFormat fileFormat = fileFormatOption.getFileFormat(); if (fileFormat == FileFormat.PNG) { final double height = getDefaultArea().heightWhenWidthIs(width, fileFormatOption.getDefaultStringBounder()); - final EmptyImageBuilder builder = new EmptyImageBuilder(width, height, backColor); + final EmptyImageBuilder builder = new EmptyImageBuilder(fileFormatOption.getWatermark(), width, height, backColor); final Graphics2D graphics2D = builder.getGraphics2D(); final double dpiFactor = this.getScaleCoef(fileFormatOption); diff --git a/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java b/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java index d97972001..5699ae807 100644 --- a/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java +++ b/src/net/sourceforge/plantuml/project/GanttDiagramFactory.java @@ -45,6 +45,7 @@ import net.sourceforge.plantuml.command.CommandNope; import net.sourceforge.plantuml.command.CommandScale; import net.sourceforge.plantuml.command.UmlDiagramFactory; import net.sourceforge.plantuml.core.DiagramType; +import net.sourceforge.plantuml.project.command.CommandColorTask; import net.sourceforge.plantuml.project.command.CommandGanttArrow; import net.sourceforge.plantuml.project.command.CommandGanttArrow2; import net.sourceforge.plantuml.project.command.CommandPage; @@ -87,6 +88,7 @@ public class GanttDiagramFactory extends UmlDiagramFactory { cmds.addAll(getLanguageCommands()); cmds.add(new CommandGanttArrow()); cmds.add(new CommandGanttArrow2()); + cmds.add(new CommandColorTask()); cmds.add(new CommandSeparator()); cmds.add(new CommandPrintScale()); diff --git a/src/net/sourceforge/plantuml/project/command/CommandColorTask.java b/src/net/sourceforge/plantuml/project/command/CommandColorTask.java new file mode 100644 index 000000000..a8f7e7d24 --- /dev/null +++ b/src/net/sourceforge/plantuml/project/command/CommandColorTask.java @@ -0,0 +1,87 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2020, 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 net.sourceforge.plantuml.project.command; + +import net.sourceforge.plantuml.LineLocation; +import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.command.SingleLineCommand2; +import net.sourceforge.plantuml.command.regex.IRegex; +import net.sourceforge.plantuml.command.regex.RegexConcat; +import net.sourceforge.plantuml.command.regex.RegexLeaf; +import net.sourceforge.plantuml.command.regex.RegexResult; +import net.sourceforge.plantuml.project.Failable; +import net.sourceforge.plantuml.project.GanttConstraint; +import net.sourceforge.plantuml.project.GanttDiagram; +import net.sourceforge.plantuml.project.core.Task; +import net.sourceforge.plantuml.project.core.TaskAttribute; +import net.sourceforge.plantuml.project.core.TaskInstant; +import net.sourceforge.plantuml.project.lang.Complement; +import net.sourceforge.plantuml.project.lang.ComplementColors; +import net.sourceforge.plantuml.ugraphic.color.HColor; + +public class CommandColorTask extends SingleLineCommand2 { + + public CommandColorTask() { + super(getRegexConcat()); + } + + static IRegex getRegexConcat() { + return RegexConcat.build(CommandColorTask.class.getName(), RegexLeaf.start(), // + new RegexLeaf("CODE", "\\[([\\p{L}0-9_.]+)\\]"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("COLORS", "#(\\w+)(?:/(#?\\w+))?"), // + RegexLeaf.spaceZeroOrMore(), RegexLeaf.end()); + } + + @Override + protected CommandExecutionResult executeArg(GanttDiagram diagram, LineLocation location, RegexResult arg) { + + final String code = arg.get("CODE", 0); + final Task task = diagram.getExistingTask(code); + if (task == null) { + return CommandExecutionResult.error("No such task " + code); + } + + final String color1 = arg.get("COLORS", 0); + final String color2 = arg.get("COLORS", 1); + final HColor col1 = diagram.getIHtmlColorSet().getColorIfValid(color1); + final HColor col2 = diagram.getIHtmlColorSet().getColorIfValid(color2); + task.setColors(new ComplementColors(col1, col2)); + + return CommandExecutionResult.ok(); + } + +} diff --git a/src/net/sourceforge/plantuml/project/command/CommandPrintScale.java b/src/net/sourceforge/plantuml/project/command/CommandPrintScale.java index 428088af5..94f079916 100644 --- a/src/net/sourceforge/plantuml/project/command/CommandPrintScale.java +++ b/src/net/sourceforge/plantuml/project/command/CommandPrintScale.java @@ -54,7 +54,9 @@ public class CommandPrintScale extends SingleLineCommand2 { static IRegex getRegexConcat() { return RegexConcat.build(CommandPrintScale.class.getName(), RegexLeaf.start(), // - new RegexLeaf("printscale"), // + new RegexOr(new RegexLeaf("projectscale"), // + new RegexLeaf("ganttscale"), // + new RegexLeaf("printscale")), // RegexLeaf.spaceOneOrMore(), // new RegexOr("SCALE", // new RegexLeaf("monthly"), // diff --git a/src/net/sourceforge/plantuml/sequencediagram/LinkAnchor.java b/src/net/sourceforge/plantuml/sequencediagram/LinkAnchor.java index 4c83ac03c..fa40c429d 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/LinkAnchor.java +++ b/src/net/sourceforge/plantuml/sequencediagram/LinkAnchor.java @@ -92,7 +92,7 @@ public class LinkAnchor { final double ymax = Math.max(y1, y2); final HColor color = new Rose().getHtmlColor(param, ColorParam.arrow); - final Rainbow rainbow = Rainbow.fromColor(color); + final Rainbow rainbow = Rainbow.fromColor(color, null); final Snake snake = new Snake(Arrows.asToUp(), HorizontalAlignment.CENTER, rainbow, Arrows.asToDown()); final Display display = Display.getWithNewlines(message); diff --git a/src/net/sourceforge/plantuml/sequencediagram/command/CommandGrouping.java b/src/net/sourceforge/plantuml/sequencediagram/command/CommandGrouping.java index 05c203207..e28ff1a0a 100644 --- a/src/net/sourceforge/plantuml/sequencediagram/command/CommandGrouping.java +++ b/src/net/sourceforge/plantuml/sequencediagram/command/CommandGrouping.java @@ -75,7 +75,7 @@ public class CommandGrouping extends SingleLineCommand2 { final HColor backColorElement = diagram.getSkinParam().getIHtmlColorSet() .getColorIfValid(arg.get("COLORS", 0)); final HColor backColorGeneral = diagram.getSkinParam().getIHtmlColorSet() - .getColorIfValid(arg.get("COLORS", 1), diagram.getSkinParam().getBackgroundColor()); + .getColorIfValid(arg.get("COLORS", 1), diagram.getSkinParam().getBackgroundColor(true)); String comment = arg.get("COMMENT", 0); final GroupingType groupingType = GroupingType.getType(type); if ("group".equals(type)) { diff --git a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseGroupingElse.java b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseGroupingElse.java index d87fe87df..834cb1950 100644 --- a/src/net/sourceforge/plantuml/skin/rose/ComponentRoseGroupingElse.java +++ b/src/net/sourceforge/plantuml/skin/rose/ComponentRoseGroupingElse.java @@ -70,7 +70,7 @@ public class ComponentRoseGroupingElse extends AbstractTextualComponent { if (SkinParam.USE_STYLES()) { if (spriteContainer instanceof SkinParamBackcolored) { style = style.eventuallyOverride(PName.BackGroundColor, - ((SkinParamBackcolored) spriteContainer).getBackgroundColor()); + ((SkinParamBackcolored) spriteContainer).getBackgroundColor(false)); } this.groupBorder = style.value(PName.LineColor).asColor(getIHtmlColorSet()); this.backgroundColor = style.value(PName.BackGroundColor).asColor(getIHtmlColorSet()); diff --git a/src/net/sourceforge/plantuml/skin/rose/Rose.java b/src/net/sourceforge/plantuml/skin/rose/Rose.java index 9dc8c43c8..37d35337d 100644 --- a/src/net/sourceforge/plantuml/skin/rose/Rose.java +++ b/src/net/sourceforge/plantuml/skin/rose/Rose.java @@ -243,14 +243,14 @@ public class Rose { smallFont = smallFont.changeColor(smallColor); } return new ComponentRoseGroupingHeader(styles == null ? null : styles[0], styles == null ? null : styles[1], - param.getBackgroundColor(), getSymbolContext(stereotype, param, ColorParam.sequenceGroupBorder), + param.getBackgroundColor(true), getSymbolContext(stereotype, param, ColorParam.sequenceGroupBorder), bigFont, smallFont, stringsToDisplay, param, roundCorner); } if (type == ComponentType.GROUPING_ELSE) { return new ComponentRoseGroupingElse(styles == null ? null : styles[0], getHtmlColor(param, stereotype, ColorParam.sequenceGroupBorder), getUFont2(param, FontParam.SEQUENCE_GROUP), stringsToDisplay.get(0), param, - param.getBackgroundColor()); + param.getBackgroundColor(true)); } if (type == ComponentType.GROUPING_SPACE) { return new ComponentRoseGroupingSpace(7); diff --git a/src/net/sourceforge/plantuml/stats/StatsUtilsIncrement.java b/src/net/sourceforge/plantuml/stats/StatsUtilsIncrement.java index cafbbb211..8c3d0662e 100644 --- a/src/net/sourceforge/plantuml/stats/StatsUtilsIncrement.java +++ b/src/net/sourceforge/plantuml/stats/StatsUtilsIncrement.java @@ -61,6 +61,9 @@ public class StatsUtilsIncrement { final private static FormatCounter formatCounterEver = StatsUtils.formatCounterEver; public static void onceMoreParse(long duration, Class type) { + if (StatsUtils.fullEver == null || StatsUtils.historicalData == null) { + return; + } getByTypeCurrent(type).parsed().addValue(duration); final ParsedGenerated byTypeEver = getByTypeEver(type); byTypeEver.parsed().addValue(duration); @@ -74,6 +77,12 @@ public class StatsUtilsIncrement { } public static void onceMoreGenerate(long duration, Class type, FileFormat fileFormat) { + if (StatsUtils.fullEver == null || StatsUtils.historicalData == null) { + return; + } + if (formatCounterCurrent == null || formatCounterEver == null) { + return; + } getByTypeCurrent(type).generated().addValue(duration); final ParsedGenerated byTypeEver = getByTypeEver(type); byTypeEver.generated().addValue(duration); diff --git a/src/net/sourceforge/plantuml/sudoku/GraphicsSudoku.java b/src/net/sourceforge/plantuml/sudoku/GraphicsSudoku.java index 812916d6a..70bc4048d 100644 --- a/src/net/sourceforge/plantuml/sudoku/GraphicsSudoku.java +++ b/src/net/sourceforge/plantuml/sudoku/GraphicsSudoku.java @@ -102,7 +102,7 @@ public class GraphicsSudoku { } public ImageData writeImagePng(OutputStream os) throws IOException { - final EmptyImageBuilder builder = new EmptyImageBuilder(sudoWidth, sudoHeight + textTotalHeight, Color.WHITE); + final EmptyImageBuilder builder = new EmptyImageBuilder(null, sudoWidth, sudoHeight + textTotalHeight, Color.WHITE); final BufferedImage im = builder.getBufferedImage(); final Graphics2D g3d = builder.getGraphics2D(); diff --git a/src/net/sourceforge/plantuml/svek/Cluster.java b/src/net/sourceforge/plantuml/svek/Cluster.java index 259571322..1e3cc79c4 100644 --- a/src/net/sourceforge/plantuml/svek/Cluster.java +++ b/src/net/sourceforge/plantuml/svek/Cluster.java @@ -56,7 +56,6 @@ import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.LineParam; import net.sourceforge.plantuml.SkinParam; import net.sourceforge.plantuml.SkinParamUtils; -import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.UmlDiagramType; import net.sourceforge.plantuml.Url; import net.sourceforge.plantuml.cucadiagram.EntityPosition; @@ -90,6 +89,7 @@ import net.sourceforge.plantuml.ugraphic.UStroke; import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.color.HColor; import net.sourceforge.plantuml.ugraphic.color.HColorBackground; +import net.sourceforge.plantuml.ugraphic.color.HColorUtils; import net.sourceforge.plantuml.utils.UniqueSequence; public class Cluster implements Moveable { @@ -757,7 +757,7 @@ public class Cluster implements Moveable { } sb.append("subgraph " + getClusterId() + " {"); sb.append("style=solid;"); - sb.append("color=\"" + StringUtils.getAsHtml(color) + "\";"); + sb.append("color=\"" + DotStringFactory.sharp000000(color) + "\";"); final String label; if (isLabel()) { @@ -889,8 +889,8 @@ public class Cluster implements Moveable { if (backColor == null) { backColor = style.value(PName.BackGroundColor).asColor(skinParam.getIHtmlColorSet()); } - if (backColor == null /* || stateBack instanceof HtmlColorTransparent */) { - backColor = new HColorBackground(skinParam.getBackgroundColor()); + if (backColor == null || backColor.equals(HColorUtils.transparent()) /* || stateBack instanceof HtmlColorTransparent */) { + backColor = new HColorBackground(skinParam.getBackgroundColor(true)); } return backColor; } @@ -900,8 +900,8 @@ public class Cluster implements Moveable { if (backColor == null) { backColor = skinParam.getHtmlColor(ColorParam.background, stereotype, false); } - if (backColor == null /* || stateBack instanceof HtmlColorTransparent */) { - backColor = new HColorBackground(skinParam.getBackgroundColor()); + if (backColor == null || backColor.equals(HColorUtils.transparent()) /* || stateBack instanceof HtmlColorTransparent */) { + backColor = new HColorBackground(skinParam.getBackgroundColor(true)); } return backColor; } diff --git a/src/net/sourceforge/plantuml/svek/ConcurrentStateImage.java b/src/net/sourceforge/plantuml/svek/ConcurrentStateImage.java index fc137c412..7671cb2cb 100644 --- a/src/net/sourceforge/plantuml/svek/ConcurrentStateImage.java +++ b/src/net/sourceforge/plantuml/svek/ConcurrentStateImage.java @@ -109,7 +109,7 @@ public final class ConcurrentStateImage extends AbstractTextBlock implements IEn HColor backColor) { this.separator = Separator.fromChar(concurrentSeparator); this.skinParam = skinParam; - this.backColor = skinParam.getBackgroundColor(); + this.backColor = skinParam.getBackgroundColor(false); this.inners.addAll(images); } diff --git a/src/net/sourceforge/plantuml/svek/CucaDiagramFileMakerSvek2InternalImage.java b/src/net/sourceforge/plantuml/svek/CucaDiagramFileMakerSvek2InternalImage.java index 85ae8d800..b7fac7143 100644 --- a/src/net/sourceforge/plantuml/svek/CucaDiagramFileMakerSvek2InternalImage.java +++ b/src/net/sourceforge/plantuml/svek/CucaDiagramFileMakerSvek2InternalImage.java @@ -139,7 +139,7 @@ public final class CucaDiagramFileMakerSvek2InternalImage extends AbstractTextBl } public HColor getBackcolor() { - return skinParam.getBackgroundColor(); + return skinParam.getBackgroundColor(false); } public double getOverscanX(StringBounder stringBounder) { diff --git a/src/net/sourceforge/plantuml/svek/DotStringFactory.java b/src/net/sourceforge/plantuml/svek/DotStringFactory.java index 5d1fad9d4..19fb8bd34 100644 --- a/src/net/sourceforge/plantuml/svek/DotStringFactory.java +++ b/src/net/sourceforge/plantuml/svek/DotStringFactory.java @@ -454,7 +454,7 @@ public class DotStringFactory implements Moveable { } private int getClusterIndex(final String svg, int colorInt) { - final String colorString = StringUtils.goLowerCase(StringUtils.getAsHtml(colorInt)); + final String colorString = StringUtils.goLowerCase(DotStringFactory.sharp000000(colorInt)); final String keyTitle1 = "=\"" + colorString + "\""; int idx = svg.indexOf(keyTitle1); if (idx == -1) { @@ -467,6 +467,20 @@ public class DotStringFactory implements Moveable { return idx; } + public static String sharp000000(int color) { + final int v = 0xFFFFFF & color; + String s = "000000" + Integer.toHexString(v).toUpperCase(); + s = s.substring(s.length() - 6); + return "#" + s; + } + + public static String sharpAlpha(int color) { + final int v = color; + String s = "00000000" + Integer.toHexString(v).toUpperCase(); + s = s.substring(s.length() - 8); + return "#" + s; + } + public void openCluster(int titleAndAttributeWidth, int titleAndAttributeHeight, TextBlock title, TextBlock stereo, IGroup g) { this.current = current.createChild(titleAndAttributeWidth, titleAndAttributeHeight, title, stereo, diff --git a/src/net/sourceforge/plantuml/svek/Line.java b/src/net/sourceforge/plantuml/svek/Line.java index 4d0868b62..354a1de1d 100644 --- a/src/net/sourceforge/plantuml/svek/Line.java +++ b/src/net/sourceforge/plantuml/svek/Line.java @@ -51,7 +51,6 @@ import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.LineParam; import net.sourceforge.plantuml.Log; import net.sourceforge.plantuml.Pragma; -import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.UmlDiagramType; import net.sourceforge.plantuml.Url; import net.sourceforge.plantuml.command.Position; @@ -246,7 +245,7 @@ public class Line implements Moveable, Hideable { skinParam = link.getColors().mute(skinParam); labelFont = labelFont.mute(link.getColors()); } - this.backgroundColor = skinParam.getBackgroundColor(); + this.backgroundColor = skinParam.getBackgroundColor(false); this.defaultThickness = skinParam.getThickness(LineParam.arrow, null); this.arrowLollipopColor = skinParam.getHtmlColor(ColorParam.arrowLollipop, null, false); if (arrowLollipopColor == null) { @@ -405,7 +404,7 @@ public class Line implements Moveable, Hideable { sb.append("minlen=" + (length - 1)); sb.append(","); } - sb.append("color=\"" + StringUtils.getAsHtml(lineColor) + "\""); + sb.append("color=\"" + DotStringFactory.sharp000000(lineColor) + "\""); if (labelText != null || link.getLinkConstraint() != null) { sb.append(","); if (graphvizVersion.useXLabelInsteadOfLabel() || dotMode == DotMode.NO_LEFT_RIGHT_AND_XLABEL) { @@ -475,7 +474,7 @@ public class Line implements Moveable, Hideable { public static void appendTable(StringBuilder sb, int w, int h, int col) { sb.append(""); sb.append(""); diff --git a/src/net/sourceforge/plantuml/svek/Node.java b/src/net/sourceforge/plantuml/svek/Node.java index d6601e32d..ce1400646 100644 --- a/src/net/sourceforge/plantuml/svek/Node.java +++ b/src/net/sourceforge/plantuml/svek/Node.java @@ -42,7 +42,6 @@ import java.util.Map; import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.Hideable; -import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.cucadiagram.EntityPosition; import net.sourceforge.plantuml.cucadiagram.IGroup; import net.sourceforge.plantuml.cucadiagram.ILeaf; @@ -155,7 +154,7 @@ public class Node implements Positionable, IShapePseudo, Hideable { sb.append(","); sb.append("height=" + SvekUtils.pixelToInches(getHeight())); sb.append(","); - sb.append("color=\"" + StringUtils.getAsHtml(color) + "\""); + sb.append("color=\"" + DotStringFactory.sharp000000(color) + "\""); sb.append("];"); SvekUtils.println(sb); } @@ -182,7 +181,7 @@ public class Node implements Positionable, IShapePseudo, Hideable { sb.append(""); sb.append(""); appendTd(sb, shield.getX1(), 1); - sb.append(""); @@ -204,7 +203,7 @@ public class Node implements Positionable, IShapePseudo, Hideable { sb.append("shape=plaintext,"); // sb.append("color=\"" + StringUtils.getAsHtml(color) + "\","); sb.append("label=<"); - sb.append("
"); sb.append("
"); double position = 0; for (Map.Entry ent : ports.getAllWithEncodedPortId().entrySet()) { diff --git a/src/net/sourceforge/plantuml/svek/SvekResult.java b/src/net/sourceforge/plantuml/svek/SvekResult.java index 00c45e6e9..c8acc9d83 100644 --- a/src/net/sourceforge/plantuml/svek/SvekResult.java +++ b/src/net/sourceforge/plantuml/svek/SvekResult.java @@ -137,7 +137,7 @@ public final class SvekResult extends AbstractTextBlock implements IEntityImage, } public HColor getBackcolor() { - return dotData.getSkinParam().getBackgroundColor(); + return dotData.getSkinParam().getBackgroundColor(false); } public Dimension2D calculateDimension(StringBounder stringBounder) { diff --git a/src/net/sourceforge/plantuml/svek/SvgResult.java b/src/net/sourceforge/plantuml/svek/SvgResult.java index 561489b2c..e4cac8bf1 100644 --- a/src/net/sourceforge/plantuml/svek/SvgResult.java +++ b/src/net/sourceforge/plantuml/svek/SvgResult.java @@ -73,17 +73,17 @@ public class SvgResult { } public int getIndexFromColor(int color) { - String s = "stroke=\"" + StringUtils.goLowerCase(StringUtils.getAsHtml(color)) + "\""; + String s = "stroke=\"" + StringUtils.goLowerCase(DotStringFactory.sharp000000(color)) + "\""; int idx = svg.indexOf(s); if (idx != -1) { return idx; } - s = ";stroke:" + StringUtils.goLowerCase(StringUtils.getAsHtml(color)) + ";"; + s = ";stroke:" + StringUtils.goLowerCase(DotStringFactory.sharp000000(color)) + ";"; idx = svg.indexOf(s); if (idx != -1) { return idx; } - s = "fill=\"" + StringUtils.goLowerCase(StringUtils.getAsHtml(color)) + "\""; + s = "fill=\"" + StringUtils.goLowerCase(DotStringFactory.sharp000000(color)) + "\""; idx = svg.indexOf(s); if (idx != -1) { return idx; diff --git a/src/net/sourceforge/plantuml/svg/SvgGraphics.java b/src/net/sourceforge/plantuml/svg/SvgGraphics.java index 2f2137e44..4cd9f3396 100644 --- a/src/net/sourceforge/plantuml/svg/SvgGraphics.java +++ b/src/net/sourceforge/plantuml/svg/SvgGraphics.java @@ -175,8 +175,8 @@ public class SvgGraphics { private Element pendingBackground; public void paintBackcolorGradient(ColorMapper mapper, HColorGradient gr) { - final String id = createSvgGradient(StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor1())), - StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor2())), gr.getPolicy()); + final String id = createSvgGradient(mapper.toHtml(gr.getColor1()), + mapper.toHtml(gr.getColor2()), gr.getPolicy()); setFillColor("url(#" + id + ")"); setStrokeColor(null); pendingBackground = createRectangleInternal(0, 0, 0, 0); diff --git a/src/net/sourceforge/plantuml/timingdiagram/Player.java b/src/net/sourceforge/plantuml/timingdiagram/Player.java index 3d53760e4..2801c2856 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/Player.java +++ b/src/net/sourceforge/plantuml/timingdiagram/Player.java @@ -44,20 +44,25 @@ import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.color.Colors; -import net.sourceforge.plantuml.timingdiagram.graphic.PlayerFrame; public abstract class Player implements TimeProjected { protected final ISkinParam skinParam; protected final TimingRuler ruler; + private final boolean compact; private final Display title; - public Player(String title, ISkinParam skinParam, TimingRuler ruler) { + public Player(String title, ISkinParam skinParam, TimingRuler ruler, boolean compact) { this.skinParam = skinParam; + this.compact = compact; this.ruler = ruler; this.title = Display.getWithNewlines(title); } + public boolean isCompact() { + return compact; + } + final protected FontConfiguration getFontConfiguration() { return new FontConfiguration(skinParam, FontParam.TIMING, null); } @@ -74,12 +79,12 @@ public abstract class Player implements TimeProjected { public abstract void createConstraint(TimeTick tick1, TimeTick tick2, String message); - public abstract PlayerFrame getPlayerFrame(); - - public abstract TextBlock getPart1(); + public abstract TextBlock getPart1(double fullAvailableWidth, double specialVSpace); public abstract UDrawable getPart2(); public abstract double getFullHeight(StringBounder stringBounder); + // public abstract void drawFrameTitle(UGraphic ug); + } diff --git a/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java b/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java index 71db567d8..0158b7b90 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java +++ b/src/net/sourceforge/plantuml/timingdiagram/PlayerBinary.java @@ -35,6 +35,7 @@ package net.sourceforge.plantuml.timingdiagram; import java.awt.geom.Dimension2D; +import java.awt.geom.Point2D; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; @@ -50,8 +51,6 @@ import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.timingdiagram.graphic.IntricatedPoint; -import net.sourceforge.plantuml.timingdiagram.graphic.PlayerFrame; -import net.sourceforge.plantuml.timingdiagram.graphic.PlayerFrameEmpty; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.ULine; import net.sourceforge.plantuml.ugraphic.UStroke; @@ -62,21 +61,26 @@ public class PlayerBinary extends Player { private static final int HEIGHT = 30; private final SortedMap values = new TreeMap(); + private Boolean initialState; - public PlayerBinary(String code, ISkinParam skinParam, TimingRuler ruler) { - super(code, skinParam, ruler); + public PlayerBinary(String code, ISkinParam skinParam, TimingRuler ruler, boolean compact) { + super(code, skinParam, ruler, compact); } public double getFullHeight(StringBounder stringBounder) { return HEIGHT; } + public void drawFrameTitle(UGraphic ug) { + } + private SymbolContext getContext() { return new SymbolContext(HColorUtils.COL_D7E0F2, HColorUtils.COL_038048).withStroke(new UStroke(1.5)); } public IntricatedPoint getTimeProjection(StringBounder stringBounder, TimeTick tick) { - throw new UnsupportedOperationException(); + final double x = ruler.getPosInPixel(tick); + return new IntricatedPoint(new Point2D.Double(x, getYpos(false)), new Point2D.Double(x, getYpos(true))); } public void addNote(TimeTick now, Display note, Position position) { @@ -89,7 +93,11 @@ public class PlayerBinary extends Player { public void setState(TimeTick now, String comment, Colors color, String... states) { final boolean state = getState(states[0]); - this.values.put(now, state); + if (now == null) { + this.initialState = state; + } else { + this.values.put(now, state); + } } private boolean getState(String value) { @@ -102,15 +110,11 @@ public class PlayerBinary extends Player { private final double ymargin = 8; - public PlayerFrame getPlayerFrame() { - return new PlayerFrameEmpty(); - } - private double getYpos(boolean state) { return state ? ymargin : HEIGHT - ymargin; } - public TextBlock getPart1() { + public TextBlock getPart1(double fullAvailableWidth, double specialVSpace) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { @@ -133,7 +137,7 @@ public class PlayerBinary extends Player { public void drawU(UGraphic ug) { ug = getContext().apply(ug); double lastx = 0; - boolean lastValue = false; + boolean lastValue = initialState == null ? false : initialState; for (Map.Entry ent : values.entrySet()) { final double x = ruler.getPosInPixel(ent.getKey()); ug.apply(new UTranslate(lastx, getYpos(lastValue))).draw(ULine.hline(x - lastx)); diff --git a/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java b/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java index 124e59cbd..522d9fc6c 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java +++ b/src/net/sourceforge/plantuml/timingdiagram/PlayerClock.java @@ -46,8 +46,6 @@ import net.sourceforge.plantuml.graphic.TextBlockUtils; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.timingdiagram.graphic.IntricatedPoint; -import net.sourceforge.plantuml.timingdiagram.graphic.PlayerFrame; -import net.sourceforge.plantuml.timingdiagram.graphic.PlayerFrameEmpty; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.ULine; import net.sourceforge.plantuml.ugraphic.UStroke; @@ -58,9 +56,10 @@ public class PlayerClock extends Player { private final int period; private final int pulse; + private final double ymargin = 8; - public PlayerClock(ISkinParam skinParam, TimingRuler ruler, int period, int pulse) { - super("", skinParam, ruler); + public PlayerClock(ISkinParam skinParam, TimingRuler ruler, int period, int pulse, boolean compact) { + super("", skinParam, ruler, compact); this.period = period; this.pulse = pulse; } @@ -69,6 +68,9 @@ public class PlayerClock extends Player { return 30; } + public void drawFrameTitle(UGraphic ug) { + } + private SymbolContext getContext() { return new SymbolContext(HColorUtils.COL_D7E0F2, HColorUtils.COL_038048).withStroke(new UStroke(1.5)); } @@ -93,12 +95,6 @@ public class PlayerClock extends Player { throw new UnsupportedOperationException(); } - private final double ymargin = 8; - - public PlayerFrame getPlayerFrame() { - return new PlayerFrameEmpty(); - } - private double getPulseCoef() { if (pulse == 0) { return 0.5; @@ -110,7 +106,7 @@ public class PlayerClock extends Player { return period; } - public TextBlock getPart1() { + public TextBlock getPart1(double fullAvailableWidth, double specialVSpace) { return TextBlockUtils.empty(0, 0); } diff --git a/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java b/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java index 65f56ce4b..4f3e0ca78 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java +++ b/src/net/sourceforge/plantuml/timingdiagram/PlayerRobustConcise.java @@ -52,9 +52,8 @@ import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.graphic.color.Colors; import net.sourceforge.plantuml.timingdiagram.graphic.Histogram; import net.sourceforge.plantuml.timingdiagram.graphic.IntricatedPoint; -import net.sourceforge.plantuml.timingdiagram.graphic.PlayerDrawing; +import net.sourceforge.plantuml.timingdiagram.graphic.PDrawing; import net.sourceforge.plantuml.timingdiagram.graphic.PlayerFrame; -import net.sourceforge.plantuml.timingdiagram.graphic.PlayerFrame2; import net.sourceforge.plantuml.timingdiagram.graphic.Ribbon; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UTranslate; @@ -68,38 +67,38 @@ public final class PlayerRobustConcise extends Player { private final TimingStyle type; private String initialState; - private PlayerDrawing cached; + private PDrawing cached; private Colors initialColors; - public PlayerRobustConcise(TimingStyle type, String full, ISkinParam skinParam, TimingRuler ruler) { - super(full, skinParam, ruler); + public PlayerRobustConcise(TimingStyle type, String full, ISkinParam skinParam, TimingRuler ruler, + boolean compact) { + super(full, skinParam, ruler, compact); this.type = type; } - private PlayerDrawing buildPlayerDrawing() { + private PDrawing buildPDrawing() { if (type == TimingStyle.CONCISE) { - return new Ribbon(ruler, skinParam, notes); + return new Ribbon(ruler, skinParam, notes, isCompact(), getTitle()); } if (type == TimingStyle.ROBUST) { - return new Histogram(ruler, skinParam, statesLabel.values()); + return new Histogram(ruler, skinParam, statesLabel.values(), isCompact(), getTitle()); } throw new IllegalStateException(); } - public final PlayerFrame getPlayerFrame() { - return new PlayerFrame2(getTitle()); - } - - public final TextBlock getPart1() { + public final TextBlock getPart1(final double fullAvailableWidth, final double specialVSpace) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { - ug = ug.apply(getTranslateForTimeDrawing(ug.getStringBounder())); - getTimeDrawing().getPart1().drawU(ug); + if (isCompact() == false) { + new PlayerFrame(getTitle()).drawFrameTitle(ug); + } + ug = ug.apply(getTranslateForTimeDrawing(ug.getStringBounder())).apply(UTranslate.dy(specialVSpace)); + getTimeDrawing().getPart1(fullAvailableWidth).drawU(ug); } public Dimension2D calculateDimension(StringBounder stringBounder) { - return getTimeDrawing().getPart1().calculateDimension(stringBounder); + return getTimeDrawing().getPart1(fullAvailableWidth).calculateDimension(stringBounder); } }; } @@ -122,18 +121,21 @@ public final class PlayerRobustConcise extends Player { } private double getTitleHeight(StringBounder stringBounder) { + if (isCompact()) { + return 6; + } return getTitle().calculateDimension(stringBounder).getHeight() + 6; } - private PlayerDrawing getTimeDrawing() { + private PDrawing getTimeDrawing() { if (cached == null) { cached = computeTimeDrawing(); } return cached; } - private PlayerDrawing computeTimeDrawing() { - final PlayerDrawing result = buildPlayerDrawing(); + private PDrawing computeTimeDrawing() { + final PDrawing result = buildPDrawing(); result.setInitialState(initialState, initialColors); for (ChangeState change : changes) { result.addChange(change); diff --git a/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java b/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java index 2dd84a19c..b0a87572b 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java +++ b/src/net/sourceforge/plantuml/timingdiagram/TimingDiagram.java @@ -85,6 +85,7 @@ public class TimingDiagram extends UmlDiagram implements Clocks { private TimeTick now; private Player lastPlayer; private boolean drawTimeAxis = true; + private boolean compactByDefault = false; public DiagramDescription getDescription() { return new DiagramDescription("(Timing Diagram)"); @@ -142,22 +143,36 @@ public class TimingDiagram extends UmlDiagram implements Clocks { private void drawInternal(UGraphic ug) { ruler.ensureNotEmpty(); final StringBounder stringBounder = ug.getStringBounder(); - final UTranslate beforeRuler = UTranslate.dx(getPart1MaxWidth(stringBounder)); - drawBorder(ug); - + final double part1MaxWidth = getPart1MaxWidth(stringBounder); + final UTranslate widthPart1 = UTranslate.dx(part1MaxWidth); + if (compactByDefault == false) { + drawBorder(ug); + } ug = ug.apply(UTranslate.dx(marginX1)); - drawHighlightsBack(ug.apply(beforeRuler)); - ruler.draw0(ug.apply(beforeRuler), getHeightInner(stringBounder)); + drawHighlightsBack(ug.apply(widthPart1)); + ruler.draw0(ug.apply(widthPart1), getHeightInner(stringBounder)); + boolean first = true; for (Player player : players.values()) { - drawHorizontalSeparator(ug.apply(getUTranslateForFrame(player, stringBounder))); - player.getPlayerFrame().drawFrameTitle(ug.apply(getUTranslateForFrame(player, stringBounder))); - final UGraphic ug2 = ug.apply(getUTranslateForPlayer(player, stringBounder)); - player.getPart2().drawU(ug2.apply(beforeRuler)); - player.getPart1().drawU(ug2); + final UGraphic ugPlayer = ug.apply(getUTranslateForPlayer(player, stringBounder)); + final double caption = getHeightForCaptions(stringBounder); + if (first) { + if (player.isCompact() == false) { + drawHorizontalSeparator(ugPlayer); + } + player.getPart1(part1MaxWidth, caption).drawU(ugPlayer); + player.getPart2().drawU(ugPlayer.apply(widthPart1).apply(UTranslate.dy(caption))); + } else { + if (player.isCompact() == false) { + drawHorizontalSeparator(ugPlayer.apply(UTranslate.dy(caption))); + } + player.getPart1(part1MaxWidth, 0).drawU(ugPlayer.apply(UTranslate.dy(caption))); + player.getPart2().drawU(ugPlayer.apply(widthPart1).apply(UTranslate.dy(caption))); + } + first = false; } - ug = ug.apply(beforeRuler); + ug = ug.apply(widthPart1); if (this.drawTimeAxis) { ruler.drawTimeAxis(ug.apply(getLastTranslate(stringBounder))); } @@ -188,7 +203,7 @@ public class TimingDiagram extends UmlDiagram implements Clocks { } private UTranslate getLastTranslate(final StringBounder stringBounder) { - return getUTranslateForPlayer(null, stringBounder); + return getUTranslateForPlayer(null, stringBounder).compose(UTranslate.dy(getHeightForCaptions(stringBounder))); } private void drawHighlightsBack(UGraphic ug) { @@ -215,7 +230,7 @@ public class TimingDiagram extends UmlDiagram implements Clocks { return getLastTranslate(stringBounder).getDy(); } - private double getHeightHighlights(StringBounder stringBounder) { + private double getHeightForCaptions(StringBounder stringBounder) { double result = 0; for (Highlight highlight : highlights) { final TextBlock caption = highlight.getCaption(getSkinParam()); @@ -231,7 +246,7 @@ public class TimingDiagram extends UmlDiagram implements Clocks { private double getPart1MaxWidth(StringBounder stringBounder) { double width = 0; for (Player player : players.values()) { - width = Math.max(width, player.getPart1().calculateDimension(stringBounder).getWidth()); + width = Math.max(width, player.getPart1(0, 0).calculateDimension(stringBounder).getWidth()); } return width; @@ -241,11 +256,14 @@ public class TimingDiagram extends UmlDiagram implements Clocks { final Player player1 = message.getPlayer1(); final Player player2 = message.getPlayer2(); - final UTranslate translate1 = getUTranslateForPlayer(player1, ug.getStringBounder()); - final UTranslate translate2 = getUTranslateForPlayer(player2, ug.getStringBounder()); + final StringBounder stringBounder = ug.getStringBounder(); + final UTranslate translate1 = getUTranslateForPlayer(player1, stringBounder) + .compose(UTranslate.dy(getHeightForCaptions(stringBounder))); + final UTranslate translate2 = getUTranslateForPlayer(player2, stringBounder) + .compose(UTranslate.dy(getHeightForCaptions(stringBounder))); - final IntricatedPoint pt1 = player1.getTimeProjection(ug.getStringBounder(), message.getTick1()); - final IntricatedPoint pt2 = player2.getTimeProjection(ug.getStringBounder(), message.getTick2()); + final IntricatedPoint pt1 = player1.getTimeProjection(stringBounder, message.getTick1()); + final IntricatedPoint pt2 = player2.getTimeProjection(stringBounder, message.getTick2()); if (pt1 == null || pt2 == null) { return; @@ -257,15 +275,15 @@ public class TimingDiagram extends UmlDiagram implements Clocks { } - private UTranslate getUTranslateForFrame(Player candidat, StringBounder stringBounder) { + private UTranslate getUTranslateForPlayer(Player candidat, StringBounder stringBounder) { double y = 0; for (Player player : players.values()) { if (candidat == player) { return UTranslate.dy(y); } - if (y == 0) { - y += getHeightHighlights(stringBounder); - } +// if (y == 0) { +// y += getHeightHighlights(stringBounder); +// } y += player.getFullHeight(stringBounder); } if (candidat == null) { @@ -274,29 +292,15 @@ public class TimingDiagram extends UmlDiagram implements Clocks { throw new IllegalArgumentException(); } - public UTranslate getUTranslateForPlayer(Player candidat, StringBounder stringBounder) { - double y = getHeightHighlights(stringBounder); - for (Player player : players.values()) { - if (candidat == player) { - return UTranslate.dy(y); - } - y += player.getFullHeight(stringBounder); - } - if (candidat == null) { - return UTranslate.dy(y); - } - throw new IllegalArgumentException(); - } - - public CommandExecutionResult createRobustConcise(String code, String full, TimingStyle type) { - final Player player = new PlayerRobustConcise(type, full, getSkinParam(), ruler); + public CommandExecutionResult createRobustConcise(String code, String full, TimingStyle type, boolean compact) { + final Player player = new PlayerRobustConcise(type, full, getSkinParam(), ruler, compactByDefault || compact); players.put(code, player); lastPlayer = player; return CommandExecutionResult.ok(); } - public CommandExecutionResult createClock(String code, String full, int period, int pulse) { - final PlayerClock player = new PlayerClock(getSkinParam(), ruler, period, pulse); + public CommandExecutionResult createClock(String code, String full, int period, int pulse, boolean compact) { + final PlayerClock player = new PlayerClock(getSkinParam(), ruler, period, pulse, compactByDefault); players.put(code, player); clocks.put(code, player); final TimeTick tick = new TimeTick(new BigDecimal(period), TimingFormat.DECIMAL); @@ -304,8 +308,8 @@ public class TimingDiagram extends UmlDiagram implements Clocks { return CommandExecutionResult.ok(); } - public CommandExecutionResult createBinary(String code, String full) { - final Player player = new PlayerBinary(code, getSkinParam(), ruler); + public CommandExecutionResult createBinary(String code, String full, boolean compact) { + final Player player = new PlayerBinary(full, getSkinParam(), ruler, compactByDefault); players.put(code, player); return CommandExecutionResult.ok(); } @@ -372,4 +376,8 @@ public class TimingDiagram extends UmlDiagram implements Clocks { } + public void goCompactMode() { + this.compactByDefault = true; + } + } diff --git a/src/net/sourceforge/plantuml/timingdiagram/TimingDiagramFactory.java b/src/net/sourceforge/plantuml/timingdiagram/TimingDiagramFactory.java index 50863f66f..e2ade9c1f 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/TimingDiagramFactory.java +++ b/src/net/sourceforge/plantuml/timingdiagram/TimingDiagramFactory.java @@ -52,6 +52,7 @@ import net.sourceforge.plantuml.timingdiagram.command.CommandDefineStateLong; import net.sourceforge.plantuml.timingdiagram.command.CommandDefineStateShort; import net.sourceforge.plantuml.timingdiagram.command.CommandHideTimeAxis; import net.sourceforge.plantuml.timingdiagram.command.CommandHighlight; +import net.sourceforge.plantuml.timingdiagram.command.CommandModeCompact; import net.sourceforge.plantuml.timingdiagram.command.CommandNote; import net.sourceforge.plantuml.timingdiagram.command.CommandNoteLong; import net.sourceforge.plantuml.timingdiagram.command.CommandRobustConcise; @@ -88,6 +89,7 @@ public class TimingDiagramFactory extends UmlDiagramFactory { cmds.add(new CommandScalePixel()); cmds.add(new CommandHideTimeAxis()); cmds.add(new CommandHighlight()); + cmds.add(new CommandModeCompact()); return cmds; } diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/CommandBinary.java b/src/net/sourceforge/plantuml/timingdiagram/command/CommandBinary.java index 6d8b492bd..b8219f307 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/command/CommandBinary.java +++ b/src/net/sourceforge/plantuml/timingdiagram/command/CommandBinary.java @@ -41,6 +41,7 @@ import net.sourceforge.plantuml.command.SingleLineCommand2; import net.sourceforge.plantuml.command.regex.IRegex; import net.sourceforge.plantuml.command.regex.RegexConcat; import net.sourceforge.plantuml.command.regex.RegexLeaf; +import net.sourceforge.plantuml.command.regex.RegexOptional; import net.sourceforge.plantuml.command.regex.RegexResult; import net.sourceforge.plantuml.timingdiagram.TimingDiagram; @@ -52,6 +53,10 @@ public class CommandBinary extends SingleLineCommand2 { private static IRegex getRegexConcat() { return RegexConcat.build(CommandBinary.class.getName(), RegexLeaf.start(), // + new RegexOptional( // + new RegexConcat( // + new RegexLeaf("COMPACT", "(compact)"), // + RegexLeaf.spaceOneOrMore())), // new RegexLeaf("binary"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("FULL", "[%g]([^%g]+)[%g]"), // @@ -63,9 +68,10 @@ public class CommandBinary extends SingleLineCommand2 { @Override final protected CommandExecutionResult executeArg(TimingDiagram diagram, LineLocation location, RegexResult arg) { + final String compact = arg.get("COMPACT", 0); final String code = arg.get("CODE", 0); final String full = arg.get("FULL", 0); - return diagram.createBinary(code, full); + return diagram.createBinary(code, full, compact != null); } } diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/CommandClock.java b/src/net/sourceforge/plantuml/timingdiagram/command/CommandClock.java index d13c0514d..244625251 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/command/CommandClock.java +++ b/src/net/sourceforge/plantuml/timingdiagram/command/CommandClock.java @@ -53,6 +53,10 @@ public class CommandClock extends SingleLineCommand2 { private static IRegex getRegexConcat() { return RegexConcat.build(CommandClock.class.getName(), RegexLeaf.start(), // + new RegexOptional( // + new RegexConcat( // + new RegexLeaf("COMPACT", "(compact)"), // + RegexLeaf.spaceOneOrMore())), // new RegexLeaf("TYPE", "clock"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("CODE", "([\\p{L}0-9_.@]+)"), // @@ -63,15 +67,16 @@ public class CommandClock extends SingleLineCommand2 { RegexLeaf.spaceOneOrMore(), // new RegexLeaf("PERIOD", "([0-9]+)"), // new RegexOptional(new RegexConcat( // - RegexLeaf.spaceOneOrMore(),// + RegexLeaf.spaceOneOrMore(), // new RegexLeaf("pulse"), // - RegexLeaf.spaceOneOrMore(),// + RegexLeaf.spaceOneOrMore(), // new RegexLeaf("PULSE", "([0-9]+)") // - )), RegexLeaf.end()); + )), RegexLeaf.end()); } @Override final protected CommandExecutionResult executeArg(TimingDiagram diagram, LineLocation location, RegexResult arg) { + final String compact = arg.get("COMPACT", 0); final String code = arg.get("CODE", 0); final int period = Integer.parseInt(arg.get("PERIOD", 0)); final String pulseString = arg.get("PULSE", 0); @@ -79,7 +84,7 @@ public class CommandClock extends SingleLineCommand2 { if (pulseString != null) { pulse = Integer.parseInt(pulseString); } - return diagram.createClock(code, code, period, pulse); + return diagram.createClock(code, code, period, pulse, compact != null); } } diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/CommandModeCompact.java b/src/net/sourceforge/plantuml/timingdiagram/command/CommandModeCompact.java new file mode 100644 index 000000000..9108cd1d6 --- /dev/null +++ b/src/net/sourceforge/plantuml/timingdiagram/command/CommandModeCompact.java @@ -0,0 +1,67 @@ +/* ======================================================================== + * PlantUML : a free UML diagram generator + * ======================================================================== + * + * (C) Copyright 2009-2020, 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 net.sourceforge.plantuml.timingdiagram.command; + +import net.sourceforge.plantuml.LineLocation; +import net.sourceforge.plantuml.command.CommandExecutionResult; +import net.sourceforge.plantuml.command.SingleLineCommand2; +import net.sourceforge.plantuml.command.regex.IRegex; +import net.sourceforge.plantuml.command.regex.RegexConcat; +import net.sourceforge.plantuml.command.regex.RegexLeaf; +import net.sourceforge.plantuml.command.regex.RegexResult; +import net.sourceforge.plantuml.timingdiagram.TimingDiagram; + +public class CommandModeCompact extends SingleLineCommand2 { + + public CommandModeCompact() { + super(getRegexConcat()); + } + + private static IRegex getRegexConcat() { + return RegexConcat.build(CommandModeCompact.class.getName(), RegexLeaf.start(), // + new RegexLeaf("mode"), // + RegexLeaf.spaceOneOrMore(), // + new RegexLeaf("compact"), // + RegexLeaf.end()); + } + + @Override + final protected CommandExecutionResult executeArg(TimingDiagram diagram, LineLocation location, RegexResult arg) { + diagram.goCompactMode(); + return CommandExecutionResult.ok(); + } + +} diff --git a/src/net/sourceforge/plantuml/timingdiagram/command/CommandRobustConcise.java b/src/net/sourceforge/plantuml/timingdiagram/command/CommandRobustConcise.java index 85223a7c7..b2ce340dd 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/command/CommandRobustConcise.java +++ b/src/net/sourceforge/plantuml/timingdiagram/command/CommandRobustConcise.java @@ -41,6 +41,7 @@ import net.sourceforge.plantuml.command.SingleLineCommand2; import net.sourceforge.plantuml.command.regex.IRegex; import net.sourceforge.plantuml.command.regex.RegexConcat; import net.sourceforge.plantuml.command.regex.RegexLeaf; +import net.sourceforge.plantuml.command.regex.RegexOptional; import net.sourceforge.plantuml.command.regex.RegexResult; import net.sourceforge.plantuml.timingdiagram.TimingDiagram; import net.sourceforge.plantuml.timingdiagram.TimingStyle; @@ -53,6 +54,10 @@ public class CommandRobustConcise extends SingleLineCommand2 { private static IRegex getRegexConcat() { return RegexConcat.build(CommandRobustConcise.class.getName(), RegexLeaf.start(), // + new RegexOptional( // + new RegexConcat( // + new RegexLeaf("COMPACT", "(compact)"), // + RegexLeaf.spaceOneOrMore())), // new RegexLeaf("TYPE", "(robust|concise)"), // RegexLeaf.spaceOneOrMore(), // new RegexLeaf("FULL", "[%g]([^%g]+)[%g]"), // @@ -64,10 +69,11 @@ public class CommandRobustConcise extends SingleLineCommand2 { @Override final protected CommandExecutionResult executeArg(TimingDiagram diagram, LineLocation location, RegexResult arg) { + final String compact = arg.get("COMPACT", 0); final String code = arg.get("CODE", 0); final String full = arg.get("FULL", 0); final TimingStyle type = TimingStyle.valueOf(arg.get("TYPE", 0).toUpperCase()); - return diagram.createRobustConcise(code, full, type); + return diagram.createRobustConcise(code, full, type, compact != null); } } diff --git a/src/net/sourceforge/plantuml/timingdiagram/graphic/Histogram.java b/src/net/sourceforge/plantuml/timingdiagram/graphic/Histogram.java index 2d04075c5..d54e22d2e 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/graphic/Histogram.java +++ b/src/net/sourceforge/plantuml/timingdiagram/graphic/Histogram.java @@ -65,7 +65,7 @@ import net.sourceforge.plantuml.ugraphic.UStroke; import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.color.HColorUtils; -public class Histogram implements PlayerDrawing { +public class Histogram implements PDrawing { private final List changes = new ArrayList(); private final List constraints = new ArrayList(); @@ -75,12 +75,17 @@ public class Histogram implements PlayerDrawing { private final ISkinParam skinParam; private final TimingRuler ruler; + private final boolean compact; private String initialState; + private final TextBlock title; - public Histogram(TimingRuler ruler, ISkinParam skinParam, Collection someStates) { + public Histogram(TimingRuler ruler, ISkinParam skinParam, Collection someStates, boolean compact, + TextBlock title) { this.ruler = ruler; this.skinParam = skinParam; this.allStates = new ArrayList(someStates); + this.compact = compact; + this.title = title; Collections.reverse(allStates); } @@ -179,10 +184,10 @@ public class Histogram implements PlayerDrawing { return new SymbolContext(HColorUtils.COL_D7E0F2, HColorUtils.COL_038048).withStroke(new UStroke(1.5)); } - public TextBlock getPart1() { + public TextBlock getPart1(final double fullAvailableWidth) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { - drawPart1(ug); + drawPart1(ug, fullAvailableWidth); } public Dimension2D calculateDimension(StringBounder stringBounder) { @@ -209,18 +214,45 @@ public class Histogram implements PlayerDrawing { if (initialState != null) { width += getInitialWidth(); } + if (compact) { + width += title.calculateDimension(stringBounder).getWidth() + 15; + } return new Dimension2DDouble(width, getFullHeight(stringBounder)); } - private void drawPart1(UGraphic ug) { - ug = ug.apply(UTranslate.dy(getHeightForConstraints(ug.getStringBounder()))); + private void drawPart1(UGraphic ug, double fullAvailableWidth) { + final StringBounder stringBounder = ug.getStringBounder(); + ug = ug.apply(UTranslate.dy(getHeightForConstraints(stringBounder))); + if (compact) { + final double titleHeight = title.calculateDimension(stringBounder).getHeight(); + final double dy = (getFullHeight(stringBounder) - titleHeight) / 2; + title.drawU(ug.apply(UTranslate.dy(dy))); + } + double width = getStatesWidth(stringBounder); + if (initialState != null) { + width += getInitialWidth(); + } + if (fullAvailableWidth > width + 5) + ug = ug.apply(UTranslate.dx(fullAvailableWidth - width - 5)); + else + ug = ug.apply(UTranslate.dx(fullAvailableWidth - width)); for (String state : allStates) { final TextBlock label = getTextBlock(state); - final Dimension2D dim = label.calculateDimension(ug.getStringBounder()); + final Dimension2D dim = label.calculateDimension(stringBounder); label.drawU(ug.apply(UTranslate.dy(yOfState(state) - dim.getHeight() / 2 + 1))); } } + private double getStatesWidth(StringBounder stringBounder) { + double result = 0; + for (String state : allStates) { + final TextBlock label = getTextBlock(state); + final Dimension2D dim = label.calculateDimension(stringBounder); + result = Math.max(result, dim.getWidth()); + } + return result; + } + private void drawPart2(UGraphic ug) { if (changes.size() == 0) { return; diff --git a/src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerDrawing.java b/src/net/sourceforge/plantuml/timingdiagram/graphic/PDrawing.java similarity index 94% rename from src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerDrawing.java rename to src/net/sourceforge/plantuml/timingdiagram/graphic/PDrawing.java index b87796f6c..c4ae2f667 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerDrawing.java +++ b/src/net/sourceforge/plantuml/timingdiagram/graphic/PDrawing.java @@ -42,13 +42,13 @@ import net.sourceforge.plantuml.timingdiagram.ChangeState; import net.sourceforge.plantuml.timingdiagram.TimeConstraint; import net.sourceforge.plantuml.timingdiagram.TimeProjected; -public interface PlayerDrawing extends TimeProjected { +public interface PDrawing extends TimeProjected { public double getFullHeight(StringBounder stringBounder); public void addChange(ChangeState change); - public TextBlock getPart1(); + public TextBlock getPart1(double fullAvailableWidth); public UDrawable getPart2(); diff --git a/src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerFrame.java b/src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerFrame.java index 50d7f4e89..51092f0c0 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerFrame.java +++ b/src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerFrame.java @@ -34,12 +34,41 @@ */ package net.sourceforge.plantuml.timingdiagram.graphic; -import net.sourceforge.plantuml.graphic.StringBounder; +import java.awt.geom.Dimension2D; + +import net.sourceforge.plantuml.graphic.TextBlock; +import net.sourceforge.plantuml.timingdiagram.TimingDiagram; import net.sourceforge.plantuml.ugraphic.UGraphic; +import net.sourceforge.plantuml.ugraphic.ULine; +import net.sourceforge.plantuml.ugraphic.UStroke; +import net.sourceforge.plantuml.ugraphic.UTranslate; +import net.sourceforge.plantuml.ugraphic.color.HColorUtils; -public interface PlayerFrame { +public class PlayerFrame { - public void drawFrameTitle(UGraphic ug); + private final TextBlock title; + + public PlayerFrame(TextBlock title) { + this.title = title; + } + + public void drawFrameTitle(UGraphic ug) { + title.drawU(ug); + final Dimension2D dimTitle = title.calculateDimension(ug.getStringBounder()); + ug = ug.apply(HColorUtils.BLACK).apply(new UStroke(1.0)); + final double widthTmp = dimTitle.getWidth() + 1; + final double height = title.calculateDimension(ug.getStringBounder()).getHeight() + 1; + drawLine(ug, -TimingDiagram.marginX1, height, widthTmp, height, widthTmp + 10, 0); + } + + private void drawLine(UGraphic ug, double... coord) { + for (int i = 0; i < coord.length - 2; i += 2) { + final double x1 = coord[i]; + final double y1 = coord[i + 1]; + final double x2 = coord[i + 2]; + final double y2 = coord[i + 3]; + ug.apply(new UTranslate(x1, y1)).draw(new ULine(x2 - x1, y2 - y1)); + } + } - public double getHeight(StringBounder stringBounder); } diff --git a/src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerFrame2.java b/src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerFrame2.java deleted file mode 100644 index bf7773b60..000000000 --- a/src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerFrame2.java +++ /dev/null @@ -1,80 +0,0 @@ -/* ======================================================================== - * PlantUML : a free UML diagram generator - * ======================================================================== - * - * (C) Copyright 2009-2020, 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 net.sourceforge.plantuml.timingdiagram.graphic; - -import java.awt.geom.Dimension2D; - -import net.sourceforge.plantuml.graphic.StringBounder; -import net.sourceforge.plantuml.graphic.TextBlock; -import net.sourceforge.plantuml.timingdiagram.TimingDiagram; -import net.sourceforge.plantuml.ugraphic.UGraphic; -import net.sourceforge.plantuml.ugraphic.ULine; -import net.sourceforge.plantuml.ugraphic.UStroke; -import net.sourceforge.plantuml.ugraphic.UTranslate; -import net.sourceforge.plantuml.ugraphic.color.HColorUtils; - -public class PlayerFrame2 implements PlayerFrame { - - private final TextBlock title; - - public PlayerFrame2(TextBlock title) { - this.title = title; - } - - public void drawFrameTitle(UGraphic ug) { - title.drawU(ug); - final Dimension2D dimTitle = title.calculateDimension(ug.getStringBounder()); - ug = ug.apply(HColorUtils.BLACK).apply(new UStroke(1.0)); - final double widthTmp = dimTitle.getWidth() + 1; - final double height = getHeight(ug.getStringBounder()); - drawLine(ug, -TimingDiagram.marginX1, height, widthTmp, height, widthTmp + 10, 0); - } - - private void drawLine(UGraphic ug, double... coord) { - for (int i = 0; i < coord.length - 2; i += 2) { - final double x1 = coord[i]; - final double y1 = coord[i + 1]; - final double x2 = coord[i + 2]; - final double y2 = coord[i + 3]; - ug.apply(new UTranslate(x1, y1)).draw(new ULine(x2 - x1, y2 - y1)); - } - } - - public double getHeight(StringBounder stringBounder) { - final Dimension2D dimTitle = title.calculateDimension(stringBounder); - return dimTitle.getHeight() + 1; - } - -} diff --git a/src/net/sourceforge/plantuml/timingdiagram/graphic/Ribbon.java b/src/net/sourceforge/plantuml/timingdiagram/graphic/Ribbon.java index f27543f41..3a032abe3 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/graphic/Ribbon.java +++ b/src/net/sourceforge/plantuml/timingdiagram/graphic/Ribbon.java @@ -64,7 +64,7 @@ import net.sourceforge.plantuml.ugraphic.ULine; import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.color.HColor; -public class Ribbon implements PlayerDrawing { +public class Ribbon implements PDrawing { private final List changes = new ArrayList(); private final List constraints = new ArrayList(); @@ -74,11 +74,15 @@ public class Ribbon implements PlayerDrawing { private String initialState; private Colors initialColors; private final List notes; + private final boolean compact; + private final TextBlock title; - public Ribbon(TimingRuler ruler, ISkinParam skinParam, List notes) { + public Ribbon(TimingRuler ruler, ISkinParam skinParam, List notes, boolean compact, TextBlock title) { + this.compact = compact; this.ruler = ruler; this.skinParam = skinParam; this.notes = notes; + this.title = title; } public IntricatedPoint getTimeProjection(StringBounder stringBounder, TimeTick tick) { @@ -110,16 +114,25 @@ public class Ribbon implements PlayerDrawing { return display.create(getFontConfiguration(), HorizontalAlignment.LEFT, skinParam); } - public TextBlock getPart1() { - if (initialState == null) { - return TextBlockUtils.empty(0, 0); - } + public TextBlock getPart1(double fullAvailableWidth) { +// if (initialState == null) { +// return TextBlockUtils.empty(0, 0); +// } return new AbstractTextBlock() { public void drawU(UGraphic ug) { + if (compact) { + final double titleHeight = title.calculateDimension(ug.getStringBounder()).getHeight(); + final double dy = (getRibbonHeight() - titleHeight) / 2; + title.drawU(ug.apply(UTranslate.dy(dy))); + } } public Dimension2D calculateDimension(StringBounder stringBounder) { - return new Dimension2DDouble(getInitialWidth(stringBounder), getRibbonHeight()); + double width = getInitialWidth(stringBounder); + if (compact) { + width += title.calculateDimension(stringBounder).getWidth() + 10; + } + return new Dimension2DDouble(width, getRibbonHeight()); } }; } @@ -142,7 +155,10 @@ public class Ribbon implements PlayerDrawing { } private double getInitialWidth(final StringBounder stringBounder) { - return createTextBlock(initialState).calculateDimension(stringBounder).getWidth() + getRibbonHeight(); + if (initialState == null) { + return 0; + } + return createTextBlock(initialState).calculateDimension(stringBounder).getWidth() + 24; } private void drawHexa(UGraphic ug, double len, ChangeState change) { diff --git a/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java b/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java index a7e9112fa..78d14e02b 100644 --- a/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java +++ b/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java @@ -65,7 +65,6 @@ import net.sourceforge.plantuml.FileUtils; import net.sourceforge.plantuml.ISkinParam; import net.sourceforge.plantuml.LineParam; import net.sourceforge.plantuml.OptionFlags; -import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.Url; import net.sourceforge.plantuml.anim.AffineTransformation; import net.sourceforge.plantuml.anim.Animation; @@ -139,7 +138,7 @@ public class ImageBuilder { public ImageBuilder(ISkinParam skinParam, double dpiFactor, String metadata, String warningOrError, double margin1, double margin2, Animation animation) { this(skinParam, dpiFactor, metadata, warningOrError, margin1, margin2, animation, - skinParam.getBackgroundColor()); + skinParam.getBackgroundColor(false)); } public ImageBuilder(ISkinParam skinParam, double dpiFactor, String metadata, String warningOrError, double margin1, @@ -390,7 +389,8 @@ public class ImageBuilder { final FileFormat fileFormat = fileFormatOption.getFileFormat(); switch (fileFormat) { case PNG: - return createUGraphicPNG(colorMapper, dpiFactor, dim, mybackcolor, animationArg, dx, dy); + return createUGraphicPNG(colorMapper, dpiFactor, dim, mybackcolor, animationArg, dx, dy, + fileFormatOption.getWatermark()); case SVG: return createUGraphicSVG(colorMapper, dpiFactor, dim, mybackcolor, fileFormatOption.getSvgLinkTarget(), fileFormatOption.getHoverColor(), seed, fileFormatOption.getPreserveAspectRatio()); @@ -416,21 +416,21 @@ public class ImageBuilder { } } - private UGraphic2 createUGraphicSVG(ColorMapper colorMapper, double scale, Dimension2D dim, HColor mybackcolor, + private UGraphic2 createUGraphicSVG(ColorMapper colorMapper, double scale, Dimension2D dim, final HColor suggested, String svgLinkTarget, String hover, long seed, String preserveAspectRatio) { - Color backColor = Color.WHITE; - if (mybackcolor instanceof HColorSimple) { - backColor = colorMapper.getMappedColor(mybackcolor); + HColor backColor = HColorUtils.WHITE; + if (suggested instanceof HColorSimple) { + backColor = suggested; } final UGraphicSvg ug; - if (mybackcolor instanceof HColorGradient) { - ug = new UGraphicSvg(svgDimensionStyle, dim, colorMapper, (HColorGradient) mybackcolor, false, scale, + if (suggested instanceof HColorGradient) { + ug = new UGraphicSvg(svgDimensionStyle, dim, colorMapper, (HColorGradient) suggested, false, scale, svgLinkTarget, hover, seed, preserveAspectRatio); - } else if (backColor == null || backColor.equals(Color.WHITE)) { + } else if (backColor == null || colorMapper.toColor(backColor).equals(Color.WHITE)) { ug = new UGraphicSvg(svgDimensionStyle, dim, colorMapper, false, scale, svgLinkTarget, hover, seed, preserveAspectRatio); } else { - ug = new UGraphicSvg(svgDimensionStyle, dim, colorMapper, StringUtils.getAsHtml(backColor), false, scale, + ug = new UGraphicSvg(svgDimensionStyle, dim, colorMapper, colorMapper.toSvg(backColor), false, scale, svgLinkTarget, hover, seed, preserveAspectRatio); } return ug; @@ -438,10 +438,10 @@ public class ImageBuilder { } private UGraphic2 createUGraphicPNG(ColorMapper colorMapper, double dpiFactor, final Dimension2D dim, - HColor mybackcolor, Animation affineTransforms, double dx, double dy) { + HColor mybackcolor, Animation affineTransforms, double dx, double dy, String watermark) { Color backColor = Color.WHITE; if (mybackcolor instanceof HColorSimple) { - backColor = colorMapper.getMappedColor(mybackcolor); + backColor = colorMapper.toColor(mybackcolor); } else if (mybackcolor instanceof HColorBackground) { backColor = null; } @@ -452,7 +452,7 @@ public class ImageBuilder { * builder.getGraphics2D(); graphics2D.rotate(-Math.PI / 2); * graphics2D.translate(-builder.getBufferedImage().getHeight(), 0); } else { */ - final EmptyImageBuilder builder = new EmptyImageBuilder((int) (dim.getWidth() * dpiFactor), + final EmptyImageBuilder builder = new EmptyImageBuilder(watermark, (int) (dim.getWidth() * dpiFactor), (int) (dim.getHeight() * dpiFactor), backColor); final Graphics2D graphics2D = builder.getGraphics2D(); @@ -462,8 +462,7 @@ public class ImageBuilder { ug.setBufferedImage(builder.getBufferedImage()); final BufferedImage im = ((UGraphicG2d) ug).getBufferedImage(); if (mybackcolor instanceof HColorGradient) { - ug.apply(mybackcolor.bg()) - .draw(new URectangle(im.getWidth() / dpiFactor, im.getHeight() / dpiFactor)); + ug.apply(mybackcolor.bg()).draw(new URectangle(im.getWidth() / dpiFactor, im.getHeight() / dpiFactor)); } return ug; diff --git a/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java b/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java index 65f6c7e0d..dc331a18f 100644 --- a/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java +++ b/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java @@ -44,7 +44,6 @@ import java.io.OutputStream; import net.sourceforge.plantuml.EmptyImageBuilder; import net.sourceforge.plantuml.FileFormat; import net.sourceforge.plantuml.FileFormatOption; -import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.eps.EpsStrategy; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.png.PngIO; @@ -60,12 +59,12 @@ public abstract class UGraphicUtils { ColorMapper colorMapper, HColor background, TextBlock image) throws IOException { final FileFormat fileFormat = fileFormatOption.getFileFormat(); if (fileFormat == FileFormat.PNG) { - final BufferedImage im = createImage(colorMapper, background, image); + final BufferedImage im = createImage(fileFormatOption.getWatermark(), colorMapper, background, image); PngIO.write(im, os, fileFormatOption.isWithMetadata() ? metadata : null, 96); } else if (fileFormat == FileFormat.SVG) { final Dimension2D size = computeSize(colorMapper, background, image); - final UGraphicSvg svg = new UGraphicSvg(true, size, colorMapper, StringUtils.getAsHtml(colorMapper - .getMappedColor(background)), false, 1.0, fileFormatOption.getSvgLinkTarget(), + final UGraphicSvg svg = new UGraphicSvg(true, size, colorMapper, + colorMapper.toHtml(background), false, 1.0, fileFormatOption.getSvgLinkTarget(), fileFormatOption.getHoverColor(), seed, fileFormatOption.getPreserveAspectRatio()); image.drawU(svg); svg.createXml(os, fileFormatOption.isWithMetadata() ? metadata : null); @@ -82,11 +81,12 @@ public abstract class UGraphicUtils { } } - private static BufferedImage createImage(ColorMapper colorMapper, HColor background, TextBlock image) { + private static BufferedImage createImage(String watermark, ColorMapper colorMapper, HColor background, + TextBlock image) { final Dimension2D size = computeSize(colorMapper, background, image); - final EmptyImageBuilder builder = new EmptyImageBuilder(size.getWidth(), size.getHeight(), - colorMapper.getMappedColor(background)); + final EmptyImageBuilder builder = new EmptyImageBuilder(watermark, size.getWidth(), size.getHeight(), + colorMapper.toColor(background)); final BufferedImage im = builder.getBufferedImage(); final Graphics2D g2d = builder.getGraphics2D(); @@ -97,7 +97,7 @@ public abstract class UGraphicUtils { } private static Dimension2D computeSize(ColorMapper colorMapper, HColor background, TextBlock image) { - final EmptyImageBuilder builder = new EmptyImageBuilder(10, 10, colorMapper.getMappedColor(background)); + final EmptyImageBuilder builder = new EmptyImageBuilder(null, 10, 10, colorMapper.toColor(background)); final Graphics2D g2d = builder.getGraphics2D(); final UGraphicG2d tmp = new UGraphicG2d(colorMapper, g2d, 1.0); diff --git a/src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerFrameEmpty.java b/src/net/sourceforge/plantuml/ugraphic/color/AbstractColorMapper.java similarity index 59% rename from src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerFrameEmpty.java rename to src/net/sourceforge/plantuml/ugraphic/color/AbstractColorMapper.java index 7412dc7b9..5020e90ad 100644 --- a/src/net/sourceforge/plantuml/timingdiagram/graphic/PlayerFrameEmpty.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/AbstractColorMapper.java @@ -30,19 +30,41 @@ * * * Original Author: Arnaud Roques + * * */ -package net.sourceforge.plantuml.timingdiagram.graphic; +package net.sourceforge.plantuml.ugraphic.color; -import net.sourceforge.plantuml.graphic.StringBounder; -import net.sourceforge.plantuml.ugraphic.UGraphic; +import java.awt.Color; -public class PlayerFrameEmpty implements PlayerFrame { +import net.sourceforge.plantuml.svek.DotStringFactory; - public void drawFrameTitle(UGraphic ug) { +public abstract class AbstractColorMapper implements ColorMapper { + + final public String toHtml(HColor hcolor) { + if (hcolor == null) { + return null; + } + final Color color = toColor(hcolor); + return DotStringFactory.sharp000000(color.getRGB()); } - public double getHeight(StringBounder stringBounder) { - return 0; + final public String toSvg(HColor hcolor) { + if (hcolor == null) { + return "none"; + } + if (hcolor instanceof HColorBackground) { + final HColor result = ((HColorBackground) hcolor).getBack(); +// Thread.dumpStack(); +// System.exit(0); +// return toHtml(result); + } + final Color color = toColor(hcolor); + final int alpha = color.getAlpha(); + if (alpha != 255) { + return DotStringFactory.sharpAlpha(color.getRGB()); + } + return toHtml(hcolor); } + } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapper.java b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapper.java index 05d581574..8ac02cea0 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapper.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapper.java @@ -39,5 +39,9 @@ import java.awt.Color; public interface ColorMapper { - Color getMappedColor(HColor color); + public Color toColor(HColor color); + + public String toSvg(HColor color); + + public String toHtml(HColor color); } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperIdentity.java b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperIdentity.java index 0cac642a5..70f007285 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperIdentity.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperIdentity.java @@ -37,9 +37,9 @@ package net.sourceforge.plantuml.ugraphic.color; import java.awt.Color; -public class ColorMapperIdentity implements ColorMapper { +public class ColorMapperIdentity extends AbstractColorMapper implements ColorMapper { - public Color getMappedColor(HColor color) { + public Color toColor(HColor color) { if (color == null) { return null; } @@ -51,13 +51,11 @@ public class ColorMapperIdentity implements ColorMapper { return Color.WHITE; } if (color instanceof HColorGradient) { - return getMappedColor(((HColorGradient) color).getColor1()); + return toColor(((HColorGradient) color).getColor1()); } if (color instanceof HColorMiddle) { return ((HColorMiddle) color).getMappedColor(this); } - // return ColorUtils.getReversed(((HColorSimple) color).getColor999()); - //return ColorOrder.RGB.getReverse(((HColorSimple) color).getColor999()); return ((HColorSimple) color).getColor999(); } } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperLightnessInverse.java b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperLightnessInverse.java index a56685a4a..782ac4a97 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperLightnessInverse.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperLightnessInverse.java @@ -37,9 +37,9 @@ package net.sourceforge.plantuml.ugraphic.color; import java.awt.Color; -public class ColorMapperLightnessInverse implements ColorMapper { +public class ColorMapperLightnessInverse extends AbstractColorMapper implements ColorMapper { - public Color getMappedColor(HColor color) { + public Color toColor(HColor color) { if (color == null) { return null; } @@ -51,13 +51,11 @@ public class ColorMapperLightnessInverse implements ColorMapper { return Color.WHITE; } if (color instanceof HColorGradient) { - return getMappedColor(((HColorGradient) color).getColor1()); + return toColor(((HColorGradient) color).getColor1()); } if (color instanceof HColorMiddle) { return ((HColorMiddle) color).getMappedColor(this); } return ColorUtils.getReversed(((HColorSimple) color).getColor999()); - //return ColorOrder.RGB.getReverse(((HColorSimple) color).getColor999()); - // return ((HColorSimple) color).getColor999(); } } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperMonochrome.java b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperMonochrome.java index 8a854d0f8..6d7f65c0d 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperMonochrome.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperMonochrome.java @@ -37,7 +37,7 @@ package net.sourceforge.plantuml.ugraphic.color; import java.awt.Color; -public class ColorMapperMonochrome implements ColorMapper { +public class ColorMapperMonochrome extends AbstractColorMapper implements ColorMapper { private final boolean reverse; @@ -45,11 +45,11 @@ public class ColorMapperMonochrome implements ColorMapper { this.reverse = reverse; } - public Color getMappedColor(HColor htmlColor) { + public Color toColor(HColor htmlColor) { if (htmlColor == null) { return null; } - final Color color = new ColorMapperIdentity().getMappedColor(htmlColor); + final Color color = new ColorMapperIdentity().toColor(htmlColor); if (reverse) { return ColorUtils.getGrayScaleColorReverse(color); } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperReverse.java b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperReverse.java index 3426820b4..87b473cac 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperReverse.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperReverse.java @@ -37,7 +37,7 @@ package net.sourceforge.plantuml.ugraphic.color; import java.awt.Color; -public class ColorMapperReverse implements ColorMapper { +public class ColorMapperReverse extends AbstractColorMapper implements ColorMapper { private final ColorOrder order; @@ -45,7 +45,7 @@ public class ColorMapperReverse implements ColorMapper { this.order = order; } - public Color getMappedColor(HColor color) { + public Color toColor(HColor color) { if (color == null) { return null; } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperTransparentWrapper.java b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperTransparentWrapper.java index 165782988..f643dc447 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperTransparentWrapper.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapperTransparentWrapper.java @@ -37,7 +37,7 @@ package net.sourceforge.plantuml.ugraphic.color; import java.awt.Color; -public class ColorMapperTransparentWrapper implements ColorMapper { +public class ColorMapperTransparentWrapper extends AbstractColorMapper implements ColorMapper { private final ColorMapper mapper; @@ -48,14 +48,15 @@ public class ColorMapperTransparentWrapper implements ColorMapper { this.mapper = mapper; } - public Color getMappedColor(HColor color) { + public Color toColor(HColor color) { if (color == null) { return null; } if (color instanceof HColorBackground) { - return ((HColorBackground) color).getActualColor(mapper); + final HColor back = ((HColorBackground) color).getBack(); + return mapper.toColor(back); } - return mapper.getMappedColor(color); + return mapper.toColor(color); } } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/HColor.java b/src/net/sourceforge/plantuml/ugraphic/color/HColor.java index 7f40e9b72..2898bdfa2 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/HColor.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/HColor.java @@ -35,8 +35,8 @@ */ package net.sourceforge.plantuml.ugraphic.color; -import net.sourceforge.plantuml.ugraphic.UChange; import net.sourceforge.plantuml.ugraphic.UBackground; +import net.sourceforge.plantuml.ugraphic.UChange; public interface HColor extends UChange { diff --git a/src/net/sourceforge/plantuml/ugraphic/color/HColorBackground.java b/src/net/sourceforge/plantuml/ugraphic/color/HColorBackground.java index a2d940c35..b356e5cea 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/HColorBackground.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/HColorBackground.java @@ -34,10 +34,6 @@ */ package net.sourceforge.plantuml.ugraphic.color; -import java.awt.Color; - -import net.sourceforge.plantuml.StringUtils; - public class HColorBackground extends HColorAbstract implements HColor { private final HColor back; @@ -47,19 +43,14 @@ public class HColorBackground extends HColorAbstract implements HColor { throw new IllegalArgumentException(); } this.back = back; - - } - - public String getSvg(ColorMapper mapper) { - return StringUtils.getAsHtml(((HColorSimple) back).getColor999()); } public HColor getNull() { return null; } - public Color getActualColor(ColorMapper mapper) { - return mapper.getMappedColor(back); + final HColor getBack() { + return back; } } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/HColorGradient.java b/src/net/sourceforge/plantuml/ugraphic/color/HColorGradient.java index 482d5ef2c..97dc09b41 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/HColorGradient.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/HColorGradient.java @@ -69,8 +69,8 @@ public class HColorGradient extends HColorAbstract implements HColor { if (coeff > 1 || coeff < 0) { throw new IllegalArgumentException("c=" + coeff); } - final Color c1 = mapper.getMappedColor(color1); - final Color c2 = mapper.getMappedColor(color2); + final Color c1 = mapper.toColor(color1); + final Color c2 = mapper.toColor(color2); final int vred = c2.getRed() - c1.getRed(); final int vgreen = c2.getGreen() - c1.getGreen(); final int vblue = c2.getBlue() - c1.getBlue(); diff --git a/src/net/sourceforge/plantuml/ugraphic/color/HColorMiddle.java b/src/net/sourceforge/plantuml/ugraphic/color/HColorMiddle.java index 87897cdb9..9453d8b02 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/HColorMiddle.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/HColorMiddle.java @@ -48,8 +48,8 @@ public class HColorMiddle extends HColorAbstract implements HColor { } public Color getMappedColor(ColorMapper colorMapper) { - final Color cc1 = colorMapper.getMappedColor(c1); - final Color cc2 = colorMapper.getMappedColor(c2); + final Color cc1 = colorMapper.toColor(c1); + final Color cc2 = colorMapper.toColor(c2); final int r1 = cc1.getRed(); final int g1 = cc1.getGreen(); final int b1 = cc1.getBlue(); diff --git a/src/net/sourceforge/plantuml/ugraphic/color/HColorSet.java b/src/net/sourceforge/plantuml/ugraphic/color/HColorSet.java index bc9736a2c..af00cd7e8 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/HColorSet.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/HColorSet.java @@ -269,6 +269,9 @@ public class HColorSet { color = new Color(Integer.parseInt(s, 16)); } else if (s.matches("[0-9A-Fa-f]{6}")) { color = new Color(Integer.parseInt(s, 16)); + } else if (s.matches("[0-9A-Fa-f]{8}")) { + final long parse = Long.parseLong(s, 16); + color = new Color((int) parse, true); } else { final String value = htmlNames.get(s); if (value == null) { @@ -287,6 +290,9 @@ public class HColorSet { if (s.matches("[0-9A-Fa-f]{6}")) { return true; } + if (s.matches("[0-9A-Fa-f]{8}")) { + return true; + } if (s.equalsIgnoreCase("automatic")) { return true; } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/HColorSimple.java b/src/net/sourceforge/plantuml/ugraphic/color/HColorSimple.java index 3fbe165eb..b3d7de7ff 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/HColorSimple.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/HColorSimple.java @@ -47,6 +47,14 @@ public class HColorSimple extends HColorAbstract implements HColor { return color.hashCode(); } + @Override + public String toString() { + if (color.getAlpha() == 0) { + return "transparent"; + } + return color.toString() + " alpha=" + color.getAlpha() + " monochrome=" + monochrome; + } + @Override public boolean equals(Object other) { if (other instanceof HColorSimple == false) { diff --git a/src/net/sourceforge/plantuml/ugraphic/color/HColorUtils.java b/src/net/sourceforge/plantuml/ugraphic/color/HColorUtils.java index f0ec8fe48..707182ee2 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/HColorUtils.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/HColorUtils.java @@ -35,6 +35,8 @@ */ package net.sourceforge.plantuml.ugraphic.color; +import java.awt.Color; + import net.sourceforge.plantuml.ugraphic.UChange; import net.sourceforge.plantuml.ugraphic.UGraphic; @@ -131,4 +133,8 @@ public class HColorUtils { return color.bg(); } + public static HColor transparent() { + return new HColorSimple(new Color(0, 0, 0, 0), false); + } + } diff --git a/src/net/sourceforge/plantuml/ugraphic/comp/PiecewiseAffineOnXorYBuilder.java b/src/net/sourceforge/plantuml/ugraphic/comp/PiecewiseAffineOnXorYBuilder.java index 2697a2fb6..0e7f1c6b6 100644 --- a/src/net/sourceforge/plantuml/ugraphic/comp/PiecewiseAffineOnXorYBuilder.java +++ b/src/net/sourceforge/plantuml/ugraphic/comp/PiecewiseAffineOnXorYBuilder.java @@ -74,7 +74,7 @@ public class PiecewiseAffineOnXorYBuilder extends AbstractTextBlock implements T @Override public MinMax getMinMax(StringBounder stringBounder) { if (cachedMinMax == null) { - cachedMinMax = TextBlockUtils.getMinMax(this, stringBounder); + cachedMinMax = TextBlockUtils.getMinMax(this, stringBounder, false); } return cachedMinMax; } diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverCenteredCharacterEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverCenteredCharacterEps.java index 314203b36..687201f7b 100644 --- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverCenteredCharacterEps.java +++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverCenteredCharacterEps.java @@ -58,7 +58,7 @@ public class DriverCenteredCharacterEps implements UDriver { final double ypos = y - unusedSpace.getCenterY() - 0.5; final TextLayout t = new TextLayout("" + c, font.getFont(), TextBlockUtils.getFontRenderContext()); - eps.setStrokeColor(mapper.getMappedColor(param.getColor())); + eps.setStrokeColor(mapper.toColor(param.getColor())); DriverTextEps.drawPathIterator(eps, xpos, ypos, t.getOutline(null)); } diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverDotPathEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverDotPathEps.java index 5807e4d3d..5b05b79d6 100644 --- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverDotPathEps.java +++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverDotPathEps.java @@ -49,7 +49,7 @@ public class DriverDotPathEps implements UDriver { //DriverLineG2d.manageStroke(param, g2d); if (param.getColor() != null) { - eps.setStrokeColor(mapper.getMappedColor(param.getColor())); + eps.setStrokeColor(mapper.toColor(param.getColor())); eps.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashVisible(), param.getStroke() .getDashSpace()); shape.draw(eps, x, y); diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverEllipseEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverEllipseEps.java index c28bbac6d..7683ca9a9 100644 --- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverEllipseEps.java +++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverEllipseEps.java @@ -71,8 +71,8 @@ public class DriverEllipseEps implements UDriver { eps.epsEllipseShadow(x + width / 2, y + height / 2, width / 2, height / 2, shape.getDeltaShadow()); } - eps.setFillColor(mapper.getMappedColor(param.getBackcolor())); - eps.setStrokeColor(mapper.getMappedColor(param.getColor())); + eps.setFillColor(mapper.toColor(param.getBackcolor())); + eps.setStrokeColor(mapper.toColor(param.getColor())); eps.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashVisible(), param.getStroke() .getDashSpace()); diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverImageEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverImageEps.java index 4f8c86272..73a90799b 100644 --- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverImageEps.java +++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverImageEps.java @@ -65,7 +65,7 @@ public class DriverImageEps implements UDriver { } } - eps.drawImage(shape.muteTransparentColor(mapper.getMappedColor(param.getBackcolor())).getImage(), x, y); + eps.drawImage(shape.muteTransparentColor(mapper.toColor(param.getBackcolor())).getImage(), x, y); } } diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverLineEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverLineEps.java index 1303ed187..67ea43e3a 100644 --- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverLineEps.java +++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverLineEps.java @@ -71,7 +71,7 @@ public class DriverLineEps implements UDriver { y2 = line.y2; } - eps.setStrokeColor(mapper.getMappedColor(param.getColor())); + eps.setStrokeColor(mapper.toColor(param.getColor())); eps.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashVisible(), param.getStroke() .getDashSpace()); eps.epsLine(x, y, x2, y2); diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverPathEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverPathEps.java index d057b9316..ca1caa1e4 100644 --- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverPathEps.java +++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverPathEps.java @@ -46,8 +46,8 @@ public class DriverPathEps implements UDriver { public void draw(UShape ushape, double x, double y, ColorMapper mapper, UParam param, EpsGraphics eps) { final UPath shape = (UPath) ushape; - eps.setStrokeColor(mapper.getMappedColor(param.getColor())); - eps.setFillColor(mapper.getMappedColor(param.getBackcolor())); + eps.setStrokeColor(mapper.toColor(param.getColor())); + eps.setFillColor(mapper.toColor(param.getBackcolor())); eps.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashVisible(), param .getStroke().getDashSpace()); diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverPolygonEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverPolygonEps.java index 75f21386f..8164d723d 100644 --- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverPolygonEps.java +++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverPolygonEps.java @@ -81,12 +81,12 @@ public class DriverPolygonEps implements UDriver { final HColor back = param.getBackcolor(); if (back instanceof HColorGradient) { - eps.setStrokeColor(mapper.getMappedColor(param.getColor())); + eps.setStrokeColor(mapper.toColor(param.getColor())); eps.epsPolygon((HColorGradient) back, mapper, points); } else { - eps.setFillColor(mapper.getMappedColor(back)); - eps.setStrokeColor(mapper.getMappedColor(param.getColor())); + eps.setFillColor(mapper.toColor(back)); + eps.setStrokeColor(mapper.toColor(param.getColor())); eps.epsPolygon(points); } } diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverRectangleEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverRectangleEps.java index 2e448088f..c1f01426b 100644 --- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverRectangleEps.java +++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverRectangleEps.java @@ -84,11 +84,11 @@ public class DriverRectangleEps implements UDriver { final HColor back = param.getBackcolor(); if (back instanceof HColorGradient) { - eps.setStrokeColor(mapper.getMappedColor(param.getColor())); + eps.setStrokeColor(mapper.toColor(param.getColor())); eps.epsRectangle(x, y, width, height, rx / 2, ry / 2, (HColorGradient) back, mapper); } else { - eps.setStrokeColor(mapper.getMappedColor(param.getColor())); - eps.setFillColor(mapper.getMappedColor(param.getBackcolor())); + eps.setStrokeColor(mapper.toColor(param.getColor())); + eps.setFillColor(mapper.toColor(param.getBackcolor())); eps.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashVisible(), param .getStroke().getDashSpace()); eps.epsRectangle(x, y, width, height, rx / 2, ry / 2); diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverTextEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverTextEps.java index 252fa68e3..5c6347392 100644 --- a/src/net/sourceforge/plantuml/ugraphic/eps/DriverTextEps.java +++ b/src/net/sourceforge/plantuml/ugraphic/eps/DriverTextEps.java @@ -99,7 +99,7 @@ public class DriverTextEps implements UDriver { MinMax dim = null; if (fontConfiguration.containsStyle(FontStyle.BACKCOLOR)) { - final Color extended = mapper.getMappedColor(fontConfiguration.getExtendedColor()); + final Color extended = mapper.toColor(fontConfiguration.getExtendedColor()); if (extended != null) { eps.setStrokeColor(extended); eps.setFillColor(extended); @@ -111,13 +111,13 @@ public class DriverTextEps implements UDriver { } } - eps.setStrokeColor(mapper.getMappedColor(fontConfiguration.getColor())); + eps.setStrokeColor(mapper.toColor(fontConfiguration.getColor())); drawPathIterator(eps, x, y, getOutline(textLayout)); if (fontConfiguration.containsStyle(FontStyle.UNDERLINE)) { final HColor extended = fontConfiguration.getExtendedColor(); if (extended != null) { - eps.setStrokeColor(mapper.getMappedColor(extended)); + eps.setStrokeColor(mapper.toColor(extended)); } if (dim == null) { dim = getMinMax(x, y, getOutline(textLayout).getPathIterator(null)); @@ -133,7 +133,7 @@ public class DriverTextEps implements UDriver { final int ypos = (int) (y + 2.5) - 1; final HColor extended = fontConfiguration.getExtendedColor(); if (extended != null) { - eps.setStrokeColor(mapper.getMappedColor(extended)); + eps.setStrokeColor(mapper.toColor(extended)); } eps.setStrokeWidth(1.1, 0, 0); for (int i = (int) x; i < x + dim.getWidth() - 5; i += 6) { @@ -145,7 +145,7 @@ public class DriverTextEps implements UDriver { if (fontConfiguration.containsStyle(FontStyle.STRIKE)) { final HColor extended = fontConfiguration.getExtendedColor(); if (extended != null) { - eps.setStrokeColor(mapper.getMappedColor(extended)); + eps.setStrokeColor(mapper.toColor(extended)); } if (dim == null) { dim = getMinMax(x, y, getOutline(textLayout).getPathIterator(null)); @@ -169,7 +169,7 @@ public class DriverTextEps implements UDriver { // final double ypos = y - fm.getDescent() + 0.5; final double ypos = y - 1; - eps.setStrokeColor(mapper.getMappedColor(fontConfiguration.getColor())); + eps.setStrokeColor(mapper.toColor(fontConfiguration.getColor())); ((EpsGraphicsMacroAndText) eps).drawText(shape.getText(), fontConfiguration, x, ypos); } diff --git a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverCenteredCharacterG2d.java b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverCenteredCharacterG2d.java index 5a23bd244..6818f6bfe 100644 --- a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverCenteredCharacterG2d.java +++ b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverCenteredCharacterG2d.java @@ -53,7 +53,7 @@ public class DriverCenteredCharacterG2d implements UDriver { final UFont font = characterCircled.getFont(); final UnusedSpace unusedSpace = UnusedSpace.getUnusedSpace(font, c); - g2d.setColor(mapper.getMappedColor(param.getColor())); + g2d.setColor(mapper.toColor(param.getColor())); final double xpos = x - unusedSpace.getCenterX(); final double ypos = y - unusedSpace.getCenterY() - 0.5; diff --git a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverDotPathG2d.java b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverDotPathG2d.java index 7648616ed..e06fc17b0 100644 --- a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverDotPathG2d.java +++ b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverDotPathG2d.java @@ -57,7 +57,7 @@ public class DriverDotPathG2d implements UDriver { DriverLineG2d.manageStroke(param, g2d); if (param.getColor() != null) { - g2d.setColor(mapper.getMappedColor(param.getColor())); + g2d.setColor(mapper.toColor(param.getColor())); shape.draw(g2d, x, y); shape.manageEnsureVisible(x, y, visible); } diff --git a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverEllipseG2d.java b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverEllipseG2d.java index e73ffb02b..e55d94f68 100644 --- a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverEllipseG2d.java +++ b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverEllipseG2d.java @@ -84,7 +84,7 @@ public class DriverEllipseG2d extends DriverShadowedG2d implements UDriver { public void draw(UShape ushape, double x, double y, ColorMapper mapper, UParam param, Graphics2D g2d) { - g2d.setColor(mapper.getMappedColor(param.getColor())); + g2d.setColor(mapper.toColor(param.getColor())); g2d.fillRect((int) x, (int) y, 1, 1); } diff --git a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverPolygonG2d.java b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverPolygonG2d.java index a53afe8ce..72ef8f9fa 100644 --- a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverPolygonG2d.java +++ b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverPolygonG2d.java @@ -95,32 +95,32 @@ public class DriverPolygonG2d extends DriverShadowedG2d implements UDriver { final UFont font = fontConfiguration.getFont().scaled(param.getScale()); final Dimension2D dimBack = calculateDimension(FileFormat.PNG.getDefaultStringBounder(TikzFontDistortion.getDefault()), font, shape.getText()); if (fontConfiguration.containsStyle(FontStyle.BACKCOLOR)) { - final Color extended = mapper.getMappedColor(fontConfiguration.getExtendedColor()); + final Color extended = mapper.toColor(fontConfiguration.getExtendedColor()); if (extended != null) { g2d.setColor(extended); g2d.setBackground(extended); @@ -99,7 +99,7 @@ public class DriverTextAsPathG2d implements UDriver { visible.ensureVisible(x + dimBack.getWidth(), y + 1.5); g2d.setFont(font.getFont()); - g2d.setColor(mapper.getMappedColor(fontConfiguration.getColor())); + g2d.setColor(mapper.toColor(fontConfiguration.getColor())); final TextLayout t = new TextLayout(shape.getText(), font.getFont(), fontRenderContext); g2d.translate(x, y); g2d.fill(t.getOutline(null)); @@ -108,7 +108,7 @@ public class DriverTextAsPathG2d implements UDriver { if (fontConfiguration.containsStyle(FontStyle.UNDERLINE)) { final HColor extended = fontConfiguration.getExtendedColor(); if (extended != null) { - g2d.setColor(mapper.getMappedColor(extended)); + g2d.setColor(mapper.toColor(extended)); } final Dimension2D dim = calculateDimension(FileFormat.PNG.getDefaultStringBounder(TikzFontDistortion.getDefault()), font, shape.getText()); final int ypos = (int) (y + 2.5); @@ -121,7 +121,7 @@ public class DriverTextAsPathG2d implements UDriver { final int ypos = (int) (y + 2.5) - 1; final HColor extended = fontConfiguration.getExtendedColor(); if (extended != null) { - g2d.setColor(mapper.getMappedColor(extended)); + g2d.setColor(mapper.toColor(extended)); } for (int i = (int) x; i < x + dim.getWidth() - 5; i += 6) { g2d.drawLine(i, ypos - 0, i + 3, ypos + 1); @@ -134,7 +134,7 @@ public class DriverTextAsPathG2d implements UDriver { final int ypos = (int) (y - fm.getDescent() - 0.5); final HColor extended = fontConfiguration.getExtendedColor(); if (extended != null) { - g2d.setColor(mapper.getMappedColor(extended)); + g2d.setColor(mapper.toColor(extended)); } g2d.setStroke(new BasicStroke((float) 1.5)); g2d.drawLine((int) x, ypos, (int) (x + dim.getWidth()), ypos); diff --git a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverTextG2d.java b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverTextG2d.java index 670e3842d..fcc8cc018 100644 --- a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverTextG2d.java +++ b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverTextG2d.java @@ -94,7 +94,7 @@ public class DriverTextG2d implements UDriver { g2d.setPaint(paint); g2d.fill(area); } else { - final Color backColor = mapper.getMappedColor(extended); + final Color backColor = mapper.toColor(extended); if (backColor != null) { g2d.setColor(backColor); g2d.setBackground(backColor); @@ -106,12 +106,12 @@ public class DriverTextG2d implements UDriver { visible.ensureVisible(x + dimBack.getWidth(), y + 1.5); g2d.setFont(font.getFont()); - g2d.setColor(mapper.getMappedColor(fontConfiguration.getColor())); + g2d.setColor(mapper.toColor(fontConfiguration.getColor())); g2d.drawString(shape.getText(), (float) x, (float) y); if (fontConfiguration.containsStyle(FontStyle.UNDERLINE)) { if (extended != null) { - g2d.setColor(mapper.getMappedColor(extended)); + g2d.setColor(mapper.toColor(extended)); } final Dimension2D dim = calculateDimension(FileFormat.PNG.getDefaultStringBounder(TikzFontDistortion.getDefault()), font, shape.getText()); final int ypos = (int) (y + 2.5); @@ -123,7 +123,7 @@ public class DriverTextG2d implements UDriver { final Dimension2D dim = calculateDimension(FileFormat.PNG.getDefaultStringBounder(TikzFontDistortion.getDefault()), font, shape.getText()); final int ypos = (int) (y + 2.5) - 1; if (extended != null) { - g2d.setColor(mapper.getMappedColor(extended)); + g2d.setColor(mapper.toColor(extended)); } for (int i = (int) x; i < x + dim.getWidth() - 5; i += 6) { g2d.drawLine(i, ypos - 0, i + 3, ypos + 1); @@ -135,7 +135,7 @@ public class DriverTextG2d implements UDriver { final FontMetrics fm = g2d.getFontMetrics(font.getFont()); final int ypos = (int) (y - fm.getDescent() - 0.5); if (extended != null) { - g2d.setColor(mapper.getMappedColor(extended)); + g2d.setColor(mapper.toColor(extended)); } g2d.setStroke(new BasicStroke((float) 1.5)); g2d.drawLine((int) x, ypos, (int) (x + dim.getWidth()), ypos); diff --git a/src/net/sourceforge/plantuml/ugraphic/html5/DriverLineHtml5.java b/src/net/sourceforge/plantuml/ugraphic/html5/DriverLineHtml5.java index 8a1768343..11da865c7 100644 --- a/src/net/sourceforge/plantuml/ugraphic/html5/DriverLineHtml5.java +++ b/src/net/sourceforge/plantuml/ugraphic/html5/DriverLineHtml5.java @@ -71,12 +71,9 @@ public class DriverLineHtml5 implements UDriver { y2 = line.y2; } - final String color = param.getColor() == null ? null : StringUtils.getAsHtml(mapper.getMappedColor(param - .getColor())); + final String color = param.getColor() == null ? null : mapper.toHtml(param.getColor()); html.setStrokeColor(color); -// html.setStrokeWidth("" + param.getStroke().getThickness(), param.getStroke().getDashVisible(), param.getStroke() -// .getDashSpace()); html.htmlLine(x, y, x2, y2, 0); } } diff --git a/src/net/sourceforge/plantuml/ugraphic/html5/DriverRectangleHtml5.java b/src/net/sourceforge/plantuml/ugraphic/html5/DriverRectangleHtml5.java index f0f928823..dcbd07227 100644 --- a/src/net/sourceforge/plantuml/ugraphic/html5/DriverRectangleHtml5.java +++ b/src/net/sourceforge/plantuml/ugraphic/html5/DriverRectangleHtml5.java @@ -83,10 +83,8 @@ public class DriverRectangleHtml5 implements UDriver { // eps.setStrokeColor(mapper.getMappedColor(param.getColor())); // eps.epsRectangle(x, y, width, height, rx / 2, ry / 2, (HtmlColorGradient) back, mapper); } else { - final String color = param.getColor() == null ? null : StringUtils.getAsHtml(mapper.getMappedColor(param - .getColor())); - final String backcolor = param.getColor() == null ? null : StringUtils.getAsHtml(mapper.getMappedColor(param - .getBackcolor())); + final String color = param.getColor() == null ? null : mapper.toHtml(param.getColor()); + final String backcolor = param.getColor() == null ? null : mapper.toHtml(param.getBackcolor()); html.setStrokeColor(color); html.setFillColor(backcolor); diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverCenteredCharacterSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverCenteredCharacterSvg.java index f901f9beb..a8658e070 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverCenteredCharacterSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverCenteredCharacterSvg.java @@ -59,7 +59,7 @@ public class DriverCenteredCharacterSvg implements UDriver { final double ypos = y - unusedSpace.getCenterY() - 0.5; final TextLayout t = new TextLayout("" + c, font.getFont(), TextBlockUtils.getFontRenderContext()); - svg.setStrokeColor(StringUtils.getAsHtml(mapper.getMappedColor(param.getColor()))); + svg.setStrokeColor(mapper.toHtml(param.getColor())); DriverTextAsPathSvg.drawPathIterator(svg, xpos, ypos, t.getOutline(null).getPathIterator(null)); } diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverDotPathSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverDotPathSvg.java index b32a70ac8..de028c101 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverDotPathSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverDotPathSvg.java @@ -50,7 +50,7 @@ public class DriverDotPathSvg implements UDriver { // DriverLineG2d.manageStroke(param, g2d); if (param.getColor() != null) { - final String color = StringUtils.getAsSvg(mapper, param.getColor()); + final String color = mapper.toSvg(param.getColor()); svg.setStrokeColor(color); svg.setFillColor(null); svg.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDasharraySvg()); diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java index 3c2767886..775ac6d48 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java @@ -73,13 +73,13 @@ public class DriverEllipseSvg implements UDriver { final HColor back = param.getBackcolor(); if (back instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) back; - final String id = svg.createSvgGradient(StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor1())), - StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor2())), gr.getPolicy()); + final String id = svg.createSvgGradient(mapper.toHtml(gr.getColor1()), + mapper.toHtml(gr.getColor2()), gr.getPolicy()); svg.setFillColor("url(#" + id + ")"); } else if (back == null || back instanceof HColorBackground) { svg.setFillColor("none"); } else { - final String backcolor = StringUtils.getAsSvg(mapper, back); + final String backcolor = mapper.toSvg(back); svg.setFillColor(backcolor); } DriverRectangleSvg.applyColor(svg, mapper, param); diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverLineSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverLineSvg.java index b66e7819e..87b5b9f1e 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverLineSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverLineSvg.java @@ -82,9 +82,9 @@ public class DriverLineSvg implements UDriver { final HColor color = param.getColor(); if (color instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) color; - svg.setStrokeColor(StringUtils.getAsSvg(mapper, gr.getColor1())); + svg.setStrokeColor(mapper.toSvg(gr.getColor1())); } else { - svg.setStrokeColor(StringUtils.getAsSvg(mapper, color)); + svg.setStrokeColor(mapper.toSvg(color)); } svg.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDasharraySvg()); svg.svgLine(x, y, x2, y2, shape.getDeltaShadow()); diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java index 5454964c9..15e04f4ac 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java @@ -63,7 +63,7 @@ public class DriverPathSvg extends DriverShadowedG2d implements UDriver { } } - final String color = StringUtils.getAsSvg(mapper, param.getColor()); + final String color = mapper.toSvg(param.getColor()); final HColor back = param.getBackcolor(); if (back instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) back; - final String id = svg.createSvgGradient(StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor1())), - StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor2())), gr.getPolicy()); + final String id = svg.createSvgGradient(mapper.toHtml(gr.getColor1()), + mapper.toHtml(gr.getColor2()), gr.getPolicy()); svg.setFillColor("url(#" + id + ")"); } else { - final String backcolorString = StringUtils.getAsSvg(mapper, back); + final String backcolorString = mapper.toSvg(back); svg.setFillColor(backcolorString); } diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java index b0dacfe0a..db379dad2 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java @@ -67,12 +67,12 @@ public class DriverRectangleSvg implements UDriver { final HColor back = param.getBackcolor(); if (back instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) back; - final String id = svg.createSvgGradient(StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor1())), - StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor2())), gr.getPolicy()); + final String id = svg.createSvgGradient(mapper.toHtml(gr.getColor1()), + mapper.toHtml(gr.getColor2()), gr.getPolicy()); svg.setFillColor("url(#" + id + ")"); applyColor(svg, mapper, param); } else { - final String backcolor = StringUtils.getAsSvg(mapper, back); + final String backcolor = mapper.toSvg(back); svg.setFillColor(backcolor); applyColor(svg, mapper, param); } @@ -97,11 +97,11 @@ public class DriverRectangleSvg implements UDriver { final HColor color = param.getColor(); if (color instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) color; - final String id = svg.createSvgGradient(StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor1())), - StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor2())), gr.getPolicy()); + final String id = svg.createSvgGradient(mapper.toHtml(gr.getColor1()), + mapper.toHtml(gr.getColor2()), gr.getPolicy()); svg.setStrokeColor("url(#" + id + ")"); } else { - svg.setStrokeColor(StringUtils.getAsSvg(mapper, color)); + svg.setStrokeColor(mapper.toSvg(color)); } } } diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverTextSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverTextSvg.java index c59c905ba..46fa6b04d 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverTextSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverTextSvg.java @@ -106,19 +106,19 @@ public class DriverTextSvg implements UDriver { final HColor back = fontConfiguration.getExtendedColor(); if (back instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) back; - final String id = svg.createSvgGradient(StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor1())), - StringUtils.getAsHtml(mapper.getMappedColor(gr.getColor2())), gr.getPolicy()); + final String id = svg.createSvgGradient(mapper.toHtml(gr.getColor1()), + mapper.toHtml(gr.getColor2()), gr.getPolicy()); svg.setFillColor("url(#" + id + ")"); svg.setStrokeColor(null); final double deltaPatch = 2; svg.svgRectangle(x, y - height + deltaPatch, width, height, 0, 0, 0, null); } else { - backColor = StringUtils.getAsHtml(mapper.getMappedColor(back)); + backColor = mapper.toHtml(back); } } - svg.setFillColor(StringUtils.getAsHtml(mapper.getMappedColor(fontConfiguration.getColor()))); + svg.setFillColor(mapper.toHtml(fontConfiguration.getColor())); svg.text(text, x, y, font.getFamily(UFontContext.SVG), font.getSize(), fontWeight, fontStyle, textDecoration, width, fontConfiguration.getAttributes(), backColor); } diff --git a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverAtomTextTikz.java b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverAtomTextTikz.java index 5fda236e5..a34817ee5 100644 --- a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverAtomTextTikz.java +++ b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverAtomTextTikz.java @@ -52,7 +52,7 @@ public class DriverAtomTextTikz implements UDriver { final FontConfiguration fontConfiguration = text.getFontConfiguration(); final UFont font = fontConfiguration.getFont(); final HColor col = fontConfiguration.getColor(); - tikz.setStrokeColor(mapper.getMappedColor(col)); + tikz.setStrokeColor(mapper.toColor(col)); final boolean underline = fontConfiguration.containsStyle(FontStyle.UNDERLINE); final boolean italic = font.isItalic(); final boolean bold = font.isBold(); diff --git a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverCenteredCharacterTikz.java b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverCenteredCharacterTikz.java index 051d08925..cde41fd2d 100644 --- a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverCenteredCharacterTikz.java +++ b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverCenteredCharacterTikz.java @@ -58,7 +58,7 @@ public class DriverCenteredCharacterTikz implements UDriver { final double ypos = y - unusedSpace.getCenterY() - 0.5; final TextLayout t = new TextLayout("" + c, font.getFont(), TextBlockUtils.getFontRenderContext()); - tikz.setStrokeColor(mapper.getMappedColor(param.getColor())); + tikz.setStrokeColor(mapper.toColor(param.getColor())); tikz.drawPathIterator(xpos, ypos, t.getOutline(null).getPathIterator(null)); } diff --git a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverCenteredCharacterTikz2.java b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverCenteredCharacterTikz2.java index 9f6fdb513..d652698d1 100644 --- a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverCenteredCharacterTikz2.java +++ b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverCenteredCharacterTikz2.java @@ -47,7 +47,7 @@ public class DriverCenteredCharacterTikz2 implements UDriver { final UCenteredCharacter centeredCharacter = (UCenteredCharacter) ushape; final char c = centeredCharacter.getChar(); - tikz.setStrokeColor(mapper.getMappedColor(param.getColor())); + tikz.setStrokeColor(mapper.toColor(param.getColor())); tikz.drawSingleCharacter(x, y, c); } diff --git a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverDotPathTikz.java b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverDotPathTikz.java index 18ebe7af0..2ed616df4 100644 --- a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverDotPathTikz.java +++ b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverDotPathTikz.java @@ -46,7 +46,7 @@ public class DriverDotPathTikz implements UDriver { public void draw(UShape shape, double x, double y, ColorMapper mapper, UParam param, TikzGraphics tikz) { final DotPath path = (DotPath) shape; tikz.setFillColor(null); - tikz.setStrokeColor(mapper.getMappedColor(param.getColor())); + tikz.setStrokeColor(mapper.toColor(param.getColor())); tikz.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashTikz()); tikz.upath(x, y, path.toUPath()); } diff --git a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverEllipseTikz.java b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverEllipseTikz.java index 75a604e66..d3fe91803 100644 --- a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverEllipseTikz.java +++ b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverEllipseTikz.java @@ -52,8 +52,8 @@ public class DriverEllipseTikz implements UDriver { final double extend = shape.getExtend(); final double cx = x + width / 2; final double cy = y + height / 2; - tikz.setFillColor(mapper.getMappedColor(param.getBackcolor())); - tikz.setStrokeColor(mapper.getMappedColor(param.getColor())); + tikz.setFillColor(mapper.toColor(param.getBackcolor())); + tikz.setStrokeColor(mapper.toColor(param.getColor())); tikz.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashTikz()); if (start == 0 && extend == 0) { tikz.ellipse(cx, cy, width / 2, height / 2); diff --git a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverLineTikz.java b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverLineTikz.java index 1752023e7..082b7550a 100644 --- a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverLineTikz.java +++ b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverLineTikz.java @@ -48,7 +48,7 @@ public class DriverLineTikz implements UDriver { double x2 = x + line.getDX(); double y2 = y + line.getDY(); - tikz.setStrokeColor(mapper.getMappedColor(param.getColor())); + tikz.setStrokeColor(mapper.toColor(param.getColor())); tikz.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashTikz()); tikz.line(x, y, x2, y2); } diff --git a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverPolygonTikz.java b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverPolygonTikz.java index 7e6fd0b0a..3abdcb8cd 100644 --- a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverPolygonTikz.java +++ b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverPolygonTikz.java @@ -54,13 +54,13 @@ public class DriverPolygonTikz implements UDriver { final HColor back = param.getBackcolor(); if (back instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) back; - final Color color1 = mapper.getMappedColor(gr.getColor1()); - final Color color2 = mapper.getMappedColor(gr.getColor2()); + final Color color1 = mapper.toColor(gr.getColor1()); + final Color color2 = mapper.toColor(gr.getColor2()); tikz.setGradientColor(color1, color2, gr.getPolicy()); } else { - tikz.setFillColor(mapper.getMappedColor(back)); + tikz.setFillColor(mapper.toColor(back)); } - tikz.setStrokeColor(mapper.getMappedColor(param.getColor())); + tikz.setStrokeColor(mapper.toColor(param.getColor())); tikz.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashTikz()); tikz.polygon(points); diff --git a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverRectangleTikz.java b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverRectangleTikz.java index 40c995f5e..1b2cd6b46 100644 --- a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverRectangleTikz.java +++ b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverRectangleTikz.java @@ -58,13 +58,13 @@ public class DriverRectangleTikz implements UDriver { final HColor back = param.getBackcolor(); if (back instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) back; - final Color color1 = mapper.getMappedColor(gr.getColor1()); - final Color color2 = mapper.getMappedColor(gr.getColor2()); + final Color color1 = mapper.toColor(gr.getColor1()); + final Color color2 = mapper.toColor(gr.getColor2()); tikz.setGradientColor(color1, color2, gr.getPolicy()); } else { - tikz.setFillColor(mapper.getMappedColor(back)); + tikz.setFillColor(mapper.toColor(back)); } - tikz.setStrokeColor(mapper.getMappedColor(param.getColor())); + tikz.setStrokeColor(mapper.toColor(param.getColor())); tikz.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashTikz()); if (r == 0) { tikz.rectangle(x, y, width, height); diff --git a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverUPathTikz.java b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverUPathTikz.java index 2d4d48b3a..e41a0354f 100644 --- a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverUPathTikz.java +++ b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverUPathTikz.java @@ -52,13 +52,13 @@ public class DriverUPathTikz implements UDriver { final HColor back = param.getBackcolor(); if (back instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) back; - final Color color1 = mapper.getMappedColor(gr.getColor1()); - final Color color2 = mapper.getMappedColor(gr.getColor2()); + final Color color1 = mapper.toColor(gr.getColor1()); + final Color color2 = mapper.toColor(gr.getColor2()); tikz.setGradientColor(color1, color2, gr.getPolicy()); } else { - tikz.setFillColor(mapper.getMappedColor(back)); + tikz.setFillColor(mapper.toColor(back)); } - tikz.setStrokeColor(mapper.getMappedColor(param.getColor())); + tikz.setStrokeColor(mapper.toColor(param.getColor())); tikz.setStrokeWidth(param.getStroke().getThickness(), param.getStroke().getDashTikz()); tikz.upath(x, y, path); } diff --git a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverUTextTikz.java b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverUTextTikz.java index fc4842522..8075083d5 100644 --- a/src/net/sourceforge/plantuml/ugraphic/tikz/DriverUTextTikz.java +++ b/src/net/sourceforge/plantuml/ugraphic/tikz/DriverUTextTikz.java @@ -52,7 +52,7 @@ public class DriverUTextTikz implements UDriver { final FontConfiguration fontConfiguration = shape.getFontConfiguration(); final UFont font = fontConfiguration.getFont(); final HColor col = fontConfiguration.getColor(); - tikz.setStrokeColor(mapper.getMappedColor(col)); + tikz.setStrokeColor(mapper.toColor(col)); final boolean underline = fontConfiguration.containsStyle(FontStyle.UNDERLINE); final boolean italic = font.isItalic(); final boolean bold = font.isBold(); diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index 05aeda58c..141c8b23f 100644 --- a/src/net/sourceforge/plantuml/version/Version.java +++ b/src/net/sourceforge/plantuml/version/Version.java @@ -43,7 +43,7 @@ public class Version { private static final int MAJOR_SEPARATOR = 1000000; public static int version() { - return 1202007; + return 1202008; } public static int versionPatched() { @@ -92,7 +92,7 @@ public class Version { } public static long compileTime() { - return 1587296560972L; + return 1587910102162L; } public static String compileTimeString() { diff --git a/src/net/sourceforge/plantuml/wbs/WBSDiagram.java b/src/net/sourceforge/plantuml/wbs/WBSDiagram.java index d2701539b..d7b1f46df 100644 --- a/src/net/sourceforge/plantuml/wbs/WBSDiagram.java +++ b/src/net/sourceforge/plantuml/wbs/WBSDiagram.java @@ -83,7 +83,7 @@ public class WBSDiagram extends UmlDiagram { final double dpiFactor = scale == null ? getScaleCoef(fileFormatOption) : scale.getScale(100, 100); final ISkinParam skinParam = getSkinParam(); final ImageBuilder imageBuilder = new ImageBuilder(skinParam.getColorMapper(), dpiFactor, - skinParam.getBackgroundColor(), fileFormatOption.isWithMetadata() ? getMetadata() : null, "", 10, 10, + skinParam.getBackgroundColor(false), fileFormatOption.isWithMetadata() ? getMetadata() : null, "", 10, 10, null, skinParam.handwritten()); TextBlock result = getTextBlock(); diff --git a/src/net/sourceforge/plantuml/wire/WireDiagram.java b/src/net/sourceforge/plantuml/wire/WireDiagram.java index e71018f5d..a86745bc8 100644 --- a/src/net/sourceforge/plantuml/wire/WireDiagram.java +++ b/src/net/sourceforge/plantuml/wire/WireDiagram.java @@ -82,7 +82,7 @@ public class WireDiagram extends UmlDiagram { final double dpiFactor = scale == null ? getScaleCoef(fileFormatOption) : scale.getScale(100, 100); final ISkinParam skinParam = getSkinParam(); final ImageBuilder imageBuilder = new ImageBuilder(skinParam.getColorMapper(), dpiFactor, - skinParam.getBackgroundColor(), fileFormatOption.isWithMetadata() ? getMetadata() : null, "", 10, 10, + skinParam.getBackgroundColor(false), fileFormatOption.isWithMetadata() ? getMetadata() : null, "", 10, 10, null, skinParam.handwritten()); TextBlock result = getTextBlock(); diff --git a/stdlib/archimate-abx.repx b/stdlib/archimate-abx.repx new file mode 100644 index 000000000..1d7dd96c2 Binary files /dev/null and b/stdlib/archimate-abx.repx differ diff --git a/stdlib/archimate-dex.repx b/stdlib/archimate-dex.repx new file mode 100644 index 000000000..1c8a0e797 --- /dev/null +++ b/stdlib/archimate-dex.repx @@ -0,0 +1 @@ +; \ No newline at end of file diff --git a/stdlib/home.repx b/stdlib/home.repx index 190e53e46..034b9e7a7 100644 --- a/stdlib/home.repx +++ b/stdlib/home.repx @@ -10,4 +10,5 @@ c4 osa kubernetes logos -elastic \ No newline at end of file +elastic +archimate \ No newline at end of file