net.sourceforge.plantuml.klimt.drawing.eps.EpsGraphicsMacro Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of plantuml-gplv2 Show documentation
Show all versions of plantuml-gplv2 Show documentation
PlantUML is a component that allows to quickly write diagrams from text.
// THIS FILE HAS BEEN GENERATED BY A PREPROCESSOR.
/* +=======================================================================
* |
* | PlantUML : a free UML diagram generator
* |
* +=======================================================================
*
* (C) Copyright 2009-2024, Arnaud Roques
*
* Project Info: https://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* https://plantuml.com/patreon (only 1$ per month!)
* https://plantuml.com/liberapay (only 1€ per month!)
* https://plantuml.com/paypal
*
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License V2.
*
* THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
* LICENSE ("AGREEMENT"). [GNU General Public License V2]
*
* ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES
* RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
*
* You may obtain a copy of the License at
*
* https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* PlantUML can occasionally display sponsored or advertising messages. Those
* messages are usually generated on welcome or error images and never on
* functional diagrams.
* See https://plantuml.com/professional if you want to remove them
*
* Images (whatever their format : PNG, SVG, EPS...) generated by running PlantUML
* are owned by the author of their corresponding sources code (that is, their
* textual description in PlantUML language). Those images are not covered by
* this GPL v2 license.
*
* The generated images can then be used without any reference to the GPL v2 license.
* It is not even necessary to stipulate that they have been generated with PlantUML,
* although this will be appreciated by the PlantUML team.
*
* There is an exception : if the textual description in PlantUML language is also covered
* by any license, then the generated images are logically covered
* by the very same license.
*
* This is the IGY distribution (Install GraphViz by Yourself).
* You have to install GraphViz and to setup the GRAPHVIZ_DOT environment variable
* (see https://plantuml.com/graphviz-dot )
*
* Icons provided by OpenIconic : https://useiconic.com/open
* Archimate sprites provided by Archi : http://www.archimatetool.com
* Stdlib AWS provided by https://github.com/milo-minderbinder/AWS-PlantUML
* Stdlib Icons provided https://github.com/tupadr3/plantuml-icon-font-sprites
* ASCIIMathML (c) Peter Jipsen http://www.chapman.edu/~jipsen
* ASCIIMathML (c) David Lippman http://www.pierce.ctc.edu/dlippman
* CafeUndZopfli ported by Eugene Klyuchnikov https://github.com/eustas/CafeUndZopfli
* Brotli (c) by the Brotli Authors https://github.com/google/brotli
* Themes (c) by Brett Schwarz https://github.com/bschwarz/puml-themes
* Twemoji (c) by Twitter at https://twemoji.twitter.com/
*
*/
package net.sourceforge.plantuml.klimt.drawing.eps;
import java.awt.geom.PathIterator;
import java.util.HashMap;
import java.util.Map;
public class EpsGraphicsMacro extends EpsGraphics {
private final PostScriptData data = new PostScriptData();
private final PostScriptCommandMacro rquadto = new PostScriptCommandMacro("rquadto");
public EpsGraphicsMacro() {
super();
rquadto.add(new PostScriptCommandRaw("3 index 3 index 4 2 roll rcurveto", true));
}
@Override
protected void append(String s, boolean checkConsistence) {
if (checkConsistence && s.indexOf(" ") != -1)
throw new IllegalArgumentException(s);
data.add(new PostScriptCommandRaw(s, checkConsistence));
}
@Override
protected String getBodyString() {
final StringBuilder sb = new StringBuilder();
sb.append(rquadto.getPostStringDefinition());
for (PostScriptCommandMacro macro : macros.keySet()) {
sb.append(macro.getPostStringDefinition());
}
sb.append(data.toPostString());
return sb.toString();
}
// FONT
private double posX;
private double posY;
private int macroCpt;
private final Map macros = new HashMap();
@Override
public void newpath() {
append("0 setlinewidth", true);
append("[] 0 setdash", true);
appendColor(getColor());
append("newpath", true);
}
@Override
public void closepath() {
macroInProgress.add(new PostScriptCommandRaw("closepath", true));
closeMacro();
}
@Override
public void fill(int windingRule) {
if (macroInProgress != null)
closeMacro();
if (windingRule == PathIterator.WIND_EVEN_ODD)
append("eofill", true);
else if (windingRule == PathIterator.WIND_NON_ZERO)
append("fill", true);
}
private PostScriptCommandMacro macroInProgress = null;
@Override
public void moveto(double x1, double y1) {
data.add(new PostScriptCommandMoveTo(x1, y1));
this.posX = x1;
this.posY = y1;
openMacro();
ensureVisible(x1, y1);
}
@Override
public void lineto(double x1, double y1) {
final PostScriptCommand cmd = new PostScriptCommandLineTo(x1 - posX, y1 - posY);
macroInProgress.add(cmd);
this.posX = x1;
this.posY = y1;
ensureVisible(x1, y1);
}
@Override
public void curveto(double x1, double y1, double x2, double y2, double x3, double y3) {
final PostScriptCommandCurveTo cmd = new PostScriptCommandCurveTo(x1 - posX, y1 - posY, x2 - posX, y2 - posY,
x3 - posX, y3 - posY);
macroInProgress.add(cmd);
this.posX = x3;
this.posY = y3;
ensureVisible(x1, y1);
ensureVisible(x2, y2);
ensureVisible(x3, y3);
}
@Override
public void quadto(double x1, double y1, double x2, double y2) {
final PostScriptCommandQuadTo cmd = new PostScriptCommandQuadTo(x1 - posX, y1 - posY, x2 - posX, y2 - posY);
macroInProgress.add(cmd);
this.posX = x2;
this.posY = y2;
ensureVisible(x1, y1);
ensureVisible(x2, y2);
}
private void openMacro() {
if (macroInProgress != null)
throw new IllegalStateException();
macroInProgress = new PostScriptCommandMacro(macroName());
}
private String macroName() {
return "P$" + Integer.toString(macroCpt, 36);
}
private void closeMacro() {
if (macroInProgress == null)
throw new IllegalStateException();
final String existingName = macros.get(macroInProgress);
if (existingName == null) {
macros.put(macroInProgress, macroInProgress.getName());
append(macroName(), true);
macroCpt++;
} else {
append(existingName, true);
}
macroInProgress = null;
}
@Override
protected void epsHLine(double x, double ymin, double ymax) {
append(format(x) + " " + format(ymin) + " moveto", true);
final long diff = (long) ((ymax - ymin) * COEF);
long nb = diff / (getDashVisible() + getDashSpace());
final long lastY = (long) (ymin * COEF) + nb * (getDashVisible() + getDashSpace());
long v = (long) (ymax * COEF) - lastY;
if (v > getDashVisible()) {
nb++;
v = 0;
}
append(nb + "{", true);
append("0 " + getDashVisible() + " rlineto", true);
append("0 " + getDashSpace() + " rmoveto", true);
append("} repeat", true);
if (v > 0)
append("0 " + v + " rlineto", true);
}
@Override
protected void epsVLine(double y, double xmin, double xmax) {
append(format(xmin) + " " + format(y) + " moveto", true);
final long diff = (long) ((xmax - xmin) * COEF);
long nb = (diff / (getDashVisible() + getDashSpace()));
final long lastX = (long) (xmin * COEF) + nb * (getDashVisible() + getDashSpace());
long v = (long) (xmax * COEF) - lastX;
if (v > getDashVisible()) {
nb++;
v = 0;
}
append(nb + "{", true);
append("" + getDashVisible() + " 0 rlineto", true);
append("" + getDashSpace() + " 0 rmoveto", true);
append("} repeat", true);
if (v > 0)
append(v + " 0 rlineto", true);
}
}