diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/A.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/A.java index ef85b1b..c94cb38 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/A.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/A.java @@ -1,5 +1,6 @@ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.Group; import org.xbib.graphics.svg.xml.StyleAttribute; import java.io.IOException; diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/AdobeComposite.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/AdobeComposite.java new file mode 100644 index 0000000..9971921 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/AdobeComposite.java @@ -0,0 +1,39 @@ +package org.xbib.graphics.svg; + +import java.awt.Composite; +import java.awt.CompositeContext; +import java.awt.RenderingHints; +import java.awt.image.ColorModel; + +public class AdobeComposite implements Composite { + + public static final int CT_NORMAL = 0; + + public static final int CT_MULTIPLY = 1; + + public static final int CT_LAST = 2; + + final int compositeType; + + final float extraAlpha; + + public AdobeComposite(int compositeType, float extraAlpha) { + this.compositeType = compositeType; + this.extraAlpha = extraAlpha; + if (compositeType < 0 || compositeType >= CT_LAST) { + throw new IllegalArgumentException("Invalid composite type"); + } + if (extraAlpha < 0f || extraAlpha > 1f) { + throw new IllegalArgumentException("Invalid alpha"); + } + } + + public int getCompositeType() { + return compositeType; + } + + @Override + public CompositeContext createContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints) { + return new AdobeCompositeContext(compositeType, extraAlpha); + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/AdobeCompositeContext.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/AdobeCompositeContext.java new file mode 100644 index 0000000..62e481f --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/AdobeCompositeContext.java @@ -0,0 +1,57 @@ +package org.xbib.graphics.svg; + +import java.awt.CompositeContext; +import java.awt.image.Raster; +import java.awt.image.WritableRaster; + +public class AdobeCompositeContext implements CompositeContext { + + final int compositeType; + + final float extraAlpha; + + float[] rgba_src = new float[4]; + + float[] rgba_dstIn = new float[4]; + + float[] rgba_dstOut = new float[4]; + + public AdobeCompositeContext(int compositeType, float extraAlpha) { + this.compositeType = compositeType; + this.extraAlpha = extraAlpha; + rgba_dstOut[3] = 1f; + } + + @Override + public void compose(Raster src, Raster dstIn, WritableRaster dstOut) { + int width = src.getWidth(); + int height = src.getHeight(); + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + src.getPixel(i, j, rgba_src); + dstIn.getPixel(i, j, rgba_dstIn); + if (rgba_src[3] == 0) { + continue; + } + float alpha = rgba_src[3]; + switch (compositeType) { + default: + case AdobeComposite.CT_NORMAL: + rgba_dstOut[0] = rgba_src[0] * alpha + rgba_dstIn[0] * (1f - alpha); + rgba_dstOut[1] = rgba_src[1] * alpha + rgba_dstIn[1] * (1f - alpha); + rgba_dstOut[2] = rgba_src[2] * alpha + rgba_dstIn[2] * (1f - alpha); + break; + case AdobeComposite.CT_MULTIPLY: + rgba_dstOut[0] = rgba_src[0] * rgba_dstIn[0] * alpha + rgba_dstIn[0] * (1f - alpha); + rgba_dstOut[1] = rgba_src[1] * rgba_dstIn[1] * alpha + rgba_dstIn[1] * (1f - alpha); + rgba_dstOut[2] = rgba_src[2] * rgba_dstIn[2] * alpha + rgba_dstIn[2] * (1f - alpha); + break; + } + } + } + } + + @Override + public void dispose() { + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/ClipPath.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/ClipPath.java deleted file mode 100644 index dec8098..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/ClipPath.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 1:56 AM - */ -package org.xbib.graphics.svg; - -import org.xbib.graphics.svg.xml.StyleAttribute; - -import java.awt.Shape; -import java.awt.geom.Area; -import java.io.IOException; - -/** - * @author Mark McKay - * @author Mark McKay - */ -public class ClipPath extends SVGElement { - - public static final String TAG_NAME = "clippath"; - public static final int CP_USER_SPACE_ON_USE = 0; - public static final int CP_OBJECT_BOUNDING_BOX = 1; - int clipPathUnits = CP_USER_SPACE_ON_USE; - - /** - * Creates a new instance of Stop - */ - public ClipPath() { - } - - @Override - public String getTagName() { - return TAG_NAME; - } - - /** - * Called after the start element but before the end element to indicate - * each child tag that has been processed - */ - @Override - public void loaderAddChild(SVGLoaderHelper helper, SVGElement child) throws SVGElementException { - super.loaderAddChild(helper, child); - } - - @Override - protected void build() throws SVGException, IOException { - super.build(); - - StyleAttribute sty = new StyleAttribute(); - - clipPathUnits = (getPres(sty.setName("clipPathUnits")) - && sty.getStringValue().equals("objectBoundingBox")) - ? CP_OBJECT_BOUNDING_BOX - : CP_USER_SPACE_ON_USE; - } - - public int getClipPathUnits() { - return clipPathUnits; - } - - public Shape getClipPathShape() { - if (children.isEmpty()) { - return null; - } - if (children.size() == 1) { - return ((ShapeElement) children.get(0)).getShape(); - } - - Area clipArea = null; - for (SVGElement svgElement : children) { - ShapeElement se = (ShapeElement) svgElement; - - if (clipArea == null) { - Shape shape = se.getShape(); - if (shape != null) { - clipArea = new Area(se.getShape()); - } - continue; - } - - Shape shape = se.getShape(); - if (shape != null) { - clipArea.intersect(new Area(shape)); - } - } - - return clipArea; - } - - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @param curTime Time at which to evaluate node - * @return - true if this node has changed state as a result of the time - * update - * @throws SVGException - */ - @Override - public boolean updateTime(double curTime) throws SVGException, IOException { - //Get current values for parameters - StyleAttribute sty = new StyleAttribute(); - boolean shapeChange = false; - - - if (getPres(sty.setName("clipPathUnits"))) { - String newUnitsStrn = sty.getStringValue(); - int newUnits = newUnitsStrn.equals("objectBoundingBox") - ? CP_OBJECT_BOUNDING_BOX - : CP_USER_SPACE_ON_USE; - - if (newUnits != clipPathUnits) { - clipPathUnits = newUnits; - shapeChange = true; - } - } - - if (shapeChange) { - build(); - } - - for (int i = 0; i < children.size(); ++i) { - SVGElement ele = children.get(i); - ele.updateTime(curTime); - } - - return shapeChange; - } -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Defs.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Defs.java deleted file mode 100644 index 06961e5..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Defs.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 1:56 AM - */ -package org.xbib.graphics.svg; - -import org.xbib.graphics.svg.xml.StyleSheet; - -import java.io.IOException; - -/** - * @author Mark McKay - * @author Mark McKay - */ -public class Defs extends TransformableElement { - - public static final String TAG_NAME = "defs"; - - /** - * Creates a new instance of Stop - */ - public Defs() { - } - - @Override - public String getTagName() { - return TAG_NAME; - } - - /** - * Called after the start element but before the end element to indicate - * each child tag that has been processed - */ - @Override - public void loaderAddChild(SVGLoaderHelper helper, SVGElement child) throws SVGElementException { - super.loaderAddChild(helper, child); - -// members.add(child); - } - - @Override - public boolean updateTime(double curTime) throws SVGException, IOException { - boolean stateChange = false; - for (SVGElement ele : children) { - stateChange = stateChange || ele.updateTime(curTime); - } - - return super.updateTime(curTime) || stateChange; - } - - public StyleSheet getStyleSheet() { - for (int i = 0; i < getNumChildren(); ++i) { - SVGElement ele = getChild(i); - if (ele instanceof Style) { - return ((Style) ele).getStyleSheet(); - } - } - return null; - } -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Desc.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Desc.java deleted file mode 100644 index ea9f14e..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Desc.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on September 19, 2004, 1:56 AM - */ -package org.xbib.graphics.svg; - -/** - * Holds title textual information within tree - * - * @author Mark McKay - * @author Mark McKay - */ -public class Desc extends SVGElement { - - public static final String TAG_NAME = "desc"; - StringBuffer text = new StringBuffer(); - - /** - * Creates a new instance of Stop - */ - public Desc() { - } - - @Override - public String getTagName() { - return TAG_NAME; - } - - /** - * Called during load process to add text scanned within a tag - */ - @Override - public void loaderAddText(SVGLoaderHelper helper, String text) { - this.text.append(text); - } - - public String getText() { - return text.toString(); - } - - @Override - public boolean updateTime(double curTime) { - return false; - } -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/FeDistantLight.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/FeDistantLight.java deleted file mode 100644 index e46f2d6..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/FeDistantLight.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on March 18, 2004, 6:52 AM - */ -package org.xbib.graphics.svg; - -import org.xbib.graphics.svg.xml.StyleAttribute; - -import java.io.IOException; - -/** - * @author Mark McKay - * @author Mark McKay - */ -public class FeDistantLight extends FeLight { - - public static final String TAG_NAME = "fedistantlight"; - float azimuth = 0f; - float elevation = 0f; - - /** - * Creates a new instance of FillElement - */ - public FeDistantLight() { - } - - @Override - public String getTagName() { - return TAG_NAME; - } - - @Override - protected void build() throws SVGException, IOException { - super.build(); - - StyleAttribute sty = new StyleAttribute(); - - if (getPres(sty.setName("azimuth"))) { - azimuth = sty.getFloatValueWithUnits(); - } - - if (getPres(sty.setName("elevation"))) { - elevation = sty.getFloatValueWithUnits(); - } - } - - public float getAzimuth() { - return azimuth; - } - - public float getElevation() { - return elevation; - } - - @Override - public boolean updateTime(double curTime) throws SVGException { -// if (trackManager.getNumTracks() == 0) return false; - - //Get current values for parameters - StyleAttribute sty = new StyleAttribute(); - boolean stateChange = false; - - if (getPres(sty.setName("azimuth"))) { - float newVal = sty.getFloatValueWithUnits(); - if (newVal != azimuth) { - azimuth = newVal; - stateChange = true; - } - } - - if (getPres(sty.setName("elevation"))) { - float newVal = sty.getFloatValueWithUnits(); - if (newVal != elevation) { - elevation = newVal; - stateChange = true; - } - } - - return stateChange; - } -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/FeLight.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/FeLight.java deleted file mode 100644 index c782a07..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/FeLight.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on March 18, 2004, 6:52 AM - */ -package org.xbib.graphics.svg; - -/** - * @author Mark McKay - * @author Mark McKay - */ -abstract public class FeLight extends FilterEffects { - - public static final String TAG_NAME = "feLight"; - - /** - * Creates a new instance of FillElement - */ - public FeLight() { - } - - @Override - public String getTagName() { - return TAG_NAME; - } -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/FePointLight.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/FePointLight.java deleted file mode 100644 index 92d1f78..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/FePointLight.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on March 18, 2004, 6:52 AM - */ -package org.xbib.graphics.svg; - -import org.xbib.graphics.svg.xml.StyleAttribute; - -import java.io.IOException; - -/** - * @author Mark McKay - * @author Mark McKay - */ -public class FePointLight extends FeLight { - - public static final String TAG_NAME = "fepointlight"; - float x = 0f; - float y = 0f; - float z = 0f; - - /** - * Creates a new instance of FillElement - */ - public FePointLight() { - } - - @Override - public String getTagName() { - return TAG_NAME; - } - - @Override - protected void build() throws SVGException, IOException { - super.build(); - - StyleAttribute sty = new StyleAttribute(); - - if (getPres(sty.setName("x"))) { - x = sty.getFloatValueWithUnits(); - } - - if (getPres(sty.setName("y"))) { - y = sty.getFloatValueWithUnits(); - } - - if (getPres(sty.setName("z"))) { - z = sty.getFloatValueWithUnits(); - } - } - - @Override - public float getX() { - return x; - } - - @Override - public float getY() { - return y; - } - - public float getZ() { - return z; - } - - @Override - public boolean updateTime(double curTime) throws SVGException { -// if (trackManager.getNumTracks() == 0) return false; - - //Get current values for parameters - StyleAttribute sty = new StyleAttribute(); - boolean stateChange = false; - - if (getPres(sty.setName("x"))) { - float newVal = sty.getFloatValueWithUnits(); - if (newVal != x) { - x = newVal; - stateChange = true; - } - } - - if (getPres(sty.setName("y"))) { - float newVal = sty.getFloatValueWithUnits(); - if (newVal != y) { - y = newVal; - stateChange = true; - } - } - - if (getPres(sty.setName("z"))) { - float newVal = sty.getFloatValueWithUnits(); - if (newVal != z) { - z = newVal; - stateChange = true; - } - } - - return stateChange; - } -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/FillElement.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/FillElement.java deleted file mode 100644 index adc859a..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/FillElement.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on March 18, 2004, 6:52 AM - */ -package org.xbib.graphics.svg; - -import java.awt.Paint; -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; - -/** - * @author Mark McKay - * @author Mark McKay - */ -abstract public class FillElement extends SVGElement { - /** - * Creates a new instance of FillElement - */ - public FillElement() { - } - - /** - * Requests the paint defined by this element. Passes in information to - * allow paint to be customized - * - * @param bounds - bounding box of shape being rendered - * @param xform - The current transformation that the shape is being - * rendered under. - * @return paint object - */ - abstract public Paint getPaint(Rectangle2D bounds, AffineTransform xform); -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/FilterEffects.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/FilterEffects.java deleted file mode 100644 index 28af4a6..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/FilterEffects.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on March 18, 2004, 6:52 AM - */ -package org.xbib.graphics.svg; - -import org.xbib.graphics.svg.xml.StyleAttribute; - -import java.awt.Rectangle; -import java.awt.image.BufferedImageOp; -import java.io.IOException; -import java.net.URI; -import java.net.URL; -import java.util.List; - -/** - * @author Mark McKay - * @author Mark McKay - */ -public abstract class FilterEffects extends SVGElement { - public static final String TAG_NAME = "filtereffects"; - - public static final int FP_SOURCE_GRAPHIC = 0; - public static final int FP_SOURCE_ALPHA = 1; - public static final int FP_BACKGROUND_IMAGE = 2; - public static final int FP_BACKGROUND_ALPHA = 3; - public static final int FP_FILL_PAINT = 4; - public static final int FP_STROKE_PAINT = 5; - public static final int FP_CUSTOM = 5; - private int filterPrimitiveTypeIn; - private String filterPrimitiveRefIn; - float x = 0f; - float y = 0f; - float width = 1f; - float height = 1f; - URL href = null; - - /** - * Creates a new instance of FillElement - */ - public FilterEffects() { - } - - @Override - public String getTagName() { - return TAG_NAME; - } - - /** - * Called after the start element but before the end element to indicate - * each child tag that has been processed - */ - @Override - public void loaderAddChild(SVGLoaderHelper helper, SVGElement child) throws SVGElementException { - super.loaderAddChild(helper, child); - - if (child instanceof FilterEffects) { -// filterEffects.add(child); - } - } - - @Override - protected void build() throws SVGException, IOException { - super.build(); - - /*StyleAttribute sty = new StyleAttribute(); - String strn; - - if (getPres(sty.setName("filterUnits"))) - { - strn = sty.getStringValue().toLowerCase(); - if (strn.equals("userspaceonuse")) filterUnits = FU_USER_SPACE_ON_USE; - else filterUnits = FU_OBJECT_BOUNDING_BOX; - } - - if (getPres(sty.setName("primitiveUnits"))) - { - strn = sty.getStringValue().toLowerCase(); - if (strn.equals("userspaceonuse")) primitiveUnits = PU_USER_SPACE_ON_USE; - else primitiveUnits = PU_OBJECT_BOUNDING_BOX; - } - - if (getPres(sty.setName("x"))) x = sty.getFloatValue(); - - if (getPres(sty.setName("y"))) y = sty.getFloatValue(); - - if (getPres(sty.setName("width"))) width = sty.getFloatValue(); - - if (getPres(sty.setName("height"))) height = sty.getFloatValue(); - - try { - if (getPres(sty.setName("xlink:href"))) - { - URI src = sty.getURIValue(getXMLBase()); - href = src.toURL(); - } - } - catch (Exception e) - { - throw new SVGException(e); - } - */ - } - - public List getOperations(Rectangle bounds, float xScale, float yScale) { - return null; - } - - public float getX() { - return x; - } - - public float getY() { - return y; - } - - public float getWidth() { - return width; - } - - public float getHeight() { - return height; - } - - @Override - public boolean updateTime(double curTime) throws SVGException { -// if (trackManager.getNumTracks() == 0) return false; - - //Get current values for parameters - StyleAttribute sty = new StyleAttribute(); - boolean stateChange = false; - - if (getPres(sty.setName("x"))) { - float newVal = sty.getFloatValueWithUnits(); - if (newVal != x) { - x = newVal; - stateChange = true; - } - } - - if (getPres(sty.setName("y"))) { - float newVal = sty.getFloatValueWithUnits(); - if (newVal != y) { - y = newVal; - stateChange = true; - } - } - - if (getPres(sty.setName("width"))) { - float newVal = sty.getFloatValueWithUnits(); - if (newVal != width) { - width = newVal; - stateChange = true; - } - } - - if (getPres(sty.setName("height"))) { - float newVal = sty.getFloatValueWithUnits(); - if (newVal != height) { - height = newVal; - stateChange = true; - } - } - - try { - if (getPres(sty.setName("xlink:href"))) { - URI src = sty.getURIValue(getXMLBase()); - URL newVal = src.toURL(); - - if (!newVal.equals(href)) { - href = newVal; - stateChange = true; - } - } - } catch (Exception e) { - throw new SVGException(e); - } - - /* - if (getPres(sty.setName("filterUnits"))) - { - int newVal; - String strn = sty.getStringValue().toLowerCase(); - if (strn.equals("userspaceonuse")) newVal = FU_USER_SPACE_ON_USE; - else newVal = FU_OBJECT_BOUNDING_BOX; - if (newVal != filterUnits) - { - filterUnits = newVal; - stateChange = true; - } - } - - if (getPres(sty.setName("primitiveUnits"))) - { - int newVal; - String strn = sty.getStringValue().toLowerCase(); - if (strn.equals("userspaceonuse")) newVal = PU_USER_SPACE_ON_USE; - else newVal = PU_OBJECT_BOUNDING_BOX; - if (newVal != filterUnits) - { - primitiveUnits = newVal; - stateChange = true; - } - } - - */ - - return stateChange; - } - - public static class FilterOp { - public final BufferedImageOp op; - public final Rectangle requiredImageBounds; - - public FilterOp(BufferedImageOp op, Rectangle requiredImageBounds) { - this.op = op; - this.requiredImageBounds = requiredImageBounds; - } - } -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/FontFace.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/FontFace.java index 0899065..6b6cae6 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/FontFace.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/FontFace.java @@ -1,5 +1,7 @@ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.Font; +import org.xbib.graphics.svg.element.SVGElement; import org.xbib.graphics.svg.xml.StyleAttribute; import java.io.IOException; diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/util/FontSystem.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/FontSystem.java similarity index 55% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/util/FontSystem.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/FontSystem.java index cb58e0e..cce01f5 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/util/FontSystem.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/FontSystem.java @@ -1,70 +1,32 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on April 24, 2015 - */ -package org.xbib.graphics.svg.util; +package org.xbib.graphics.svg; -import org.xbib.graphics.svg.Font; -import org.xbib.graphics.svg.FontFace; -import org.xbib.graphics.svg.Glyph; -import org.xbib.graphics.svg.MissingGlyph; -import org.xbib.graphics.svg.Text; +import org.xbib.graphics.svg.element.Font; +import org.xbib.graphics.svg.element.glyph.Glyph; +import org.xbib.graphics.svg.element.glyph.MissingGlyph; import java.awt.GraphicsEnvironment; import java.awt.font.FontRenderContext; import java.awt.font.GlyphMetrics; import java.awt.font.GlyphVector; import java.awt.font.LineMetrics; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Locale; +import java.util.Map; +import java.util.Set; -/** - * @author kitfox - */ public class FontSystem extends Font { + java.awt.Font sysFont; - HashMap glyphCache = new HashMap<>(); + Map glyphCache = new HashMap<>(); - static HashSet sysFontNames = new HashSet<>(); + static Set sysFontNames = new HashSet<>(); public static boolean checkIfSystemFontExists(String fontName) { if (sysFontNames.isEmpty()) { - for (String name : GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.ENGLISH)) { - sysFontNames.add(name); - } + Collections.addAll(sysFontNames, GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(Locale.ENGLISH)); } return sysFontNames.contains(fontName); @@ -94,15 +56,11 @@ public class FontSystem extends Font { private FontSystem(String fontFamily, int fontStyle, int fontWeight, float fontSize) { int style; - switch (fontStyle) { - case Text.TXST_ITALIC: - style = java.awt.Font.ITALIC; - break; - default: - style = java.awt.Font.PLAIN; - break; + if (fontStyle == Text.TXST_ITALIC) { + style = java.awt.Font.ITALIC; + } else { + style = java.awt.Font.PLAIN; } - int weight; switch (fontWeight) { case Text.TXWE_BOLD: @@ -113,12 +71,9 @@ public class FontSystem extends Font { weight = java.awt.Font.PLAIN; break; } - sysFont = new java.awt.Font(fontFamily, style | weight, 1).deriveFont(fontSize); - FontRenderContext fontRenderContext = new FontRenderContext(null, true, true); LineMetrics lineMetrics = sysFont.getLineMetrics("M", fontRenderContext); - FontFace face = new FontFace(); face.setAscent((int) lineMetrics.getAscent()); face.setDescent((int) lineMetrics.getDescent()); @@ -130,23 +85,17 @@ public class FontSystem extends Font { public MissingGlyph getGlyph(String unicode) { FontRenderContext frc = new FontRenderContext(null, true, true); GlyphVector vec = sysFont.createGlyphVector(frc, unicode); - Glyph glyph = glyphCache.get(unicode); if (glyph == null) { glyph = new Glyph(); glyph.setPath(vec.getGlyphOutline(0)); - GlyphMetrics gm = vec.getGlyphMetrics(0); glyph.setHorizAdvX(gm.getAdvanceX()); glyph.setVertAdvY(gm.getAdvanceY()); glyph.setVertOriginX(0); glyph.setVertOriginY(0); - glyphCache.put(unicode, glyph); } - return glyph; } - - } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Glyph.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Glyph.java deleted file mode 100644 index 01564b1..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Glyph.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on February 20, 2004, 10:00 PM - */ -package org.xbib.graphics.svg; - -import org.xbib.graphics.svg.xml.StyleAttribute; - -import java.io.IOException; - -/** - * Implements an embedded font. - *

- * SVG specification: http://www.w3.org/TR/SVG/fonts.html - * - * @author Mark McKay - * @author Mark McKay - */ -public class Glyph extends MissingGlyph { - - public static final String TAG_NAME = "missingglyph"; - /** - * One or more characters indicating the unicode sequence that denotes this - * glyph. - */ - String unicode; - - /** - * Creates a new instance of Font - */ - public Glyph() { - } - - @Override - public String getTagName() { - return TAG_NAME; - } - - @Override - protected void build() throws SVGException, IOException { - super.build(); - - StyleAttribute sty = new StyleAttribute(); - - if (getPres(sty.setName("unicode"))) { - unicode = sty.getStringValue(); - } - } - - public String getUnicode() { - return unicode; - } - - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @return - true if this node has changed state as a result of the time - * update - */ - @Override - public boolean updateTime(double curTime) throws SVGException { - //Fonts can't change - return false; - } -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/app/data/Handler.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Handler.java similarity index 97% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/app/data/Handler.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/Handler.java index 7e7106d..6a8ca58 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/app/data/Handler.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Handler.java @@ -1,4 +1,4 @@ -package org.xbib.graphics.svg.app.data; +package org.xbib.graphics.svg; import java.io.ByteArrayInputStream; import java.io.InputStream; diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/app/data/HandlerFactory.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/HandlerFactory.java similarity index 84% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/app/data/HandlerFactory.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/HandlerFactory.java index 306634f..75b5437 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/app/data/HandlerFactory.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/HandlerFactory.java @@ -1,4 +1,6 @@ -package org.xbib.graphics.svg.app.data; +package org.xbib.graphics.svg; + +import org.xbib.graphics.svg.Handler; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Hkern.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Hkern.java index 64c4d88..f71b359 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Hkern.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Hkern.java @@ -1,52 +1,18 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on February 20, 2004, 10:00 PM - */ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.SVGElement; import org.xbib.graphics.svg.xml.StyleAttribute; import java.io.IOException; -/** - * @author kitfox - */ public class Hkern extends SVGElement { public static final String TAG_NAME = "hkern"; + String u1; + String u2; + int k; @Override @@ -57,19 +23,13 @@ public class Hkern extends SVGElement { @Override protected void build() throws SVGException, IOException { super.build(); - StyleAttribute sty = new StyleAttribute(); - - - //Read glyph spacing info - if (getPres(sty.setName("u1"))) { + if (getPres(sty.setName("u1"))) { u1 = sty.getStringValue(); } - if (getPres(sty.setName("u2"))) { u2 = sty.getStringValue(); } - if (getPres(sty.setName("k"))) { k = sty.getIntValue(); } @@ -77,7 +37,6 @@ public class Hkern extends SVGElement { @Override public boolean updateTime(double curTime) throws SVGException { - //Fonts can't change return false; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/ImageSVG.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/ImageSVG.java index ddd2bd4..7e67d90 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/ImageSVG.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/ImageSVG.java @@ -1,6 +1,7 @@ package org.xbib.graphics.svg; -import org.xbib.graphics.svg.app.data.Handler; +import org.xbib.graphics.svg.element.RenderableElement; +import org.xbib.graphics.svg.element.SVGElement; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.AlphaComposite; @@ -19,6 +20,8 @@ import java.util.logging.Logger; public class ImageSVG extends RenderableElement { + private static final Logger logger = Logger.getLogger(ImageSVG.class.getName()); + public static final String TAG_NAME = "image"; float x = 0f; @@ -67,8 +70,7 @@ public class ImageSVG extends RenderableElement { try { imageSrc = src.toURL(); } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not parse xlink:href " + src, e); + logger.log(Level.SEVERE, "Could not parse xlink:href " + src, e); imageSrc = null; } } @@ -111,21 +113,21 @@ public class ImageSVG extends RenderableElement { } @Override - protected void doPick(Point2D point, boolean boundingBox, List> retVec) { + public void doPick(Point2D point, boolean boundingBox, List> retVec) { if (getBoundingBox().contains(point)) { retVec.add(getPath(null)); } } @Override - protected void doPick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) { + public void doPick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) { if (ltw.createTransformedShape(getBoundingBox()).intersects(pickArea)) { retVec.add(getPath(null)); } } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { StyleAttribute styleAttrib = new StyleAttribute(); if (getStyle(styleAttrib.setName("visibility"))) { if (!styleAttrib.getStringValue().equals("visible")) { @@ -218,12 +220,10 @@ public class ImageSVG extends RenderableElement { } } } catch (IllegalArgumentException ie) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Image provided with illegal value for href: \"" + logger.log(Level.SEVERE, "Image provided with illegal value for href: \"" + sty.getStringValue() + '"', ie); } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not parse xlink:href", e); + logger.log(Level.WARNING, "Could not parse xlink:href", e); } if (shapeChange) { build(); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Marker.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Marker.java index 6d0831f..673b468 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Marker.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Marker.java @@ -1,21 +1,25 @@ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.Group; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.AffineTransform; -import java.awt.geom.PathIterator; import java.awt.geom.Rectangle2D; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; public class Marker extends Group { public static final String TAG_NAME = "marker"; + public static final int MARKER_START = 0; + + public static final int MARKER_MID = 1; + + public static final int MARKER_END = 2; + AffineTransform viewXform; AffineTransform markerXform; @@ -93,7 +97,7 @@ public class Marker extends Group { } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { AffineTransform oldXform = g.getTransform(); g.transform(markerXform); super.doRender(g); @@ -130,137 +134,4 @@ public class Marker extends Group { build(); return changeState; } - - public static final int MARKER_START = 0; - - public static final int MARKER_MID = 1; - - public static final int MARKER_END = 2; - - public static class MarkerPos { - - int type; - - double x; - - double y; - - double dx; - - double dy; - - public MarkerPos(int type, double x, double y, double dx, double dy) { - this.type = type; - this.x = x; - this.y = y; - this.dx = dx; - this.dy = dy; - } - } - - public static class MarkerLayout { - - private final List markerList = new ArrayList<>(); - - boolean started = false; - - public void layout(Shape shape) { - double px = 0; - double py = 0; - double[] coords = new double[6]; - for (PathIterator it = shape.getPathIterator(null); - !it.isDone(); it.next()) { - switch (it.currentSegment(coords)) { - case PathIterator.SEG_MOVETO: - px = coords[0]; - py = coords[1]; - started = false; - break; - case PathIterator.SEG_CLOSE: - started = false; - break; - case PathIterator.SEG_LINETO: { - double x = coords[0]; - double y = coords[1]; - markerIn(px, py, x - px, y - py); - markerOut(x, y, x - px, y - py); - px = x; - py = y; - break; - } - case PathIterator.SEG_QUADTO: { - double k0x = coords[0]; - double k0y = coords[1]; - double x = coords[2]; - double y = coords[3]; - if (px != k0x || py != k0y) { - markerIn(px, py, k0x - px, k0y - py); - } else { - markerIn(px, py, x - px, y - py); - } - if (x != k0x || y != k0y) { - markerOut(x, y, x - k0x, y - k0y); - } else { - markerOut(x, y, x - px, y - py); - } - markerIn(px, py, k0x - px, k0y - py); - markerOut(x, y, x - k0x, y - k0y); - px = x; - py = y; - break; - } - case PathIterator.SEG_CUBICTO: { - double k0x = coords[0]; - double k0y = coords[1]; - double k1x = coords[2]; - double k1y = coords[3]; - double x = coords[4]; - double y = coords[5]; - if (px != k0x || py != k0y) { - markerIn(px, py, k0x - px, k0y - py); - } else if (px != k1x || py != k1y) { - markerIn(px, py, k1x - px, k1y - py); - } else { - markerIn(px, py, x - px, y - py); - } - if (x != k1x || y != k1y) { - markerOut(x, y, x - k1x, y - k1y); - } else if (x != k0x || y != k0y) { - markerOut(x, y, x - k0x, y - k0y); - } else { - markerOut(x, y, x - px, y - py); - } - px = x; - py = y; - break; - } - } - } - for (int i = 1; i < markerList.size(); ++i) { - MarkerPos prev = markerList.get(i - 1); - MarkerPos cur = markerList.get(i); - - if (cur.type == MARKER_START) { - prev.type = MARKER_END; - } - } - MarkerPos last = markerList.get(markerList.size() - 1); - last.type = MARKER_END; - } - - private void markerIn(double x, double y, double dx, double dy) { - if (!started) { - started = true; - markerList.add(new MarkerPos(MARKER_START, x, y, dx, dy)); - } - } - - private void markerOut(double x, double y, double dx, double dy) { - markerList.add(new MarkerPos(MARKER_MID, x, y, dx, dy)); - } - - public List getMarkerList() { - return markerList; - } - } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/MarkerLayout.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/MarkerLayout.java new file mode 100644 index 0000000..c509f8d --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/MarkerLayout.java @@ -0,0 +1,112 @@ +package org.xbib.graphics.svg; + +import java.awt.Shape; +import java.awt.geom.PathIterator; +import java.util.ArrayList; +import java.util.List; + +public class MarkerLayout { + + private final List markerList = new ArrayList<>(); + + boolean started = false; + + public void layout(Shape shape) { + double px = 0; + double py = 0; + double[] coords = new double[6]; + for (PathIterator it = shape.getPathIterator(null); + !it.isDone(); it.next()) { + switch (it.currentSegment(coords)) { + case PathIterator.SEG_MOVETO: + px = coords[0]; + py = coords[1]; + started = false; + break; + case PathIterator.SEG_CLOSE: + started = false; + break; + case PathIterator.SEG_LINETO: { + double x = coords[0]; + double y = coords[1]; + markerIn(px, py, x - px, y - py); + markerOut(x, y, x - px, y - py); + px = x; + py = y; + break; + } + case PathIterator.SEG_QUADTO: { + double k0x = coords[0]; + double k0y = coords[1]; + double x = coords[2]; + double y = coords[3]; + if (px != k0x || py != k0y) { + markerIn(px, py, k0x - px, k0y - py); + } else { + markerIn(px, py, x - px, y - py); + } + if (x != k0x || y != k0y) { + markerOut(x, y, x - k0x, y - k0y); + } else { + markerOut(x, y, x - px, y - py); + } + markerIn(px, py, k0x - px, k0y - py); + markerOut(x, y, x - k0x, y - k0y); + px = x; + py = y; + break; + } + case PathIterator.SEG_CUBICTO: { + double k0x = coords[0]; + double k0y = coords[1]; + double k1x = coords[2]; + double k1y = coords[3]; + double x = coords[4]; + double y = coords[5]; + if (px != k0x || py != k0y) { + markerIn(px, py, k0x - px, k0y - py); + } else if (px != k1x || py != k1y) { + markerIn(px, py, k1x - px, k1y - py); + } else { + markerIn(px, py, x - px, y - py); + } + if (x != k1x || y != k1y) { + markerOut(x, y, x - k1x, y - k1y); + } else if (x != k0x || y != k0y) { + markerOut(x, y, x - k0x, y - k0y); + } else { + markerOut(x, y, x - px, y - py); + } + px = x; + py = y; + break; + } + } + } + for (int i = 1; i < markerList.size(); ++i) { + MarkerPos prev = markerList.get(i - 1); + MarkerPos cur = markerList.get(i); + + if (cur.getType() == Marker.MARKER_START) { + prev.setType(Marker.MARKER_END); + } + } + MarkerPos last = markerList.get(markerList.size() - 1); + last.setType(Marker.MARKER_END); + } + + private void markerIn(double x, double y, double dx, double dy) { + if (!started) { + started = true; + markerList.add(new MarkerPos(Marker.MARKER_START, x, y, dx, dy)); + } + } + + private void markerOut(double x, double y, double dx, double dy) { + markerList.add(new MarkerPos(Marker.MARKER_MID, x, y, dx, dy)); + } + + public List getMarkerList() { + return markerList; + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/MarkerPos.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/MarkerPos.java new file mode 100644 index 0000000..a84b340 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/MarkerPos.java @@ -0,0 +1,30 @@ +package org.xbib.graphics.svg; + +public class MarkerPos { + + private int type; + + double x; + + double y; + + double dx; + + double dy; + + public MarkerPos(int type, double x, double y, double dx, double dy) { + this.type = type; + this.x = x; + this.y = y; + this.dx = dx; + this.dy = dy; + } + + public void setType(int type) { + this.type = type; + } + + public int getType() { + return type; + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Metadata.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Metadata.java index 512ebd1..4480838 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Metadata.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Metadata.java @@ -1,52 +1,11 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on September 19, 2004, 1:56 AM - */ package org.xbib.graphics.svg; -/** - * Does not hold any information. Included to allow metadata tag to be parsed. - * - * @author Mark McKay - * @author Mark McKay - */ +import org.xbib.graphics.svg.element.SVGElement; + public class Metadata extends SVGElement { + public static final String TAG_NAME = "metadata"; - /** - * Creates a new instance of Stop - */ public Metadata() { } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Path.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Path.java index 9aaffab..2c9ba9b 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Path.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Path.java @@ -1,40 +1,6 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 5:25 PM - */ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.ShapeElement; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Graphics2D; @@ -43,22 +9,16 @@ import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.io.IOException; -/** - * @author Mark McKay - * @author Mark McKay - */ public class Path extends ShapeElement { public static final String TAG_NAME = "path"; - // PathCommand[] commands = null; + int fillRule = GeneralPath.WIND_NON_ZERO; + String d = ""; - // ExtendedGeneralPath path; + GeneralPath path; - /** - * Creates a new instance of Rect - */ public Path() { } @@ -70,22 +30,17 @@ public class Path extends ShapeElement { @Override protected void build() throws SVGException, IOException { super.build(); - StyleAttribute sty = new StyleAttribute(); - - String fillRuleStrn = (getStyle(sty.setName("fill-rule"))) ? sty.getStringValue() : "nonzero"; fillRule = fillRuleStrn.equals("evenodd") ? GeneralPath.WIND_EVEN_ODD : GeneralPath.WIND_NON_ZERO; - if (getPres(sty.setName("d"))) { d = sty.getStringValue(); } - path = buildPath(d, fillRule); } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { beginLayer(g); renderShape(g, path); finishLayer(g); @@ -101,22 +56,11 @@ public class Path extends ShapeElement { return boundsToParent(includeStrokeInBounds(path.getBounds2D())); } - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @return - true if this node has changed state as a result of the time - * update - */ @Override public boolean updateTime(double curTime) throws SVGException, IOException { -// if (trackManager.getNumTracks() == 0) return false; boolean changeState = super.updateTime(curTime); - - //Get current values for parameters StyleAttribute sty = new StyleAttribute(); boolean shapeChange = false; - if (getStyle(sty.setName("fill-rule"))) { int newVal = sty.getStringValue().equals("evenodd") ? GeneralPath.WIND_EVEN_ODD @@ -126,7 +70,6 @@ public class Path extends ShapeElement { changeState = true; } } - if (getPres(sty.setName("d"))) { String newVal = sty.getStringValue(); if (!newVal.equals(d)) { @@ -134,13 +77,9 @@ public class Path extends ShapeElement { shapeChange = true; } } - if (shapeChange) { build(); -// path = buildPath(d, fillRule); -// return true; } - return changeState || shapeChange; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/PatternPaint.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/PatternPaint.java new file mode 100644 index 0000000..ee9c55a --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/PatternPaint.java @@ -0,0 +1,37 @@ +package org.xbib.graphics.svg; + +import java.awt.Paint; +import java.awt.PaintContext; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; +import java.awt.geom.NoninvertibleTransformException; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; + +public class PatternPaint implements Paint { + + BufferedImage source; + + AffineTransform xform; + + public PatternPaint(BufferedImage source, AffineTransform xform) { + this.source = source; + this.xform = xform; + } + + @Override + public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds, AffineTransform xform, RenderingHints hints) { + try { + return new PatternPaintContext(source, deviceBounds, xform, this.xform); + } catch (NoninvertibleTransformException e) { + throw new RuntimeException(e); + } + } + + public int getTransparency() { + return source.getColorModel().getTransparency(); + } + +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/PatternPaintContext.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/PatternPaintContext.java new file mode 100644 index 0000000..39a74c5 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/PatternPaintContext.java @@ -0,0 +1,63 @@ +package org.xbib.graphics.svg; + +import java.awt.PaintContext; +import java.awt.Rectangle; +import java.awt.geom.AffineTransform; +import java.awt.geom.NoninvertibleTransformException; +import java.awt.geom.Point2D; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.Raster; + +public class PatternPaintContext implements PaintContext { + + BufferedImage source; + + Rectangle deviceBounds; + + AffineTransform xform; + + int sourceWidth; + + int sourceHeight; + + BufferedImage buf; + + public PatternPaintContext(BufferedImage source, Rectangle deviceBounds, AffineTransform userXform, AffineTransform distortXform) throws NoninvertibleTransformException { + this.source = source; + this.deviceBounds = deviceBounds; + xform = distortXform.createInverse(); + xform.concatenate(userXform.createInverse()); + sourceWidth = source.getWidth(); + sourceHeight = source.getHeight(); + } + + @Override + public void dispose() { + } + + @Override + public ColorModel getColorModel() { + return source.getColorModel(); + } + + @Override + public Raster getRaster(int x, int y, int w, int h) { + if (buf == null || buf.getWidth() != w || buf.getHeight() != h) { + buf = new BufferedImage(w, h, source.getType()); + } + Point2D.Float srcPt = new Point2D.Float(), destPt = new Point2D.Float(); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + destPt.setLocation(i + x, j + y); + xform.transform(destPt, srcPt); + int ii = ((int) srcPt.x) % sourceWidth; + if (ii < 0) ii += sourceWidth; + int jj = ((int) srcPt.y) % sourceHeight; + if (jj < 0) jj += sourceHeight; + buf.setRGB(i, j, source.getRGB(ii, jj)); + } + } + return buf.getData(); + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/PatternSVG.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/PatternSVG.java index 58c00a2..68d2ba7 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/PatternSVG.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/PatternSVG.java @@ -1,41 +1,8 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 3:25 AM - */ package org.xbib.graphics.svg; -import org.xbib.graphics.svg.pattern.PatternPaint; +import org.xbib.graphics.svg.element.FillElement; +import org.xbib.graphics.svg.element.RenderableElement; +import org.xbib.graphics.svg.element.SVGElement; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Graphics2D; @@ -48,30 +15,31 @@ import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URI; -import java.util.logging.Level; -import java.util.logging.Logger; -/** - * @author Mark McKay - * @author Mark McKay - */ public class PatternSVG extends FillElement { + public static final String TAG_NAME = "pattern"; public static final int GU_OBJECT_BOUNDING_BOX = 0; + public static final int GU_USER_SPACE_ON_USE = 1; + int gradientUnits = GU_OBJECT_BOUNDING_BOX; + float x; + float y; + float width; + float height; + AffineTransform patternXform = new AffineTransform(); + Rectangle2D.Float viewBox; + Paint texPaint; - /** - * Creates a new instance of Gradient - */ public PatternSVG() { } @@ -80,10 +48,6 @@ public class PatternSVG extends FillElement { return TAG_NAME; } - /** - * Called after the start element but before the end element to indicate - * each child tag that has been processed - */ @Override public void loaderAddChild(SVGLoaderHelper helper, SVGElement child) throws SVGElementException { super.loaderAddChild(helper, child); @@ -92,36 +56,23 @@ public class PatternSVG extends FillElement { @Override protected void build() throws SVGException, IOException { super.build(); - StyleAttribute sty = new StyleAttribute(); - - //Load style string String href = null; if (getPres(sty.setName("xlink:href"))) { href = sty.getStringValue(); } - //String href = attrs.getValue("xlink:href"); - //If we have a link to another pattern, initialize ourselves with it's values if (href != null) { -//System.err.println("Gradient.loaderStartElement() href '" + href + "'"); - try { - URI src = getXMLBase().resolve(href); - PatternSVG patSrc = (PatternSVG) diagram.getUniverse().getElement(src); - - gradientUnits = patSrc.gradientUnits; - x = patSrc.x; - y = patSrc.y; - width = patSrc.width; - height = patSrc.height; - viewBox = patSrc.viewBox; - patternXform.setTransform(patSrc.patternXform); - children.addAll(patSrc.children); - } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not parse xlink:href", e); - } + URI src = getXMLBase().resolve(href); + PatternSVG patSrc = (PatternSVG) diagram.getUniverse().getElement(src); + gradientUnits = patSrc.gradientUnits; + x = patSrc.x; + y = patSrc.y; + width = patSrc.width; + height = patSrc.height; + viewBox = patSrc.viewBox; + patternXform.setTransform(patSrc.patternXform); + children.addAll(patSrc.children); } - String gradientUnits = ""; if (getPres(sty.setName("gradientUnits"))) { gradientUnits = sty.getStringValue().toLowerCase(); @@ -131,106 +82,72 @@ public class PatternSVG extends FillElement { } else { this.gradientUnits = GU_OBJECT_BOUNDING_BOX; } - String patternTransform = ""; if (getPres(sty.setName("patternTransform"))) { patternTransform = sty.getStringValue(); } patternXform = parseTransform(patternTransform); - - if (getPres(sty.setName("x"))) { x = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("y"))) { y = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("width"))) { width = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("height"))) { height = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("viewBox"))) { float[] dim = sty.getFloatList(); viewBox = new Rectangle2D.Float(dim[0], dim[1], dim[2], dim[3]); } - preparePattern(); } - /* - public void loaderEndElement(SVGLoaderHelper helper) - { - build(); - } - */ protected void preparePattern() throws SVGException, IOException { - //For now, treat all fills as UserSpaceOnUse. Otherwise, we'll need - // a different paint for every object. int tileWidth = (int) width; int tileHeight = (int) height; - float stretchX = 1f, stretchY = 1f; if (!patternXform.isIdentity()) { - //Scale our source tile so that we can have nice sampling from it. float xlateX = (float) patternXform.getTranslateX(); float xlateY = (float) patternXform.getTranslateY(); - Point2D.Float pt = new Point2D.Float(), pt2 = new Point2D.Float(); - pt.setLocation(width, 0); patternXform.transform(pt, pt2); pt2.x -= xlateX; pt2.y -= xlateY; stretchX = (float) Math.sqrt(pt2.x * pt2.x + pt2.y * pt2.y) * 1.5f / width; - pt.setLocation(height, 0); patternXform.transform(pt, pt2); pt2.x -= xlateX; pt2.y -= xlateY; stretchY = (float) Math.sqrt(pt2.x * pt2.x + pt2.y * pt2.y) * 1.5f / height; - tileWidth *= stretchX; tileHeight *= stretchY; } - if (tileWidth == 0 || tileHeight == 0) { - //Use defaults if tile has degenerate size return; } - BufferedImage buf = new BufferedImage(tileWidth, tileHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D g = buf.createGraphics(); g.setClip(0, 0, tileWidth, tileHeight); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - for (SVGElement ele : children) { if (ele instanceof RenderableElement) { AffineTransform xform = new AffineTransform(); - if (viewBox == null) { xform.translate(-x, -y); } else { xform.scale(tileWidth / viewBox.width, tileHeight / viewBox.height); xform.translate(-viewBox.x, -viewBox.y); } - g.setTransform(xform); ((RenderableElement) ele).render(g); } } - g.dispose(); - -//try { -//javax.imageio.ImageIO.write(buf, "png", new java.io.File("c:\\tmp\\texPaint.png")); -//} catch (Exception e ) {} - if (patternXform.isIdentity()) { texPaint = new TexturePaint(buf, new Rectangle2D.Float(x, y, width, height)); } else { @@ -244,16 +161,8 @@ public class PatternSVG extends FillElement { return texPaint; } - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @return - true if this node has changed state as a result of the time - * update - */ @Override public boolean updateTime(double curTime) throws SVGException { - //Patterns don't change state return false; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Polygon.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Polygon.java index 05a5135..8c208d1 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Polygon.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Polygon.java @@ -1,40 +1,6 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 5:25 PM - */ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.ShapeElement; import org.xbib.graphics.svg.xml.StyleAttribute; import org.xbib.graphics.svg.xml.XMLParseUtil; @@ -44,11 +10,8 @@ import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.io.IOException; -/** - * @author Mark McKay - * @author Mark McKay - */ public class Polygon extends ShapeElement { + public static final String TAG_NAME = "polygon"; int fillRule = GeneralPath.WIND_NON_ZERO; @@ -94,7 +57,7 @@ public class Polygon extends ShapeElement { } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { beginLayer(g); renderShape(g, path); finishLayer(g); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Polyline.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Polyline.java index 6021399..5aba970 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Polyline.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Polyline.java @@ -1,5 +1,6 @@ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.ShapeElement; import org.xbib.graphics.svg.xml.StyleAttribute; import org.xbib.graphics.svg.xml.XMLParseUtil; @@ -49,7 +50,7 @@ public class Polyline extends ShapeElement { } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { beginLayer(g); renderShape(g, path); finishLayer(g); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Rect.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Rect.java index 6bd291c..000e780 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Rect.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Rect.java @@ -1,5 +1,6 @@ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.ShapeElement; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Graphics2D; @@ -69,7 +70,7 @@ public class Rect extends ShapeElement { } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { beginLayer(g); renderShape(g, rect); finishLayer(g); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGCache.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGCache.java deleted file mode 100644 index 6791e09..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGCache.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on April 2, 2005, 1:54 AM - */ - -package org.xbib.graphics.svg; - -/** - * A convienience singleton for allowing all classes to access a common SVG universe. - * - * @author kitfox - */ -public class SVGCache { - private static final SVGUniverse svgUniverse = new SVGUniverse(); - - /** - * Creates a new instance of SVGUniverseSingleton - */ - private SVGCache() { - } - - public static SVGUniverse getSVGUniverse() { - return svgUniverse; - } - -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGConst.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGConst.java deleted file mode 100644 index 13b3d0b..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGConst.java +++ /dev/null @@ -1,12 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package org.xbib.graphics.svg; - -/** - * @author kitfox - */ -public interface SVGConst { - String SVG_LOGGER = "svgSalamandeLogger"; -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGDiagram.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGDiagram.java index f3558bf..1f35d97 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGDiagram.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGDiagram.java @@ -1,5 +1,7 @@ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.SVGElement; + import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.geom.AffineTransform; @@ -16,6 +18,8 @@ import java.util.logging.Logger; public class SVGDiagram { + private static final Logger logger = Logger.getLogger(SVGDiagram.class.getName()); + final Map idMap = new HashMap<>(); SVGRoot root; @@ -132,7 +136,7 @@ public class SVGDiagram { try { root.build(); } catch (SVGException | IOException ex) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, "Could not build document", ex); + logger.log(Level.SEVERE, "Could not build document", ex); } } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGElementException.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGElementException.java index bdfc9e7..b0f161e 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGElementException.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGElementException.java @@ -1,65 +1,12 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on May 12, 2005, 11:32 PM - */ - package org.xbib.graphics.svg; -/** - * @author kitfox - */ +import org.xbib.graphics.svg.element.SVGElement; + +@SuppressWarnings("serial") public class SVGElementException extends SVGException { - public static final long serialVersionUID = 0; private final SVGElement element; - /** - * Creates a new instance of SVGException without detail message. - * - * @param element - */ - public SVGElementException(SVGElement element) { - this(element, null, null); - } - - - /** - * Constructs an instance of SVGException with the specified detail message. - * - * @param element - * @param msg the detail message. - */ public SVGElementException(SVGElement element, String msg) { this(element, msg, null); } @@ -69,10 +16,6 @@ public class SVGElementException extends SVGException { this.element = element; } - public SVGElementException(SVGElement element, Throwable cause) { - this(element, null, cause); - } - public SVGElement getElement() { return element; } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/app/beans/SVGIcon.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGIcon.java similarity index 97% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/app/beans/SVGIcon.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/SVGIcon.java index 199dfe9..1f8cb14 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/app/beans/SVGIcon.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGIcon.java @@ -1,10 +1,6 @@ -package org.xbib.graphics.svg.app.beans; +package org.xbib.graphics.svg; import javax.swing.ImageIcon; -import org.xbib.graphics.svg.SVGCache; -import org.xbib.graphics.svg.SVGDiagram; -import org.xbib.graphics.svg.SVGException; -import org.xbib.graphics.svg.SVGUniverse; import java.awt.Component; import java.awt.Dimension; @@ -28,7 +24,7 @@ public class SVGIcon extends ImageIcon { private final PropertyChangeSupport changes = new PropertyChangeSupport(this); - SVGUniverse svgUniverse = SVGCache.getSVGUniverse(); + SVGUniverse svgUniverse = new SVGUniverse(); public static final int INTERP_NEAREST_NEIGHBOR = 0; diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGLoader.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGLoader.java index 82d3c40..a07d671 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGLoader.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGLoader.java @@ -1,5 +1,23 @@ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.Circle; +import org.xbib.graphics.svg.element.ClipPath; +import org.xbib.graphics.svg.element.Defs; +import org.xbib.graphics.svg.element.Desc; +import org.xbib.graphics.svg.element.Ellipse; +import org.xbib.graphics.svg.element.Filter; +import org.xbib.graphics.svg.element.Font; +import org.xbib.graphics.svg.element.Group; +import org.xbib.graphics.svg.element.Line; +import org.xbib.graphics.svg.element.Mask; +import org.xbib.graphics.svg.element.SVGElement; +import org.xbib.graphics.svg.element.ShapeElement; +import org.xbib.graphics.svg.element.Style; +import org.xbib.graphics.svg.element.filtereffects.GaussianBlur; +import org.xbib.graphics.svg.element.glyph.Glyph; +import org.xbib.graphics.svg.element.glyph.MissingGlyph; +import org.xbib.graphics.svg.element.gradient.LinearGradient; +import org.xbib.graphics.svg.element.gradient.RadialGradient; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; @@ -15,6 +33,8 @@ import java.util.logging.Logger; public class SVGLoader extends DefaultHandler { + private static final Logger logger = Logger.getLogger(SVGLoader.class.getName()); + final Map> nodeClasses = new HashMap<>(); final LinkedList buildStack = new LinkedList<>(); @@ -38,7 +58,7 @@ public class SVGLoader extends DefaultHandler { nodeClasses.put("desc", Desc.class); nodeClasses.put("ellipse", Ellipse.class); nodeClasses.put("filter", Filter.class); - nodeClasses.put(FeGaussianBlur.TAG_NAME, FeGaussianBlur.class); + nodeClasses.put(GaussianBlur.TAG_NAME, GaussianBlur.class); nodeClasses.put("font", Font.class); nodeClasses.put("font-face", FontFace.class); nodeClasses.put("g", Group.class); @@ -98,8 +118,7 @@ public class SVGLoader extends DefaultHandler { svgEle.loaderStartElement(helper, attrs, parent); buildStack.addLast(svgEle); } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not load", e); + logger.log(Level.SEVERE, "Could not load", e); throw new SAXException(e); } @@ -130,7 +149,7 @@ public class SVGLoader extends DefaultHandler { diagram.setRoot((SVGRoot) svgEle); } } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, "Could not parse", e); + logger.log(Level.WARNING, "Could not parse", e); throw new SAXException(e); } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGParseException.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGParseException.java index 13f4d8b..12df3dd 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGParseException.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGParseException.java @@ -1,59 +1,11 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on May 12, 2005, 11:32 PM - */ - package org.xbib.graphics.svg; -/** - * @author kitfox - */ -public class SVGParseException extends java.lang.Exception { - public static final long serialVersionUID = 0; +@SuppressWarnings("serial") +public class SVGParseException extends Exception { - /** - * Creates a new instance of SVGException without detail message. - */ public SVGParseException() { } - - /** - * Constructs an instance of SVGException with the specified detail message. - * - * @param msg the detail message. - */ public SVGParseException(String msg) { super(msg); } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGRoot.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGRoot.java index 7cfc6be..329d815 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGRoot.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGRoot.java @@ -1,5 +1,9 @@ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.Defs; +import org.xbib.graphics.svg.element.Group; +import org.xbib.graphics.svg.element.SVGElement; +import org.xbib.graphics.svg.element.Style; import org.xbib.graphics.svg.xml.NumberWithUnits; import org.xbib.graphics.svg.xml.StyleAttribute; import org.xbib.graphics.svg.xml.StyleSheet; @@ -194,7 +198,7 @@ public class SVGRoot extends Group { } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { prepareViewport(); Rectangle targetViewport; Rectangle deviceViewport = diagram.getDeviceViewport(); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGUniverse.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGUniverse.java index eaf18e7..9b7f5ae 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGUniverse.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGUniverse.java @@ -4,7 +4,9 @@ import javax.imageio.ImageIO; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; -import org.xbib.graphics.svg.app.beans.SVGIcon; + +import org.xbib.graphics.svg.element.Font; +import org.xbib.graphics.svg.element.SVGElement; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; @@ -26,19 +28,22 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; import java.util.HashMap; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import java.util.zip.GZIPInputStream; public class SVGUniverse { - final HashMap loadedDocs = new HashMap(); + private static final Logger logger = Logger.getLogger(SVGUniverse.class.getName()); - final HashMap loadedFonts = new HashMap(); + final Map loadedDocs = new HashMap<>(); - final HashMap> loadedImages = new HashMap>(); + final Map loadedFonts = new HashMap<>(); - public static final String INPUTSTREAM_SCHEME = "svgSalamander"; + final Map> loadedImages = new HashMap<>(); + + public static final String INPUTSTREAM_SCHEME = "svgXbib"; protected double curTime = 0.0; @@ -70,7 +75,7 @@ public class SVGUniverse { } } - void registerFont(Font font) { + public void registerFont(Font font) { loadedFonts.put(font.getFontFace().getFontFamily(), font); } @@ -110,8 +115,7 @@ public class SVGUniverse { loadedImages.put(url, ref); return url; } catch (IOException ex) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not decode inline image", ex); + logger.log(Level.SEVERE, "Could not decode inline image", ex); } } return null; @@ -121,8 +125,7 @@ public class SVGUniverse { registerImage(url); return url; } catch (MalformedURLException ex) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Bad url", ex); + logger.log(Level.SEVERE, "Bad url", ex); } return null; } @@ -149,8 +152,7 @@ public class SVGUniverse { } loadedImages.put(imageURL, ref); } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not load image: " + imageURL, e); + logger.log(Level.SEVERE, "Could not load image: " + imageURL, e); } } @@ -177,8 +179,7 @@ public class SVGUniverse { URI uri = new URI(path.toString()); return getElement(uri, true); } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not parse url " + path, e); + logger.log(Level.SEVERE, "Could not parse url " + path, e); } return null; } @@ -216,8 +217,7 @@ public class SVGUniverse { String fragment = path.getFragment(); return fragment == null ? dia.getRoot() : dia.getElement(fragment); } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not parse path " + path, e); + logger.log(Level.SEVERE, "Could not parse path " + path, e); return null; } } @@ -245,8 +245,7 @@ public class SVGUniverse { dia = loadedDocs.get(xmlBase); return dia; } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not parse", e); + logger.log(Level.SEVERE, "Could not parse", e); } return null; } @@ -259,32 +258,10 @@ public class SVGUniverse { if ((b1 << 8 | b0) == GZIPInputStream.GZIP_MAGIC) { return new GZIPInputStream(bin); } else { - //Plain text return bin; } } - public URI loadSVG(URL docRoot) { - return loadSVG(docRoot, false); - } - - public URI loadSVG(URL docRoot, boolean forceLoad) { - try { - URI uri = new URI(docRoot.toString()); - if (loadedDocs.containsKey(uri) && !forceLoad) { - return uri; - } - InputStream is = docRoot.openStream(); - URI result = loadSVG(uri, new InputSource(createDocumentInputStream(is))); - is.close(); - return result; - } catch (URISyntaxException | IOException ex) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not parse", ex); - } - return null; - } - public URI loadSVG(InputStream is, String name) throws IOException { return loadSVG(is, name, false); } @@ -301,6 +278,28 @@ public class SVGUniverse { return loadSVG(uri, new InputSource(createDocumentInputStream(is))); } + public URI loadSVG(URL docRoot) { + return loadSVG(docRoot, false); + } + + public URI loadSVG(URL docRoot, boolean forceLoad) { + try { + URI uri = new URI(docRoot.toString()); + if (loadedDocs.containsKey(uri) && !forceLoad) { + return uri; + } + InputStream is = docRoot.openStream(); + URI result = loadSVG(uri, new InputSource(createDocumentInputStream(is))); + is.close(); + return result; + } catch (URISyntaxException | IOException ex) { + logger.log(Level.SEVERE, "Could not parse", ex); + } + return null; + } + + + public URI loadSVG(Reader reader, String name) { return loadSVG(reader, name, false); } @@ -326,8 +325,7 @@ public class SVGUniverse { try { return new URI(INPUTSTREAM_SCHEME, name, null); } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not parse", e); + logger.log(Level.SEVERE, "Could not parse", e); return null; } } @@ -357,13 +355,11 @@ public class SVGUniverse { handler.getLoadedDiagram().updateTime(curTime); return xmlBase; } catch (SAXParseException sex) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Error processing " + xmlBase, sex); + logger.log(Level.SEVERE, "Error processing " + xmlBase, sex); loadedDocs.remove(xmlBase); return null; } catch (Throwable e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not load SVG " + xmlBase, e); + logger.log(Level.SEVERE, "Could not load SVG " + xmlBase, e); } return null; } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Stop.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Stop.java index 1f660b9..748e6de 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Stop.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Stop.java @@ -1,59 +1,21 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 1:56 AM - */ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.SVGElement; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Color; import java.io.IOException; -/** - * @author Mark McKay - * @author Mark McKay - */ public class Stop extends SVGElement { public static final String TAG_NAME = "stop"; - float offset = 0f; - float opacity = 1f; - Color color = Color.black; - /** - * Creates a new instance of Stop - */ + public float offset = 0f; + + public float opacity = 1f; + + public Color color = Color.black; + public Stop() { } @@ -65,9 +27,7 @@ public class Stop extends SVGElement { @Override protected void build() throws SVGException, IOException { super.build(); - StyleAttribute sty = new StyleAttribute(); - if (getPres(sty.setName("offset"))) { offset = sty.getFloatValue(); String units = sty.getUnits(); @@ -81,31 +41,18 @@ public class Stop extends SVGElement { offset = 0; } } - if (getStyle(sty.setName("stop-color"))) { color = sty.getColorValue(); } - if (getStyle(sty.setName("stop-opacity"))) { opacity = sty.getRatioValue(); } } - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @return - true if this node has changed state as a result of the time - * update - */ @Override public boolean updateTime(double curTime) throws SVGException { -// if (trackManager.getNumTracks() == 0) return false; - - //Get current values for parameters StyleAttribute sty = new StyleAttribute(); boolean shapeChange = false; - if (getPres(sty.setName("offset"))) { float newVal = sty.getFloatValue(); if (newVal != offset) { @@ -113,7 +60,6 @@ public class Stop extends SVGElement { shapeChange = true; } } - if (getStyle(sty.setName("stop-color"))) { Color newVal = sty.getColorValue(); if (newVal != color) { @@ -121,7 +67,6 @@ public class Stop extends SVGElement { shapeChange = true; } } - if (getStyle(sty.setName("stop-opacity"))) { float newVal = sty.getFloatValue(); if (newVal != opacity) { @@ -129,7 +74,6 @@ public class Stop extends SVGElement { shapeChange = true; } } - return shapeChange; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Symbol.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Symbol.java index 0630c02..2c13e4b 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Symbol.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Symbol.java @@ -1,5 +1,6 @@ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.Group; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Graphics2D; @@ -49,7 +50,7 @@ public class Symbol extends Group { } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { AffineTransform oldXform = g.getTransform(); g.transform(viewXform); super.doRender(g); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Title.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Title.java index 3ccaa2b..2e7e9a8 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Title.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Title.java @@ -1,54 +1,13 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on September 19, 2004, 1:56 AM - */ package org.xbib.graphics.svg; -/** - * Holds title textual information within tree - * - * @author Mark McKay - * @author Mark McKay - */ +import org.xbib.graphics.svg.element.SVGElement; + public class Title extends SVGElement { + public static final String TAG_NAME = "title"; - StringBuffer text = new StringBuffer(); + StringBuilder text = new StringBuilder(); - /** - * Creates a new instance of Stop - */ public Title() { } @@ -57,9 +16,6 @@ public class Title extends SVGElement { return TAG_NAME; } - /** - * Called during load process to add text scanned within a tag - */ @Override public void loaderAddText(SVGLoaderHelper helper, String text) { this.text.append(text); @@ -69,16 +25,8 @@ public class Title extends SVGElement { return text.toString(); } - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @return - true if this node has changed state as a result of the time - * update - */ @Override public boolean updateTime(double curTime) throws SVGException { - //Title does not change return false; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/TransformableElement.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/TransformableElement.java deleted file mode 100644 index 9455488..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/TransformableElement.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 9:00 AM - */ -package org.xbib.graphics.svg; - -import org.xbib.graphics.svg.xml.StyleAttribute; - -import java.awt.Shape; -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; -import java.io.IOException; - -/** - * Maintains bounding box for this element - * - * @author Mark McKay - * @author Mark McKay - */ -abstract public class TransformableElement extends SVGElement { - AffineTransform xform = null; - - /** - * Creates a new instance of BoundedElement - */ - public TransformableElement() { - } - - public TransformableElement(String id, SVGElement parent) { - super(id, parent); - } - - /** - * Fetches a copy of the cached AffineTransform. Note that this value will - * only be valid after the node has been updated. - * - * @return - */ - public AffineTransform getXForm() { - return xform == null ? null : new AffineTransform(xform); - } - /* - public void loaderStartElement(SVGLoaderHelper helper, Attributes attrs, SVGElement parent) - { - //Load style string - super.loaderStartElement(helper, attrs, parent); - - String transform = attrs.getValue("transform"); - if (transform != null) - { - xform = parseTransform(transform); - } - } - */ - - @Override - protected void build() throws SVGException, IOException { - super.build(); - - StyleAttribute sty = new StyleAttribute(); - - if (getPres(sty.setName("transform"))) { - xform = parseTransform(sty.getStringValue()); - } - } - - protected Shape shapeToParent(Shape shape) { - if (xform == null) { - return shape; - } - return xform.createTransformedShape(shape); - } - - protected Rectangle2D boundsToParent(Rectangle2D rect) { - if (xform == null || rect == null) { - return rect; - } - return xform.createTransformedShape(rect).getBounds2D(); - } - - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @return - true if this node has changed state as a result of the time - * update - */ - @Override - public boolean updateTime(double curTime) throws SVGException, IOException { - StyleAttribute sty = new StyleAttribute(); - - if (getPres(sty.setName("transform"))) { - AffineTransform newXform = parseTransform(sty.getStringValue()); - if (!newXform.equals(xform)) { - xform = newXform; - return true; - } - } - - return false; - } -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Tspan.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Tspan.java index 1aec7f1..08e61bd 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Tspan.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Tspan.java @@ -1,5 +1,9 @@ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.Font; +import org.xbib.graphics.svg.element.SVGElement; +import org.xbib.graphics.svg.element.ShapeElement; +import org.xbib.graphics.svg.element.glyph.MissingGlyph; import org.xbib.graphics.svg.util.FontUtil; import org.xbib.graphics.svg.xml.StyleAttribute; @@ -200,7 +204,7 @@ public class Tspan extends ShapeElement { } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { beginLayer(g); for (TextSegment segment : segments) { if (segment.textPath != null) { diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Use.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/Use.java index eb7adb4..e862c61 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Use.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/Use.java @@ -1,5 +1,8 @@ package org.xbib.graphics.svg; +import org.xbib.graphics.svg.element.RenderableElement; +import org.xbib.graphics.svg.element.SVGElement; +import org.xbib.graphics.svg.element.ShapeElement; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Graphics2D; @@ -57,7 +60,7 @@ public class Use extends ShapeElement { } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { beginLayer(g); AffineTransform oldXform = g.getTransform(); g.transform(refXform); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/composite/AdobeComposite.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/composite/AdobeComposite.java deleted file mode 100644 index 34a090e..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/composite/AdobeComposite.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on April 1, 2004, 6:40 AM - */ - -package org.xbib.graphics.svg.composite; - -import org.xbib.graphics.svg.SVGConst; - -import java.awt.Composite; -import java.awt.CompositeContext; -import java.awt.RenderingHints; -import java.awt.image.ColorModel; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author Mark McKay - * @author Mark McKay - */ -public class AdobeComposite implements Composite { - public static final int CT_NORMAL = 0; - public static final int CT_MULTIPLY = 1; - public static final int CT_LAST = 2; - - final int compositeType; - final float extraAlpha; - - /** - * Creates a new instance of AdobeComposite - * - * @param compositeType - * @param extraAlpha - */ - public AdobeComposite(int compositeType, float extraAlpha) { - this.compositeType = compositeType; - this.extraAlpha = extraAlpha; - - if (compositeType < 0 || compositeType >= CT_LAST) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, "Invalid composite type"); - } - - if (extraAlpha < 0f || extraAlpha > 1f) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, "Invalid alpha"); - } - } - - public int getCompositeType() { - return compositeType; - } - - public CompositeContext createContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints) { - return new AdobeCompositeContext(compositeType, extraAlpha); - } - -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/composite/AdobeCompositeContext.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/composite/AdobeCompositeContext.java deleted file mode 100644 index ba7dc84..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/composite/AdobeCompositeContext.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on April 1, 2004, 6:41 AM - */ - -package org.xbib.graphics.svg.composite; - -import java.awt.CompositeContext; -import java.awt.image.Raster; -import java.awt.image.WritableRaster; - -/** - * @author Mark McKay - * @author Mark McKay - */ -public class AdobeCompositeContext implements CompositeContext { - final int compositeType; - final float extraAlpha; - - float[] rgba_src = new float[4]; - float[] rgba_dstIn = new float[4]; - float[] rgba_dstOut = new float[4]; - - /** - * Creates a new instance of AdobeCompositeContext - * - * @param compositeType - * @param extraAlpha - */ - public AdobeCompositeContext(int compositeType, float extraAlpha) { - this.compositeType = compositeType; - this.extraAlpha = extraAlpha; - - rgba_dstOut[3] = 1f; - } - - public void compose(Raster src, Raster dstIn, WritableRaster dstOut) { - int width = src.getWidth(); - int height = src.getHeight(); - - for (int j = 0; j < height; j++) { - for (int i = 0; i < width; i++) { - src.getPixel(i, j, rgba_src); - dstIn.getPixel(i, j, rgba_dstIn); - - //Ignore transparent pixels - if (rgba_src[3] == 0) { -// dstOut.setPixel(i, j, rgba_dstIn); - continue; - } - - float alpha = rgba_src[3]; - - switch (compositeType) { - default: - case AdobeComposite.CT_NORMAL: - rgba_dstOut[0] = rgba_src[0] * alpha + rgba_dstIn[0] * (1f - alpha); - rgba_dstOut[1] = rgba_src[1] * alpha + rgba_dstIn[1] * (1f - alpha); - rgba_dstOut[2] = rgba_src[2] * alpha + rgba_dstIn[2] * (1f - alpha); - break; - case AdobeComposite.CT_MULTIPLY: - rgba_dstOut[0] = rgba_src[0] * rgba_dstIn[0] * alpha + rgba_dstIn[0] * (1f - alpha); - rgba_dstOut[1] = rgba_src[1] * rgba_dstIn[1] * alpha + rgba_dstIn[1] * (1f - alpha); - rgba_dstOut[2] = rgba_src[2] * rgba_dstIn[2] * alpha + rgba_dstIn[2] * (1f - alpha); - break; - } - } - } - } - - public void dispose() { - } - -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Circle.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Circle.java similarity index 79% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/Circle.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/Circle.java index b402935..0ec7f32 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Circle.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Circle.java @@ -1,5 +1,6 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element; +import org.xbib.graphics.svg.SVGException; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Graphics2D; @@ -11,14 +12,15 @@ import java.io.IOException; public class Circle extends ShapeElement { public static final String TAG_NAME = "circle"; + float cx = 0f; + float cy = 0f; + float r = 0f; + Ellipse2D.Float circle = new Ellipse2D.Float(); - /** - * Creates a new instance of Rect - */ public Circle() { } @@ -30,26 +32,21 @@ public class Circle extends ShapeElement { @Override protected void build() throws SVGException, IOException { super.build(); - StyleAttribute sty = new StyleAttribute(); - if (getPres(sty.setName("cx"))) { cx = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("cy"))) { cy = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("r"))) { r = sty.getFloatValueWithUnits(); } - circle.setFrame(cx - r, cy - r, r * 2f, r * 2f); } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { beginLayer(g); renderShape(g, circle); finishLayer(g); @@ -65,22 +62,11 @@ public class Circle extends ShapeElement { return boundsToParent(includeStrokeInBounds(circle.getBounds2D())); } - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @return - true if this node has changed state as a result of the time - * update - */ @Override public boolean updateTime(double curTime) throws SVGException, IOException { -// if (trackManager.getNumTracks() == 0) return false; boolean changeState = super.updateTime(curTime); - - //Get current values for parameters StyleAttribute sty = new StyleAttribute(); boolean shapeChange = false; - if (getPres(sty.setName("cx"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != cx) { @@ -88,7 +74,6 @@ public class Circle extends ShapeElement { shapeChange = true; } } - if (getPres(sty.setName("cy"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != cy) { @@ -96,7 +81,6 @@ public class Circle extends ShapeElement { shapeChange = true; } } - if (getPres(sty.setName("r"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != r) { @@ -104,13 +88,9 @@ public class Circle extends ShapeElement { shapeChange = true; } } - if (shapeChange) { build(); -// circle.setFrame(cx - r, cy - r, r * 2f, r * 2f); -// return true; } - return changeState || shapeChange; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/element/ClipPath.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/ClipPath.java new file mode 100644 index 0000000..035dd30 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/ClipPath.java @@ -0,0 +1,89 @@ +package org.xbib.graphics.svg.element; + +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.xml.StyleAttribute; + +import java.awt.Shape; +import java.awt.geom.Area; +import java.io.IOException; + +public class ClipPath extends SVGElement { + + public static final String TAG_NAME = "clippath"; + + public static final int CP_USER_SPACE_ON_USE = 0; + + public static final int CP_OBJECT_BOUNDING_BOX = 1; + + int clipPathUnits = CP_USER_SPACE_ON_USE; + + public ClipPath() { + } + + @Override + public String getTagName() { + return TAG_NAME; + } + + @Override + protected void build() throws SVGException, IOException { + super.build(); + StyleAttribute sty = new StyleAttribute(); + clipPathUnits = (getPres(sty.setName("clipPathUnits")) + && sty.getStringValue().equals("objectBoundingBox")) + ? CP_OBJECT_BOUNDING_BOX + : CP_USER_SPACE_ON_USE; + } + + public int getClipPathUnits() { + return clipPathUnits; + } + + public Shape getClipPathShape() { + if (children.isEmpty()) { + return null; + } + if (children.size() == 1) { + return ((ShapeElement) children.get(0)).getShape(); + } + Area clipArea = null; + for (SVGElement svgElement : children) { + ShapeElement se = (ShapeElement) svgElement; + if (clipArea == null) { + Shape shape = se.getShape(); + if (shape != null) { + clipArea = new Area(se.getShape()); + } + continue; + } + Shape shape = se.getShape(); + if (shape != null) { + clipArea.intersect(new Area(shape)); + } + } + return clipArea; + } + + @Override + public boolean updateTime(double curTime) throws SVGException, IOException { + StyleAttribute sty = new StyleAttribute(); + boolean shapeChange = false; + if (getPres(sty.setName("clipPathUnits"))) { + String newUnitsStrn = sty.getStringValue(); + int newUnits = newUnitsStrn.equals("objectBoundingBox") + ? CP_OBJECT_BOUNDING_BOX + : CP_USER_SPACE_ON_USE; + if (newUnits != clipPathUnits) { + clipPathUnits = newUnits; + shapeChange = true; + } + } + if (shapeChange) { + build(); + } + for (SVGElement ele : children) { + ele.updateTime(curTime); + } + return shapeChange; + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Defs.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Defs.java new file mode 100644 index 0000000..acade91 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Defs.java @@ -0,0 +1,38 @@ +package org.xbib.graphics.svg.element; + +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.xml.StyleSheet; + +import java.io.IOException; + +public class Defs extends TransformableElement { + + public static final String TAG_NAME = "defs"; + + public Defs() { + } + + @Override + public String getTagName() { + return TAG_NAME; + } + + @Override + public boolean updateTime(double curTime) throws SVGException, IOException { + boolean stateChange = false; + for (SVGElement ele : children) { + stateChange = stateChange || ele.updateTime(curTime); + } + return super.updateTime(curTime) || stateChange; + } + + public StyleSheet getStyleSheet() { + for (int i = 0; i < getNumChildren(); ++i) { + SVGElement ele = getChild(i); + if (ele instanceof Style) { + return ((Style) ele).getStyleSheet(); + } + } + return null; + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Desc.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Desc.java new file mode 100644 index 0000000..73d8c45 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Desc.java @@ -0,0 +1,29 @@ +package org.xbib.graphics.svg.element; + +import org.xbib.graphics.svg.SVGLoaderHelper; + +public class Desc extends SVGElement { + + public static final String TAG_NAME = "desc"; + + StringBuilder text = new StringBuilder(); + + @Override + public String getTagName() { + return TAG_NAME; + } + + @Override + public void loaderAddText(SVGLoaderHelper helper, String text) { + this.text.append(text); + } + + public String getText() { + return text.toString(); + } + + @Override + public boolean updateTime(double curTime) { + return false; + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Ellipse.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Ellipse.java similarity index 54% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/Ellipse.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/Ellipse.java index 6659352..c1b3a36 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Ellipse.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Ellipse.java @@ -1,40 +1,6 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 5:25 PM - */ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element; +import org.xbib.graphics.svg.SVGException; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Graphics2D; @@ -43,22 +9,20 @@ import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; import java.io.IOException; -/** - * @author Mark McKay - * @author Mark McKay - */ public class Ellipse extends ShapeElement { public static final String TAG_NAME = "ellipse"; + float cx = 0.0f; + float cy = 0.0f; + float rx = 0.0f; + float ry = 0.0f; + Ellipse2D.Float ellipse = new Ellipse2D.Float(); - /** - * Creates a new instance of Rect - */ public Ellipse() { } @@ -70,30 +34,24 @@ public class Ellipse extends ShapeElement { @Override protected void build() throws SVGException, IOException { super.build(); - StyleAttribute sty = new StyleAttribute(); - if (getPres(sty.setName("cx"))) { cx = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("cy"))) { cy = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("rx"))) { rx = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("ry"))) { ry = sty.getFloatValueWithUnits(); } - ellipse.setFrame(cx - rx, cy - ry, rx * 2f, ry * 2f); } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { beginLayer(g); renderShape(g, ellipse); finishLayer(g); @@ -109,22 +67,11 @@ public class Ellipse extends ShapeElement { return boundsToParent(includeStrokeInBounds(ellipse.getBounds2D())); } - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @return - true if this node has changed state as a result of the time - * update - */ @Override public boolean updateTime(double curTime) throws SVGException, IOException { -// if (trackManager.getNumTracks() == 0) return false; boolean changeState = super.updateTime(curTime); - - //Get current values for parameters StyleAttribute sty = new StyleAttribute(); boolean shapeChange = false; - if (getPres(sty.setName("cx"))) { float newCx = sty.getFloatValueWithUnits(); if (newCx != cx) { @@ -132,7 +79,6 @@ public class Ellipse extends ShapeElement { shapeChange = true; } } - if (getPres(sty.setName("cy"))) { float newCy = sty.getFloatValueWithUnits(); if (newCy != cy) { @@ -140,7 +86,6 @@ public class Ellipse extends ShapeElement { shapeChange = true; } } - if (getPres(sty.setName("rx"))) { float newRx = sty.getFloatValueWithUnits(); if (newRx != rx) { @@ -148,7 +93,6 @@ public class Ellipse extends ShapeElement { shapeChange = true; } } - if (getPres(sty.setName("ry"))) { float newRy = sty.getFloatValueWithUnits(); if (newRy != ry) { @@ -156,13 +100,9 @@ public class Ellipse extends ShapeElement { shapeChange = true; } } - if (shapeChange) { build(); -// ellipse.setFrame(cx - rx, cy - ry, rx * 2f, ry * 2f); -// return true; } - return changeState || shapeChange; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/element/FillElement.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/FillElement.java new file mode 100644 index 0000000..d45df06 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/FillElement.java @@ -0,0 +1,10 @@ +package org.xbib.graphics.svg.element; + +import java.awt.Paint; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; + +public abstract class FillElement extends SVGElement { + + public abstract Paint getPaint(Rectangle2D bounds, AffineTransform xform); +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Filter.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Filter.java similarity index 90% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/Filter.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/Filter.java index 7132c69..6b6b564 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Filter.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Filter.java @@ -1,33 +1,45 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element; +import org.xbib.graphics.svg.element.filtereffects.FilterEffects; +import org.xbib.graphics.svg.SVGElementException; +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.SVGLoaderHelper; import org.xbib.graphics.svg.xml.StyleAttribute; -import java.awt.geom.Point2D; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.ArrayList; +import java.util.List; public class Filter extends SVGElement { public static final String TAG_NAME = "filter"; - public static final int FU_OBJECT_BOUNDING_BOX = 0; - public static final int FU_USER_SPACE_ON_USE = 1; - protected int filterUnits = FU_OBJECT_BOUNDING_BOX; - public static final int PU_OBJECT_BOUNDING_BOX = 0; - public static final int PU_USER_SPACE_ON_USE = 1; - protected int primitiveUnits = PU_OBJECT_BOUNDING_BOX; - float x = 0f; - float y = 0f; - float width = 1f; - float height = 1f; - Point2D filterRes = new Point2D.Double(); - URL href = null; - final ArrayList filterEffects = new ArrayList<>(); - /** - * Creates a new instance of FillElement - */ + public static final int FU_OBJECT_BOUNDING_BOX = 0; + + public static final int FU_USER_SPACE_ON_USE = 1; + + public int filterUnits = FU_OBJECT_BOUNDING_BOX; + + public static final int PU_OBJECT_BOUNDING_BOX = 0; + + public static final int PU_USER_SPACE_ON_USE = 1; + + protected int primitiveUnits = PU_OBJECT_BOUNDING_BOX; + + float x = 0f; + + float y = 0f; + + float width = 1f; + + float height = 1f; + + URL href = null; + + public final List filterEffects = new ArrayList<>(); + public Filter() { } @@ -36,14 +48,9 @@ public class Filter extends SVGElement { return TAG_NAME; } - /** - * Called after the start element but before the end element to indicate - * each child tag that has been processed - */ @Override public void loaderAddChild(SVGLoaderHelper helper, SVGElement child) throws SVGElementException { super.loaderAddChild(helper, child); - if (child instanceof FilterEffects) { filterEffects.add((FilterEffects) child); } @@ -52,10 +59,8 @@ public class Filter extends SVGElement { @Override protected void build() throws SVGException, IOException { super.build(); - StyleAttribute sty = new StyleAttribute(); String strn; - if (getPres(sty.setName("filterUnits"))) { strn = sty.getStringValue().toLowerCase(); if (strn.equals("userspaceonuse")) { @@ -64,7 +69,6 @@ public class Filter extends SVGElement { filterUnits = FU_OBJECT_BOUNDING_BOX; } } - if (getPres(sty.setName("primitiveUnits"))) { strn = sty.getStringValue().toLowerCase(); if (strn.equals("userspaceonuse")) { @@ -73,23 +77,18 @@ public class Filter extends SVGElement { primitiveUnits = PU_OBJECT_BOUNDING_BOX; } } - if (getPres(sty.setName("x"))) { x = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("y"))) { y = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("width"))) { width = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("height"))) { height = sty.getFloatValueWithUnits(); } - try { if (getPres(sty.setName("xlink:href"))) { URI src = sty.getURIValue(getXMLBase()); @@ -119,12 +118,8 @@ public class Filter extends SVGElement { @Override public boolean updateTime(double curTime) throws SVGException { -// if (trackManager.getNumTracks() == 0) return false; - - //Get current values for parameters StyleAttribute sty = new StyleAttribute(); boolean stateChange = false; - if (getPres(sty.setName("x"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != x) { @@ -132,7 +127,6 @@ public class Filter extends SVGElement { stateChange = true; } } - if (getPres(sty.setName("y"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != y) { @@ -140,7 +134,6 @@ public class Filter extends SVGElement { stateChange = true; } } - if (getPres(sty.setName("width"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != width) { @@ -148,7 +141,6 @@ public class Filter extends SVGElement { stateChange = true; } } - if (getPres(sty.setName("height"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != height) { @@ -156,7 +148,6 @@ public class Filter extends SVGElement { stateChange = true; } } - try { if (getPres(sty.setName("xlink:href"))) { URI src = sty.getURIValue(getXMLBase()); @@ -170,7 +161,6 @@ public class Filter extends SVGElement { } catch (Exception e) { throw new SVGException(e); } - if (getPres(sty.setName("filterUnits"))) { int newVal; String strn = sty.getStringValue().toLowerCase(); @@ -184,7 +174,6 @@ public class Filter extends SVGElement { stateChange = true; } } - if (getPres(sty.setName("primitiveUnits"))) { int newVal; String strn = sty.getStringValue().toLowerCase(); @@ -198,8 +187,6 @@ public class Filter extends SVGElement { stateChange = true; } } - - return stateChange; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Font.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Font.java similarity index 89% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/Font.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/Font.java index 066d26c..c74fb30 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Font.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Font.java @@ -1,5 +1,12 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element; +import org.xbib.graphics.svg.FontFace; +import org.xbib.graphics.svg.element.glyph.Glyph; +import org.xbib.graphics.svg.element.glyph.MissingGlyph; +import org.xbib.graphics.svg.SVGElementException; +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.SVGLoaderHelper; +import org.xbib.graphics.svg.SVGParseException; import org.xbib.graphics.svg.xml.StyleAttribute; import java.io.IOException; diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Group.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Group.java similarity index 91% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/Group.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/Group.java index 6c0e941..b44195a 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Group.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Group.java @@ -1,5 +1,8 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element; +import org.xbib.graphics.svg.SVGElementException; +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.SVGLoaderHelper; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Graphics2D; @@ -18,6 +21,7 @@ public class Group extends ShapeElement { public static final String TAG_NAME = "group"; Rectangle2D boundingBox; + Shape cachedShape; public Group() { @@ -43,7 +47,7 @@ public class Group extends ShapeElement { } @Override - protected void doPick(Point2D point, boolean boundingBox, List> retVec) throws SVGException, IOException { + public void doPick(Point2D point, boolean boundingBox, List> retVec) throws SVGException, IOException { Point2D xPoint = new Point2D.Double(point.getX(), point.getY()); if (xform != null) { try { @@ -61,7 +65,7 @@ public class Group extends ShapeElement { } @Override - protected void doPick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) throws SVGException, IOException { + public void doPick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) throws SVGException, IOException { if (xform != null) { ltw = new AffineTransform(ltw); ltw.concatenate(xform); @@ -75,7 +79,7 @@ public class Group extends ShapeElement { } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { StyleAttribute styleAttrib = new StyleAttribute(); if (getStyle(styleAttrib.setName("display"))) { if (styleAttrib.getStringValue().equals("none")) { diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Line.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Line.java similarity index 54% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/Line.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/Line.java index 51065c2..f84bf2f 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Line.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Line.java @@ -1,40 +1,7 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 5:25 PM - */ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element; +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.element.ShapeElement; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Graphics2D; @@ -43,22 +10,20 @@ import java.awt.geom.Line2D; import java.awt.geom.Rectangle2D; import java.io.IOException; -/** - * @author Mark McKay - * @author Mark McKay - */ public class Line extends ShapeElement { + public static final String TAG_NAME = "line"; float x1 = 0f; + float y1 = 0f; + float x2 = 0f; + float y2 = 0f; + Line2D.Float line; - /** - * Creates a new instance of Rect - */ public Line() { } @@ -70,30 +35,24 @@ public class Line extends ShapeElement { @Override protected void build() throws SVGException, IOException { super.build(); - StyleAttribute sty = new StyleAttribute(); - if (getPres(sty.setName("x1"))) { x1 = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("y1"))) { y1 = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("x2"))) { x2 = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("y2"))) { y2 = sty.getFloatValueWithUnits(); } - line = new Line2D.Float(x1, y1, x2, y2); } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { beginLayer(g); renderShape(g, line); finishLayer(g); @@ -109,22 +68,11 @@ public class Line extends ShapeElement { return boundsToParent(includeStrokeInBounds(line.getBounds2D())); } - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @return - true if this node has changed state as a result of the time - * update - */ @Override public boolean updateTime(double curTime) throws SVGException, IOException { -// if (trackManager.getNumTracks() == 0) return false; boolean changeState = super.updateTime(curTime); - - //Get current values for parameters StyleAttribute sty = new StyleAttribute(); boolean shapeChange = false; - if (getPres(sty.setName("x1"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != x1) { @@ -132,7 +80,6 @@ public class Line extends ShapeElement { shapeChange = true; } } - if (getPres(sty.setName("y1"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != y1) { @@ -140,7 +87,6 @@ public class Line extends ShapeElement { shapeChange = true; } } - if (getPres(sty.setName("x2"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != x2) { @@ -148,7 +94,6 @@ public class Line extends ShapeElement { shapeChange = true; } } - if (getPres(sty.setName("y2"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != y2) { @@ -156,11 +101,9 @@ public class Line extends ShapeElement { shapeChange = true; } } - if (shapeChange) { build(); } - return changeState || shapeChange; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Mask.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Mask.java similarity index 63% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/Mask.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/Mask.java index 49622f5..b3ac8ff 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Mask.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Mask.java @@ -1,37 +1,10 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - */ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element; + +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.element.Group; +import org.xbib.graphics.svg.element.RenderableElement; +import org.xbib.graphics.svg.element.SVGElement; +import org.xbib.graphics.svg.util.PaintUtil; import java.awt.Color; import java.awt.Composite; @@ -50,12 +23,8 @@ import java.awt.image.WritableRaster; import java.io.IOException; import java.util.List; -/** - * Implements the mask element. - * - * @author Jannis Weis - */ public class Mask extends Group { + public static final String TAG_NAME = "mask"; @Override @@ -72,11 +41,11 @@ public class Mask extends Group { } @Override - void pick(Point2D point, boolean boundingBox, List> retVec) { + public void pick(Point2D point, boolean boundingBox, List> retVec) { } @Override - void pick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) { + public void pick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) { } public void pickElement(Point2D point, boolean boundingBox, @@ -85,8 +54,7 @@ public class Mask extends Group { element.doPick(point, true, retVec); } else { Rectangle pickPoint = new Rectangle((int) point.getX(), (int) point.getY(), 1, 1); - BufferedImage img = BufferPainter.paintToBuffer(null, new AffineTransform(), pickPoint, this, Color.BLACK); - // Only try picking the element if the picked point is visible. + BufferedImage img = PaintUtil.paintToBuffer(null, new AffineTransform(), pickPoint, this, Color.BLACK); if (luminanceToAlpha(img.getRGB(0, 0)) > 0) { element.doPick(point, false, retVec); } @@ -95,22 +63,22 @@ public class Mask extends Group { public void pickElement(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec, RenderableElement element) throws SVGException, IOException { - // If at any point the considered picking area becomes empty we break out early. - if (pickArea.isEmpty()) return; + if (pickArea.isEmpty()) { + return; + } if (boundingBox) { element.doPick(pickArea, ltw, true, retVec); } else { - // Clip with the element bounds to avoid creating a larger buffer than needed. Area transformedBounds = new Area(ltw.createTransformedShape(element.getBoundingBox())); transformedBounds.intersect(new Area(pickArea)); - if (transformedBounds.isEmpty()) return; - + if (transformedBounds.isEmpty()) { + return; + } Rectangle pickRect = transformedBounds.getBounds(); - if (pickRect.isEmpty()) return; - - BufferedImage maskArea = BufferPainter.paintToBuffer(null, ltw, pickRect, this, Color.BLACK); - - // Pick if any pixel in the pick area is visible. + if (pickRect.isEmpty()) { + return; + } + BufferedImage maskArea = PaintUtil.paintToBuffer(null, ltw, pickRect, this, Color.BLACK); if (hasVisiblePixel(maskArea)) { element.doPick(pickArea, ltw, false, retVec); } @@ -142,7 +110,6 @@ public class Mask extends Group { } private static double luminanceToAlpha(int r, int g, int b) { - // Assuming 'linearRGB' as the 'color-interpolation' value of the mask. return 0.2125 * r + 0.7154 * g + 0.0721 * b; } @@ -176,7 +143,6 @@ public class Mask extends Group { public void compose(Raster src, Raster dstIn, WritableRaster dstOut) { assert dstIn == dstOut; assert src.getNumBands() == dstIn.getNumBands(); - int x = dstOut.getMinX(); int w = dstOut.getWidth(); int y = dstOut.getMinY(); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/RenderableElement.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/RenderableElement.java similarity index 76% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/RenderableElement.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/RenderableElement.java index 3f19363..0673991 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/RenderableElement.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/RenderableElement.java @@ -1,5 +1,8 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element; +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.util.PaintCache; +import org.xbib.graphics.svg.util.PaintUtil; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Graphics2D; @@ -12,23 +15,23 @@ import java.io.IOException; import java.net.URI; import java.util.List; -abstract public class RenderableElement extends TransformableElement { +public abstract class RenderableElement extends TransformableElement { - AffineTransform cachedXform = null; + protected AffineTransform cachedXform = null; - Mask cachedMask; + public Mask cachedMask; - Filter filter; + public Filter filter; - Shape cachedClip = null; + protected Shape cachedClip = null; public static final int VECTOR_EFFECT_NONE = 0; public static final int VECTOR_EFFECT_NON_SCALING_STROKE = 1; - int vectorEffect; + protected int vectorEffect; - private BufferPainter.Cache bufferCache; + private PaintCache bufferCache; public RenderableElement() { } @@ -37,11 +40,11 @@ abstract public class RenderableElement extends TransformableElement { super(id, parent); } - BufferPainter.Cache getBufferCache() { + public PaintCache getBufferCache() { return bufferCache; } - void setBufferImage(BufferPainter.Cache bufferCache) { + public void setBufferImage(PaintCache bufferCache) { this.bufferCache = bufferCache; } @@ -63,36 +66,12 @@ abstract public class RenderableElement extends TransformableElement { } public void render(Graphics2D g) throws SVGException, IOException { - BufferPainter.paintElement(g, this); + PaintUtil.paintElement(g, this); } - private Mask getMask(StyleAttribute styleAttrib) throws SVGException { - if (getStyle(styleAttrib.setName("mask"), false) - && !"none".equals(styleAttrib.getStringValue())) { - URI uri = styleAttrib.getURIValue(getXMLBase()); - if (uri == null) { - return null; - } - return (Mask) diagram.getUniverse().getElement(uri); - } - return null; - } + public abstract void doRender(Graphics2D g) throws SVGException, IOException; - private Filter getFilter(StyleAttribute styleAttrib) throws SVGException { - if (getStyle(styleAttrib.setName("filter"), false) - && !"none".equals(styleAttrib.getStringValue())) { - URI uri = styleAttrib.getURIValue(getXMLBase()); - if (uri == null) { - return null; - } - return (Filter) diagram.getUniverse().getElement(uri); - } - return null; - } - - abstract protected void doRender(Graphics2D g) throws SVGException, IOException; - - void pick(Point2D point, boolean boundingBox, List> retVec) throws SVGException, IOException { + public void pick(Point2D point, boolean boundingBox, List> retVec) throws SVGException, IOException { if (cachedMask != null) { cachedMask.pickElement(point, boundingBox, retVec, this); } else { @@ -100,9 +79,9 @@ abstract public class RenderableElement extends TransformableElement { } } - protected abstract void doPick(Point2D point, boolean boundingBox, List> retVec) throws SVGException, IOException; + public abstract void doPick(Point2D point, boolean boundingBox, List> retVec) throws SVGException, IOException; - void pick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) throws SVGException, IOException { + public void pick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) throws SVGException, IOException { if (cachedMask != null) { cachedMask.pickElement(pickArea, ltw, boundingBox, retVec, this); } else { @@ -110,9 +89,9 @@ abstract public class RenderableElement extends TransformableElement { } } - protected abstract void doPick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) throws SVGException, IOException; + public abstract void doPick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) throws SVGException, IOException; - abstract public Rectangle2D getBoundingBox() throws SVGException; + public abstract Rectangle2D getBoundingBox() throws SVGException; protected void beginLayer(Graphics2D g) throws SVGException { if (xform != null) { @@ -157,4 +136,28 @@ abstract public class RenderableElement extends TransformableElement { g.setTransform(cachedXform); } } + + private Mask getMask(StyleAttribute styleAttrib) throws SVGException { + if (getStyle(styleAttrib.setName("mask"), false) + && !"none".equals(styleAttrib.getStringValue())) { + URI uri = styleAttrib.getURIValue(getXMLBase()); + if (uri == null) { + return null; + } + return (Mask) diagram.getUniverse().getElement(uri); + } + return null; + } + + private Filter getFilter(StyleAttribute styleAttrib) throws SVGException { + if (getStyle(styleAttrib.setName("filter"), false) + && !"none".equals(styleAttrib.getStringValue())) { + URI uri = styleAttrib.getURIValue(getXMLBase()); + if (uri == null) { + return null; + } + return (Filter) diagram.getUniverse().getElement(uri); + } + return null; + } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGElement.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/SVGElement.java similarity index 95% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/SVGElement.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/SVGElement.java index 9c2dc18..21237e4 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/SVGElement.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/SVGElement.java @@ -1,5 +1,11 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element; +import org.xbib.graphics.svg.SVGDiagram; +import org.xbib.graphics.svg.SVGElementException; +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.SVGLoaderHelper; +import org.xbib.graphics.svg.SVGParseException; +import org.xbib.graphics.svg.SVGRoot; import org.xbib.graphics.svg.pathcmd.BuildHistory; import org.xbib.graphics.svg.pathcmd.PathCommand; import org.xbib.graphics.svg.pathcmd.PathParser; @@ -22,10 +28,12 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -abstract public class SVGElement { +public abstract class SVGElement { public static final String SVG_NS = "http://www.w3.org/2000/svg"; + LinkedList contexts = new LinkedList<>(); + protected SVGElement parent; protected final ArrayList children = new ArrayList<>(); @@ -58,7 +66,7 @@ abstract public class SVGElement { this.parent = parent; } - abstract public String getTagName(); + public abstract String getTagName(); public SVGElement getParent() { return parent; @@ -81,11 +89,9 @@ abstract public class SVGElement { public List getChildren(List retVec) { if (retVec == null) { - retVec = new ArrayList(); + retVec = new ArrayList<>(); } - retVec.addAll(children); - return retVec; } @@ -157,7 +163,7 @@ abstract public class SVGElement { child.setDiagram(diagram); } - protected void setDiagram(SVGDiagram diagram) { + public void setDiagram(SVGDiagram diagram) { this.diagram = diagram; diagram.setElement(id, this); for (SVGElement ele : children) { @@ -207,17 +213,15 @@ abstract public class SVGElement { return id; } - LinkedList contexts = new LinkedList<>(); - - protected void pushParentContext(SVGElement context) { + public void pushParentContext(SVGElement context) { contexts.addLast(context); } - protected SVGElement popParentContext() { + public SVGElement popParentContext() { return contexts.removeLast(); } - protected SVGElement getParentContext() { + public SVGElement getParentContext() { return contexts.isEmpty() ? null : contexts.getLast(); } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/ShapeElement.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/ShapeElement.java similarity index 93% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/ShapeElement.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/ShapeElement.java index a458d91..f42564e 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/ShapeElement.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/ShapeElement.java @@ -1,7 +1,9 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element; -import org.xbib.graphics.svg.Marker.MarkerLayout; -import org.xbib.graphics.svg.Marker.MarkerPos; +import org.xbib.graphics.svg.Marker; +import org.xbib.graphics.svg.MarkerLayout; +import org.xbib.graphics.svg.MarkerPos; +import org.xbib.graphics.svg.SVGException; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.AlphaComposite; @@ -18,7 +20,7 @@ import java.io.IOException; import java.net.URI; import java.util.List; -abstract public class ShapeElement extends RenderableElement { +public abstract class ShapeElement extends RenderableElement { protected float strokeWidthScalar = 1f; @@ -26,36 +28,22 @@ abstract public class ShapeElement extends RenderableElement { } @Override - abstract protected void doRender(Graphics2D g) throws SVGException, IOException; + public abstract void doRender(Graphics2D g) throws SVGException, IOException; @Override - protected void doPick(Point2D point, boolean boundingBox, List> retVec) throws SVGException, IOException { + public void doPick(Point2D point, boolean boundingBox, List> retVec) throws SVGException, IOException { if ((boundingBox ? getBoundingBox() : getShape()).contains(point)) { retVec.add(getPath(null)); } } @Override - protected void doPick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) throws SVGException, IOException { + public void doPick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List> retVec) throws SVGException, IOException { if (ltw.createTransformedShape((boundingBox ? getBoundingBox() : getShape())).intersects(pickArea)) { retVec.add(getPath(null)); } } - private Paint handleCurrentColor(StyleAttribute styleAttrib) throws SVGException { - if (styleAttrib.getStringValue().equals("currentColor")) { - StyleAttribute currentColorAttrib = new StyleAttribute(); - if (getStyle(currentColorAttrib.setName("color"))) { - if (!currentColorAttrib.getStringValue().equals("none")) { - return currentColorAttrib.getColorValue(); - } - } - return null; - } else { - return styleAttrib.getColorValue(); - } - } - protected void renderShape(Graphics2D g, Shape shape) throws SVGException, IOException { StyleAttribute styleAttrib = new StyleAttribute(); if (getStyle(styleAttrib.setName("visibility"))) { @@ -229,7 +217,7 @@ abstract public class ShapeElement extends RenderableElement { layout.layout(shape); List list = layout.getMarkerList(); for (MarkerPos pos : list) { - switch (pos.type) { + switch (pos.getType()) { case Marker.MARKER_START: if (markerStart != null) { markerStart.render(g, pos, strokeWidth); @@ -250,7 +238,7 @@ abstract public class ShapeElement extends RenderableElement { } } - abstract public Shape getShape(); + public abstract Shape getShape(); protected Rectangle2D includeStrokeInBounds(Rectangle2D rect) throws SVGException { StyleAttribute styleAttrib = new StyleAttribute(); @@ -267,4 +255,18 @@ abstract public class ShapeElement extends RenderableElement { rect.getHeight() + strokeWidth); return rect; } + + private Paint handleCurrentColor(StyleAttribute styleAttrib) throws SVGException { + if (styleAttrib.getStringValue().equals("currentColor")) { + StyleAttribute currentColorAttrib = new StyleAttribute(); + if (getStyle(currentColorAttrib.setName("color"))) { + if (!currentColorAttrib.getStringValue().equals("none")) { + return currentColorAttrib.getColorValue(); + } + } + return null; + } else { + return styleAttrib.getColorValue(); + } + } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Style.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Style.java similarity index 86% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/Style.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/Style.java index 233b075..2d84d2e 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Style.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/Style.java @@ -1,5 +1,8 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element; +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.SVGLoaderHelper; +import org.xbib.graphics.svg.element.SVGElement; import org.xbib.graphics.svg.xml.StyleAttribute; import org.xbib.graphics.svg.xml.StyleSheet; diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/element/TransformableElement.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/TransformableElement.java new file mode 100644 index 0000000..82d6b50 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/TransformableElement.java @@ -0,0 +1,57 @@ +package org.xbib.graphics.svg.element; + +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.xml.StyleAttribute; + +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.io.IOException; + +public abstract class TransformableElement extends SVGElement { + + protected AffineTransform xform = null; + + public TransformableElement() { + } + + public TransformableElement(String id, SVGElement parent) { + super(id, parent); + } + + @Override + public boolean updateTime(double curTime) throws SVGException, IOException { + StyleAttribute sty = new StyleAttribute(); + if (getPres(sty.setName("transform"))) { + AffineTransform newXform = parseTransform(sty.getStringValue()); + if (!newXform.equals(xform)) { + xform = newXform; + return true; + } + } + return false; + } + + @Override + protected void build() throws SVGException, IOException { + super.build(); + StyleAttribute sty = new StyleAttribute(); + if (getPres(sty.setName("transform"))) { + xform = parseTransform(sty.getStringValue()); + } + } + + protected Shape shapeToParent(Shape shape) { + if (xform == null) { + return shape; + } + return xform.createTransformedShape(shape); + } + + protected Rectangle2D boundsToParent(Rectangle2D rect) { + if (xform == null || rect == null) { + return rect; + } + return xform.createTransformedShape(rect).getBounds2D(); + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/DistantLight.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/DistantLight.java new file mode 100644 index 0000000..8fadef6 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/DistantLight.java @@ -0,0 +1,61 @@ +package org.xbib.graphics.svg.element.filtereffects; + +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.xml.StyleAttribute; + +import java.io.IOException; + +public class DistantLight extends Light { + + public static final String TAG_NAME = "fedistantlight"; + + float azimuth = 0f; + + float elevation = 0f; + + @Override + public String getTagName() { + return TAG_NAME; + } + + @Override + protected void build() throws SVGException, IOException { + super.build(); + StyleAttribute sty = new StyleAttribute(); + if (getPres(sty.setName("azimuth"))) { + azimuth = sty.getFloatValueWithUnits(); + } + if (getPres(sty.setName("elevation"))) { + elevation = sty.getFloatValueWithUnits(); + } + } + + public float getAzimuth() { + return azimuth; + } + + public float getElevation() { + return elevation; + } + + @Override + public boolean updateTime(double curTime) throws SVGException { + StyleAttribute sty = new StyleAttribute(); + boolean stateChange = false; + if (getPres(sty.setName("azimuth"))) { + float newVal = sty.getFloatValueWithUnits(); + if (newVal != azimuth) { + azimuth = newVal; + stateChange = true; + } + } + if (getPres(sty.setName("elevation"))) { + float newVal = sty.getFloatValueWithUnits(); + if (newVal != elevation) { + elevation = newVal; + stateChange = true; + } + } + return stateChange; + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/FilterEffects.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/FilterEffects.java new file mode 100644 index 0000000..f1c6fd2 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/FilterEffects.java @@ -0,0 +1,120 @@ +package org.xbib.graphics.svg.element.filtereffects; + +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.element.SVGElement; +import org.xbib.graphics.svg.xml.StyleAttribute; + +import java.awt.Rectangle; +import java.io.IOException; +import java.net.URI; +import java.net.URL; +import java.util.List; + +public abstract class FilterEffects extends SVGElement { + + public static final String TAG_NAME = "filtereffects"; + + public static final int FP_SOURCE_GRAPHIC = 0; + + public static final int FP_SOURCE_ALPHA = 1; + + public static final int FP_BACKGROUND_IMAGE = 2; + + public static final int FP_BACKGROUND_ALPHA = 3; + + public static final int FP_FILL_PAINT = 4; + + public static final int FP_STROKE_PAINT = 5; + + public static final int FP_CUSTOM = 5; + + float x = 0f; + + float y = 0f; + + float width = 1f; + + float height = 1f; + + URL href = null; + + public FilterEffects() { + } + + @Override + public String getTagName() { + return TAG_NAME; + } + + @Override + protected void build() throws SVGException, IOException { + super.build(); + } + + public List getOperations(Rectangle bounds, float xScale, float yScale) { + return null; + } + + public float getX() { + return x; + } + + public float getY() { + return y; + } + + public float getWidth() { + return width; + } + + public float getHeight() { + return height; + } + + @Override + public boolean updateTime(double curTime) throws SVGException { + StyleAttribute sty = new StyleAttribute(); + boolean stateChange = false; + if (getPres(sty.setName("x"))) { + float newVal = sty.getFloatValueWithUnits(); + if (newVal != x) { + x = newVal; + stateChange = true; + } + } + if (getPres(sty.setName("y"))) { + float newVal = sty.getFloatValueWithUnits(); + if (newVal != y) { + y = newVal; + stateChange = true; + } + } + if (getPres(sty.setName("width"))) { + float newVal = sty.getFloatValueWithUnits(); + if (newVal != width) { + width = newVal; + stateChange = true; + } + } + if (getPres(sty.setName("height"))) { + float newVal = sty.getFloatValueWithUnits(); + if (newVal != height) { + height = newVal; + stateChange = true; + } + } + try { + if (getPres(sty.setName("xlink:href"))) { + URI src = sty.getURIValue(getXMLBase()); + URL newVal = src.toURL(); + if (!newVal.equals(href)) { + href = newVal; + stateChange = true; + } + } + } catch (Exception e) { + throw new SVGException(e); + } + return stateChange; + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/FilterOp.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/FilterOp.java new file mode 100644 index 0000000..67c84a6 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/FilterOp.java @@ -0,0 +1,16 @@ +package org.xbib.graphics.svg.element.filtereffects; + +import java.awt.Rectangle; +import java.awt.image.BufferedImageOp; + +public class FilterOp { + + public final BufferedImageOp op; + + public final Rectangle requiredImageBounds; + + public FilterOp(BufferedImageOp op, Rectangle requiredImageBounds) { + this.op = op; + this.requiredImageBounds = requiredImageBounds; + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/FeGaussianBlur.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/GaussianBlur.java similarity index 95% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/FeGaussianBlur.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/GaussianBlur.java index 271b284..859c0b8 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/FeGaussianBlur.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/GaussianBlur.java @@ -1,5 +1,6 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element.filtereffects; +import org.xbib.graphics.svg.SVGException; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Rectangle; @@ -9,13 +10,18 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; -public class FeGaussianBlur extends FilterEffects { +public class GaussianBlur extends FilterEffects { + public static final String TAG_NAME = "fegaussianblur"; private float[] stdDeviation; + private float xCurrent; + private float yCurrent; + private ConvolveOp xBlur; + private ConvolveOp yBlur; @Override @@ -27,7 +33,6 @@ public class FeGaussianBlur extends FilterEffects { protected void build() throws SVGException, IOException { super.build(); StyleAttribute sty = new StyleAttribute(); - stdDeviation = new float[]{0f}; if (getPres(sty.setName("stdDeviation"))) { stdDeviation = sty.getFloatList(); @@ -40,7 +45,6 @@ public class FeGaussianBlur extends FilterEffects { public List getOperations(Rectangle inputBounds, float xScale, float yScale) { float xSigma = xScale * stdDeviation[0]; float ySigma = yScale * stdDeviation[Math.min(stdDeviation.length - 1, 1)]; - return Arrays.asList( xSigma > 0 ? getGaussianBlurFilter(inputBounds, xSigma, true) @@ -63,41 +67,34 @@ public class FeGaussianBlur extends FilterEffects { yCurrent = sigma; } float[] data = new float[size]; - float radius2 = radius * radius; float twoSigmaSquare = 2.0f * sigma * sigma; float sigmaRoot = (float) Math.sqrt(twoSigmaSquare * Math.PI); float total = 0.0f; - float middle = size / 2f; for (int i = 0; i < size; i++) { float distance = middle - i; distance *= distance; - data[i] = distance > radius2 ? 0 : (float) Math.exp(-distance / twoSigmaSquare) / sigmaRoot; total += data[i]; } - for (int i = 0; i < data.length; i++) { data[i] /= total; } - if (horizontal) { xBlur = new ConvolveOp(new Kernel(size, 1, data), ConvolveOp.EDGE_NO_OP, null); } else { yBlur = new ConvolveOp(new Kernel(1, size, data), ConvolveOp.EDGE_NO_OP, null); } } - Rectangle dstBounds = new Rectangle(inputBounds); if (horizontal) { dstBounds.grow(size, 0); } else { dstBounds.grow(0, size); } - return new FilterOp(horizontal ? xBlur : yBlur, dstBounds); } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/Light.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/Light.java new file mode 100644 index 0000000..bf5eb06 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/Light.java @@ -0,0 +1,11 @@ +package org.xbib.graphics.svg.element.filtereffects; + +public abstract class Light extends FilterEffects { + + public static final String TAG_NAME = "feLight"; + + @Override + public String getTagName() { + return TAG_NAME; + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/PointLight.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/PointLight.java new file mode 100644 index 0000000..d881d2d --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/PointLight.java @@ -0,0 +1,82 @@ +package org.xbib.graphics.svg.element.filtereffects; + +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.xml.StyleAttribute; + +import java.io.IOException; + +public class PointLight extends Light { + + public static final String TAG_NAME = "fepointlight"; + + float x = 0f; + + float y = 0f; + + float z = 0f; + + public PointLight() { + } + + @Override + public String getTagName() { + return TAG_NAME; + } + + @Override + protected void build() throws SVGException, IOException { + super.build(); + StyleAttribute sty = new StyleAttribute(); + if (getPres(sty.setName("x"))) { + x = sty.getFloatValueWithUnits(); + } + if (getPres(sty.setName("y"))) { + y = sty.getFloatValueWithUnits(); + } + if (getPres(sty.setName("z"))) { + z = sty.getFloatValueWithUnits(); + } + } + + @Override + public float getX() { + return x; + } + + @Override + public float getY() { + return y; + } + + public float getZ() { + return z; + } + + @Override + public boolean updateTime(double curTime) throws SVGException { + StyleAttribute sty = new StyleAttribute(); + boolean stateChange = false; + if (getPres(sty.setName("x"))) { + float newVal = sty.getFloatValueWithUnits(); + if (newVal != x) { + x = newVal; + stateChange = true; + } + } + if (getPres(sty.setName("y"))) { + float newVal = sty.getFloatValueWithUnits(); + if (newVal != y) { + y = newVal; + stateChange = true; + } + } + if (getPres(sty.setName("z"))) { + float newVal = sty.getFloatValueWithUnits(); + if (newVal != z) { + z = newVal; + stateChange = true; + } + } + return stateChange; + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/FeSpotLight.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/SpotLight.java similarity index 67% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/FeSpotLight.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/SpotLight.java index 8836ee9..260c406 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/FeSpotLight.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/filtereffects/SpotLight.java @@ -1,65 +1,29 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on March 18, 2004, 6:52 AM - */ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element.filtereffects; +import org.xbib.graphics.svg.SVGException; import org.xbib.graphics.svg.xml.StyleAttribute; import java.io.IOException; -/** - * @author Mark McKay - * @author Mark McKay - */ -public class FeSpotLight extends FeLight { +public class SpotLight extends Light { public static final String TAG_NAME = "fespotlight"; - float x = 0f; - float y = 0f; - float z = 0f; - float pointsAtX = 0f; - float pointsAtY = 0f; - float pointsAtZ = 0f; - float specularComponent = 0f; - float limitingConeAngle = 0f; - /** - * Creates a new instance of FillElement - */ - public FeSpotLight() { - } + float x = 0f; + + float y = 0f; + + float z = 0f; + + float pointsAtX = 0f; + + float pointsAtY = 0f; + + float pointsAtZ = 0f; + + float specularComponent = 0f; + + float limitingConeAngle = 0f; @Override public String getTagName() { @@ -69,9 +33,7 @@ public class FeSpotLight extends FeLight { @Override protected void build() throws SVGException, IOException { super.build(); - StyleAttribute sty = new StyleAttribute(); - if (getPres(sty.setName("x"))) { x = sty.getFloatValueWithUnits(); } @@ -134,12 +96,8 @@ public class FeSpotLight extends FeLight { @Override public boolean updateTime(double curTime) throws SVGException { -// if (trackManager.getNumTracks() == 0) return false; - - //Get current values for parameters StyleAttribute sty = new StyleAttribute(); boolean stateChange = false; - if (getPres(sty.setName("x"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != x) { @@ -147,7 +105,6 @@ public class FeSpotLight extends FeLight { stateChange = true; } } - if (getPres(sty.setName("y"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != y) { @@ -155,7 +112,6 @@ public class FeSpotLight extends FeLight { stateChange = true; } } - if (getPres(sty.setName("z"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != z) { @@ -163,7 +119,6 @@ public class FeSpotLight extends FeLight { stateChange = true; } } - if (getPres(sty.setName("pointsAtX"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != pointsAtX) { @@ -171,7 +126,6 @@ public class FeSpotLight extends FeLight { stateChange = true; } } - if (getPres(sty.setName("pointsAtY"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != pointsAtY) { @@ -179,7 +133,6 @@ public class FeSpotLight extends FeLight { stateChange = true; } } - if (getPres(sty.setName("pointsAtZ"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != pointsAtZ) { @@ -187,7 +140,6 @@ public class FeSpotLight extends FeLight { stateChange = true; } } - if (getPres(sty.setName("specularComponent"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != specularComponent) { @@ -195,7 +147,6 @@ public class FeSpotLight extends FeLight { stateChange = true; } } - if (getPres(sty.setName("limitingConeAngle"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != limitingConeAngle) { @@ -203,7 +154,6 @@ public class FeSpotLight extends FeLight { stateChange = true; } } - return stateChange; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/element/glyph/Glyph.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/glyph/Glyph.java new file mode 100644 index 0000000..c227535 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/glyph/Glyph.java @@ -0,0 +1,39 @@ +package org.xbib.graphics.svg.element.glyph; + +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.xml.StyleAttribute; + +import java.io.IOException; + +public class Glyph extends MissingGlyph { + + public static final String TAG_NAME = "missingglyph"; + + String unicode; + + public Glyph() { + } + + @Override + public String getTagName() { + return TAG_NAME; + } + + @Override + protected void build() throws SVGException, IOException { + super.build(); + StyleAttribute sty = new StyleAttribute(); + if (getPres(sty.setName("unicode"))) { + unicode = sty.getStringValue(); + } + } + + public String getUnicode() { + return unicode; + } + + @Override + public boolean updateTime(double curTime) throws SVGException { + return false; + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/MissingGlyph.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/glyph/MissingGlyph.java similarity index 90% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/MissingGlyph.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/glyph/MissingGlyph.java index dad6214..fc33cb4 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/MissingGlyph.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/glyph/MissingGlyph.java @@ -1,5 +1,12 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element.glyph; +import org.xbib.graphics.svg.SVGElementException; +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.SVGLoaderHelper; +import org.xbib.graphics.svg.element.Font; +import org.xbib.graphics.svg.element.RenderableElement; +import org.xbib.graphics.svg.element.SVGElement; +import org.xbib.graphics.svg.element.ShapeElement; import org.xbib.graphics.svg.pathcmd.BuildHistory; import org.xbib.graphics.svg.pathcmd.PathCommand; import org.xbib.graphics.svg.xml.StyleAttribute; @@ -18,8 +25,11 @@ public class MissingGlyph extends ShapeElement { private Shape path = null; private float horizAdvX = -1; + private float vertOriginX = -1; + private float vertOriginY = -1; + private float vertAdvY = -1; public MissingGlyph() { @@ -78,7 +88,7 @@ public class MissingGlyph extends ShapeElement { } @Override - protected void doRender(Graphics2D g) throws SVGException, IOException { + public void doRender(Graphics2D g) throws SVGException, IOException { if (path != null) { renderShape(g, path); } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/Gradient.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/gradient/Gradient.java similarity index 57% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/Gradient.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/gradient/Gradient.java index 68e94ba..7b681a5 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/Gradient.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/gradient/Gradient.java @@ -1,40 +1,11 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 3:25 AM - */ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element.gradient; +import org.xbib.graphics.svg.SVGElementException; +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.SVGLoaderHelper; +import org.xbib.graphics.svg.Stop; +import org.xbib.graphics.svg.element.FillElement; +import org.xbib.graphics.svg.element.SVGElement; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Color; @@ -42,37 +13,36 @@ import java.awt.geom.AffineTransform; import java.io.IOException; import java.net.URI; import java.util.ArrayList; -import java.util.Comparator; -import java.util.logging.Level; -import java.util.logging.Logger; +import java.util.List; + +public abstract class Gradient extends FillElement { -/** - * @author Mark McKay - * @author Mark McKay - */ -abstract public class Gradient extends FillElement { public static final String TAG_NAME = "gradient"; public static final int SM_PAD = 0; + public static final int SM_REPEAT = 1; + public static final int SM_REFLECT = 2; - int spreadMethod = SM_PAD; + + public int spreadMethod = SM_PAD; + public static final int GU_OBJECT_BOUNDING_BOX = 0; + public static final int GU_USER_SPACE_ON_USE = 1; + protected int gradientUnits = GU_OBJECT_BOUNDING_BOX; - //Either this gradient contains a list of stops, or it will take it's - // stops from the referenced gradient - ArrayList stops = new ArrayList(); + + List stops = new ArrayList<>(); + URI stopRef = null; + protected AffineTransform gradientTransform = null; - //Cache arrays of stop values here float[] stopFractions; + Color[] stopColors; - /** - * Creates a new instance of Gradient - */ public Gradient() { } @@ -81,14 +51,9 @@ abstract public class Gradient extends FillElement { return TAG_NAME; } - /** - * Called after the start element but before the end element to indicate - * each child tag that has been processed - */ @Override public void loaderAddChild(SVGLoaderHelper helper, SVGElement child) throws SVGElementException { super.loaderAddChild(helper, child); - if (!(child instanceof Stop)) { return; } @@ -98,10 +63,8 @@ abstract public class Gradient extends FillElement { @Override protected void build() throws SVGException, IOException { super.build(); - StyleAttribute sty = new StyleAttribute(); String strn; - if (getPres(sty.setName("spreadMethod"))) { strn = sty.getStringValue().toLowerCase(); if (strn.equals("repeat")) { @@ -112,7 +75,6 @@ abstract public class Gradient extends FillElement { spreadMethod = SM_PAD; } } - if (getPres(sty.setName("gradientUnits"))) { strn = sty.getStringValue().toLowerCase(); if (strn.equals("userspaceonuse")) { @@ -121,23 +83,15 @@ abstract public class Gradient extends FillElement { gradientUnits = GU_OBJECT_BOUNDING_BOX; } } - if (getPres(sty.setName("gradientTransform"))) { gradientTransform = parseTransform(sty.getStringValue()); } - //If we still don't have one, set it to identity if (gradientTransform == null) { gradientTransform = new AffineTransform(); } - - - //Check to see if we're using our own stops or referencing someone else's if (getPres(sty.setName("xlink:href"))) { try { stopRef = sty.getURIValue(getXMLBase()); -//System.err.println("Gradient: " + sty.getStringValue() + ", " + getXMLBase() + ", " + src); -// URI src = getXMLBase().resolve(href); -// stopRef = (Gradient)diagram.getUniverse().getElement(src); } catch (Exception e) { throw new SVGException("Could not resolve relative URL in Gradient: " + sty.getStringValue() + ", " + getXMLBase(), e); } @@ -145,33 +99,23 @@ abstract public class Gradient extends FillElement { } private void buildStops() { - ArrayList stopList = new ArrayList(stops); - stopList.sort(new Comparator() { - public int compare(Stop o1, Stop o2) { - return Float.compare(o1.offset, o2.offset); - } - }); - - //Remove doubles + ArrayList stopList = new ArrayList<>(stops); + stopList.sort((o1, o2) -> Float.compare(o1.offset, o2.offset)); for (int i = stopList.size() - 2; i >= 0; --i) { if (stopList.get(i + 1).offset == stopList.get(i).offset) { stopList.remove(i + 1); } } - - stopFractions = new float[stopList.size()]; stopColors = new Color[stopList.size()]; int idx = 0; for (Stop stop : stopList) { int stopColorVal = stop.color.getRGB(); Color stopColor = new Color((stopColorVal >> 16) & 0xff, (stopColorVal >> 8) & 0xff, stopColorVal & 0xff, clamp((int) (stop.opacity * 255), 0, 255)); - stopColors[idx] = stopColor; stopFractions[idx] = stop.offset; idx++; } - } public float[] getStopFractions() { @@ -179,13 +123,10 @@ abstract public class Gradient extends FillElement { Gradient grad = (Gradient) diagram.getUniverse().getElement(stopRef); return grad.getStopFractions(); } - if (stopFractions != null) { return stopFractions; } - buildStops(); - return stopFractions; } @@ -194,36 +135,18 @@ abstract public class Gradient extends FillElement { Gradient grad = (Gradient) diagram.getUniverse().getElement(stopRef); return grad.getStopColors(); } - if (stopColors != null) { return stopColors; } - buildStops(); - return stopColors; } -// public void setStops(Color[] colors, float[] fractions) -// { -// if (colors.length != fractions.length) -// { -// throw new IllegalArgumentException(); -// } -// -// this.stopColors = colors; -// this.stopFractions = fractions; -// stopRef = null; -// } - private int clamp(int val, int min, int max) { if (val < min) { return min; } - if (val > max) { - return max; - } - return val; + return Math.min(val, max); } public void setStopRef(URI grad) { @@ -234,23 +157,11 @@ abstract public class Gradient extends FillElement { stops.add(stop); } - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @return - true if this node has changed state as a result of the time - * update - */ @Override public boolean updateTime(double curTime) throws SVGException { -// if (trackManager.getNumTracks() == 0) return false; boolean stateChange = false; - - //Get current values for parameters StyleAttribute sty = new StyleAttribute(); String strn; - - if (getPres(sty.setName("spreadMethod"))) { int newVal; strn = sty.getStringValue().toLowerCase(); @@ -266,7 +177,6 @@ abstract public class Gradient extends FillElement { stateChange = true; } } - if (getPres(sty.setName("gradientUnits"))) { int newVal; strn = sty.getStringValue().toLowerCase(); @@ -280,31 +190,20 @@ abstract public class Gradient extends FillElement { stateChange = true; } } - if (getPres(sty.setName("gradientTransform"))) { AffineTransform newVal = parseTransform(sty.getStringValue()); - if (newVal != null && newVal.equals(gradientTransform)) { + if (newVal.equals(gradientTransform)) { gradientTransform = newVal; stateChange = true; } } - - - //Check to see if we're using our own stops or referencing someone else's if (getPres(sty.setName("xlink:href"))) { - try { - URI newVal = sty.getURIValue(getXMLBase()); - if ((newVal == null && stopRef != null) || !newVal.equals(stopRef)) { - stopRef = newVal; - stateChange = true; - } - } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, - "Could not parse xlink:href", e); + URI newVal = sty.getURIValue(getXMLBase()); + if ((newVal == null && stopRef != null) || !newVal.equals(stopRef)) { + stopRef = newVal; + stateChange = true; } } - - //Check stops, if any for (Stop stop : stops) { if (stop.updateTime(curTime)) { stateChange = true; @@ -312,7 +211,6 @@ abstract public class Gradient extends FillElement { stopColors = null; } } - return stateChange; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/LinearGradient.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/gradient/LinearGradient.java similarity index 65% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/LinearGradient.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/gradient/LinearGradient.java index ff442d8..fa9b44a 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/LinearGradient.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/gradient/LinearGradient.java @@ -1,40 +1,7 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 1:54 AM - */ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element.gradient; +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.element.gradient.Gradient; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Color; @@ -46,21 +13,18 @@ import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.io.IOException; -/** - * @author Mark McKay - * @author Mark McKay - */ public class LinearGradient extends Gradient { + public static final String TAG_NAME = "lineargradient"; float x1 = 0f; + float y1 = 0f; + float x2 = 1f; + float y2 = 0f; - /** - * Creates a new instance of LinearGradient - */ public LinearGradient() { } @@ -72,21 +36,16 @@ public class LinearGradient extends Gradient { @Override protected void build() throws SVGException, IOException { super.build(); - StyleAttribute sty = new StyleAttribute(); - if (getPres(sty.setName("x1"))) { x1 = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("y1"))) { y1 = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("x2"))) { x2 = sty.getFloatValueWithUnits(); } - if (getPres(sty.setName("y2"))) { y2 = sty.getFloatValueWithUnits(); } @@ -107,7 +66,6 @@ public class LinearGradient extends Gradient { method = MultipleGradientPaint.CycleMethod.REFLECT; break; } - Paint paint; Point2D.Float pt1 = new Point2D.Float(x1, y1); Point2D.Float pt2 = new Point2D.Float(x2, y2); @@ -128,16 +86,12 @@ public class LinearGradient extends Gradient { } else { AffineTransform viewXform = new AffineTransform(); viewXform.translate(bounds.getX(), bounds.getY()); - - //This is a hack to get around shapes that have a width or height of 0. Should be close enough to the true answer. double width = Math.max(1, bounds.getWidth()); double height = Math.max(1, bounds.getHeight()); viewXform.scale(width, height); - if (gradientTransform != null) { viewXform.concatenate(gradientTransform); } - paint = new LinearGradientPaint( pt1, pt2, @@ -147,26 +101,14 @@ public class LinearGradient extends Gradient { MultipleGradientPaint.ColorSpaceType.SRGB, viewXform); } - return paint; } - /** - * Updates all attributes in this diagram associated with a time event. Ie, - * all attributes with track information. - * - * @return - true if this node has changed state as a result of the time - * update - */ @Override public boolean updateTime(double curTime) throws SVGException { -// if (trackManager.getNumTracks() == 0) return stopChange; boolean changeState = super.updateTime(curTime); - - //Get current values for parameters StyleAttribute sty = new StyleAttribute(); boolean shapeChange = false; - if (getPres(sty.setName("x1"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != x1) { @@ -174,7 +116,6 @@ public class LinearGradient extends Gradient { shapeChange = true; } } - if (getPres(sty.setName("y1"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != y1) { @@ -182,7 +123,6 @@ public class LinearGradient extends Gradient { shapeChange = true; } } - if (getPres(sty.setName("x2"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != x2) { @@ -190,7 +130,6 @@ public class LinearGradient extends Gradient { shapeChange = true; } } - if (getPres(sty.setName("y2"))) { float newVal = sty.getFloatValueWithUnits(); if (newVal != y2) { @@ -198,7 +137,6 @@ public class LinearGradient extends Gradient { shapeChange = true; } } - return changeState || shapeChange; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/RadialGradient.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/gradient/RadialGradient.java similarity index 96% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/RadialGradient.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/element/gradient/RadialGradient.java index c707d2b..83ba0cb 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/RadialGradient.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/element/gradient/RadialGradient.java @@ -1,5 +1,7 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.element.gradient; +import org.xbib.graphics.svg.SVGException; +import org.xbib.graphics.svg.element.gradient.Gradient; import org.xbib.graphics.svg.xml.StyleAttribute; import java.awt.Color; diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Arc.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Arc.java index 6434fee..93b573a 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Arc.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Arc.java @@ -1,70 +1,26 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 8:40 PM - */ - package org.xbib.graphics.svg.pathcmd; -//import org.apache.batik.ext.awt.geom.ExtendedGeneralPath; - import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Arc2D; import java.awt.geom.GeneralPath; -/** - * This is a little used SVG function, as most editors will save curves as - * Beziers. To reduce the need to rely on the Batik library, this functionallity - * is being bypassed for the time being. In the future, it would be nice to - * extend the GeneralPath command to include the arcTo ability provided by Batik. - * - * @author Mark McKay - * @author Mark McKay - */ public class Arc extends PathCommand { public float rx = 0f; + public float ry = 0f; + public float xAxisRot = 0f; + public boolean largeArc = false; + public boolean sweep = false; + public float x = 0f; + public float y = 0f; - /** - * Creates a new instance of MoveTo - */ public Arc() { } @@ -79,17 +35,13 @@ public class Arc extends PathCommand { this.y = y; } - // public void appendPath(ExtendedGeneralPath path, BuildHistory hist) @Override public void appendPath(GeneralPath path, BuildHistory hist) { float offx = isRelative ? hist.lastPoint.x : 0f; float offy = isRelative ? hist.lastPoint.y : 0f; - arcTo(path, rx, ry, xAxisRot, largeArc, sweep, x + offx, y + offy, hist.lastPoint.x, hist.lastPoint.y); -// path.lineTo(x + offx, y + offy); -// hist.setPoint(x + offx, y + offy); hist.setLastPoint(x + offx, y + offy); hist.setLastKnot(x + offx, y + offy); } @@ -99,107 +51,44 @@ public class Arc extends PathCommand { return 6; } - /** - * Adds an elliptical arc, defined by two radii, an angle from the - * x-axis, a flag to choose the large arc or not, a flag to - * indicate if we increase or decrease the angles and the final - * point of the arc. - * - * @param path The path that the arc will be appended to. - * @param rx the x radius of the ellipse - * @param ry the y radius of the ellipse - * @param angle the angle from the x-axis of the current - * coordinate system to the x-axis of the ellipse in degrees. - * @param largeArcFlag the large arc flag. If true the arc - * spanning less than or equal to 180 degrees is chosen, otherwise - * the arc spanning greater than 180 degrees is chosen - * @param sweepFlag the sweep flag. If true the line joining - * center to arc sweeps through decreasing angles otherwise it - * sweeps through increasing angles - * @param x the absolute x coordinate of the final point of the arc. - * @param y the absolute y coordinate of the final point of the arc. - * @param x0 - The absolute x coordinate of the initial point of the arc. - * @param y0 - The absolute y coordinate of the initial point of the arc. - */ public void arcTo(GeneralPath path, float rx, float ry, float angle, boolean largeArcFlag, boolean sweepFlag, float x, float y, float x0, float y0) { - - // Ensure radii are valid if (rx == 0 || ry == 0) { path.lineTo(x, y); return; } - if (x0 == x && y0 == y) { - // If the endpoints (x, y) and (x0, y0) are identical, then this - // is equivalent to omitting the elliptical arc segment entirely. return; } - - Arc2D arc = computeArc(x0, y0, rx, ry, angle, - largeArcFlag, sweepFlag, x, y); - if (arc == null) return; - + Arc2D arc = computeArc(x0, y0, rx, ry, angle, largeArcFlag, sweepFlag, x, y); AffineTransform t = AffineTransform.getRotateInstance (Math.toRadians(angle), arc.getCenterX(), arc.getCenterY()); Shape s = t.createTransformedShape(arc); path.append(s, true); } - - /** - * This constructs an unrotated Arc2D from the SVG specification of an - * Elliptical arc. To get the final arc you need to apply a rotation - * transform such as: - *

- * AffineTransform.getRotateInstance - * (angle, arc.getX()+arc.getWidth()/2, arc.getY()+arc.getHeight()/2); - * - * @param x0 origin of arc in x - * @param y0 origin of arc in y - * @param rx radius of arc in x - * @param ry radius of arc in y - * @param angle number of radians in arc - * @param largeArcFlag - * @param sweepFlag - * @param x ending coordinate of arc in x - * @param y ending coordinate of arc in y - * @return arc shape - */ public static Arc2D computeArc(double x0, double y0, double rx, double ry, double angle, boolean largeArcFlag, boolean sweepFlag, double x, double y) { - // - // Elliptical arc implementation based on the SVG specification notes - // - - // Compute the half distance between the current and the final point double dx2 = (x0 - x) / 2.0; double dy2 = (y0 - y) / 2.0; - // Convert angle from degrees to radians angle = Math.toRadians(angle % 360.0); double cosAngle = Math.cos(angle); double sinAngle = Math.sin(angle); - - // - // Step 1 : Compute (x1, y1) - // double x1 = (cosAngle * dx2 + sinAngle * dy2); double y1 = (-sinAngle * dx2 + cosAngle * dy2); - // Ensure radii are large enough rx = Math.abs(rx); ry = Math.abs(ry); double Prx = rx * rx; double Pry = ry * ry; double Px1 = x1 * x1; double Py1 = y1 * y1; - // check that radii are large enough double radiiCheck = Px1 / Prx + Py1 / Pry; if (radiiCheck > 1) { rx = Math.sqrt(radiiCheck) * rx; @@ -207,40 +96,25 @@ public class Arc extends PathCommand { Prx = rx * rx; Pry = ry * ry; } - - // - // Step 2 : Compute (cx1, cy1) - // double sign = (largeArcFlag == sweepFlag) ? -1 : 1; double sq = ((Prx * Pry) - (Prx * Py1) - (Pry * Px1)) / ((Prx * Py1) + (Pry * Px1)); sq = (sq < 0) ? 0 : sq; double coef = (sign * Math.sqrt(sq)); double cx1 = coef * ((rx * y1) / ry); double cy1 = coef * -((ry * x1) / rx); - - // - // Step 3 : Compute (cx, cy) from (cx1, cy1) - // double sx2 = (x0 + x) / 2.0; double sy2 = (y0 + y) / 2.0; double cx = sx2 + (cosAngle * cx1 - sinAngle * cy1); double cy = sy2 + (sinAngle * cx1 + cosAngle * cy1); - - // - // Step 4 : Compute the angleStart (angle1) and the angleExtent (dangle) - // double ux = (x1 - cx1) / rx; double uy = (y1 - cy1) / ry; double vx = (-x1 - cx1) / rx; double vy = (-y1 - cy1) / ry; double p, n; - // Compute the angle start n = Math.sqrt((ux * ux) + (uy * uy)); - p = ux; // (1 * ux) + (0 * uy) + p = ux; sign = (uy < 0) ? -1d : 1d; double angleStart = Math.toDegrees(sign * Math.acos(p / n)); - - // Compute the angle extent n = Math.sqrt((ux * ux + uy * uy) * (vx * vx + vy * vy)); p = ux * vx + uy * vy; sign = (ux * vy - uy * vx < 0) ? -1d : 1d; @@ -252,10 +126,6 @@ public class Arc extends PathCommand { } angleExtent %= 360f; angleStart %= 360f; - - // - // We can now build the resulting Arc2D in double precision - // Arc2D.Double arc = new Arc2D.Double(); arc.x = cx - rx; arc.y = cy - ry; @@ -263,7 +133,6 @@ public class Arc extends PathCommand { arc.height = ry * 2.0; arc.start = -angleStart; arc.extent = -angleExtent; - return arc; } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/BuildHistory.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/BuildHistory.java index 8ca2a39..b6faf8b 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/BuildHistory.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/BuildHistory.java @@ -1,64 +1,13 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 9:18 PM - */ package org.xbib.graphics.svg.pathcmd; import java.awt.geom.Point2D; -/** - * When building a path from command segments, most need to cache information - * (such as the point finished at) for future commands. This structure allows - * that - * - * @author Mark McKay - * @author Mark McKay - */ public class BuildHistory { - // Point2D.Float[] history = new Point2D.Float[2]; -// Point2D.Float[] history = {new Point2D.Float(), new Point2D.Float()}; -// Point2D.Float start = new Point2D.Float(); Point2D.Float startPoint = new Point2D.Float(); Point2D.Float lastPoint = new Point2D.Float(); Point2D.Float lastKnot = new Point2D.Float(); - boolean init; - //int length = 0; - /** - * Creates a new instance of BuildHistory - */ public BuildHistory() { } @@ -73,19 +22,4 @@ public class BuildHistory { public void setLastKnot(float x, float y) { lastKnot.setLocation(x, y); } -// public void setPoint(float x, float y) -// { -// history[0].setLocation(x, y); -// length = 1; -// } -// public void setStart(float x, float y) -// { -// start.setLocation(x, y); -// } -// public void setPointAndKnot(float x, float y, float kx, float ky) -// { -// history[0].setLocation(x, y); -// history[1].setLocation(kx, ky); -// length = 2; -// } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Cubic.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Cubic.java index 4e6fbfe..a6ee322 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Cubic.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Cubic.java @@ -1,49 +1,7 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 8:40 PM - */ - package org.xbib.graphics.svg.pathcmd; -//import org.apache.batik.ext.awt.geom.ExtendedGeneralPath; - import java.awt.geom.GeneralPath; -/** - * @author Mark McKay - * @author Mark McKay - */ public class Cubic extends PathCommand { public float k1x = 0f; @@ -53,19 +11,9 @@ public class Cubic extends PathCommand { public float x = 0f; public float y = 0f; - /** - * Creates a new instance of MoveTo - */ public Cubic() { } - @Override - public String toString() { - return "C " + k1x + " " + k1y - + " " + k2x + " " + k2y - + " " + x + " " + y; - } - public Cubic(boolean isRelative, float k1x, float k1y, float k2x, float k2y, float x, float y) { super(isRelative); this.k1x = k1x; @@ -76,16 +24,13 @@ public class Cubic extends PathCommand { this.y = y; } - // public void appendPath(ExtendedGeneralPath path, BuildHistory hist) @Override public void appendPath(GeneralPath path, BuildHistory hist) { float offx = isRelative ? hist.lastPoint.x : 0f; float offy = isRelative ? hist.lastPoint.y : 0f; - path.curveTo(k1x + offx, k1y + offy, k2x + offx, k2y + offy, x + offx, y + offy); -// hist.setPointAndKnot(x + offx, y + offy, k2x + offx, k2y + offy); hist.setLastPoint(x + offx, y + offy); hist.setLastKnot(k2x + offx, k2y + offy); } @@ -94,4 +39,11 @@ public class Cubic extends PathCommand { public int getNumKnotsAdded() { return 6; } + + @Override + public String toString() { + return "C " + k1x + " " + k1y + + " " + k2x + " " + k2y + + " " + x + " " + y; + } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/CubicSmooth.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/CubicSmooth.java index 4330d7e..0a27564 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/CubicSmooth.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/CubicSmooth.java @@ -1,59 +1,17 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 8:40 PM - */ - package org.xbib.graphics.svg.pathcmd; -//import org.apache.batik.ext.awt.geom.ExtendedGeneralPath; - import java.awt.geom.GeneralPath; -/** - * @author Mark McKay - * @author Mark McKay - */ public class CubicSmooth extends PathCommand { public float x = 0f; + public float y = 0f; + public float k2x = 0f; + public float k2y = 0f; - /** - * Creates a new instance of MoveTo - */ public CubicSmooth() { } @@ -65,20 +23,16 @@ public class CubicSmooth extends PathCommand { this.y = y; } - // public void appendPath(ExtendedGeneralPath path, BuildHistory hist) @Override public void appendPath(GeneralPath path, BuildHistory hist) { float offx = isRelative ? hist.lastPoint.x : 0f; float offy = isRelative ? hist.lastPoint.y : 0f; - float oldKx = hist.lastKnot.x; float oldKy = hist.lastKnot.y; float oldX = hist.lastPoint.x; float oldY = hist.lastPoint.y; - //Calc knot as reflection of old knot float k1x = oldX * 2f - oldKx; float k1y = oldY * 2f - oldKy; - path.curveTo(k1x, k1y, k2x + offx, k2y + offy, x + offx, y + offy); hist.setLastPoint(x + offx, y + offy); hist.setLastKnot(k2x + offx, k2y + offy); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Horizontal.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Horizontal.java index 2ddc226..ac8f346 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Horizontal.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Horizontal.java @@ -1,56 +1,11 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 8:40 PM - */ - package org.xbib.graphics.svg.pathcmd; -//import org.apache.batik.ext.awt.geom.ExtendedGeneralPath; - import java.awt.geom.GeneralPath; -/** - * @author Mark McKay - * @author Mark McKay - */ public class Horizontal extends PathCommand { public float x = 0f; - /** - * Creates a new instance of MoveTo - */ public Horizontal() { } @@ -64,13 +19,10 @@ public class Horizontal extends PathCommand { this.x = x; } - - // public void appendPath(ExtendedGeneralPath path, BuildHistory hist) @Override public void appendPath(GeneralPath path, BuildHistory hist) { float offx = isRelative ? hist.lastPoint.x : 0f; float offy = hist.lastPoint.y; - path.lineTo(x + offx, offy); hist.setLastPoint(x + offx, offy); hist.setLastKnot(x + offx, offy); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/LineTo.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/LineTo.java index 6f5ae86..3d48975 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/LineTo.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/LineTo.java @@ -1,57 +1,12 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 8:40 PM - */ - package org.xbib.graphics.svg.pathcmd; -//import org.apache.batik.ext.awt.geom.ExtendedGeneralPath; - import java.awt.geom.GeneralPath; -/** - * @author Mark McKay - * @author Mark McKay - */ public class LineTo extends PathCommand { public float x = 0f; public float y = 0f; - /** - * Creates a new instance of MoveTo - */ public LineTo() { } @@ -61,13 +16,10 @@ public class LineTo extends PathCommand { this.y = y; } - - // public void appendPath(ExtendedGeneralPath path, BuildHistory hist) @Override public void appendPath(GeneralPath path, BuildHistory hist) { float offx = isRelative ? hist.lastPoint.x : 0f; float offy = isRelative ? hist.lastPoint.y : 0f; - path.lineTo(x + offx, y + offy); hist.setLastPoint(x + offx, y + offy); hist.setLastKnot(x + offx, y + offy); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/MoveTo.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/MoveTo.java index 9541889..1f5d8a8 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/MoveTo.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/MoveTo.java @@ -1,57 +1,13 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 8:40 PM - */ - package org.xbib.graphics.svg.pathcmd; -//import org.apache.batik.ext.awt.geom.ExtendedGeneralPath; - import java.awt.geom.GeneralPath; -/** - * @author Mark McKay - * @author Mark McKay - */ public class MoveTo extends PathCommand { public float x = 0f; + public float y = 0f; - /** - * Creates a new instance of MoveTo - */ public MoveTo() { } @@ -61,12 +17,10 @@ public class MoveTo extends PathCommand { this.y = y; } - // public void appendPath(ExtendedGeneralPath path, BuildHistory hist) @Override public void appendPath(GeneralPath path, BuildHistory hist) { float offx = isRelative ? hist.lastPoint.x : 0f; float offy = isRelative ? hist.lastPoint.y : 0f; - path.moveTo(x + offx, y + offy); hist.setStartPoint(x + offx, y + offy); hist.setLastPoint(x + offx, y + offy); @@ -82,6 +36,4 @@ public class MoveTo extends PathCommand { public String toString() { return "M " + x + " " + y; } - - } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathCommand.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathCommand.java index b9a3ec6..9286bf3 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathCommand.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathCommand.java @@ -1,59 +1,11 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 8:39 PM - */ - package org.xbib.graphics.svg.pathcmd; -//import org.apache.batik.ext.awt.geom.ExtendedGeneralPath; - import java.awt.geom.GeneralPath; -/** - * This is the element of a path and contains instructions for rendering a - * portion of the path - * - * @author Mark McKay - * @author Mark McKay - */ abstract public class PathCommand { public boolean isRelative = false; - /** - * Creates a new instance of PathCommand - */ public PathCommand() { } @@ -61,7 +13,6 @@ abstract public class PathCommand { this.isRelative = isRelative; } - // abstract public void appendPath(ExtendedGeneralPath path, BuildHistory hist); abstract public void appendPath(GeneralPath path, BuildHistory hist); abstract public int getNumKnotsAdded(); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathParser.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathParser.java index 5ea6689..ac8692a 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathParser.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathParser.java @@ -1,51 +1,16 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - */ package org.xbib.graphics.svg.pathcmd; import java.util.ArrayList; import java.util.List; -/** - * A helper for parsing {@link PathCommand}s. - * - * @author Jannis Weis - */ public class PathParser { + private final String input; + private final int inputLength; + private int index; + private char currentCommand; public PathParser(String input) { @@ -73,13 +38,9 @@ public class PathParser { return index < inputLength; } - // This only checks for the rough structure of a number as we need to know - // when to separate the next token. - // Explicit parsing is done by Float#parseFloat. private boolean isValidNumberChar(char c, NumberCharState state) { boolean valid = '0' <= c && c <= '9'; if (valid && state.iteration == 1 && input.charAt(index - 1) == '0') { - // Break up combined zeros into multiple numbers. return false; } state.signAllowed = state.signAllowed && !valid; @@ -92,7 +53,6 @@ public class PathParser { state.signAllowed = valid; } if (state.exponentAllowed && !valid) { - // Possible exponent notation. Needs at least one preceding number valid = c == 'e' || c == 'E'; state.exponentAllowed = !valid; state.signAllowed = valid; @@ -128,7 +88,6 @@ public class PathParser { public PathCommand[] parsePathCommand() { List commands = new ArrayList<>(); - currentCommand = 'Z'; while (hasNext()) { char peekChar = peek(); @@ -137,7 +96,6 @@ public class PathParser { currentCommand = peekChar; } consumeWhiteSpaceOrSeparator(); - PathCommand cmd; switch (currentCommand) { case 'M': diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathUtil.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathUtil.java index 74039b8..fb99552 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathUtil.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/PathUtil.java @@ -1,70 +1,19 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on May 10, 2005, 5:56 AM - */ - package org.xbib.graphics.svg.pathcmd; import java.awt.geom.AffineTransform; import java.awt.geom.GeneralPath; import java.awt.geom.PathIterator; -/** - * @author kitfox - */ public class PathUtil { - /** - * Creates a new instance of PathUtil - */ public PathUtil() { } - /** - * Converts a GeneralPath into an SVG representation - * - * @param path The shape to be encoded - * @return A string encoding the path using the SVG path notation - */ public static String buildPathString(GeneralPath path) { float[] coords = new float[6]; - - StringBuffer sb = new StringBuffer(); - + StringBuilder sb = new StringBuilder(); for (PathIterator pathIt = path.getPathIterator(new AffineTransform()); !pathIt.isDone(); pathIt.next()) { int segId = pathIt.currentSegment(coords); - switch (segId) { case PathIterator.SEG_CLOSE: { sb.append(" Z"); @@ -88,7 +37,6 @@ public class PathUtil { } } } - return sb.toString(); } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Quadratic.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Quadratic.java index bce8d81..fbca360 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Quadratic.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Quadratic.java @@ -1,68 +1,20 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 8:40 PM - */ - package org.xbib.graphics.svg.pathcmd; -//import org.apache.batik.ext.awt.geom.ExtendedGeneralPath; - import java.awt.geom.GeneralPath; -/** - * @author Mark McKay - * @author Mark McKay - */ public class Quadratic extends PathCommand { public float kx = 0f; + public float ky = 0f; + public float x = 0f; + public float y = 0f; - /** - * Creates a new instance of MoveTo - */ public Quadratic() { } - @Override - public String toString() { - return "Q " + kx + " " + ky - + " " + x + " " + y; - } - public Quadratic(boolean isRelative, float kx, float ky, float x, float y) { super(isRelative); this.kx = kx; @@ -71,12 +23,10 @@ public class Quadratic extends PathCommand { this.y = y; } - // public void appendPath(ExtendedGeneralPath path, BuildHistory hist) @Override public void appendPath(GeneralPath path, BuildHistory hist) { float offx = isRelative ? hist.lastPoint.x : 0f; float offy = isRelative ? hist.lastPoint.y : 0f; - path.quadTo(kx + offx, ky + offy, x + offx, y + offy); hist.setLastPoint(x + offx, y + offy); hist.setLastKnot(kx + offx, ky + offy); @@ -86,4 +36,10 @@ public class Quadratic extends PathCommand { public int getNumKnotsAdded() { return 4; } + + @Override + public String toString() { + return "Q " + kx + " " + ky + + " " + x + " " + y; + } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/QuadraticSmooth.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/QuadraticSmooth.java index 3ca83e5..5b19a32 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/QuadraticSmooth.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/QuadraticSmooth.java @@ -1,57 +1,13 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 8:40 PM - */ - package org.xbib.graphics.svg.pathcmd; -//import org.apache.batik.ext.awt.geom.ExtendedGeneralPath; - import java.awt.geom.GeneralPath; -/** - * @author Mark McKay - * @author Mark McKay - */ public class QuadraticSmooth extends PathCommand { public float x = 0f; + public float y = 0f; - /** - * Creates a new instance of MoveTo - */ public QuadraticSmooth() { } @@ -66,20 +22,16 @@ public class QuadraticSmooth extends PathCommand { this.y = y; } - // public void appendPath(ExtendedGeneralPath path, BuildHistory hist) @Override public void appendPath(GeneralPath path, BuildHistory hist) { float offx = isRelative ? hist.lastPoint.x : 0f; float offy = isRelative ? hist.lastPoint.y : 0f; - float oldKx = hist.lastKnot.x; float oldKy = hist.lastKnot.y; float oldX = hist.lastPoint.x; float oldY = hist.lastPoint.y; - //Calc knot as reflection of old knot float kx = oldX * 2f - oldKx; float ky = oldY * 2f - oldKy; - path.quadTo(kx, ky, x + offx, y + offy); hist.setLastPoint(x + offx, y + offy); hist.setLastKnot(kx, ky); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Terminal.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Terminal.java index 2683861..53b7cba 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Terminal.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Terminal.java @@ -1,56 +1,9 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 8:40 PM - */ - package org.xbib.graphics.svg.pathcmd; -//import org.apache.batik.ext.awt.geom.ExtendedGeneralPath; - import java.awt.geom.GeneralPath; -/** - * Finishes a path - * - * @author Mark McKay - * @author Mark McKay - */ public class Terminal extends PathCommand { - /** - * Creates a new instance of MoveTo - */ public Terminal() { } @@ -59,8 +12,6 @@ public class Terminal extends PathCommand { return "Z"; } - - // public void appendPath(ExtendedGeneralPath path, BuildHistory hist) @Override public void appendPath(GeneralPath path, BuildHistory hist) { path.closePath(); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Vertical.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Vertical.java index 2c88d8d..fe19b46 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Vertical.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/pathcmd/Vertical.java @@ -1,56 +1,11 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on January 26, 2004, 8:40 PM - */ - package org.xbib.graphics.svg.pathcmd; -//import org.apache.batik.ext.awt.geom.ExtendedGeneralPath; - import java.awt.geom.GeneralPath; -/** - * @author Mark McKay - * @author Mark McKay - */ public class Vertical extends PathCommand { public float y = 0f; - /** - * Creates a new instance of MoveTo - */ public Vertical() { } @@ -64,12 +19,10 @@ public class Vertical extends PathCommand { this.y = y; } - // public void appendPath(ExtendedGeneralPath path, BuildHistory hist) @Override public void appendPath(GeneralPath path, BuildHistory hist) { float offx = hist.lastPoint.x; float offy = isRelative ? hist.lastPoint.y : 0f; - path.lineTo(offx, y + offy); hist.setLastPoint(offx, y + offy); hist.setLastKnot(offx, y + offy); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pattern/PatternPaint.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pattern/PatternPaint.java deleted file mode 100644 index 890717c..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pattern/PatternPaint.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on April 1, 2004, 3:37 AM - */ - -package org.xbib.graphics.svg.pattern; - -import java.awt.Paint; -import java.awt.PaintContext; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; - -/** - * @author Mark McKay - * @author Mark McKay - */ -public class PatternPaint implements Paint { - BufferedImage source; //Image we're rendering from - AffineTransform xform; - - /** - * Creates a new instance of PatternPaint - */ - public PatternPaint(BufferedImage source, AffineTransform xform) { - this.source = source; - this.xform = xform; - } - - public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds, AffineTransform xform, RenderingHints hints) { - return new PatternPaintContext(source, deviceBounds, xform, this.xform); - } - - public int getTransparency() { - return source.getColorModel().getTransparency(); - } - -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/pattern/PatternPaintContext.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/pattern/PatternPaintContext.java deleted file mode 100644 index eb2415e..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/pattern/PatternPaintContext.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on April 1, 2004, 3:37 AM - */ - -package org.xbib.graphics.svg.pattern; - -import org.xbib.graphics.svg.SVGConst; - -import java.awt.PaintContext; -import java.awt.Rectangle; -import java.awt.geom.AffineTransform; -import java.awt.geom.Point2D; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.Raster; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author Mark McKay - * @author Mark McKay - */ -public class PatternPaintContext implements PaintContext { - BufferedImage source; //Image we're rendering from - Rectangle deviceBounds; //int size of rectangle we're rendering to -// AffineTransform userXform; //xform from user space to device space -// AffineTransform distortXform; //distortion applied to this pattern - - AffineTransform xform; //distortion applied to this pattern - - int sourceWidth; - int sourceHeight; - - //Raster we use to build tile - BufferedImage buf; - - /** - * Creates a new instance of PatternPaintContext - */ - public PatternPaintContext(BufferedImage source, Rectangle deviceBounds, AffineTransform userXform, AffineTransform distortXform) { -//System.err.println("Bounds " + deviceBounds); - this.source = source; - this.deviceBounds = deviceBounds; - try { -// this.distortXform = distortXform.createInverse(); -// this.userXform = userXform.createInverse(); - -// xform = userXform.createInverse(); -// xform.concatenate(distortXform.createInverse()); - xform = distortXform.createInverse(); - xform.concatenate(userXform.createInverse()); - } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, null, e); - } - - sourceWidth = source.getWidth(); - sourceHeight = source.getHeight(); - } - - public void dispose() { - } - - public ColorModel getColorModel() { - return source.getColorModel(); - } - - public Raster getRaster(int x, int y, int w, int h) { -//System.err.println("" + x + ", " + y + ", " + w + ", " + h); - if (buf == null || buf.getWidth() != w || buf.getHeight() != h) { - buf = new BufferedImage(w, h, source.getType()); - } - -// Point2D.Float srcPt = new Point2D.Float(), srcPt2 = new Point2D.Float(), destPt = new Point2D.Float(); - Point2D.Float srcPt = new Point2D.Float(), destPt = new Point2D.Float(); - for (int j = 0; j < h; j++) { - for (int i = 0; i < w; i++) { - destPt.setLocation(i + x, j + y); - - xform.transform(destPt, srcPt); - -// userXform.transform(destPt, srcPt2); -// distortXform.transform(srcPt2, srcPt); - - int ii = ((int) srcPt.x) % sourceWidth; - if (ii < 0) ii += sourceWidth; - int jj = ((int) srcPt.y) % sourceHeight; - if (jj < 0) jj += sourceHeight; - - buf.setRGB(i, j, source.getRGB(ii, jj)); - } - } - - return buf.getData(); - } - - public static void main(String[] argv) { - int i = -4; - System.err.println("Hello " + (i % 4)); - } - -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/util/FontUtil.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/util/FontUtil.java index d7de606..6cc292f 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/util/FontUtil.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/util/FontUtil.java @@ -1,41 +1,9 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - */ package org.xbib.graphics.svg.util; -import org.xbib.graphics.svg.Font; +import org.xbib.graphics.svg.element.Font; +import org.xbib.graphics.svg.FontSystem; import org.xbib.graphics.svg.SVGDiagram; -import org.xbib.graphics.svg.SVGElement; +import org.xbib.graphics.svg.element.SVGElement; import org.xbib.graphics.svg.SVGException; import org.xbib.graphics.svg.Text; import org.xbib.graphics.svg.xml.StyleAttribute; @@ -45,17 +13,16 @@ import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; -/** - * Utility class for parsing font information of an {@link SVGElement}. - * - * @author Jannis Weis - */ public final class FontUtil { private static final String DEFAULT_FONT_FAMILY = "sans-serif"; + private static final float DEFAULT_FONT_SIZE = 12f; + private static final int DEFAULT_LETTER_SPACING = 0; + private static final int DEFAULT_FONT_STYLE = Text.TXST_NORMAL; + private static final int DEFAULT_FONT_WEIGHT = Text.TXWE_NORMAL; private FontUtil() { @@ -78,8 +45,12 @@ public final class FontUtil { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof FontInfo)) return false; + if (this == o) { + return true; + } + if (!(o instanceof FontInfo)) { + return false; + } FontInfo fontInfo = (FontInfo) o; return Float.compare(fontInfo.size, size) == 0 && style == fontInfo.style && weight == fontInfo.weight @@ -100,17 +71,14 @@ public final class FontUtil { if (element.getStyle(sty.setName("font-family"))) { fontFamily = sty.getStringValue(); } - float fontSize = DEFAULT_FONT_SIZE; if (element.getStyle(sty.setName("font-size"))) { fontSize = sty.getFloatValueWithUnits(); } - float letterSpacing = DEFAULT_LETTER_SPACING; if (element.getStyle(sty.setName("letter-spacing"))) { letterSpacing = sty.getFloatValueWithUnits(); } - int fontStyle = DEFAULT_FONT_STYLE; if (element.getStyle(sty.setName("font-style"))) { String s = sty.getStringValue(); @@ -122,7 +90,6 @@ public final class FontUtil { fontStyle = Text.TXST_OBLIQUE; } } - int fontWeight = DEFAULT_FONT_WEIGHT; if (element.getStyle(sty.setName("font-weight"))) { String s = sty.getStringValue(); @@ -132,7 +99,6 @@ public final class FontUtil { fontWeight = Text.TXWE_BOLD; } } - return new FontInfo(fontFamily.split(","), fontSize, fontStyle, fontWeight, letterSpacing); } @@ -147,7 +113,6 @@ public final class FontUtil { if (font != null) break; } if (font == null) { - //Check system fonts font = FontSystem.createFont(families, fontStyle, fontWeight, fontSize); } if (font == null) { diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/util/PaintCache.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/util/PaintCache.java new file mode 100644 index 0000000..759ee74 --- /dev/null +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/util/PaintCache.java @@ -0,0 +1,38 @@ +package org.xbib.graphics.svg.util; + +import java.awt.Rectangle; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; + +public class PaintCache { + + private final BufferedImage img; + + private final Rectangle bounds; + + private final AffineTransform transform; + + public PaintCache(BufferedImage img, Rectangle bounds, AffineTransform transform) { + this.img = img; + this.bounds = bounds; + this.transform = transform; + } + + public BufferedImage getImage() { + return img; + } + + public boolean isCompatible(AffineTransform tx) { + return tx.getScaleX() == transform.getScaleX() + && tx.getScaleY() == transform.getScaleY() + && tx.getShearX() == transform.getShearX() + && tx.getShearY() == transform.getShearY(); + } + + public Rectangle getBoundsForTransform(AffineTransform tx) { + double dx = tx.getTranslateX() - transform.getTranslateX(); + double dy = tx.getTranslateY() - transform.getTranslateY(); + return new Rectangle((int) (bounds.x + dx), (int) (bounds.y + dy), + bounds.width, bounds.height); + } +} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/BufferPainter.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/util/PaintUtil.java similarity index 77% rename from graphics-svg/src/main/java/org/xbib/graphics/svg/BufferPainter.java rename to graphics-svg/src/main/java/org/xbib/graphics/svg/util/PaintUtil.java index c349c4e..7d1a95b 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/BufferPainter.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/util/PaintUtil.java @@ -1,4 +1,8 @@ -package org.xbib.graphics.svg; +package org.xbib.graphics.svg.util; + +import org.xbib.graphics.svg.element.filtereffects.FilterOp; +import org.xbib.graphics.svg.element.RenderableElement; +import org.xbib.graphics.svg.SVGException; import java.awt.Color; import java.awt.Graphics2D; @@ -12,35 +16,10 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -public class BufferPainter { +public class PaintUtil { + public static final boolean DEBUG_PAINT = false; - public static class Cache { - private final BufferedImage img; - private final Rectangle bounds; - private final AffineTransform transform; - - public Cache(BufferedImage img, Rectangle bounds, AffineTransform transform) { - this.img = img; - this.bounds = bounds; - this.transform = transform; - } - - boolean isCompatible(AffineTransform tx) { - return tx.getScaleX() == transform.getScaleX() - && tx.getScaleY() == transform.getScaleY() - && tx.getShearX() == transform.getShearX() - && tx.getShearY() == transform.getShearY(); - } - - Rectangle getBoundsForTransform(AffineTransform tx) { - double dx = tx.getTranslateX() - transform.getTranslateX(); - double dy = tx.getTranslateY() - transform.getTranslateY(); - return new Rectangle((int) (bounds.x + dx), (int) (bounds.y + dy), - bounds.width, bounds.height); - } - } - public static void paintElement(Graphics2D g, RenderableElement element) throws SVGException, IOException { if (element.cachedMask != null || (element.filter != null && !element.filter.filterEffects.isEmpty())) { @@ -64,12 +43,12 @@ public class BufferPainter { Rectangle elementBounds = element.getBoundingBox().getBounds(); Rectangle transformedBounds = transform.createTransformedShape(elementBounds).getBounds(); Rectangle dstBounds = new Rectangle(transformedBounds); - Cache cache = element.getBufferCache(); + PaintCache cache = element.getBufferCache(); BufferedImage elementImage; if (cache == null || !cache.isCompatible(transform)) { elementImage = renderToBuffer(gg, element, transform, transformedBounds, dstBounds); } else { - elementImage = cache.img; + elementImage = cache.getImage(); dstBounds.setBounds(cache.getBoundsForTransform(transform)); } gg.setTransform(new AffineTransform()); @@ -90,22 +69,17 @@ public class BufferPainter { Rectangle dstBounds) throws SVGException, IOException { Point2D.Float origin = new Point2D.Float(0, 0); transform.transform(origin, origin); - - // As filter operations are commonly implemented using convolutions they need to be - // aware of any possible scaling to compensate for it in their kernel size. Point2D.Float testPoint = new Point2D.Float(1, 0); float xScale = getTransformScale(origin, testPoint, transform); testPoint.setLocation(0, 1); float yScale = getTransformScale(origin, testPoint, transform); - - List filterOps = element.filter == null + List filterOps = element.filter == null ? Collections.emptyList() : element.filter.filterEffects.stream() .flatMap(f -> f.getOperations(dstBounds, xScale, yScale).stream()) .filter(Objects::nonNull) .collect(Collectors.toList()); - - for (FilterEffects.FilterOp filterOp : filterOps) { + for (FilterOp filterOp : filterOps) { int right = Math.max(dstBounds.x + dstBounds.width, filterOp.requiredImageBounds.x + filterOp.requiredImageBounds.width); int bottom = Math.max(dstBounds.y + dstBounds.height, @@ -115,17 +89,13 @@ public class BufferPainter { dstBounds.width = right - dstBounds.x; dstBounds.height = bottom - dstBounds.y; } - - - BufferedImage elementImage = BufferPainter.paintToBuffer(gg, transform, dstBounds, transformedBounds, + BufferedImage elementImage = PaintUtil.paintToBuffer(gg, transform, dstBounds, transformedBounds, element, null, true); - - for (FilterEffects.FilterOp filterOp : filterOps) { + for (FilterOp filterOp : filterOps) { elementImage = filterOp.op.filter(elementImage, null); } - if (element.cachedMask != null) { - BufferedImage maskImage = BufferPainter.paintToBuffer(gg, transform, dstBounds, transformedBounds, + BufferedImage maskImage = PaintUtil.paintToBuffer(gg, transform, dstBounds, transformedBounds, element.cachedMask, Color.BLACK, false); Graphics2D elementGraphics = (Graphics2D) elementImage.getGraphics(); elementGraphics.setRenderingHints(gg.getRenderingHints()); diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/util/TextBuilder.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/util/TextBuilder.java deleted file mode 100644 index e734e32..0000000 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/util/TextBuilder.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * SVG Salamander - * Copyright (c) 2004, Mark McKay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Mark McKay can be contacted at mark@kitfox.com. Salamander and other - * projects can be found at http://www.kitfox.com - * - * Created on April 24, 2015 - */ -package org.xbib.graphics.svg.util; - -/** - * @author kitfox - */ -public class TextBuilder { - -} diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/StyleAttribute.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/StyleAttribute.java index 5398b60..fe9aef9 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/StyleAttribute.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/StyleAttribute.java @@ -1,7 +1,5 @@ package org.xbib.graphics.svg.xml; -import org.xbib.graphics.svg.SVGConst; - import java.awt.Color; import java.awt.HeadlessException; import java.awt.Toolkit; @@ -15,16 +13,16 @@ import java.util.regex.Pattern; public class StyleAttribute { + private static final Logger logger = Logger.getLogger(StyleAttribute.class.getName()); + static final Pattern patternUrl = Pattern.compile("\\s*url\\((.*)\\)\\s*"); static final Matcher matchFpNumUnits = Pattern.compile("\\s*([-+]?((\\d*\\.\\d+)|(\\d+))([-+]?[eE]\\d+)?)\\s*(px|cm|mm|in|pc|pt|em|ex)\\s*").matcher(""); String name; + String stringValue; - /** - * Creates a new instance of StyleAttribute - */ public StyleAttribute() { this(null, null); } @@ -161,19 +159,7 @@ public class StyleAttribute { try { return new URL(docRoot, fragment); } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, null, e); - return null; - } - } - - public URL getURLValue(URI docRoot) { - String fragment = parseURLFn(); - if (fragment == null) return null; - try { - URI ref = docRoot.resolve(fragment); - return ref.toURL(); - } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, null, e); + logger.log(Level.WARNING, null, e); return null; } } @@ -206,7 +192,7 @@ public class StyleAttribute { } return new URI(base.getScheme() + ":" + relUri); } catch (Exception e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, null, e); + logger.log(Level.WARNING, null, e); return null; } } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/StyleSheet.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/StyleSheet.java index 73dd11b..fc527e7 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/StyleSheet.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/StyleSheet.java @@ -1,18 +1,13 @@ package org.xbib.graphics.svg.xml; -import org.xbib.graphics.svg.SVGConst; - import java.util.HashMap; import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; public class StyleSheet { Map ruleMap = new HashMap<>(); public static StyleSheet parseSheet(String src) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, "CSS parser not implemented yet"); return null; } diff --git a/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/XMLParseUtil.java b/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/XMLParseUtil.java index 0060ec8..7195709 100644 --- a/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/XMLParseUtil.java +++ b/graphics-svg/src/main/java/org/xbib/graphics/svg/xml/XMLParseUtil.java @@ -1,7 +1,5 @@ package org.xbib.graphics.svg.xml; -import org.xbib.graphics.svg.SVGConst; - import java.awt.Toolkit; import java.util.HashMap; import java.util.Iterator; @@ -14,7 +12,9 @@ import java.util.regex.Pattern; public class XMLParseUtil { - static final Matcher fpMatch = Pattern.compile("([-+]?((\\d*\\.\\d+)|(\\d+))([eE][+-]?\\d+)?)(\\%|in|cm|mm|pt|pc|px|em|ex)?").matcher(""); + private static final Logger logger = Logger.getLogger(XMLParseUtil.class.getName()); + + static final Matcher fpMatch = Pattern.compile("([-+]?((\\d*\\.\\d+)|(\\d+))([eE][+-]?\\d+)?)(%|in|cm|mm|pt|pc|px|em|ex)?").matcher(""); static final Matcher intMatch = Pattern.compile("[-+]?\\d+").matcher(""); @@ -48,7 +48,7 @@ public class XMLParseUtil { return 0; } } catch (StringIndexOutOfBoundsException e) { - Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, + logger.log(Level.WARNING, "XMLParseUtil: regex parse problem: '" + val + "'", e); } val = fpMatch.group(1); @@ -188,13 +188,14 @@ public class XMLParseUtil { } public static NumberWithUnits parseNumberWithUnits(String val) { - if (val == null) return null; - + if (val == null) { + return null; + } return new NumberWithUnits(val); } public static HashMap parseStyle(String styleString, HashMap map) { - final Pattern patSemi = Pattern.compile(";"); + Pattern patSemi = Pattern.compile(";"); String[] styles = patSemi.split(styleString); for (String style : styles) { if (style.length() == 0) { diff --git a/graphics-svg/src/test/java/org/xbib/graphics/svg/test/SimpleSVGLoadTest.java b/graphics-svg/src/test/java/org/xbib/graphics/svg/test/SimpleSVGLoadTest.java new file mode 100644 index 0000000..0558fb0 --- /dev/null +++ b/graphics-svg/src/test/java/org/xbib/graphics/svg/test/SimpleSVGLoadTest.java @@ -0,0 +1,18 @@ +package org.xbib.graphics.svg.test; + +import org.junit.jupiter.api.Test; +import org.xbib.graphics.svg.SVGDiagram; +import org.xbib.graphics.svg.SVGUniverse; + +import java.io.IOException; +import java.io.InputStream; + +public class SimpleSVGLoadTest { + + @Test + public void test() throws IOException { + InputStream inputStream = getClass().getResourceAsStream("test.svg"); + SVGUniverse svgUniverse = new SVGUniverse(); + SVGDiagram diagram = svgUniverse.getDiagram(svgUniverse.loadSVG(inputStream, "test.svg")); + } +} diff --git a/graphics-svg/src/test/res/1C2EC147.png b/graphics-svg/src/test/res/1C2EC147.png deleted file mode 100644 index e33dd29..0000000 Binary files a/graphics-svg/src/test/res/1C2EC147.png and /dev/null differ diff --git a/graphics-svg/src/test/res/1C2EC148.png b/graphics-svg/src/test/res/1C2EC148.png deleted file mode 100644 index e33dd29..0000000 Binary files a/graphics-svg/src/test/res/1C2EC148.png and /dev/null differ diff --git a/graphics-svg/src/test/res/AdamTagletClasses.svg b/graphics-svg/src/test/res/AdamTagletClasses.svg deleted file mode 100644 index ac5b85f..0000000 --- a/graphics-svg/src/test/res/AdamTagletClasses.svg +++ /dev/null @@ -1,104 +0,0 @@ - - -]> - - - - -DigraphName - - -net_walend_adamtaglet_AdamTaglet - - -AdamTaglet - - - -com_sun_tools_doclets_internal_toolkit_taglets_Taglet - - -com.sun.tools.doclets.internal.toolkit.taglets.Taglet - - - -com_sun_tools_doclets_internal_toolkit_taglets_Taglet->net_walend_adamtaglet_AdamTaglet - - - - -net_walend_adamtaglet_ClassDiagramBuilder - - -ClassDiagramBuilder - - - -net_walend_adamtaglet_ClassDiagramVisitor - - -ClassDiagramVisitor - - - -net_walend_tographviz_ToGraphvizVisitor - - -net.walend.tographviz.ToGraphvizVisitor - - - -net_walend_tographviz_ToGraphvizVisitor->net_walend_adamtaglet_ClassDiagramVisitor - - - - -net_walend_adamtaglet_Relationship - - -Relationship - - - -java_lang_Enum - - -java.lang.Enum - - - -java_lang_Enum->net_walend_adamtaglet_Relationship - - - - -java_lang_Comparable - - -java.lang.Comparable - - - -java_lang_Comparable->java_lang_Enum - - - - -java_io_Serializable - - -java.io.Serializable - - - -java_io_Serializable->java_lang_Enum - - - - - diff --git a/graphics-svg/src/test/res/Monitor.svg b/graphics-svg/src/test/res/Monitor.svg deleted file mode 100644 index 9e07a3f..0000000 --- a/graphics-svg/src/test/res/Monitor.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/graphics-svg/src/test/res/bad_alias.svg b/graphics-svg/src/test/res/bad_alias.svg deleted file mode 100644 index 4adc92d..0000000 --- a/graphics-svg/src/test/res/bad_alias.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - -]> - - - - - - - diff --git a/graphics-svg/src/test/res/bad_alias2.svg b/graphics-svg/src/test/res/bad_alias2.svg deleted file mode 100644 index 81fc016..0000000 --- a/graphics-svg/src/test/res/bad_alias2.svg +++ /dev/null @@ -1,229 +0,0 @@ - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/graphics-svg/src/test/res/bad_alias3.svg b/graphics-svg/src/test/res/bad_alias3.svg deleted file mode 100644 index a74e8bd..0000000 --- a/graphics-svg/src/test/res/bad_alias3.svg +++ /dev/null @@ -1,5689 +0,0 @@ - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - COMPRESSOR 1 CYLINDER - 8501031 - E - W - I - T - H - O - U - T - - O - I - L - - E - Q - U - A - L - I - S - A - T - I - O - N - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 25 - - .98 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 98 - - 3.85 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 68 - - 2.67 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 109 - - 4.29 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 15 - - .60 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 23 - - .90 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 - - .67 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 39 - - 1.52 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 118 - - 4.65 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 123 - - 4.84 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 68 - - 2.68 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 35° - - - - - - - - - - - - - - - - 263 - - 10.34 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 82 - - 3.22 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUCTION - - D - - I - - S - - C - - H - - A - - R - - G - - E - - - - 142 - - 5.59 - - [ - - ] - - 142 - - 5.60 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ø - - 224 - - 8.83 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 333 - - 13.12 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ø - - 31,75 - - 1.25 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 159 - - 6.26 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C - - O - - M - - P - - R - - E - - S - - S - - O - - R - - S - - MT/MTZ 18-3/4 - - MT/MTZ 22-3/4/6 - - MT/MTZ 28-3/4/6 - - - - S - U - - C - - T - - I - - O - - N - - - - R - - O - - T - - A - - L - - O - - C - - K - - 1" - - - - D - - I - - S - - C - - H - - A - - R - - G - - E - - - - R - - O - - T - - A - - L - - O - - C - - K - - 1" - - - - P - - T - - C - - - - C - - R - - A - - N - - K - - C - - A - - S - - E - - - - H - - E - - A - - T - - E - - R - - - - S - - C - - H - - R - - A - - D - - E - - R - - 1/4" - - - - B - - O - - L - - T - - - - H - - - - M - - 8 - - - - - 4 - - 0 - - G - - R - - O - - M - - M - - E - - T - - - - C - - O - - M - - P - - R - - E - - S - - S - - I - - O - - N - - - - N - - O - - T - - - - I - - N - - C - - L - - U - - D - - E - - D - - , - - A - - R - - O - - U - - N - - D - - - - 1 - - - - M - - M - - S - - I - - L - - E - - N - - T - - B - - L - - O - - C - - K - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/graphics-svg/src/test/res/data-uri-scheme-test-image.svg b/graphics-svg/src/test/res/data-uri-scheme-test-image.svg deleted file mode 100644 index a6356be..0000000 --- a/graphics-svg/src/test/res/data-uri-scheme-test-image.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - -]> - - - - - - - - - - - - - - - - diff --git a/graphics-svg/src/test/res/drawing.svg b/graphics-svg/src/test/res/drawing.svg deleted file mode 100644 index 77a6dc1..0000000 --- a/graphics-svg/src/test/res/drawing.svg +++ /dev/null @@ -1,9361 +0,0 @@ - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A - P - P - R - O - B - A - T - I - O - N - M - A - T - I - E - R - E - : - P - A - R - D - A - T - E - T - o - l - . - g - e - n - : - E - c - h - : - IND - M - O - D - I - F - I - C - A - T - I - O - N - S - - C - e - - p - l - a - n - - e - s - t - - l - a - - p - r - o - p - r - i - e - t - e - - d - e - - D - a - n - f - o - s - s - - C - o - m - m - e - r - c - i - a - l - - C - o - m - p - r - e - s - s - o - r - s - , - - t - o - u - t - e - - c - o - p - i - e - - o - u - - c - o - m - m - u - n - i - c - a - t - i - o - n - - a - - d - e - s - - t - i - e - r - s - e - s - t - - i - n - t - e - r - d - i - t - e - - s - a - n - s - - a - u - t - o - r - i - s - a - t - i - o - n - . - - T - h - i - s - - d - r - a - w - i - n - g - - i - s - - p - r - o - p - r - i - e - t - a - r - y - - a - n - d - - s - h - a - l - l - - n - o - t - - b - e - - c - o - p - i - e - d - - o - r - - i - t - s - c - o - n - t - e - n - t - s - - d - i - s - c - l - o - s - e - d - - t - o - - o - u - t - s - i - d - e - - p - a - r - t - i - e - s - - w - i - t - h - o - u - t - - t - h - e - - w - r - i - t - t - e - n - - c - o - n - s - e - n - t - - o - f - - D - a - n - f - o - s - s - - C - o - m - m - e - r - c - i - a - l - - C - o - m - p - r - e - s - s - o - r - s - 3D - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 518 - - 20.40 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 99 - 3.91 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 95 - 3.75 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 125 - 4.92 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 233 - 9.18 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 246 - 9.70 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 246 - 9.70 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 210 - 8.28 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 209 - 8.24 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 205 - 8.07 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 155 - 6.10 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 117 - 4.61 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ø - - 352 - - 13.85 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 98 - 3.84 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 232 - 9.12 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 15° - - - - - - - - - - - - - - - 15° - - - - - - - - - - - - - - - 15° - - - - - - - - - - - - - - - 19 - .75 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 30 - 1.19 - [ - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 8504010 - - - - - - - - - A1 - - - - - - - - - 1/2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - D - a - n - f - o - s - s - - C - o - m - m - e - r - c - i - a - l - C - o - m - p - r - e - s - s - o - r - s - B - . - P - . - 3 - 3 - 1 - F - - - 0 - 1 - 6 - 0 - 3 - - T - r - e - v - o - u - x - - F - r - a - n - c - e - T - e - l - . - - : - F - a - x - : - + - 3 - 3 - - ( - 0 - ) - - 4 - - 7 - 4 - - 0 - 0 - - 2 - 8 - - 2 - 9 - + - 3 - 3 - - ( - 0 - ) - - 4 - - 7 - 4 - - 0 - 0 - - 5 - 2 - - 4 - 4 - - - - - - - - - - - - - - - - - - - 4 - - C - Y - L - I - N - D - R - E - S - - / - - V - E - - / - - B - A - S - S - E - - - - - - - - - 4 - - C - y - l - i - n - d - e - r - s - - / - - V - E - - / - - L - o - w - - - - - - - - - - - - - - - - - - - - - - - - - - - E - ADA - 23/06/05 - J - B - V - - DC 1020861 / 1050271 / 1050272 - - - - - - - - - - C - O - M - P - R - E - S - S - O - R - S - - M - T - / - M - T - Z - - 1 - 0 - 0 - - - 3 - / - 4 - / - 6 - / - 7 - / - 9 - M - T - / - M - T - Z - - 1 - 2 - 5 - - - 3 - / - 4 - / - 6 - / - 7 - / - 9 - L - T - Z - - 8 - 8 - - - 3 - / - 4 - / - 6 - / - 7 - / - 9 - L - T - Z - - 1 - 0 - 0 - - - 3 - / - 4 - / - 6 - / - 7 - / - 9 - N - T - Z - - 2 - 7 - 1 - - - 3 - / - 4 - N - T - Z - - 2 - 1 - 5 - - - 3 - / - 4 - V - T - Z - - 1 - 7 - 1 - - - G - / - H - V - T - Z - - 2 - 1 - 5 - - - G - / - H - - O - I - L - - E - Q - U - A - L - I - S - A - T - I - O - N - 3 - / - 8 - " - - - - - - - - T - H - R - E - A - D - E - D - - O - I - L - S - I - G - H - T - - G - L - A - S - S - - - - - - - - S - C - H - R - A - D - E - R - 1 - / - 4 - " - - - - - - - - S - U - C - T - I - O - N - - R - O - T - A - L - O - C - K - 1 - " - 3 - / - 4 - - - - - - - - D - I - S - C - H - A - R - G - E - - R - O - T - A - L - O - C - K - 1 - " - 1 - / - 4 - - - - - - - - P - T - C - C - R - A - N - K - C - A - S - E - - H - E - A - T - E - R - - - - - - - B - O - L - T - - H - - M - 1 - 2 - - - 5 - 0 - - - - - - - - G - R - O - M - M - E - T - - C - O - M - P - R - E - S - S - I - O - N - - N - O - T - - I - N - C - L - U - D - E - D - A - R - O - U - N - D - - 1 - - M - M - S - I - L - E - N - T - - B - L - O - C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/graphics-svg/src/test/res/embed_image.svg b/graphics-svg/src/test/res/embed_image.svg deleted file mode 100644 index 92bc10a..0000000 --- a/graphics-svg/src/test/res/embed_image.svg +++ /dev/null @@ -1,5689 +0,0 @@ - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - COMPRESSOR 1 CYLINDER - 8501031 - E - W - I - T - H - O - U - T - - O - I - L - - E - Q - U - A - L - I - S - A - T - I - O - N - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 25 - - .98 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 98 - - 3.85 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 68 - - 2.67 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 109 - - 4.29 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 15 - - .60 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 23 - - .90 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 - - .67 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 39 - - 1.52 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 118 - - 4.65 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 123 - - 4.84 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 68 - - 2.68 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 35° - - - - - - - - - - - - - - - - 263 - - 10.34 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 82 - - 3.22 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SUCTION - - D - - I - - S - - C - - H - - A - - R - - G - - E - - - - 142 - - 5.59 - - [ - - ] - - 142 - - 5.60 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ø - - 224 - - 8.83 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 333 - - 13.12 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ø - - 31,75 - - 1.25 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 159 - - 6.26 - - [ - - ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C - - O - - M - - P - - R - - E - - S - - S - - O - - R - - S - - MT/MTZ 18-3/4 - - MT/MTZ 22-3/4/6 - - MT/MTZ 28-3/4/6 - - - - S - U - - C - - T - - I - - O - - N - - - - R - - O - - T - - A - - L - - O - - C - - K - - 1" - - - - D - - I - - S - - C - - H - - A - - R - - G - - E - - - - R - - O - - T - - A - - L - - O - - C - - K - - 1" - - - - P - - T - - C - - - - C - - R - - A - - N - - K - - C - - A - - S - - E - - - - H - - E - - A - - T - - E - - R - - - - S - - C - - H - - R - - A - - D - - E - - R - - 1/4" - - - - B - - O - - L - - T - - - - H - - - - M - - 8 - - - - - 4 - - 0 - - G - - R - - O - - M - - M - - E - - T - - - - C - - O - - M - - P - - R - - E - - S - - S - - I - - O - - N - - - - N - - O - - T - - - - I - - N - - C - - L - - U - - D - - E - - D - - , - - A - - R - - O - - U - - N - - D - - - - 1 - - - - M - - M - - S - - I - - L - - E - - N - - T - - B - - L - - O - - C - - K - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/graphics-svg/src/test/res/embed_image.svgz b/graphics-svg/src/test/res/embed_image.svgz deleted file mode 100644 index fe74789..0000000 Binary files a/graphics-svg/src/test/res/embed_image.svgz and /dev/null differ diff --git a/graphics-svg/src/test/res/missing.svg b/graphics-svg/src/test/res/missing.svg deleted file mode 100644 index d540986..0000000 --- a/graphics-svg/src/test/res/missing.svg +++ /dev/null @@ -1,1090 +0,0 @@ - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 12 - - - - 14 - - - - 11 - - - - N - - - - 2 - - - - 1 - - - - L1 - - - - - - - - - - - - - - - - - - - diff --git a/graphics-svg/src/test/res/missing.svgz b/graphics-svg/src/test/res/missing.svgz deleted file mode 100644 index 051d5e7..0000000 Binary files a/graphics-svg/src/test/res/missing.svgz and /dev/null differ diff --git a/graphics-svg/src/test/res/round_path.svg b/graphics-svg/src/test/res/round_path.svg deleted file mode 100644 index b7e9e05..0000000 --- a/graphics-svg/src/test/res/round_path.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - -]> - - - - - - - \ No newline at end of file diff --git a/graphics-svg/src/test/resources/org/xbib/graphics/svg/test/test.svg b/graphics-svg/src/test/resources/org/xbib/graphics/svg/test/test.svg new file mode 100644 index 0000000..f04b690 --- /dev/null +++ b/graphics-svg/src/test/resources/org/xbib/graphics/svg/test/test.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + Bar Chart + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Shoe + Car + Travel + Computer + + 0 + 10 + 20 + 30 + 40 + 50 + 60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +