X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.g2d%2Fsrc%2Forg%2Fsimantics%2Fg2d%2Fsvg%2FStrokeDesc.java;h=0c61fdd82ef8597294a03c33cc5e89d00b2e6173;hp=db2f4110b5a22911a46e8d3b5b332653c9d4d56f;hb=refs%2Fchanges%2F38%2F238%2F2;hpb=24e2b34260f219f0d1644ca7a138894980e25b14 diff --git a/bundles/org.simantics.g2d/src/org/simantics/g2d/svg/StrokeDesc.java b/bundles/org.simantics.g2d/src/org/simantics/g2d/svg/StrokeDesc.java index db2f4110b..0c61fdd82 100644 --- a/bundles/org.simantics.g2d/src/org/simantics/g2d/svg/StrokeDesc.java +++ b/bundles/org.simantics.g2d/src/org/simantics/g2d/svg/StrokeDesc.java @@ -1,394 +1,394 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 Association for Decentralized Information Management - * in Industry THTH ry. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * VTT Technical Research Centre of Finland - initial API and implementation - *******************************************************************************/ -package org.simantics.g2d.svg; - -import java.awt.BasicStroke; -import java.awt.Graphics2D; - -//import org.apache.batik.util.CSSConstants; - -/** - * @author Tuukka Lehtonen - */ -public class StrokeDesc { - - public static final String DEFAULT_MEASUREMENT_UNIT = ""; - - /** - * This empty array stands for no dashing. - */ - public static final double[] NO_DASHES_DASH_ARRAY = {}; - -// public static final String[] joinConv = { "miter", "round", "bevel" }; -// public static final String[] capConv = { "butt", "round", "square" }; - - /** - * Joins path segments by extending their outside edges until they meet. - */ - public final static Integer JOIN_MITER = BasicStroke.JOIN_MITER; - - /** - * Joins path segments by rounding off the corner at a radius of half the - * line width. - */ - public final static Integer JOIN_ROUND = BasicStroke.JOIN_ROUND; - - /** - * Joins path segments by connecting the outer corners of their wide - * outlines with a straight segment. - */ - public final static Integer JOIN_BEVEL = BasicStroke.JOIN_BEVEL; - - /** - * Ends unclosed subpaths and dash segments with no added decoration. - */ - public final static Integer CAP_BUTT = BasicStroke.CAP_BUTT; - - /** - * Ends unclosed subpaths and dash segments with a round decoration that has - * a radius equal to half of the width of the pen. - */ - public final static Integer CAP_ROUND = BasicStroke.CAP_ROUND; - - /** - * Ends unclosed subpaths and dash segments with a square projection that - * extends beyond the end of the segment to a distance equal to half of the - * line width. - */ - public final static Integer CAP_SQUARE = BasicStroke.CAP_SQUARE; - - - private String paint; - - private double opacity; - - private double width; - - private LineJoin join; - - private LineCap cap; - - private double miterLimit; - - /** - * An empty array (length == 0) stands for no dashing. - */ - private double[] dash; - - private double dashOffset; - - /** - * One of valid measurement units in SVG, such as "in", "mm", "cm", etc. - */ - private String unitSuffix; - - public StrokeDesc() { - this(StyleConstants.INHERIT, 1.0, 1.0, LineJoin.bevel, LineCap.butt, 10.0, null, 0.0); - } - - public StrokeDesc(String paint) { - this(paint, 1.0, 1.0, LineJoin.bevel, LineCap.butt, 10.0, null, 0.0); - } - - public StrokeDesc(String paint, double opacity, double width) { - this(paint, opacity, width, LineJoin.bevel, LineCap.butt, 10.0, null, 0.0); - } - - public StrokeDesc(String paint, double opacity, double width, LineJoin join, LineCap cap) { - this(paint, opacity, width, join, cap, 10.0, null, 0.0); - } - - public StrokeDesc(String paint, double opacity, double width, LineJoin join, LineCap cap, double miterLimit, double[] dashArray, double dashOffset) { - setPaint(paint); - setOpacity(opacity); - setLineWidth(width); - setLineJoin(join); - setEndCap(cap); - setMiterLimit(miterLimit); - - if (dashArray == null || dashArray.length == 0) - dashArray = NO_DASHES_DASH_ARRAY; - this.dash = dashArray; - this.dashOffset = dashOffset; - - this.unitSuffix = DEFAULT_MEASUREMENT_UNIT; - } - - public void setUnitSuffix(String unitSuffix) { - if (!SVGUnits.isValidUnit(unitSuffix)) - throw new IllegalArgumentException("invalid unit suffix: " + unitSuffix); - this.unitSuffix = unitSuffix; - } - - public String getUnitSuffix() { - return unitSuffix; - } - - public String getPaint() { - return paint; - } - - public void setPaint(String paint) { - this.paint = paint; - } - - public double getOpacity() { - return opacity; - } - - public void setOpacity(double opacity) { - this.opacity = opacity; - } - - /** - * Returns the line width. Line width is represented in user space, which is - * the default-coordinate system used by Java 2D. See the - * Graphics2D class comments for more information on the user - * space coordinate system. - * - * @return the line width of this BasicStroke. - * @see Graphics2D - */ - public double getLineWidth() { - return width; - } - - public String getLineWidthWithUnit() { - return String.valueOf(width) + unitSuffix; - } - - public void setLineWidth(double width) { - this.width = width; - } - - /** - * Returns the end cap style. - * - * @return the end cap style of this BasicStroke as one of - * the static int values that define possible end cap - * styles. - */ - public LineCap getEndCap() { - return cap; - } - - public void setEndCap(LineCap cap) { - this.cap = cap; - } - - /** - * Returns the line join style. - * - * @return the line join style of the BasicStroke as one of - * the static int values that define possible line - * join styles. - */ - public LineJoin getLineJoin() { - return join; - } - - public void setLineJoin(LineJoin join) { - this.join = join; - } - - /** - * Returns the limit of miter joins. - * - * @return the limit of miter joins of the BasicStroke. - */ - public double getMiterLimit() { - return miterLimit; - } - - public void setMiterLimit(double miterLimit) { - this.miterLimit = miterLimit; - } - - /** - * Returns the array representing the lengths of the dash segments. - * Alternate entries in the array represent the user space lengths of the - * opaque and transparent segments of the dashes. As the pen moves along the - * outline of the Shape to be stroked, the user space - * distance that the pen travels is accumulated. The distance value is used - * to index into the dash array. The pen is opaque when its current - * cumulative distance maps to an even element of the dash array and - * transparent otherwise. - * - * @return the dash array. - */ - public double[] getDashArray() { - if (dash == NO_DASHES_DASH_ARRAY) - return dash; - return (double[]) dash.clone(); - } - - public void setDashArray(double[] dash) { - if (dash == null || dash.length == 0) - dash = NO_DASHES_DASH_ARRAY; - this.dash = dash; - } - - /** - * Returns the current dash phase. The dash phase is a distance specified in - * user coordinates that represents an offset into the dashing pattern. In - * other words, the dash phase defines the point in the dashing pattern that - * will correspond to the beginning of the stroke. - * - * @return the dash phase as a double value. - */ - public double getDashOffset() { - return dashOffset; - } - - public void setDashOffset(double dashOffset) { - this.dashOffset = dashOffset; - } - - /** - * Returns the hashcode for this stroke. - * - * @return a hash code for this stroke. - */ - public int hashCode() { - int hash = (int) Double.doubleToLongBits(width); - hash = hash * 31 + join.ordinal(); - hash = hash * 31 + cap.ordinal(); - hash = hash * 31 + (int) Double.doubleToLongBits(miterLimit); - if (dash != null) { - hash = hash * 31 + (int) Double.doubleToLongBits(dashOffset); - for (int i = 0; i < dash.length; i++) { - hash = hash * 31 + (int) Double.doubleToLongBits(dash[i]); - } - } - return hash; - } - - /** - * Returns true if this BasicStroke represents the same stroking operation - * as the given argument. - * - *

