jeremias    2005/01/12 04:03:01

  Modified:    src/java/org/apache/fop/layoutmgr
                        BlockContainerLayoutManager.java TraitSetter.java
                        BlockLayoutManager.java
               src/java/org/apache/fop/fo/properties CommonMarginBlock.java
               src/java/org/apache/fop/pdf PDFState.java
               src/java/org/apache/fop/render AbstractRenderer.java
               src/java/org/apache/fop/render/pdf PDFRenderer.java
  Log:
  Removed the "inheritedStartIndent" hack again.
  Switched to start|end-indent-oriented calculation.
  Improved line painting in the PDFRenderer.
  Some improvements in BlockContainerLayoutManager (but still WIP ATM).
  
  Revision  Changes    Path
  1.28      +110 -19   
xml-fop/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
  
  Index: BlockContainerLayoutManager.java
  ===================================================================
  RCS file: 
/home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- BlockContainerLayoutManager.java  24 Nov 2004 21:07:30 -0000      1.27
  +++ BlockContainerLayoutManager.java  12 Jan 2005 12:03:00 -0000      1.28
  @@ -1,5 +1,5 @@
   /*
  - * Copyright 1999-2004 The Apache Software Foundation.
  + * Copyright 1999-2005 The Apache Software Foundation.
    * 
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
  @@ -24,8 +24,11 @@
   import org.apache.fop.area.Area;
   import org.apache.fop.area.BlockViewport;
   import org.apache.fop.area.Block;
  +import org.apache.fop.area.PageViewport;
  +import org.apache.fop.fo.Constants;
   import org.apache.fop.fo.flow.BlockContainer;
   import org.apache.fop.fo.properties.CommonAbsolutePosition;
  +import org.apache.fop.fo.properties.FixedLength;
   import org.apache.fop.area.CTM;
   import org.apache.fop.datatypes.FODimension;
   import org.apache.fop.datatypes.Length;
  @@ -53,51 +56,135 @@
       // When viewport should grow with the content.
       private boolean autoHeight = true; 
   
  +    private int referenceIPD;
  +    
       /**
        * Create a new block container layout manager.
  +     * @param node block-container node to create the layout manager for.
        */
       public BlockContainerLayoutManager(BlockContainer node) {
           super(node);
           fobj = node;
       }
  +    
  +    protected PageViewport getPageViewport() {
  +        LayoutManager lm = this;
  +        while (lm != null && !(lm instanceof PageSequenceLayoutManager)) {
  +            lm = lm.getParent();
  +        }
  +        if (lm == null) {
  +            return null;
  +        } else {
  +            return ((PageSequenceLayoutManager)lm).getCurrentPageViewport();
  +        }
  +    }
   
       /**
        * @see org.apache.fop.layoutmgr.AbstractLayoutManager#initProperties()
        */
       protected void initProperties() {
  +        log.debug(fobj.getBlockProgressionDimension().getOptimum());
  +        log.debug(fobj.getInlineProgressionDimension().getOptimum());
           abProps = fobj.getCommonAbsolutePosition();
  -        if (abProps.absolutePosition == EN_ABSOLUTE) {
  +        log.debug(abProps);
  +        
  +        int iIndents = fobj.getCommonMarginBlock().startIndent.getValue();
  +        iIndents += fobj.getCommonMarginBlock().endIndent.getValue();
  +        int bIndents = 
fobj.getCommonBorderPaddingBackground().getBPPaddingAndBorder(false);
  +
  +        
  +        if (abProps.absolutePosition == EN_ABSOLUTE && false) {
               Rectangle2D rect = new 
Rectangle2D.Double(abProps.left.getValue(),
  -                                abProps.top.getValue(), 
abProps.right.getValue() - abProps.left.getValue(),
  +                                abProps.top.getValue(), 
  +                                abProps.right.getValue() - 
abProps.left.getValue(),
                                   abProps.bottom.getValue() - 
abProps.top.getValue());
               relDims = new FODimension(0, 0);
               absoluteCTM = 
CTM.getCTMandRelDims(fobj.getReferenceOrientation(),
                   fobj.getWritingMode(), rect, relDims);
  +        } else if (abProps.absolutePosition == EN_FIXED
  +                || abProps.absolutePosition == EN_ABSOLUTE) {
  +            Rectangle2D viewArea = getPageViewport().getViewArea();
  +            double x = viewArea.getX() + abProps.left.getValue();
  +            double y = viewArea.getY() + abProps.top.getValue();
  +            double w = 0.0;
  +            if (abProps.right.getEnum() == Constants.EN_AUTO) {
  +                if (fobj.getWidth().getEnum() == Constants.EN_AUTO) {
  +                    w = viewArea.getWidth() - x;
  +                } else {
  +                    if (fobj.getReferenceOrientation() % 180 == 0) {
  +                        w = 
fobj.getInlineProgressionDimension().getOptimum().getLength().getValue();
  +                    } else {
  +                        w = 
fobj.getBlockProgressionDimension().getOptimum().getLength().getValue();
  +                    }
  +                }
  +            } else {
  +                w = viewArea.getWidth() - x - abProps.right.getValue();
  +            }
  +            double h = 0.0;
  +            if (abProps.bottom.getEnum() == Constants.EN_AUTO) {
  +                if (fobj.getHeight().getEnum() == Constants.EN_AUTO) {
  +                    h = viewArea.getHeight() - y;
  +                } else {
  +                    if (fobj.getReferenceOrientation() % 180 == 0) {
  +                        h = 
fobj.getBlockProgressionDimension().getOptimum().getLength().getValue();
  +                    } else {
  +                        h = 
fobj.getInlineProgressionDimension().getOptimum().getLength().getValue();
  +                    }
  +                }
  +            } else {
  +                h = viewArea.getHeight() - y - abProps.bottom.getValue();
  +            }
  +            log.debug("x=" + x + " y=" + y + " w=" + w + " h=" + h + " 
orient=" + fobj.getReferenceOrientation());
  +            if (w != 0) {
  +                this.width = new FixedLength((int)w);
  +            }
  +            if (h != 0) {
  +                this.height = new FixedLength((int)h);
  +            }
  +            Rectangle2D rect = new Rectangle2D.Double(x, y, w, h);
  +            relDims = new FODimension(0, 0);
  +            absoluteCTM = 
CTM.getCTMandRelDims(fobj.getReferenceOrientation(),
  +                fobj.getWritingMode(), rect, relDims);
           }
    
  -        height = 
fobj.getBlockProgressionDimension().getOptimum().getLength();
  -        width = 
fobj.getInlineProgressionDimension().getOptimum().getLength();
  +        if (height == null) {
  +            height = 
fobj.getBlockProgressionDimension().getOptimum().getLength();
  +        }
  +        if (width == null) {
  +            width = 
fobj.getInlineProgressionDimension().getOptimum().getLength();
  +        }
       }
   
       protected int getRotatedIPD() {
           return 
fobj.getInlineProgressionDimension().getOptimum().getLength().getValue();
       }
   
  +    private int getIPIndents() {
  +        int iIndents = 0;
  +        iIndents += fobj.getCommonMarginBlock().startIndent.getValue();
  +        iIndents += fobj.getCommonMarginBlock().endIndent.getValue();
  +        return iIndents;
  +    }
  +    
       public BreakPoss getNextBreakPoss(LayoutContext context) {
   
           if (abProps.absolutePosition == EN_ABSOLUTE) {
               return getAbsoluteBreakPoss(context);
  +        } else if (abProps.absolutePosition == EN_FIXED) {
  +            return getAbsoluteBreakPoss(context);
           }
   
  -        int ipd = context.getRefIPD();
  +        referenceIPD = context.getRefIPD();
           int bpd = context.getStackLimit().opt;
           if (width.getEnum() != EN_AUTO) {
  -            ipd = width.getValue();
  +            referenceIPD = width.getValue();
           }
           if (height.getEnum() != EN_AUTO) {
               bpd = height.getValue();
           }
  -        Rectangle2D rect = new Rectangle2D.Double(0, 0, ipd, bpd);
  +        int contentIPD = referenceIPD - getIPIndents();
  +        
  +        Rectangle2D rect = new Rectangle2D.Double(0, 0, contentIPD, bpd);
           relDims = new FODimension(0, 0);
           absoluteCTM = CTM.getCTMandRelDims(fobj.getReferenceOrientation(),
                   fobj.getWritingMode(), rect, relDims);
  @@ -122,16 +209,16 @@
               stackLimit = context.getStackLimit();
           }
   
  -        LayoutManager curLM ; // currently active LM
  +        LayoutManager curLM; // currently active LM
   
           MinOptMax stackSize = new MinOptMax();
           // if starting add space before
           // stackSize.add(spaceBefore);
           BreakPoss lastPos = null;
   
  -        fobj.setLayoutDimension(PercentBase.BLOCK_IPD, ipd);
  +        fobj.setLayoutDimension(PercentBase.BLOCK_IPD, contentIPD);
           fobj.setLayoutDimension(PercentBase.BLOCK_BPD, bpd);
  -        fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_IPD, ipd);
  +        fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_IPD, contentIPD);
           fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_BPD, bpd);
   
           while ((curLM = getChildLM()) != null) {
  @@ -143,7 +230,7 @@
                   childLC.setStackLimit(
                     MinOptMax.subtract(stackLimit,
                                        stackSize));
  -                childLC.setRefIPD(ipd);
  +                childLC.setRefIPD(contentIPD);
   
               boolean over = false;
               while (!curLM.isFinished()) {
  @@ -187,7 +274,7 @@
               BreakPoss breakPoss;
               breakPoss = new BreakPoss(new LeafPosition(this,
                                                  childBreaks.size() - 1));
  -            breakPoss.setStackingSize(new MinOptMax(ipd));
  +            breakPoss.setStackingSize(new MinOptMax(contentIPD));
               return breakPoss;
           }
           return null;
  @@ -207,8 +294,8 @@
               BreakPoss bp;
   
               LayoutContext childLC = new LayoutContext(0);
  -                childLC.setStackLimit(new MinOptMax(1000000));
  -                childLC.setRefIPD(ipd);
  +            childLC.setStackLimit(new MinOptMax(1000000));
  +            childLC.setRefIPD(ipd);
   
               while (!curLM.isFinished()) {
                   if ((bp = curLM.getNextBreakPoss(childLC)) != null) {
  @@ -225,10 +312,11 @@
           breakPoss.setStackingSize(new MinOptMax(0));
   
           if (stackSize.opt > relDims.bpd) {
  +            log.warn("Contents overflow block-container viewport: clipping");
               if (fobj.getOverflow() == EN_HIDDEN) {
                   clip = true;
               } else if (fobj.getOverflow() == EN_ERROR_IF_OVERFLOW) {
  -                log.error("contents overflows block-container viewport: 
clipping");
  +                //TODO Throw layout exception
                   clip = true;
               }
           }
  @@ -279,11 +367,12 @@
               TraitSetter.addBorders(viewportBlockArea, 
fobj.getCommonBorderPaddingBackground());
               TraitSetter.addBackground(viewportBlockArea, 
fobj.getCommonBorderPaddingBackground());
               
  -            if (abProps.absolutePosition == EN_ABSOLUTE) {
  +            if (abProps.absolutePosition == EN_ABSOLUTE 
  +                    || abProps.absolutePosition == EN_FIXED) {
                   viewportBlockArea.setXOffset(abProps.left.getValue());
                   viewportBlockArea.setYOffset(abProps.top.getValue());
  -                viewportBlockArea.setIPD(abProps.right.getValue() - 
abProps.left.getValue());
  -                viewportBlockArea.setBPD(abProps.bottom.getValue() - 
abProps.top.getValue());
  +                viewportBlockArea.setIPD(width.getValue());
  +                viewportBlockArea.setBPD(height.getValue());
   
                   viewportBlockArea.setCTM(absoluteCTM);
                   viewportBlockArea.setClip(clip);
  @@ -320,6 +409,8 @@
   
               if (abProps.absolutePosition == EN_ABSOLUTE) {
                   viewportBlockArea.setPositioning(Block.ABSOLUTE);
  +            } else if (abProps.absolutePosition == EN_FIXED) {
  +                viewportBlockArea.setPositioning(Block.FIXED);
               }
   
               // Set up dimensions
  
  
  
  1.12      +10 -3     
xml-fop/src/java/org/apache/fop/layoutmgr/TraitSetter.java
  
  Index: TraitSetter.java
  ===================================================================
  RCS file: 
/home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/TraitSetter.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- TraitSetter.java  7 Jan 2005 08:21:21 -0000       1.11
  +++ TraitSetter.java  12 Jan 2005 12:03:00 -0000      1.12
  @@ -183,19 +183,26 @@
        * @param bpProps the border, padding and background properties
        * @param marginProps the margin properties.
        */
  -    public static void addMargins(Area area,
  +    public static void addMargins(Area area, Area parentArea,
                                     CommonBorderPaddingBackground bpProps,
                                     CommonMarginBlock marginProps) {
  +        int startIndent = marginProps.startIndent.getValue();
  +        if (startIndent != 0) {
  +            area.addTrait(Trait.START_INDENT, new Integer(startIndent));
  +        }
  +        
           int spaceStart = marginProps.startIndent.getValue()
  -                            - marginProps.inheritedStartIndent.getValue()
                               - bpProps.getBorderStartWidth(false)
                               - bpProps.getPaddingStart(false);
           if (spaceStart != 0) {
               area.addTrait(Trait.SPACE_START, new Integer(spaceStart));
           }
   
  +        int endIndent = marginProps.endIndent.getValue();
  +        if (endIndent != 0) {
  +            area.addTrait(Trait.END_INDENT, new Integer(endIndent));
  +        }
           int spaceEnd = marginProps.endIndent.getValue()
  -                            - marginProps.inheritedEndIndent.getValue()
                               - bpProps.getBorderEndWidth(false)
                               - bpProps.getPaddingEnd(false);
           if (spaceEnd != 0) {
  
  
  
  1.36      +33 -23    
xml-fop/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java
  
  Index: BlockLayoutManager.java
  ===================================================================
  RCS file: 
/home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- BlockLayoutManager.java   7 Jan 2005 08:21:21 -0000       1.35
  +++ BlockLayoutManager.java   12 Jan 2005 12:03:00 -0000      1.36
  @@ -22,6 +22,9 @@
   import java.util.List;
   
   import org.apache.fop.datatypes.PercentBase;
  +import org.apache.fop.fo.FONode;
  +import org.apache.fop.fo.FObj;
  +import org.apache.fop.fo.properties.CommonMarginBlock;
   import org.apache.fop.fonts.Font;
   import org.apache.fop.area.Area;
   import org.apache.fop.area.Block;
  @@ -61,6 +64,9 @@
   
       private int iStartPos = 0;
   
  +    private int referenceIPD = 0;
  +    //private int contentIPD = 0;
  +    
       /** The list of child BreakPoss instances. */
       protected List childBreaks = new java.util.ArrayList();
   
  @@ -163,19 +169,22 @@
           return llm;
       }
   
  +    private int getIPIndents() {
  +        int iIndents = 0;
  +        iIndents += fobj.getCommonMarginBlock().startIndent.getValue();
  +        iIndents += fobj.getCommonMarginBlock().endIndent.getValue();
  +        return iIndents;
  +    }
  +    
       /**
        * @see 
org.apache.fop.layoutmgr.LayoutManager#getNextBreakPoss(org.apache.fop.layoutmgr.LayoutContext)
        */
       public BreakPoss getNextBreakPoss(LayoutContext context) {
           LayoutManager curLM; // currently active LM
   
  -        int ipd = context.getRefIPD();
  -        int iIndents = fobj.getCommonMarginBlock().startIndent.getValue();
  -        iIndents += fobj.getCommonMarginBlock().endIndent.getValue();
  -        iIndents -= 
fobj.getCommonMarginBlock().inheritedStartIndent.getValue();
  -        iIndents -= 
fobj.getCommonMarginBlock().inheritedEndIndent.getValue();
  -        //int bIndents = 
fobj.getCommonBorderPaddingBackground().getBPPaddingAndBorder(false);
  -        ipd -= iIndents;
  +        //int refipd = context.getRefIPD();
  +        referenceIPD = context.getRefIPD();
  +        int contentipd = referenceIPD - getIPIndents();
   
           MinOptMax stackSize = new MinOptMax();
   
  @@ -193,7 +202,7 @@
           BreakPoss lastPos = null;
   
           // Set context for percentage property values.
  -        fobj.setLayoutDimension(PercentBase.BLOCK_IPD, ipd);
  +        fobj.setLayoutDimension(PercentBase.BLOCK_IPD, contentipd);
           fobj.setLayoutDimension(PercentBase.BLOCK_BPD, -1);
   
           while ((curLM = getChildLM()) != null) {
  @@ -206,13 +215,13 @@
               // line LM actually generates a LineArea which is a block
               if (curLM.generatesInlineAreas()) {
                   // set stackLimit for lines
  -                childLC.setStackLimit(new MinOptMax(ipd/* - iIndents - 
iTextIndent*/));
  -                childLC.setRefIPD(ipd);
  +                childLC.setStackLimit(new MinOptMax(contentipd));
  +                childLC.setRefIPD(contentipd);
               } else {
                   childLC.setStackLimit(
                     MinOptMax.subtract(context.getStackLimit(),
                                        stackSize));
  -                childLC.setRefIPD(ipd);
  +                childLC.setRefIPD(referenceIPD);
               }
               boolean over = false;
               while (!curLM.isFinished()) {
  @@ -242,7 +251,7 @@
   
                       if (curLM.generatesInlineAreas()) {
                           // Reset stackLimit for non-first lines
  -                        childLC.setStackLimit(new MinOptMax(ipd/* - 
iIndents*/));
  +                        childLC.setStackLimit(new MinOptMax(contentipd));
                       } else {
                           childLC.setStackLimit(MinOptMax.subtract(
                                                    context.getStackLimit(), 
stackSize));
  @@ -329,27 +338,28 @@
           if (curBlockArea == null) {
               curBlockArea = new Block();
   
  +            // Must get dimensions from parent area
  +            Area parentArea = parentLM.getParentArea(curBlockArea);
  +
               // set traits
               TraitSetter.addBorders(curBlockArea, 
                       fobj.getCommonBorderPaddingBackground());
               TraitSetter.addBackground(curBlockArea, 
                       fobj.getCommonBorderPaddingBackground());
  -            TraitSetter.addMargins(curBlockArea, 
  +            TraitSetter.addMargins(curBlockArea, parentArea,
                       fobj.getCommonBorderPaddingBackground(), 
                       fobj.getCommonMarginBlock());
               TraitSetter.addBreaks(curBlockArea, 
                       fobj.getBreakBefore(), fobj.getBreakAfter());
   
               // Set up dimensions
  -            // Must get dimensions from parent area
  -            Area parentArea = parentLM.getParentArea(curBlockArea);
  -
               // Get reference IPD from parentArea
  -            int referenceIPD = parentArea.getIPD();
  -            curBlockArea.setIPD(referenceIPD);
  +            //int referenceIPD = parentArea.getIPD();
  +            //curBlockArea.setIPD(referenceIPD);
   
               // Set the width of the block based on the parent block
               // Need to be careful though, if parent is BC then width may not 
be set
  +            /* TODO remove if really not used anymore
               int parentwidth = 0;
               if (parentArea instanceof BlockParent) {
                   parentwidth = ((BlockParent) parentArea).getIPD();
  @@ -357,12 +367,12 @@
               if (parentwidth == 0) {
                   parentwidth = referenceIPD;
               }
  -            parentwidth -= 
fobj.getCommonMarginBlock().startIndent.getValue();
  -            parentwidth -= fobj.getCommonMarginBlock().endIndent.getValue();
  -            parentwidth += 
fobj.getCommonMarginBlock().inheritedStartIndent.getValue();
  -            parentwidth += 
fobj.getCommonMarginBlock().inheritedEndIndent.getValue();
  +            parentwidth -= getIPIndents();
  +            */
  +
  +            int contentIPD = referenceIPD - getIPIndents();
               
  -            curBlockArea.setIPD(parentwidth);
  +            curBlockArea.setIPD(contentIPD/*parentwidth*/);
               setCurrentArea(curBlockArea); // ??? for generic operations
           }
           return curBlockArea;
  
  
  
  1.6       +2 -21     
xml-fop/src/java/org/apache/fop/fo/properties/CommonMarginBlock.java
  
  Index: CommonMarginBlock.java
  ===================================================================
  RCS file: 
/home/cvs/xml-fop/src/java/org/apache/fop/fo/properties/CommonMarginBlock.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- CommonMarginBlock.java    7 Jan 2005 08:21:21 -0000       1.5
  +++ CommonMarginBlock.java    12 Jan 2005 12:03:00 -0000      1.6
  @@ -70,16 +70,6 @@
       public Length endIndent;
   
       /**
  -     * The inherited "start-indent" property.
  -     */
  -    public Length inheritedStartIndent;
  -
  -    /**
  -     * The inherited "end-indent" property.
  -     */
  -    public Length inheritedEndIndent;
  -
  -    /**
        * Create a CommonMarginBlock object.
        * @param pList The PropertyList with propery values.
        */
  @@ -94,13 +84,6 @@
   
           startIndent = pList.get(Constants.PR_START_INDENT).getLength();
           endIndent = pList.get(Constants.PR_END_INDENT).getLength();
  -        
  -        if (!pList.getFObj().generatesReferenceAreas()) {
  -            inheritedStartIndent = pList.getParentPropertyList()
  -                    .get(Constants.PR_START_INDENT).getLength();
  -            inheritedEndIndent = pList.getParentPropertyList()
  -                    .get(Constants.PR_END_INDENT).getLength();
  -        }
       }
       
       /** @see java.lang.Object#toString() */
  @@ -112,9 +95,7 @@
               + "Space (before, after): (" 
               + spaceBefore + ", " + spaceAfter + ")\n" 
               + "Indents (start, end): ("
  -            + startIndent + ", " + endIndent + ")\n"
  -            + "Indents inherited (start, end): (" 
  -            + inheritedStartIndent + ", " + inheritedEndIndent + ")\n";
  +            + startIndent + ", " + endIndent + ")\n";
       }
       
   }
  
  
  
  1.4       +15 -1     xml-fop/src/java/org/apache/fop/pdf/PDFState.java
  
  Index: PDFState.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/pdf/PDFState.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- PDFState.java     27 Feb 2004 17:50:31 -0000      1.3
  +++ PDFState.java     12 Jan 2005 12:03:00 -0000      1.4
  @@ -1,5 +1,5 @@
   /*
  - * Copyright 1999-2004 The Apache Software Foundation.
  + * Copyright 1999-2005 The Apache Software Foundation.
    * 
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
  @@ -186,6 +186,20 @@
           return false;
       }
   
  +    /**
  +     * Set the current line width.
  +     * @param width the line width in points
  +     * @return true if the line width has changed
  +     */
  +    public boolean setLineWidth(float width) {
  +        if (lineWidth != width) {
  +            lineWidth = width;
  +            return true;
  +        } else {
  +            return false;
  +        }
  +    }
  +    
       /**
        * Set the current color.
        * Check if the new color is a change and then set the current color.
  
  
  
  1.40      +11 -3     
xml-fop/src/java/org/apache/fop/render/AbstractRenderer.java
  
  Index: AbstractRenderer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-fop/src/java/org/apache/fop/render/AbstractRenderer.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- AbstractRenderer.java     29 Nov 2004 08:45:14 -0000      1.39
  +++ AbstractRenderer.java     12 Jan 2005 12:03:00 -0000      1.40
  @@ -1,5 +1,5 @@
   /*
  - * Copyright 1999-2004 The Apache Software Foundation.
  + * Copyright 1999-2005 The Apache Software Foundation.
    * 
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
  @@ -468,11 +468,12 @@
           // Calculate the position of the content rectangle.
           if (parent != null) {
               currentBPPosition += parent.getBorderAndPaddingWidthBefore();
  +            /* This is unnecessary now as we're going to use the *-indent 
traits
               currentIPPosition += parent.getBorderAndPaddingWidthStart();
               Integer spaceStart = (Integer) 
parent.getTrait(Trait.SPACE_START);
               if (spaceStart != null) {
                   currentIPPosition += spaceStart.intValue();
  -            }
  +            }*/
           }
           
           // the position of the containing block is used for
  @@ -495,7 +496,9 @@
                   // a line area is rendered from the top left position
                   // of the line, each inline object is offset from there
                   LineArea line = (LineArea) obj;
  -                currentIPPosition = contIP + line.getStartIndent();
  +                currentIPPosition = contIP 
  +                        + parent.getStartIndent() 
  +                        + line.getStartIndent();
                   renderLineArea(line);
                   currentBPPosition += line.getAllocBPD();
               }
  @@ -547,6 +550,10 @@
           }
       }
   
  +    protected void renderTextDecoration(InlineArea area) {
  +        //getLogger().debug("renderTextDecoration for " + area + " -> " + 
area.getTrait(Trait.UNDERLINE));
  +    }
  +
       /**
        * Renders a line area. <p>
        *
  @@ -565,6 +572,7 @@
       }
   
       protected void renderInlineArea(InlineArea inlineArea) {
  +        renderTextDecoration(inlineArea);
           if (inlineArea instanceof TextArea) {
               renderText((TextArea) inlineArea);
           } else if (inlineArea instanceof InlineParent) {
  
  
  
  1.66      +57 -34    
xml-fop/src/java/org/apache/fop/render/pdf/PDFRenderer.java
  
  Index: PDFRenderer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-fop/src/java/org/apache/fop/render/pdf/PDFRenderer.java,v
  retrieving revision 1.65
  retrieving revision 1.66
  diff -u -r1.65 -r1.66
  --- PDFRenderer.java  4 Jan 2005 00:21:47 -0000       1.65
  +++ PDFRenderer.java  12 Jan 2005 12:03:00 -0000      1.66
  @@ -1,5 +1,5 @@
   /*
  - * Copyright 1999-2004 The Apache Software Foundation.
  + * Copyright 1999-2005 The Apache Software Foundation.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
  @@ -49,6 +49,7 @@
   import org.apache.fop.area.OffDocumentItem;
   import org.apache.fop.area.BookmarkData;
   import org.apache.fop.area.inline.Character;
  +import org.apache.fop.area.inline.InlineArea;
   import org.apache.fop.area.inline.TextArea;
   import org.apache.fop.area.inline.Viewport;
   import org.apache.fop.area.inline.ForeignObject;
  @@ -237,8 +238,12 @@
        * @see org.apache.fop.render.Renderer#startRenderer(OutputStream)
        */
       public void startRenderer(OutputStream stream) throws IOException {
  +        if (userAgent == null) {
  +            throw new IllegalStateException("UserAgent must be set before 
starting the renderer");
  +        }
           ostream = stream;
  -        this.pdfDoc = new PDFDocument(userAgent.getProducer());
  +        this.pdfDoc = new PDFDocument(
  +                userAgent.getProducer() != null ? userAgent.getProducer() : 
"");
           this.pdfDoc.setCreator(userAgent.getCreator());
           this.pdfDoc.setCreationDate(userAgent.getCreationDate());
           this.pdfDoc.setFilterMap(filterMap);
  @@ -505,10 +510,13 @@
           float width = block.getIPD() / 1000f;
           float height = block.getBPD() / 1000f;
   
  +        /* using start-indent now
           Integer spaceStart = (Integer) block.getTrait(Trait.SPACE_START);
           if (spaceStart != null) {
  -            startx += spaceStart.floatValue() / 1000;
  -        }
  +            startx += spaceStart.floatValue() / 1000f;
  +        }*/
  +        startx += block.getStartIndent() / 1000f;
  +        startx -= block.getBorderAndPaddingWidthStart() / 1000f;
   
           width += borderPaddingStart / 1000f;
           width += block.getBorderAndPaddingWidthEnd() / 1000f;
  @@ -572,11 +580,9 @@
               float bwidth = bps.width / 1000f;
               updateColor(bps.color, false, null);
               updateLineStyle(bps.style);
  -            currentStream.add(bwidth + " w\n");
  +            updateLineWidth(bwidth);
               float y1 = starty + bwidth / 2;
  -            currentStream.add(startx + " " + y1 + " m\n");
  -            currentStream.add(startx + width + " " + y1 + " l\n");
  -            currentStream.add("S\n");
  +            drawLine(startx, y1, startx + width, y1);
           }
           bps = (BorderProps)area.getTrait(Trait.BORDER_AFTER);
           if (bps != null) {
  @@ -585,11 +591,9 @@
               float bwidth = bps.width / 1000f;
               updateColor(bps.color, false, null);
               updateLineStyle(bps.style);
  -            currentStream.add(bwidth + " w\n");
  +            updateLineWidth(bwidth);
               float y1 = starty - bwidth / 2;
  -            currentStream.add(startx + " " + (y1 + height) + " m\n");
  -            currentStream.add((startx + width) + " " + (y1 + height) + " 
l\n");
  -            currentStream.add("S\n");
  +            drawLine(startx, y1 + height, startx + width, y1 + height);
           }
           bps = (BorderProps)area.getTrait(Trait.BORDER_START);
           if (bps != null) {
  @@ -598,11 +602,9 @@
               float bwidth = bps.width / 1000f;
               updateColor(bps.color, false, null);
               updateLineStyle(bps.style);
  -            currentStream.add(bwidth + " w\n");
  +            updateLineWidth(bwidth);
               float x1 = startx + bwidth / 2;
  -            currentStream.add(x1 + " " + starty + " m\n");
  -            currentStream.add(x1 + " " + (starty + height) + " l\n");
  -            currentStream.add("S\n");
  +            drawLine(x1, starty, x1, starty + height);
           }
           bps = (BorderProps)area.getTrait(Trait.BORDER_END);
           if (bps != null) {
  @@ -611,14 +613,23 @@
               float bwidth = bps.width / 1000f;
               updateColor(bps.color, false, null);
               updateLineStyle(bps.style);
  -            currentStream.add(bwidth + " w\n");
  +            updateLineWidth(bwidth);
               float x1 = startx - bwidth / 2;
  -            currentStream.add((x1 + width) + " " + starty + " m\n");
  -            currentStream.add((x1 + width) + " " + (starty + height) + " 
l\n");
  -            currentStream.add("S\n");
  +            drawLine(x1 + width, starty, x1 + width, starty + height);
           }
       }
   
  +    /**
  +     * Sets the current line width in points.
  +     * @param width line width in points
  +     */
  +    private void updateLineWidth(float width) {
  +        if (currentState.setLineWidth(width)) {
  +            //Only write if value has changed WRT the current line width
  +            currentStream.add(width + " w\n");
  +        }
  +    }
  +    
       private void updateLineStyle(int style) {
           switch (style) {
               case Constants.EN_DASHED:
  @@ -643,9 +654,8 @@
        * @param endy the y end position
        */
       private void drawLine(float startx, float starty, float endx, float 
endy) {
  -        currentStream.add(startx + " " + starty + " m\n");
  -        currentStream.add(endx + " " + endy + " l\n");
  -        currentStream.add("S\n");
  +        currentStream.add(startx + " " + starty + " m ");
  +        currentStream.add(endx + " " + endy + " l S\n");
       }
   
       /**
  @@ -661,15 +671,33 @@
   
           CTM ctm = bv.getCTM();
   
  -        if (bv.getPositioning() == Block.ABSOLUTE) {
  +        if (bv.getPositioning() == Block.ABSOLUTE
  +                || bv.getPositioning() == Block.FIXED) {
   
  +            getLogger().debug("containing position ip=" + 
containingIPPosition + " bp=" + containingBPPosition);
               CTM tempctm = new CTM(containingIPPosition, 
containingBPPosition);
               ctm = tempctm.multiply(ctm);
  +            getLogger().debug("tempctm=" + tempctm + " ctm=" + ctm);
   
  -            float x = (float)(bv.getXOffset() + containingIPPosition) / 
1000f;
  -            float y = (float)(bv.getYOffset() + containingBPPosition) / 
1000f;
  +            float x,y;
  +            x = (float)(bv.getXOffset() + containingIPPosition) / 1000f;
  +            y = (float)(bv.getYOffset() + containingBPPosition) / 1000f;
               float width = (float)bv.getIPD() / 1000f;
               float height = (float)bv.getBPD() / 1000f;
  +            getLogger().debug("renderBlockViewport: x=" + x + " y=" + y + " 
width=" + width + " height=" + height);
  +            
  +            int borderPaddingStart = bv.getBorderAndPaddingWidthStart();
  +            int borderPaddingBefore = bv.getBorderAndPaddingWidthBefore();
  +
  +            Integer spaceStart = (Integer) bv.getTrait(Trait.SPACE_START);
  +            if (spaceStart != null) {
  +                x += spaceStart.floatValue() / 1000;
  +            }
  +
  +            width += borderPaddingStart / 1000f;
  +            width += bv.getBorderAndPaddingWidthEnd() / 1000f;
  +            height += borderPaddingBefore / 1000f;
  +            height += bv.getBorderAndPaddingWidthAfter() / 1000f;
   
               drawBackAndBorders(bv, x, y, width, height);
   
  @@ -750,12 +778,7 @@
        * @param height the height of the area
        */
       protected void clip(float x, float y, float width, float height) {
  -        currentStream.add(x + " " + y + " m\n");
  -        currentStream.add((x + width) + " " + y + " l\n");
  -        currentStream.add((x + width) + " " + (y + height) + " l\n");
  -        currentStream.add(x + " " + (y + height) + " l\n");
  -        currentStream.add("h\n");
  -        currentStream.add("W\n");
  +        currentStream.add(x + " " + y + " " + width + " " + height + " re 
W\n");
           currentStream.add("n\n");
       }
   
  @@ -1278,12 +1301,12 @@
           float starty = ((currentBPPosition + area.getOffset()) / 1000f);
           float endx = (currentIPPosition + area.getIPD()) / 1000f;
           if (!alt) {
  -            currentStream.add(area.getRuleThickness() / 1000f + " w\n");
  +            updateLineWidth(area.getRuleThickness() / 1000f);
               drawLine(startx, starty, endx, starty);
           } else {
               if (style == EN_DOUBLE) {
                   float third = area.getRuleThickness() / 3000f;
  -                currentStream.add(third + " w\n");
  +                updateLineWidth(third);
                   drawLine(startx, starty, endx, starty);
   
                   drawLine(startx, (starty + 2 * third), endx, (starty + 2 * 
third));
  
  
  

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

Reply via email to