]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
adds border support (contributed by Jon Smirl) also to the awt rendering (Jon Smirl...
authorfotis <fotis@unknown>
Sun, 19 Mar 2000 10:29:41 +0000 (10:29 +0000)
committerfotis <fotis@unknown>
Sun, 19 Mar 2000 10:29:41 +0000 (10:29 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193300 13f79535-47bb-0310-9956-ffa450edef68

src/org/apache/fop/render/awt/AWTRenderer.java

index 110f05ea1969f3455fa5a721152757114789b3c6..039912ff4e2b744fda0b46b4258542fb983d6afd 100644 (file)
@@ -9,7 +9,6 @@ package org.apache.fop.render.awt;
   Stanislav Gorkhover: Stanislav.Gorkhover@af-software.de
  */
 
-
 import org.apache.fop.layout.*;
 import org.apache.fop.datatypes.*;
 import org.apache.fop.image.*;
@@ -18,9 +17,6 @@ import org.apache.fop.render.pdf.*;
 import org.apache.fop.viewer.*;
 import org.apache.fop.apps.*;
 
-
-
-
 import java.awt.*;
 import java.awt.image.*;
 import java.awt.geom.*;
@@ -45,17 +41,16 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
 
   protected Hashtable fontNames = new Hashtable();
   protected Hashtable fontStyles = new Hashtable();
+  protected Color saveColor;
 
 
   // Key - Font name, Value - java Font name.
   protected static Hashtable JAVA_FONT_NAMES;
 
-
   protected Graphics2D graphics = null;
 
   protected DocumentPanel documentPanel = null;
 
-
   /** the current (internal) font name */
   protected String currentFontName;
 
@@ -83,7 +78,6 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
 
   // String oldFontName = null;
 
-
   static {
     JAVA_FONT_NAMES = new Hashtable();
     JAVA_FONT_NAMES.put("Times", "serif");
@@ -93,7 +87,6 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
     // JAVA_FONT_NAMES.put("Serif", "sansserif");
   }
 
-
   public AWTRenderer(Translator aRes) {
     res = aRes;
   }
@@ -130,6 +123,63 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
   }
 
 
+    /**
+     * add a line to the current stream
+     *
+     * @param x1 the start x location in millipoints
+     * @param y1 the start y location in millipoints
+     * @param x2 the end x location in millipoints
+     * @param y2 the end y location in millipoints
+     * @param th the thickness in millipoints
+     * @param r the red component
+     * @param g the green component
+     * @param b the blue component
+     */
+    protected void addLine(int x1, int y1, int x2, int y2, int th,
+      float r, float g, float b) {
+      graphics.setColor(new Color (r,g,b));
+      graphics.drawLine((int)(x1/1000f), pageHeight - (int)(y1/1000f), (int)(x2/1000f), pageHeight - (int)(y2/1000f));
+    }
+
+
+    /**
+     * draw a filled rectangle
+     *
+     * @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 r the red component
+     * @param g the green component
+     * @param b the blue component
+     */
+    protected void addRect(int x, int y, int w, int h,
+         float r, float g, float b) {
+      graphics.setColor(new Color (r,g,b));
+      graphics.fill3DRect((int) (x/1000f),pageHeight - (int) (y/1000f),(int) (w/1000f),-(int) (h/1000f),false);
+    }
+
+    /**
+     * draw a filled rectangle
+     *
+     * @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 r the red component of edges
+     * @param g the green component of edges
+     * @param b the blue component of edges
+     * @param fr the red component of the fill
+     * @param fg the green component of the fill
+     * @param fb the blue component of the fill
+     */
+    protected void addRect(int x, int y, int w, int h,
+         float r, float g, float b,
+         float fr, float fg, float fb) {
+      graphics.setColor(new Color (r,g,b));
+      graphics.fill3DRect((int) (x/1000f),pageHeight - (int) (y/1000f),(int) (w/1000f),-(int) (h/1000f),true);
+    }
+
   /**
    * Vor dem Druck einzustellen:
    *
@@ -158,7 +208,6 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
 
     graphics.drawLine(0, height+2, width+2, height+2);
     graphics.drawLine(1, height+3, width+3, height+3);
-
   }
 
 
@@ -184,74 +233,122 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
   }
 
   public void renderPage(Page page) {
-       AreaContainer body, before, after;
-
-       body = page.getBody();
-       before = page.getBefore();
-       after = page.getAfter();
+    AreaContainer body, before, after;
 
-       this.currentFontName = "";
-       this.currentFontSize = 0;
+    body = page.getBody();
+    before = page.getBefore();
+    after = page.getAfter();
 
-       renderAreaContainer(body);
+    this.currentFontName = "";
+    this.currentFontSize = 0;
 
-       if (before != null) {
-           renderAreaContainer(before);
-       }
+    renderAreaContainer(body);
 
-       if (after != null) {
-           renderAreaContainer(after);
-       }
+    if (before != null) {
+        renderAreaContainer(before);
+    }
 
+    if (after != null) {
+        renderAreaContainer(after);
+    }
   }
 
-
   public void renderAreaContainer(AreaContainer area) {
 
+    int saveY = this.currentYPosition;
+    int saveX = this.currentAreaContainerXPosition;
+
+    if (area.getPosition() == org.apache.fop.fo.properties.Position.ABSOLUTE) {
+        // Y position is computed assuming positive Y axis, adjust for negative postscript one
+      this.currentYPosition = area.getYPosition() - 2 * area.getPaddingTop() - 2 * area.borderWidthTop;
+      this.currentAreaContainerXPosition = area.getXPosition();
+    } else if (area.getPosition() == org.apache.fop.fo.properties.Position.RELATIVE) {
+      this.currentYPosition -= area.getYPosition();
+       this.currentAreaContainerXPosition += area.getXPosition();
+    } else if (area.getPosition() == org.apache.fop.fo.properties.Position.STATIC) {
+      this.currentYPosition -= area.getPaddingTop() + area.borderWidthTop;
+      this.currentAreaContainerXPosition += area.getPaddingLeft() + area.borderWidthLeft;
+    }
+
+    doFrame(area);
 
-       this.currentYPosition = area.getYPosition();
-       this.currentAreaContainerXPosition = area.getXPosition();
+    Enumeration e = area.getChildren().elements();
+    while (e.hasMoreElements()) {
+     org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
+     b.render(this);
+    }
 
-       Enumeration e = area.getChildren().elements();
-       while (e.hasMoreElements()) {
-           org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
-           b.render(this);
-       }
+    if (area.getPosition() != org.apache.fop.fo.properties.Position.STATIC) {
+      this.currentYPosition = saveY;
+      this.currentAreaContainerXPosition = saveX;
+    } else {
+      this.currentYPosition -= area.getHeight();
+    }
+  }
+
+  private void doFrame(org.apache.fop.layout.Area area) {
+    int w, h;
+    int rx = this.currentAreaContainerXPosition;
+    w = area.getContentWidth();
+    if (area instanceof BlockArea)
+    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.addRect(rx, ry, w, -h,
+      bg.red(), bg.green(), bg.blue(),
+      bg.red(), bg.green(), bg.blue());
+    }
+
+    rx = rx - area.borderWidthLeft;
+    ry = ry + area.borderWidthTop;
+    w = w + area.borderWidthLeft + area.borderWidthRight;
+    h = h + area.borderWidthTop + area.borderWidthBottom;
+
+    if (area.borderWidthTop != 0)
+      addLine(rx, ry, rx + w, ry,
+          area.borderWidthTop,
+          area.borderColorTop.red(), area.borderColorTop.green(), area.borderColorTop.blue());
+    if (area.borderWidthLeft != 0)
+      addLine(rx, ry, rx, ry - h,
+          area.borderWidthLeft,
+          area.borderColorLeft.red(), area.borderColorLeft.green(), area.borderColorLeft.blue());
+    if (area.borderWidthRight != 0)
+      addLine(rx + w, ry, rx + w, ry - h,
+          area.borderWidthRight,
+          area.borderColorRight.red(), area.borderColorRight.green(), area.borderColorRight.blue());
+    if (area.borderWidthBottom != 0)
+      addLine(rx, ry - h, rx + w, ry - h,
+          area.borderWidthBottom,
+          area.borderColorBottom.red(), area.borderColorBottom.green(), area.borderColorBottom.blue());
   }
 
 
 
   protected Rectangle2D getBounds(org.apache.fop.layout.Area a) {
     return new Rectangle2D.Double(currentAreaContainerXPosition,
-                                  currentYPosition,
-                                  a.getAllocationWidth(),
-                                  a.getHeight());
+                            currentYPosition,
+                            a.getAllocationWidth(),
+                            a.getHeight());
   }
 
-    public void renderBlockArea(BlockArea area) {
-       int rx = this.currentAreaContainerXPosition
-           + area.getStartIndent();
-       int ry = this.currentYPosition;
-       int w = area.getContentWidth();
-       int h = area.getHeight();
-    ColorType bg = area.getBackgroundColor();
-       if ((bg != null) && (bg.alpha() == 0)) {
-      Color oldColor = graphics.getColor();
-      // Color bgColor = new Color(bg.red(), bg.green(), bg.blue());
-      Color bgColor = colorType2Color(bg);
-      graphics.setColor(bgColor);
-      graphics.fillRect((int)(rx / 1000f), (int)(pageHeight - ry/ 1000f),
-                        (int)(w / 1000f), (int)(h / 1000f));
-      graphics.setColor(oldColor);
+  public void renderBlockArea(BlockArea area) {
+    doFrame(area);
+    Enumeration e = area.getChildren().elements();
+    while (e.hasMoreElements()) {
+      org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
+      b.render(this);
     }
-
-       Enumeration e = area.getChildren().elements();
-       while (e.hasMoreElements()) {
-           org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
-           b.render(this);
-       }
-    }
-
+  }
 
   public void setupFontInfo(FontInfo fontInfo) {
     FontSetup.setup(fontInfo);
@@ -286,77 +383,76 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
 
 
 
-    public void renderDisplaySpace(DisplaySpace space) {
-       int d = space.getSize();
-       this.currentYPosition -= d;
-    }
-
+  public void renderDisplaySpace(DisplaySpace space) {
+    int d = space.getSize();
+    this.currentYPosition -= d;
+  }
 
-    public void renderImageArea(ImageArea area) {
-       int x = this.currentAreaContainerXPosition +
-           area.getXOffset();
-       int y = this.currentYPosition;
-       int w = area.getContentWidth();
-       int h = area.getHeight();
 
+  public void renderImageArea(ImageArea area) {
+    int x = this.currentAreaContainerXPosition +
+        area.getXOffset();
+    int y = this.currentYPosition;
+    int w = area.getContentWidth();
+    int h = area.getHeight();
 
-       FopImage img = area.getImage();
+    FopImage img = area.getImage();
 
-    if (img == null) {
-      System.out.println("area.getImage() is null");
-    }
+      if (img == null) {
+        System.out.println("area.getImage() is null");
+      }
 
-    int[] map = img.getimagemap();
+      int[] map = img.getimagemap();
 
-    String path = img.gethref();
-    // path = "c:/any.gif";
+      String path = img.gethref();
+      // path = "c:/any.gif";
 
-    ImageIcon icon = new ImageIcon(path);
+      ImageIcon icon = new ImageIcon(path);
 
-    Image imgage = icon.getImage();
+      Image imgage = icon.getImage();
 
-    graphics.drawImage(imgage, currentXPosition / 1000,
-                       pageHeight - y / 1000,
-                       img.getWidth() / 1000,
-                       img.getHeight() / 1000,
-                       null);
+      graphics.drawImage(imgage, currentXPosition / 1000,
+                         pageHeight - y / 1000,
+                         img.getWidth() / 1000,
+                         img.getHeight() / 1000,
+                         null);
 
-       currentYPosition -= h;
-    }
+    currentYPosition -= h;
+  }
 
 
 
 
   public void renderInlineArea(InlineArea area) {
-       char ch;
-       StringBuffer pdf = new StringBuffer();
+    char ch;
+    StringBuffer pdf = new StringBuffer();
 
-       String name = area.getFontState().getFontName();
-       int size = area.getFontState().getFontSize();
+    String name = area.getFontState().getFontName();
+    int size = area.getFontState().getFontSize();
 
-       float red = area.getRed();
-       float green = area.getGreen();
-       float blue = area.getBlue();
+    float red = area.getRed();
+    float green = area.getGreen();
+    float blue = area.getBlue();
 
-       if ((!name.equals(this.currentFontName))
-           || (size != this.currentFontSize)) {
-           this.currentFontName = name;
-           this.currentFontSize = size;
-       }
+    if ((!name.equals(this.currentFontName))
+        || (size != this.currentFontSize)) {
+        this.currentFontName = name;
+        this.currentFontSize = size;
+    }
 
-       if ((red != this.currentRed)
-           || (green != this.currentGreen)
-           || (blue != this.currentBlue)) {
-           this.currentRed = red;
-           this.currentGreen = green;
-           this.currentBlue = blue;
-       }
+    if ((red != this.currentRed)
+        || (green != this.currentGreen)
+        || (blue != this.currentBlue)) {
+        this.currentRed = red;
+        this.currentGreen = green;
+        this.currentBlue = blue;
+    }
 
-       int rx = this.currentXPosition;
-       int bl = this.currentYPosition;
+    int rx = this.currentXPosition;
+    int bl = this.currentYPosition;
 
 
-       String s = area.getText();
+    String s = area.getText();
     Color oldColor = graphics.getColor();
     java.awt.Font oldFont = graphics.getFont();
     String aFontName = fontNames.get(name).toString();
@@ -390,50 +486,51 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
     graphics.setColor(oldColor);
 
 
-       this.currentXPosition += area.getContentWidth();
-    }
+    this.currentXPosition += area.getContentWidth();
+  }
 
-    public void renderInlineSpace(InlineSpace space) {
-       this.currentXPosition += space.getSize();
-    }
 
+  public void renderInlineSpace(InlineSpace space) {
+    this.currentXPosition += space.getSize();
+  }
 
-    public void renderLineArea(LineArea area) {
-       int rx = this.currentAreaContainerXPosition
-           + area.getStartIndent();
-       int ry = this.currentYPosition;
-       int w = area.getContentWidth();
-       int h = area.getHeight();
 
-       this.currentYPosition -= area.getPlacementOffset();
-       this.currentXPosition = rx;
+  public void renderLineArea(LineArea area) {
+    int rx = this.currentAreaContainerXPosition
+        + area.getStartIndent();
+    int ry = this.currentYPosition;
+    int w = area.getContentWidth();
+    int h = area.getHeight();
 
-       int bl = this.currentYPosition;
+    this.currentYPosition -= area.getPlacementOffset();
+    this.currentXPosition = rx;
 
-       Enumeration e = area.getChildren().elements();
-       while (e.hasMoreElements()) {
-           org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
-           b.render(this);
-       }
+    int bl = this.currentYPosition;
 
-       this.currentYPosition = ry-h;
+    Enumeration e = area.getChildren().elements();
+    while (e.hasMoreElements()) {
+        org.apache.fop.layout.Box b = (org.apache.fop.layout.Box) e.nextElement();
+        b.render(this);
     }
 
-    /**
-     * render rule area into PDF
-     *
-     * @param area area to render
-     */
-    public void renderRuleArea(RuleArea area) {
-       int rx = this.currentAreaContainerXPosition
-           + area.getStartIndent();
-       int ry = this.currentYPosition;
-       int w = area.getContentWidth();
-       int h = area.getHeight();
-       int th = area.getRuleThickness();
-       float r = area.getRed();
-       float g = area.getGreen();
-       float b = area.getBlue();
+    this.currentYPosition = ry-h;
+  }
+
+  /**
+   * render rule area into PDF
+   *
+   * @param area area to render
+   */
+  public void renderRuleArea(RuleArea area) {
+    int rx = this.currentAreaContainerXPosition
+        + area.getStartIndent();
+    int ry = this.currentYPosition;
+    int w = area.getContentWidth();
+    int h = area.getHeight();
+    int th = area.getRuleThickness();
+    float r = area.getRed();
+    float g = area.getGreen();
+    float b = area.getBlue();
 
 
     Color oldColor = graphics.getColor();
@@ -444,42 +541,42 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
                       (int)(w / 1000f), (int)(th / 1000f));
     graphics.setColor(oldColor);
 
-    }
+  }
 
 
-    public void renderSVGArea(SVGArea area) {
-       int x = this.currentAreaContainerXPosition;
-       int y = this.currentYPosition;
-       int w = area.getContentWidth();
-       int h = area.getHeight();
-       this.currentYPosition -= h;
-  /*
-       Enumeration e = area.getChildren().elements();
-       while (e.hasMoreElements()) {
-           Object o = e.nextElement();
-           if (o instanceof RectGraphic) {
-               int rx = ((RectGraphic)o).x;
-               int ry = ((RectGraphic)o).y;
-               int rw = ((RectGraphic)o).width;
-               int rh = ((RectGraphic)o).height;
-               addRect(x+rx,y-ry,rw,-rh,0,0,0);
-           } else if (o instanceof LineGraphic) {
-               int x1 = ((LineGraphic)o).x1;
-               int y1 = ((LineGraphic)o).y1;
-               int x2 = ((LineGraphic)o).x2;
-               int y2 = ((LineGraphic)o).y2;
-               addLine(x+x1,y-y1,x+x2,y-y2,0,0,0,0);
-           } else if (o instanceof TextGraphic) {
-               int tx = ((TextGraphic)o).x;
-               int ty = ((TextGraphic)o).y;
-               String s = ((TextGraphic)o).s;
-               currentStream.add("1 0 0 1 "
-                                 + ((x+tx)/1000f) + " "
-                                 + ((y-ty)/1000f) + " Tm "
-                                 + "(" + s + ") Tj\n");
-           }
-       } */
-    }
+  public void renderSVGArea(SVGArea area) {
+    int x = this.currentAreaContainerXPosition;
+    int y = this.currentYPosition;
+    int w = area.getContentWidth();
+    int h = area.getHeight();
+    this.currentYPosition -= h;
+    /*
+    Enumeration e = area.getChildren().elements();
+    while (e.hasMoreElements()) {
+        Object o = e.nextElement();
+        if (o instanceof RectGraphic) {
+          int rx = ((RectGraphic)o).x;
+          int ry = ((RectGraphic)o).y;
+          int rw = ((RectGraphic)o).width;
+          int rh = ((RectGraphic)o).height;
+          addRect(x+rx,y-ry,rw,-rh,0,0,0);
+        } else if (o instanceof LineGraphic) {
+          int x1 = ((LineGraphic)o).x1;
+          int y1 = ((LineGraphic)o).y1;
+          int x2 = ((LineGraphic)o).x2;
+          int y2 = ((LineGraphic)o).y2;
+          addLine(x+x1,y-y1,x+x2,y-y2,0,0,0,0);
+        } else if (o instanceof TextGraphic) {
+          int tx = ((TextGraphic)o).x;
+          int ty = ((TextGraphic)o).y;
+          String s = ((TextGraphic)o).s;
+          currentStream.add("1 0 0 1 "
+                + ((x+tx)/1000f) + " "
+                + ((y-ty)/1000f) + " Tm "
+                + "(" + s + ") Tj\n");
+        }
+    } */
+  }
 
 
 
@@ -543,14 +640,11 @@ public class AWTRenderer implements org.apache.fop.render.Renderer, Printable, P
   }
 
   public static Color colorType2Color(ColorType ct) {
-    if (ct == null)
+    if (ct == null) {
       return null;
+    }
     return new Color(ct.red(), ct.green(), ct.blue());
   }
 
 }
 
-
-
-
-