]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
1. Partial implementation of fo:region-xxx and background-color property
authorGlen Mazza <gmazza@apache.org>
Mon, 1 Sep 2003 01:28:51 +0000 (01:28 +0000)
committerGlen Mazza <gmazza@apache.org>
Mon, 1 Sep 2003 01:28:51 +0000 (01:28 +0000)
in AWTRenderer.

2.  ColorType has a new getAWTColor() method, also alpha() function renamed
to getAlpha(). Definition of Alpha values switched to make consistent with
java.awt.Color (i.e., 0 is transparent and 1 is opaque).

3.  AbstractRenderer's handleViewportTraits() renamed to handleRegionTraits()
to lesson confusion (FOP has three types of viewports--
Page, Region, and Block--handleViewportTraits() was only good for Region.)

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@196878 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/area/CachedRenderPagesModel.java
src/java/org/apache/fop/datatypes/ColorType.java
src/java/org/apache/fop/fo/PropertyManager.java
src/java/org/apache/fop/render/AbstractRenderer.java
src/java/org/apache/fop/render/awt/AWTRenderer.java
src/java/org/apache/fop/render/pdf/PDFRenderer.java
src/java/org/apache/fop/render/ps/PSRenderer.java
src/java/org/apache/fop/rtf/renderer/RTFHandler.java

index e20582854bc6e9c2a0c8f4bc214d54c4048683bb..49626d69e543bdb1e9437a2608dcdb45855d9dc5 100644 (file)
@@ -68,7 +68,7 @@ import java.io.BufferedInputStream;
  * A simple cached render pages model.
  * If the page is prepared for later rendering then this saves
  * the page contents to a file and once the page is resolved
