Author: ssteiner
Date: Tue Jul 26 14:42:01 2016
New Revision: 1754137
URL: http://svn.apache.org/viewvc?rev=1754137&view=rev
Log:
FOP-2637: PTX records are incorrectly chained
Modified:
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/AFPBorderPainter.java
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/modca/AbstractPageObject.java
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/modca/PresentationTextObject.java
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/afp/AFPPainter.java
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/afp/AFPPainterTestCase.java
Modified:
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/AFPBorderPainter.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/AFPBorderPainter.java?rev=1754137&r1=1754136&r2=1754137&view=diff
==============================================================================
---
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/AFPBorderPainter.java
(original)
+++
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/AFPBorderPainter.java
Tue Jul 26 14:42:01 2016
@@ -42,6 +42,11 @@ public class AFPBorderPainter extends Ab
/** {@inheritDoc} */
public void paint(PaintingInfo paintInfo) {
+ Integer bytesAvailable =
dataStream.getCurrentPage().getPresentationTextObject().getBytesAvailable();
+ if (bytesAvailable != null && bytesAvailable < 1024) {
+ dataStream.getCurrentPage().endPresentationObject();
+ }
+
BorderPaintingInfo borderPaintInfo = (BorderPaintingInfo)paintInfo;
float w = borderPaintInfo.getX2() - borderPaintInfo.getX1();
float h = borderPaintInfo.getY2() - borderPaintInfo.getY1();
Modified:
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/modca/AbstractPageObject.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/modca/AbstractPageObject.java?rev=1754137&r1=1754136&r2=1754137&view=diff
==============================================================================
---
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/modca/AbstractPageObject.java
(original)
+++
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/modca/AbstractPageObject.java
Tue Jul 26 14:42:01 2016
@@ -186,7 +186,7 @@ public abstract class AbstractPageObject
/**
* Ends the presentation text object
*/
- protected void endPresentationObject() {
+ public void endPresentationObject() {
if (currentPresentationTextObject != null) {
currentPresentationTextObject.endControlSequence();
currentPresentationTextObject = null;
Modified:
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/modca/PresentationTextObject.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/modca/PresentationTextObject.java?rev=1754137&r1=1754136&r2=1754137&view=diff
==============================================================================
---
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/modca/PresentationTextObject.java
(original)
+++
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/afp/modca/PresentationTextObject.java
Tue Jul 26 14:42:01 2016
@@ -60,7 +60,7 @@ public class PresentationTextObject exte
*/
private List/*<PresentationTextData>*/ presentationTextDataList;
- private PtocaBuilder builder = new DefaultBuilder();
+ private DefaultBuilder builder = new DefaultBuilder();
/**
* Construct a new PresentationTextObject for the specified name argument,
@@ -105,6 +105,13 @@ public class PresentationTextObject exte
}
private class DefaultBuilder extends PtocaBuilder {
+ public Integer getBytesAvailable() {
+ if (currentPresentationTextData == null) {
+ return null;
+ }
+ return currentPresentationTextData.getBytesAvailable();
+ }
+
protected OutputStream getOutputStreamForControlSequence(int length) {
if (length > currentPresentationTextData.getBytesAvailable()) {
endPresentationTextData();
@@ -201,4 +208,8 @@ public class PresentationTextObject exte
}
return super.toString();
}
+
+ public Integer getBytesAvailable() {
+ return builder.getBytesAvailable();
+ }
}
Modified:
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/afp/AFPPainter.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/afp/AFPPainter.java?rev=1754137&r1=1754136&r2=1754137&view=diff
==============================================================================
---
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/afp/AFPPainter.java
(original)
+++
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/afp/AFPPainter.java
Tue Jul 26 14:42:01 2016
@@ -33,6 +33,7 @@ import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
+import java.nio.charset.CharacterCodingException;
import java.security.MessageDigest;
import java.util.Map;
@@ -102,6 +103,7 @@ public class AFPPainter extends Abstract
private final AFPUnitConverter unitConv;
private final AFPEventProducer eventProducer;
+ private Integer bytesAvailable;
/**
* Default constructor.
@@ -928,7 +930,16 @@ public class AFPPainter extends Abstract
}
AbstractPageObject page = getDataStream().getCurrentPage();
- PresentationTextObject pto = page.getPresentationTextObject();
+
+ try {
+ int size = charSet.encodeChars(text).getLength();
+ if (bytesAvailable != null && bytesAvailable < size) {
+ page.endPresentationObject();
+ }
+ } catch (CharacterCodingException e) {
+ throw new IFException(e.getMessage(), e);
+ }
+ final PresentationTextObject pto = page.getPresentationTextObject();
try {
pto.createControlSequences(new PtocaProducer() {
@@ -1053,6 +1064,7 @@ public class AFPPainter extends Abstract
}
}
flushText(builder, sb, charSet);
+ bytesAvailable = pto.getBytesAvailable();
}
private void flushText(PtocaBuilder builder, StringBuffer sb,
Modified:
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/afp/AFPPainterTestCase.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/afp/AFPPainterTestCase.java?rev=1754137&r1=1754136&r2=1754137&view=diff
==============================================================================
---
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/afp/AFPPainterTestCase.java
(original)
+++
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/afp/AFPPainterTestCase.java
Tue Jul 26 14:42:01 2016
@@ -20,13 +20,26 @@
package org.apache.fop.render.afp;
import java.awt.Color;
+import java.awt.Dimension;
import java.awt.Rectangle;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Map;
+import javax.xml.transform.stream.StreamResult;
+
+import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -41,11 +54,18 @@ import org.apache.xmlgraphics.image.load
import org.apache.fop.afp.AFPEventProducer;
import org.apache.fop.afp.AFPPaintingState;
import org.apache.fop.afp.AFPResourceManager;
+import org.apache.fop.afp.fonts.CharacterSet;
+import org.apache.fop.afp.fonts.CharactersetEncoder;
+import org.apache.fop.afp.fonts.RasterFont;
import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.FopFactory;
import org.apache.fop.events.EventBroadcaster;
import org.apache.fop.fo.Constants;
+import org.apache.fop.fonts.Font;
+import org.apache.fop.fonts.FontInfo;
import org.apache.fop.render.ImageHandlerRegistry;
import org.apache.fop.render.intermediate.IFContext;
+import org.apache.fop.render.intermediate.IFException;
import org.apache.fop.traits.BorderProps;
public class AFPPainterTestCase {
@@ -128,4 +148,69 @@ public class AFPPainterTestCase {
}
}
+ @Test
+ public void testPresentationText() throws URISyntaxException, IFException,
IOException {
+ List<String> strings = new ArrayList<String>();
+ strings.add("test");
+ Assert.assertEquals(writeText(strings), "BEGIN DOCUMENT DOC00001\n"
+ + "BEGIN PAGE PGN00001\n"
+ + "BEGIN ACTIVE_ENVIRONMENT_GROUP AEG00001\n"
+ + "DESCRIPTOR PAGE\n"
+ + "MIGRATION PRESENTATION_TEXT\n"
+ + "END ACTIVE_ENVIRONMENT_GROUP AEG00001\n"
+ + "BEGIN PRESENTATION_TEXT PT000001\n"
+ + "DATA PRESENTATION_TEXT\n"
+ + "END PRESENTATION_TEXT PT000001\n"
+ + "END PAGE PGN00001\n"
+ + "END DOCUMENT DOC00001\n");
+
+ for (int i = 0; i < 5000; i++) {
+ strings.add("test");
+ }
+ Assert.assertEquals(writeText(strings), "BEGIN DOCUMENT DOC00001\n"
+ + "BEGIN PAGE PGN00001\n"
+ + "BEGIN ACTIVE_ENVIRONMENT_GROUP AEG00001\n"
+ + "DESCRIPTOR PAGE\n"
+ + "MIGRATION PRESENTATION_TEXT\n"
+ + "END ACTIVE_ENVIRONMENT_GROUP AEG00001\n"
+ + "BEGIN PRESENTATION_TEXT PT000001\n"
+ + "DATA PRESENTATION_TEXT\n"
+ + "END PRESENTATION_TEXT PT000001\n"
+ + "BEGIN PRESENTATION_TEXT PT000002\n"
+ + "DATA PRESENTATION_TEXT\n"
+ + "END PRESENTATION_TEXT PT000002\n"
+ + "END PAGE PGN00001\n"
+ + "END DOCUMENT DOC00001\n");
+ }
+
+ private String writeText(List<String> text) throws URISyntaxException,
IOException, IFException {
+ FOUserAgent agent = FopFactory.newInstance(new
URI(".")).newFOUserAgent();
+ IFContext context = new IFContext(agent);
+ AFPDocumentHandler doc = new AFPDocumentHandler(context);
+ AFPPainter afpPainter = new AFPPainter(doc);
+ FontInfo fi = new FontInfo();
+ fi.addFontProperties("", Font.DEFAULT_FONT);
+ RasterFont rf = new RasterFont("", true);
+ CharacterSet cs = mock(CharacterSet.class);
+ CharactersetEncoder.EncodedChars encoder =
mock(CharactersetEncoder.EncodedChars.class);
+ when(cs.encodeChars(anyString())).thenReturn(encoder);
+ when(encoder.getLength()).thenReturn(text.get(0).length());
+ rf.addCharacterSet(12000, cs);
+ fi.addMetrics("", rf);
+ doc.setFontInfo(fi);
+ afpPainter.setFont("any", "normal", 400, "", 12000, Color.BLACK);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ doc.setResult(new StreamResult(outputStream));
+ doc.startDocument();
+ doc.startPage(0, "", "", new Dimension());
+ for (String s : text) {
+ afpPainter.drawText(0, 0, 0, 0, null, s);
+ }
+ doc.endDocument();
+
+ InputStream bis = new ByteArrayInputStream(outputStream.toByteArray());
+ StringBuilder sb = new StringBuilder();
+ new AFPParser(false).read(bis, sb);
+ return sb.toString();
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]