From 6d47baba0cf8c94d11bcff8fcacf1c4c049d8be0 Mon Sep 17 00:00:00 2001 From: Keiron Liddle Date: Wed, 29 Nov 2000 03:22:02 +0000 Subject: [PATCH] updated svg stuff for the latest java bindings added some props for units, gradient etc. jstyle'd git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193847 13f79535-47bb-0310-9956-ffa450edef68 --- lib/w3c.jar | Bin 128148 -> 85340 bytes src/codegen/svgproperties.xml | 34 +- .../apache/fop/datatypes/TransformData.java | 2 +- .../apache/fop/dom/svg/GraphicElement.java | 426 ++++++------ .../fop/dom/svg/SVGGradientElementImpl.java | 13 +- .../apache/fop/dom/svg/SVGLengthListImpl.java | 247 ++++--- src/org/apache/fop/dom/svg/SVGListImpl.java | 145 ++-- .../fop/dom/svg/SVGPathElementImpl.java | 478 ++++++------- .../fop/dom/svg/SVGPolygonElementImpl.java | 95 ++- .../fop/dom/svg/SVGPolylineElementImpl.java | 56 +- .../apache/fop/dom/svg/SVGSVGElementImpl.java | 642 ++++++++---------- .../svg/SVGStringListImpl.java} | 92 ++- .../fop/dom/svg/SVGTSpanElementImpl.java | 96 ++- .../fop/dom/svg/SVGTransformListImpl.java | 101 ++- .../apache/fop/render/pdf/SVGRenderer.java | 40 +- src/org/apache/fop/svg/ClipPath.java | 154 +++-- src/org/apache/fop/svg/LinearGradient.java | 11 +- src/org/apache/fop/svg/Pattern.java | 157 ++--- src/org/apache/fop/svg/RadialGradient.java | 11 +- src/org/apache/fop/svg/SVG.java | 2 +- src/org/apache/fop/svg/Switch.java | 218 +++--- 21 files changed, 1539 insertions(+), 1481 deletions(-) rename src/org/apache/fop/{svg/SVGStringList.java => dom/svg/SVGStringListImpl.java} (66%) diff --git a/lib/w3c.jar b/lib/w3c.jar index d9364c330e3f94d2334e17a2d85ab3773fbf8911..88faff7d858adde2500cc2c1a9cb4779adfbaba6 100644 GIT binary patch literal 85340 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 tQG^`m7m=7UCalLRk3yb$h=4transform SVGTransform + + gradientTransform + SVGTransform + d SVGD @@ -183,16 +187,31 @@ pad - gradientUnits - GradientUnits + gradientUnits + GenericUnits + + + patternUnits + GenericUnits + + + patternContentUnits + GenericUnits + + + clipPathUnits + GenericUnits + + + GenericUnits + GenericUnits false Enum userSpaceOnUse - userSpace objectBoundingBox - userSpace + userSpaceOnUse viewBox @@ -201,13 +220,6 @@ String - - gradientTransform - GradientTransform - false - String - - diff --git a/src/org/apache/fop/datatypes/TransformData.java b/src/org/apache/fop/datatypes/TransformData.java index ce0b6dcd3..067712b37 100644 --- a/src/org/apache/fop/datatypes/TransformData.java +++ b/src/org/apache/fop/datatypes/TransformData.java @@ -66,7 +66,7 @@ import java.util.*; * modified Nov 14,2000 Mike Crowe */ public class TransformData { - SVGAnimatedTransformList trans; + SVGAnimatedTransformListImpl trans; /** * set the TransformData given a particular String specifying TransformData and units diff --git a/src/org/apache/fop/dom/svg/GraphicElement.java b/src/org/apache/fop/dom/svg/GraphicElement.java index 676310f37..682bdad1e 100644 --- a/src/org/apache/fop/dom/svg/GraphicElement.java +++ b/src/org/apache/fop/dom/svg/GraphicElement.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "FOP" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.dom.svg; @@ -64,216 +64,194 @@ import org.w3c.dom.events.*; * Graphic objects include rectangles, lines and text * */ -public abstract class GraphicElement extends SVGElementImpl implements SVGTransformable, SVGLangSpace, SVGTests, EventTarget { - protected SVGList reqFeatures; - protected SVGList reqExtensions; - protected SVGList sysLanguage; - SVGAnimatedTransformList transform; - String xmlspace = "default"; - - public SVGElement getNearestViewportElement() - { - Node node = getParentNode(); - while(node != null) { - if(node instanceof SVGGElement) { - return (SVGElement)node; - } else if(node instanceof SVGSVGElement) { - return (SVGElement)node; - } - node = getParentNode(); - } - return null; - } - - public SVGElement getFarthestViewportElement() - { - Node node = getParentNode(); - SVGElement viewport = null; - while(node != null) { - if(node instanceof SVGGElement) { - viewport = (SVGElement)node; - } else if(node instanceof SVGSVGElement) { - viewport = (SVGElement)node; - } - node = getParentNode(); - } - return viewport; - } - - public SVGAnimatedTransformList getTransform() - { - if(transform != null) { - return transform; - } - SVGTransformList stl = new SVGTransformListImpl(); - SVGTransform transform = new SVGTransformImpl(); - stl.appendItem(transform); - SVGAnimatedTransformList atl = new SVGAnimatedTransformListImpl(); - atl.setBaseVal(stl); - return atl; - } - - public void setTransform(SVGAnimatedTransformList transform) - { - this.transform = transform; - } - - public SVGRect getBBox() - { - return null; - } - - /** - * Returns the transformation matrix from current user units (i.e., after - * application of the transform attribute) to the viewport coordinate system - * for the nearestViewportElement. - */ - public SVGMatrix getCTM() - { - return transform.getBaseVal().consolidate().getMatrix(); - } - - /** - * Returns the transformation matrix from current user units (i.e., after - * application of the transform attribute) to the parent user agent's notice - * of a "pixel". For display devices, ideally this represents a physical - * screen pixel. For other devices or environments where physical pixel sizes - * are not known, then an algorithm similar to the CSS2 definition of a "pixel" - * can be used instead. - * This is the matrix that converts from the user space to the position - * on the screen. - */ - public SVGMatrix getScreenCTM() - { - if(transform == null) { - return new SVGMatrixImpl(); - } - Node node = getParentNode(); - SVGMatrix matrix = null; - if(node != null && node instanceof SVGTransformable) { - matrix = ((SVGTransformable)node).getScreenCTM(); - } - if(matrix != null) { - matrix = transform.getBaseVal().consolidate().getMatrix().multiply(matrix); - } else { - matrix = transform.getBaseVal().consolidate().getMatrix(); - } - return matrix; - } - - public SVGMatrix getTransformToElement(SVGElement element) - throws SVGException - { - return null; - } - - public String getXMLlang() - { - return null; - } - - public void setXMLlang(String xmllang) - { - } - - public String getXMLspace() - { - return xmlspace; - } - - public void setXMLspace(String xmlspace) - { - this.xmlspace = xmlspace; - } - - public SVGList getRequiredFeatures( ) - { - return reqFeatures; - } - - public void setRequiredFeatures( SVGList requiredFeatures ) - throws DOMException - { - reqFeatures = requiredFeatures; - } - - public SVGList getRequiredExtensions( ) - { - return reqExtensions; - } - - public void setRequiredExtensions( SVGList requiredExtensions ) - throws DOMException - { - reqExtensions = requiredExtensions; - } - - public boolean hasExtension ( String extension ) - { - return false; - } - - public SVGList getSystemLanguage() - { - return sysLanguage; - } - - public void setSystemLanguage(SVGList systemLanguage) - { - sysLanguage = systemLanguage; - } - - public void addEventListener(String type, - EventListener listener, - boolean useCapture) - { - } - - public void removeEventListener(String type, - EventListener listener, - boolean useCapture) - { - } - - public boolean dispatchEvent(Event evt) -// throws EventException - { - return false; - } - - /** - * Convenience method for implementations of SVGTransformable - * that have children that represents the bounding box - */ - protected SVGRect getChildrenBBox() - { - float minX = 10000000; // a big number - float maxX = -10000000; // a low number - float minY = 10000000; // a big number - float maxY = -10000000; // a low number - NodeList nl = getChildNodes(); - // can width and height be negative?? - for(int count = 0; count < nl.getLength(); count++) { - Node n = nl.item(count); - if(n instanceof SVGTransformable) { - SVGRect r = ((SVGTransformable)n).getBBox(); - if(r != null) { - if(minX > r.getX()) - minX = r.getX(); - if(minY > r.getY()) - minY = r.getY(); - if(maxX < r.getX() + r.getWidth()) - maxX = r.getX() + r.getWidth(); - if(maxY > r.getY() + r.getHeight()) - maxY = r.getY() + r.getHeight(); - } - } - } - SVGRect rect = new SVGRectImpl(); - rect.setX(minX); - rect.setY(minY); - rect.setWidth(maxX - minX); - rect.setHeight(maxY - minY); - return rect; - } +public abstract class GraphicElement extends SVGElementImpl implements SVGTransformable, +SVGLangSpace, SVGTests, EventTarget { + protected SVGStringList reqFeatures; + protected SVGStringList reqExtensions; + protected SVGStringList sysLanguage; + SVGAnimatedTransformList transform; + String xmlspace = "default"; + + public SVGElement getNearestViewportElement() { + Node node = getParentNode(); + while (node != null) { + if (node instanceof SVGGElement) { + return (SVGElement) node; + } else if (node instanceof SVGSVGElement) { + return (SVGElement) node; + } + node = getParentNode(); + } + return null; + } + + public SVGElement getFarthestViewportElement() { + Node node = getParentNode(); + SVGElement viewport = null; + while (node != null) { + if (node instanceof SVGGElement) { + viewport = (SVGElement) node; + } else if (node instanceof SVGSVGElement) { + viewport = (SVGElement) node; + } + node = getParentNode(); + } + return viewport; + } + + public SVGAnimatedTransformList getTransform() { + if (transform != null) { + return transform; + } + SVGTransformList stl = new SVGTransformListImpl(); + SVGTransform transform = new SVGTransformImpl(); + stl.appendItem(transform); + SVGAnimatedTransformListImpl atl = + new SVGAnimatedTransformListImpl(); + atl.setBaseVal(stl); + return atl; + } + + public void setTransform(SVGAnimatedTransformList transform) { + this.transform = transform; + } + + public SVGRect getBBox() { + return null; + } + + /** + * Returns the transformation matrix from current user units (i.e., after + * application of the transform attribute) to the viewport coordinate system + * for the nearestViewportElement. + */ + public SVGMatrix getCTM() { + return transform.getBaseVal().consolidate().getMatrix(); + } + + /** + * Returns the transformation matrix from current user units (i.e., after + * application of the transform attribute) to the parent user agent's notice + * of a "pixel". For display devices, ideally this represents a physical + * screen pixel. For other devices or environments where physical pixel sizes + * are not known, then an algorithm similar to the CSS2 definition of a "pixel" + * can be used instead. + * This is the matrix that converts from the user space to the position + * on the screen. + */ + public SVGMatrix getScreenCTM() { + if (transform == null) { + return new SVGMatrixImpl(); + } + Node node = getParentNode(); + SVGMatrix matrix = null; + if (node != null && node instanceof SVGTransformable) { + matrix = ((SVGTransformable) node).getScreenCTM(); + } + if (matrix != null) { + matrix = transform.getBaseVal().consolidate().getMatrix(). + multiply(matrix); + } else { + matrix = transform.getBaseVal().consolidate().getMatrix(); + } + return matrix; + } + + public SVGMatrix getTransformToElement(SVGElement element) + throws SVGException { + return null; + } + + public String getXMLlang() { + return null; + } + + public void setXMLlang(String xmllang) { + } + + public String getXMLspace() { + return xmlspace; + } + + public void setXMLspace(String xmlspace) { + this.xmlspace = xmlspace; + } + + public SVGStringList getRequiredFeatures() { + return reqFeatures; + } + + public void setRequiredFeatures(SVGStringList requiredFeatures) + throws DOMException { + reqFeatures = requiredFeatures; + } + + public SVGStringList getRequiredExtensions() { + return reqExtensions; + } + + public void setRequiredExtensions(SVGStringList requiredExtensions) + throws DOMException { + reqExtensions = requiredExtensions; + } + + public boolean hasExtension (String extension) { + return false; + } + + public SVGStringList getSystemLanguage() { + return sysLanguage; + } + + public void setSystemLanguage(SVGStringList systemLanguage) { + sysLanguage = systemLanguage; + } + + public void addEventListener(String type, EventListener listener, + boolean useCapture) { + } + + public void removeEventListener(String type, + EventListener listener, boolean useCapture) { + } + + public boolean dispatchEvent(Event evt)// throws EventException + { + return false; + } + + /** + * Convenience method for implementations of SVGTransformable + * that have children that represents the bounding box + */ + protected SVGRect getChildrenBBox() { + float minX = 10000000; // a big number + float maxX = -10000000; // a low number + float minY = 10000000; // a big number + float maxY = -10000000; // a low number + NodeList nl = getChildNodes(); + // can width and height be negative?? + for (int count = 0; count < nl.getLength(); count++) { + Node n = nl.item(count); + if (n instanceof SVGTransformable) { + SVGRect r = ((SVGTransformable) n).getBBox(); + if (r != null) { + if (minX > r.getX()) + minX = r.getX(); + if (minY > r.getY()) + minY = r.getY(); + if (maxX < r.getX() + r.getWidth()) + maxX = r.getX() + r.getWidth(); + if (maxY > r.getY() + r.getHeight()) + maxY = r.getY() + r.getHeight(); + } + } + } + SVGRect rect = new SVGRectImpl(); + rect.setX(minX); + rect.setY(minY); + rect.setWidth(maxX - minX); + rect.setHeight(maxY - minY); + return rect; + } } diff --git a/src/org/apache/fop/dom/svg/SVGGradientElementImpl.java b/src/org/apache/fop/dom/svg/SVGGradientElementImpl.java index f0ea54835..57f6748fb 100644 --- a/src/org/apache/fop/dom/svg/SVGGradientElementImpl.java +++ b/src/org/apache/fop/dom/svg/SVGGradientElementImpl.java @@ -58,16 +58,16 @@ import org.w3c.dom.svg.*; */ public class SVGGradientElementImpl extends SVGURIReferenceImpl implements SVGGradientElement { /* - SVG_SPREADMETHOD_UNKNOWN; - SVG_SPREADMETHOD_PAD; - SVG_SPREADMETHOD_REFLECT; - SVG_SPREADMETHOD_REPEAT; + SVG_SPREADMETHOD_UNKNOWN; + SVG_SPREADMETHOD_PAD; + SVG_SPREADMETHOD_REFLECT; + SVG_SPREADMETHOD_REPEAT; */ SVGAnimatedEnumeration spreadMethod = new SVGAnimatedEnumerationImpl(SVG_SPREADMETHOD_UNKNOWN); SVGAnimatedEnumeration units = new SVGAnimatedEnumerationImpl(SVG_UNIT_TYPE_UNKNOWN); - + SVGAnimatedTransformList gradientTransform; public SVGGradientElementImpl() { } @@ -81,11 +81,12 @@ public class SVGGradientElementImpl extends SVGURIReferenceImpl implements SVGGr } public SVGAnimatedTransformList getGradientTransform() { - return null; + return gradientTransform; } public void setGradientTransform( SVGAnimatedTransformList gradientTransform) { + this.gradientTransform = gradientTransform; } public SVGAnimatedEnumeration getSpreadMethod() { diff --git a/src/org/apache/fop/dom/svg/SVGLengthListImpl.java b/src/org/apache/fop/dom/svg/SVGLengthListImpl.java index 6b33c3218..a3e5466ff 100644 --- a/src/org/apache/fop/dom/svg/SVGLengthListImpl.java +++ b/src/org/apache/fop/dom/svg/SVGLengthListImpl.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "Fop" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.dom.svg; @@ -56,99 +56,142 @@ import org.apache.fop.messaging.MessageHandler; import java.util.*; import org.w3c.dom.svg.*; +import org.w3c.dom.*; /** * a length quantity in XSL */ public class SVGLengthListImpl extends SVGListImpl implements SVGLengthList { - protected float fontsize = 12; - - public void setValueAsString( String valueAsString ) - { - convert(valueAsString); - } - - /** - * set the length given a particular String specifying length and units - */ - public SVGLengthListImpl (String len) { - convert(len); - } - - public SVGLengthListImpl () { - } - - /** - * set the length given a particular String specifying length and units, - * and the font-size (necessary for an em) - */ - public SVGLengthListImpl (String len, int fontsize) - { - this.fontsize = fontsize; - convert(len); - } - - protected void convert(String len) - { - int l = len.length(); - - if (l == 0) { -// MessageHandler.errorln("WARNING: empty length"); - } else { - // could be an array of points, as in for svg:text - int pos; - pos = len.trim().indexOf(" "); - if(pos != -1) { - StringTokenizer st = new StringTokenizer(len.trim()); - while(st.hasMoreTokens()) { - String val = st.nextToken(); - float dvalue = getFloatValue(val, val.length()); - float intValue = dvalue; - appendItem(new Float(intValue)); - } - } else { - float dvalue = getFloatValue(len, l); - appendItem(new Float(dvalue)); - } - } - } - - protected float getFloatValue(String len, int l) - { - int assumed_resolution = 1; // points/pixel - - float dvalue; - try { - if(len.endsWith("in")) { - dvalue = Float.valueOf(len.substring(0,(l-2))).floatValue(); - dvalue = dvalue * 72; - } else if(len.endsWith("cm")) { - dvalue = Float.valueOf(len.substring(0,(l-2))).floatValue(); - dvalue = dvalue * 28.35f; - } else if(len.endsWith("mm")) { - dvalue = Float.valueOf(len.substring(0,(l-2))).floatValue(); - dvalue = dvalue * 2.84f; - } else if(len.endsWith("pt")) { - dvalue = Float.valueOf(len.substring(0,(l-2))).floatValue(); - dvalue = dvalue; - } else if(len.endsWith("pc")) { - dvalue = Float.valueOf(len.substring(0,(l-2))).floatValue(); - dvalue = dvalue * 12; - } else if(len.endsWith("em")) { - dvalue = Float.valueOf(len.substring(0,(l-2))).floatValue(); - dvalue = dvalue * fontsize; - } else if(len.endsWith("px")) { - dvalue = Float.valueOf(len.substring(0,(l-2))).floatValue(); - dvalue = dvalue * assumed_resolution; - } else if(len.endsWith("%")) { - dvalue = Float.valueOf(len.substring(0,(l-1))).floatValue() / 100f; //?? - } else { - dvalue = Float.valueOf(len).floatValue(); - } - } catch (Exception e) { - dvalue = 0; - MessageHandler.errorln("ERROR: unknown length units in " + len); - } - return dvalue; - } + protected float fontsize = 12; + + public void setValueAsString(String valueAsString) { + convert(valueAsString); + } + + /** + * set the length given a particular String specifying length and units + */ + public SVGLengthListImpl (String len) { + convert(len); + } + + public SVGLengthListImpl () { + } + + /** + * set the length given a particular String specifying length and units, + * and the font-size (necessary for an em) + */ + public SVGLengthListImpl (String len, int fontsize) { + this.fontsize = fontsize; + convert(len); + } + + protected void convert(String len) { + int l = len.length(); + + if (l == 0) { + // MessageHandler.errorln("WARNING: empty length"); + } else { + // could be an array of points, as in for svg:text + int pos; + pos = len.trim().indexOf(" "); + if (pos != -1) { + StringTokenizer st = new StringTokenizer(len.trim()); + while (st.hasMoreTokens()) { + String val = st.nextToken(); + float dvalue = getFloatValue(val, val.length()); + float intValue = dvalue; + SVGLengthImpl impl = new SVGLengthImpl(); + impl.setValue(intValue); + appendItem(impl); + } + } else { + float dvalue = getFloatValue(len, l); + SVGLengthImpl impl = new SVGLengthImpl(); + impl.setValue(dvalue); + appendItem(impl); + } + } + } + + protected float getFloatValue(String len, int l) { + int assumed_resolution = 1; // points/pixel + + float dvalue; + try { + if (len.endsWith("in")) { + dvalue = Float.valueOf( + len.substring(0, (l - 2))).floatValue(); + dvalue = dvalue * 72; + } else if (len.endsWith("cm")) { + dvalue = Float.valueOf( + len.substring(0, (l - 2))).floatValue(); + dvalue = dvalue * 28.35f; + } else if (len.endsWith("mm")) { + dvalue = Float.valueOf( + len.substring(0, (l - 2))).floatValue(); + dvalue = dvalue * 2.84f; + } else if (len.endsWith("pt")) { + dvalue = Float.valueOf( + len.substring(0, (l - 2))).floatValue(); + dvalue = dvalue; + } else if (len.endsWith("pc")) { + dvalue = Float.valueOf( + len.substring(0, (l - 2))).floatValue(); + dvalue = dvalue * 12; + } else if (len.endsWith("em")) { + dvalue = Float.valueOf( + len.substring(0, (l - 2))).floatValue(); + dvalue = dvalue * fontsize; + } else if (len.endsWith("px")) { + dvalue = Float.valueOf( + len.substring(0, (l - 2))).floatValue(); + dvalue = dvalue * assumed_resolution; + } else if (len.endsWith("%")) { + dvalue = Float.valueOf( + len.substring(0, (l - 1))).floatValue() / 100f; //?? + } else { + dvalue = Float.valueOf(len).floatValue(); + } + } catch (Exception e) { + dvalue = 0; + MessageHandler.errorln("ERROR: unknown length units in " + len); + } + return dvalue; + } + + public SVGLength initialize (SVGLength newItem) throws SVGException { + return null; + } + + public SVGLength createItem() { + return new SVGLengthImpl(); + } + + public SVGLength getItem(int index) throws DOMException { + Object obj = list.elementAt(index); + return (SVGLength) obj; + } + + public SVGLength removeItem(int index) throws DOMException { + Object obj = list.elementAt(index); + list.removeElementAt(index); + return (SVGLength) obj; + } + + public SVGLength appendItem(SVGLength newItem) throws SVGException { + list.addElement(newItem); + return null; + } + + public SVGLength replaceItem(SVGLength newItem, + int index) throws DOMException, SVGException { + return null; + } + + public SVGLength insertItemBefore(SVGLength newItem, + int index) throws SVGException { + return null; + } } diff --git a/src/org/apache/fop/dom/svg/SVGListImpl.java b/src/org/apache/fop/dom/svg/SVGListImpl.java index 2f519193c..c7aaa3e93 100644 --- a/src/org/apache/fop/dom/svg/SVGListImpl.java +++ b/src/org/apache/fop/dom/svg/SVGListImpl.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "FOP" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.dom.svg; @@ -58,66 +58,63 @@ import org.w3c.dom.*; /** * */ -public class SVGListImpl implements SVGList { - Vector list = new Vector(); - - public int getNumberOfItems( ) - { - return list.size(); - } - - public void clear() - { - list.removeAllElements(); - } - - public Object initialize ( Object newItem ) - throws SVGException - { - return null; - } - - public Object createItem() - { - return null; - } - - public Object getItem(int index) - throws DOMException - { - Object obj = list.elementAt(index); - return obj; - } - - public Object insertItemBefore(Object newItem, int index) - throws SVGException - { - return null; - } - - public Object replaceItem(Object newItem, int index) - throws DOMException, SVGException - { - return null; - } - - public Object removeItem(int index) - throws DOMException - { - Object obj = list.elementAt(index); - list.removeElementAt(index); - return obj; - } - - public Object appendItem(Object newItem) - throws SVGException - { - list.addElement(newItem); - return null; - } - - public String toString() - { - return list.toString(); - } +public class SVGListImpl { + Vector list = new Vector(); + + public int getNumberOfItems() { + return list.size(); + } + + public void clear() { + list.removeAllElements(); + } + + /* public Object initialize ( Object newItem ) + throws SVGException + { + return null; + } + + public Object createItem() + { + return null; + } + + public Object getItem(int index) + throws DOMException + { + Object obj = list.elementAt(index); + return obj; + } + + public Object insertItemBefore(Object newItem, int index) + throws SVGException + { + return null; + } + + public Object replaceItem(Object newItem, int index) + throws DOMException, SVGException + { + return null; + } + + public Object removeItem(int index) + throws DOMException + { + Object obj = list.elementAt(index); + list.removeElementAt(index); + return obj; + } + + public Object appendItem(Object newItem) + throws SVGException + { + list.addElement(newItem); + return null; + }*/ + + public String toString() { + return list.toString(); + } } diff --git a/src/org/apache/fop/dom/svg/SVGPathElementImpl.java b/src/org/apache/fop/dom/svg/SVGPathElementImpl.java index cf5d29b39..6834d288e 100644 --- a/src/org/apache/fop/dom/svg/SVGPathElementImpl.java +++ b/src/org/apache/fop/dom/svg/SVGPathElementImpl.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "FOP" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.dom.svg; @@ -60,220 +60,242 @@ import org.w3c.dom.svg.*; */ public class SVGPathElementImpl extends GraphicElement implements SVGPathElement { - public Vector pathElements; - - /** - * construct a line graphic - */ - public SVGPathElementImpl(Vector v) - { - this.pathElements = v; - } - - public SVGAnimatedNumber getPathLength() - { - return null; - } - - public SVGRect getBBox() - { - float minX = 10000000; // a big number - float maxX = -10000000; // a low number - float minY = 10000000; // a big number - float maxY = -10000000; // a low number - // the bounds of a path is always within the end points and - // the control points, so adjust the min and max to be these extremes - for(Enumeration e = pathElements.elements(); e.hasMoreElements(); ) { - SVGPathSegImpl pc = (SVGPathSegImpl)e.nextElement(); - float[] vals = pc.getValues(); - switch(pc.getPathSegType()) { - case SVGPathSeg.PATHSEG_MOVETO_ABS: - break; - case SVGPathSeg.PATHSEG_MOVETO_REL: - break; - case SVGPathSeg.PATHSEG_LINETO_ABS: - break; - case SVGPathSeg.PATHSEG_LINETO_REL: - break; - case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS: - break; - case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL: - break; - case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS: - break; - case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL: - break; - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS: - break; - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL: - break; - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: - break; - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL: - break; - case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS: - break; - case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL: - break; - case SVGPathSeg.PATHSEG_ARC_ABS: - break; - case SVGPathSeg.PATHSEG_ARC_REL: - break; - case SVGPathSeg.PATHSEG_CLOSEPATH: - break; - } - } - SVGRect rect = new SVGRectImpl(); - rect.setX(minX); - rect.setY(minY); - rect.setWidth(maxX - minX); - rect.setHeight(maxY - minY); - return rect; - } - - public void setPathLength( SVGAnimatedNumber length ) - { - } - - public SVGList getPathSegList() - { - return null; - } - - public SVGList getNormalizedPathSegList() - { - return null; - } - - public float getTotalLength() - { - return 0; - } - - public SVGPoint getPointAtLength(float distance) - throws SVGException - { - return null; - } - - public int getPathSegAtLength(float distance) - throws SVGException - { - return 0; - } - - public short getPathSegType( ) - { - return 0; - } - - public String getPathSegTypeAsLetter( ) - { - return null; - } - - public SVGPathSegClosePath createSVGPathSegClosePath ( ) - { - return null; - } - - public SVGPathSegMovetoAbs createSVGPathSegMovetoAbs ( float x, float y ) - { - return null; - } - - public SVGPathSegMovetoRel createSVGPathSegMovetoRel ( float x, float y ) - { - return null; - } - - public SVGPathSegLinetoAbs createSVGPathSegLinetoAbs ( float x, float y ) - { - return null; - } - - public SVGPathSegLinetoRel createSVGPathSegLinetoRel ( float x, float y ) - { - return null; - } - - public SVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs ( float x, float y, float x1, float y1, float x2, float y2 ) - { - return null; - } - - public SVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel ( float x, float y, float x1, float y1, float x2, float y2 ) - { - return null; - } - - public SVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs ( float x, float y, float x1, float y1 ) - { - return null; - } - - public SVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel ( float x, float y, float x1, float y1 ) - { - return null; - } - - public SVGPathSegArcAbs createSVGPathSegArcAbs ( float x, float y, float r1, float r2, float angle, boolean largeArcFlag, boolean sweepFlag ) - { - return null; - } - - public SVGPathSegArcRel createSVGPathSegArcRel ( float x, float y, float r1, float r2, float angle, boolean largeArcFlag, boolean sweepFlag ) - { - return null; - } - - public SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs ( float x ) - { - return null; - } - - public SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel ( float x ) - { - return null; - } - - public SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs ( float y ) - { - return null; - } - - public SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel ( float y ) - { - return null; - } - - public SVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs ( float x, float y, float x2, float y2 ) - { - return null; - } - - public SVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel ( float x, float y, float x2, float y2 ) - { - return null; - } - - public SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs ( float x, float y ) - { - return null; - } - - public SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel ( float x, float y ) - { - return null; - } - - public SVGList getAnimatedPathSegList( ) - { - return null; - } - - public SVGList getAnimatedNormalizedPathSegList( ) - { - return null; - } + public Vector pathElements; + + /** + * construct a line graphic + */ + public SVGPathElementImpl(Vector v) { + this.pathElements = v; + } + + public SVGAnimatedNumber getPathLength() { + return null; + } + + public SVGRect getBBox() { + float minX = 10000000; // a big number + float maxX = -10000000; // a low number + float minY = 10000000; // a big number + float maxY = -10000000; // a low number + // the bounds of a path is always within the end points and + // the control points, so adjust the min and max to be these extremes + float lastx = 0; + float lasty = 0; + float lastmovex = 0; + float lastmovey = 0; + float[] cxs; + float tempx; + float tempy; + float lastcx = 0; + float lastcy = 0; + for (Enumeration e = pathElements.elements(); + e.hasMoreElements();) { + SVGPathSegImpl pc = (SVGPathSegImpl) e.nextElement(); + float[] vals = pc.getValues(); + switch (pc.getPathSegType()) { + case SVGPathSeg.PATHSEG_MOVETO_ABS: + lastx = vals[0]; + lasty = vals[1]; + break; + case SVGPathSeg.PATHSEG_MOVETO_REL: + break; + case SVGPathSeg.PATHSEG_LINETO_ABS: + lastx = vals[0]; + lasty = vals[1]; + break; + case SVGPathSeg.PATHSEG_LINETO_REL: + lastx += vals[0]; + lasty += vals[1]; + break; + case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS: + lasty = vals[0]; + break; + case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL: + lasty += vals[0]; + break; + case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS: + lastx = vals[0]; + break; + case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL: + lastx += vals[0]; + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS: + lastx = vals[4]; + lasty = vals[5]; + lastcx = vals[2]; + lastcy = vals[3]; + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL: + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL: + break; + case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS: + break; + case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL: + break; + case SVGPathSeg.PATHSEG_ARC_ABS: + break; + case SVGPathSeg.PATHSEG_ARC_REL: + break; + case SVGPathSeg.PATHSEG_CLOSEPATH: + break; + } + if (lastx < minX) { + minX = lastx; + } + if (lastx > maxX) { + maxX = lastx; + } + if (lasty < minY) { + minY = lasty; + } + if (lasty > minX) { + maxY = lasty; + } + } + SVGRect rect = new SVGRectImpl(); + rect.setX(minX); + rect.setY(minY); + rect.setWidth(maxX - minX); + rect.setHeight(maxY - minY); + return rect; + } + + public void setPathLength(SVGAnimatedNumber length) { + } + + public SVGPathSegList getPathSegList() { + return null; + } + + public SVGPathSegList getNormalizedPathSegList() { + return null; + } + + public float getTotalLength() { + return 0; + } + + public SVGPoint getPointAtLength(float distance) throws SVGException { + return null; + } + + public int getPathSegAtLength(float distance) throws SVGException { + return 0; + } + + public short getPathSegType() { + return 0; + } + + public String getPathSegTypeAsLetter() { + return null; + } + + public SVGPathSegClosePath createSVGPathSegClosePath () { + return null; + } + + public SVGPathSegMovetoAbs createSVGPathSegMovetoAbs (float x, + float y) { + return null; + } + + public SVGPathSegMovetoRel createSVGPathSegMovetoRel (float x, + float y) { + return null; + } + + public SVGPathSegLinetoAbs createSVGPathSegLinetoAbs (float x, + float y) { + return null; + } + + public SVGPathSegLinetoRel createSVGPathSegLinetoRel (float x, + float y) { + return null; + } + + public SVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs ( + float x, float y, float x1, float y1, float x2, float y2) { + return null; + } + + public SVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel ( + float x, float y, float x1, float y1, float x2, float y2) { + return null; + } + + public SVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs ( + float x, float y, float x1, float y1) { + return null; + } + + public SVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel ( + float x, float y, float x1, float y1) { + return null; + } + + public SVGPathSegArcAbs createSVGPathSegArcAbs (float x, float y, + float r1, float r2, float angle, boolean largeArcFlag, + boolean sweepFlag) { + return null; + } + + public SVGPathSegArcRel createSVGPathSegArcRel (float x, float y, + float r1, float r2, float angle, boolean largeArcFlag, + boolean sweepFlag) { + return null; + } + + public SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs ( + float x) { + return null; + } + + public SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel ( + float x) { + return null; + } + + public SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs ( + float y) { + return null; + } + + public SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel ( + float y) { + return null; + } + + public SVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs ( + float x, float y, float x2, float y2) { + return null; + } + + public SVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel ( + float x, float y, float x2, float y2) { + return null; + } + + public SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs ( + float x, float y) { + return null; + } + + public SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel ( + float x, float y) { + return null; + } + + public SVGPathSegList getAnimatedPathSegList() { + return null; + } + + public SVGPathSegList getAnimatedNormalizedPathSegList() { + return null; + } } diff --git a/src/org/apache/fop/dom/svg/SVGPolygonElementImpl.java b/src/org/apache/fop/dom/svg/SVGPolygonElementImpl.java index 0c5e150c6..a247c1267 100644 --- a/src/org/apache/fop/dom/svg/SVGPolygonElementImpl.java +++ b/src/org/apache/fop/dom/svg/SVGPolygonElementImpl.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "FOP" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.dom.svg; @@ -60,42 +60,37 @@ import org.w3c.dom.svg.*; */ public class SVGPolygonElementImpl extends GraphicElement implements SVGPolygonElement { - public Vector points; - - public SVGPolygonElementImpl(Vector p) - { - this.points = p; - } - - public SVGList getPoints( ) - { - return null; - } - - public SVGList getAnimatedPoints( ) - { - return null; - } - - public SVGRect getBBox() - { - float minX = 10000000; // a big number - float maxX = -10000000; // a low number - float minY = 10000000; // a big number - float maxY = -10000000; // a low number - for(Enumeration e = points.elements(); e.hasMoreElements(); ) { - e.nextElement(); - } - SVGRect rect = new SVGRectImpl(); - rect.setX(minX); - rect.setY(minY); - rect.setWidth(maxX - minX); - rect.setHeight(maxY - minY); - return rect; - } - - public String getTagName() - { - return "polygon"; - } + public Vector points; + + public SVGPolygonElementImpl(Vector p) { + this.points = p; + } + + public SVGPointList getPoints() { + return null; + } + + public SVGPointList getAnimatedPoints() { + return null; + } + + public SVGRect getBBox() { + float minX = 10000000; // a big number + float maxX = -10000000; // a low number + float minY = 10000000; // a big number + float maxY = -10000000; // a low number + for (Enumeration e = points.elements(); e.hasMoreElements();) { + e.nextElement(); + } + SVGRect rect = new SVGRectImpl(); + rect.setX(minX); + rect.setY(minY); + rect.setWidth(maxX - minX); + rect.setHeight(maxY - minY); + return rect; + } + + public String getTagName() { + return "polygon"; + } } diff --git a/src/org/apache/fop/dom/svg/SVGPolylineElementImpl.java b/src/org/apache/fop/dom/svg/SVGPolylineElementImpl.java index 9d0f04e54..88e774406 100644 --- a/src/org/apache/fop/dom/svg/SVGPolylineElementImpl.java +++ b/src/org/apache/fop/dom/svg/SVGPolylineElementImpl.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "FOP" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.dom.svg; @@ -60,29 +60,17 @@ import org.w3c.dom.svg.*; */ public class SVGPolylineElementImpl extends GraphicElement implements SVGPolylineElement { - public Vector points; - - public SVGPolylineElementImpl(Vector p) - { - this.points = p; - } - - public SVGList getPoints() - { - return null; - } + public Vector points; - public SVGList getAnimatedPoints( ) - { - return null; - } + public SVGPolylineElementImpl(Vector p) { + this.points = p; + } -/* public SVGAnimatedBoolean getExternalResourcesRequired( ) - { - return null; - } + public SVGPointList getPoints() { + return null; + } - public void setExternalResourcesRequired( SVGAnimatedBoolean externalResourcesRequired ) - { - }*/ + public SVGPointList getAnimatedPoints() { + return null; + } } diff --git a/src/org/apache/fop/dom/svg/SVGSVGElementImpl.java b/src/org/apache/fop/dom/svg/SVGSVGElementImpl.java index 8c5c69f40..1a574d309 100644 --- a/src/org/apache/fop/dom/svg/SVGSVGElementImpl.java +++ b/src/org/apache/fop/dom/svg/SVGSVGElementImpl.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "Fop" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.dom.svg; @@ -71,342 +71,290 @@ import org.w3c.dom.*; * */ public class SVGSVGElementImpl extends GraphicElement implements SVGSVGElement { - SVGAnimatedLength x; - SVGAnimatedLength y; - SVGAnimatedLength width; - SVGAnimatedLength height; - - public SVGSVGElementImpl() - { - } - - public SVGAnimatedLength getX( ) - { - return x; - } - - public SVGAnimatedLength getY( ) - { - return y; - } - - public SVGAnimatedLength getWidth( ) - { - return width; - } - - public SVGAnimatedLength getHeight( ) - { - return height; - } - - public void setWidth(SVGAnimatedLength w) - { - width = w; - } - - public void setHeight(SVGAnimatedLength h) - { - height = h; - } - - public void setX(SVGAnimatedLength x) - { - this.x = x; - } - - public void setY(SVGAnimatedLength y) - { - this.y = y; - } - - public SVGRect getViewport( ) - { - return null; - } - - public SVGRect getBBox() - { + SVGAnimatedLength x; + SVGAnimatedLength y; + SVGAnimatedLength width; + SVGAnimatedLength height; + + public SVGSVGElementImpl() { + } + + public SVGAnimatedLength getX() { + return x; + } + + public SVGAnimatedLength getY() { + return y; + } + + public SVGAnimatedLength getWidth() { + return width; + } + + public SVGAnimatedLength getHeight() { + return height; + } + + public void setWidth(SVGAnimatedLength w) { + width = w; + } + + public void setHeight(SVGAnimatedLength h) { + height = h; + } + + public void setX(SVGAnimatedLength x) { + this.x = x; + } + + public void setY(SVGAnimatedLength y) { + this.y = y; + } + + public SVGRect getViewport() { + return null; + } + + public SVGRect getBBox() { return getChildrenBBox(); } - public String getContentScriptType( ) - { - return null; - } - - public void setContentScriptType( String contentScriptType ) - { - } - - public String getContentStyleType( ) - { - return null; - } - - public void setContentStyleType( String contentStyleType ) - { - } - -/* public CSSValue getPresentationAttribute ( String name ) - { - CSSStyleDeclaration style; - style = getStyle(); - CSSValue val; - val = style.getPropertyCSSValue(name); - if(val == null) { - // get "style" element style for this - } - if(val == null) { - // get element parents style - Node par = getParentNode(); - if(par instanceof SVGStylable) { - val = ((SVGStylable)par).getPresentationAttribute(name); - } - } - return val; - }*/ - - public SVGPoint getCurrentTranslate( ) - { - return null; - } - - public void setCurrentTranslate( SVGPoint currentTranslate ) - { - } - - public SVGViewSpec getCurrentView( ) - { - return null; - } - - public void deSelectAll() - { - } - - public NodeList getIntersectionList ( SVGRect rect, SVGElement referenceElement ) - { - return null; - } - - public NodeList getEnclosureList ( SVGRect rect, SVGElement referenceElement ) - { - return null; - } - - public boolean checkIntersection ( SVGElement element, SVGRect rect ) - { - return false; - } - - public boolean checkEnclosure ( SVGElement element, SVGRect rect ) - { - return false; - } - - public float getPixelUnitToMillimeterX( ) - { - return 0; - } - - public float getPixelUnitToMillimeterY( ) - { - return 0; - } - - public float getScreenPixelToMillimeterX( ) - { - return 0; - } - - public float getScreenPixelToMillimeterY( ) - { - return 0; - } - - public boolean getUseCurrentView( ) - { - return true; - } - - public void setUseCurrentView( boolean useCurrentView ) - { - } - - public float getCurrentScale( ) - { - return 0; - } - - public void setCurrentScale( float currentScale ) - { - } - - public int suspendRedraw ( int max_wait_milliseconds ) - { - return 0; - } - - public void unsuspendRedraw ( int suspend_handle_id ) - { - } - - public void unsuspendRedrawAll ( ) - { - } - - public void forceRedraw ( ) - { - } - - public void pauseAnimations ( ) - { - } - - public void unpauseAnimations ( ) - { - } - - public boolean animationsPaused () - { - return true; - } - - public float getCurrentTime() - { - return 0; - } - - public void setCurrentTime ( float seconds ) - { - } - - public SVGLength createSVGLength ( ) - { - return new SVGLengthImpl(); - } - - public SVGAngle createSVGAngle ( ) - { - return new SVGAngleImpl(); - } - - public SVGPoint createSVGPoint ( ) - { - return null; - } - - public SVGMatrix createSVGMatrix ( ) - { - return new SVGMatrixImpl(); - } - - public SVGRect createSVGRect ( ) - { - return new SVGRectImpl(); - } - - public SVGTransform createSVGTransform ( ) - { - return new SVGTransformImpl(); - } - - public SVGTransform createSVGTransformFromMatrix ( SVGMatrix matrix ) - { - SVGTransform trans = new SVGTransformImpl(); - trans.setMatrix(matrix); - return trans; - } - - public RGBColor createRGBColor ( ) - { - return null; - } - - public SVGICCColor createSVGICCColor ( ) - { - return null; - } - - public Element getElementById ( String elementId ) - { - return null; - } - - public short getZoomAndPan( ) - { - return 0; - } - - public void setZoomAndPan( short zoomAndPan ) - { - } - - public SVGAnimatedRect getViewBox() - { - return null; - } - - public SVGAnimatedPreserveAspectRatio getPreserveAspectRatio( ) - { - return null; - } - - public CSSStyleDeclaration getComputedStyle(Element el, String str) - { - return null; - } - - public CSSStyleDeclaration getOverrideStyle(Element el, String str) - { - return null; - } - - public StyleSheetList getStyleSheets() - { - NodeList nl = getElementsByTagName("style"); - Vector shs = new Vector(); - for(int count = 0; count < nl.getLength(); count++) { - Node el = (Node)nl.item(count); - SVGStyleElementImpl sse = (SVGStyleElementImpl)el; - StyleSheet sheet = sse.getStyleSheet(); - shs.addElement(sheet); - } - return new StyleSheetListImpl(shs); - } - - public Event createEvent(String str) - { - return null; - } - - public DocumentView getDocument() - { - return null; - } - - public Node appendChild(Node newChild) - throws DOMException - { - Node nChild = super.appendChild(newChild); - if(newChild instanceof SVGElementImpl) { - SVGElementImpl ele = (SVGElementImpl)newChild; - ele.setOwnerSVG(this); - } - setOwnerSVG(this); - return nChild; - } - - public void setOwnerSVG(SVGSVGElement owner) - { - ownerSvg = owner; - NodeList nl = getChildNodes(); - for(int count = 0; count < nl.getLength(); count++) { - Node n = nl.item(count); - if(n instanceof SVGElementImpl) { - ((SVGElementImpl)n).setOwnerSVG(this); - } - } - } + public String getContentScriptType() { + return null; + } + + public void setContentScriptType(String contentScriptType) { + } + + public String getContentStyleType() { + return null; + } + + public void setContentStyleType(String contentStyleType) { + } + + /* public CSSValue getPresentationAttribute ( String name ) + { + CSSStyleDeclaration style; + style = getStyle(); + CSSValue val; + val = style.getPropertyCSSValue(name); + if(val == null) { + // get "style" element style for this + } + if(val == null) { + // get element parents style + Node par = getParentNode(); + if(par instanceof SVGStylable) { + val = ((SVGStylable)par).getPresentationAttribute(name); + } + } + return val; + }*/ + + public SVGPoint getCurrentTranslate() { + return null; + } + + public void setCurrentTranslate(SVGPoint currentTranslate) { + } + + public SVGViewSpec getCurrentView() { + return null; + } + + public void deSelectAll() { + } + + public NodeList getIntersectionList (SVGRect rect, + SVGElement referenceElement) { + return null; + } + + public NodeList getEnclosureList (SVGRect rect, + SVGElement referenceElement) { + return null; + } + + public boolean checkIntersection (SVGElement element, SVGRect rect) { + return false; + } + + public boolean checkEnclosure (SVGElement element, SVGRect rect) { + return false; + } + + public float getPixelUnitToMillimeterX() { + return 0; + } + + public float getPixelUnitToMillimeterY() { + return 0; + } + + public float getScreenPixelToMillimeterX() { + return 0; + } + + public float getScreenPixelToMillimeterY() { + return 0; + } + + public boolean getUseCurrentView() { + return true; + } + + public void setUseCurrentView(boolean useCurrentView) { + } + + public float getCurrentScale() { + return 0; + } + + public void setCurrentScale(float currentScale) { + } + + public int suspendRedraw (int max_wait_milliseconds) { + return 0; + } + + public void unsuspendRedraw (int suspend_handle_id) { + } + + public void unsuspendRedrawAll () { + } + + public void forceRedraw () { + } + + public void pauseAnimations () { + } + + public void unpauseAnimations () { + } + + public boolean animationsPaused () { + return true; + } + + public float getCurrentTime() { + return 0; + } + + public void setCurrentTime (float seconds) { + } + + public SVGLength createSVGLength () { + return new SVGLengthImpl(); + } + + public SVGAngle createSVGAngle () { + return new SVGAngleImpl(); + } + + public SVGPoint createSVGPoint () { + return null; + } + + public SVGMatrix createSVGMatrix () { + return new SVGMatrixImpl(); + } + + public SVGRect createSVGRect () { + return new SVGRectImpl(); + } + + public SVGTransform createSVGTransform () { + return new SVGTransformImpl(); + } + + public SVGTransform createSVGTransformFromMatrix (SVGMatrix matrix) { + SVGTransform trans = new SVGTransformImpl(); + trans.setMatrix(matrix); + return trans; + } + + public RGBColor createRGBColor () { + return null; + } + + public SVGICCColor createSVGICCColor () { + return null; + } + + public Element getElementById (String elementId) { + return null; + } + + public short getZoomAndPan() { + return 0; + } + + public void setZoomAndPan(short zoomAndPan) { + } + + public SVGAnimatedRect getViewBox() { + return null; + } + + public SVGAnimatedPreserveAspectRatio getPreserveAspectRatio() { + return null; + } + + public CSSStyleDeclaration getComputedStyle(Element el, String str) { + return null; + } + + public CSSStyleDeclaration getOverrideStyle(Element el, String str) { + return null; + } + + public StyleSheetList getStyleSheets() { + NodeList nl = getElementsByTagName("style"); + Vector shs = new Vector(); + for (int count = 0; count < nl.getLength(); count++) { + Node el = (Node) nl.item(count); + SVGStyleElementImpl sse = (SVGStyleElementImpl) el; + StyleSheet sheet = sse.getStyleSheet(); + shs.addElement(sheet); + } + return new StyleSheetListImpl(shs); + } + + public Event createEvent(String str) { + return null; + } + + public SVGNumber createSVGNumber () { + return null;//new SVGNumberImpl(); + } + + public String createSVGString () { + return new String(); + } + + public DocumentView getDocument() { + return null; + } + + public Node appendChild(Node newChild) throws DOMException { + Node nChild = super.appendChild(newChild); + if (newChild instanceof SVGElementImpl) { + SVGElementImpl ele = (SVGElementImpl) newChild; + ele.setOwnerSVG(this); + } + setOwnerSVG(this); + return nChild; + } + + public void setOwnerSVG(SVGSVGElement owner) { + ownerSvg = owner; + NodeList nl = getChildNodes(); + for (int count = 0; count < nl.getLength(); count++) { + Node n = nl.item(count); + if (n instanceof SVGElementImpl) { + ((SVGElementImpl) n).setOwnerSVG(this); + } + } + } } diff --git a/src/org/apache/fop/svg/SVGStringList.java b/src/org/apache/fop/dom/svg/SVGStringListImpl.java similarity index 66% rename from src/org/apache/fop/svg/SVGStringList.java rename to src/org/apache/fop/dom/svg/SVGStringListImpl.java index 22bbb21fe..e4eccf139 100644 --- a/src/org/apache/fop/svg/SVGStringList.java +++ b/src/org/apache/fop/dom/svg/SVGStringListImpl.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "FOP" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,41 +41,69 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ -package org.apache.fop.svg; +package org.apache.fop.dom.svg; import org.apache.fop.dom.svg.*; +import org.w3c.dom.svg.*; +import org.w3c.dom.*; import java.util.*; /** * */ -class SVGStringList extends SVGListImpl { - public SVGStringList(String str) - { - parseString(str); - } - - void parseString(String str) - { - StringTokenizer st = new StringTokenizer(str, ", \n\r\t:;"); - while(st.hasMoreTokens()) { - String item = st.nextToken(); - appendItem(item); - } - } - - public Object createItem() - { - return new String(); - } +public class SVGStringListImpl extends SVGListImpl implements SVGStringList { + public SVGStringListImpl(String str) { + parseString(str); + } + + void parseString(String str) { + StringTokenizer st = new StringTokenizer(str, ", \n\r\t:;"); + while (st.hasMoreTokens()) { + String item = st.nextToken(); + appendItem(item); + } + } + + public String initialize (String newItem) throws SVGException { + return null; + } + + public String createItem() { + return new String(); + } + + public String getItem(int index) throws DOMException { + Object obj = list.elementAt(index); + return (String) obj; + } + + public String removeItem(int index) throws DOMException { + Object obj = list.elementAt(index); + list.removeElementAt(index); + return (String) obj; + } + + public String appendItem(String newItem) throws SVGException { + list.addElement(newItem); + return null; + } + + public String replaceItem(String newItem, + int index) throws DOMException, SVGException { + return null; + } + public String insertItemBefore(String newItem, + int index) throws SVGException { + return null; + } } diff --git a/src/org/apache/fop/dom/svg/SVGTSpanElementImpl.java b/src/org/apache/fop/dom/svg/SVGTSpanElementImpl.java index 8e281c13a..209c693ee 100644 --- a/src/org/apache/fop/dom/svg/SVGTSpanElementImpl.java +++ b/src/org/apache/fop/dom/svg/SVGTSpanElementImpl.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "FOP" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.dom.svg; @@ -59,43 +59,37 @@ import org.w3c.dom.svg.*; * */ public class SVGTSpanElementImpl extends SVGTextContentElementImpl implements SVGTSpanElement { - public String str; - public int dx = 0; - public int dy = 0; - public SVGAnimatedLengthList xlist = null; - public SVGAnimatedLengthList ylist = null; - public SVGAnimatedLengthList dxlist = null; - public SVGAnimatedLengthList dylist = null; - - /** - * - */ - public SVGTSpanElementImpl() - { - } - - public SVGAnimatedLengthList getX( ) - { - return xlist; - } - - public SVGAnimatedLengthList getY( ) - { - return ylist; - } - - public SVGAnimatedLengthList getDx( ) - { - return dxlist; - } - - public SVGAnimatedLengthList getDy( ) - { - return dylist; - } - - public SVGAnimatedTextRotate getRotate( ) - { - return null; - } + public String str; + public int dx = 0; + public int dy = 0; + public SVGAnimatedLengthList xlist = null; + public SVGAnimatedLengthList ylist = null; + public SVGAnimatedLengthList dxlist = null; + public SVGAnimatedLengthList dylist = null; + + /** + * + */ + public SVGTSpanElementImpl() { + } + + public SVGAnimatedLengthList getX() { + return xlist; + } + + public SVGAnimatedLengthList getY() { + return ylist; + } + + public SVGAnimatedLengthList getDx() { + return dxlist; + } + + public SVGAnimatedLengthList getDy() { + return dylist; + } + + public SVGAnimatedNumberList getRotate() { + return null; + } } diff --git a/src/org/apache/fop/dom/svg/SVGTransformListImpl.java b/src/org/apache/fop/dom/svg/SVGTransformListImpl.java index c4a22d487..480cf560e 100644 --- a/src/org/apache/fop/dom/svg/SVGTransformListImpl.java +++ b/src/org/apache/fop/dom/svg/SVGTransformListImpl.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "FOP" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.dom.svg; @@ -59,28 +59,57 @@ import org.w3c.dom.*; * Transform List */ public class SVGTransformListImpl extends SVGListImpl implements SVGTransformList { - public SVGTransform createSVGTransformFromMatrix ( SVGMatrix matrix ) - throws SVGException - { - SVGTransform st = new SVGTransformImpl(); - st.setMatrix(matrix); - return st; - } - - public SVGTransform consolidate() - { - SVGMatrix matrix = new SVGMatrixImpl(); - for(int count = 0; count < getNumberOfItems(); count++) { - SVGMatrix mat = ((SVGTransform)getItem(count)).getMatrix(); - matrix = matrix.multiply(mat); - } - SVGTransform trans = new SVGTransformImpl(); - trans.setMatrix(matrix); - return trans; - } - - public Object createItem() - { - return new SVGTransformImpl(); - } + public SVGTransform createSVGTransformFromMatrix (SVGMatrix matrix) + throws SVGException { + SVGTransform st = new SVGTransformImpl(); + st.setMatrix(matrix); + return st; + } + + public SVGTransform consolidate() { + SVGMatrix matrix = new SVGMatrixImpl(); + for (int count = 0; count < getNumberOfItems(); count++) { + SVGMatrix mat = ((SVGTransform) getItem(count)).getMatrix(); + matrix = matrix.multiply(mat); + } + SVGTransform trans = new SVGTransformImpl(); + trans.setMatrix(matrix); + return trans; + } + + public SVGTransform initialize (SVGTransform newItem) + throws SVGException { + return null; + } + + public SVGTransform createItem() { + return new SVGTransformImpl(); + } + + public SVGTransform getItem(int index) throws DOMException { + Object obj = list.elementAt(index); + return (SVGTransform) obj; + } + + public SVGTransform removeItem(int index) throws DOMException { + Object obj = list.elementAt(index); + list.removeElementAt(index); + return (SVGTransform) obj; + } + + public SVGTransform appendItem(SVGTransform newItem) + throws SVGException { + list.addElement(newItem); + return null; + } + + public SVGTransform replaceItem(SVGTransform newItem, + int index) throws DOMException, SVGException { + return null; + } + + public SVGTransform insertItemBefore(SVGTransform newItem, + int index) throws SVGException { + return null; + } } diff --git a/src/org/apache/fop/render/pdf/SVGRenderer.java b/src/org/apache/fop/render/pdf/SVGRenderer.java index f9181797f..254a53d34 100644 --- a/src/org/apache/fop/render/pdf/SVGRenderer.java +++ b/src/org/apache/fop/render/pdf/SVGRenderer.java @@ -162,9 +162,9 @@ public class SVGRenderer { */ protected void handleSwitchElement(int posx, int posy, SVGSwitchElement ael) { - SVGList relist = ael.getRequiredExtensions(); - SVGList rflist = ael.getRequiredFeatures(); - SVGList sllist = ael.getSystemLanguage(); + SVGStringList relist = ael.getRequiredExtensions(); + SVGStringList rflist = ael.getRequiredFeatures(); + SVGStringList sllist = ael.getSystemLanguage(); NodeList nl = ael.getChildNodes(); choices: for (int count = 0; count < nl.getLength(); count++) { @@ -173,7 +173,7 @@ public class SVGRenderer { // test data if (n instanceof GraphicElement) { GraphicElement graphic = (GraphicElement) n; - SVGList grelist = graphic.getRequiredExtensions(); + SVGStringList grelist = graphic.getRequiredExtensions(); // if null it evaluates to true if (grelist != null) { if (grelist.getNumberOfItems() == 0) { @@ -194,7 +194,7 @@ public class SVGRenderer { } } } - SVGList grflist = graphic.getRequiredFeatures(); + SVGStringList grflist = graphic.getRequiredFeatures(); if (grflist != null) { if (grflist.getNumberOfItems() == 0) { if ((rflist != null) && @@ -224,7 +224,7 @@ public class SVGRenderer { } } } - SVGList gsllist = graphic.getSystemLanguage(); + SVGStringList gsllist = graphic.getSystemLanguage(); if (gsllist != null) { if (gsllist.getNumberOfItems() == 0) { if ((sllist != null) && @@ -730,6 +730,13 @@ public class SVGRenderer { doDrawing(di); } + /** + * Calculate the last control point for a bezier curve. + * This is used to find the last control point for a curve where + * only the first control point is specified. + * The control point is a reflection of the first control point + * which results in an even smooth curve. The curve is symmetrical. + */ protected float[] calculateLastControl(float x1, float y1, float x2, float y2, float relx, float rely) { float vals[] = new float[2]; @@ -1062,6 +1069,11 @@ public class SVGRenderer { SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 0); ay2 = new SVGAnimatedLengthImpl(length); } + SVGAnimatedTransformList an = linear.getGradientTransform(); + SVGMatrix transform = null; + if(an != null) + transform = an.getBaseVal().consolidate().getMatrix(); + System.out.println("gt: " + transform); Vector theCoords = null; if (gradUnits == SVGUnitTypes.SVG_UNIT_TYPE_UNKNOWN) gradUnits = linear.getGradientUnits().getBaseVal(); @@ -2417,20 +2429,20 @@ public class SVGRenderer { xpos = currentX; ypos = currentY; if (ylist.getNumberOfItems() > charPos) { - ypos = baseY + ((Float) ylist.getItem(charPos)). - floatValue(); + ypos = baseY + (ylist.getItem(charPos)). + getValue(); } if (dylist.getNumberOfItems() > charPos) { - ypos = ypos + ((Float) dylist.getItem(charPos)). - floatValue(); + ypos = ypos + (dylist.getItem(charPos)). + getValue(); } if (xlist.getNumberOfItems() > charPos) { - xpos = baseX + ((Float) xlist.getItem(charPos)). - floatValue(); + xpos = baseX + (xlist.getItem(charPos)). + getValue(); } if (dxlist.getNumberOfItems() > charPos) { - xpos = xpos + ((Float) dxlist.getItem(charPos)). - floatValue(); + xpos = xpos + (dxlist.getItem(charPos)). + getValue(); } if (ch > 127) { pdf = pdf.append(transstr + diff --git a/src/org/apache/fop/svg/ClipPath.java b/src/org/apache/fop/svg/ClipPath.java index 42a6f9e4a..65b5562a0 100644 --- a/src/org/apache/fop/svg/ClipPath.java +++ b/src/org/apache/fop/svg/ClipPath.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "FOP" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.svg; @@ -56,11 +56,13 @@ import org.apache.fop.fo.*; import org.apache.fop.layout.Area; import org.apache.fop.layout.FontState; import org.apache.fop.apps.FOPException; +import org.apache.fop.fo.properties.*; import org.apache.fop.dom.svg.*; import org.apache.fop.dom.svg.SVGArea; import org.w3c.dom.svg.SVGElement; +import org.w3c.dom.svg.*; /** * class representing svg:ClipPath pseudo flow object. @@ -68,63 +70,73 @@ import org.w3c.dom.svg.SVGElement; */ public class ClipPath extends SVGObj { - /** - * inner class for making ClipPath objects. - */ - public static class Maker extends FObj.Maker { - - /** - * make a ClipPath object. - * - * @param parent the parent formatting object - * @param propertyList the explicit properties of this object - * - * @return the ClipPath object - */ - public FObj make(FObj parent, PropertyList propertyList) throws FOPException - { - return new ClipPath(parent, propertyList); - } - } - - /** - * returns the maker for this object. - * - * @return the maker for ClipPath objects - */ - public static FObj.Maker maker() { - return new ClipPath.Maker(); - } - - /** - * constructs a ClipPath object (called by Maker). - * - * @param parent the parent formatting object - * @param propertyList the explicit properties of this object - */ - protected ClipPath(FObj parent, PropertyList propertyList) { - super(parent, propertyList); - this.name = "svg:clipPath"; - } - - SVGClipPathElementImpl clippath = new SVGClipPathElementImpl(); - - protected void addChild(FONode child) { - super.addChild(child); - if(child instanceof GraphicsCreator) { - GraphicsCreator gc = (GraphicsCreator)child; - SVGElement graph = gc.createGraphic(); - clippath.addElement(graph); -// graph.setParent(clippath); - } else { - // error - } - } - - public SVGElement createGraphic() - { - clippath.setStyle(((SVGStyle)this.properties.get("style")).getStyle()); - clippath.setId(this.properties.get("id").getString()); - return clippath; - } + /** + * inner class for making ClipPath objects. + */ + public static class Maker extends FObj.Maker { + + /** + * make a ClipPath object. + * + * @param parent the parent formatting object + * @param propertyList the explicit properties of this object + * + * @return the ClipPath object + */ + public FObj make(FObj parent, + PropertyList propertyList) throws FOPException { + return new ClipPath(parent, propertyList); + } + } + + /** + * returns the maker for this object. + * + * @return the maker for ClipPath objects + */ + public static FObj.Maker maker() { + return new ClipPath.Maker(); + } + + /** + * constructs a ClipPath object (called by Maker). + * + * @param parent the parent formatting object + * @param propertyList the explicit properties of this object + */ + protected ClipPath(FObj parent, PropertyList propertyList) { + super(parent, propertyList); + this.name = "svg:clipPath"; + } + + SVGClipPathElementImpl clippath = new SVGClipPathElementImpl(); + + protected void addChild(FONode child) { + super.addChild(child); + if (child instanceof GraphicsCreator) { + GraphicsCreator gc = (GraphicsCreator) child; + SVGElement graph = gc.createGraphic(); + clippath.addElement(graph); + // graph.setParent(clippath); + } else { + // error + } + } + + public SVGElement createGraphic() { + clippath.setStyle( + ((SVGStyle) this.properties.get("style")).getStyle()); + clippath.setId(this.properties.get("id").getString()); + switch ((this.properties.get("clipPathUnits")).getEnum()) { + case GenericUnits.Enums.USER_SPACE_ON_USE: + clippath.setClipPathUnits( new SVGAnimatedEnumerationImpl( + SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE)); + break; + case GenericUnits.Enums.OBJECT_BOUNDING_BOX: + clippath.setClipPathUnits( new SVGAnimatedEnumerationImpl( + SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)); + break; + } + return clippath; + } } diff --git a/src/org/apache/fop/svg/LinearGradient.java b/src/org/apache/fop/svg/LinearGradient.java index 7452ca75f..2f4be86ae 100644 --- a/src/org/apache/fop/svg/LinearGradient.java +++ b/src/org/apache/fop/svg/LinearGradient.java @@ -125,6 +125,9 @@ public class LinearGradient extends SVGObj { linear.setTransform( ((SVGTransform) this.properties.get("transform")). getTransform()); + linear.setGradientTransform( + ((SVGTransform) this.properties.get("gradientTransform")). + getTransform()); linear.setId(this.properties.get("id").getString()); String rf = this.properties.get("xlink:href").getString(); linear.setHref(new SVGAnimatedStringImpl(rf)); @@ -162,15 +165,11 @@ public class LinearGradient extends SVGObj { break; } switch ((this.properties.get("gradientUnits")).getEnum()) { - case GradientUnits.USER_SPACE: - linear.setGradientUnits( new SVGAnimatedEnumerationImpl( - SVGUnitTypes.SVG_UNIT_TYPE_USERSPACE)); - break; - case GradientUnits.USER_SPACE_ON_USE: + case GenericUnits.Enums.USER_SPACE_ON_USE: linear.setGradientUnits( new SVGAnimatedEnumerationImpl( SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE)); break; - case GradientUnits.OBJECT_BOUNDING_BOX: + case GenericUnits.Enums.OBJECT_BOUNDING_BOX: linear.setGradientUnits( new SVGAnimatedEnumerationImpl( SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)); break; diff --git a/src/org/apache/fop/svg/Pattern.java b/src/org/apache/fop/svg/Pattern.java index eebbdb3ec..5f3a852f2 100644 --- a/src/org/apache/fop/svg/Pattern.java +++ b/src/org/apache/fop/svg/Pattern.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "FOP" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.svg; @@ -68,47 +68,47 @@ import org.w3c.dom.svg.*; */ public class Pattern extends SVGObj { - /** - * inner class for making Pattern objects. - */ - public static class Maker extends FObj.Maker { - - /** - * make a Pattern object. - * - * @param parent the parent formatting object - * @param propertyList the explicit properties of this object - * - * @return the Pattern object - */ - public FObj make(FObj parent, PropertyList propertyList) throws FOPException - { - return new Pattern(parent, propertyList); - } - } - - /** - * returns the maker for this object. - * - * @return the maker for Pattern objects - */ - public static FObj.Maker maker() { - return new Pattern.Maker(); - } - - /** - * constructs a Pattern object (called by Maker). - * - * @param parent the parent formatting object - * @param propertyList the explicit properties of this object - */ - protected Pattern(FObj parent, PropertyList propertyList) { - super(parent, propertyList); - this.name = "svg:pattern"; - } + /** + * inner class for making Pattern objects. + */ + public static class Maker extends FObj.Maker { + + /** + * make a Pattern object. + * + * @param parent the parent formatting object + * @param propertyList the explicit properties of this object + * + * @return the Pattern object + */ + public FObj make(FObj parent, + PropertyList propertyList) throws FOPException { + return new Pattern(parent, propertyList); + } + } + + /** + * returns the maker for this object. + * + * @return the maker for Pattern objects + */ + public static FObj.Maker maker() { + return new Pattern.Maker(); + } + + /** + * constructs a Pattern object (called by Maker). + * + * @param parent the parent formatting object + * @param propertyList the explicit properties of this object + */ + protected Pattern(FObj parent, PropertyList propertyList) { + super(parent, propertyList); + this.name = "svg:pattern"; + } public SVGElement createGraphic() { - SVGPatternElementImpl pattern = new SVGPatternElementImpl(); + SVGPatternElementImpl pattern = new SVGPatternElementImpl(); String rf = this.properties.get("xlink:href").getString(); pattern.setHref(new SVGAnimatedStringImpl(rf)); SVGLength width = @@ -117,44 +117,45 @@ public class Pattern extends SVGObj { SVGLength height = ((SVGLengthProperty) this.properties.get("height")). getSVGLength(); - SVGLength x = - ((SVGLengthProperty) this.properties.get("x")). - getSVGLength(); + SVGLength x = ((SVGLengthProperty) this.properties.get("x")). + getSVGLength(); SVGLength y = ((SVGLengthProperty) this.properties.get("y")). - getSVGLength(); + getSVGLength(); pattern.setX(x == null ? null : new SVGAnimatedLengthImpl(x)); pattern.setY(y == null ? null : new SVGAnimatedLengthImpl(y)); - pattern.setWidth(width == null ? null : new SVGAnimatedLengthImpl(width)); - pattern.setHeight(height == null ? null : new SVGAnimatedLengthImpl(height)); - pattern.setPatternTransform(((SVGTransform) this.properties.get("transform")). + pattern.setWidth(width == null ? null : + new SVGAnimatedLengthImpl(width)); + pattern.setHeight(height == null ? null : + new SVGAnimatedLengthImpl(height)); + pattern.setPatternTransform( + ((SVGTransform) this.properties.get("transform")). getTransform()); pattern.setId(this.properties.get("id").getString()); - int numChildren = this.children.size(); - for (int i = 0; i < numChildren; i++) { - FONode child = (FONode) children.elementAt(i); - if(child instanceof GraphicsCreator) { - SVGElement impl = ((GraphicsCreator)child).createGraphic(); - if(impl != null) { - if(impl instanceof SVGElementImpl) - ((SVGElementImpl)impl).setClassName(new SVGAnimatedStringImpl(((FObj)child).getProperty("class").getString())); - pattern.appendChild(impl); - } - } - } - switch ((this.properties.get("gradientUnits")).getEnum()) { - case GradientUnits.USER_SPACE: - pattern.setPatternUnits( new SVGAnimatedEnumerationImpl( - SVGUnitTypes.SVG_UNIT_TYPE_USERSPACE)); - break; - case GradientUnits.USER_SPACE_ON_USE: + int numChildren = this.children.size(); + for (int i = 0; i < numChildren; i++) { + FONode child = (FONode) children.elementAt(i); + if (child instanceof GraphicsCreator) { + SVGElement impl = ((GraphicsCreator) child).createGraphic(); + if (impl != null) { + if (impl instanceof SVGElementImpl) + ((SVGElementImpl) impl).setClassName( + new SVGAnimatedStringImpl( + ((FObj) child).getProperty( + "class").getString())); + pattern.appendChild(impl); + } + } + } + switch ((this.properties.get("patternUnits")).getEnum()) { + case GenericUnits.Enums.USER_SPACE_ON_USE: pattern.setPatternUnits( new SVGAnimatedEnumerationImpl( SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE)); break; - case GradientUnits.OBJECT_BOUNDING_BOX: + case GenericUnits.Enums.OBJECT_BOUNDING_BOX: pattern.setPatternUnits( new SVGAnimatedEnumerationImpl( SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)); break; } - return pattern; + return pattern; } } diff --git a/src/org/apache/fop/svg/RadialGradient.java b/src/org/apache/fop/svg/RadialGradient.java index 395f0fceb..36a4770ee 100644 --- a/src/org/apache/fop/svg/RadialGradient.java +++ b/src/org/apache/fop/svg/RadialGradient.java @@ -125,6 +125,9 @@ public class RadialGradient extends SVGObj { radial.setTransform( ((SVGTransform) this.properties.get("transform")). getTransform()); + radial.setGradientTransform( + ((SVGTransform) this.properties.get("gradientTransform")). + getTransform()); radial.setId(this.properties.get("id").getString()); String rf = this.properties.get("xlink:href").getString(); radial.setHref(new SVGAnimatedStringImpl(rf)); @@ -150,15 +153,11 @@ public class RadialGradient extends SVGObj { radial.setFy(length == null ? null : new SVGAnimatedLengthImpl(length)); switch ((this.properties.get("gradientUnits")).getEnum()) { - case GradientUnits.USER_SPACE: - radial.setGradientUnits( new SVGAnimatedEnumerationImpl( - SVGUnitTypes.SVG_UNIT_TYPE_USERSPACE)); - break; - case GradientUnits.USER_SPACE_ON_USE: + case GenericUnits.Enums.USER_SPACE_ON_USE: radial.setGradientUnits( new SVGAnimatedEnumerationImpl( SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE)); break; - case GradientUnits.OBJECT_BOUNDING_BOX: + case GenericUnits.Enums.OBJECT_BOUNDING_BOX: radial.setGradientUnits( new SVGAnimatedEnumerationImpl( SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)); break; diff --git a/src/org/apache/fop/svg/SVG.java b/src/org/apache/fop/svg/SVG.java index 99df234ce..bbf2d3634 100644 --- a/src/org/apache/fop/svg/SVG.java +++ b/src/org/apache/fop/svg/SVG.java @@ -119,7 +119,7 @@ public class SVG extends FObj implements GraphicsCreator { SVGLength h = ((SVGLengthProperty) this.properties.get("height")). getSVGLength(); svgArea = new SVGSVGElementImpl(); - SVGAnimatedLength sal; + SVGAnimatedLengthImpl sal; if (w == null) w = new SVGLengthImpl(); sal = new SVGAnimatedLengthImpl(w); diff --git a/src/org/apache/fop/svg/Switch.java b/src/org/apache/fop/svg/Switch.java index 486752f02..caece1c73 100644 --- a/src/org/apache/fop/svg/Switch.java +++ b/src/org/apache/fop/svg/Switch.java @@ -1,36 +1,36 @@ -/*-- $Id$ -- +/*-- $Id$ -- ============================================================================ The Apache Software License, Version 1.1 ============================================================================ - + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - + Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: - + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - + 2. 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. - + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - + 4. The names "FOP" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - + 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 @@ -41,12 +41,12 @@ 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. - + This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache + James Tauber . For more information on the Apache Software Foundation, please see . - + */ package org.apache.fop.svg; @@ -67,101 +67,101 @@ import org.w3c.dom.svg.*; */ public class Switch extends SVGObj { - /** - * inner class for making Line objects. - */ - public static class Maker extends FObj.Maker { - - /** - * make a Line object. - * - * @param parent the parent formatting object - * @param propertyList the explicit properties of this object - * - * @return the Line object - */ - public FObj make(FObj parent, PropertyList propertyList) throws FOPException - { - return new Switch(parent, propertyList); - } - } - - /** - * returns the maker for this object. - * - * @return the maker for Switch objects - */ - public static FObj.Maker maker() { - return new Switch.Maker(); - } - - /** - * constructs a Switch object (called by Maker). - * - * @param parent the parent formatting object - * @param propertyList the explicit properties of this object - */ - protected Switch(FObj parent, PropertyList propertyList) { - super(parent, propertyList); - this.name = "svg:switch"; - } - - public SVGElement createGraphic() - { - /* - * There are two options - * 1) add all children and select the correct one when rendering - * 2) select the correct one now and return it rather than a switch element - * Since renderers may have different ideas, leave it up to the renderer - * to select the correct one. - */ - String rf = this.properties.get("requiredFeatures").getString(); - String re = this.properties.get("requiredExtensions").getString(); - String sl = this.properties.get("systemLanguage").getString(); - SVGList strlist; - GraphicElement graphic; - graphic = new SVGSwitchElementImpl(); - if(!rf.equals("notpresent")) { - strlist = new SVGStringList(rf); - graphic.setRequiredFeatures(strlist); - } - if(!re.equals("notpresent")) { - strlist = new SVGStringList(re); - graphic.setRequiredExtensions(strlist); - } - if(!sl.equals("notpresent")) { - strlist = new SVGStringList(sl); - graphic.setSystemLanguage(strlist); - } - - int numChildren = this.children.size(); - for (int i = 0; i < numChildren; i++) { - FONode child = (FONode) children.elementAt(i); - if(child instanceof GraphicsCreator) { - SVGElement impl = ((GraphicsCreator)child).createGraphic(); - if(impl instanceof SVGTests) { - SVGTests testable = (SVGTests)impl; - rf = child.getProperty("requiredFeatures").getString(); - re = child.getProperty("requiredExtensions").getString(); - sl = child.getProperty("systemLanguage").getString(); - if(!rf.equals("notpresent")) { - strlist = new SVGStringList(rf); - testable.setRequiredFeatures(strlist); - } - if(!re.equals("notpresent")) { - strlist = new SVGStringList(re); - testable.setRequiredExtensions(strlist); - } - if(!sl.equals("notpresent")) { - strlist = new SVGStringList(sl); - testable.setSystemLanguage(strlist); - } - graphic.appendChild((GraphicElement)impl); - } - } else if(child instanceof Defs) { - } - } - - return graphic; - } + /** + * inner class for making Line objects. + */ + public static class Maker extends FObj.Maker { + + /** + * make a Line object. + * + * @param parent the parent formatting object + * @param propertyList the explicit properties of this object + * + * @return the Line object + */ + public FObj make(FObj parent, + PropertyList propertyList) throws FOPException { + return new Switch(parent, propertyList); + } + } + + /** + * returns the maker for this object. + * + * @return the maker for Switch objects + */ + public static FObj.Maker maker() { + return new Switch.Maker(); + } + + /** + * constructs a Switch object (called by Maker). + * + * @param parent the parent formatting object + * @param propertyList the explicit properties of this object + */ + protected Switch(FObj parent, PropertyList propertyList) { + super(parent, propertyList); + this.name = "svg:switch"; + } + + public SVGElement createGraphic() { + /* + * There are two options + * 1) add all children and select the correct one when rendering + * 2) select the correct one now and return it rather than a switch element + * Since renderers may have different ideas, leave it up to the renderer + * to select the correct one. + */ + String rf = this.properties.get("requiredFeatures").getString(); + String re = this.properties.get("requiredExtensions").getString(); + String sl = this.properties.get("systemLanguage").getString(); + SVGStringListImpl strlist; + GraphicElement graphic; + graphic = new SVGSwitchElementImpl(); + if (!rf.equals("notpresent")) { + strlist = new SVGStringListImpl(rf); + graphic.setRequiredFeatures(strlist); + } + if (!re.equals("notpresent")) { + strlist = new SVGStringListImpl(re); + graphic.setRequiredExtensions(strlist); + } + if (!sl.equals("notpresent")) { + strlist = new SVGStringListImpl(sl); + graphic.setSystemLanguage(strlist); + } + + int numChildren = this.children.size(); + for (int i = 0; i < numChildren; i++) { + FONode child = (FONode) children.elementAt(i); + if (child instanceof GraphicsCreator) { + SVGElement impl = ((GraphicsCreator) child).createGraphic(); + if (impl instanceof GraphicElement) { + GraphicElement testable = (GraphicElement) impl; + rf = child.getProperty("requiredFeatures").getString(); + re = child.getProperty( + "requiredExtensions").getString(); + sl = child.getProperty("systemLanguage").getString(); + if (!rf.equals("notpresent")) { + strlist = new SVGStringListImpl(rf); + testable.setRequiredFeatures(strlist); + } + if (!re.equals("notpresent")) { + strlist = new SVGStringListImpl(re); + testable.setRequiredExtensions(strlist); + } + if (!sl.equals("notpresent")) { + strlist = new SVGStringListImpl(sl); + testable.setSystemLanguage(strlist); + } + graphic.appendChild((GraphicElement) impl); + } + } else if (child instanceof Defs) { + } + } + + return graphic; + } } -- 2.39.5