You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2005/12/13 20:49:42 UTC

svn commit: r356593 - in /xmlgraphics/fop/trunk/src: java/org/apache/fop/render/ java/org/apache/fop/render/java2d/ java/org/apache/fop/render/pdf/ java/org/apache/fop/render/ps/ java/org/apache/fop/render/txt/ java/org/apache/fop/render/xml/ sandbox/o...

Author: jeremias
Date: Tue Dec 13 11:49:16 2005
New Revision: 356593

URL: http://svn.apache.org/viewcvs?rev=356593&view=rev
Log:
startVPArea() and endVPArea() made abstract in AbstractRenderer so implementors are forced to deal with the topic.
startVPArea() in Renderers now takes an additional parameter for an optional clipping rectangle. PDF, PS and Java2D renderers now perform proper clipping on viewports if requested.
Fixed various problems in the Java2D renderer and added border and background painting where still missing. Note that there are several code parts that could be easily shared with the AbstractPathOrientedRenderer.

Modified:
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFRenderer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSRenderer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/txt/TXTRenderer.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/xml/XMLRenderer.java
    xmlgraphics/fop/trunk/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java
    xmlgraphics/fop/trunk/src/sandbox/org/apache/fop/render/svg/SVGRenderer.java

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java?rev=356593&r1=356592&r2=356593&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java Tue Dec 13 11:49:16 2005
@@ -19,6 +19,7 @@
 package org.apache.fop.render;
 
 import java.awt.Color;
+import java.awt.Rectangle;
 import java.awt.geom.Rectangle2D;
 import java.util.List;
 
@@ -429,10 +430,17 @@
         float x, y;
         x = (float)(bv.getXOffset() + containingIPPosition) / 1000f;
         y = (float)(bv.getYOffset() + containingBPPosition) / 1000f;
