deweese     2004/12/01 17:24:37

  Modified:    sources/org/apache/batik/bridge RepaintManager.java
                        SVGTextElementBridge.java
               sources/org/apache/batik/bridge/svg12
                        SVGFlowRootElementBridge.java
               sources/org/apache/batik/ext/awt/geom Cubic.java
                        Quadradic.java
               sources/org/apache/batik/gvt ShapeNode.java
               sources/org/apache/batik/gvt/flow FlowGlyphLayout.java
                        LineInfo.java
               sources/org/apache/batik/util RunnableQueue.java
               test-references/samples/tests/spec12/text flowText.png
  Log:
  1) Refactored the text and flow bridges so make things cleaner.
  2) Now using QuadCurve2d/CubicCurve2D methods to solve cubic/quadradic eqns.
  3) Fixed potential interrupted bug in the RunnableQueue class.
  
  Revision  Changes    Path
  1.17      +2 -2      
xml-batik/sources/org/apache/batik/bridge/RepaintManager.java
  
  Index: RepaintManager.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/RepaintManager.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- RepaintManager.java       18 Aug 2004 07:12:32 -0000      1.16
  +++ RepaintManager.java       2 Dec 2004 01:24:36 -0000       1.17
  @@ -38,7 +38,7 @@
    * @version $Id$
    */
   public class RepaintManager {
  -    final static int COPY_OVERHEAD      = 1000;
  +    final static int COPY_OVERHEAD      = 10000;
       final static int COPY_LINE_OVERHEAD = 10;
   
       /**
  
  
  
  1.101     +49 -78    
xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java
  
  Index: SVGTextElementBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java,v
  retrieving revision 1.100
  retrieving revision 1.101
  diff -u -r1.100 -r1.101
  --- SVGTextElementBridge.java 21 Nov 2004 21:20:23 -0000      1.100
  +++ SVGTextElementBridge.java 2 Dec 2004 01:24:36 -0000       1.101
  @@ -194,6 +194,29 @@
           return new Point2D.Float(x, y);
       }
   
  +    protected boolean isTextElement(Element e) {
  +        if (!SVG_NAMESPACE_URI.equals(e.getNamespaceURI()))
  +            return false;
  +        String nodeName = e.getLocalName();
  +        return (nodeName.equals(SVG_TEXT_TAG) ||
  +                nodeName.equals(SVG_TSPAN_TAG) ||
  +                nodeName.equals(SVG_ALT_GLYPH_TAG) ||
  +                nodeName.equals(SVG_A_TAG) ||
  +                nodeName.equals(SVG_TEXT_PATH_TAG) ||
  +                nodeName.equals(SVG_TREF_TAG));
  +    }
  +
  +    protected boolean isTextChild(Element e) {
  +        if (!SVG_NAMESPACE_URI.equals(e.getNamespaceURI()))
  +            return false;
  +        String nodeName = e.getLocalName();
  +        return (nodeName.equals(SVG_TSPAN_TAG) ||
  +                nodeName.equals(SVG_ALT_GLYPH_TAG) ||
  +                nodeName.equals(SVG_A_TAG) ||
  +                nodeName.equals(SVG_TEXT_PATH_TAG) ||
  +                nodeName.equals(SVG_TREF_TAG));
  +    }
  +
       /**
        * Builds using the specified BridgeContext and element, the
        * specified graphics node.
  @@ -360,24 +383,19 @@
           //in the case of <title> or <desc> or <metadata>, the layout
           //is unchanged
           switch( childNode.getNodeType() ){
  -            case Node.TEXT_NODE:
  -            case Node.CDATA_SECTION_NODE:
  +        case Node.TEXT_NODE:
  +        case Node.CDATA_SECTION_NODE:
  +            laidoutText = null;
  +            break;
  +        case Node.ELEMENT_NODE: {
  +            Element childElement = (Element)childNode;
  +            if (isTextChild(childElement)) {
  +                addContextToChild( ctx, childElement);
                   laidoutText = null;
  -                break;
  -            case Node.ELEMENT_NODE:
  -                if (SVG_NAMESPACE_URI.equals(childNode.getNamespaceURI())) {
  -                    String nodeName = childNode.getLocalName();
  -                    if (nodeName.equals(SVG_TSPAN_TAG) ||
  -                        nodeName.equals(SVG_ALT_GLYPH_TAG) ||
  -                        nodeName.equals(SVG_A_TAG) ||
  -                        nodeName.equals(SVG_TEXT_PATH_TAG) ||
  -                        nodeName.equals(SVG_TREF_TAG)) {
  -                        addContextToChild( ctx, (Element)childNode );
  -                        laidoutText = null;
  -                    }
  -                }
  -                break;
  -            default:
  +            }
  +        }
  +            break;
  +        default:
           }
           if (laidoutText == null) {
               computeLaidoutText(ctx, e, node);
  @@ -403,7 +421,7 @@
        */
       public void handleDOMChildNodeRemovedEvent(MutationEvent evt) {
           Node childNode = (Node)evt.getTarget();
  -        
  +
           //check the type of the node inserted before discard the layout
           //in the case of <title> or <desc> or <metadata>, the layout
           //is unchanged
  @@ -415,17 +433,9 @@
                       laidoutText = null;
                   }
                   break;
  -            case Node.ELEMENT_NODE:
  -                if (SVG_NAMESPACE_URI.equals(childNode.getNamespaceURI())) {
  -                    String nodeName = childNode.getLocalName();
  -                    if (nodeName.equals(SVG_TSPAN_TAG) ||
  -                        nodeName.equals(SVG_ALT_GLYPH_TAG) ||
  -                        nodeName.equals(SVG_A_TAG) ||
  -                        nodeName.equals(SVG_TEXT_PATH_TAG) ||
  -                        nodeName.equals(SVG_TREF_TAG)) {
  -                        
  -                        laidoutText = null;
  -                    }
  +            case Node.ELEMENT_NODE: 
  +                if (isTextChild((Element)childNode)) {
  +                    laidoutText = null;
                   }
                   break;
               default:
  @@ -469,21 +479,7 @@
        */
       protected boolean isParentDisplayed(Node childNode) {
           Node parentNode = childNode.getParentNode();
  -        if (parentNode.getNodeType() == Node.ELEMENT_NODE) {
  -            if (SVG_NAMESPACE_URI.equals(parentNode.getNamespaceURI())) {
  -                String nodeName = parentNode.getLocalName();
  -                if (nodeName.equals(SVG_TEXT_TAG) ||
  -                    nodeName.equals(SVG_TSPAN_TAG) ||
  -                    nodeName.equals(SVG_ALT_GLYPH_TAG) ||
  -                    nodeName.equals(SVG_A_TAG) ||
  -                    nodeName.equals(SVG_TEXT_PATH_TAG) ||
  -                    nodeName.equals(SVG_TREF_TAG)) {
  -                
  -                    return true;
  -                }
  -            }
  -        }
  -        return false;
  +        return isTextElement((Element)parentNode);
       }
   
       /**
  @@ -562,19 +558,11 @@
           for (Node child = element.getFirstChild();
                child != null;
                child = child.getNextSibling()) {
  -            if (child.getNodeType() != Node.ELEMENT_NODE) {
  -                continue;
  -            }
  -            if (!SVG_NAMESPACE_URI.equals(child.getNamespaceURI())) {
  +            if (child.getNodeType() != Node.ELEMENT_NODE) 
                   continue;
  -            }
  -            String ln = child.getLocalName();
  -            if (ln.equals(SVG_TSPAN_TAG) ||
  -                ln.equals(SVG_ALT_GLYPH_TAG) ||
  -                ln.equals(SVG_A_TAG) ||
  -                ln.equals(SVG_TEXT_PATH_TAG) ||
  -                ln.equals(SVG_TREF_TAG)) {
  -                Element childElement = (Element)child;
  +
  +            Element childElement = (Element)child;
  +            if (isTextChild(childElement)) {
                   addNullPaintAttributes(as, childElement, ctx);
               }
           }
  @@ -1259,19 +1247,10 @@
           for (Node child = element.getFirstChild();
                child != null;
                child = child.getNextSibling()) {
  -            if (child.getNodeType() != Node.ELEMENT_NODE) {
  -                continue;
  -            }
  -            if (!SVG_NAMESPACE_URI.equals(child.getNamespaceURI()))
  -                continue;
  +            if (child.getNodeType() != Node.ELEMENT_NODE) continue;
   
  -            String ln = child.getLocalName();
  -            if (ln.equals(SVG_TSPAN_TAG) ||
  -                ln.equals(SVG_ALT_GLYPH_TAG) ||
  -                ln.equals(SVG_A_TAG) ||
  -                ln.equals(SVG_TEXT_PATH_TAG) ||
  -                ln.equals(SVG_TREF_TAG)) {
  -                Element childElement = (Element)child;
  +            Element childElement = (Element)child;
  +            if (isTextChild(childElement)) {
                   addGlyphPositionAttributes(as, childElement, ctx);
               }
           }
  @@ -1308,16 +1287,8 @@
               if (child.getNodeType() != Node.ELEMENT_NODE) {
                   continue;
               }
  -            if (!SVG_NAMESPACE_URI.equals(child.getNamespaceURI()))
  -                continue;
  -
               Element childElement = (Element)child;
  -            String ln = child.getLocalName();
  -            if (ln.equals(SVG_TSPAN_TAG) ||
  -                ln.equals(SVG_ALT_GLYPH_TAG) ||
  -                ln.equals(SVG_A_TAG) ||
  -                ln.equals(SVG_TEXT_PATH_TAG) ||
  -                ln.equals(SVG_TREF_TAG)) {
  +            if (isTextChild(childElement)) {
                   TextPaintInfo pi = getTextPaintInfo(childElement, node,
                                                           parentPI, ctx);
                   addPaintAttributes(as, childElement, node, pi, ctx);
  
  
  
  1.2       +52 -191   
xml-batik/sources/org/apache/batik/bridge/svg12/SVGFlowRootElementBridge.java
  
  Index: SVGFlowRootElementBridge.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/bridge/svg12/SVGFlowRootElementBridge.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SVGFlowRootElementBridge.java     18 Nov 2004 01:46:55 -0000      1.1
  +++ SVGFlowRootElementBridge.java     2 Dec 2004 01:24:37 -0000       1.2
  @@ -146,6 +146,34 @@
           return new Point2D.Float(0,0);
       }
   
  +    protected boolean isTextElement(Element e) {
  +        if (!SVG_NAMESPACE_URI.equals(e.getNamespaceURI()))
  +            return false;
  +        String nodeName = e.getLocalName();
  +        return (nodeName.equals(SVG12Constants.SVG_FLOW_DIV_TAG) ||
  +                nodeName.equals(SVG12Constants.SVG_FLOW_LINE_TAG) ||
  +                nodeName.equals(SVG12Constants.SVG_FLOW_PARA_TAG) ||
  +                nodeName.equals(SVG12Constants.SVG_FLOW_REGION_BREAK_TAG) ||
  +                nodeName.equals(SVG12Constants.SVG_FLOW_SPAN_TAG));
  +    }
  +
  +    protected boolean isTextChild(Element e) {
  +        if (!SVG_NAMESPACE_URI.equals(e.getNamespaceURI()))
  +            return false;
  +        String nodeName = e.getLocalName();
  +        return (nodeName.equals(SVG12Constants.SVG_A_TAG) ||
  +                nodeName.equals(SVG12Constants.SVG_FLOW_LINE_TAG) ||
  +                nodeName.equals(SVG12Constants.SVG_FLOW_PARA_TAG) ||
  +                nodeName.equals(SVG12Constants.SVG_FLOW_REGION_BREAK_TAG) ||
  +                nodeName.equals(SVG12Constants.SVG_FLOW_SPAN_TAG));
  +    }
  +    
  +    protected void computeLaidoutText(BridgeContext ctx, 
  +                                       Element e,
  +                                       GraphicsNode node) {
  +        super.computeLaidoutText(ctx, getFlowDivElement(e), node);
  +    }
  +
       /**
        * Creates the attributed string which represents the given text
        * element children.
  @@ -184,204 +212,35 @@
           System.out.println(brkStr);
       }
   
  -    /**
  -     * Adds glyph position attributes to an AttributedString.
  -     */
  -    protected void addGlyphPositionAttributes(AttributedString as,
  -                                              Element element,
  -                                              BridgeContext ctx) {
  -        if (element.getNodeType()     != Node.ELEMENT_NODE) return;
  -        String eNS = element.getNamespaceURI();
  -        if ((!eNS.equals(getNamespaceURI())) &&
  -            (!eNS.equals(SVG_NAMESPACE_URI)))
  -            return;
  -        if (element.getLocalName()    != SVG12Constants.SVG_FLOW_ROOT_TAG) {
  -            // System.out.println("Elem: " + element);
  -            super.addGlyphPositionAttributes(as, element, ctx);
  -            return;
  -        }
  -
  -        for (Node n = element.getFirstChild();
  -             n != null; n = n.getNextSibling()) {
  -            if (n.getNodeType()     != Node.ELEMENT_NODE) continue;
  -            String nNS = n.getNamespaceURI();
  -            if ((!getNamespaceURI().equals(nNS)) &&
  -                (!SVG_NAMESPACE_URI.equals(nNS))) {
  -                continue;
  -            }
  -            Element e = (Element)n;
  -            String ln = e.getLocalName();
  -            if (ln.equals(SVG12Constants.SVG_FLOW_DIV_TAG)) {
  -                // System.out.println("D Elem: " + e);
  -                super.addGlyphPositionAttributes(as, e, ctx);
  -                return;
  -            }
  -        }
  -    }
  -
  -    protected void addChildGlyphPositionAttributes(AttributedString as,
  -                                                   Element element,
  -                                                   BridgeContext ctx) {
  -        // Add Paint attributres for children of text element
  -        for (Node child = element.getFirstChild();
  -             child != null;
  -             child = child.getNextSibling()) {
  -            if (child.getNodeType() != Node.ELEMENT_NODE) {
  -                continue;
  -            }
  -            String cNS = child.getNamespaceURI();
  -            if ((!getNamespaceURI().equals(cNS)) &&
  -                (!SVG_NAMESPACE_URI.equals(cNS))) {
  -                continue;
  -            }
  -            String ln = child.getLocalName();
  -            if (ln.equals(SVG12Constants.SVG_FLOW_PARA_TAG) ||
  -                ln.equals(SVG12Constants.SVG_FLOW_REGION_BREAK_TAG) ||
  -                ln.equals(SVG12Constants.SVG_FLOW_LINE_TAG) ||
  -                ln.equals(SVG12Constants.SVG_FLOW_SPAN_TAG) ||
  -                ln.equals(SVG12Constants.SVG_A_TAG) ||
  -                ln.equals(SVG12Constants.SVG_TREF_TAG)) {
  -                addGlyphPositionAttributes(as, (Element)child, ctx);
  -            }
  -        }
  -    }
  +    protected Element getFlowDivElement(Element elem) {
  +        String eNS = elem.getNamespaceURI();
  +        if (!eNS.equals(SVG_NAMESPACE_URI)) return null;
   
  -    protected void addNullPaintAttributes(AttributedString as, 
  -                                          Element element,
  -                                          BridgeContext ctx) {
  -        if (element.getNodeType() != Node.ELEMENT_NODE) return;
  -        String eNS = element.getNamespaceURI();
  -        if ((!eNS.equals(getNamespaceURI())) &&
  -            (!eNS.equals(SVG_NAMESPACE_URI)))
  -            return;
  -        if (element.getLocalName()    != SVG12Constants.SVG_FLOW_ROOT_TAG) {
  -            // System.out.println("Elem: " + element);
  -            super.addNullPaintAttributes(as, element, ctx);
  -            return;
  -        }
  +        String nodeName = elem.getLocalName();
  +        if (nodeName.equals(SVG12Constants.SVG_FLOW_DIV_TAG)) return elem;
   
  -        for (Node n = element.getFirstChild();
  +        if (!nodeName.equals(SVG12Constants.SVG_FLOW_ROOT_TAG)) return null;
  +        
  +        for (Node n = elem.getFirstChild();
                n != null; n = n.getNextSibling()) {
               if (n.getNodeType()     != Node.ELEMENT_NODE) continue;
  -            if (!getNamespaceURI().equals(n.getNamespaceURI())) continue;
  -            Element e = (Element)n;
  -            String ln = e.getLocalName();
  -            if (ln.equals(SVG12Constants.SVG_FLOW_DIV_TAG)) {
  -                // System.out.println("D Elem: " + e);
  -                super.addNullPaintAttributes(as, e, ctx);
  -                return;
  -            }
  -        }
  -    }
  -
   
  -    protected void addChildNullPaintAttributes(AttributedString as,
  -                                               Element element,
  -                                               BridgeContext ctx) {
  -        // Add Paint attributres for children of text element
  -        for (Node child = element.getFirstChild();
  -             child != null;
  -             child = child.getNextSibling()) {
  -            if (child.getNodeType() != Node.ELEMENT_NODE) {
  -                continue;
  -            }
  -            String cNS = child.getNamespaceURI();
  -            if ((!getNamespaceURI().equals(cNS)) &&
  -                (!SVG_NAMESPACE_URI.equals(cNS))) {
  -                continue;
  -            }
  -            String ln = child.getLocalName();
  -            if (ln.equals(SVG12Constants.SVG_FLOW_PARA_TAG) ||
  -                ln.equals(SVG12Constants.SVG_FLOW_REGION_BREAK_TAG) ||
  -                ln.equals(SVG12Constants.SVG_FLOW_LINE_TAG) ||
  -                ln.equals(SVG12Constants.SVG_FLOW_SPAN_TAG) ||
  -                ln.equals(SVG12Constants.SVG_A_TAG) ||
  -                ln.equals(SVG12Constants.SVG_TREF_TAG)) {
  -                Element childElement = (Element)child;
  -                addNullPaintAttributes(as, childElement, ctx);
  -            }
  -        }
  -    }
  -
  -    /**
  -     * Adds painting attributes to an AttributedString.
  -     */
  -    protected void addPaintAttributes(AttributedString as,
  -                                      Element element,
  -                                      TextNode node,
  -                                      TextPaintInfo parentPI,
  -                                      BridgeContext ctx) {
  -        if (element.getNodeType() != Node.ELEMENT_NODE) return;
  -        String eNS = element.getNamespaceURI();
  -        if ((!eNS.equals(getNamespaceURI())) &&
  -            (!eNS.equals(SVG_NAMESPACE_URI)))
  -            return;
  -        if (element.getLocalName()    != SVG12Constants.SVG_FLOW_ROOT_TAG) {
  -            // System.out.println("Elem: " + element);
  -            super.addPaintAttributes(as, element, node, parentPI, ctx);
  -            return;
  -        }
  +            String nNS = n.getNamespaceURI();
  +            if (!SVG_NAMESPACE_URI.equals(nNS)) continue;
   
  -        for (Node n = element.getFirstChild();
  -             n != null; n = n.getNextSibling()) {
  -            if (n.getNodeType()     != Node.ELEMENT_NODE) continue;
  -            if (!getNamespaceURI().equals(n.getNamespaceURI())) continue;
               Element e = (Element)n;
               String ln = e.getLocalName();
  -            if (ln.equals(SVG12Constants.SVG_FLOW_DIV_TAG)) {
  -                // System.out.println("D Elem: " + e);
  -                super.addPaintAttributes(as, e, node, parentPI, ctx);
  -                return;
  -            }
  -        }
  -    }
  -
  -    protected void addChildPaintAttributes(AttributedString as,
  -                                           Element element,
  -                                           TextNode node,
  -                                           TextPaintInfo parentPI,
  -                                           BridgeContext ctx) {
  -        // Add Paint attributres for children of text element
  -        for (Node child = element.getFirstChild();
  -             child != null;
  -             child = child.getNextSibling()) {
  -            if (child.getNodeType() != Node.ELEMENT_NODE) {
  -                continue;
  -            }
  -            String cNS = child.getNamespaceURI();
  -            if ((!getNamespaceURI().equals(cNS)) &&
  -                (!SVG_NAMESPACE_URI.equals(cNS))) {
  -                continue;
  -            }
  -            String ln = child.getLocalName();
  -            if (ln.equals(SVG12Constants.SVG_FLOW_PARA_TAG) ||
  -                ln.equals(SVG12Constants.SVG_FLOW_REGION_BREAK_TAG) ||
  -                ln.equals(SVG12Constants.SVG_FLOW_LINE_TAG) ||
  -                ln.equals(SVG12Constants.SVG_FLOW_SPAN_TAG) ||
  -                ln.equals(SVG12Constants.SVG_A_TAG) ||
  -                ln.equals(SVG12Constants.SVG_TREF_TAG)) {
  -                Element childElement = (Element)child;
  -                TextPaintInfo pi = getTextPaintInfo(childElement, node,
  -                                                    parentPI, ctx);
  -                addPaintAttributes(as, childElement, node, pi, ctx);
  -            }
  +            if (ln.equals(SVG12Constants.SVG_FLOW_DIV_TAG)) 
  +                return e;
           }
  +        return null;
       }
   
  -    protected AttributedString getFlowDiv
  -        (BridgeContext ctx, Element element) {
  -        for (Node n = element.getFirstChild();
  -             n != null; n = n.getNextSibling()) {
  -            if (n.getNodeType()     != Node.ELEMENT_NODE) continue;
  -            if (!getNamespaceURI().equals(n.getNamespaceURI())) continue;
  -            Element e = (Element)n;
  +    protected AttributedString getFlowDiv(BridgeContext ctx, Element 
element) {
  +        Element flowDiv = getFlowDivElement(element);
  +        if (flowDiv == null) return null;
   
  -            String ln = n.getLocalName();
  -            if (ln.equals(SVG12Constants.SVG_FLOW_DIV_TAG)) {
  -                return gatherFlowPara(ctx, e);
  -            }
  -        }
  -        return null;
  +        return gatherFlowPara(ctx, flowDiv);
       }
   
       protected AttributedString gatherFlowPara
  @@ -454,15 +313,17 @@
       }
   
       protected List getRegions(BridgeContext ctx, Element element)  {
  +        // Element comes in as flowDiv element we want flowRoot.
  +        element = (Element)element.getParentNode();
           List ret = new LinkedList();
           for (Node n = element.getFirstChild();
                n != null; n = n.getNextSibling()) {
               
               if (n.getNodeType()     != Node.ELEMENT_NODE) continue;
  -            if (!getNamespaceURI().equals(n.getNamespaceURI())) continue;
  +            if 
(!SVG12Constants.SVG_NAMESPACE_URI.equals(n.getNamespaceURI())) 
  +                continue;
   
               Element e = (Element)n;
  -
               String ln = e.getLocalName();
               if (!SVG12Constants.SVG_FLOW_REGION_TAG.equals(ln))  continue;
   
  @@ -759,8 +620,9 @@
   
           Value v = CSSUtilities.getComputedStyle(element, lineHeightIndex);
           if ((v == ValueConstants.INHERIT_VALUE) ||
  -            (v == SVG12ValueConstants.NORMAL_VALUE)) 
  +            (v == SVG12ValueConstants.NORMAL_VALUE)) {
               return fontSize*1.1f;
  +        }
   
           float lineHeight = v.getFloatValue();
           if (v instanceof ComputedValue)
  @@ -768,7 +630,6 @@
           if ((v instanceof LineHeightValue) &&
               ((LineHeightValue)v).getFontSizeRelative())
               lineHeight *= fontSize;
  -
           return lineHeight;
       }
   }
  
  
  
  1.2       +11 -38    
xml-batik/sources/org/apache/batik/ext/awt/geom/Cubic.java
  
  Index: Cubic.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/ext/awt/geom/Cubic.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Cubic.java        18 Nov 2004 01:46:58 -0000      1.1
  +++ Cubic.java        2 Dec 2004 01:24:37 -0000       1.2
  @@ -8,7 +8,9 @@
   
   package org.apache.batik.ext.awt.geom;
   
  +import java.awt.geom.CubicCurve2D;
   import java.awt.geom.Point2D;
  +import java.awt.geom.QuadCurve2D;
   import java.awt.geom.Rectangle2D;
   
   public class Cubic extends AbstractSegment {
  @@ -63,44 +65,17 @@
           double c0 = 3*(p2-p1);
           double c1 = 6*(p3-p2);
           double c2 = 3*(p4-p3);
  -        double c = c0;
  -        double b = c1-2*c0;
  -        double a = c2-c1+c0;
  -        double det = b*b-4*a*c;
  -        if (det == 0) {
  -            // one real root.
  -            double tv = -b/(2*a);
  -            if ((tv <= 0) || (tv >= 1)) return;
  +        double [] eqn = { c0, c1-2*c0, c2-c1+c0 };
  +        int roots = QuadCurve2D.solveQuadratic(eqn);
  +        for (int r=0; r<roots; r++) {
  +            double tv = eqn[r];
  +            if ((tv <= 0) || (tv >= 1)) continue;
               tv = ((1-tv)*(1-tv)*(1-tv)*p1 + 
                       3*tv*(1-tv)*(1-tv)*p2 +
                       3*tv*tv*(1-tv)*p3 +
                       tv*tv*tv*p4);
               if      (tv < minMax[0]) minMax[0] = tv;
               else if (tv > minMax[1]) minMax[1] = tv;
  -        } else if (det > 0) {
  -            // Two real roots
  -            det = Math.sqrt(det);
  -            double w = -(b + matchSign(det, b));
  -
  -            double tv = (2*c)/w;
  -            if ((tv > 0) && (tv < 1)) {
  -                tv = ((1-tv)*(1-tv)*(1-tv)*p1 + 
  -                      3*tv*(1-tv)*(1-tv)*p2 +
  -                      3*tv*tv*(1-tv)*p3 +
  -                      tv*tv*tv*p4);
  -                if      (tv < minMax[0]) minMax[0] = tv;
  -                else if (tv > minMax[1]) minMax[1] = tv;
  -            }
  -
  -            tv = w/(2*a);
  -            if ((tv > 0) && (tv < 1)) {
  -                tv = ((1-tv)*(1-tv)*(1-tv)*p1 + 
  -                      3*tv*(1-tv)*(1-tv)*p2 +
  -                      3*tv*tv*(1-tv)*p3 +
  -                      tv*tv*tv*p4);
  -                if      (tv < minMax[0]) minMax[0] = tv;
  -                else if (tv > minMax[1]) minMax[1] = tv;
  -            }
           }
       }
       public double minX() {
  @@ -136,12 +111,10 @@
       }
   
       protected int findRoots(double y, double [] roots) {
  -        double d = p1.y-y;
  -        double c = 3*(p2.y-p1.y);
  -        double b = 3*(p1.y-2*p2.y+p3.y);
  -        double a = 3*p2.y-p1.y+p4.y-3*p3.y;
  -
  -        return solveCubic(a, b, c, d, roots);
  +        double [] eqn = { p1.y-y, 3*(p2.y-p1.y), 3*(p1.y-2*p2.y+p3.y),
  +                          3*p2.y-p1.y+p4.y-3*p3.y };
  +        return CubicCurve2D.solveCubic(eqn, roots);
  +        // return solveCubic(eqn[3], eqn[2], eqn[1], eqn[0], roots);
       }
   
       public Point2D.Double evalDt(double t) {
  
  
  
  1.2       +8 -13     
xml-batik/sources/org/apache/batik/ext/awt/geom/Quadradic.java
  
  Index: Quadradic.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/ext/awt/geom/Quadradic.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Quadradic.java    18 Nov 2004 01:46:58 -0000      1.1
  +++ Quadradic.java    2 Dec 2004 01:24:37 -0000       1.2
  @@ -8,11 +8,10 @@
   
   package org.apache.batik.ext.awt.geom;
   
  -import java.util.Arrays;
  +import java.awt.geom.CubicCurve2D;
   import java.awt.geom.Point2D;
  +import java.awt.geom.QuadCurve2D;
   import java.awt.geom.Rectangle2D;
  -import java.io.PrintStream;
  -import java.io.FileOutputStream;
   
   public class Quadradic extends AbstractSegment {
       public Point2D.Double p1, p2, p3;
  @@ -60,12 +59,10 @@
           }
   
           double a = (p1-2*p2+p3);
  -        double eps = 0.00001;
  -        if (Math.abs(a) < 4*eps) {
  -            return;
  -        }
  -
           double b = (p2-p1);
  +
  +        if (a == 0) return;
  +
           double tv = b/a;
           if ((tv <= 0) || (tv >= 1)) return;
   
  @@ -106,11 +103,9 @@
       }
   
       protected int findRoots(double y, double [] roots) {
  -        double a = p1.y-2*p2.y+p3.y;
  -        double b = 2*(p2.y-p1.y);
  -        double c = p1.y-y;
  -
  -        return solveQuad(a, b, c, roots);
  +        double [] eqn = { p1.y-y, 2*(p2.y-p1.y), p1.y-2*p2.y+p3.y };
  +        return QuadCurve2D.solveQuadratic(eqn, roots);
  +        // return solveQuad(eqn[2], eqn[1], eqn[0], roots);
       }
   
       public Point2D.Double evalDt(double t) { 
  
  
  
  1.31      +5 -4      xml-batik/sources/org/apache/batik/gvt/ShapeNode.java
  
  Index: ShapeNode.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/ShapeNode.java,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- ShapeNode.java    30 Nov 2004 03:23:58 -0000      1.30
  +++ ShapeNode.java    2 Dec 2004 01:24:37 -0000       1.31
  @@ -417,9 +417,10 @@
       }
   
       /**
  -     * Returns the bounds of the area covered by this node, without taking 
any
  -     * of its rendering attribute into account. i.e., exclusive of any 
clipping,
  -     * masking, filtering or stroking, for example.
  +     * Returns the bounds of the area covered by this node, without
  +     * taking any of its rendering attribute into account. i.e.,
  +     * exclusive of any clipping, masking, filtering or stroking, for
  +     * example.
        */
       public Rectangle2D getGeometryBounds(){
           if (geometryBounds == null) {
  
  
  
  1.2       +3 -2      
xml-batik/sources/org/apache/batik/gvt/flow/FlowGlyphLayout.java
  
  Index: FlowGlyphLayout.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/gvt/flow/FlowGlyphLayout.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FlowGlyphLayout.java      18 Nov 2004 01:46:59 -0000      1.1
  +++ FlowGlyphLayout.java      2 Dec 2004 01:24:37 -0000       1.2
  @@ -290,6 +290,7 @@
           }
           
           aciIdx = aci.getBeginIndex();
  +        int aciEnd = aci.getEndIndex();
           char ch = aci.setIndex(aciIdx);
           
           int aciWordStart = aciIdx;
  @@ -349,7 +350,7 @@
               }
   
               aciIdx += chCnt;
  -            if (aciIdx > runLimit) {
  +            if ((aciIdx > runLimit) && (aciIdx < aciEnd)) {
                   // Possible font size/style change so record current
                   // line metrics and start fresh.
                   GVTLineMetrics lm = gvtFont.getLineMetrics
  
  
  
  1.3       +1 -2      xml-batik/sources/org/apache/batik/gvt/flow/LineInfo.java
  
  Index: LineInfo.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/gvt/flow/LineInfo.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- LineInfo.java     30 Nov 2004 03:23:58 -0000      1.2
  +++ LineInfo.java     2 Dec 2004 01:24:37 -0000       1.3
  @@ -66,7 +66,6 @@
           this.baseline   = (float)(fr.getCurrentY()+hLeading+ascent);
           this.paraStart  = paraStart;
           this.paraEnd    = false;
  -
           if (lineHeight > 0) {
               fr.newLineHeight(lineHeight);        
               updateRangeInfo();
  
  
  
  1.20      +6 -2      
xml-batik/sources/org/apache/batik/util/RunnableQueue.java
  
  Index: RunnableQueue.java
  ===================================================================
  RCS file: 
/home/cvs/xml-batik/sources/org/apache/batik/util/RunnableQueue.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- RunnableQueue.java        29 Oct 2004 14:40:54 -0000      1.19
  +++ RunnableQueue.java        2 Dec 2004 01:24:37 -0000       1.20
  @@ -164,7 +164,11 @@
                       if (preemptCount != 0) preemptCount--;
                       if (l == null) {
                           // No item to run, wait till there is one.
  -                        list.wait();
  +                        try {
  +                            list.wait();
  +                        } catch (InterruptedException ie) {
  +                            // just loop again.
  +                        }
                           continue; // start loop over again...
                       }
   
  
  
  
  1.2       +410 -115  
xml-batik/test-references/samples/tests/spec12/text/flowText.png
  
        <<Binary file>>
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to