gmazza 2003/10/01 17:32:02 Modified: src/java/org/apache/fop/area BodyRegion.java src/java/org/apache/fop/render/awt AWTRenderer.java Log: 1. BodyRegion's clone() now including child areas (makes it a bona fide clone() function, also AWTRenderer() needs it.) 2. Starting implementation of RenderWord() in AWTRenderer; also looking at an alternate implementation (storing a series of BufferedImages instead of the area tree elements); temporarily storing both strategies in this commit. Revision Changes Path 1.3 +3 -2 xml-fop/src/java/org/apache/fop/area/BodyRegion.java Index: BodyRegion.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/area/BodyRegion.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- BodyRegion.java 27 Aug 2003 18:14:45 -0000 1.2 +++ BodyRegion.java 2 Oct 2003 00:32:02 -0000 1.3 @@ -159,8 +159,6 @@ /** * Clone this object. - * This is only used to clone the current object, the child areas - * are assumed to be null and are not cloned. * * @return a shallow copy of this object */ @@ -170,6 +168,9 @@ br.setIPD(getIPD()); br.columnGap = columnGap; br.columnCount = columnCount; + br.beforeFloat = beforeFloat; + br.mainReference = mainReference; + br.footnote = footnote; return br; } } 1.15 +117 -38 xml-fop/src/java/org/apache/fop/render/awt/AWTRenderer.java Index: AWTRenderer.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/render/awt/AWTRenderer.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- AWTRenderer.java 21 Sep 2003 20:56:23 -0000 1.14 +++ AWTRenderer.java 2 Oct 2003 00:32:02 -0000 1.15 @@ -85,12 +85,17 @@ import org.apache.fop.area.PageViewport; import org.apache.fop.area.RegionViewport; import org.apache.fop.area.Trait; +import org.apache.fop.area.inline.Word; +import org.apache.fop.datatypes.ColorType; import org.apache.fop.fo.FOTreeControl; import org.apache.fop.fo.properties.BackgroundRepeat; +import org.apache.fop.fonts.Typeface; +import org.apache.fop.fonts.FontMetrics; 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.render.awt.FontMetricsMapper; import org.apache.fop.render.awt.viewer.PreviewDialog; import org.apache.fop.render.awt.viewer.Translator; @@ -101,10 +106,13 @@ 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; - + private int pageWidth = 0; + private int pageHeight = 0; + private Vector pageViewportList = new java.util.Vector(); + private Vector pageList = new java.util.Vector(); + private Vector bufferedImageList = new java.util.Vector(); + private BufferedImage currentPageImage = null; + /** Font configuration */ protected Document fontInfo; @@ -112,33 +120,16 @@ The InputHandler associated with this Renderer. Sent to the PreviewDialog for document reloading. */ - protected InputHandler inputHandler; + private InputHandler inputHandler; /** * The resource bundle used for AWT messages. */ protected Translator translator = null; - protected Map fontNames = new java.util.Hashtable(); - protected Map fontStyles = new java.util.Hashtable(); - protected Color saveColor = null; - - /** - * The current (internal) font name - */ - protected String currentFontName; - - /** - * The current font size in millipoints - */ - protected int currentFontSize; - - /** - * The current colour's red, green and blue component - */ - protected float currentRed = 0; - protected float currentGreen = 0; - protected float currentBlue = 0; + private Map fontNames = new java.util.Hashtable(); + private Map fontStyles = new java.util.Hashtable(); + private Color saveColor = null; /** * The preview dialog frame used for display of the documents. @@ -158,6 +149,13 @@ createPreviewDialog(null); } + /** + * @see org.apache.fop.render.Renderer + */ + public boolean supportsOutOfOrder() { + return false; + } + public Translator getTranslator() { return translator; } @@ -191,6 +189,7 @@ // empty pageViewportList, in case of a reload from PreviewDialog pageViewportList.removeAllElements(); pageList.removeAllElements(); + bufferedImageList.removeAllElements(); System.out.println("\nRegion Types: 0-Before/Top, 1-Start/Left, 2-Body, 3-End/Right, 4-After/Bottom"); } @@ -249,6 +248,11 @@ public void renderPage(PageViewport pageViewport) throws IOException, FOPException { pageViewportList.add(pageViewport); pageList.add(pageViewport.getPage().clone()); + bufferedImageList.add(getPageImage(pageViewport)); + } + + public BufferedImage getBufferedPageImage(int pageNum) throws FOPException { + return (BufferedImage) bufferedImageList.get(pageNum); } /** Generates a desired page from the renderer's page viewport vector. @@ -256,6 +260,51 @@ * @return the <code>java.awt.image.BufferedImage</code> corresponding to the page * @throws FOPException in case of an out-of-range page number requested */ + public BufferedImage getPageImage(PageViewport pageViewport) throws FOPException { + Page page = pageViewport.getPage(); + + Rectangle2D bounds = pageViewport.getViewArea(); + pageWidth = (int) Math.round(bounds.getWidth() / 1000f ); + pageHeight = (int) Math.round(bounds.getHeight() / 1000f ); +/* + 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 = currentPageImage.createGraphics(); + graphics.setRenderingHint (RenderingHints.KEY_FRACTIONALMETRICS, + RenderingHints.VALUE_FRACTIONALMETRICS_ON); + + // transform page based on scale factor supplied + AffineTransform at = graphics.getTransform(); + at.scale(scaleFactor / 100.0, scaleFactor / 100.0); + graphics.setTransform(at); + + // draw page frame + graphics.setColor(Color.white); + graphics.fillRect(0, 0, pageWidth, pageHeight); + graphics.setColor(Color.black); + graphics.drawRect(-1, -1, pageWidth + 2, pageHeight + 2); + graphics.drawLine(pageWidth + 2, 0, pageWidth + 2, pageHeight + 2); + graphics.drawLine(pageWidth + 3, 1, pageWidth + 3, pageHeight + 3); + graphics.drawLine(0, pageHeight + 2, pageWidth + 2, pageHeight + 2); + graphics.drawLine(1, pageHeight + 3, pageWidth + 3, pageHeight + 3); + + renderPageAreas(page); + return currentPageImage; + } + + /** Generates a desired page from the renderer's page viewport vector. + * @param pageNum the 0-based page number to generate + * @return the <code>java.awt.image.BufferedImage</code> corresponding to the page + * @throws FOPException in case of an out-of-range page number requested + */ public BufferedImage getPageImage(int pageNum) throws FOPException { if (pageNum < 0 || pageNum >= pageViewportList.size()) { throw new FOPException("out-of-range page number (" + pageNum @@ -266,8 +315,8 @@ Page page = (Page) pageList.get(pageNum); Rectangle2D bounds = pageViewport.getViewArea(); - int pageWidth = (int) Math.round(bounds.getWidth() / 1000f ); - int pageHeight = (int) Math.round(bounds.getHeight() / 1000f ); + pageWidth = (int) Math.round(bounds.getWidth() / 1000f ); + pageHeight = (int) Math.round(bounds.getHeight() / 1000f ); /* System.out.println("(Page) X, Y, Width, Height: " + bounds.getX() + " " + bounds.getY() @@ -298,8 +347,6 @@ graphics.drawLine(0, pageHeight + 2, pageWidth + 2, pageHeight + 2); graphics.drawLine(1, pageHeight + 3, pageWidth + 3, pageHeight + 3); - currentFontName = ""; - currentFontSize = 0; renderPageAreas(page); return currentPageImage; } @@ -311,8 +358,6 @@ * @param region the RegionViewport whose region is to be drawn */ protected void handleRegionTraits(RegionViewport region) { - currentFontName = ""; - currentFontSize = 0; Rectangle2D viewArea = region.getViewArea(); int startX = (int) Math.round((viewArea.getX() / 1000f) @@ -329,11 +374,7 @@ if (region.getRegion() != null) { System.out.print("\nRegion type = " + region.getRegion().getRegionClass()); } -/* System.out.println("\nView X, Width, Y, Height: " + viewArea.getX() - + " " + viewArea.getWidth() - + " " + viewArea.getY() - + " " + viewArea.getHeight() - ); */ + System.out.println(" X, Width, Y, Height: " + startX + " " + width + " " + startY @@ -391,8 +432,6 @@ if (bps != null) { int borderWidth = (int) Math.round((bps.width / 1000f) * (scaleFactor / 100f)); graphics.setColor(bps.color.getAWTColor()); -// System.out.println("Border at (" + startx + "," + (starty + height - borderWidth) + -// ") width, height: (" + (width) + "," + (borderWidth) + ")"); graphics.fillRect(startx, starty, width, borderWidth); } bps = (BorderProps) block.getTrait(Trait.BORDER_AFTER); @@ -417,5 +456,45 @@ graphics.fillRect(startx + width - borderWidth, starty, borderWidth, height); } + + } + + /** + * @see org.apache.fop.render.Renderer#renderWord(Word) + */ + public void renderWord(Word word) { + System.out.println("In render word: " + word.getWord()); + + Graphics2D graphics = currentPageImage.createGraphics(); + String fontName = (String) word.getTrait(Trait.FONT_NAME); + int size = ((Integer) word.getTrait(Trait.FONT_SIZE)).intValue(); +// Typeface f = (Typeface) fontInfo.getFonts().get(fontName); + ColorType ct = (ColorType) word.getTrait(Trait.COLOR); + + FontMetricsMapper mapper = (FontMetricsMapper) + fontInfo.getMetricsFor(fontName); + if (mapper == null) { + mapper = new FontMetricsMapper("MonoSpaced", java.awt.Font.PLAIN, + graphics); + } + +// graphics.setColor(ct.getAWTColor()); +// graphics.setFont(mapper.getFont(size)); + graphics.setColor(java.awt.Color.black); + graphics.setFont(new java.awt.Font("monospaced", java.awt.Font.PLAIN, + 10)); + + int rx = currentBlockIPPosition; + int bl = currentBPPosition + word.getOffset(); + + int newx = (int) (rx + 500) / 1000; + int newy = (int) (pageHeight - (bl + 500) / 1000); + + String s = word.getWord(); +// graphics.drawString(s, newx, newy); + graphics.drawString(s, 220, 200); + + // TODO: render text decorations + currentBlockIPPosition += word.getWidth(); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]