From 1d584c0578e207f856a557a3a583b6be273012f6 Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Fri, 20 Jan 2006 13:09:05 +0000 Subject: [PATCH] (Re?)added integer page number to the PageViewport. Serializing both the integer and the formatted value to the area tree XML. In the XML "nr" is now "formatted-nr" and "nr" is now the integer value. This doesn't have any impact on our layout engine tests as we don't seem to use a non-default for page numbers. Make the current PageViewport available to XMLHandler through the RenderContext. I need this for Barcode4J so the current page number can be used as part of a barcode message. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@370801 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/fop/area/AreaTreeParser.java | 4 +- .../org/apache/fop/area/PageViewport.java | 25 +++- src/java/org/apache/fop/layoutmgr/Page.java | 5 +- .../layoutmgr/PageSequenceLayoutManager.java | 2 +- .../apache/fop/render/AbstractRenderer.java | 17 ++- .../fop/render/RendererContextConstants.java | 3 + .../fop/render/java2d/Java2DRenderer.java | 127 +++++++++--------- .../apache/fop/render/pdf/PDFRenderer.java | 4 +- .../org/apache/fop/render/ps/PSRenderer.java | 2 + .../apache/fop/render/xml/XMLRenderer.java | 3 +- 10 files changed, 118 insertions(+), 74 deletions(-) diff --git a/src/java/org/apache/fop/area/AreaTreeParser.java b/src/java/org/apache/fop/area/AreaTreeParser.java index ad1017505..a05b83f05 100644 --- a/src/java/org/apache/fop/area/AreaTreeParser.java +++ b/src/java/org/apache/fop/area/AreaTreeParser.java @@ -218,7 +218,9 @@ public class AreaTreeParser { throw new IllegalStateException("currentPageViewport must be null"); } Rectangle2D viewArea = parseRect(attributes.getValue("bounds")); - currentPageViewport = new PageViewport(viewArea, attributes.getValue("nr")); + int pageNumber = getAttributeAsInteger(attributes, "nr", -1); + String pageNumberString = attributes.getValue("formatted-nr"); + currentPageViewport = new PageViewport(viewArea, pageNumber, pageNumberString); } else if ("page".equals(localName)) { Page p = new Page(); currentPageViewport.setPage(p); diff --git a/src/java/org/apache/fop/area/PageViewport.java b/src/java/org/apache/fop/area/PageViewport.java index fedc4284f..51c354b4d 100644 --- a/src/java/org/apache/fop/area/PageViewport.java +++ b/src/java/org/apache/fop/area/PageViewport.java @@ -48,6 +48,7 @@ public class PageViewport implements Resolvable, Cloneable { private Page page; private Rectangle2D viewArea; private String simplePageMasterName; + private int pageNumber = -1; private String pageNumberString = null; private int pageIndex = -1; //-1 = undetermined private boolean blank; @@ -82,18 +83,20 @@ public class PageViewport implements Resolvable, Cloneable { /** * Create a page viewport. * @param spm SimplePageMaster indicating the page and region dimensions + * @param pageNumber the page number * @param pageStr String representation of the page number * @param blank true if this is a blank page */ - public PageViewport(SimplePageMaster spm, String pageStr, boolean blank) { + public PageViewport(SimplePageMaster spm, int pageNumber, String pageStr, boolean blank) { this.simplePageMasterName = spm.getMasterName(); this.extensionAttachments = spm.getExtensionAttachments(); this.blank = blank; int pageWidth = spm.getPageWidth().getValue(); int pageHeight = spm.getPageHeight().getValue(); - pageNumberString = pageStr; - viewArea = new Rectangle(0, 0, pageWidth, pageHeight); - page = new Page(spm); + this.pageNumber = pageNumber; + this.pageNumberString = pageStr; + this.viewArea = new Rectangle(0, 0, pageWidth, pageHeight); + this.page = new Page(spm); createSpan(false); } @@ -103,6 +106,7 @@ public class PageViewport implements Resolvable, Cloneable { */ public PageViewport(PageViewport original) { this.extensionAttachments = new java.util.ArrayList(original.extensionAttachments); + this.pageNumber = original.pageNumber; this.pageNumberString = original.pageNumberString; this.page = (Page)original.page.clone(); this.viewArea = (Rectangle2D)original.viewArea.clone(); @@ -111,10 +115,12 @@ public class PageViewport implements Resolvable, Cloneable { /** * Constructor used by the area tree parser. * @param viewArea the view area + * @param pageNumber the page number * @param pageStr String representation of the page number */ - public PageViewport(Rectangle2D viewArea, String pageStr) { + public PageViewport(Rectangle2D viewArea, int pageNumber, String pageStr) { this.viewArea = viewArea; + this.pageNumber = pageNumber; this.pageNumberString = pageStr; } @@ -142,6 +148,14 @@ public class PageViewport implements Resolvable, Cloneable { this.page = page; } + /** + * Get the page number of this page. + * @return the integer value that represents this page + */ + public int getPageNumber() { + return pageNumber; + } + /** * Get the page number of this page. * @return the string that represents this page @@ -152,6 +166,7 @@ public class PageViewport implements Resolvable, Cloneable { /** * Sets the page index of the page in this rendering run. + * (This is not the same as the page number!) * @param index the page index (zero-based), -1 if it is undetermined */ public void setPageIndex(int index) { diff --git a/src/java/org/apache/fop/layoutmgr/Page.java b/src/java/org/apache/fop/layoutmgr/Page.java index e33230c68..70eab62ac 100644 --- a/src/java/org/apache/fop/layoutmgr/Page.java +++ b/src/java/org/apache/fop/layoutmgr/Page.java @@ -35,12 +35,13 @@ public class Page { /** * Main constructor * @param spm the simple-page-master used for this page + * @param pageNumber the page number (as an int) * @param pageNumberStr the page number (as a String) * @param blank true if this is a blank page */ - public Page(SimplePageMaster spm, String pageNumberStr, boolean blank) { + public Page(SimplePageMaster spm, int pageNumber, String pageNumberStr, boolean blank) { this.spm = spm; - this.pageViewport = new PageViewport(spm, pageNumberStr, blank); + this.pageViewport = new PageViewport(spm, pageNumber, pageNumberStr, blank); } /** @return the simple-page-master that created this page */ diff --git a/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java b/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java index 71b319f7e..52d14ad96 100644 --- a/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java @@ -882,7 +882,7 @@ public class PageSequenceLayoutManager extends AbstractLayoutManager { + spm.getMasterName() + "'. FOP presently " + "does not support this."); } - Page page = new Page(spm, pageNumberString, bIsBlank); + Page page = new Page(spm, index, pageNumberString, bIsBlank); cachedPages.add(page); } catch (FOPException e) { //TODO Maybe improve. It'll mean to propagate this exception up several diff --git a/src/java/org/apache/fop/render/AbstractRenderer.java b/src/java/org/apache/fop/render/AbstractRenderer.java index bb84fde27..850190aab 100644 --- a/src/java/org/apache/fop/render/AbstractRenderer.java +++ b/src/java/org/apache/fop/render/AbstractRenderer.java @@ -111,6 +111,9 @@ public abstract class AbstractRenderer */ protected int containingIPPosition = 0; + /** the currently active PageViewport */ + protected PageViewport currentPageViewport; + private Set warnedXMLHandlers; /** @@ -161,6 +164,11 @@ public abstract class AbstractRenderer return null; } + /** @return the current PageViewport or null, if none is active */ + protected PageViewport getCurrentPageViewport() { + return this.currentPageViewport; + } + /** * Prepare a page for rendering. This is called if the renderer supports * out of order rendering. The renderer should prepare the page so that a @@ -216,8 +224,13 @@ public abstract class AbstractRenderer public void renderPage(PageViewport page) throws IOException, FOPException { - Page p = page.getPage(); - renderPageAreas(p); + this.currentPageViewport = page; + try { + Page p = page.getPage(); + renderPageAreas(p); + } finally { + this.currentPageViewport = null; + } } /** diff --git a/src/java/org/apache/fop/render/RendererContextConstants.java b/src/java/org/apache/fop/render/RendererContextConstants.java index 1d219cab2..c744a82a1 100644 --- a/src/java/org/apache/fop/render/RendererContextConstants.java +++ b/src/java/org/apache/fop/render/RendererContextConstants.java @@ -26,6 +26,9 @@ public interface RendererContextConstants { /** The output stream that the document is being sent to. */ String OUTPUT_STREAM = "outputStream"; + /** The current PageViewport being rendered. */ + String PAGE_VIEWPORT = "pageViewport"; + /** The target width of the image being painted. */ String WIDTH = "width"; diff --git a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java index 6bff76bb4..173595cce 100644 --- a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java +++ b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java @@ -263,67 +263,72 @@ public abstract class Java2DRenderer extends AbstractRenderer implements Printab */ public BufferedImage getPageImage(PageViewport pageViewport) { - Rectangle2D bounds = pageViewport.getViewArea(); - pageWidth = (int) Math.round(bounds.getWidth() / 1000f); - pageHeight = (int) Math.round(bounds.getHeight() / 1000f); - - log.info( - "Rendering Page " + pageViewport.getPageNumberString() - + " (pageWidth " + pageWidth + ", pageHeight " - + pageHeight + ")"); - - double scaleX = scaleFactor - * (25.4 / FOUserAgent.DEFAULT_TARGET_RESOLUTION) - / userAgent.getTargetPixelUnitToMillimeter(); - double scaleY = scaleFactor - * (25.4 / FOUserAgent.DEFAULT_TARGET_RESOLUTION) - / userAgent.getTargetPixelUnitToMillimeter(); - int bitmapWidth = (int) ((pageWidth * scaleX) + 0.5); - int bitmapHeight = (int) ((pageHeight * scaleY) + 0.5); - - - BufferedImage currentPageImage = new BufferedImage( - bitmapWidth, bitmapHeight, BufferedImage.TYPE_INT_ARGB); - // FIXME TYPE_BYTE_BINARY ? - - Graphics2D graphics = currentPageImage.createGraphics(); - graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, - RenderingHints.VALUE_FRACTIONALMETRICS_ON); - if (antialiasing) { - graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, - RenderingHints.VALUE_TEXT_ANTIALIAS_ON); - } - if (qualityRendering) { - graphics.setRenderingHint(RenderingHints.KEY_RENDERING, - RenderingHints.VALUE_RENDER_QUALITY); - } + this.currentPageViewport = pageViewport; + try { + Rectangle2D bounds = pageViewport.getViewArea(); + pageWidth = (int) Math.round(bounds.getWidth() / 1000f); + pageHeight = (int) Math.round(bounds.getHeight() / 1000f); + + log.info( + "Rendering Page " + pageViewport.getPageNumberString() + + " (pageWidth " + pageWidth + ", pageHeight " + + pageHeight + ")"); + + double scaleX = scaleFactor + * (25.4 / FOUserAgent.DEFAULT_TARGET_RESOLUTION) + / userAgent.getTargetPixelUnitToMillimeter(); + double scaleY = scaleFactor + * (25.4 / FOUserAgent.DEFAULT_TARGET_RESOLUTION) + / userAgent.getTargetPixelUnitToMillimeter(); + int bitmapWidth = (int) ((pageWidth * scaleX) + 0.5); + int bitmapHeight = (int) ((pageHeight * scaleY) + 0.5); + + + BufferedImage currentPageImage = new BufferedImage( + bitmapWidth, bitmapHeight, BufferedImage.TYPE_INT_ARGB); + // FIXME TYPE_BYTE_BINARY ? + + Graphics2D graphics = currentPageImage.createGraphics(); + graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, + RenderingHints.VALUE_FRACTIONALMETRICS_ON); + if (antialiasing) { + graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + } + if (qualityRendering) { + graphics.setRenderingHint(RenderingHints.KEY_RENDERING, + RenderingHints.VALUE_RENDER_QUALITY); + } + + // transform page based on scale factor supplied + AffineTransform at = graphics.getTransform(); + at.scale(scaleX, scaleY); + graphics.setTransform(at); - // transform page based on scale factor supplied - AffineTransform at = graphics.getTransform(); - at.scale(scaleX, scaleY); - 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); - - state = new Java2DGraphicsState(graphics, this.fontInfo, at); - - // reset the current Positions - currentBPPosition = 0; - currentIPPosition = 0; - - // this toggles the rendering of all areas - renderPageAreas(pageViewport.getPage()); - return currentPageImage; + // 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); + + state = new Java2DGraphicsState(graphics, this.fontInfo, at); + + // reset the current Positions + currentBPPosition = 0; + currentIPPosition = 0; + + // this toggles the rendering of all areas + renderPageAreas(pageViewport.getPage()); + return currentPageImage; + } finally { + this.currentPageViewport = null; + } } @@ -1169,6 +1174,8 @@ public abstract class Java2DRenderer extends AbstractRenderer implements Printab new Integer((int)pos.getWidth())); context.setProperty(Java2DRendererContextConstants.HEIGHT, new Integer((int) pos.getHeight())); + context.setProperty(Java2DRendererContextConstants.PAGE_VIEWPORT, + getCurrentPageViewport()); renderXML(context, doc, ns); } diff --git a/src/java/org/apache/fop/render/pdf/PDFRenderer.java b/src/java/org/apache/fop/render/pdf/PDFRenderer.java index 3328ad247..ab2ae245b 100644 --- a/src/java/org/apache/fop/render/pdf/PDFRenderer.java +++ b/src/java/org/apache/fop/render/pdf/PDFRenderer.java @@ -470,8 +470,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer { currentFontName = ""; - Page p = page.getPage(); - renderPageAreas(p); + super.renderPage(page); this.pdfDoc.registerObject(currentStream); currentPage.setContents(currentStream); @@ -1353,6 +1352,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer { context.setProperty(PDFRendererContextConstants.PDF_DOCUMENT, pdfDoc); context.setProperty(PDFRendererContextConstants.OUTPUT_STREAM, ostream); + context.setProperty(PDFRendererContextConstants.PAGE_VIEWPORT, getCurrentPageViewport()); context.setProperty(PDFRendererContextConstants.PDF_STATE, currentState); context.setProperty(PDFRendererContextConstants.PDF_PAGE, currentPage); context.setProperty(PDFRendererContextConstants.PDF_CONTEXT, diff --git a/src/java/org/apache/fop/render/ps/PSRenderer.java b/src/java/org/apache/fop/render/ps/PSRenderer.java index 71a948949..fcee2e94d 100644 --- a/src/java/org/apache/fop/render/ps/PSRenderer.java +++ b/src/java/org/apache/fop/render/ps/PSRenderer.java @@ -1079,6 +1079,8 @@ public class PSRenderer extends AbstractPathOrientedRenderer { new Integer(currentIPPosition + (int) pos.getX())); context.setProperty(PSRendererContextConstants.YPOS, new Integer(currentBPPosition + (int) pos.getY())); + context.setProperty(PSRendererContextConstants.PAGE_VIEWPORT, + getCurrentPageViewport()); renderXML(context, doc, ns); } diff --git a/src/java/org/apache/fop/render/xml/XMLRenderer.java b/src/java/org/apache/fop/render/xml/XMLRenderer.java index 982d138bc..d231569d5 100644 --- a/src/java/org/apache/fop/render/xml/XMLRenderer.java +++ b/src/java/org/apache/fop/render/xml/XMLRenderer.java @@ -442,7 +442,8 @@ public class XMLRenderer extends PrintRenderer { public void renderPage(PageViewport page) throws IOException, FOPException { atts.clear(); addAttribute("bounds", page.getViewArea()); - addAttribute("nr", page.getPageNumberString()); + addAttribute("nr", page.getPageNumber()); + addAttribute("formatted-nr", page.getPageNumberString()); startElement("pageViewport", atts); startElement("page"); -- 2.39.5