- * Tests if a specified object is equal to this Stroke by - * first testing if it is a BasicStroke and then comparing - * its width, join, cap, miter limit, dash, and dash phase attributes with - * those of this Stroke. - * - * @param obj the specified object to compare to this Stroke - * @return true if the width, join, cap, miter limit, dash, - * and dash phase are the same for both objects; false - * otherwise. - */ - public boolean equals(Object obj) { - if (!(obj instanceof StrokeDesc)) { - return false; - } - - StrokeDesc bs = (StrokeDesc) obj; - if (width != bs.width) { - return false; - } - - if (join != bs.join) { - return false; - } - - if (cap != bs.cap) { - return false; - } - - if (miterLimit != bs.miterLimit) { - return false; - } - - if (dash != null) { - if (dashOffset != bs.dashOffset) { - return false; - } - - if (!java.util.Arrays.equals(dash, bs.dash)) { - return false; - } - } else if (bs.dash != null) { - return false; - } - - return true; - } - -// public String toStyleString() { -// StringBuilder s = new StringBuilder(); -// -// s.append(CSSConstants.CSS_STROKE_PROPERTY); -// s.append(':'); -// s.append(paint); -// if (!paint.equals(CSSConstants.CSS_NONE_VALUE)) { -// s.append(';'); -// s.append(CSSConstants.CSS_STROKE_OPACITY_PROPERTY); -// s.append(':'); -// s.append(opacity); -// s.append(';'); -// s.append(CSSConstants.CSS_STROKE_WIDTH_PROPERTY); -// s.append(':'); -// s.append(width); -// s.append(unitSuffix); -// if (dash.length > 0) { -// s.append(';'); -// s.append(CSSConstants.CSS_STROKE_DASHARRAY_PROPERTY); -// s.append(':'); -// appendDashArrayString(s); -// s.append(';'); -// s.append(CSSConstants.CSS_STROKE_DASHOFFSET_PROPERTY); -// s.append(':'); -// s.append(dashOffset); -// } -// s.append(';'); -// s.append(CSSConstants.CSS_STROKE_LINECAP_PROPERTY); -// s.append(':'); -// s.append(cap.toString()); -// s.append(';'); -// s.append(CSSConstants.CSS_STROKE_LINEJOIN_PROPERTY); -// s.append(':'); -// s.append(join.toString()); -// if (LineJoin.miter.equals(join)) { -// s.append(';'); -// s.append(CSSConstants.CSS_STROKE_MITERLIMIT_PROPERTY); -// s.append(':'); -// s.append(miterLimit); -// } -// } -// s.append(';'); -// -// return s.toString(); -// } - - public void appendDashArrayString(StringBuilder s) { - if (dash.length > 0) { - s.append(dash[0]); - for (int i = 1; i < dash.length; ++i) { - s.append(','); - s.append(dash[i]); - } - } - } - - public String dashArrayToString() { - String s = ""; - if (dash.length > 0) { - s += dash[0]; - for (int i = 1; i < dash.length; ++i) { - s += ',' + dash[i]; - } - } - return s; - } - -} +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.g2d.svg; + +import java.awt.BasicStroke; +import java.awt.Graphics2D; + +//import org.apache.batik.util.CSSConstants; + +/** + * @author Tuukka Lehtonen + */ +public class StrokeDesc { + + public static final String DEFAULT_MEASUREMENT_UNIT = ""; + + /** + * This empty array stands for no dashing. + */ + public static final double[] NO_DASHES_DASH_ARRAY = {}; + +// public static final String[] joinConv = { "miter", "round", "bevel" }; +// public static final String[] capConv = { "butt", "round", "square" }; + + /** + * Joins path segments by extending their outside edges until they meet. + */ + public final static Integer JOIN_MITER = BasicStroke.JOIN_MITER; + + /** + * Joins path segments by rounding off the corner at a radius of half the + * line width. + */ + public final static Integer JOIN_ROUND = BasicStroke.JOIN_ROUND; + + /** + * Joins path segments by connecting the outer corners of their wide + * outlines with a straight segment. + */ + public final static Integer JOIN_BEVEL = BasicStroke.JOIN_BEVEL; + + /** + * Ends unclosed subpaths and dash segments with no added decoration. + */ + public final static Integer CAP_BUTT = BasicStroke.CAP_BUTT; + + /** + * Ends unclosed subpaths and dash segments with a round decoration that has + * a radius equal to half of the width of the pen. + */ + public final static Integer CAP_ROUND = BasicStroke.CAP_ROUND; + + /** + * Ends unclosed subpaths and dash segments with a square projection that + * extends beyond the end of the segment to a distance equal to half of the + * line width. + */ + public final static Integer CAP_SQUARE = BasicStroke.CAP_SQUARE; + + + private String paint; + + private double opacity; + + private double width; + + private LineJoin join; + + private LineCap cap; + + private double miterLimit; + + /** + * An empty array (length == 0) stands for no dashing. + */ + private double[] dash; + + private double dashOffset; + + /** + * One of valid measurement units in SVG, such as "in", "mm", "cm", etc. + */ + private String unitSuffix; + + public StrokeDesc() { + this(StyleConstants.INHERIT, 1.0, 1.0, LineJoin.bevel, LineCap.butt, 10.0, null, 0.0); + } + + public StrokeDesc(String paint) { + this(paint, 1.0, 1.0, LineJoin.bevel, LineCap.butt, 10.0, null, 0.0); + } + + public StrokeDesc(String paint, double opacity, double width) { + this(paint, opacity, width, LineJoin.bevel, LineCap.butt, 10.0, null, 0.0); + } + + public StrokeDesc(String paint, double opacity, double width, LineJoin join, LineCap cap) { + this(paint, opacity, width, join, cap, 10.0, null, 0.0); + } + + public StrokeDesc(String paint, double opacity, double width, LineJoin join, LineCap cap, double miterLimit, double[] dashArray, double dashOffset) { + setPaint(paint); + setOpacity(opacity); + setLineWidth(width); + setLineJoin(join); + setEndCap(cap); + setMiterLimit(miterLimit); + + if (dashArray == null || dashArray.length == 0) + dashArray = NO_DASHES_DASH_ARRAY; + this.dash = dashArray; + this.dashOffset = dashOffset; + + this.unitSuffix = DEFAULT_MEASUREMENT_UNIT; + } + + public void setUnitSuffix(String unitSuffix) { + if (!SVGUnits.isValidUnit(unitSuffix)) + throw new IllegalArgumentException("invalid unit suffix: " + unitSuffix); + this.unitSuffix = unitSuffix; + } + + public String getUnitSuffix() { + return unitSuffix; + } + + public String getPaint() { + return paint; + } + + public void setPaint(String paint) { + this.paint = paint; + } + + public double getOpacity() { + return opacity; + } + + public void setOpacity(double opacity) { + this.opacity = opacity; + } + + /** + * Returns the line width. Line width is represented in user space, which is + * the default-coordinate system used by Java 2D. See the + * Graphics2D class comments for more information on the user + * space coordinate system. + * + * @return the line width of this BasicStroke. + * @see Graphics2D + */ + public double getLineWidth() { + return width; + } + + public String getLineWidthWithUnit() { + return String.valueOf(width) + unitSuffix; + } + + public void setLineWidth(double width) { + this.width = width; + } + + /** + * Returns the end cap style. + * + * @return the end cap style of this BasicStroke as one of + * the static int values that define possible end cap + * styles. + */ + public LineCap getEndCap() { + return cap; + } + + public void setEndCap(LineCap cap) { + this.cap = cap; + } + + /** + * Returns the line join style. + * + * @return the line join style of the BasicStroke as one of + * the static int values that define possible line + * join styles. + */ + public LineJoin getLineJoin() { + return join; + } + + public void setLineJoin(LineJoin join) { + this.join = join; + } + + /** + * Returns the limit of miter joins. + * + * @return the limit of miter joins of the BasicStroke. + */ + public double getMiterLimit() { + return miterLimit; + } + + public void setMiterLimit(double miterLimit) { + this.miterLimit = miterLimit; + } + + /** + * Returns the array representing the lengths of the dash segments. + * Alternate entries in the array represent the user space lengths of the + * opaque and transparent segments of the dashes. As the pen moves along the + * outline of the Shape to be stroked, the user space + * distance that the pen travels is accumulated. The distance value is used + * to index into the dash array. The pen is opaque when its current + * cumulative distance maps to an even element of the dash array and + * transparent otherwise. + * + * @return the dash array. + */ + public double[] getDashArray() { + if (dash == NO_DASHES_DASH_ARRAY) + return dash; + return (double[]) dash.clone(); + } + + public void setDashArray(double[] dash) { + if (dash == null || dash.length == 0) + dash = NO_DASHES_DASH_ARRAY; + this.dash = dash; + } + + /** + * Returns the current dash phase. The dash phase is a distance specified in + * user coordinates that represents an offset into the dashing pattern. In + * other words, the dash phase defines the point in the dashing pattern that + * will correspond to the beginning of the stroke. + * + * @return the dash phase as a double value. + */ + public double getDashOffset() { + return dashOffset; + } + + public void setDashOffset(double dashOffset) { + this.dashOffset = dashOffset; + } + + /** + * Returns the hashcode for this stroke. + * + * @return a hash code for this stroke. + */ + public int hashCode() { + int hash = (int) Double.doubleToLongBits(width); + hash = hash * 31 + join.ordinal(); + hash = hash * 31 + cap.ordinal(); + hash = hash * 31 + (int) Double.doubleToLongBits(miterLimit); + if (dash != null) { + hash = hash * 31 + (int) Double.doubleToLongBits(dashOffset); + for (int i = 0; i < dash.length; i++) { + hash = hash * 31 + (int) Double.doubleToLongBits(dash[i]); + } + } + return hash; + } + + /** + * Returns true if this BasicStroke represents the same stroking operation + * as the given argument. + * + *

