arved       02/04/23 15:26:59

  Modified:    src/org/apache/fop/render Tag: fop-0_20_2-maintain
                        AbstractRenderer.java PrintRenderer.java
  Log:
  support for background-image (all renderers)
  author: Michael Gratton
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.4.2.2   +229 -12   xml-fop/src/org/apache/fop/render/AbstractRenderer.java
  
  Index: AbstractRenderer.java
  ===================================================================
  RCS file: /x1/home/cvs/xml-fop/src/org/apache/fop/render/AbstractRenderer.java,v
  retrieving revision 1.4.2.1
  retrieving revision 1.4.2.2
  diff -u -r1.4.2.1 -r1.4.2.2
  --- AbstractRenderer.java     17 Mar 2002 23:37:07 -0000      1.4.2.1
  +++ AbstractRenderer.java     23 Apr 2002 22:26:58 -0000      1.4.2.2
  @@ -1,5 +1,5 @@
   /*
  - * $Id: AbstractRenderer.java,v 1.4.2.1 2002/03/17 23:37:07 chrisg Exp $
  + * $Id: AbstractRenderer.java,v 1.4.2.2 2002/04/23 22:26:58 arved Exp $
    * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
    * For details on use and redistribution please refer to the
    * LICENSE file included with these sources.
  @@ -8,9 +8,9 @@
   package org.apache.fop.render;
   
   // FOP
  -import org.apache.fop.pdf.PDFPathPaint;
  -import org.apache.fop.pdf.PDFColor;
   import org.apache.fop.image.ImageArea;
  +import org.apache.fop.image.FopImage;
  +import org.apache.fop.image.FopImageException;
   import org.apache.fop.apps.FOPException;
   import org.apache.fop.fo.properties.*;
   import org.apache.fop.layout.*;
  @@ -64,6 +64,133 @@
       protected abstract void doFrame(Area area);
   
       /**
  +     * Renders an area's background.
  +     * @param x the x position of the left edge in millipoints
  +     * @param y the y position of top edge in millipoints
  +     * @param w the width in millipoints
  +     * @param h the height in millipoints
  +     */
  +    protected void doBackground(Area area, int x, int y, int w, int h) {
  +     System.out.println("Doing background: " + area);
  +     System.out.println("   x:" + x + " y:" + y);
  +     System.out.println("   w:" + w + " h:" + h);
  +
  +     if (h == 0 || w == 0)
  +         return;
  +
  +     BackgroundProps props = area.getBackground();
  +     if (props == null)
  +         return;
  +
  +     if (props.backColor.alpha() == 0) {
  +         this.addFilledRect(x, y, w, -h, props.backColor);
  +     }
  +     
  +     // XXX: I'm ignoring area rotation here 8(
  +     //      is this taken care of for me elsewhere in the codebase?
  +     if (props.backImage != null) {
  +         int imgW;
  +         int imgH;   
  +         try {
  +             // XXX: do correct unit conversion here
  +             imgW = props.backImage.getWidth() * 1000;
  +             imgH = props.backImage.getHeight() * 1000;
  +         }
  +         catch (FopImageException fie) {
  +             log.error("Error obtaining bg image width and height", fie);
  +             return;
  +         }
  +
  +         int dx = x;
  +         int dy = y;
  +         int endX = x + w;
  +         int endY = y - h;
  +         int clipW = w % imgW;
  +         int clipH = h % imgH;
  +
  +         boolean repeatX = true;
  +         boolean repeatY = true;
  +         switch (props.backRepeat) {
  +         case BackgroundRepeat.REPEAT:
  +             break;
  +
  +         case BackgroundRepeat.REPEAT_X:
  +             repeatY = false;
  +             break;
  +
  +         case BackgroundRepeat.REPEAT_Y:
  +             repeatX = false;
  +             break;
  +
  +         case BackgroundRepeat.NO_REPEAT:
  +             repeatX = false;
  +             repeatY = false;
  +             break;
  +
  +         case BackgroundRepeat.INHERIT:
  +             // XXX: what to do here?
  +             break;
  +
  +         default:
  +             log.error("Ignoring invalid background-repeat property");
  +         }
  +
  +         FontState fs = area.getFontState();
  +
  +         while (dy > endY) { // looping through rows
  +             while (dx < endX) { // looping through cols
  +                 if (dx + imgW <= endX) {
  +                     // no x clipping
  +                     if (dy - imgH >= endY) {
  +                         // no x clipping, no y clipping
  +                         drawImageScaled(dx, dy, imgW, imgH,
  +                                         props.backImage, fs);
  +                     }
  +                     else {
  +                         // no x clipping, y clipping
  +                         drawImageClipped(dx, dy,
  +                                          0, 0, imgW, clipH,
  +                                          props.backImage, fs);
  +                     }
  +                 }
  +                 else {
  +                     // x clipping
  +                     if (dy - imgH >= endY) {
  +                         // x clipping, no y clipping
  +                         drawImageClipped(dx, dy,
  +                                          0, 0, clipW, imgH,
  +                                          props.backImage, fs);
  +                     }
  +
  +                     else {
  +                         // x clipping, y clipping
  +                         drawImageClipped(dx, dy,
  +                                          0, 0, clipW, clipH,
  +                                          props.backImage, fs);
  +                     }
  +                 }
  +
  +                 if (repeatX) {
  +                     dx += imgW;
  +                 }
  +                 else {
  +                     break;
  +                 }
  +             } // end looping through cols
  +
  +             dx = x;
  +
  +             if (repeatY) {
  +                 dy -= imgH;
  +             }
  +             else {
  +                 break;
  +             }
  +         } // end looping through rows
  +     }
  +    }
  +
  +    /**
        * Add a filled rectangle to the current stream
        * This default implementation calls addRect
        * using the same color for fill and border.
  @@ -77,6 +204,95 @@
       protected abstract void addFilledRect(int x, int y, int w, int h,
                                    ColorType col);
   
  +    /**
  +     * Renders an image, rendered at the image's intrinsic size.
  +     * This by default calls drawImageScaled() with the image's
  +     * intrinsic width and height, but implementations may
  +     * override this method if it can provide a more efficient solution.
  +     * 
  +     * @param x the x position of left edge in millipoints
  +     * @param y the y position of top edge in millipoints
  +     * @param image the image to be rendered
  +     * @param fs the font state to use when rendering text
  +     *           in non-bitmapped images.
  +     */
  +    protected void drawImage(int x, int y, FopImage image, FontState fs) {
  +     int w;
  +     int h;
  +     try {
  +         // XXX: convert these units correctly
  +         w = image.getWidth() * 1000;
  +         h = image.getHeight() * 1000;
  +     }
  +     catch (FopImageException e) {
  +         log.error("Failed to obtain the image width and height", e);
  +         return;
  +     }
  +     drawImageScaled(x, y, w, h, image, fs);
  +    }
  +
  +    /**
  +     * Renders an image, scaling it to the given width and height.
  +     * If the scaled width and height is the same intrinsic size
  +     * of the image, the image is not scaled.
  +     * 
  +     * @param x the x position of left edge in millipoints
  +     * @param y the y position of top edge in millipoints
  +     * @param w the width in millipoints
  +     * @param h the height in millipoints
  +     * @param image the image to be rendered
  +     * @param fs the font state to use when rendering text
  +     *           in non-bitmapped images.
  +     */
  +    protected abstract void drawImageScaled(int x, int y, int w, int h,
  +                                         FopImage image,
  +                                         FontState fs);
  +
  +    /**
  +     * Renders an image, clipping it as specified. 
  +     * 
  +     * @param x the x position of left edge in millipoints.
  +     * @param y the y position of top edge in millipoints.
  +     * @param clipX the left edge of the clip in millipoints
  +     * @param clipY the top edge of the clip in millipoints
  +     * @param clipW the clip width in millipoints
  +     * @param clipH the clip height in millipoints
  +     * @param fill the image to be rendered
  +     * @param fs the font state to use when rendering text
  +     *           in non-bitmapped images.
  +     */
  +    protected abstract void drawImageClipped(int x, int y,
  +                                          int clipX, int clipY,
  +                                          int clipW, int clipH,
  +                                          FopImage image,
  +                                          FontState fs);
  +
  +    /**
  +     * Render an image area.
  +     *
  +     * @param area the image area to render
  +     */
  +    public void renderImageArea(ImageArea area) {
  +        // adapted from contribution by BoBoGi
  +        int x = this.currentXPosition + area.getXOffset();
  +        int y = this.currentYPosition;
  +        int w = area.getContentWidth();
  +        int h = area.getHeight();
  +
  +        this.currentYPosition -= h;
  +
  +        FopImage img = area.getImage();
  +
  +        if (img == null) {
  +            log.error("Error while loading image : area.getImage() is null");
  +     }
  +     else {
  +         drawImageScaled(x, y, w, h, img, area.getFontState());
  +     }
  +
  +        this.currentXPosition += w;
  +    }
  +
       public void renderBodyAreaContainer(BodyAreaContainer area) {
           int saveY = this.currentYPosition;
           int saveX = this.currentAreaContainerXPosition;
  @@ -91,18 +307,19 @@
           }
   
           this.currentXPosition = this.currentAreaContainerXPosition;
  -        int w, h;
           int rx = this.currentAreaContainerXPosition;
  -        w = area.getContentWidth();
  -        h = area.getContentHeight();
           int ry = this.currentYPosition;
  -        ColorType bg = area.getBackgroundColor();
  +     // XXX: ([EMAIL PROTECTED]) I had to use getAllocationWidth()
  +     // and getMaxHeight() as the content width and height are
  +     // always 0. Is this supposed to be the case?
  +     // IMHO, the bg should cover the entire area anyway, not
  +     // just the parts with content, which makes this correct.
  +     // Probably want to check this for the other region
  +     // areas as well.
  +     int w = area.getAllocationWidth();
  +        int h = area.getMaxHeight();
   
  -        // I'm not sure I should have to check for bg being null
  -        // but I do
  -        if ((bg != null) && (bg.alpha() == 0)) {
  -            addFilledRect(rx, ry, w, -h, bg);
  -        }
  +     doBackground(area, rx, ry, w, h);
   
           // floats & footnotes stuff
           renderAreaContainer(area.getBeforeFloatReferenceArea());
  
  
  
  1.14.2.2  +2 -15     xml-fop/src/org/apache/fop/render/PrintRenderer.java
  
  Index: PrintRenderer.java
  ===================================================================
  RCS file: /x1/home/cvs/xml-fop/src/org/apache/fop/render/PrintRenderer.java,v
  retrieving revision 1.14.2.1
  retrieving revision 1.14.2.2
  diff -u -r1.14.2.1 -r1.14.2.2
  --- PrintRenderer.java        9 Jan 2002 11:32:57 -0000       1.14.2.1
  +++ PrintRenderer.java        23 Apr 2002 22:26:58 -0000      1.14.2.2
  @@ -1,5 +1,5 @@
   /*
  - * $Id: PrintRenderer.java,v 1.14.2.1 2002/01/09 11:32:57 keiron Exp $
  + * $Id: PrintRenderer.java,v 1.14.2.2 2002/04/23 22:26:58 arved Exp $
    * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
    * For details on use and redistribution please refer to the
    * LICENSE file included with these sources."
  @@ -13,7 +13,6 @@
   // FOP
   import org.apache.fop.pdf.PDFPathPaint;
   import org.apache.fop.pdf.PDFColor;
  -import org.apache.fop.image.ImageArea;
   import org.apache.fop.apps.FOPException;
   import org.apache.fop.fo.properties.*;
   import org.apache.fop.layout.*;
  @@ -191,18 +190,13 @@
               rx += ((BlockArea)area).getStartIndent();
           h = area.getContentHeight();
           int ry = this.currentYPosition;
  -        ColorType bg = area.getBackgroundColor();
   
           rx = rx - area.getPaddingLeft();
           ry = ry + area.getPaddingTop();
           w = w + area.getPaddingLeft() + area.getPaddingRight();
           h = h + area.getPaddingTop() + area.getPaddingBottom();
   
  -        // I'm not sure I should have to check for bg being null
  -        // but I do
  -        if ((bg != null) && (bg.alpha() == 0)) {
  -            this.addFilledRect(rx, ry, w, -h, new PDFColor(bg));
  -        }
  +     doBackground(area, rx, ry, w, h);
   
           // rx = rx - area.getBorderLeftWidth();
           // ry = ry + area.getBorderTopWidth();
  @@ -258,13 +252,6 @@
           int d = space.getSize();
           this.currentYPosition -= d;
       }
  -
  -    /**
  -     * render image area
  -     * 
  -     * @param area the image area to render
  -     */
  -    public abstract void renderImageArea(ImageArea area);
   
       /**
        * render a foreign object area
  
  
  

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

Reply via email to