From 7f6b6ea8014b475d7e0c8ba1ae5a100022083a06 Mon Sep 17 00:00:00 2001 From: fotis Date: Sun, 19 Mar 2000 10:29:41 +0000 Subject: [PATCH] adds border support (contributed by Jon Smirl) also to the awt rendering (Jon Smirl, Fotis Jannidis) git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193300 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/fop/render/awt/AWTRenderer.java | 454 +++++++++++------- 1 file changed, 274 insertions(+), 180 deletions(-) diff --git a/src/org/apache/fop/render/awt/AWTRenderer.java b/src/org/apache/fop/render/awt/AWTRenderer.java index 110f05ea1..039912ff4 100644 --- a/src/org/apache/fop/render/awt/AWTRenderer.java +++ b/src/org/apache/fop/render/awt/AWTRenderer.java @@ -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()); } } - - - - -- 2.39.5