+ * Tests if a specified object is equal to this Stroke by + * first testing if it is a BasicStroke and then comparing + * its width, join, cap, miter limit, dash, and dash phase attributes with + * those of this Stroke. + * + * @param obj the specified object to compare to this Stroke + * @return true if the width, join, cap, miter limit, dash, + * and dash phase are the same for both objects; false + * otherwise. + */ + public boolean equals(Object obj) { + if (!(obj instanceof StrokeDesc)) { + return false; + } + + StrokeDesc bs = (StrokeDesc) obj; + if (width != bs.width) { + return false; + } + + if (join != bs.join) { + return false; + } + + if (cap != bs.cap) { + return false; + } + + if (miterLimit != bs.miterLimit) { + return false; + } + + if (dash != null) { + if (dashOffset != bs.dashOffset) { + return false; + } + + if (!java.util.Arrays.equals(dash, bs.dash)) { + return false; + } + } else if (bs.dash != null) { + return false; + } + + return true; + } + +// public String toStyleString() { +// StringBuilder s = new StringBuilder(); +// +// s.append(CSSConstants.CSS_STROKE_PROPERTY); +// s.append(':'); +// s.append(paint); +// if (!paint.equals(CSSConstants.CSS_NONE_VALUE)) { +// s.append(';'); +// s.append(CSSConstants.CSS_STROKE_OPACITY_PROPERTY); +// s.append(':'); +// s.append(opacity); +// s.append(';'); +// s.append(CSSConstants.CSS_STROKE_WIDTH_PROPERTY); +// s.append(':'); +// s.append(width); +// s.append(unitSuffix); +// if (dash.length > 0) { +// s.append(';'); +// s.append(CSSConstants.CSS_STROKE_DASHARRAY_PROPERTY); +// s.append(':'); +// appendDashArrayString(s); +// s.append(';'); +// s.append(CSSConstants.CSS_STROKE_DASHOFFSET_PROPERTY); +// s.append(':'); +// s.append(dashOffset); +// } +// s.append(';'); +// s.append(CSSConstants.CSS_STROKE_LINECAP_PROPERTY); +// s.append(':'); +// s.append(cap.toString()); +// s.append(';'); +// s.append(CSSConstants.CSS_STROKE_LINEJOIN_PROPERTY); +// s.append(':'); +// s.append(join.toString()); +// if (LineJoin.miter.equals(join)) { +// s.append(';'); +// s.append(CSSConstants.CSS_STROKE_MITERLIMIT_PROPERTY); +// s.append(':'); +// s.append(miterLimit); +// } +// } +// s.append(';'); +// +// return s.toString(); +// } + + public void appendDashArrayString(StringBuilder s) { + if (dash.length > 0) { + s.append(dash[0]); + for (int i = 1; i < dash.length; ++i) { + s.append(','); + s.append(dash[i]); + } + } + } + + public String dashArrayToString() { + String s = ""; + if (dash.length > 0) { + s += dash[0]; + for (int i = 1; i < dash.length; ++i) { + s += ',' + dash[i]; + } + } + return s; + } + +}