Browse Source

(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
pull/16/head
Jeremias Maerki 18 years ago
parent
commit
fde01f3faa

+ 3
- 1
src/java/org/apache/fop/area/AreaTreeParser.java View File

@@ -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);

+ 20
- 5
src/java/org/apache/fop/area/PageViewport.java View File

@@ -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) {

+ 3
- 2
src/java/org/apache/fop/layoutmgr/Page.java View File

@@ -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 */

+ 1
- 1
src/java/org/apache/fop/layoutmgr/PageSequenceLayoutManager.java View File

@@ -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

+ 15
- 2
src/java/org/apache/fop/render/AbstractRenderer.java View File

@@ -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;
}
}

/**

+ 3
- 0
src/java/org/apache/fop/render/RendererContextConstants.java View File

@@ -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";


+ 67
- 60
src/java/org/apache/fop/render/java2d/Java2DRenderer.java View File

@@ -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);
}

+ 2
- 2
src/java/org/apache/fop/render/pdf/PDFRenderer.java View File

@@ -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,

+ 2
- 0
src/java/org/apache/fop/render/ps/PSRenderer.java View File

@@ -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);
}

+ 2
- 1
src/java/org/apache/fop/render/xml/XMLRenderer.java View File

@@ -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");

Loading…
Cancel
Save