- * the contents a reloaded.
+ * the contents are reloaded.
  */
 public class CachedRenderPagesModel extends RenderPagesModel {
     private Map pageMap = new HashMap();
index b0d04945b5a9c24037051f929b08d36b017f62e9..a40fc32f393ae55a607e82213c64c59bc5b690a8 100644 (file)
@@ -50,6 +50,7 @@
  */
 package org.apache.fop.datatypes;
 
+import java.awt.Color;
 import java.io.Serializable;
 import java.util.StringTokenizer;
 
@@ -61,22 +62,24 @@ public class ColorType implements Serializable {
     /**
      * the red component
      */
-    protected float red;
+    protected float red = 0f;
 
     /**
      * the green component
      */
-    protected float green;
+    protected float green = 0f;
 
     /**
      * the blue component
      */
-    protected float blue;
+    protected float blue = 0f;
 
     /**
-     * the alpha component
+     * the alpha component (indicator of opaque-ness)
+     * 0.0 - 1.0; 0.0 is completely transparent; 1.0 is completely opaque
+     * see definition at http://java.sun.com/j2se/1.3/docs/api/java/awt/Color.html
      */
-    protected float alpha = 0;
+    protected float alpha = 1f;
 
     /**
      * Main constructor
@@ -177,7 +180,7 @@ public class ColorType implements Serializable {
                 this.red = 0;
                 this.green = 0;
                 this.blue = 0;
-                this.alpha = 1;
+                this.alpha = 0;
             } else {
                 boolean found = false;
                 for (int count = 0; count < NAMES.length; count++) {
@@ -225,13 +228,21 @@ public class ColorType implements Serializable {
     }
 
     /**
-     * Returns the alpha (transparency) component of the color.
-     * @return float a value between 0.0 and 1.0
+     * Returns the alpha (degree of opaque-ness) component of the color.
+     * @return float a value between 0.0 (fully transparent) and 1.0 (fully opaque)
      */
-    public float alpha() {
+    public float getAlpha() {
         return this.alpha;
     }
 
+    /**
+     * Returns an AWT instance of this color
+     * @return float the AWT color represented by this ColorType instance
+     */
+    public Color getAWTColor() {
+        return new Color(this.red, this.green, this.blue, this.alpha);
+    }
+
     /**
      * @param floatValue value (between 0.0 and 1.0) of color channel
      * @return integer equivalent (between 0 and 255)
index e9305d64c253b9459cd61ab95f3fd64bc2cca1ee..f58e9241923d8ef728386fc1cdc370922361efb1 100644 (file)
@@ -337,7 +337,7 @@ public class PropertyManager {
         CommonBackground bp = new CommonBackground();
         bp.backAttachment = properties.get("background-attachment").getEnum();
         bp.backColor = properties.get("background-color").getColorType();
-        if (bp.backColor.alpha() == 1) {
+        if (bp.backColor.getAlpha() == 0) {
             bp.backColor = null;
         }
 
index 5becb0f6b43bc699b84be213e1c06aa1f222d15d..80f92edcdfc5f796bce2ca4c4003e6a88712d918 100644 (file)
@@ -311,7 +311,7 @@ public abstract class AbstractRenderer extends AbstractLogEnabled
             startVParea(region.getCTM());
 
             // do after starting viewport area
-            handleViewportTraits(port);
+            handleRegionTraits(port);
             if (region.getRegionClass() == Region.BODY_CODE) {
                 renderBodyRegion((BodyRegion) region);
             } else {
@@ -329,13 +329,12 @@ public abstract class AbstractRenderer extends AbstractLogEnabled
     protected void startVParea(CTM ctm) { }
 
     /**
-     * Handle viewport traits.
-     * This should be overridden to draw border and background
-     * traits for the viewport area.
-     *
-     * @param rv the region viewport area
+     * 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 rv the RegionViewport whose region is to be drawn
      */
-    protected void handleViewportTraits(RegionViewport rv) {
+    protected void handleRegionTraits(RegionViewport rv) {
         // draw border and background
     }
 
index 0da4214e494c15f8ca8623db7826b8a620cba191..64743752ae3037bc6ec27460c0527cf5f368fdaa 100644 (file)
@@ -86,9 +86,15 @@ import org.apache.fop.area.Area;
 import org.apache.fop.area.Page;
 import org.apache.fop.area.PageViewport;
 import org.apache.fop.area.RegionViewport;
+import org.apache.fop.area.Trait;
+import org.apache.fop.datatypes.ColorType;
 import org.apache.fop.fo.FOTreeControl;
+import org.apache.fop.fo.properties.BackgroundRepeat;
 import org.apache.fop.fonts.Font;
+import org.apache.fop.image.FopImage;
+import org.apache.fop.image.ImageFactory;
 import org.apache.fop.render.AbstractRenderer;
+import org.apache.fop.traits.BorderProps;
 import org.apache.fop.viewer.PreviewDialog;
 import org.apache.fop.viewer.Translator;
 
@@ -100,6 +106,8 @@ public class AWTRenderer extends AbstractRenderer implements Printable, Pageable
     protected double scaleFactor = 100.0;
     protected int pageNumber = 0;
     protected Vector pageViewportList = new java.util.Vector();
+    protected Vector pageList = new java.util.Vector(); 
+    protected BufferedImage currentPageImage = null;
 
     /** Font configuration */
     protected Document fontInfo;
@@ -186,6 +194,7 @@ public class AWTRenderer extends AbstractRenderer implements Printable, Pageable
     throws IOException {
         // empty pageViewportList, in case of a reload from PreviewDialog
         pageViewportList.removeAllElements();
+        pageList.removeAllElements();
     }
 
     public void stopRenderer()
@@ -242,6 +251,7 @@ public class AWTRenderer extends AbstractRenderer implements Printable, Pageable
     */
     public void renderPage(PageViewport pageViewport)  throws IOException, FOPException {
         pageViewportList.add(pageViewport);
+        pageList.add(pageViewport.getPage().clone());        
     }
 
     /** Generates a desired page from the renderer's page viewport vector.
@@ -256,18 +266,23 @@ public class AWTRenderer extends AbstractRenderer implements Printable, Pageable
                 + " page(s) available.");
         }
         PageViewport pageViewport = (PageViewport) pageViewportList.get(pageNum);
-        Page page = pageViewport.getPage();
+        Page page = (Page) pageList.get(pageNum);
         
         Rectangle2D bounds = pageViewport.getViewArea();
         int pageWidth = (int)((float) bounds.getWidth() / 1000f + .5);
         int pageHeight = (int)((float) bounds.getHeight() / 1000f + .5);
-
-        BufferedImage pageImage =
+/*
+        System.out.println("(Page) X, Y, Width, Height: " + bounds.getX()
+            + " " + bounds.getY()
+            + " " + bounds.getWidth()
+            + " " + bounds.getHeight());
+*/      
+        currentPageImage =
             new BufferedImage((int)((pageWidth * (int)scaleFactor) / 100),
                               (int)((pageHeight * (int)scaleFactor) / 100),
                               BufferedImage.TYPE_INT_RGB);
 
-        Graphics2D graphics = pageImage.createGraphics();
+        Graphics2D graphics = currentPageImage.createGraphics();
         graphics.setRenderingHint (RenderingHints.KEY_FRACTIONALMETRICS,
                                    RenderingHints.VALUE_FRACTIONALMETRICS_ON);
 
@@ -286,10 +301,116 @@ public class AWTRenderer extends AbstractRenderer implements Printable, Pageable
         graphics.drawLine(0, pageHeight + 2, pageWidth + 2, pageHeight + 2);
         graphics.drawLine(1, pageHeight + 3, pageWidth + 3, pageHeight + 3);
 
-        this.currentFontName = "";
-        this.currentFontSize = 0;
-//      renderPageAreas(page);
-        return pageImage;
+        currentFontName = "";
+        currentFontSize = 0;
+        renderPageAreas(page);
+        return currentPageImage;
     }
 
+    /**
+     * 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
+     */
+    protected void handleRegionTraits(RegionViewport region) {
+        currentFontName = "";
+        currentFontSize = 0;
+        Rectangle2D viewArea = region.getViewArea();
+/*
+        if (region.getRegion() != null) {
+            System.out.print("Region type = " + region.getRegion().getRegionClass());
+        }
+        System.out.println("  X, Y, Width, Height: " + viewArea.getX()
+            + " " + viewArea.getY()
+            + " " + viewArea.getWidth()
+            + " " + viewArea.getHeight());
+*/      
+        int startX = (int)(((float) viewArea.getX() / 1000f + .5) 
+            * (scaleFactor / 100f));
+        int startY = (int)(((float) viewArea.getY() / 1000f + .5) 
+            * (scaleFactor / 100f));
+        int width = (int)(((float) viewArea.getWidth() / 1000f + .5) 
+            * (scaleFactor / 100f));
+        int height = (int)(((float) viewArea.getHeight() / 1000f + .5)
+            * (scaleFactor / 100f));
+         
+        drawBackAndBorders(region, startX, startY, width, height);
+    }
+    
+    /**
+     * Draw the background and borders.
+     * This draws the background and border traits for an area given
+     * the position.
+     *
+     * @param block the area to get the traits from
+     * @param startx the start x position
+     * @param starty the start y position
+     * @param width the width of the area
+     * @param height the height of the area
+     */
+    protected void drawBackAndBorders(Area block,
+                    int startx, int starty,
+                    int width, int height) {
+
+        // draw background then border
+        Graphics2D graphics = currentPageImage.createGraphics();
+        Trait.Background back;
+        back = (Trait.Background) block.getTrait(Trait.BACKGROUND);
+        if (back != null) {
+
+            if (back.getColor() != null) {
+                graphics.setColor(back.getColor().getAWTColor());
+                graphics.fillRect(startx, starty, width, height);
+            }
+            if (back.getURL() != null) {  // TODO: implement
+                ImageFactory fact = ImageFactory.getInstance();
+                FopImage fopimage = fact.getImage(back.getURL(), userAgent);
+                if (fopimage != null && fopimage.load(FopImage.DIMENSIONS, userAgent)) {
+                    if (back.getRepeat() == BackgroundRepeat.REPEAT) {
+                        // create a pattern for the image
+                    } else {
+                        // place once
+                        Rectangle2D pos;
+                        pos = new Rectangle2D.Float((startx + back.getHoriz()) * 1000,
+                                                    (starty + back.getVertical()) * 1000,
+                                                    fopimage.getWidth() * 1000,
+                                                    fopimage.getHeight() * 1000);
+//                      putImage(back.getURL(), pos);
+                    }
+                }
+            }
+        }
+
+        BorderProps bps = (BorderProps) block.getTrait(Trait.BORDER_BEFORE);
+        if (bps != null) {
+            int endx = startx + width;
+            int bwidth = bps.width;
+            graphics.setColor(bps.color.getAWTColor());
+            graphics.drawLine(startx, starty + bwidth / 2, endx, starty + bwidth / 2);
+        }
+        bps = (BorderProps) block.getTrait(Trait.BORDER_START);
+        if (bps != null) {
+            int endy = starty + height;
+            int bwidth = bps.width;
+            graphics.setColor(bps.color.getAWTColor());
+            graphics.drawLine(startx + bwidth / 2, starty, startx + bwidth / 2, endy);
+        }
+        bps = (BorderProps) block.getTrait(Trait.BORDER_AFTER);
+        if (bps != null) {
+            int sy = starty + height;
+            int endx = startx + width;
+            int bwidth = bps.width;
+            graphics.setColor(bps.color.getAWTColor());
+            graphics.drawLine(startx, sy - bwidth / 2, endx, sy - bwidth / 2);
+        }
+        bps = (BorderProps) block.getTrait(Trait.BORDER_END);
+        if (bps != null) {
+            int sx = startx + width;
+            int endy = starty + height;
+            int bwidth = bps.width;
+            graphics.setColor(bps.color.getAWTColor());
+            graphics.drawLine(sx - bwidth / 2, starty, sx - bwidth / 2, endy);
+        }
+    }
 }
index 2770b9a750246eb587a5c1bf9efb41104f5ee9f3..25c4c297189d80cec470236ce473012558a60ec1 100644 (file)
@@ -67,46 +67,21 @@ import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
 
 // FOP
-import org.apache.fop.render.PrintRenderer;
-import org.apache.fop.render.RendererContext;
-import org.apache.fop.apps.FOUserAgent;
-import org.apache.fop.image.FopImage;
-import org.apache.fop.image.XMLImage;
-import org.apache.fop.image.ImageFactory;
 import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.Version;
-import org.apache.fop.fo.properties.RuleStyle;
-import org.apache.fop.fo.properties.BackgroundRepeat;
-import org.apache.fop.fonts.Typeface;
-import org.apache.fop.fonts.FontMetrics;
-import org.apache.fop.pdf.PDFEncryptionManager;
-import org.apache.fop.pdf.PDFFilterList;
-import org.apache.fop.pdf.PDFStream;
-import org.apache.fop.pdf.PDFDocument;
-import org.apache.fop.pdf.PDFInfo;
-import org.apache.fop.pdf.PDFResources;
-import org.apache.fop.pdf.PDFResourceContext;
-import org.apache.fop.pdf.PDFText;
-import org.apache.fop.pdf.PDFXObject;
-import org.apache.fop.pdf.PDFPage;
-import org.apache.fop.pdf.PDFState;
-import org.apache.fop.pdf.PDFLink;
-import org.apache.fop.pdf.PDFOutline;
-import org.apache.fop.pdf.PDFAnnotList;
-import org.apache.fop.pdf.PDFColor;
-import org.apache.fop.area.extensions.BookmarkData;
-
-import org.apache.fop.area.Trait;
-import org.apache.fop.area.TreeExt;
-import org.apache.fop.area.CTM;
-import org.apache.fop.area.Title;
-import org.apache.fop.area.PageViewport;
-import org.apache.fop.area.Page;
-import org.apache.fop.area.RegionViewport;
 import org.apache.fop.area.Area;
 import org.apache.fop.area.Block;
 import org.apache.fop.area.BlockViewport;
+import org.apache.fop.area.CTM;
 import org.apache.fop.area.LineArea;
+import org.apache.fop.area.Page;
+import org.apache.fop.area.PageViewport;
+import org.apache.fop.area.RegionViewport;
+import org.apache.fop.area.Title;
+import org.apache.fop.area.Trait;
+import org.apache.fop.area.TreeExt;
+import org.apache.fop.area.extensions.BookmarkData;
 import org.apache.fop.area.inline.Character;
 import org.apache.fop.area.inline.Word;
 import org.apache.fop.area.inline.Viewport;
@@ -114,10 +89,34 @@ import org.apache.fop.area.inline.ForeignObject;
 import org.apache.fop.area.inline.Image;
 import org.apache.fop.area.inline.Leader;
 import org.apache.fop.area.inline.InlineParent;
+import org.apache.fop.datatypes.ColorType;
+import org.apache.fop.fo.properties.BackgroundRepeat;
+import org.apache.fop.fo.properties.RuleStyle;
+import org.apache.fop.fonts.Typeface;
 import org.apache.fop.fonts.Font;
+import org.apache.fop.fonts.FontMetrics;
+import org.apache.fop.image.FopImage;
+import org.apache.fop.image.ImageFactory;
+import org.apache.fop.image.XMLImage;
+import org.apache.fop.pdf.PDFAnnotList;
+import org.apache.fop.pdf.PDFColor;
+import org.apache.fop.pdf.PDFDocument;
+import org.apache.fop.pdf.PDFEncryptionManager;
+import org.apache.fop.pdf.PDFFilterList;
+import org.apache.fop.pdf.PDFInfo;
+import org.apache.fop.pdf.PDFLink;
+import org.apache.fop.pdf.PDFOutline;
+import org.apache.fop.pdf.PDFPage;
+import org.apache.fop.pdf.PDFResourceContext;
+import org.apache.fop.pdf.PDFResources;
+import org.apache.fop.pdf.PDFState;
+import org.apache.fop.pdf.PDFStream;
+import org.apache.fop.pdf.PDFText;
+import org.apache.fop.pdf.PDFXObject;
+import org.apache.fop.render.PrintRenderer;
+import org.apache.fop.render.RendererContext;
 import org.apache.fop.traits.BorderProps;
-import org.apache.fop.datatypes.ColorType;
-import org.apache.fop.apps.*;
+
 
 /*
 todo:
@@ -494,12 +493,12 @@ public class PDFRenderer extends PrintRenderer {
     }
 
     /**
-     * Handle the viewport traits.
-     * This is used to draw the traits for a viewport.
-     *
-     * @param region the viewport region to handle
+     * 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
      */
-    protected void handleViewportTraits(RegionViewport region) {
+    protected void handleRegionTraits(RegionViewport region) {
         currentFontName = "";
         float startx = 0;
         float starty = 0;
index 97551e29bc777d042984cb80cc85379fb6a6f2bb..bf02f03fa2b26853bb2f2aa4720cd02ea6bf5f4c 100644 (file)
@@ -652,12 +652,12 @@ public class PSRenderer extends AbstractRenderer {
     }
 
     /**
-     * Handle the viewport traits.
-     * This is used to draw the traits for a viewport.
-     *
-     * @param region the viewport region to handle
+     * 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
      */
-    protected void handleViewportTraits(RegionViewport region) {
+    protected void handleRegionTraits(RegionViewport region) {
         currentFontName = "";
         float startx = 0;
         float starty = 0;
index f1953d7f200ca1d407c81a17b60af5185fd28037..723bdddfb2929b05a870234281d886837942b90d 100644 (file)
@@ -433,7 +433,7 @@ public class RTFHandler extends FOInputHandler {
            PDF output, so we will look for the default here & change it to
            white. */
         if ((fopValue.getRed() == 0) && (fopValue.getGreen() == 0)
-                && (fopValue.getBlue() == 0) && (fopValue.alpha() == 1)) {
+                && (fopValue.getBlue() == 0) && (fopValue.getAlpha() == 0)) {
             rtfColor = RtfColorTable.getInstance().getColorNumber("white");
         } else {
             rtfColor = convertFOPColorToRTF(fopValue);