diff --git a/pom.xml b/pom.xml index 801403f5b..140bba6b8 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ net.sourceforge.plantuml plantuml - 1.2020.12-SNAPSHOT + 1.2020.13-SNAPSHOT jar PlantUML diff --git a/src/net/sourceforge/plantuml/EmbeddedDiagram.java b/src/net/sourceforge/plantuml/EmbeddedDiagram.java index 2fc23048c..632ff8842 100644 --- a/src/net/sourceforge/plantuml/EmbeddedDiagram.java +++ b/src/net/sourceforge/plantuml/EmbeddedDiagram.java @@ -51,6 +51,8 @@ import net.sourceforge.plantuml.graphic.Line; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.preproc.Defines; import net.sourceforge.plantuml.security.ImageIO; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; import net.sourceforge.plantuml.ugraphic.UImageSvg; @@ -87,7 +89,7 @@ public class EmbeddedDiagram implements CharSequence { public List splitInTwo(StringBounder stringBounder, double width) { throw new UnsupportedOperationException(getClass().toString()); } - + private Draw(ISkinSimple skinParam) { this.skinParam = skinParam; } @@ -118,7 +120,7 @@ public class EmbeddedDiagram implements CharSequence { return; } final BufferedImage im = getImage(); - final UShape image = new UImage(im); + final UShape image = new UImage(new PixelImage(im, AffineTransformType.TYPE_BILINEAR)); ug.draw(image); } catch (IOException e) { e.printStackTrace(); diff --git a/src/net/sourceforge/plantuml/Run.java b/src/net/sourceforge/plantuml/Run.java index 8f5cbe27a..9b981355f 100644 --- a/src/net/sourceforge/plantuml/Run.java +++ b/src/net/sourceforge/plantuml/Run.java @@ -496,7 +496,7 @@ public class Run { sourceFileReader = new SourceFileReaderCopyCat(option.getDefaultDefines(f), f, outputDir, option.getConfig(), option.getCharset(), option.getFileFormatOption()); } else { - sourceFileReader = new SourceFileReader(option.getDefaultDefines(f), f, null, option.getConfig(), + sourceFileReader = new SourceFileReader(option.getDefaultDefines(f), f, outputDir, option.getConfig(), option.getCharset(), option.getFileFormatOption()); } } else { diff --git a/src/net/sourceforge/plantuml/UmlDiagram.java b/src/net/sourceforge/plantuml/UmlDiagram.java index 6871ff45f..97b9ce93b 100644 --- a/src/net/sourceforge/plantuml/UmlDiagram.java +++ b/src/net/sourceforge/plantuml/UmlDiagram.java @@ -76,6 +76,8 @@ import net.sourceforge.plantuml.sprite.Sprite; import net.sourceforge.plantuml.svek.EmptySvgException; import net.sourceforge.plantuml.svek.GraphvizCrash; import net.sourceforge.plantuml.svek.TextBlockBackcolored; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.ImageBuilder; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; @@ -188,7 +190,7 @@ 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(getSkinParam().getColorMapper().toHtml(hover)); + fileFormatOption = fileFormatOption.withHoverColor(getSkinParam().getColorMapper().toRGB(hover)); } if (fileFormatOption.getFileFormat() == FileFormat.PDF) { @@ -252,7 +254,8 @@ public abstract class UmlDiagram extends TitledDiagram implements Diagram, Annot graphicStrings.drawU(ug); final double height = graphicStrings.calculateDimension(ug.getStringBounder()).getHeight(); ug = ug.apply(UTranslate.dy(height)); - ug.draw(new UImage(im).scaleNearestNeighbor(3)); + ug.draw(new UImage(new PixelImage(im, AffineTransformType.TYPE_NEAREST_NEIGHBOR)) + .scale(3)); } }); } diff --git a/src/net/sourceforge/plantuml/creole/atom/AtomImg.java b/src/net/sourceforge/plantuml/creole/atom/AtomImg.java index 4d9822e4b..df69da417 100644 --- a/src/net/sourceforge/plantuml/creole/atom/AtomImg.java +++ b/src/net/sourceforge/plantuml/creole/atom/AtomImg.java @@ -61,6 +61,8 @@ import net.sourceforge.plantuml.security.SFile; import net.sourceforge.plantuml.security.SURL; import net.sourceforge.plantuml.security.SecurityProfile; import net.sourceforge.plantuml.security.SecurityUtils; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.UFont; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; @@ -86,7 +88,8 @@ public class AtomImg extends AbstractAtom implements Atom { if (im == null) { im = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB); } - return new AtomImg(new UImage(null, im).scaleNearestNeighbor(scale).getImage(), 1, null, null); + return new AtomImg(new UImage(new PixelImage(im, AffineTransformType.TYPE_NEAREST_NEIGHBOR)) + .scale(scale).getImage(1), 1, null, null); } public static Atom create(String src, ImgValign valign, int vspace, double scale, Url url) { @@ -218,7 +221,8 @@ public class AtomImg extends AbstractAtom implements Atom { if (url != null) { ug.startUrl(url); } - ug.draw(new UImage(rawFileName, image).scale(scale)); + ug.draw(new UImage(new PixelImage(image, AffineTransformType.TYPE_BILINEAR)) + .withRawFileName(rawFileName).scale(scale)); if (url != null) { ug.closeUrl(); } diff --git a/src/net/sourceforge/plantuml/creole/atom/AtomMath.java b/src/net/sourceforge/plantuml/creole/atom/AtomMath.java index ff9b8a6db..ca01c4331 100644 --- a/src/net/sourceforge/plantuml/creole/atom/AtomMath.java +++ b/src/net/sourceforge/plantuml/creole/atom/AtomMath.java @@ -52,23 +52,20 @@ import net.sourceforge.plantuml.ugraphic.color.HColorSimple; public class AtomMath extends AbstractAtom implements Atom { - private final double scale; private final ScientificEquationSafe math; private final HColor foreground; private final HColor background; private final ColorMapper colorMapper; - public AtomMath(ScientificEquationSafe math, HColor foreground, HColor background, double scale, - ColorMapper colorMapper) { + public AtomMath(ScientificEquationSafe math, HColor foreground, HColor background, ColorMapper colorMapper) { this.math = math; this.colorMapper = colorMapper; this.foreground = foreground; this.background = background; - this.scale = scale; } private Dimension2D calculateDimensionSlow(StringBounder stringBounder) { - final BufferedImage image = math.getImage(scale, Color.BLACK, Color.WHITE); + final BufferedImage image = math.getImage(Color.BLACK, Color.WHITE).withScale(1).getImage(); return new Dimension2DDouble(image.getWidth(), image.getHeight()); } @@ -96,10 +93,10 @@ public class AtomMath extends AbstractAtom implements Atom { final Color fore = getColor(foreground, Color.BLACK); // final double dpiFactor = ug.dpiFactor(); if (isSvg) { - final SvgString svg = math.getSvg(scale, fore, back); + final SvgString svg = math.getSvg(1, fore, back); ug.draw(new UImageSvg(svg)); } else { - final UImage image = new UImage(null, math.getImage(scale, fore, back), math.getFormula()); + final UImage image = new UImage(math.getImage(fore, back)).withFormula(math.getFormula()); ug.draw(image); } } diff --git a/src/net/sourceforge/plantuml/creole/command/CommandCreoleLatex.java b/src/net/sourceforge/plantuml/creole/command/CommandCreoleLatex.java index 80ed579fa..bf010c67c 100644 --- a/src/net/sourceforge/plantuml/creole/command/CommandCreoleLatex.java +++ b/src/net/sourceforge/plantuml/creole/command/CommandCreoleLatex.java @@ -45,15 +45,13 @@ import net.sourceforge.plantuml.math.ScientificEquationSafe; public class CommandCreoleLatex implements Command { private final Pattern2 pattern; - private final double scale; - private CommandCreoleLatex(String p, double scale) { + private CommandCreoleLatex(String p) { this.pattern = MyPattern.cmpile(p); - this.scale = scale; } - public static Command create(double scale) { - return new CommandCreoleLatex("^(?i)(" + Splitter.latexPattern + ")", scale); + public static Command create() { + return new CommandCreoleLatex("^(?i)(" + Splitter.latexPattern + ")"); } public int matchingSize(String line) { @@ -70,7 +68,7 @@ public class CommandCreoleLatex implements Command { throw new IllegalStateException(); } final String latex = m.group(2); - stripe.addMath(ScientificEquationSafe.fromLatex(latex), scale); + stripe.addMath(ScientificEquationSafe.fromLatex(latex)); return line.substring(m.group(1).length()); } diff --git a/src/net/sourceforge/plantuml/creole/command/CommandCreoleMath.java b/src/net/sourceforge/plantuml/creole/command/CommandCreoleMath.java index 7de5a9eb5..5bb3eb823 100644 --- a/src/net/sourceforge/plantuml/creole/command/CommandCreoleMath.java +++ b/src/net/sourceforge/plantuml/creole/command/CommandCreoleMath.java @@ -45,15 +45,13 @@ import net.sourceforge.plantuml.math.ScientificEquationSafe; public class CommandCreoleMath implements Command { private final Pattern2 pattern; - private final double scale; - private CommandCreoleMath(String p, double scale) { + private CommandCreoleMath(String p) { this.pattern = MyPattern.cmpile(p); - this.scale = scale; } - public static Command create(double scale) { - return new CommandCreoleMath("^(?i)(" + Splitter.mathPattern + ")", scale); + public static Command create() { + return new CommandCreoleMath("^(?i)(" + Splitter.mathPattern + ")"); } public int matchingSize(String line) { @@ -70,7 +68,7 @@ public class CommandCreoleMath implements Command { throw new IllegalStateException(); } final String math = m.group(2); - stripe.addMath(ScientificEquationSafe.fromAsciiMath(math), scale); + stripe.addMath(ScientificEquationSafe.fromAsciiMath(math)); return line.substring(m.group(1).length()); } diff --git a/src/net/sourceforge/plantuml/creole/legacy/StripeSimple.java b/src/net/sourceforge/plantuml/creole/legacy/StripeSimple.java index cd908c43f..e1b9b70b9 100644 --- a/src/net/sourceforge/plantuml/creole/legacy/StripeSimple.java +++ b/src/net/sourceforge/plantuml/creole/legacy/StripeSimple.java @@ -152,9 +152,8 @@ public class StripeSimple implements Stripe { this.commands.add(CommandCreoleImg.create()); this.commands.add(CommandCreoleQrcode.create()); this.commands.add(CommandCreoleOpenIcon.create(skinParam.getIHtmlColorSet())); - final double scale = skinParam.getDpi() / 96.0; - this.commands.add(CommandCreoleMath.create(scale)); - this.commands.add(CommandCreoleLatex.create(scale)); + this.commands.add(CommandCreoleMath.create()); + this.commands.add(CommandCreoleLatex.create()); this.commands.add(CommandCreoleSprite.create(skinParam.getIHtmlColorSet())); this.commands.add(CommandCreoleSpace.create()); this.commands.add(CommandCreoleFontFamilyChange.create()); @@ -248,8 +247,8 @@ public class StripeSimple implements Stripe { } } - public void addMath(ScientificEquationSafe math, double scale) { - atoms.add(new AtomMath(math, fontConfiguration.getColor(), fontConfiguration.getExtendedColor(), scale, + public void addMath(ScientificEquationSafe math) { + atoms.add(new AtomMath(math, fontConfiguration.getColor(), fontConfiguration.getExtendedColor(), skinParam.getColorMapper())); } diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersionFinder.java b/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersionFinder.java index 7bf5e25df..699481d9c 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersionFinder.java +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersionFinder.java @@ -35,15 +35,15 @@ */ package net.sourceforge.plantuml.cucadiagram.dot; +import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sourceforge.plantuml.StringUtils; -import net.sourceforge.plantuml.security.SFile; public class GraphvizVersionFinder { - final private SFile dotExe; + final private File dotExe; final public static GraphvizVersion DEFAULT = new GraphvizVersion() { public boolean useShield() { return true; @@ -66,7 +66,7 @@ public class GraphvizVersionFinder { } }; - public GraphvizVersionFinder(SFile dotExe) { + public GraphvizVersionFinder(File dotExe) { this.dotExe = dotExe; } diff --git a/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersions.java b/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersions.java index 42adc81aa..9814a3b89 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersions.java +++ b/src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizVersions.java @@ -39,8 +39,6 @@ import java.io.File; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import net.sourceforge.plantuml.security.SFile; - public class GraphvizVersions { private final static GraphvizVersions singleton = new GraphvizVersions(); @@ -68,7 +66,7 @@ public class GraphvizVersions { } static GraphvizVersion checkVersionSlow(String pathExecutable) { - final GraphvizVersionFinder finder = new GraphvizVersionFinder(new SFile(pathExecutable)); + final GraphvizVersionFinder finder = new GraphvizVersionFinder(new File(pathExecutable)); return finder.getVersion(); } diff --git a/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java b/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java index 643d9faa6..48359fff3 100644 --- a/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java +++ b/src/net/sourceforge/plantuml/cucadiagram/entity/EntityFactory.java @@ -48,6 +48,7 @@ import java.util.Set; import net.sourceforge.plantuml.ColorParam; import net.sourceforge.plantuml.ISkinParam; +import net.sourceforge.plantuml.SkinParam; import net.sourceforge.plantuml.creole.CreoleMode; import net.sourceforge.plantuml.cucadiagram.Bodier; import net.sourceforge.plantuml.cucadiagram.BodierImpl; @@ -125,12 +126,17 @@ public final class EntityFactory { if (g.getUrl99() != null) { folder.addUrl(g.getUrl99()); } - 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(false) : c1); + if (SkinParam.USE_STYLES()) { + // System.err.println("Backcolor ?"); } else { - folder.setSpecificColorTOBEREMOVED(ColorType.BACK, g.getColors(skinParam).getColor(ColorType.BACK)); + 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(false) : c1); + } else { + folder.setSpecificColorTOBEREMOVED(ColorType.BACK, g.getColors(skinParam).getColor(ColorType.BACK)); + } } emptyGroupsAsNode.put(g, folder); return folder; diff --git a/src/net/sourceforge/plantuml/dedication/PSystemDedication.java b/src/net/sourceforge/plantuml/dedication/PSystemDedication.java index 40d9f8f7d..40c6ae2de 100644 --- a/src/net/sourceforge/plantuml/dedication/PSystemDedication.java +++ b/src/net/sourceforge/plantuml/dedication/PSystemDedication.java @@ -44,6 +44,8 @@ import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.core.DiagramDescription; import net.sourceforge.plantuml.core.ImageData; import net.sourceforge.plantuml.graphic.UDrawable; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.ImageBuilder; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; @@ -63,13 +65,13 @@ public class PSystemDedication extends AbstractPSystem { @Override final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed) throws IOException { - final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), - false, null, getMetadata(), null, 1.0, HColorUtils.WHITE); + final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), false, null, getMetadata(), + null, 1.0, HColorUtils.WHITE); imageBuilder.setUDrawable(new UDrawable() { public void drawU(UGraphic ug) { final BufferedImage bufferedImage = dedication.getBufferedImage(keepLetter); if (bufferedImage != null) { - ug.draw(new UImage(bufferedImage)); + ug.draw(new UImage(new PixelImage(bufferedImage, AffineTransformType.TYPE_BILINEAR))); } } }); diff --git a/src/net/sourceforge/plantuml/donors/PSystemDonors.java b/src/net/sourceforge/plantuml/donors/PSystemDonors.java index d14f63dc0..c82ffe7c4 100644 --- a/src/net/sourceforge/plantuml/donors/PSystemDonors.java +++ b/src/net/sourceforge/plantuml/donors/PSystemDonors.java @@ -59,7 +59,9 @@ import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.svek.TextBlockBackcolored; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; import net.sourceforge.plantuml.ugraphic.ImageBuilder; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; import net.sourceforge.plantuml.ugraphic.UTranslate; @@ -72,25 +74,26 @@ public class PSystemDonors extends AbstractPSystem { private static final int COLS = 6; private static final int FREE_LINES = 6; - public static final String DONORS = "6tOB0AmEUFDMA37HMBjrivhoM7AcIGJByuJYCB28fxi1yGUuTthSRwI_YAvqxvjcH5ksfZZF628M13sU" - + "9jSCszpR0s7EZ1V1dJc2dWyV88ghDl8ZTUGuzq0i5Tr_cRWztJekLC6nQeHoeBYruNrdR9wTnXUl7atG" - + "Hk37mBxwVrE7hCj3LPYbknNFOp4g6g4wB_GKSwnp_qSL5w9Wtw7gOSindRgu3eSgAk3L2O-1HPh1RUEy" - + "MZGP5PFOH4geDaeG4eCPEd9I-mBvGGQ9N-e5j6cjhY6HFQ2upXI9hjjo1xODDBzIugNW3xvWyy0SIZdS" - + "9oXnRiIGyFEWeMqLlR4rHvOySS1G3YtipH-Av4Zl8PbLXXQ9W1ee27aO1oIZK8Scd1rR3AYw1riCQ92g" - + "g_qct7qSbgTeRZJS1HO15fm5r13aVz0JFgEll6IopwUYbf2dIRogRKJzgdW_RJEYR_RH950-xA5PiLy5" - + "ojP3EbjUn_oheqFUDMJbqMz67TbSWxlivj8mlxH0_GXqsvoe9Bw-A0iBIGZNbdeXNUVcAxKNuOGDAHNh" - + "v5riUOt-eIjIsOHOpWuMyhH_NMrA1bleogKQUaEhEiqwdsX93VNtGnuTEjy5rrIRtJjCxv4s5_d_NRSq" - + "CnG7wCGKiw3h0aNdQ5hr5nk8uBJGXI4t0V84ofV9BNzPFiGVzG71MqW4eh1HqWd-_4Xvo8KBCx2gMrAC" - + "0EPFAUT98kY42FKw13sCAfb8cRj-XadFicLZRfdqmPKr62C_ffEAa_3TNE0HXjLgqKmtQnzXbU0Ll4xo" - + "gdkDzgiKiIsyProarWyPY3FC6H4fFwBOjhHBmaCTXLci9JTryJtT3WuUkdl16InQnOmsso5BGk5iCixK" - + "Mum-D1Z-Za8sQVVcfbv1-Awm4TpCQ0QtboOtrEGI2R_bBCV35e0IS_6ANL7XKaBLB2kLhMi9aoDMZqE6" - + "_4xq2IoLU-5fnuxcxiGpnAEW3kVTiUfKVqvftXPGGqmJPAI5CcT8auUj1J9mh4xFIXjWzrCx5enjVh9Y" - + "pQ7ujebOumODKs2wYF160v582kebUib9OW3VTVcLUgIlWu_lwcd5E4XQI6AW2bATyODJq_3v34rZlKR_" - + "jxMsMtR-_7iTsUJK6VUwYY1w3YBnRwS07UKa8dWQyFwMZv1t2gmQNNfGX2jtARqPI5YmczwPHJqwp6ZS" - + "yMAvERdevTk7glxkv3PSB0RViE8YaoQVVOcJrdRre8hQllkDnK4E7NyNLQPaSfLBQs14WzZMNfpqs6sc" - + "uYwh5U31xBXCOErNJy_DD5uovhfZgMvu7CWM8ZAa67ryiQQczN4Yi5awytjBsv3CwB_1Y7vHhUcnLm_z" - + "1-NtM15e-BQ5Ciw91CD5we61VdEVanbqyms7l30r9pfTBBvoqMt3pXUiiD_4ZyX2mWlRccaYhBLtgpdz" - + "QIwUi-t8qRUGVM8scbx8guWPoC9YWvwTM2ZbU215KZ1dRvae8ksWDxYiHm2Tec3yVnc4euNcHsHMcMTl" + "57FP9cC_bFBc_GC0"; + public static final String DONORS = "6vaB02mFUBXRGOc9nbfsvvsjZ9-86KqYM9ud58U1HJpT3OW_mBtJutuZ_KLqfNlVD2FQiZN5USOGiI3e" + + "yJIvPjZctXu8Sw9y2FxT21uW0qH9r4QrBFUas6sRAaDAyEyxN_abw1tUiK6YkKgZnP5xPFSBxs-6ytpJ" + + "-EYbPy0IgdwAxcl_Tqqhw_AcAWpfifenC-hqX2hcrgWHaIB-_rJhRgSsJgOw3IG1dSgvWflgLC2h4nu3" + + "YpI3MyPvDMaoAYQ-YPHWQvGGD3epjEMazZco8OF4B_K3jDbSOQd8cL0SeoJHzVNSlcq3pI-NU15y8HPi" + + "7fX3AOThWHBdHeo4JmGDBRFeZQqwikI97OPIQ64V_j18ZdYaCdCwMYJy7e62eATnGD8BjMd2sT75W2eZ" + + "sQBFabHT6G_XpkkmFCLge-5EiF2pu2oWXY3_Woxuz5ZrqUGSLqCjgQT9tggjH_rAl9Us6T4t_MYIA9_j" + + "JREYk0kKBLAThJx7UCqZ87TBhRpYowWZcoEuzzsx6jO_MY0_0jrM4vNapx8lB2GXhgtiWtIT6wyyUX6E" + + "sP1fOXs_YosliHUwmfMDoR82BFHf-xhIX0osq9NBmz0JMfLfrlb4IrfQlr_qwB9ndt1DfTczW_G-okOY" + + "_x_RlSmCnG4wLc8MT9sWQ5nDgzvY0n6S5hemv2OWLw2ykMx5pUiYl-e3WhUG4OZ2XgGTulMHSjT5YEbO" + + "rKqfHW3pfvHpaGXO4A5Mkw1RKIKJAUlT7gUhP_goCNUVzC5rky4OnJ6Tr5Y4xzu5zp2iL8rcjbaxXJa5" + + "B-Drd5VTQwHVnRAzXVUK3wdvHmRYJE-CY9GVqTYsye_2tJeAivXBRjRbkxeV73nqvu8pMBIC6MssGvQ0" + + "mjbadAbV6NvQClmTWMp2xurDNa7eJbWFOMOqWjjRasjgSec4ptIMusONW6ArUCMkY719eMgMcSeMDiNa" + + "6Qj78KD-ntm2I-LQUDgmrjoLUKRrAAZ3UNUiMjQlGytR0ghBOOACj51gf9eYVIsGWMjrUfPQ1zkV5bZG" + + "j_6eYbM7ujicsgxSe68AJ1SHVj4W4cb1hKGlEKaCy3z_VgKUxUlWupkZV38EaZqaCL05hKu_SMeQF8zX" + + "PQpNwFlrrdQluC-_rz4cf_PuvgS8ekSW6lys2k0e9p62fu6_BXybxoHODJgrKPGhroYz4KXOi1FlpA8U" + + "6MRKxyHakHcvw1NRXwhyxUGAN2o6sB3Y8fEc6B7afBVTUb15RD_vnk8WXuQ_YoeJChdAPJKmGY6sGYzE" + + "Ukmsod2NLGlme3ek4vZxrM-dMTuqvhnZgMvu3CWtH-HKqIEqiAQcjMCXi56C-Rsb_LIcntyoebz4QtRi" + + "rKFlGVaziWiqV5k3z3D6Wk4YPST0kxdFoGZSVCCXRqpDYKmNYwrSTCMmymOhx3Vs4bb8U65Rgrp2N7ju" + + "pUcNTtbMsv6ZRI7xM3MQNYYgY178XSKwNPrOAELu84LIC6TlcIWYxQ0tkAHd04vHSBo_sn2E5PeVqQnz" + + "FADHp6MTUt4FOYgSt4zxKhQRdfK7"; /* * Special thanks to our sponsors and donors: @@ -127,7 +130,8 @@ public class PSystemDonors extends AbstractPSystem { x += dim.getWidth() + 10; y = Math.max(y, dim.getHeight()); } - final UImage logo = new UImage(PSystemVersion.getPlantumlImage()); + final UImage logo = new UImage( + new PixelImage(PSystemVersion.getPlantumlImage(), AffineTransformType.TYPE_BILINEAR)); ug.apply(new UTranslate(lastX, y - logo.getHeight())).draw(logo); } }; diff --git a/src/net/sourceforge/plantuml/eggs/PSystemCharlie.java b/src/net/sourceforge/plantuml/eggs/PSystemCharlie.java index 48f3dbf4f..38bc3c335 100644 --- a/src/net/sourceforge/plantuml/eggs/PSystemCharlie.java +++ b/src/net/sourceforge/plantuml/eggs/PSystemCharlie.java @@ -43,6 +43,8 @@ import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.core.DiagramDescription; import net.sourceforge.plantuml.core.ImageData; import net.sourceforge.plantuml.graphic.UDrawable; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.ImageBuilder; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; @@ -61,12 +63,12 @@ public class PSystemCharlie extends AbstractPSystem { @Override final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed) throws IOException { - final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), - false, null, getMetadata(), null, 1.0, HColorUtils.BLACK); + final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), false, null, getMetadata(), + null, 1.0, HColorUtils.BLACK); imageBuilder.setUDrawable(new UDrawable() { public void drawU(UGraphic ug) { - final UImage im = new UImage(image); + final UImage im = new UImage(new PixelImage(image, AffineTransformType.TYPE_BILINEAR)); ug.draw(im); } }); diff --git a/src/net/sourceforge/plantuml/error/PSystemError.java b/src/net/sourceforge/plantuml/error/PSystemError.java index 2d5d6fb14..38f435d98 100644 --- a/src/net/sourceforge/plantuml/error/PSystemError.java +++ b/src/net/sourceforge/plantuml/error/PSystemError.java @@ -77,6 +77,8 @@ import net.sourceforge.plantuml.graphic.TextBlockUtils; import net.sourceforge.plantuml.graphic.VerticalAlignment; import net.sourceforge.plantuml.security.SecurityUtils; import net.sourceforge.plantuml.svek.TextBlockBackcolored; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.ImageBuilder; import net.sourceforge.plantuml.ugraphic.MinMax; import net.sourceforge.plantuml.ugraphic.UFont; @@ -301,7 +303,8 @@ public abstract class PSystemError extends AbstractPSystem { } private TextBlock addMessageArecibo(final TextBlock source) throws IOException { - final UImage message = new UImage(PSystemVersion.getArecibo()); + final UImage message = new UImage( + new PixelImage(PSystemVersion.getArecibo(), AffineTransformType.TYPE_BILINEAR)); TextBlock result = TextBlockUtils.mergeLR(source, TextBlockUtils.fromUImage(message), VerticalAlignment.TOP); return result; } @@ -323,7 +326,8 @@ public abstract class PSystemError extends AbstractPSystem { if (qrcode == null) { result = text; } else { - final UImage qr = new UImage(qrcode).scaleNearestNeighbor(3); + final UImage qr = new UImage( + new PixelImage(qrcode, AffineTransformType.TYPE_NEAREST_NEIGHBOR)).scale(3); result = TextBlockUtils.mergeLR(text, TextBlockUtils.fromUImage(qr), VerticalAlignment.CENTER); } return TextBlockUtils.addBackcolor(result, backColor); @@ -347,8 +351,9 @@ public abstract class PSystemError extends AbstractPSystem { } private TextBlockBackcolored getMessagePatreon() { - final UImage message = new UImage(PSystemVersion.getTime01()); - final Color back = new Color(message.getImage().getRGB(0, 0)); + final UImage message = new UImage( + new PixelImage(PSystemVersion.getTime01(), AffineTransformType.TYPE_BILINEAR)); + final Color back = new Color(message.getImage(1).getRGB(0, 0)); final HColor backColor = new HColorSimple(back, false); final FlashCodeUtils utils = FlashCodeFactory.getFlashCodeUtils(); @@ -366,7 +371,9 @@ public abstract class PSystemError extends AbstractPSystem { if (qrcode == null) { ug.apply(new UTranslate(1, 1)).draw(message); } else { - final UImage qr = new UImage(qrcode).scaleNearestNeighbor(scale); + final UImage qr = new UImage( + new PixelImage(qrcode, AffineTransformType.TYPE_NEAREST_NEIGHBOR)) + .scale(scale); ug.apply(new UTranslate(1, (imHeight - message.getHeight()) / 2)).draw(message); ug.apply(new UTranslate(1 + message.getWidth(), (imHeight - qr.getHeight()) / 2)).draw(qr); } @@ -392,8 +399,9 @@ public abstract class PSystemError extends AbstractPSystem { } private TextBlockBackcolored getMessageLiberapay() { - final UImage message = new UImage(PSystemVersion.getTime15()); - final Color back = new Color(message.getImage().getRGB(0, 0)); + final UImage message = new UImage( + new PixelImage(PSystemVersion.getTime15(), AffineTransformType.TYPE_BILINEAR)); + final Color back = new Color(message.getImage(1).getRGB(0, 0)); final HColor backColor = new HColorSimple(back, false); final FlashCodeUtils utils = FlashCodeFactory.getFlashCodeUtils(); @@ -410,7 +418,9 @@ public abstract class PSystemError extends AbstractPSystem { if (qrcode == null) { ug.apply(new UTranslate(1, 1)).draw(message); } else { - final UImage qr = new UImage(qrcode).scaleNearestNeighbor(scale); + final UImage qr = new UImage( + new PixelImage(qrcode, AffineTransformType.TYPE_NEAREST_NEIGHBOR)) + .scale(scale); ug.apply(new UTranslate(1, (imHeight - message.getHeight()) / 2)).draw(message); ug.apply(new UTranslate(1 + message.getWidth(), (imHeight - qr.getHeight()) / 2)).draw(qr); } diff --git a/src/net/sourceforge/plantuml/graphic/GraphicStrings.java b/src/net/sourceforge/plantuml/graphic/GraphicStrings.java index d7737e424..2782a8d07 100644 --- a/src/net/sourceforge/plantuml/graphic/GraphicStrings.java +++ b/src/net/sourceforge/plantuml/graphic/GraphicStrings.java @@ -47,6 +47,8 @@ import net.sourceforge.plantuml.svek.IEntityImage; import net.sourceforge.plantuml.svek.Margins; import net.sourceforge.plantuml.svek.ShapeType; import net.sourceforge.plantuml.svek.TextBlockBackcolored; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.UFont; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; @@ -156,12 +158,13 @@ public class GraphicStrings extends AbstractTextBlock implements IEntityImage { if (image != null) { if (position == GraphicPosition.BOTTOM) { ug.apply(new UTranslate((size.getWidth() - image.getWidth()) / 2, size.getHeight() - image.getHeight())) - .draw(new UImage(image)); + .draw(new UImage(new PixelImage(image, AffineTransformType.TYPE_BILINEAR))); } else if (position == GraphicPosition.BACKGROUND_CORNER_BOTTOM_RIGHT) { ug.apply(new UTranslate(size.getWidth() - image.getWidth(), size.getHeight() - image.getHeight())) - .draw(new UImage(image)); + .draw(new UImage(new PixelImage(image, AffineTransformType.TYPE_BILINEAR))); } else if (position == GraphicPosition.BACKGROUND_CORNER_TOP_RIGHT) { - ug.apply(new UTranslate(size.getWidth() - image.getWidth() - 1, 1)).draw(new UImage(image)); + ug.apply(new UTranslate(size.getWidth() - image.getWidth() - 1, 1)) + .draw(new UImage(new PixelImage(image, AffineTransformType.TYPE_BILINEAR))); } } } diff --git a/src/net/sourceforge/plantuml/graphic/TileImage.java b/src/net/sourceforge/plantuml/graphic/TileImage.java index e92e98018..09f2143a2 100644 --- a/src/net/sourceforge/plantuml/graphic/TileImage.java +++ b/src/net/sourceforge/plantuml/graphic/TileImage.java @@ -39,6 +39,8 @@ import java.awt.geom.Dimension2D; import java.awt.image.BufferedImage; import net.sourceforge.plantuml.Dimension2DDouble; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; import net.sourceforge.plantuml.ugraphic.UTranslate; @@ -61,7 +63,8 @@ public class TileImage extends AbstractTextBlock implements TextBlock { } public void drawU(UGraphic ug) { - ug.apply(UTranslate.dy(vspace)).draw(new UImage(image)); + ug.apply(UTranslate.dy(vspace)) + .draw(new UImage(new PixelImage(image, AffineTransformType.TYPE_BILINEAR))); } } diff --git a/src/net/sourceforge/plantuml/graphic/USymbolDatabase.java b/src/net/sourceforge/plantuml/graphic/USymbolDatabase.java index 123e79cd7..09817a06d 100644 --- a/src/net/sourceforge/plantuml/graphic/USymbolDatabase.java +++ b/src/net/sourceforge/plantuml/graphic/USymbolDatabase.java @@ -38,7 +38,9 @@ package net.sourceforge.plantuml.graphic; import java.awt.geom.Dimension2D; import net.sourceforge.plantuml.Dimension2DDouble; +import net.sourceforge.plantuml.SkinParam; import net.sourceforge.plantuml.ugraphic.AbstractUGraphicHorizontalLine; +import net.sourceforge.plantuml.ugraphic.UEmpty; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UHorizontalLine; import net.sourceforge.plantuml.ugraphic.UPath; @@ -70,6 +72,11 @@ class USymbolDatabase extends USymbol { final UPath closing = getClosingPath(width); ug.apply(new HColorNone().bg()).draw(closing); + if (SkinParam.USE_STYLES()) { + ug.apply(new UTranslate(width, height)).draw(new UEmpty(10, 10)); + // ug.apply(HColorUtils.BLACK).apply(new UTranslate(width, height)).draw(new URectangle(10, 10)); + } + } private UPath getClosingPath(double width) { @@ -100,8 +107,7 @@ class USymbolDatabase extends USymbol { ug = ug.apply(translate); ug.apply(line.getStroke()).apply(new HColorNone().bg()).apply(UTranslate.dy(-15)).draw(closing); if (line.isDouble()) { - ug.apply(line.getStroke()).apply(new HColorNone().bg()).apply(UTranslate.dy(-15 + 2)) - .draw(closing); + ug.apply(line.getStroke()).apply(new HColorNone().bg()).apply(UTranslate.dy(-15 + 2)).draw(closing); } line.drawTitleInternal(ug, 0, endingX, 0, true); } @@ -137,7 +143,8 @@ class USymbolDatabase extends USymbol { @Override public TextBlock asBig(final TextBlock title, HorizontalAlignment labelAlignment, final TextBlock stereotype, - final double width, final double height, final SymbolContext symbolContext, final HorizontalAlignment stereoAlignment) { + final double width, final double height, final SymbolContext symbolContext, + final HorizontalAlignment stereoAlignment) { return new AbstractTextBlock() { public void drawU(UGraphic ug) { diff --git a/src/net/sourceforge/plantuml/graphic/USymbolNode.java b/src/net/sourceforge/plantuml/graphic/USymbolNode.java index af531078a..e6750ae95 100644 --- a/src/net/sourceforge/plantuml/graphic/USymbolNode.java +++ b/src/net/sourceforge/plantuml/graphic/USymbolNode.java @@ -38,7 +38,9 @@ package net.sourceforge.plantuml.graphic; import java.awt.geom.Dimension2D; import net.sourceforge.plantuml.Dimension2DDouble; +import net.sourceforge.plantuml.SkinParam; import net.sourceforge.plantuml.ugraphic.AbstractUGraphicHorizontalLine; +import net.sourceforge.plantuml.ugraphic.UEmpty; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UHorizontalLine; import net.sourceforge.plantuml.ugraphic.ULine; @@ -81,6 +83,9 @@ class USymbolNode extends USymbol { ug.apply(new UTranslate(width - 10, 10)).draw(new ULine(9, -9)); ug.apply(UTranslate.dy(10)).draw(ULine.hline(width - 10)); ug.apply(new UTranslate(width - 10, 10)).draw(ULine.vline(height - 10)); + if (SkinParam.USE_STYLES()) { + ug.apply(new UTranslate(0, height)).draw(new UEmpty(10, 10)); + } } diff --git a/src/net/sourceforge/plantuml/math/AsciiMath.java b/src/net/sourceforge/plantuml/math/AsciiMath.java index 4922cfa3e..467d79c29 100644 --- a/src/net/sourceforge/plantuml/math/AsciiMath.java +++ b/src/net/sourceforge/plantuml/math/AsciiMath.java @@ -37,7 +37,6 @@ package net.sourceforge.plantuml.math; import java.awt.Color; import java.awt.geom.Dimension2D; -import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -50,6 +49,7 @@ import javax.script.ScriptException; import net.sourceforge.plantuml.BackSlash; import net.sourceforge.plantuml.SvgString; +import net.sourceforge.plantuml.ugraphic.MutableImage; public class AsciiMath implements ScientificEquation { @@ -94,16 +94,16 @@ public class AsciiMath implements ScientificEquation { return builder.getDimension(); } - public SvgString getSvg(double scale, Color foregroundColor, Color backgroundColor) throws ClassNotFoundException, - IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, - SecurityException, InstantiationException, IOException { + public SvgString getSvg(double scale, Color foregroundColor, Color backgroundColor) + throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, + NoSuchMethodException, SecurityException, InstantiationException, IOException { return builder.getSvg(scale, foregroundColor, backgroundColor); } - public BufferedImage getImage(double scale, Color foregroundColor, Color backgroundColor) + public MutableImage getImage(Color foregroundColor, Color backgroundColor) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - return builder.getImage(scale, foregroundColor, backgroundColor); + return builder.getImage(foregroundColor, backgroundColor); } public String getSource() { diff --git a/src/net/sourceforge/plantuml/math/LatexBuilder.java b/src/net/sourceforge/plantuml/math/LatexBuilder.java index e2644776b..05f5652d2 100644 --- a/src/net/sourceforge/plantuml/math/LatexBuilder.java +++ b/src/net/sourceforge/plantuml/math/LatexBuilder.java @@ -45,6 +45,7 @@ import java.lang.reflect.InvocationTargetException; import javax.swing.Icon; import net.sourceforge.plantuml.SvgString; +import net.sourceforge.plantuml.ugraphic.MutableImage; public class LatexBuilder implements ScientificEquation { @@ -60,15 +61,15 @@ public class LatexBuilder implements ScientificEquation { return dimension; } - private Icon buildIcon(Color foregroundColor) throws ClassNotFoundException, NoSuchMethodException, - SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, - InvocationTargetException { + private Icon buildIcon(Color foregroundColor) + throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, + IllegalAccessException, IllegalArgumentException, InvocationTargetException { return new TeXIconBuilder(tex, foregroundColor).getIcon(); } - public SvgString getSvg(double scale, Color foregroundColor, Color backgroundColor) throws ClassNotFoundException, - IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, - SecurityException, InstantiationException, IOException { + public SvgString getSvg(double scale, Color foregroundColor, Color backgroundColor) + throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, + NoSuchMethodException, SecurityException, InstantiationException, IOException { final Icon icon = buildIcon(foregroundColor); final ConverterSvg converterSvg = new ConverterSvg(icon); final String svg = converterSvg.getSvg(scale, true, backgroundColor); @@ -76,20 +77,55 @@ public class LatexBuilder implements ScientificEquation { return new SvgString(svg, scale); } - public BufferedImage getImage(double scale, Color foregroundColor, Color backgroundColor) + public MutableImage getImage(Color foregroundColor, Color backgroundColor) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { final Icon icon = buildIcon(foregroundColor); - final BufferedImage image = new BufferedImage((int) (icon.getIconWidth() * scale), - (int) (icon.getIconHeight() * scale), BufferedImage.TYPE_INT_ARGB); - final Graphics2D g2 = image.createGraphics(); - g2.scale(scale, scale); - if (backgroundColor != null) { - g2.setColor(backgroundColor); - g2.fillRect(0, 0, icon.getIconWidth(), icon.getIconHeight()); + return new LatexImage(icon, 1, foregroundColor, backgroundColor); + } + + class LatexImage implements MutableImage { + + private final double scale; + private final Icon icon; + private final Color foregroundColor; + private final Color backgroundColor; + private BufferedImage cache = null; + + public LatexImage(Icon icon, double scale, Color foregroundColor, Color backgroundColor) { + this.scale = scale; + this.foregroundColor = foregroundColor; + this.backgroundColor = backgroundColor; + this.icon = icon; } - icon.paintIcon(null, g2, 0, 0); - return image; + + public BufferedImage getImage() { + if (cache == null) { + cache = new BufferedImage((int) (icon.getIconWidth() * scale), (int) (icon.getIconHeight() * scale), + BufferedImage.TYPE_INT_ARGB); + final Graphics2D g2 = cache.createGraphics(); + g2.scale(scale, scale); + if (backgroundColor != null) { + g2.setColor(backgroundColor); + g2.fillRect(0, 0, icon.getIconWidth(), icon.getIconHeight()); + } + icon.paintIcon(null, g2, 0, 0); + } + return cache; + } + + public MutableImage withScale(double scale) { + return new LatexImage(icon, this.scale * scale, foregroundColor, backgroundColor); + } + + public MutableImage muteColor(Color newColor) { + throw new UnsupportedOperationException(); + } + + public MutableImage muteTransparentColor(Color newColor) { + throw new UnsupportedOperationException(); + } + } public String getSource() { diff --git a/src/net/sourceforge/plantuml/math/PSystemLatex.java b/src/net/sourceforge/plantuml/math/PSystemLatex.java index 9d4b16ff1..fe1e28230 100644 --- a/src/net/sourceforge/plantuml/math/PSystemLatex.java +++ b/src/net/sourceforge/plantuml/math/PSystemLatex.java @@ -41,12 +41,19 @@ import java.io.OutputStream; import net.sourceforge.plantuml.AbstractPSystem; import net.sourceforge.plantuml.FileFormatOption; +import net.sourceforge.plantuml.StringUtils; import net.sourceforge.plantuml.core.DiagramDescription; import net.sourceforge.plantuml.core.ImageData; +import net.sourceforge.plantuml.ugraphic.color.ColorMapperIdentity; +import net.sourceforge.plantuml.ugraphic.color.HColor; +import net.sourceforge.plantuml.ugraphic.color.HColorSet; public class PSystemLatex extends AbstractPSystem { private String latex = ""; + private float scale = 1; + private Color color = Color.BLACK; + private Color backColor = Color.WHITE; public PSystemLatex() { } @@ -59,11 +66,52 @@ public class PSystemLatex extends AbstractPSystem { final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed) throws IOException { final ScientificEquationSafe asciiMath = ScientificEquationSafe.fromLatex(latex); - return asciiMath.export(os, fileFormat, 1, Color.BLACK, Color.WHITE); + return asciiMath.export(os, fileFormat, scale, color, backColor); } public void doCommandLine(String line) { - this.latex = line; + final String lineLower = StringUtils.trin(StringUtils.goLowerCase(line)); + final String colorParam = "color "; + final String backParam = "backgroundcolor "; + if (lineLower.startsWith(colorParam)) { + final Color col3 = getColor(line.substring(colorParam.length())); + if (col3 != null) { + color = col3; + } + } else if (lineLower.startsWith(backParam)) { + final Color col3 = getColor(line.substring(backParam.length())); + if (col3 != null) { + backColor = col3; + } + } else if (lineLower.startsWith("scale ")) { + final String value = line.substring("scale ".length()); + try { + final float scale1 = Float.parseFloat(value); + if (scale1 > 0) { + scale = scale1; + } + } catch (Exception e) { + e.printStackTrace(); + } + } else if (lineLower.startsWith("dpi ")) { + final String value = line.substring("dpi ".length()); + try { + final float dpi1 = Float.parseFloat(value); + if (dpi1 > 0) { + scale = dpi1 / 96; + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + this.latex = line; + } + } + + private Color getColor(final String col) { + final HColor col2 = HColorSet.instance().getColorIfValid(col); + final Color col3 = new ColorMapperIdentity().toColor(col2); + return col3; } } diff --git a/src/net/sourceforge/plantuml/math/ScientificEquation.java b/src/net/sourceforge/plantuml/math/ScientificEquation.java index 15268b205..eddcf6196 100644 --- a/src/net/sourceforge/plantuml/math/ScientificEquation.java +++ b/src/net/sourceforge/plantuml/math/ScientificEquation.java @@ -37,21 +37,21 @@ package net.sourceforge.plantuml.math; import java.awt.Color; import java.awt.geom.Dimension2D; -import java.awt.image.BufferedImage; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import net.sourceforge.plantuml.SvgString; +import net.sourceforge.plantuml.ugraphic.MutableImage; public interface ScientificEquation { public Dimension2D getDimension(); - public SvgString getSvg(double scale, Color foregroundColor, Color backgroundColor) throws ClassNotFoundException, - IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, - SecurityException, InstantiationException, IOException; + public SvgString getSvg(double scale, Color foregroundColor, Color backgroundColor) + throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, + NoSuchMethodException, SecurityException, InstantiationException, IOException; - public BufferedImage getImage(double scale, Color foregroundColor, Color backgroundColor) + public MutableImage getImage(Color foregroundColor, Color backgroundColor) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException; diff --git a/src/net/sourceforge/plantuml/math/ScientificEquationSafe.java b/src/net/sourceforge/plantuml/math/ScientificEquationSafe.java index ba8aa82ff..14156624b 100644 --- a/src/net/sourceforge/plantuml/math/ScientificEquationSafe.java +++ b/src/net/sourceforge/plantuml/math/ScientificEquationSafe.java @@ -53,6 +53,9 @@ import net.sourceforge.plantuml.eps.EpsGraphics; import net.sourceforge.plantuml.graphic.GraphicStrings; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.security.ImageIO; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.MutableImage; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.ImageBuilder; import net.sourceforge.plantuml.ugraphic.color.ColorMapperIdentity; @@ -89,7 +92,6 @@ public class ScientificEquationSafe { private ImageData dimSvg; public SvgString getSvg(double scale, Color foregroundColor, Color backgroundColor) { - try { final SvgString svg = equation.getSvg(scale, foregroundColor, backgroundColor); dimSvg = new ImageDataSimple(equation.getDimension()); @@ -107,16 +109,17 @@ public class ScientificEquationSafe { } } - public BufferedImage getImage(double scale, Color foregroundColor, Color backgroundColor) { + public MutableImage getImage(Color foregroundColor, Color backgroundColor) { try { - return equation.getImage(scale, foregroundColor, backgroundColor); + return equation.getImage(foregroundColor, backgroundColor); } catch (Exception e) { printTrace(e); final ImageBuilder imageBuilder = getRollback(); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { imageBuilder.writeImageTOBEMOVED(new FileFormatOption(FileFormat.PNG), 42, baos); - return ImageIO.read(new ByteArrayInputStream(baos.toByteArray())); + return new PixelImage(ImageIO.read(new ByteArrayInputStream(baos.toByteArray())), + AffineTransformType.TYPE_BILINEAR); } catch (IOException e1) { return null; } @@ -133,8 +136,8 @@ public class ScientificEquationSafe { private ImageBuilder getRollback() { final TextBlock block = GraphicStrings.createBlackOnWhiteMonospaced(Arrays.asList(formula)); - final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), false, null, null, null, - 1.0, null); + final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), false, null, null, null, 1.0, + null); imageBuilder.setUDrawable(block); return imageBuilder; } @@ -142,7 +145,7 @@ public class ScientificEquationSafe { public ImageData export(OutputStream os, FileFormatOption fileFormat, float scale, Color foregroundColor, Color backgroundColor) throws IOException { if (fileFormat.getFileFormat() == FileFormat.PNG) { - final BufferedImage image = getImage(scale, foregroundColor, backgroundColor); + final BufferedImage image = getImage(foregroundColor, backgroundColor).withScale(scale).getImage(); ImageIO.write(image, "png", os); return new ImageDataSimple(image.getWidth(), image.getHeight()); } @@ -151,7 +154,7 @@ public class ScientificEquationSafe { return dimSvg; } if (fileFormat.getFileFormat() == FileFormat.EPS) { - final BufferedImage image = getImage(scale, foregroundColor, backgroundColor); + final BufferedImage image = getImage(foregroundColor, backgroundColor).withScale(scale).getImage(); final EpsGraphics out = new EpsGraphics(); out.drawImage(image, 0, 0); out.close(); diff --git a/src/net/sourceforge/plantuml/preproc2/ReadFilterMergeLines.java b/src/net/sourceforge/plantuml/preproc2/ReadFilterMergeLines.java index f8f2dee89..36a828a36 100644 --- a/src/net/sourceforge/plantuml/preproc2/ReadFilterMergeLines.java +++ b/src/net/sourceforge/plantuml/preproc2/ReadFilterMergeLines.java @@ -64,8 +64,13 @@ public class ReadFilterMergeLines implements ReadFilter { this.manageEndingBackslash = true; } + ReadLine sourceWithoutComment = null; + while (result != null && manageEndingBackslash && StringUtils.endsWithBackslash(result.getString())) { - final StringLocated next = source.readLine(); + if (sourceWithoutComment == null) { + sourceWithoutComment = new ReadFilterQuoteComment().applyFilter(source); + } + final StringLocated next = sourceWithoutComment.readLine(); if (next == null) { break; } else { diff --git a/src/net/sourceforge/plantuml/project/GanttArrow.java b/src/net/sourceforge/plantuml/project/GanttArrow.java index 5d9aa19b8..3e30b9a3f 100644 --- a/src/net/sourceforge/plantuml/project/GanttArrow.java +++ b/src/net/sourceforge/plantuml/project/GanttArrow.java @@ -78,8 +78,7 @@ public class GanttArrow implements UDrawable { } public void drawU(UGraphic ug) { - ug = ug.apply(HColorUtils.RED_DARK.bg()).apply(HColorUtils.RED_DARK) - .apply(new UStroke(1.5)); + ug = ug.apply(HColorUtils.RED_DARK.bg()).apply(HColorUtils.RED_DARK).apply(new UStroke(1.5)); final Task draw1 = (Task) source.getMoment(); final Task draw2 = (Task) dest.getMoment(); @@ -96,6 +95,9 @@ public class GanttArrow implements UDrawable { if (this.atStart == Direction.DOWN && this.atEnd == Direction.RIGHT) { if (x2 > x1) { + if (x2 - x1 < 8) { + x1 = x2 - 8; + } drawLine(ug, x1, y1, x1, y2, x2, y2); } else { x1 = getX(source.withDelta(0), Direction.RIGHT); diff --git a/src/net/sourceforge/plantuml/project/time/Day.java b/src/net/sourceforge/plantuml/project/time/Day.java index 8464465a5..2074e9401 100644 --- a/src/net/sourceforge/plantuml/project/time/Day.java +++ b/src/net/sourceforge/plantuml/project/time/Day.java @@ -130,6 +130,16 @@ public class Day implements Complement, Comparable, Subject { return DayOfWeek.fromH(h); } + public static int DOW(int y_, int m_, int d_) { + final int q = d_; + final int m = 3 + (m_ - 1 + 10) % 12; + final int y = m >= 13 ? y_ - 1 : y_; + final int k = y % 100; + final int j = y / 100; + final int h = ((q + 13 * (m + 1) / 5) + k + k / 4 + j / 4 + 5 * j) % 7; + return h; + } + public Wink asInstantDay(Day reference) { // if (this.compareTo(reference) < 0) { // throw new IllegalArgumentException(); @@ -143,6 +153,8 @@ public class Day implements Complement, Comparable, Subject { return new Wink(cmp); } + // https://www.staff.science.uu.nl/~gent0113/calendar/isocalendar_text_5.htm + // https://en.wikipedia.org/wiki/ISO_week_date // http://www.proesite.com/timex/wkcalc.htm public int ISO_WN() { final int y = year(); @@ -170,11 +182,6 @@ public class Day implements Complement, Comparable, Subject { } - private int DOW(int y, int m, int d) { - // TODO Auto-generated method stub - return 0; - } - public int compareTo(Day other) { return this.internalNumber() - other.internalNumber(); } diff --git a/src/net/sourceforge/plantuml/security/SFile.java b/src/net/sourceforge/plantuml/security/SFile.java index 7ef685b59..9f94ff61a 100644 --- a/src/net/sourceforge/plantuml/security/SFile.java +++ b/src/net/sourceforge/plantuml/security/SFile.java @@ -261,10 +261,8 @@ public class SFile implements Comparable { if (SecurityUtils.getSecurityProfile() != SecurityProfile.UNSECURE) { // For UNSECURE, we did not do those checks final String path = getCleanPathSecure(); - if (path.startsWith("/etc/")) { - return false; - } - if (path.startsWith("/dev/")) { + if (path.startsWith("/etc/") || path.startsWith("/dev/") || path.startsWith("/boot/") + || path.startsWith("/proc/") || path.startsWith("/sys/")) { return false; } if (path.startsWith("//")) { diff --git a/src/net/sourceforge/plantuml/sprite/SpriteColor.java b/src/net/sourceforge/plantuml/sprite/SpriteColor.java index 2612f5869..4ecbb9601 100644 --- a/src/net/sourceforge/plantuml/sprite/SpriteColor.java +++ b/src/net/sourceforge/plantuml/sprite/SpriteColor.java @@ -43,6 +43,8 @@ import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.graphic.AbstractTextBlock; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; import net.sourceforge.plantuml.ugraphic.color.ColorMapper; @@ -119,7 +121,7 @@ public class SpriteColor implements Sprite { } } } - return new UImage(im); + return new UImage(new PixelImage(im, AffineTransformType.TYPE_BILINEAR)); } public TextBlock asTextBlock(final HColor color, final double scale) { diff --git a/src/net/sourceforge/plantuml/sprite/SpriteImage.java b/src/net/sourceforge/plantuml/sprite/SpriteImage.java index d98f00508..da3f3821a 100644 --- a/src/net/sourceforge/plantuml/sprite/SpriteImage.java +++ b/src/net/sourceforge/plantuml/sprite/SpriteImage.java @@ -45,6 +45,8 @@ import net.sourceforge.plantuml.graphic.AbstractTextBlock; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.security.ImageIO; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; import net.sourceforge.plantuml.ugraphic.color.HColor; @@ -58,7 +60,7 @@ public class SpriteImage implements Sprite { if (img == null) { throw new IllegalArgumentException(); } - this.img = new UImage(img); + this.img = new UImage(new PixelImage(img, AffineTransformType.TYPE_BILINEAR)); } public TextBlock asTextBlock(final HColor color, final double scale) { diff --git a/src/net/sourceforge/plantuml/sprite/SpriteMonochrome.java b/src/net/sourceforge/plantuml/sprite/SpriteMonochrome.java index 117836a74..4dd69971a 100644 --- a/src/net/sourceforge/plantuml/sprite/SpriteMonochrome.java +++ b/src/net/sourceforge/plantuml/sprite/SpriteMonochrome.java @@ -45,6 +45,8 @@ import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.graphic.AbstractTextBlock; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.graphic.TextBlock; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; import net.sourceforge.plantuml.ugraphic.color.ColorMapper; @@ -201,22 +203,22 @@ public class SpriteMonochrome implements Sprite { im.setRGB(col, line, c.getRGB()); } } - return new UImage(im); + return new UImage(new PixelImage(im, AffineTransformType.TYPE_BILINEAR)); } private UImage special(ColorMapper colorMapper, HColorGradient backcolor, HColor color) { final BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int col = 0; col < width; col++) { for (int line = 0; line < height; line++) { - final HColor backColorLocal = new HColorSimple(backcolor.getColor(colorMapper, 1.0 * line - / height), false); + final HColor backColorLocal = new HColorSimple(backcolor.getColor(colorMapper, 1.0 * line / height), + false); final HColorGradient gradient = new HColorGradient(backColorLocal, color, '\0'); final double coef = 1.0 * grey[line][col] / (grayLevel - 1); final Color c = gradient.getColor(colorMapper, coef); im.setRGB(col, line, c.getRGB()); } } - return new UImage(im); + return new UImage(new PixelImage(im, AffineTransformType.TYPE_BILINEAR)); } public TextBlock asTextBlock(final HColor color, final double scale) { diff --git a/src/net/sourceforge/plantuml/style/ValueImpl.java b/src/net/sourceforge/plantuml/style/ValueImpl.java index a3263e39a..32d2b9014 100644 --- a/src/net/sourceforge/plantuml/style/ValueImpl.java +++ b/src/net/sourceforge/plantuml/style/ValueImpl.java @@ -40,6 +40,7 @@ import java.awt.Font; import net.sourceforge.plantuml.graphic.HorizontalAlignment; import net.sourceforge.plantuml.ugraphic.color.HColor; import net.sourceforge.plantuml.ugraphic.color.HColorSet; +import net.sourceforge.plantuml.ugraphic.color.HColorUtils; public class ValueImpl implements Value { @@ -61,9 +62,12 @@ public class ValueImpl implements Value { } public HColor asColor(HColorSet set) { - if ("none".equalsIgnoreCase(value) || "transparent".equalsIgnoreCase(value)) { + if ("none".equalsIgnoreCase(value)) { return null; } + if ("transparent".equalsIgnoreCase(value)) { + return HColorUtils.transparent(); + } return set.getColorIfValid(value); } diff --git a/src/net/sourceforge/plantuml/svek/DotStringFactory.java b/src/net/sourceforge/plantuml/svek/DotStringFactory.java index 2464dc653..efe29f51b 100644 --- a/src/net/sourceforge/plantuml/svek/DotStringFactory.java +++ b/src/net/sourceforge/plantuml/svek/DotStringFactory.java @@ -345,7 +345,7 @@ public class DotStringFactory implements Moveable { return graphviz.getDotExe(); } - public ClusterPosition solve(boolean mergeIntricated, EntityFactory entityFactory, final String svg) + public void solve(boolean mergeIntricated, EntityFactory entityFactory, final String svg) throws IOException, InterruptedException { if (svg.length() == 0) { throw new EmptySvgException(); @@ -356,10 +356,10 @@ public class DotStringFactory implements Moveable { if (mGraph.find() == false) { throw new IllegalStateException(); } - final int fullWidth = Integer.parseInt(mGraph.group(1)); +// final int fullWidth = Integer.parseInt(mGraph.group(1)); final int fullHeight = Integer.parseInt(mGraph.group(2)); - final MinFinder corner1 = new MinFinder(); +// final MinFinder corner1 = new MinFinder(); final Point2DFunction move = new YDelta(fullHeight); final SvgResult svgResult = new SvgResult(svg, move); @@ -372,7 +372,7 @@ public class DotStringFactory implements Moveable { final double minY = SvekUtils.getMinY(points); final double overscanX = node.getOverscanX(stringBounder); final double minX = SvekUtils.getMinX(points); - corner1.manage(minX - overscanX, minY); +// corner1.manage(minX - overscanX, minY); node.moveSvek(minX, minY); } else if (node.getType() == ShapeType.ROUND_RECTANGLE) { final int idx2 = svg.indexOf("d=\"", idx + 1); @@ -390,7 +390,7 @@ public class DotStringFactory implements Moveable { } final double minX = SvekUtils.getMinX(points); final double minY = SvekUtils.getMinY(points); - corner1.manage(minX, minY); +// corner1.manage(minX, minY); node.moveSvek(minX, minY); } else if (node.getType() == ShapeType.OCTAGON) { idx = svg.indexOf("points=\"", idx + 1); @@ -398,7 +398,7 @@ public class DotStringFactory implements Moveable { final List points = svgResult.substring(starting).extractList(SvgResult.POINTS_EQUALS); final double minX = SvekUtils.getMinX(points); final double minY = SvekUtils.getMinY(points); - corner1.manage(minX, minY); + // corner1.manage(minX, minY); node.moveSvek(minX, minY); node.setOctagon(minX, minY, points); } else if (node.getType() == ShapeType.CIRCLE || node.getType() == ShapeType.CIRCLE_IN_RECT @@ -428,7 +428,7 @@ public class DotStringFactory implements Moveable { final double maxX = SvekUtils.getMaxX(points); final double maxY = SvekUtils.getMaxY(points); cluster.setPosition(minX, minY, maxX, maxY); - corner1.manage(minX, minY); + // corner1.manage(minX, minY); if (cluster.getTitleAndAttributeWidth() == 0 || cluster.getTitleAndAttributeHeight() == 0) { continue; @@ -443,15 +443,15 @@ public class DotStringFactory implements Moveable { } for (Line line : bibliotekon.allLines()) { - line.solveLine(svgResult, corner1); + line.solveLine(svgResult); } for (Line line : bibliotekon.allLines()) { line.manageCollision(bibliotekon.allNodes()); } - corner1.manage(0, 0); - return new ClusterPosition(corner1.getMinX(), corner1.getMinY(), fullWidth, fullHeight); - // return new ClusterPosition(0, 0, fullWidth, fullHeight); + // corner1.manage(0, 0); +// return new ClusterPosition(corner1.getMinX(), corner1.getMinY(), fullWidth, fullHeight); +// // return new ClusterPosition(0, 0, fullWidth, fullHeight); } private int getClusterIndex(final String svg, int colorInt) { @@ -475,13 +475,6 @@ public class DotStringFactory implements Moveable { 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/IEntityImageMoved.java b/src/net/sourceforge/plantuml/svek/EntityImageDegenerated.java similarity index 83% rename from src/net/sourceforge/plantuml/svek/IEntityImageMoved.java rename to src/net/sourceforge/plantuml/svek/EntityImageDegenerated.java index a810a7be2..f912b5170 100644 --- a/src/net/sourceforge/plantuml/svek/IEntityImageMoved.java +++ b/src/net/sourceforge/plantuml/svek/EntityImageDegenerated.java @@ -39,20 +39,24 @@ import java.awt.geom.Dimension2D; import java.awt.geom.Rectangle2D; import net.sourceforge.plantuml.Dimension2DDouble; +import net.sourceforge.plantuml.SkinParam; import net.sourceforge.plantuml.graphic.InnerStrategy; import net.sourceforge.plantuml.graphic.StringBounder; import net.sourceforge.plantuml.ugraphic.MinMax; +import net.sourceforge.plantuml.ugraphic.UEmpty; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.color.HColor; -public class IEntityImageMoved implements IEntityImage { +public class EntityImageDegenerated implements IEntityImage { private final IEntityImage orig; private final double delta = 7; + private final HColor backcolor; - public IEntityImageMoved(IEntityImage orig) { + public EntityImageDegenerated(IEntityImage orig, HColor backcolor) { this.orig = orig; + this.backcolor = backcolor; } public boolean isHidden() { @@ -60,7 +64,8 @@ public class IEntityImageMoved implements IEntityImage { } public HColor getBackcolor() { - return orig.getBackcolor(); + // return orig.getBackcolor(); + return backcolor; } public Dimension2D calculateDimension(StringBounder stringBounder) { @@ -79,6 +84,10 @@ public class IEntityImageMoved implements IEntityImage { public void drawU(UGraphic ug) { orig.drawU(ug.apply(new UTranslate(delta, delta))); + if (SkinParam.USE_STYLES()) { + final Dimension2D dim = calculateDimension(ug.getStringBounder()); + ug.apply(new UTranslate(dim.getWidth() - delta, dim.getHeight() - delta)).draw(new UEmpty(delta, delta)); + } } diff --git a/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java b/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java index 820931c8c..03533e51f 100644 --- a/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java +++ b/src/net/sourceforge/plantuml/svek/GeneralImageBuilder.java @@ -101,6 +101,7 @@ import net.sourceforge.plantuml.graphic.TextBlockUtils; import net.sourceforge.plantuml.graphic.TextBlockWidth; import net.sourceforge.plantuml.graphic.USymbol; import net.sourceforge.plantuml.graphic.USymbolInterface; +import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.StyleSignature; @@ -361,6 +362,16 @@ public final class GeneralImageBuilder { } + // Duplicate SvekResult / GeneralImageBuilder + private HColor getBackcolor() { + if (SkinParam.USE_STYLES()) { + final Style style = StyleSignature.of(SName.root, SName.document) + .getMergedStyle(dotData.getSkinParam().getCurrentStyleBuilder()); + return style.value(PName.BackGroundColor).asColor(dotData.getSkinParam().getIHtmlColorSet()); + } + return dotData.getSkinParam().getBackgroundColor(false); + } + public IEntityImage buildImage(BaseFile basefile, String dotStrings[]) { if (dotData.isDegeneratedWithFewEntities(0)) { return new EntityImageSimpleEmpty(dotData.getSkinParam().getBackgroundColor(false)); @@ -369,9 +380,10 @@ public final class GeneralImageBuilder { final ILeaf single = dotData.getLeafs().iterator().next(); final IGroup group = single.getParentContainer(); if (group instanceof GroupRoot) { - return new IEntityImageMoved(GeneralImageBuilder.createEntityImageBlock(single, dotData.getSkinParam(), + final IEntityImage tmp = GeneralImageBuilder.createEntityImageBlock(single, dotData.getSkinParam(), dotData.isHideEmptyDescriptionForState(), dotData, null, null, dotData.getUmlDiagramType(), - dotData.getLinks())); + dotData.getLinks()); + return new EntityImageDegenerated(tmp, getBackcolor()); } } dotData.removeIrrelevantSametail(); @@ -439,15 +451,8 @@ public final class GeneralImageBuilder { } final String graphvizVersion = extractGraphvizVersion(svg); try { - final ClusterPosition position = dotStringFactory.solve(mergeIntricated, dotData.getEntityFactory(), svg) - .delta(10, 10); - final double minY = position.getMinY(); - final double minX = position.getMinX(); - if (minX > 0 || minY > 0) { - throw new IllegalStateException(); - } - final SvekResult result = new SvekResult(position, dotData, dotStringFactory); - result.moveSvek(6 - minX, -minY); + dotStringFactory.solve(mergeIntricated, dotData.getEntityFactory(), svg); + final SvekResult result = new SvekResult(dotData, dotStringFactory); this.maxX = dotStringFactory.getBibliotekon().getMaxX(); return result; } catch (Exception e) { diff --git a/src/net/sourceforge/plantuml/svek/GraphvizCrash.java b/src/net/sourceforge/plantuml/svek/GraphvizCrash.java index 35a1054be..5c9c3cf3b 100644 --- a/src/net/sourceforge/plantuml/svek/GraphvizCrash.java +++ b/src/net/sourceforge/plantuml/svek/GraphvizCrash.java @@ -54,6 +54,8 @@ import net.sourceforge.plantuml.graphic.GraphicPosition; import net.sourceforge.plantuml.graphic.GraphicStrings; import net.sourceforge.plantuml.graphic.QuoteUtils; import net.sourceforge.plantuml.graphic.StringBounder; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; import net.sourceforge.plantuml.ugraphic.UTranslate; @@ -159,7 +161,8 @@ public class GraphvizCrash extends AbstractTextBlock implements IEntityImage { strings.addAll(OptionPrint.interestingValues()); } - // private static void addTextProperty(final List strings, String prop) { + // private static void addTextProperty(final List strings, String prop) + // { // strings.add(prop + ": " + System.getProperty(prop)); // } @@ -185,7 +188,8 @@ public class GraphvizCrash extends AbstractTextBlock implements IEntityImage { if (flashCode != null) { final double h = graphicStrings.calculateDimension(ug.getStringBounder()).getHeight(); ug = ug.apply(UTranslate.dy(h)); - ug.draw(new UImage(flashCode).scaleNearestNeighbor(3)); + ug.draw(new UImage(new PixelImage(flashCode, AffineTransformType.TYPE_NEAREST_NEIGHBOR)) + .scale(3)); } } @@ -196,10 +200,9 @@ public class GraphvizCrash extends AbstractTextBlock implements IEntityImage { public Margins getShield(StringBounder stringBounder) { return Margins.NONE; } - + public double getOverscanX(StringBounder stringBounder) { return 0; } - } diff --git a/src/net/sourceforge/plantuml/svek/Line.java b/src/net/sourceforge/plantuml/svek/Line.java index af6b8fb27..a81362285 100644 --- a/src/net/sourceforge/plantuml/svek/Line.java +++ b/src/net/sourceforge/plantuml/svek/Line.java @@ -486,7 +486,7 @@ public class Line implements Moveable, Hideable, GuideLine { } - public void solveLine(SvgResult fullSvg, MinFinder corner1) { + public void solveLine(SvgResult fullSvg) { if (this.link.isInvis()) { return; } @@ -560,7 +560,7 @@ public class Line implements Moveable, Hideable, GuideLine { if (hasNoteLabelText() || link.getLinkConstraint() != null) { final Point2D pos = getXY(fullSvg, this.noteLabelColor); if (pos != null) { - corner1.manage(pos); +// corner1.manage(pos); this.labelXY = hasNoteLabelText() ? TextBlockUtils.asPositionable(labelText, stringBounder, pos) : TextBlockUtils.asPositionable(CONSTRAINT_SPOT, stringBounder, pos); } @@ -569,7 +569,7 @@ public class Line implements Moveable, Hideable, GuideLine { if (this.startTailText != null) { final Point2D pos = getXY(fullSvg, this.startTailColor); if (pos != null) { - corner1.manage(pos); +// corner1.manage(pos); this.startTailLabelXY = TextBlockUtils.asPositionable(startTailText, stringBounder, pos); } } @@ -577,9 +577,9 @@ public class Line implements Moveable, Hideable, GuideLine { if (this.endHeadText != null) { final Point2D pos = getXY(fullSvg, this.endHeadColor); if (pos != null) { - corner1.manage(pos); +// corner1.manage(pos); this.endHeadLabelXY = TextBlockUtils.asPositionable(endHeadText, stringBounder, pos); - corner1.manage(pos.getX() - 15, pos.getY()); +// corner1.manage(pos.getX() - 15, pos.getY()); } } diff --git a/src/net/sourceforge/plantuml/svek/SvekResult.java b/src/net/sourceforge/plantuml/svek/SvekResult.java index d54914c12..d4f08f426 100644 --- a/src/net/sourceforge/plantuml/svek/SvekResult.java +++ b/src/net/sourceforge/plantuml/svek/SvekResult.java @@ -40,17 +40,19 @@ import java.util.HashSet; import java.util.Set; import net.sourceforge.plantuml.ColorParam; +import net.sourceforge.plantuml.Dimension2DDouble; import net.sourceforge.plantuml.SkinParam; import net.sourceforge.plantuml.UmlDiagramType; import net.sourceforge.plantuml.cucadiagram.dot.DotData; import net.sourceforge.plantuml.graphic.AbstractTextBlock; import net.sourceforge.plantuml.graphic.StringBounder; -import net.sourceforge.plantuml.posimo.Moveable; +import net.sourceforge.plantuml.graphic.TextBlockUtils; import net.sourceforge.plantuml.skin.rose.Rose; import net.sourceforge.plantuml.style.PName; import net.sourceforge.plantuml.style.SName; import net.sourceforge.plantuml.style.Style; import net.sourceforge.plantuml.style.StyleSignature; +import net.sourceforge.plantuml.ugraphic.MinMax; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UHidden; import net.sourceforge.plantuml.ugraphic.UStroke; @@ -58,16 +60,14 @@ import net.sourceforge.plantuml.ugraphic.UTranslate; import net.sourceforge.plantuml.ugraphic.color.HColor; import net.sourceforge.plantuml.ugraphic.color.HColorUtils; -public final class SvekResult extends AbstractTextBlock implements IEntityImage, Moveable { +public final class SvekResult extends AbstractTextBlock implements IEntityImage { private final Rose rose = new Rose(); - private ClusterPosition dim; private final DotData dotData; private final DotStringFactory dotStringFactory; - public SvekResult(ClusterPosition dim, DotData dotData, DotStringFactory dotStringFactory) { - this.dim = dim; + public SvekResult(DotData dotData, DotStringFactory dotStringFactory) { this.dotData = dotData; this.dotStringFactory = dotStringFactory; } @@ -126,6 +126,7 @@ public final class SvekResult extends AbstractTextBlock implements IEntityImage, return StyleSignature.of(SName.root, SName.element, dotData.getUmlDiagramType().getStyleName(), SName.arrow); } + // Duplicate SvekResult / GeneralImageBuilder public HColor getBackcolor() { if (SkinParam.USE_STYLES()) { final Style style = StyleSignature.of(SName.root, SName.document) @@ -135,8 +136,14 @@ public final class SvekResult extends AbstractTextBlock implements IEntityImage, return dotData.getSkinParam().getBackgroundColor(false); } + private MinMax minMax; + public Dimension2D calculateDimension(StringBounder stringBounder) { - return dim.getDimension(); + if (minMax == null) { + minMax = TextBlockUtils.getMinMax(this, stringBounder, false); + dotStringFactory.moveSvek(6 - minMax.getMinX(), 6 - minMax.getMinY()); + } + return Dimension2DDouble.delta(minMax.getDimension(), 0, 12); } public ShapeType getShapeType() { @@ -147,11 +154,6 @@ public final class SvekResult extends AbstractTextBlock implements IEntityImage, return Margins.NONE; } - public void moveSvek(double deltaX, double deltaY) { - dotStringFactory.moveSvek(deltaX, deltaY); - dim = dim.delta(deltaX > 0 ? deltaX : 0, deltaY > 0 ? deltaY : 0); - } - public boolean isHidden() { return false; } diff --git a/src/net/sourceforge/plantuml/svek/image/EntityImageState.java b/src/net/sourceforge/plantuml/svek/image/EntityImageState.java index 768a7910e..240f5a101 100644 --- a/src/net/sourceforge/plantuml/svek/image/EntityImageState.java +++ b/src/net/sourceforge/plantuml/svek/image/EntityImageState.java @@ -116,7 +116,7 @@ public class EntityImageState extends AbstractEntityImage { } final public void drawU(UGraphic ug) { - ug.startGroup(getEntity().getIdent().getName()); + ug.startGroup(getEntity().getIdent().toString(".")); if (url != null) { ug.startUrl(url); } diff --git a/src/net/sourceforge/plantuml/svg/SvgGraphics.java b/src/net/sourceforge/plantuml/svg/SvgGraphics.java index c1e40eb53..e309a4827 100644 --- a/src/net/sourceforge/plantuml/svg/SvgGraphics.java +++ b/src/net/sourceforge/plantuml/svg/SvgGraphics.java @@ -176,7 +176,7 @@ public class SvgGraphics { private Element pendingBackground; public void paintBackcolorGradient(ColorMapper mapper, HColorGradient gr) { - final String id = createSvgGradient(mapper.toHtml(gr.getColor1()), mapper.toHtml(gr.getColor2()), + final String id = createSvgGradient(mapper.toRGB(gr.getColor1()), mapper.toRGB(gr.getColor2()), gr.getPolicy()); setFillColor("url(#" + id + ")"); setStrokeColor(null); diff --git a/src/net/sourceforge/plantuml/swing/MainWindow2.java b/src/net/sourceforge/plantuml/swing/MainWindow2.java index 6bc278e07..eefd9e54b 100644 --- a/src/net/sourceforge/plantuml/swing/MainWindow2.java +++ b/src/net/sourceforge/plantuml/swing/MainWindow2.java @@ -83,7 +83,6 @@ import net.sourceforge.plantuml.DirWatcher2; import net.sourceforge.plantuml.GeneratedImage; import net.sourceforge.plantuml.Log; import net.sourceforge.plantuml.Option; -import net.sourceforge.plantuml.security.SFile; import net.sourceforge.plantuml.version.PSystemVersion; public class MainWindow2 extends JFrame { @@ -158,6 +157,7 @@ public class MainWindow2 extends JFrame { public MainWindow2(Option option, File arg) { super(getDirectory(arg).getAbsolutePath()); + System.setProperty("PLANTUML_SECURITY_PROFILE", "UNSECURE"); final File dir = getDirectory(arg); setIconImage(PSystemVersion.getPlantumlSmallIcon2()); this.option = option; @@ -356,7 +356,7 @@ public class MainWindow2 extends JFrame { final File file = ent.getKey(); removeAllThatUseThisFile(file); final Future> future = ent.getValue(); - final SimpleLine2 simpleLine = SimpleLine2.fromFuture(SFile.fromFile(file), future); + final SimpleLine2 simpleLine = SimpleLine2.fromFuture(file, future); currentDirectoryListing2.add(simpleLine); changed = true; } diff --git a/src/net/sourceforge/plantuml/swing/SimpleLine2.java b/src/net/sourceforge/plantuml/swing/SimpleLine2.java index 3c2d86593..daca9cd03 100644 --- a/src/net/sourceforge/plantuml/swing/SimpleLine2.java +++ b/src/net/sourceforge/plantuml/swing/SimpleLine2.java @@ -35,33 +35,33 @@ */ package net.sourceforge.plantuml.swing; +import java.io.File; import java.util.List; import java.util.concurrent.Future; import net.sourceforge.plantuml.GeneratedImage; -import net.sourceforge.plantuml.security.SFile; class SimpleLine2 implements Comparable { - private final SFile file; + private final File file; private final GeneratedImage generatedImage; private final Future> future; - public static SimpleLine2 fromFuture(SFile file, Future> future) { + public static SimpleLine2 fromFuture(File file, Future> future) { return new SimpleLine2(file, null, future); } - public static SimpleLine2 fromGeneratedImage(SFile file, GeneratedImage generatedImage) { + public static SimpleLine2 fromGeneratedImage(File file, GeneratedImage generatedImage) { return new SimpleLine2(file, generatedImage, null); } - private SimpleLine2(SFile file, GeneratedImage generatedImage, Future> future) { + private SimpleLine2(File file, GeneratedImage generatedImage, Future> future) { this.generatedImage = generatedImage; this.file = file; this.future = future; } - public SFile getFile() { + public File getFile() { return file; } diff --git a/src/net/sourceforge/plantuml/ugraphic/AffineTransformType.java b/src/net/sourceforge/plantuml/ugraphic/AffineTransformType.java new file mode 100644 index 000000000..94a3c2d23 --- /dev/null +++ b/src/net/sourceforge/plantuml/ugraphic/AffineTransformType.java @@ -0,0 +1,53 @@ +/* ======================================================================== + * 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.ugraphic; + +import java.awt.image.AffineTransformOp; + +public enum AffineTransformType { + TYPE_NEAREST_NEIGHBOR, TYPE_BILINEAR; + + public int toLegacyInt() { + switch (this) { + case TYPE_BILINEAR: + return AffineTransformOp.TYPE_BILINEAR; + case TYPE_NEAREST_NEIGHBOR: + return AffineTransformOp.TYPE_NEAREST_NEIGHBOR; + } + throw new AssertionError(); + } + +} diff --git a/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java b/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java index 9e83a0d20..8a5f06105 100644 --- a/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java +++ b/src/net/sourceforge/plantuml/ugraphic/ImageBuilder.java @@ -466,7 +466,8 @@ public class ImageBuilder { ug = new UGraphicSvg(svgDimensionStyle, dim, colorMapper, false, scale, svgLinkTarget, hover, seed, preserveAspectRatio); } else { - ug = new UGraphicSvg(svgDimensionStyle, dim, colorMapper, colorMapper.toSvg(backColor), false, scale, + final String tmp = colorMapper.toSvg(backColor); + ug = new UGraphicSvg(svgDimensionStyle, dim, colorMapper, tmp, false, scale, svgLinkTarget, hover, seed, preserveAspectRatio); } return ug; diff --git a/src/net/sourceforge/plantuml/ugraphic/MutableImage.java b/src/net/sourceforge/plantuml/ugraphic/MutableImage.java new file mode 100644 index 000000000..289c6719f --- /dev/null +++ b/src/net/sourceforge/plantuml/ugraphic/MutableImage.java @@ -0,0 +1,51 @@ +/* ======================================================================== + * 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.ugraphic; + +import java.awt.Color; +import java.awt.image.BufferedImage; + +public interface MutableImage { + + public BufferedImage getImage(); + + public MutableImage withScale(double scale); + + public MutableImage muteColor(Color newColor); + + public MutableImage muteTransparentColor(Color newColor); + +} diff --git a/src/net/sourceforge/plantuml/ugraphic/PixelImage.java b/src/net/sourceforge/plantuml/ugraphic/PixelImage.java new file mode 100644 index 000000000..07709ff59 --- /dev/null +++ b/src/net/sourceforge/plantuml/ugraphic/PixelImage.java @@ -0,0 +1,174 @@ +/* ======================================================================== + * 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.ugraphic; + +import java.awt.Color; +import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; +import java.awt.image.BufferedImage; + +import net.sourceforge.plantuml.ugraphic.color.ColorChangerMonochrome; + +public class PixelImage implements MutableImage { + + private final BufferedImage bufferedImageScale1; + private final double scale; + private final AffineTransformType type; + private BufferedImage cache = null; + + public PixelImage(BufferedImage bufferedImage, AffineTransformType type) { + this(bufferedImage, type, 1); + } + + private PixelImage(BufferedImage bufferedImage, AffineTransformType type, double scale) { + if (type == null) { + throw new IllegalArgumentException(); + } + this.bufferedImageScale1 = bufferedImage; + this.scale = scale; + this.type = type; + } + + public MutableImage withScale(double scale) { + return new PixelImage(bufferedImageScale1, type, this.scale * scale); + } + + public final BufferedImage getImage() { + if (scale == 1) { + return bufferedImageScale1; + } + if (cache == null) { + final int w = (int) Math.round(bufferedImageScale1.getWidth() * scale); + final int h = (int) Math.round(bufferedImageScale1.getHeight() * scale); + final BufferedImage after = new BufferedImage(w, h, bufferedImageScale1.getType()); + final AffineTransform at = new AffineTransform(); + at.scale(scale, scale); + final AffineTransformOp scaleOp = new AffineTransformOp(at, type.toLegacyInt()); + this.cache = scaleOp.filter(bufferedImageScale1, after); + } + return cache; + } + + public MutableImage muteColor(Color newColor) { + if (newColor == null) { + return this; + } + int darkerRgb = getDarkerRgb(); + final BufferedImage copy = deepCopy(); + for (int i = 0; i < bufferedImageScale1.getWidth(); i++) { + for (int j = 0; j < bufferedImageScale1.getHeight(); j++) { + final int color = bufferedImageScale1.getRGB(i, j); + final int rgb = getRgb(color); + final int a = getA(color); + if (a != 0 && rgb == darkerRgb) { + copy.setRGB(i, j, newColor.getRGB() + a); + } + } + } + return new PixelImage(copy, type, scale); + } + + public MutableImage muteTransparentColor(Color newColor) { + if (newColor == null) { + newColor = Color.WHITE; + } + final BufferedImage copy = deepCopy(); + for (int i = 0; i < bufferedImageScale1.getWidth(); i++) { + for (int j = 0; j < bufferedImageScale1.getHeight(); j++) { + final int color = bufferedImageScale1.getRGB(i, j); + final int a = getA(color); + if (a == 0) { + copy.setRGB(i, j, newColor.getRGB()); + } + } + } + return new PixelImage(copy, type, scale); + } + + private int getDarkerRgb() { + int darkerRgb = -1; + for (int i = 0; i < bufferedImageScale1.getWidth(); i++) { + for (int j = 0; j < bufferedImageScale1.getHeight(); j++) { + final int color = bufferedImageScale1.getRGB(i, j); + final int rgb = getRgb(color); + final int a = getA(color); + if (a != mask_a__) { + continue; + } + // if (isTransparent(color)) { + // continue; + // } + final int grey = ColorChangerMonochrome.getGrayScale(rgb); + if (darkerRgb == -1 || grey < ColorChangerMonochrome.getGrayScale(darkerRgb)) { + darkerRgb = rgb; + } + } + } + return darkerRgb; + } + + private static final int mask_a__ = 0xFF000000; + private static final int mask_rgb = 0x00FFFFFF; + + private int getRgb(int color) { + return color & mask_rgb; + } + + private int getA(int color) { + return color & mask_a__; + } + + // From + // https://stackoverflow.com/questions/3514158/how-do-you-clone-a-bufferedimage +// private static BufferedImage deepCopyOld(BufferedImage bi) { +// final ColorModel cm = bi.getColorModel(); +// final boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); +// final WritableRaster raster = bi.copyData(bi.getRaster().createCompatibleWritableRaster()); +// return new BufferedImage(cm, raster, isAlphaPremultiplied, null); +// } + + private BufferedImage deepCopy() { + final BufferedImage result = new BufferedImage(bufferedImageScale1.getWidth(), bufferedImageScale1.getHeight(), + BufferedImage.TYPE_INT_ARGB); + for (int i = 0; i < this.bufferedImageScale1.getWidth(); i++) { + for (int j = 0; j < this.bufferedImageScale1.getHeight(); j++) { + result.setRGB(i, j, bufferedImageScale1.getRGB(i, j)); + } + } + return result; + } + +} diff --git a/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java b/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java index dc331a18f..f2c83b8a0 100644 --- a/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java +++ b/src/net/sourceforge/plantuml/ugraphic/UGraphicUtils.java @@ -64,7 +64,7 @@ public abstract class UGraphicUtils { } else if (fileFormat == FileFormat.SVG) { final Dimension2D size = computeSize(colorMapper, background, image); final UGraphicSvg svg = new UGraphicSvg(true, size, colorMapper, - colorMapper.toHtml(background), false, 1.0, fileFormatOption.getSvgLinkTarget(), + colorMapper.toRGB(background), false, 1.0, fileFormatOption.getSvgLinkTarget(), fileFormatOption.getHoverColor(), seed, fileFormatOption.getPreserveAspectRatio()); image.drawU(svg); svg.createXml(os, fileFormatOption.isWithMetadata() ? metadata : null); diff --git a/src/net/sourceforge/plantuml/ugraphic/UImage.java b/src/net/sourceforge/plantuml/ugraphic/UImage.java index 348aae8c5..09f2ed6b9 100644 --- a/src/net/sourceforge/plantuml/ugraphic/UImage.java +++ b/src/net/sourceforge/plantuml/ugraphic/UImage.java @@ -36,172 +36,63 @@ package net.sourceforge.plantuml.ugraphic; import java.awt.Color; -import java.awt.geom.AffineTransform; -import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.WritableRaster; - -import net.sourceforge.plantuml.ugraphic.color.ColorChangerMonochrome; public class UImage implements UShape { - private final BufferedImage image; + private final MutableImage image; private final String formula; private final String rawFileName; - public String getRawFileName() { - return rawFileName; + public UImage(MutableImage image) { + this(image, null, null); } - public UImage(BufferedImage image) { - this(null, image, null); - } - - public UImage(String rawFileName, BufferedImage image) { - this(rawFileName, image, null); - } - - public UImage(String rawFileName, BufferedImage image, String formula) { + private UImage(MutableImage image, String rawFileName, String formula) { this.image = image; this.formula = formula; this.rawFileName = rawFileName; } - public UImage scale(double scale) { - return scale(scale, AffineTransformOp.TYPE_BILINEAR); + public final UImage withRawFileName(String rawFileName) { + return new UImage(image, rawFileName, formula); } - public UImage scaleNearestNeighbor(double scale) { - return scale(scale, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); + public final UImage withFormula(String formula) { + return new UImage(image, rawFileName, formula); } - private UImage scale(double scale, final int type) { - if (scale == 1) { - return this; - } - final int w = (int) Math.round(image.getWidth() * scale); - final int h = (int) Math.round(image.getHeight() * scale); - final BufferedImage after = new BufferedImage(w, h, image.getType()); - final AffineTransform at = new AffineTransform(); - at.scale(scale, scale); - final AffineTransformOp scaleOp = new AffineTransformOp(at, type); - return new UImage(rawFileName, scaleOp.filter(image, after), formula); - } - - public final BufferedImage getImage() { - return image; - } - - public int getWidth() { - return image.getWidth() - 1; - } - - public int getHeight() { - return image.getHeight() - 1; + public final String getRawFileName() { + return rawFileName; } public final String getFormula() { return formula; } + public UImage scale(double scale) { + return new UImage(image.withScale(scale), rawFileName, formula); + } + + public final BufferedImage getImage(double withScale) { + return image.withScale(withScale).getImage(); + // return bufferedImage.getImage(); + } + + public int getWidth() { + return image.getImage().getWidth() - 1; + } + + public int getHeight() { + return image.getImage().getHeight() - 1; + } + public UImage muteColor(Color newColor) { - if (newColor == null) { - return this; - } - int darkerRgb = getDarkerRgb(); - final BufferedImage copy = deepCopy2(); - for (int i = 0; i < image.getWidth(); i++) { - for (int j = 0; j < image.getHeight(); j++) { - final int color = image.getRGB(i, j); - final int rgb = getRgb(color); - final int a = getA(color); - if (a != 0 && rgb == darkerRgb) { - copy.setRGB(i, j, newColor.getRGB() + a); - } - } - } - return new UImage(rawFileName, copy, formula); + return new UImage(image.muteColor(newColor), rawFileName, formula); } public UImage muteTransparentColor(Color newColor) { - if (newColor == null) { - newColor = Color.WHITE; - } - final BufferedImage copy = deepCopy2(); - for (int i = 0; i < image.getWidth(); i++) { - for (int j = 0; j < image.getHeight(); j++) { - final int color = image.getRGB(i, j); - // final int rgb = getRgb(color); - final int a = getA(color); - if (a == 0) { - copy.setRGB(i, j, newColor.getRGB()); - } - } - } - return new UImage(rawFileName, copy, formula); - } - - private int getDarkerRgb() { - int darkerRgb = -1; - for (int i = 0; i < image.getWidth(); i++) { - for (int j = 0; j < image.getHeight(); j++) { - final int color = image.getRGB(i, j); - // System.err.println("i="+i+" j="+j+" "+Integer.toHexString(color)+" - // "+isTransparent(color)); - final int rgb = getRgb(color); - final int a = getA(color); - if (a != mask_a__) { - continue; - } - // if (isTransparent(color)) { - // continue; - // } - final int grey = ColorChangerMonochrome.getGrayScale(rgb); - if (darkerRgb == -1 || grey < ColorChangerMonochrome.getGrayScale(darkerRgb)) { - darkerRgb = rgb; - } - } - } - return darkerRgb; - } - - private static final int mask_a__ = 0xFF000000; - private static final int mask_rgb = 0x00FFFFFF; - - private int getRgb(int color) { - return color & mask_rgb; - } - - private int getA(int color) { - return color & mask_a__; - } - - // private boolean isTransparent(int argb) { - // if ((argb & mask) == mask) { - // return false; - // } - // return true; - // } - - // From - // https://stackoverflow.com/questions/3514158/how-do-you-clone-a-bufferedimage - private static BufferedImage deepCopyOld(BufferedImage bi) { - final ColorModel cm = bi.getColorModel(); - final boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); - final WritableRaster raster = bi.copyData(bi.getRaster().createCompatibleWritableRaster()); - return new BufferedImage(cm, raster, isAlphaPremultiplied, null); - } - - private BufferedImage deepCopy2() { - final BufferedImage result = new BufferedImage(image.getWidth(), image.getHeight(), - BufferedImage.TYPE_INT_ARGB); - for (int i = 0; i < this.image.getWidth(); i++) { - for (int j = 0; j < this.image.getHeight(); j++) { - result.setRGB(i, j, image.getRGB(i, j)); - } - } - return result; + return new UImage(image.muteTransparentColor(newColor), rawFileName, formula); } } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/AbstractColorMapper.java b/src/net/sourceforge/plantuml/ugraphic/color/AbstractColorMapper.java index 5020e90ad..b78cc3cf3 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/AbstractColorMapper.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/AbstractColorMapper.java @@ -41,7 +41,7 @@ import net.sourceforge.plantuml.svek.DotStringFactory; public abstract class AbstractColorMapper implements ColorMapper { - final public String toHtml(HColor hcolor) { + final public String toRGB(HColor hcolor) { if (hcolor == null) { return null; } @@ -54,17 +54,31 @@ public abstract class AbstractColorMapper implements ColorMapper { return "none"; } if (hcolor instanceof HColorBackground) { - final HColor result = ((HColorBackground) hcolor).getBack(); + hcolor = ((HColorBackground) hcolor).getBack(); // Thread.dumpStack(); // System.exit(0); // return toHtml(result); } + if (HColorUtils.isTransparent(hcolor)) { + return "#00000000"; + } final Color color = toColor(hcolor); final int alpha = color.getAlpha(); - if (alpha != 255) { - return DotStringFactory.sharpAlpha(color.getRGB()); + if (alpha == 255) { + return toRGB(hcolor); } - return toHtml(hcolor); + String s = "0" + Integer.toHexString(alpha).toUpperCase(); + s = s.substring(s.length() - 2); + return toRGB(hcolor) + s; + } + + private static String sharpAlpha(int color) { + final int v = color & 0xFFFFFF; + String s = "00000" + Integer.toHexString(v).toUpperCase(); + s = s.substring(s.length() - 6); + final int alpha = (int) (((long) color) & 0x000000FF) << 24; + final String s2 = "0" + Integer.toHexString(alpha).toUpperCase(); + return "#" + s + s2.substring(0, 2); } } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapper.java b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapper.java index 8ac02cea0..0257022b2 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/ColorMapper.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/ColorMapper.java @@ -43,5 +43,5 @@ public interface ColorMapper { public String toSvg(HColor color); - public String toHtml(HColor color); + public String toRGB(HColor color); } diff --git a/src/net/sourceforge/plantuml/ugraphic/color/HColorSet.java b/src/net/sourceforge/plantuml/ugraphic/color/HColorSet.java index af00cd7e8..a4972fa39 100644 --- a/src/net/sourceforge/plantuml/ugraphic/color/HColorSet.java +++ b/src/net/sourceforge/plantuml/ugraphic/color/HColorSet.java @@ -257,7 +257,6 @@ public class HColorSet { } private HColor build(String s, HColor background) { - s = removeFirstDieseAndgoLowerCase(s); final Color color; if (s.equalsIgnoreCase("transparent") || s.equalsIgnoreCase("background")) { @@ -270,8 +269,7 @@ public class HColorSet { } 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); + color = fromRGBa(s); } else { final String value = htmlNames.get(s); if (value == null) { @@ -282,6 +280,18 @@ public class HColorSet { return new HColorSimple(color, false); } + private Color fromRGBa(String s) { + // https://forum.plantuml.net/11606/full-opacity-alpha-compositing-support-for-svg-and-png + if (s.length() != 8) { + throw new IllegalArgumentException(); + } + final int red = Integer.parseInt(s.substring(0, 2), 16); + final int green = Integer.parseInt(s.substring(2, 4), 16); + final int blue = Integer.parseInt(s.substring(4, 6), 16); + final int alpha = Integer.parseInt(s.substring(6, 8), 16); + return new Color(red, green, blue, alpha); + } + private boolean isValid(String s, boolean acceptTransparent) { s = removeFirstDieseAndgoLowerCase(s); if (s.matches("[0-9A-Fa-f]{3}")) { diff --git a/src/net/sourceforge/plantuml/ugraphic/eps/DriverImageEps.java b/src/net/sourceforge/plantuml/ugraphic/eps/DriverImageEps.java index 73a90799b..56dd07f6a 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.toColor(param.getBackcolor())).getImage(), x, y); + eps.drawImage(shape.muteTransparentColor(mapper.toColor(param.getBackcolor())).getImage(1), x, y); } } diff --git a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverImageG2d.java b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverImageG2d.java index c708beec3..79df6a6b8 100644 --- a/src/net/sourceforge/plantuml/ugraphic/g2d/DriverImageG2d.java +++ b/src/net/sourceforge/plantuml/ugraphic/g2d/DriverImageG2d.java @@ -36,6 +36,7 @@ package net.sourceforge.plantuml.ugraphic.g2d; import java.awt.Graphics2D; +import java.awt.geom.AffineTransform; import net.sourceforge.plantuml.EnsureVisible; import net.sourceforge.plantuml.ugraphic.UDriver; @@ -49,11 +50,11 @@ public class DriverImageG2d implements UDriver { private final EnsureVisible visible; - // private final double dpiFactor; + private final double dpiFactor; public DriverImageG2d(double dpiFactor, EnsureVisible visible) { this.visible = visible; - // this.dpiFactor = dpiFactor; + this.dpiFactor = dpiFactor; } public void draw(UShape ushape, double x, double y, ColorMapper mapper, UParam param, Graphics2D g2d) { @@ -63,11 +64,14 @@ public class DriverImageG2d implements UDriver { final UImage shape = ((UImage) ushape); visible.ensureVisible(x, y); visible.ensureVisible(x + shape.getWidth(), y + shape.getHeight()); - // final AffineTransform back = g2d.getTransform(); - // System.err.println("dpiFactor=" + dpiFactor); - // g2d.scale(1 / dpiFactor, 1 / dpiFactor); - g2d.drawImage(shape.getImage(), (int) (x), (int) (y), null); - // g2d.setTransform(back); + if (dpiFactor == 1) { + g2d.drawImage(shape.getImage(1), (int) (x), (int) (y), null); + } else { + final AffineTransform back = g2d.getTransform(); + g2d.scale(1 / dpiFactor, 1 / dpiFactor); + g2d.drawImage(shape.getImage(dpiFactor), (int) (x * dpiFactor), (int) (y * dpiFactor), null); + g2d.setTransform(back); + } } } diff --git a/src/net/sourceforge/plantuml/ugraphic/html5/DriverLineHtml5.java b/src/net/sourceforge/plantuml/ugraphic/html5/DriverLineHtml5.java index a15af59de..8a6962322 100644 --- a/src/net/sourceforge/plantuml/ugraphic/html5/DriverLineHtml5.java +++ b/src/net/sourceforge/plantuml/ugraphic/html5/DriverLineHtml5.java @@ -70,7 +70,7 @@ public class DriverLineHtml5 implements UDriver { y2 = line.y2; } - final String color = param.getColor() == null ? null : mapper.toHtml(param.getColor()); + final String color = param.getColor() == null ? null : mapper.toRGB(param.getColor()); html.setStrokeColor(color); 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 2a94bd98b..0ffbadedb 100644 --- a/src/net/sourceforge/plantuml/ugraphic/html5/DriverRectangleHtml5.java +++ b/src/net/sourceforge/plantuml/ugraphic/html5/DriverRectangleHtml5.java @@ -82,8 +82,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 : mapper.toHtml(param.getColor()); - final String backcolor = param.getColor() == null ? null : mapper.toHtml(param.getBackcolor()); + final String color = param.getColor() == null ? null : mapper.toRGB(param.getColor()); + final String backcolor = param.getColor() == null ? null : mapper.toRGB(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 4130a9c90..df241498f 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverCenteredCharacterSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverCenteredCharacterSvg.java @@ -58,7 +58,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(mapper.toHtml(param.getColor())); + svg.setStrokeColor(mapper.toRGB(param.getColor())); DriverTextAsPathSvg.drawPathIterator(svg, xpos, ypos, t.getOutline(null).getPathIterator(null)); } diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java index f4c50e1f3..77f55a6e0 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverEllipseSvg.java @@ -72,8 +72,8 @@ public class DriverEllipseSvg implements UDriver { final HColor back = param.getBackcolor(); if (back instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) back; - final String id = svg.createSvgGradient(mapper.toHtml(gr.getColor1()), - mapper.toHtml(gr.getColor2()), gr.getPolicy()); + final String id = svg.createSvgGradient(mapper.toRGB(gr.getColor1()), + mapper.toRGB(gr.getColor2()), gr.getPolicy()); svg.setFillColor("url(#" + id + ")"); } else if (back == null || back instanceof HColorBackground) { svg.setFillColor("none"); diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverImagePng.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverImagePng.java index 4d3c34972..30132db01 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverImagePng.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverImagePng.java @@ -68,7 +68,7 @@ public class DriverImagePng implements UDriver { } try { - svg.svgImage(image.getImage(), x, y); + svg.svgImage(image.getImage(1), x, y); } catch (IOException e) { Log.error("Error in svg for image " + e); } diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java index 3a653b79d..9cebdceb7 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverPathSvg.java @@ -71,8 +71,8 @@ public class DriverPathSvg extends DriverShadowedG2d implements UDriver { final HColor back = param.getBackcolor(); if (back instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) back; - final String id = svg.createSvgGradient(mapper.toHtml(gr.getColor1()), - mapper.toHtml(gr.getColor2()), gr.getPolicy()); + final String id = svg.createSvgGradient(mapper.toRGB(gr.getColor1()), + mapper.toRGB(gr.getColor2()), gr.getPolicy()); svg.setFillColor("url(#" + id + ")"); } else { final String backcolorString = mapper.toSvg(back); diff --git a/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java b/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java index 9d628cca0..b4e5f9b95 100644 --- a/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java +++ b/src/net/sourceforge/plantuml/ugraphic/svg/DriverRectangleSvg.java @@ -66,8 +66,8 @@ public class DriverRectangleSvg implements UDriver { final HColor back = param.getBackcolor(); if (back instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) back; - final String id = svg.createSvgGradient(mapper.toHtml(gr.getColor1()), - mapper.toHtml(gr.getColor2()), gr.getPolicy()); + final String id = svg.createSvgGradient(mapper.toRGB(gr.getColor1()), + mapper.toRGB(gr.getColor2()), gr.getPolicy()); svg.setFillColor("url(#" + id + ")"); applyColor(svg, mapper, param); } else { @@ -96,8 +96,8 @@ public class DriverRectangleSvg implements UDriver { final HColor color = param.getColor(); if (color instanceof HColorGradient) { final HColorGradient gr = (HColorGradient) color; - final String id = svg.createSvgGradient(mapper.toHtml(gr.getColor1()), - mapper.toHtml(gr.getColor2()), gr.getPolicy()); + final String id = svg.createSvgGradient(mapper.toRGB(gr.getColor1()), + mapper.toRGB(gr.getColor2()), gr.getPolicy()); svg.setStrokeColor("url(#" + id + ")"); } else { 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 46fa6b04d..17fee68bb 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(mapper.toHtml(gr.getColor1()), - mapper.toHtml(gr.getColor2()), gr.getPolicy()); + final String id = svg.createSvgGradient(mapper.toRGB(gr.getColor1()), + mapper.toRGB(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 = mapper.toHtml(back); + backColor = mapper.toRGB(back); } } - svg.setFillColor(mapper.toHtml(fontConfiguration.getColor())); + svg.setFillColor(mapper.toRGB(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/version/PSystemKeycheck.java b/src/net/sourceforge/plantuml/version/PSystemKeycheck.java index 6d404c7da..1130bd025 100644 --- a/src/net/sourceforge/plantuml/version/PSystemKeycheck.java +++ b/src/net/sourceforge/plantuml/version/PSystemKeycheck.java @@ -53,6 +53,8 @@ import net.sourceforge.plantuml.flashcode.FlashCodeUtils; import net.sourceforge.plantuml.graphic.GraphicStrings; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.UDrawable; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.ImageBuilder; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; @@ -73,8 +75,8 @@ public class PSystemKeycheck extends AbstractPSystem { @Override final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed) throws IOException { - final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), - false, null, getMetadata(), null, 1.0, HColorUtils.WHITE); + final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), false, null, getMetadata(), + null, 1.0, HColorUtils.WHITE); imageBuilder.setUDrawable(new UDrawable() { public void drawU(UGraphic ug) { @@ -133,7 +135,8 @@ public class PSystemKeycheck extends AbstractPSystem { Version.versionString() + "\n" + SignatureUtils.toHexString(PLSSignature.signature()), Color.BLACK, Color.WHITE); if (im != null) { - final UImage flash = new UImage(im).scaleNearestNeighbor(4); + final UImage flash = new UImage(new PixelImage(im, AffineTransformType.TYPE_NEAREST_NEIGHBOR)) + .scale(4); ug.draw(flash); ug = ug.apply(UTranslate.dy(flash.getHeight())); } diff --git a/src/net/sourceforge/plantuml/version/PSystemKeygen.java b/src/net/sourceforge/plantuml/version/PSystemKeygen.java index e67a30471..064de872d 100644 --- a/src/net/sourceforge/plantuml/version/PSystemKeygen.java +++ b/src/net/sourceforge/plantuml/version/PSystemKeygen.java @@ -53,6 +53,8 @@ import net.sourceforge.plantuml.graphic.GraphicStrings; import net.sourceforge.plantuml.graphic.TextBlock; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.security.SFile; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.ImageBuilder; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; @@ -71,8 +73,8 @@ public class PSystemKeygen extends AbstractPSystem { @Override final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed) throws IOException { - final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), - false, null, getMetadata(), null, 1.0, HColorUtils.WHITE); + final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), false, null, getMetadata(), + null, 1.0, HColorUtils.WHITE); imageBuilder.setUDrawable(new UDrawable() { public void drawU(UGraphic ug) { @@ -152,9 +154,11 @@ public class PSystemKeygen extends AbstractPSystem { ug = ug.apply(UTranslate.dy(disp.calculateDimension(ug.getStringBounder()).getHeight())); final FlashCodeUtils utils = FlashCodeFactory.getFlashCodeUtils(); final BufferedImage im = utils.exportFlashcode( - Version.versionString() + "\n" + SignatureUtils.toHexString(PLSSignature.signature()), Color.BLACK, Color.WHITE); + Version.versionString() + "\n" + SignatureUtils.toHexString(PLSSignature.signature()), Color.BLACK, + Color.WHITE); if (im != null) { - final UImage flash = new UImage(im).scaleNearestNeighbor(4); + final UImage flash = new UImage(new PixelImage(im, AffineTransformType.TYPE_NEAREST_NEIGHBOR)) + .scale(4); ug.draw(flash); ug = ug.apply(UTranslate.dy(flash.getHeight())); } diff --git a/src/net/sourceforge/plantuml/version/PSystemLicense.java b/src/net/sourceforge/plantuml/version/PSystemLicense.java index 623a5a0c5..3dfbb54e8 100644 --- a/src/net/sourceforge/plantuml/version/PSystemLicense.java +++ b/src/net/sourceforge/plantuml/version/PSystemLicense.java @@ -47,6 +47,8 @@ import net.sourceforge.plantuml.core.ImageData; import net.sourceforge.plantuml.graphic.GraphicStrings; import net.sourceforge.plantuml.graphic.UDrawable; import net.sourceforge.plantuml.svek.TextBlockBackcolored; +import net.sourceforge.plantuml.ugraphic.AffineTransformType; +import net.sourceforge.plantuml.ugraphic.PixelImage; import net.sourceforge.plantuml.ugraphic.ImageBuilder; import net.sourceforge.plantuml.ugraphic.UGraphic; import net.sourceforge.plantuml.ugraphic.UImage; @@ -58,8 +60,8 @@ public class PSystemLicense extends AbstractPSystem implements UDrawable { @Override final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed) throws IOException { - final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), false, null, - getMetadata(), null, 1.0, null); + final ImageBuilder imageBuilder = ImageBuilder.buildA(new ColorMapperIdentity(), false, null, getMetadata(), + null, 1.0, null); imageBuilder.setUDrawable(this); return imageBuilder.writeImageTOBEMOVED(fileFormat, seed, os); } @@ -96,7 +98,7 @@ public class PSystemLicense extends AbstractPSystem implements UDrawable { final TextBlockBackcolored result1 = getGraphicStrings(strings1); result1.drawU(ug); ug = ug.apply(UTranslate.dy(4 + result1.calculateDimension(ug.getStringBounder()).getHeight())); - UImage im = new UImage(logo); + UImage im = new UImage(new PixelImage(logo, AffineTransformType.TYPE_BILINEAR)); ug.apply(UTranslate.dx(20)).draw(im); ug = ug.apply(UTranslate.dy(im.getHeight())); diff --git a/src/net/sourceforge/plantuml/version/Version.java b/src/net/sourceforge/plantuml/version/Version.java index fce1ce71f..467e7f0e4 100644 --- a/src/net/sourceforge/plantuml/version/Version.java +++ b/src/net/sourceforge/plantuml/version/Version.java @@ -44,7 +44,7 @@ public class Version { private static final int MAJOR_SEPARATOR = 1000000; public static int version() { - return 1202011; + return 1202012; } public static int versionPatched() { @@ -93,7 +93,7 @@ public class Version { } public static long compileTime() { - return 1590833623475L; + return 1591440855351L; } public static String compileTimeString() {