keiron      2002/08/22 06:57:49

  Modified:    src/org/apache/fop/area LineArea.java
               src/org/apache/fop/area/inline Leader.java Stretch.java
               src/org/apache/fop/fo/flow Leader.java
               src/org/apache/fop/layoutmgr BlockLayoutManager.java
                        LayoutContext.java LeafNodeLayoutManager.java
                        LineBPLayoutManager.java
               src/org/apache/fop/render AbstractRenderer.java
               src/org/apache/fop/render/pdf PDFRenderer.java
               src/org/apache/fop/render/svg SVGRenderer.java
               src/org/apache/fop/render/xml XMLRenderer.java
               src/org/apache/fop/tools AreaTreeBuilder.java
  Log:
  implemeneted leader with leader-pattern of rule
  adjusts line area ipd to best fit (spaces not handled yet) and aligns
  
  Revision  Changes    Path
  1.9       +12 -4     xml-fop/src/org/apache/fop/area/LineArea.java
  
  Index: LineArea.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/area/LineArea.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- LineArea.java     16 Aug 2002 13:06:38 -0000      1.8
  +++ LineArea.java     22 Aug 2002 13:57:47 -0000      1.9
  @@ -45,9 +45,9 @@
       }
   
       public void addChild(Area childArea) {
  -     if (childArea instanceof InlineArea) {
  -         addInlineArea((InlineArea)childArea);
  -     }
  +        if (childArea instanceof InlineArea) {
  +            addInlineArea((InlineArea)childArea);
  +        }
       }
   
       public void addInlineArea(InlineArea area) {
  @@ -56,6 +56,14 @@
   
       public List getInlineAreas() {
           return inlineAreas;
  +    }
  +
  +    public void setStartIndent(int si) {
  +        startIndent = si;
  +    }
  +
  +    public int getStartIndent() {
  +        return startIndent;
       }
   }
   
  
  
  
  1.3       +3 -9      xml-fop/src/org/apache/fop/area/inline/Leader.java
  
  Index: Leader.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/area/inline/Leader.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Leader.java       26 Oct 2001 09:27:00 -0000      1.2
  +++ Leader.java       22 Aug 2002 13:57:47 -0000      1.3
  @@ -8,6 +8,7 @@
   package org.apache.fop.area.inline;
   
   import org.apache.fop.render.Renderer;
  +import org.apache.fop.fo.properties.RuleStyle;
   
   public class Leader extends Stretch {
   
  @@ -18,14 +19,7 @@
       // if space replaced with a space
       // otherwise this is a holder for a line
   
  -    public static final int DOTTED = 0;
  -    public static final int DASHED = 1;
  -    public static final int SOLID = 2;
  -    public static final int DOUBLE = 3;
  -    public static final int GROOVE = 4;
  -    public static final int RIDGE = 5;
  -
  -    int ruleStyle = SOLID;
  +    int ruleStyle = RuleStyle.SOLID;
       int ruleThickness = 1000;
   
       public Leader() {
  
  
  
  1.3       +2 -2      xml-fop/src/org/apache/fop/area/inline/Stretch.java
  
  Index: Stretch.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/area/inline/Stretch.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Stretch.java      26 Apr 2002 09:40:55 -0000      1.2
  +++ Stretch.java      22 Aug 2002 13:57:47 -0000      1.3
  @@ -10,7 +10,7 @@
   import org.apache.fop.area.MinOptMax;
   
   public class Stretch extends InlineArea {
  -    MinOptMax contentIPD;
  +    MinOptMax contentIPD = null;
   
       public void setAllocationIPD(MinOptMax mom) {
           contentIPD = mom;
  
  
  
  1.22      +64 -37    xml-fop/src/org/apache/fop/fo/flow/Leader.java
  
  Index: Leader.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/flow/Leader.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- Leader.java       16 Aug 2002 12:44:07 -0000      1.21
  +++ Leader.java       22 Aug 2002 13:57:47 -0000      1.22
  @@ -17,6 +17,7 @@
   import org.apache.fop.apps.FOPException;
   import org.apache.fop.layoutmgr.LayoutManager;
   import org.apache.fop.layoutmgr.LeafNodeLayoutManager;
  +import org.apache.fop.layoutmgr.LayoutContext;
   import org.apache.fop.area.MinOptMax;
   
   import java.util.List;
  @@ -27,24 +28,39 @@
    * The pattern use-content is ignored, i.e. it still must be implemented.
    */
   public class Leader extends FObjMixed {
  +    int ruleStyle;
  +    int ruleThickness;
  +    int leaderPattern;
   
       public Leader(FONode parent) {
           super(parent);
       }
   
       public void addLayoutManager(List list) {
  -        list.add(new LeafNodeLayoutManager(this) {
  -            public InlineArea get() {
  -                int contentIPD = parentLM.getContentIPD();
  -                return getInlineArea(contentIPD);
  -            }
  -        });
  +        LeafNodeLayoutManager lm = new LeafNodeLayoutManager(this) {
  +                public InlineArea get(LayoutContext context) {
  +                    int refIPD = context.getRefIPD();
  +                    return getInlineArea(refIPD);
  +                }
  +            };
  +        lm.setAlignment(properties.get("leader-alignment").getEnum());
  +        list.add(lm);
       }
   
  -    protected InlineArea getInlineArea(int maxIPD) {
  +    protected InlineArea getInlineArea(int refIPD) {
  +        setup();
  +
           org.apache.fop.area.inline.Leader leader = new 
org.apache.fop.area.inline.Leader();
  -        leader.setWidth(maxIPD / 2);
  -        leader.setAllocationIPD(new MinOptMax(0, maxIPD / 2, maxIPD));
  +
  +        MinOptMax alloc = getAllocationIPD(refIPD);
  +        leader.setAllocationIPD(alloc);
  +        leader.setWidth(alloc.opt);
  +
  +        if(leaderPattern == LeaderPattern.RULE) {
  +            leader.setRuleStyle(ruleStyle);
  +            leader.setRuleThickness(ruleThickness);
  +        }
  +
           return leader;
       }
   
  @@ -99,40 +115,51 @@
   
           // fo:leader specific properties
           // determines the pattern of leader; allowed values: space, rule,dots, 
use-content
  -        int leaderPattern = this.properties.get("leader-pattern").getEnum();
  -        // length of the leader
  -        int leaderLengthOptimum =
  -            this.properties.get("leader-length.optimum").getLength().mvalue();
  -        int leaderLengthMinimum =
  -            this.properties.get("leader-length.minimum").getLength().mvalue();
  -        Length maxlength = this.properties.get("leader-length.maximum").getLength();
  -        int leaderLengthMaximum;
  -        if(maxlength instanceof PercentLength) {
  -            //leaderLengthMaximum = (int)(((PercentLength)maxlength).value()
  -            //                          * area.getAllocationWidth());
  -        } else {
  -            leaderLengthMaximum = maxlength.mvalue();
  +        leaderPattern = this.properties.get("leader-pattern").getEnum();
  +        switch(leaderPattern) {
  +            case LeaderPattern.SPACE:
  +                // use Space
  +            break;
  +            case LeaderPattern.RULE:
  +                // the following properties only apply
  +                // for leader-pattern = "rule"
  +                ruleThickness =
  +                         properties.get("rule-thickness").getLength().mvalue();
  +                ruleStyle = properties.get("rule-style").getEnum();
  +            break;
  +            case LeaderPattern.DOTS:
  +            break;
  +            case LeaderPattern.USECONTENT:
  +                // use inline layout manager to create inline areas
  +                // add the inline parent multiple times until leader full
  +            break;
           }
  -        // the following properties only apply for leader-pattern = "rule"
  -        int ruleThickness =
  -            this.properties.get("rule-thickness").getLength().mvalue();
  -        int ruleStyle = this.properties.get("rule-style").getEnum();
  +
           // if leaderPatternWidth = 0 = default = use-font-metric
           int leaderPatternWidth =
               this.properties.get("leader-pattern-width").getLength().mvalue();
  -        int leaderAlignment =
  -            this.properties.get("leader-alignment").getEnum();
   
       }
   
  -    /*
  -     * //should only be necessary for use-content
  -     * protected void addCharacters(char data[], int start, int length) {
  -     * FOText textNode = new FOText(data,start,length, this);
  -     * textNode.setLogger(log);
  -     * children.addElement(textNode);
  -     * }
  -     */
  +    protected MinOptMax getAllocationIPD(int ipd) {
  +        // length of the leader
  +        int opt = getLength("leader-length.optimum", ipd);
  +        int min = getLength("leader-length.minimum", ipd);
  +        int max = getLength("leader-length.maximum", ipd);
  +
  +        return new MinOptMax(min, opt, max);
  +    }
   
  +    protected int getLength(String prop, int dim) {
  +        int length;
  +        Length maxlength = properties.get(prop).getLength();
  +        if(maxlength instanceof PercentLength) {
  +            length = (int)(((PercentLength)maxlength).value()
  +                                      * dim);
  +        } else {
  +            length = maxlength.mvalue();
  +        }
  +        return length;
  +    }
   }
   
  
  
  
  1.15      +2 -1      xml-fop/src/org/apache/fop/layoutmgr/BlockLayoutManager.java
  
  Index: BlockLayoutManager.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/BlockLayoutManager.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- BlockLayoutManager.java   21 Aug 2002 09:17:42 -0000      1.14
  +++ BlockLayoutManager.java   22 Aug 2002 13:57:48 -0000      1.15
  @@ -130,6 +130,7 @@
               if (curLM.generatesInlineAreas()) {
                   // set stackLimit for lines
                   childLC.setStackLimit(new MinOptMax(ipd/* - m_iIndents - 
m_iTextIndent*/));
  +                childLC.setRefIPD(ipd);
               } else {
                   childLC.setStackLimit(
                     MinOptMax.subtract(context.getStackLimit(),
  
  
  
  1.9       +12 -1     xml-fop/src/org/apache/fop/layoutmgr/LayoutContext.java
  
  Index: LayoutContext.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/LayoutContext.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- LayoutContext.java        18 Aug 2002 13:47:13 -0000      1.8
  +++ LayoutContext.java        22 Aug 2002 13:57:48 -0000      1.9
  @@ -67,6 +67,9 @@
       private HyphContext m_hyphContext = null;
   
       /** Stretch or shrink value when making areas. */
  +    private double ipdAdjust = 0.0;
  +
  +    /** Stretch or shrink value when adding spaces. */
       private double m_dSpaceAdjust = 0.0;
   
       private int m_iLineHeight;
  @@ -183,6 +186,14 @@
   
       public double getSpaceAdjust() {
           return m_dSpaceAdjust;
  +    }
  +
  +    public void setIPDAdjust(double ipdA) {
  +        ipdAdjust = ipdA;
  +    }
  +
  +    public double getIPDAdjust() {
  +        return ipdAdjust;
       }
   
       public void setLineHeight(int lh) {
  
  
  
  1.11      +13 -3     xml-fop/src/org/apache/fop/layoutmgr/LeafNodeLayoutManager.java
  
  Index: LeafNodeLayoutManager.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/LeafNodeLayoutManager.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- LeafNodeLayoutManager.java        16 Aug 2002 12:44:07 -0000      1.10
  +++ LeafNodeLayoutManager.java        22 Aug 2002 13:57:48 -0000      1.11
  @@ -28,7 +28,7 @@
           super(fobj);
       }
   
  -    public InlineArea get() {
  +    public InlineArea get(LayoutContext context) {
           return curArea;
       }
   
  @@ -68,7 +68,7 @@
   
       public BreakPoss getNextBreakPoss(LayoutContext context,
                                         Position prevBreakPoss) {
  -        curArea = get();
  +        curArea = get(context);
           if (curArea == null) {
               setFinished(true);
               return null;
  @@ -127,6 +127,16 @@
                   curArea.setOffset(context.getBaseline() - bpd);
               break;
           }
  +
  +        double dAdjust = context.getIPDAdjust();
  +        MinOptMax ipd = curArea.getAllocationIPD();
  +        int width = ipd.opt;
  +        if(dAdjust < 0) {
  +            width = (int)(width + dAdjust * (ipd.opt - ipd.min));
  +        } else if(dAdjust > 0) {
  +            width = (int)(width + dAdjust * (ipd.max - ipd.opt));
  +        }
  +        curArea.setWidth(width);
   
           while (posIter.hasNext()) {
               posIter.next();
  
  
  
  1.15      +100 -45   xml-fop/src/org/apache/fop/layoutmgr/LineBPLayoutManager.java
  
  Index: LineBPLayoutManager.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layoutmgr/LineBPLayoutManager.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- LineBPLayoutManager.java  21 Aug 2002 09:17:42 -0000      1.14
  +++ LineBPLayoutManager.java  22 Aug 2002 13:57:48 -0000      1.15
  @@ -47,14 +47,18 @@
       private static class LineBreakPosition extends LeafPosition {
           // int m_iPos;
           double m_dAdjust; // Percentage to adjust (stretch or shrink)
  +        double ipdAdjust; // Percentage to adjust (stretch or shrink)
  +        int startIndent;
           int lineHeight;
           int baseline;
   
           LineBreakPosition(BPLayoutManager lm, int iBreakIndex,
  -                          double dAdjust, int lh, int bl) {
  +                          double ipdA, double dAdjust, int ind, int lh, int bl) {
               super(lm, iBreakIndex);
               // m_iPos = iBreakIndex;
  +            ipdAdjust = ipdA;
               m_dAdjust = dAdjust;
  +            startIndent = ind;
               lineHeight = lh;
               baseline = bl;
           }
  @@ -65,7 +69,7 @@
       private ArrayList m_vecInlineBreaks = new ArrayList();
   
       private BreakPoss m_prevBP = null; // Last confirmed break position
  -    private boolean m_bJustify = false; // True if fo:block text-align=JUSTIFY
  +    private int bTextAlignment = TextAlign.JUSTIFY;
       private int m_iTextIndent = 0;
       private int m_iIndents = 0;
       private HyphenationProps m_hyphProps;
  @@ -90,7 +94,7 @@
           MarginProps marginProps = propMgr.getMarginProps();
           m_iIndents = marginProps.startIndent + marginProps.endIndent;
           BlockProps blockProps = propMgr.getBlockProps();
  -        m_bJustify = (blockProps.textAlign == TextAlign.JUSTIFY);
  +        bTextAlignment = blockProps.textAlign;
           m_iTextIndent = blockProps.firstIndent;
           m_hyphProps = propMgr.getHyphenationProps();
       }
  @@ -177,7 +181,7 @@
   
                       // This break position doesn't fit
                       // TODO: If we are in nowrap, we use it as is!
  -                    if (m_bJustify || m_prevBP == null) {
  +                    if (bTextAlignment == TextAlign.JUSTIFY || m_prevBP == null) {
                           // If we are already in a hyphenation loop, then stop.
   
                           if (inlineLC.tryHyphenate()) {
  @@ -261,29 +265,15 @@
           if (bp != m_prevBP && !bp.couldEndLine()) {
               reset();
           }
  -        // Distribute space in the line
  -        MinOptMax actual;
  -        if (bp != m_prevBP) {
  -            MinOptMax mom = getPrevIPD(m_prevBP.getLayoutManager());
  -            if (mom != null) {
  -                actual = MinOptMax.add(m_prevBP.getStackingSize(), mom);
  -            } else {
  -                actual = m_prevBP.getStackingSize();
  -            }
  -        } else {
  -            actual = m_prevBP.getStackingSize();
  -        }
  -        // ATTENTION: make sure this hasn't gotten start space for next
  -        // LM added onto it!
  -        actual.add(m_prevBP.resolveTrailingSpace(true));
  -        //log.error("Target opt=" + availIPD.opt + " bp.opt=" +
  -        //                   actual.opt + " bp.max=" + actual.max + " bm.min=" +
  -        //                   actual.min);
   
           // Don't justify last line in the sequence or if forced line-end
  -        boolean bJustify = (m_bJustify && !m_prevBP.isForcedBreak() &&
  -                            !isFinished());
  -        return makeLineBreak(iPrevLineEnd, availIPD, actual, bJustify);
  +        int talign = bTextAlignment;
  +        if((bTextAlignment == TextAlign.JUSTIFY
  +                             && (m_prevBP.isForcedBreak()
  +                             || isFinished()))) {
  +            talign = TextAlign.START;
  +        }
  +        return makeLineBreak(iPrevLineEnd, availIPD, talign);
       }
   
   
  @@ -399,23 +389,9 @@
   
   
       private BreakPoss makeLineBreak(int prevLineEnd, MinOptMax target,
  -                                    MinOptMax actual, boolean bJustify) {
  +                                    int textalign) {
           // make a new BP
           // Store information needed to make areas in the LineBreakPosition!
  -        // Calculate stretch or shrink factor
  -
  -        double dAdjust = 0.0;
  -        if (bJustify) {
  -            if (actual.opt < target.opt) {
  -                // Stretch
  -                dAdjust = (double)(target.opt - actual.opt) /
  -                          (double)(actual.max - actual.opt);
  -            } else {
  -                // Shrink
  -                dAdjust = (double)(target.opt - actual.opt) /
  -                          (double)(actual.opt - actual.min);
  -            }
  -        }
   
           // lead to baseline is
           // max of: baseline fixed alignment and middle/2
  @@ -428,6 +404,11 @@
           int maxtb = follow + halfLeading;
           // max size of middle alignment below baseline
           int middlefollow = maxtb;
  +
  +        // calculate actual ipd
  +        MinOptMax actual = new MinOptMax();
  +        BreakPoss lastBP = null;
  +        LayoutManager lastLM = null;
           for(Iterator iter = m_vecInlineBreaks.listIterator(prevLineEnd);
                   iter.hasNext(); ) {
               BreakPoss bp = (BreakPoss)iter.next();
  @@ -439,15 +420,87 @@
               }
               if(bp.getMiddle() > middlefollow) {
                   middlefollow = bp.getMiddle();
  -            } 
  +            }
  +
  +            // the stacking size of textLM accumulate for each break
  +            // so the ipd is only added at the end of each LM
  +            if(bp.getLayoutManager() != lastLM) {
  +                if(lastLM != null) {
  +                    actual.add(lastBP.getStackingSize());
  +                }
  +                lastLM = bp.getLayoutManager();
  +            }
  +            lastBP = bp;
           }
  +        if(lastBP != null) {
  +            // add final ipd
  +            actual.add(lastBP.getStackingSize());
  +            // ATTENTION: make sure this hasn't gotten start space for next
  +            // LM added onto it!
  +            actual.add(lastBP.resolveTrailingSpace(true));
  +        }
  +
           if(maxtb - lineLead > middlefollow) {
               middlefollow = maxtb - lineLead;
           }
   
  -        //log.debug("Adjustment factor=" + dAdjust);
  -        BreakPoss curLineBP = new BreakPoss( new LineBreakPosition(this,
  -                                             m_vecInlineBreaks.size() - 1, dAdjust, 
lineLead + middlefollow, lineLead));
  +        // in 7.21.4 the spec suggests that the leader and other
  +        // similar min/opt/max areas should be adjusted before
  +        // adjusting word spacing
  +
  +        // Calculate stretch or shrink factor
  +        double ipdAdjust = 0;
  +        int targetWith = target.opt;
  +        int realWidth = actual.opt;
  +        if (actual.opt > targetWith) {
  +            if (actual.opt - targetWith <
  +                    (actual.opt - actual.min)) {
  +                ipdAdjust = -(actual.opt - targetWith) /
  +                                (float)(actual.opt - actual.min);
  +                realWidth = targetWith;
  +            } else {
  +                ipdAdjust = -1;
  +                realWidth = actual.max;
  +            }
  +        } else {
  +            if (targetWith - actual.opt <
  +                    actual.max - actual.opt) {
  +                ipdAdjust = (targetWith - actual.opt) /
  +                                (float)(actual.max - actual.opt);
  +                realWidth = targetWith;
  +            } else {
  +                ipdAdjust = 1;
  +                realWidth = actual.min;
  +            }
  +        }
  +
  +        // if justifying then set the space adjustment
  +        // after the normal ipd adjustment
  +        double dAdjust = 0.0;
  +        int indent = 0;
  +        switch (textalign) {
  +            case TextAlign.JUSTIFY:
  +                if(realWidth != 0) {
  +                    dAdjust = (targetWith - realWidth) / realWidth;
  +                }
  +            break;
  +            case TextAlign.START:
  +                //indent = 0;
  +            break;
  +            case TextAlign.CENTER:
  +                indent = (targetWith - realWidth) / 2;
  +            break;
  +            case TextAlign.END:
  +                indent = targetWith - realWidth;
  +            break;
  +        }
  +
  +        LineBreakPosition lbp;
  +        lbp = new LineBreakPosition(this,
  +                                    m_vecInlineBreaks.size() - 1,
  +                                    ipdAdjust, dAdjust, indent,
  +                                    lineLead + middlefollow, lineLead);
  +        BreakPoss curLineBP = new BreakPoss(lbp);
   
           curLineBP.setFlag(BreakPoss.ISLAST, isFinished());
           curLineBP.setStackingSize(new MinOptMax(lineLead + middlefollow));
  @@ -488,6 +541,7 @@
           while (parentIter.hasNext()) {
               LineBreakPosition lbp = (LineBreakPosition) parentIter.next();
               LineArea lineArea = new LineArea();
  +            lineArea.setStartIndent(lbp.startIndent);
               lineArea.setHeight(lbp.lineHeight);
               lc.setBaseline(lbp.baseline);
               lc.setLineHeight(lbp.lineHeight);
  @@ -498,6 +552,7 @@
                                      lbp.getLeafPos() + 1);
               iStartPos = lbp.getLeafPos() + 1;
               lc.setSpaceAdjust(lbp.m_dAdjust);
  +            lc.setIPDAdjust(lbp.ipdAdjust);
               lc.setLeadingSpace(new SpaceSpecifier(true));
               lc.setFlags(LayoutContext.RESOLVE_LEADING_SPACE, true);
               setChildContext(lc);
  
  
  
  1.19      +3 -2      xml-fop/src/org/apache/fop/render/AbstractRenderer.java
  
  Index: AbstractRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/AbstractRenderer.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- AbstractRenderer.java     7 Aug 2002 16:54:57 -0000       1.18
  +++ AbstractRenderer.java     22 Aug 2002 13:57:48 -0000      1.19
  @@ -320,7 +320,8 @@
                   // a line area is rendered from the top left position
                   // of the line, each inline object is offset from there
                   LineArea line = (LineArea) obj;
  -                currentBlockIPPosition = currentIPPosition;
  +                currentBlockIPPosition = currentIPPosition
  +                                         + line.getStartIndent();
                   renderLineArea(line);
                   currentBPPosition += line.getHeight();
               }
  
  
  
  1.116     +73 -9     xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java
  
  Index: PDFRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java,v
  retrieving revision 1.115
  retrieving revision 1.116
  diff -u -r1.115 -r1.116
  --- PDFRenderer.java  19 Aug 2002 11:54:53 -0000      1.115
  +++ PDFRenderer.java  22 Aug 2002 13:57:48 -0000      1.116
  @@ -618,15 +618,79 @@
       }
   
       public void renderLeader(Leader area) {
  +        closeText();
           currentStream.add("ET\n");
  -        currentStream.add((((float) currentBlockIPPosition) / 1000f) +
  -                          " " + ((currentBPPosition + area.getOffset()) /
  -                                 1000f) + " m\n");
  -        currentStream.add(
  -          ((currentBlockIPPosition + area.getWidth()) / 1000f) +
  -          " " + ((currentBPPosition + area.getOffset()) /
  -                 1000f) + " l\n");
  -        currentStream.add("S\n");
  +        currentStream.add("q\n");
  +        int style = area.getRuleStyle();
  +        boolean alt = false;
  +        switch(style) {
  +            case RuleStyle.SOLID:
  +                currentStream.add("[] 0 d\n");
  +            break;
  +            case RuleStyle.DOTTED:
  +                currentStream.add("[2] 0 d\n");
  +            break;
  +            case RuleStyle.DASHED:
  +                currentStream.add("[6 4] 0 d\n");
  +            break;
  +            case RuleStyle.DOUBLE:
  +            case RuleStyle.GROOVE:
  +            case RuleStyle.RIDGE:
  +                alt = true;
  +            break;
  +        }
  +        float startx = ((float) currentBlockIPPosition) / 1000f;
  +        float starty = ((currentBPPosition + area.getOffset()) / 1000f);
  +        float endx = (currentBlockIPPosition + area.getWidth()) / 1000f;
  +        if(!alt) {
  +            currentStream.add(area.getRuleThickness() / 1000f + " w\n");
  +
  +            currentStream.add(startx + " " + starty + " m\n");
  +            currentStream.add(endx + " " + starty + " l\n");
  +            currentStream.add("S\n");
  +        } else {
  +            if(style == RuleStyle.DOUBLE) {
  +                float third = area.getRuleThickness() / 3000f;
  +                currentStream.add(third + " w\n");
  +                currentStream.add(startx + " " + starty + " m\n");
  +                currentStream.add(endx + " " + starty + " l\n");
  +                currentStream.add("S\n");
  +
  +                currentStream.add(startx + " " + (starty + 2 * third) + " m\n");
  +                currentStream.add(endx + " " + (starty + 2 * third) + " l\n");
  +                currentStream.add("S\n");
  +            } else {
  +                float half = area.getRuleThickness() / 2000f;
  +
  +                currentStream.add("1 g\n");
  +                currentStream.add(startx + " " + starty + " m\n");
  +                currentStream.add(endx + " " + starty + " l\n");
  +                currentStream.add(endx + " " + (starty + 2 * half) + " l\n");
  +                currentStream.add(startx + " " + (starty + 2 * half) + " l\n");
  +                currentStream.add("h\n");
  +                currentStream.add("f\n");
  +                if(style == RuleStyle.GROOVE) {
  +                    currentStream.add("0 g\n");
  +                    currentStream.add(startx + " " + starty + " m\n");
  +                    currentStream.add(endx + " " + starty + " l\n");
  +                    currentStream.add(endx + " " + (starty + half) + " l\n");
  +                    currentStream.add((startx + half) + " " + (starty + half) + " 
l\n");
  +                    currentStream.add(startx + " " + (starty + 2 * half) + " l\n");
  +                } else {
  +                    currentStream.add("0 g\n");
  +                    currentStream.add(endx + " " + starty + " m\n");
  +                    currentStream.add(endx + " " + (starty + 2 * half) + " l\n");
  +                    currentStream.add(startx + " " + (starty + 2 * half) + " l\n");
  +                    currentStream.add(startx + " " + (starty + half) + " l\n");
  +                    currentStream.add((endx - half) + " " + (starty + half) + " 
l\n");
  +                }
  +                currentStream.add("h\n");
  +                currentStream.add("f\n");
  +            }
  +
  +        }
  +
  +        currentStream.add("Q\n");
           currentStream.add("BT\n");
           super.renderLeader(area);
       }
  
  
  
  1.9       +8 -7      xml-fop/src/org/apache/fop/render/svg/SVGRenderer.java
  
  Index: SVGRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/svg/SVGRenderer.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SVGRenderer.java  7 Aug 2002 16:54:58 -0000       1.8
  +++ SVGRenderer.java  22 Aug 2002 13:57:49 -0000      1.9
  @@ -15,6 +15,7 @@
   import org.apache.fop.svg.SVGUtilities;
   import org.apache.fop.layout.FontInfo;
   import org.apache.fop.fo.FOUserAgent;
  +import org.apache.fop.fo.properties.RuleStyle;
   
   import org.w3c.dom.Node;
   import org.w3c.dom.ProcessingInstruction;
  @@ -316,19 +317,19 @@
           String style = "stroke:black;stroke-width:" +
                          (area.getRuleThickness() / 1000) + ";";
           switch (area.getRuleStyle()) {
  -            case Leader.DOTTED:
  +            case RuleStyle.DOTTED:
                   style += "stroke-dasharray:1,1";
                   break;
  -            case Leader.DASHED:
  +            case RuleStyle.DASHED:
                   style += "stroke-dasharray:5,1";
                   break;
  -            case Leader.SOLID:
  +            case RuleStyle.SOLID:
                   break;
  -            case Leader.DOUBLE:
  +            case RuleStyle.DOUBLE:
                   break;
  -            case Leader.GROOVE:
  +            case RuleStyle.GROOVE:
                   break;
  -            case Leader.RIDGE:
  +            case RuleStyle.RIDGE:
                   break;
           }
           Element line = SVGUtilities.createLine(svgDocument,
  
  
  
  1.41      +8 -7      xml-fop/src/org/apache/fop/render/xml/XMLRenderer.java
  
  Index: XMLRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/xml/XMLRenderer.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- XMLRenderer.java  7 Aug 2002 16:54:58 -0000       1.40
  +++ XMLRenderer.java  22 Aug 2002 13:57:49 -0000      1.41
  @@ -20,6 +20,7 @@
   import org.apache.fop.fo.FOUserAgent;
   import org.apache.fop.layout.FontInfo;
   import org.apache.fop.apps.FOPException;
  +import org.apache.fop.fo.properties.RuleStyle;
   
   // Avalon
   import org.apache.avalon.framework.logger.Logger;
  @@ -364,21 +365,21 @@
       public void renderLeader(Leader area) {
           String style = "solid";
           switch (area.getRuleStyle()) {
  -            case Leader.DOTTED:
  +            case RuleStyle.DOTTED:
                   style = "dotted";
                   break;
  -            case Leader.DASHED:
  +            case RuleStyle.DASHED:
                   style = "dashed";
                   break;
  -            case Leader.SOLID:
  +            case RuleStyle.SOLID:
                   break;
  -            case Leader.DOUBLE:
  +            case RuleStyle.DOUBLE:
                   style = "double";
                   break;
  -            case Leader.GROOVE:
  +            case RuleStyle.GROOVE:
                   style = "groove";
                   break;
  -            case Leader.RIDGE:
  +            case RuleStyle.RIDGE:
                   style = "ridge";
                   break;
           }
  
  
  
  1.12      +8 -7      xml-fop/src/org/apache/fop/tools/AreaTreeBuilder.java
  
  Index: AreaTreeBuilder.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/tools/AreaTreeBuilder.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- AreaTreeBuilder.java      7 Aug 2002 16:54:58 -0000       1.11
  +++ AreaTreeBuilder.java      22 Aug 2002 13:57:49 -0000      1.12
  @@ -20,6 +20,7 @@
   import org.apache.fop.layout.FontState;
   import org.apache.fop.layout.FontMetric;
   import org.apache.fop.fo.FOUserAgent;
  +import org.apache.fop.fo.properties.RuleStyle;
   
   import org.apache.avalon.framework.logger.ConsoleLogger;
   import org.apache.avalon.framework.logger.AbstractLogEnabled;
  @@ -603,17 +604,17 @@
           Leader leader = new Leader();
           String rs = root.getAttribute("ruleStyle");
           if ("solid".equals(rs)) {
  -            leader.setRuleStyle(Leader.SOLID);
  +            leader.setRuleStyle(RuleStyle.SOLID);
           } else if ("dotted".equals(rs)) {
  -            leader.setRuleStyle(Leader.DOTTED);
  +            leader.setRuleStyle(RuleStyle.DOTTED);
           } else if ("dashed".equals(rs)) {
  -            leader.setRuleStyle(Leader.DASHED);
  +            leader.setRuleStyle(RuleStyle.DASHED);
           } else if ("double".equals(rs)) {
  -            leader.setRuleStyle(Leader.DOUBLE);
  +            leader.setRuleStyle(RuleStyle.DOUBLE);
           } else if ("groove".equals(rs)) {
  -            leader.setRuleStyle(Leader.GROOVE);
  +            leader.setRuleStyle(RuleStyle.GROOVE);
           } else if ("ridge".equals(rs)) {
  -            leader.setRuleStyle(Leader.RIDGE);
  +            leader.setRuleStyle(RuleStyle.RIDGE);
           }
           String rt = root.getAttribute("ruleThickness");
           int thick = Integer.parseInt(rt);
  
  
  

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

Reply via email to