+        //This is the content-rect
+        float width = (float)bv.getIPD() / 1000f;
+        float height = (float)bv.getBPD() / 1000f;
+        
 
         if (bv.getPositioning() == Block.ABSOLUTE
                 || bv.getPositioning() == Block.FIXED) {
 
+            currentIPPosition = bv.getXOffset();
+            currentBPPosition = bv.getYOffset();
+
             //For FIXED, we need to break out of the current viewports to the
             //one established by the page. We save the state stack for restoration
             //after the block-container has been painted. See below.
@@ -444,19 +452,12 @@
             CTM tempctm = new CTM(containingIPPosition, containingBPPosition);
             ctm = tempctm.multiply(ctm);
 
-            //This is the content-rect
-            float width = (float)bv.getIPD() / 1000f;
-            float height = (float)bv.getBPD() / 1000f;
-            
             //Adjust for spaces (from margin or indirectly by start-indent etc.
-            Integer spaceStart = (Integer) bv.getTrait(Trait.SPACE_START);
-            if (spaceStart != null) {
-                x += spaceStart.floatValue() / 1000;
-            }
-            Integer spaceBefore = (Integer) bv.getTrait(Trait.SPACE_BEFORE);
-            if (spaceBefore != null) {
-                y += spaceBefore.floatValue() / 1000;
-            }
+            x += bv.getSpaceStart() / 1000f;
+            currentIPPosition += bv.getSpaceStart();
+            
+            y += bv.getSpaceBefore() / 1000f;
+            currentBPPosition += bv.getSpaceBefore(); 
 
             float bpwidth = (borderPaddingStart + bv.getBorderAndPaddingWidthEnd()) / 1000f;
             float bpheight = (borderPaddingBefore + bv.getBorderAndPaddingWidthAfter()) / 1000f;
@@ -464,28 +465,21 @@
             drawBackAndBorders(bv, x, y, width + bpwidth, height + bpheight);
 
             //Now adjust for border/padding
-            x += borderPaddingStart / 1000f;
-            y += borderPaddingBefore / 1000f;
+            currentIPPosition += borderPaddingStart;
+            currentBPPosition += borderPaddingBefore;
             
+            Rectangle2D clippingRect = null;
             if (bv.getClip()) {
-                saveGraphicsState();
-                clipRect(x, y, width, height);
+                clippingRect = new Rectangle(currentIPPosition, currentBPPosition, 
+                        bv.getIPD(), bv.getBPD());
             }
 
-            startVParea(ctm);
-
+            startVParea(ctm, clippingRect);
             currentIPPosition = 0;
             currentBPPosition = 0;
-
             renderBlocks(bv, children);
             endVParea();
 
-            if (bv.getClip()) {
-                restoreGraphicsState();
-            }
-
-            // clip if necessary
-
             if (breakOutList != null) {
                 restoreStateStackAfterBreakOut(breakOutList);
             }
@@ -494,37 +488,31 @@
             currentBPPosition = saveBP;
         } else {
 
-            Integer spaceBefore = (Integer)bv.getTrait(Trait.SPACE_BEFORE);
-            if (spaceBefore != null) {
-                currentBPPosition += spaceBefore.intValue();
-            }
+            currentBPPosition += bv.getSpaceBefore();
 
             //borders and background in the old coordinate system
             handleBlockTraits(bv);
 
+            //Advance to start of content area
+            currentIPPosition += bv.getStartIndent();
+
             CTM tempctm = new CTM(containingIPPosition, currentBPPosition);
             ctm = tempctm.multiply(ctm);
             
             //Now adjust for border/padding
-            x += borderPaddingStart / 1000f;
-            y += borderPaddingBefore / 1000f;
+            currentBPPosition += borderPaddingBefore;
 
-            if (ctm != null) {
-                startVParea(ctm);
-                currentIPPosition = 0;
-                currentBPPosition = 0;
-            }
-            // clip if necessary
+            Rectangle2D clippingRect = null;
             if (bv.getClip()) {
-                float width = (float)bv.getIPD() / 1000f;
-                float height = (float)bv.getBPD() / 1000f;
-                clipRect(x, y, width, height);
+                clippingRect = new Rectangle(currentIPPosition, currentBPPosition, 
+                        bv.getIPD(), bv.getBPD());
             }
-
+            
+            startVParea(ctm, clippingRect);
+            currentIPPosition = 0;
+            currentBPPosition = 0;
             renderBlocks(bv, children);
-            if (ctm != null) {
-                endVParea();
-            }
+            endVParea();
 
             currentIPPosition = saveIP;
             currentBPPosition = saveBP;

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java?rev=356593&r1=356592&r2=356593&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java Tue Dec 13 11:49:16 2005
@@ -19,6 +19,8 @@
 package org.apache.fop.render;
 
 // Java
+import java.awt.Dimension;
+import java.awt.Rectangle;
 import java.awt.geom.Rectangle2D;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -263,7 +265,7 @@
             handleRegionTraits(port);
 
             //  shouldn't the viewport have the CTM
-            startVParea(regionReference.getCTM());
+            startVParea(regionReference.getCTM(), port.isClip() ? view : null);
             // do after starting viewport area
             if (regionReference.getRegionClass() == FO_REGION_BODY) {
                 renderBodyRegion((BodyRegion) regionReference);
@@ -275,11 +277,19 @@
     }
 
     /**
-     * (todo) Description of the Method
+     * Establishes a new viewport area.
      *
-     * @param ctm  The coordinate transformation matrix to use
+     * @param ctm the coordinate transformation matrix to use
+     * @param clippingRect the clipping rectangle if the viewport should be clipping, 
+     *                     null if no clipping is performed.
      */
-    protected void startVParea(CTM ctm) { }
+    protected abstract void startVParea(CTM ctm, Rectangle2D clippingRect);
+
+    /**
+     * Signals exit from a viewport area. Subclasses can restore transformation matrices
+     * valid before the viewport area was started.
+     */
+    protected abstract void endVParea();
 
     /**
      * Handle the traits for a region
@@ -292,11 +302,6 @@
     }
 
     /**
-     * (todo) Description of the Method
-     */
-    protected void endVParea() { }
-
-    /**
      * Renders a region reference area.
      *
      * @param region  The region reference area
@@ -434,11 +439,16 @@
             int saveIP = currentIPPosition;
             int saveBP = currentBPPosition;
 
+            Rectangle2D clippingRect = null;
+            if (bv.getClip()) {
+                clippingRect = new Rectangle(saveIP, saveBP, bv.getIPD(), bv.getIPD());
+            }
+            
             CTM ctm = bv.getCTM();
             currentIPPosition = 0;
             currentBPPosition = 0;
 
-            startVParea(ctm);
+            startVParea(ctm, clippingRect);
             handleBlockTraits(bv);
             renderBlocks(bv, children);
             endVParea();

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java?rev=356593&r1=356592&r2=356593&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/java2d/Java2DRenderer.java Tue Dec 13 11:49:16 2005
@@ -22,6 +22,7 @@
 import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
+import java.awt.Rectangle;
 import java.awt.RenderingHints;
 import java.awt.color.ColorSpace;
 import java.awt.geom.AffineTransform;
@@ -52,13 +53,18 @@
 import org.apache.fop.area.BlockViewport;
 import org.apache.fop.area.CTM;
 import org.apache.fop.area.PageViewport;
+import org.apache.fop.area.RegionViewport;
 import org.apache.fop.area.Trait;
 import org.apache.fop.area.inline.Character;
 import org.apache.fop.area.inline.ForeignObject;
 import org.apache.fop.area.inline.Image;
 import org.apache.fop.area.inline.InlineArea;
+import org.apache.fop.area.inline.InlineBlockParent;
+import org.apache.fop.area.inline.InlineParent;
 import org.apache.fop.area.inline.Leader;
+import org.apache.fop.area.inline.Space;
 import org.apache.fop.area.inline.TextArea;
+import org.apache.fop.area.inline.Viewport;
 import org.apache.fop.datatypes.ColorType;
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fonts.Font;
@@ -347,27 +353,126 @@
     }
 
     /**
-     * @see org.apache.fop.render.AbstractRenderer#startVParea(CTM)
+     * Handle the traits for a region
+     * This is used to draw the traits for the given page region.
+     * (See Sect. 6.4.1.2 of XSL-FO spec.)
+     * @param region the RegionViewport whose region is to be drawn
+     * @TODO This is a copy from AbstractPathOrientedRenderer. Put this method in AbstractRenderer
+     */
+    protected void handleRegionTraits(RegionViewport region) {
+        Rectangle2D viewArea = region.getViewArea();
+        float startx = (float)(viewArea.getX() / 1000f);
+        float starty = (float)(viewArea.getY() / 1000f);
+        float width = (float)(viewArea.getWidth() / 1000f);
+        float height = (float)(viewArea.getHeight() / 1000f);
+
+        if (region.getRegionReference().getRegionClass() == FO_REGION_BODY) {
+            currentBPPosition = region.getBorderAndPaddingWidthBefore();
+            currentIPPosition = region.getBorderAndPaddingWidthStart();
+        }
+        drawBackAndBorders(region, startx, starty, width, height);
+    }
+
+    /**
+     * Render an inline viewport.
+     * This renders an inline viewport by clipping if necessary.
+     * @param viewport the viewport to handle
+     * @TODO This is a copy from AbstractPathOrientedRenderer. Put this method in AbstractRenderer
      */
-    protected void startVParea(CTM ctm) {
+    public void renderViewport(Viewport viewport) {
+
+        float x = currentIPPosition / 1000f;
+        float y = (currentBPPosition + viewport.getOffset()) / 1000f;
+        float width = viewport.getIPD() / 1000f;
+        float height = viewport.getBPD() / 1000f;
+        // TODO: Calculate the border rect correctly. 
+        float borderPaddingStart = viewport.getBorderAndPaddingWidthStart() / 1000f;
+        float borderPaddingBefore = viewport.getBorderAndPaddingWidthBefore() / 1000f;
+        float bpwidth = borderPaddingStart 
+                + (viewport.getBorderAndPaddingWidthEnd() / 1000f);
+        float bpheight = borderPaddingBefore
+                + (viewport.getBorderAndPaddingWidthAfter() / 1000f);
+
+        drawBackAndBorders(viewport, x, y, width + bpwidth, height + bpheight);
+
+        if (viewport.getClip()) {
+            saveGraphicsState();
+
+            clipRect(x + borderPaddingStart, y + borderPaddingBefore, width, height);
+        }
+        super.renderViewport(viewport);
 
+        if (viewport.getClip()) {
+            restoreGraphicsState();
+        }
+    }
+
+    /** Saves the graphics state of the rendering engine. */
+    protected void saveGraphicsState() {
         // push (and save) the current graphics state
         state.push();
+    }
 
-        // Set the given CTM in the graphics state
-        state.setTransform(new AffineTransform(CTMHelper.toPDFArray(ctm)));
+    /** Restores the last graphics state of the rendering engine. */
+    protected void restoreGraphicsState() {
+        state.pop();
+    }
+    
+    /**
+     * @see org.apache.fop.render.AbstractRenderer#startVParea(CTM, Rectangle2D)
+     */
+    protected void startVParea(CTM ctm, Rectangle2D clippingRect) {
+
+        saveGraphicsState();
 
-        // TODO Set clip?
+        if (clippingRect != null) {
+            clipRect((float)clippingRect.getX() / 1000f, 
+                    (float)clippingRect.getY() / 1000f, 
+                    (float)clippingRect.getWidth() / 1000f, 
+                    (float)clippingRect.getHeight() / 1000f);
+        }
+
+        // Set the given CTM in the graphics state
+        //state.setTransform(new AffineTransform(CTMHelper.toPDFArray(ctm)));
+        state.transform(new AffineTransform(CTMHelper.toPDFArray(ctm)));
     }
 
     /**
      * @see org.apache.fop.render.AbstractRenderer#endVParea()
      */
     protected void endVParea() {
-        state.pop();
+        restoreGraphicsState();
     }
 
     /**
+     * @see org.apache.fop.render.AbstractRenderer
+     * @TODO This is a copy from AbstractPathOrientedRenderer. Put this method in AbstractRenderer
+     */
+    protected void renderInlineSpace(Space space) {
+        space.setBPD(0);
+        renderInlineAreaBackAndBorders(space);
+        super.renderInlineSpace(space);
+    }
+    
+    /**
+     * @see org.apache.fop.render.AbstractRenderer
+     * @TODO This is a copy from AbstractPathOrientedRenderer. Put this method in AbstractRenderer
+     */
+    protected void renderInlineParent(InlineParent ip) {
+        renderInlineAreaBackAndBorders(ip);
+        super.renderInlineParent(ip);
+    }
+
+    /**
+     * @see org.apache.fop.render.AbstractRenderer
+     * @TODO This is a copy from AbstractPathOrientedRenderer. Put this method in AbstractRenderer
+     */
+    protected void renderInlineBlockParent(InlineBlockParent ibp) {
+        renderInlineAreaBackAndBorders(ibp);
+        super.renderInlineBlockParent(ibp);
+    }
+    
+    /**
      * @see org.apache.fop.render.AbstractRenderer#renderBlockViewport(BlockViewport,
      * List)
      */
@@ -384,9 +489,17 @@
         float x, y;
         x = (float) (bv.getXOffset() + containingIPPosition) / 1000f;
         y = (float) (bv.getYOffset() + containingBPPosition) / 1000f;
+        // This is the content-rect
+        float width = (float) bv.getIPD() / 1000f;
+        float height = (float) bv.getBPD() / 1000f;
+
 
         if (bv.getPositioning() == Block.ABSOLUTE
                 || bv.getPositioning() == Block.FIXED) {
+
+            currentIPPosition = bv.getXOffset();
+            currentBPPosition = bv.getYOffset();
+            
             // TODO not tested yet
             // For FIXED, we need to break out of the current viewports to the
             // one established by the page. We save the state stack for
@@ -411,19 +524,12 @@
             CTM tempctm = new CTM(containingIPPosition, containingBPPosition);
             ctm = tempctm.multiply(ctm);
 
-            // This is the content-rect
-            float width = (float) bv.getIPD() / 1000f;
-            float height = (float) bv.getBPD() / 1000f;
-
             // Adjust for spaces (from margin or indirectly by start-indent etc.
-            Integer spaceStart = (Integer) bv.getTrait(Trait.SPACE_START);
-            if (spaceStart != null) {
-                x += spaceStart.floatValue() / 1000;
-            }
-            Integer spaceBefore = (Integer) bv.getTrait(Trait.SPACE_BEFORE);
-            if (spaceBefore != null) {
-                y += spaceBefore.floatValue() / 1000;
-            }
+            x += bv.getSpaceStart() / 1000f;
+            currentIPPosition += bv.getSpaceStart();
+            
+            y += bv.getSpaceBefore() / 1000f;
+            currentBPPosition += bv.getSpaceBefore(); 
 
             float bpwidth = (borderPaddingStart + bv
                     .getBorderAndPaddingWidthEnd()) / 1000f;
@@ -433,28 +539,21 @@
             drawBackAndBorders(bv, x, y, width + bpwidth, height + bpheight);
 
             // Now adjust for border/padding
-            x += borderPaddingStart / 1000f;
-            y += borderPaddingBefore / 1000f;
+            currentIPPosition += borderPaddingStart;
+            currentBPPosition += borderPaddingBefore;
 
+            Rectangle2D clippingRect = null;
             if (bv.getClip()) {
-                // saves the graphics state in a stack
-                state.push();
-
-                clip(x, y, width, height);
+                clippingRect = new Rectangle(currentIPPosition, currentBPPosition, 
+                        bv.getIPD(), bv.getBPD());
             }
 
-            startVParea(ctm);
-
+            startVParea(ctm, clippingRect);
+            currentIPPosition = 0;
+            currentBPPosition = 0;
             renderBlocks(bv, children);
             endVParea();
 
-            if (bv.getClip()) {
-                // restores the last graphics state from the stack
-                state.pop();
-            }
-
-            // clip if necessary
-
             if (breakOutList != null) {
                 log.debug(
                         "Block.FIXED --> restoring context after break-out");
@@ -472,14 +571,14 @@
 
         } else { // orientation = Block.STACK or RELATIVE
 
-            Integer spaceBefore = (Integer) bv.getTrait(Trait.SPACE_BEFORE);
-            if (spaceBefore != null) {
-                currentBPPosition += spaceBefore.intValue();
-            }
+            currentBPPosition += bv.getSpaceBefore();
 
             // borders and background in the old coordinate system
             handleBlockTraits(bv);
 
+            //Advance to start of content area
+            currentIPPosition += bv.getStartIndent();
+
             CTM tempctm = new CTM(containingIPPosition, currentBPPosition
                     + containingBPPosition);
             ctm = tempctm.multiply(ctm);
@@ -488,66 +587,37 @@
             x += borderPaddingStart / 1000f;
             y += borderPaddingBefore / 1000f;
 
-            // clip if necessary
+            Rectangle2D clippingRect = null;
             if (bv.getClip()) {
-                // saves the graphics state in a stack
-                state.push();
-                float width = (float) bv.getIPD() / 1000f;
-                float height = (float) bv.getBPD() / 1000f;
-                clip(x, y, width, height);
-            }
-
-            if (ctm != null) {
-                startVParea(ctm);
+                clippingRect = new Rectangle(currentIPPosition, currentBPPosition, 
+                        bv.getIPD(), bv.getBPD());
             }
+            
+            startVParea(ctm, clippingRect);
+            currentIPPosition = 0;
+            currentBPPosition = 0;
             renderBlocks(bv, children);
-            if (ctm != null) {
-                endVParea();
-            }
-
-            if (bv.getClip()) {
-                // restores the last graphics state from the stack
-                state.pop();
-            }
+            endVParea();
 
             currentIPPosition = saveIP;
             currentBPPosition = saveBP;
 
-            // Adjust BP position (alloc BPD + spaces)
-            if (spaceBefore != null) {
-                currentBPPosition += spaceBefore.intValue();
-            }
-            currentBPPosition += (int) (bv.getAllocBPD());
-            Integer spaceAfter = (Integer) bv.getTrait(Trait.SPACE_AFTER);
-            if (spaceAfter != null) {
-                currentBPPosition += spaceAfter.intValue();
-            }
+            currentBPPosition += (int)(bv.getAllocBPD());
         }
     }
 
     /**
-     * Clip an area.
-     */
-    protected void clip() {
-    // TODO via AWTGraphicsState.updateClip();
-    // currentStream.add("W\n");
-    // currentStream.add("n\n");
-    }
-
-    /**
      * Clip an area. write a clipping operation given coordinates in the current
-     * transform.
+     * transform. Coordinates are in points.
      *
      * @param x the x coordinate
      * @param y the y coordinate
      * @param width the width of the area
      * @param height the height of the area
      */
-    protected void clip(float x, float y, float width, float height) {
-        // TODO via AWTGraphicsState.updateClip();
-        // currentStream.add(x + " " + y + " " + width + " " + height + "
-        // re ");
-        clip();
+    protected void clipRect(float x, float y, float width, float height) {
+        Rectangle2D rect = new Rectangle2D.Float(x, y, width, height);
+        state.updateClip(rect);
     }
 
     /**
@@ -603,7 +673,8 @@
             if (back.getFopImage() != null) {
                 FopImage fopimage = back.getFopImage();
                 if (fopimage != null && fopimage.load(FopImage.DIMENSIONS)) {
-                    clip(sx, sy, paddRectWidth, paddRectHeight);
+                    saveGraphicsState();
+                    clipRect(sx, sy, paddRectWidth, paddRectHeight);
                     int horzCount = (int) ((paddRectWidth * 1000 / fopimage
                             .getIntrinsicWidth()) + 1.0f);
                     int vertCount = (int) ((paddRectHeight * 1000 / fopimage
@@ -637,7 +708,7 @@
                             putImage(back.getURL(), pos); // TODO test
                         }
                     }
-
+                    restoreGraphicsState();
                 } else {
                     log.warn(
                             "Can't find background image: " + back.getURL());
@@ -695,6 +766,33 @@
         state.getGraph().fillRect((int) sx, (int) sy, (int) paddRectWidth,
                 (int) paddRectHeight);
     }
+    
+    /** 
+     * Common method to render the background and borders for any inline area.
+     * The all borders and padding are drawn outside the specified area.
+     * @param area the inline area for which the background, border and padding is to be
+     * rendered
+     * @TODO This is a copy from AbstractPathOrientedRenderer. Put this method in AbstractRenderer
+     */
+    protected void renderInlineAreaBackAndBorders(InlineArea area) {
+        float x = currentIPPosition / 1000f;
+        float y = (currentBPPosition + area.getOffset()) / 1000f;
+        float width = area.getIPD() / 1000f;
+        float height = area.getBPD() / 1000f;
+        float borderPaddingStart = area.getBorderAndPaddingWidthStart() / 1000f;
+        float borderPaddingBefore = area.getBorderAndPaddingWidthBefore() / 1000f;
+        float bpwidth = borderPaddingStart 
+                + (area.getBorderAndPaddingWidthEnd() / 1000f);
+        float bpheight = borderPaddingBefore
+                + (area.getBorderAndPaddingWidthAfter() / 1000f);
+        
+        if (height != 0.0f || bpheight != 0.0f && bpwidth != 0.0f) {
+            drawBackAndBorders(area, x, y - borderPaddingBefore
+                                , width + bpwidth
+                                , height + bpheight);
+        }
+        
+    }
 
     /**
      * Handle block traits. The block could be any sort of block with any
@@ -727,8 +825,9 @@
      * @see org.apache.fop.render.AbstractRenderer#renderText(TextArea)
      */
     public void renderText(TextArea text) {
+        renderInlineAreaBackAndBorders(text);
 
-        float x = currentIPPosition;
+        float x = currentIPPosition + text.getBorderAndPaddingWidthStart();
         float y = currentBPPosition + text.getOffset() + text.getBaselineOffset(); // baseline
 
         String name = (String) text.getTrait(Trait.FONT_NAME);
@@ -747,17 +846,19 @@
         // rendering text decorations
         FontMetrics metrics = fontInfo.getMetricsFor(name);
         Font fs = new Font(name, metrics, size);
-        renderTextDecoration(fs, text, y, x);
 
         super.renderText(text);
+
+        renderTextDecoration(fs, text, y, x);
     }
 
     /**
      * @see org.apache.fop.render.AbstractRenderer#renderCharacter(Character)
      */
     public void renderCharacter(Character ch) {
+        renderInlineAreaBackAndBorders(ch);
 
-        float x = currentIPPosition;
+        float x = currentIPPosition + ch.getBorderAndPaddingWidthStart();
         float y = currentBPPosition + ch.getOffset() + ch.getBaselineOffset(); // baseline
 
         String name = (String) ch.getTrait(Trait.FONT_NAME);
@@ -836,13 +937,15 @@
      * @param area the leader area to render
      */
     public void renderLeader(Leader area) {
+        renderInlineAreaBackAndBorders(area);
 
         // TODO leader-length: 25%, 50%, 75%, 100% not working yet
         // TODO Colors do not work on Leaders yet
 
-        float startx = ((float) currentIPPosition) / 1000f;
+        float startx = (currentIPPosition + area.getBorderAndPaddingWidthStart()) / 1000f;
         float starty = ((currentBPPosition + area.getOffset()) / 1000f);
-        float endx = (currentIPPosition + area.getIPD()) / 1000f;
+        float endx = (currentIPPosition + area.getBorderAndPaddingWidthStart() 
+                + area.getIPD()) / 1000f;
 
         ColorType ct = (ColorType) area.getTrait(Trait.COLOR);
         state.updateColor(ct, true, null);
@@ -975,7 +1078,6 @@
             renderDocument(doc, ns, pos);
         } else if ("image/eps".equals(mime)) {
             log.warn("EPS images are not supported by this renderer");
-            currentBPPosition += (h * 1000);
         } else if ("image/jpeg".equals(mime)) {
             if (!fopimage.load(FopImage.ORIGINAL_DATA)) {
                 return;
@@ -991,7 +1093,6 @@
             state.getGraph().drawImage(awtImage, 
                     (int)(x / 1000f), (int)(y / 1000f), 
                     (int)(pos.getWidth() / 1000f), (int)(pos.getHeight() / 1000f), null);
-            currentBPPosition += (h * 1000);
         } else {
             if (!fopimage.load(FopImage.BITMAP)) {
                 log.warn("Loading of bitmap failed: " + url);
@@ -1020,7 +1121,6 @@
             state.getGraph().drawImage(awtImage, 
                     (int)(x / 1000f), (int)(y / 1000f), 
                     (int)(pos.getWidth() / 1000f), (int)(pos.getHeight() / 1000f), null);
-            currentBPPosition += (h * 1000);
         }
     }
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFRenderer.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFRenderer.java?rev=356593&r1=356592&r2=356593&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/PDFRenderer.java Tue Dec 13 11:49:16 2005
@@ -484,18 +484,23 @@
     }
 
     /**
-     * @see org.apache.fop.render.AbstractRenderer#startVParea(CTM)
+     * @see org.apache.fop.render.AbstractRenderer#startVParea(CTM, Rectangle2D)
      */
-    protected void startVParea(CTM ctm) {
+    protected void startVParea(CTM ctm, Rectangle2D clippingRect) {
         // Set the given CTM in the graphics state
         currentState.push();
         currentState.setTransform(
                 new AffineTransform(CTMHelper.toPDFArray(ctm)));
 
         saveGraphicsState();
+        if (clippingRect != null) {
+            clipRect((float)clippingRect.getX() / 1000f, 
+                    (float)clippingRect.getY() / 1000f, 
+                    (float)clippingRect.getWidth() / 1000f, 
+                    (float)clippingRect.getHeight() / 1000f);
+        }
         // multiply with current CTM
         currentStream.add(CTMHelper.toPDFString(ctm) + " cm\n");
-        // Set clip?
     }
 
     /**

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSRenderer.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSRenderer.java?rev=356593&r1=356592&r2=356593&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSRenderer.java Tue Dec 13 11:49:16 2005
@@ -934,18 +934,21 @@
     }
     
     /**
-     * @see org.apache.fop.render.AbstractRenderer#startVParea(CTM)
+     * @see org.apache.fop.render.AbstractRenderer#startVParea(CTM, Rectangle2D)
      */
-    protected void startVParea(CTM ctm) {
-
+    protected void startVParea(CTM ctm, Rectangle2D clippingRect) {
         saveGraphicsState();
+        if (clippingRect != null) {
+            clipRect((float)clippingRect.getX() / 1000f, 
+                    (float)clippingRect.getY() / 1000f, 
+                    (float)clippingRect.getWidth() / 1000f, 
+                    (float)clippingRect.getHeight() / 1000f);
+        }
         // multiply with current CTM
         final double[] matrix = ctm.toArray();
         matrix[4] /= 1000f;
         matrix[5] /= 1000f;
         concatMatrix(matrix);
-
-        // Set clip?
     }
 
     /**

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/txt/TXTRenderer.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/txt/TXTRenderer.java?rev=356593&r1=356592&r2=356593&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/txt/TXTRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/txt/TXTRenderer.java Tue Dec 13 11:49:16 2005
@@ -556,9 +556,9 @@
     }
 
     /**
-     * @see org.apache.fop.render.AbstractRenderer#startVParea(CTM)
+     * @see org.apache.fop.render.AbstractRenderer#startVParea(CTM, Rectangle2D)
      */
-    protected void startVParea(CTM ctm) {
+    protected void startVParea(CTM ctm, Rectangle2D clippingRect) {
         currentState.push(ctm);
     }
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/xml/XMLRenderer.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/xml/XMLRenderer.java?rev=356593&r1=356592&r2=356593&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/xml/XMLRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/xml/XMLRenderer.java Tue Dec 13 11:49:16 2005
@@ -50,6 +50,7 @@
 import org.apache.fop.area.Block;
 import org.apache.fop.area.BlockViewport;
 import org.apache.fop.area.BodyRegion;
+import org.apache.fop.area.CTM;
 import org.apache.fop.area.NormalFlow;
 import org.apache.fop.area.Footnote;
 import org.apache.fop.area.LineArea;
@@ -391,6 +392,9 @@
             addAreaAttributes(port);
             addTraitAttributes(port);
             addAttribute("rect", port.getViewArea());
+            if (port.isClip()) {
+                addAttribute("clipped", "true");
+            }
             startElement("regionViewport", atts);
             RegionReference region = port.getRegionReference();
             atts.clear();
@@ -420,6 +424,16 @@
             }
             endElement("regionViewport");
         }
+    }
+
+    /** @see org.apache.fop.render.AbstractRenderer */
+    protected void startVParea(CTM ctm, Rectangle2D clippingRect) {
+        //only necessary for graphical output
+    }
+
+    /** @see org.apache.fop.render.AbstractRenderer#endVParea() */
+    protected void endVParea() {
+        //only necessary for graphical output
     }
 
     /**

Modified: xmlgraphics/fop/trunk/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java?rev=356593&r1=356592&r2=356593&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java Tue Dec 13 11:49:16 2005
@@ -20,9 +20,11 @@
 
 // FOP
 import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.area.CTM;
 import org.apache.fop.render.PrintRenderer;
 
 // Java
+import java.awt.geom.Rectangle2D;
 import java.io.IOException;
 import java.io.OutputStream;
 
@@ -155,6 +157,7 @@
         }
     }
 
+    /** @see org.apache.fop.render.Renderer#startRenderer(java.io.OutputStream) */
     public void startRenderer(OutputStream outputStream) throws IOException {
         log.info("rendering areas to PCL");
         log.fatal("The PCL Renderer is non-functional at this time. Please help resurrect it!");
@@ -176,12 +179,27 @@
         currentStream.add("\033" + "9\033&l0E");
     }
 
+    /** @see org.apache.fop.render.Renderer#stopRenderer() */
     public void stopRenderer() throws IOException {
     }
 
     /** @see org.apache.fop.render.AbstractRenderer */
     public String getMimeType() {
         return MIME_TYPE;
+    }
+
+    /**
+     * @see org.apache.fop.render.AbstractRenderer#startVParea(CTM, Rectangle2D)
+     */
+    protected void startVParea(CTM ctm, Rectangle2D clippingRect) {
+        // TODO Auto-generated method stub
+    }
+
+    /**
+     * @see org.apache.fop.render.AbstractRenderer#endVParea()
+     */
+    protected void endVParea() {
+        // TODO Auto-generated method stub
     }
 
 }

Modified: xmlgraphics/fop/trunk/src/sandbox/org/apache/fop/render/svg/SVGRenderer.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/sandbox/org/apache/fop/render/svg/SVGRenderer.java?rev=356593&r1=356592&r2=356593&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/sandbox/org/apache/fop/render/svg/SVGRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/sandbox/org/apache/fop/render/svg/SVGRenderer.java Tue Dec 13 11:49:16 2005
@@ -19,6 +19,7 @@
 package org.apache.fop.render.svg;
 
 import org.apache.fop.apps.FOPException;
+import org.apache.fop.area.CTM;
 import org.apache.fop.area.PageViewport;
 import org.apache.fop.area.LineArea;
 import org.apache.fop.area.inline.ForeignObject;
@@ -421,6 +422,20 @@
     /** @see org.apache.fop.render.XMLHandler#getNamespace() */
     public String getNamespace() {
         return SVG_NAMESPACE;
+    }
+
+    /**
+     * @see org.apache.fop.render.AbstractRenderer#startVParea(CTM, Rectangle2D)
+     */
+    protected void startVParea(CTM ctm, Rectangle2D clippingRect) {
+        // TODO Auto-generated method stub
+    }
+
+    /**
+     * @see org.apache.fop.render.AbstractRenderer#endVParea()
+     */
+    protected void endVParea() {
+        // TODO Auto-generated method stub
     }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org