You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2008/12/17 16:01:22 UTC
svn commit: r727405 [2/2] - in
/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign:
src/java/META-INF/services/ src/java/org/apache/fop/apps/
src/java/org/apache/fop/render/ src/java/org/apache/fop/render/intermediate/
src/java/org/apache/fop/render/pdf/ ...
Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/ps/ResourceHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/ps/ResourceHandler.java?rev=727405&r1=727404&r2=727405&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/ps/ResourceHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/ps/ResourceHandler.java Wed Dec 17 07:01:21 2008
@@ -21,7 +21,6 @@
import java.awt.geom.Dimension2D;
import java.awt.geom.Rectangle2D;
-import java.awt.image.RenderedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -29,27 +28,22 @@
import java.util.Map;
import java.util.Set;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
import org.apache.xmlgraphics.image.loader.ImageException;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.ImageInfo;
import org.apache.xmlgraphics.image.loader.ImageManager;
import org.apache.xmlgraphics.image.loader.ImageSessionContext;
-import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D;
-import org.apache.xmlgraphics.image.loader.impl.ImageRawCCITTFax;
-import org.apache.xmlgraphics.image.loader.impl.ImageRawEPS;
-import org.apache.xmlgraphics.image.loader.impl.ImageRawJPEG;
-import org.apache.xmlgraphics.image.loader.impl.ImageRawStream;
-import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
-import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
import org.apache.xmlgraphics.image.loader.util.ImageUtil;
import org.apache.xmlgraphics.ps.DSCConstants;
import org.apache.xmlgraphics.ps.FormGenerator;
-import org.apache.xmlgraphics.ps.ImageEncoder;
-import org.apache.xmlgraphics.ps.ImageFormGenerator;
import org.apache.xmlgraphics.ps.PSGenerator;
-import org.apache.xmlgraphics.ps.PSProcSets;
+import org.apache.xmlgraphics.ps.PSResource;
import org.apache.xmlgraphics.ps.dsc.DSCException;
import org.apache.xmlgraphics.ps.dsc.DSCFilter;
+import org.apache.xmlgraphics.ps.dsc.DSCListener;
import org.apache.xmlgraphics.ps.dsc.DSCParser;
import org.apache.xmlgraphics.ps.dsc.DSCParserConstants;
import org.apache.xmlgraphics.ps.dsc.DefaultNestedDocumentHandler;
@@ -59,17 +53,21 @@
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentDocumentNeededResources;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentDocumentSuppliedResources;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentHiResBoundingBox;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentIncludeResource;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentLanguageLevel;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPage;
import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPages;
import org.apache.xmlgraphics.ps.dsc.events.DSCEvent;
import org.apache.xmlgraphics.ps.dsc.events.DSCHeaderComment;
import org.apache.xmlgraphics.ps.dsc.events.PostScriptComment;
+import org.apache.xmlgraphics.ps.dsc.events.PostScriptLine;
import org.apache.xmlgraphics.ps.dsc.tools.DSCTools;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.events.ResourceEventProducer;
import org.apache.fop.fonts.FontInfo;
+import org.apache.fop.render.ImageHandler;
+import org.apache.fop.render.ImageHandlerRegistry;
/**
* This class is used when two-pass production is used to generate the PostScript file (setting
@@ -79,28 +77,79 @@
*/
public class ResourceHandler implements DSCParserConstants, PSSupportedFlavors {
+ /** logging instance */
+ private static Log log = LogFactory.getLog(ResourceHandler.class);
+
+ private FOUserAgent userAgent;
+ private FontInfo fontInfo;
+
+ private ResourceTracker resTracker;
+
+ //key: URI, values PSImageFormResource
+ private Map globalFormResources = new java.util.HashMap();
+ //key: PSResource, values PSImageFormResource
+ private Map inlineFormResources = new java.util.HashMap();
+
/**
- * Rewrites the temporary PostScript file generated by PSRenderer adding all needed resources
- * (fonts and images).
+ * Main constructor.
* @param userAgent the FO user agent
- * @param in the InputStream for the temporary PostScript file
- * @param out the OutputStream to write the finished file to
* @param fontInfo the font information
* @param resTracker the resource tracker to use
* @param formResources Contains all forms used by this document (maintained by PSRenderer)
+ */
+ public ResourceHandler(FOUserAgent userAgent, FontInfo fontInfo,
+ ResourceTracker resTracker, Map formResources) {
+ this.userAgent = userAgent;
+ this.fontInfo = fontInfo;
+ this.resTracker = resTracker;
+ determineInlineForms(formResources);
+ }
+
+ /**
+ * This method splits up the form resources map into two. One for global forms which
+ * have been referenced more than once, and one for inline forms which have only been
+ * used once. The latter is to conserve memory in the PostScript interpreter.
+ * @param formResources the original form resources map
+ */
+ private void determineInlineForms(Map formResources) {
+ if (formResources == null) {
+ return;
+ }
+ Iterator iter = formResources.entrySet().iterator();
+ while (iter.hasNext()) {
+ Map.Entry entry = (Map.Entry)iter.next();
+ PSResource res = (PSResource)entry.getValue();
+ long count = resTracker.getUsageCount(res);
+ if (count > 1) {
+ //Make global form
+ this.globalFormResources.put(entry.getKey(), res);
+ } else {
+ //Inline resource
+ this.inlineFormResources.put(res, res);
+ resTracker.declareInlined(res);
+ }
+ }
+ }
+
+ /**
+ * Rewrites the temporary PostScript file generated by PSRenderer adding all needed resources
+ * (fonts and images).
+ * @param in the InputStream for the temporary PostScript file
+ * @param out the OutputStream to write the finished file to
* @param pageCount the number of pages (given here because PSRenderer writes an "(atend)")
* @param documentBoundingBox the document's bounding box
* (given here because PSRenderer writes an "(atend)")
* @throws DSCException If there's an error in the DSC structure of the PS file
* @throws IOException In case of an I/O error
*/
- public static void process(FOUserAgent userAgent, InputStream in, OutputStream out,
- FontInfo fontInfo, ResourceTracker resTracker, Map formResources,
+ public void process(InputStream in, OutputStream out,
int pageCount, Rectangle2D documentBoundingBox)
throws DSCException, IOException {
DSCParser parser = new DSCParser(in);
+
PSGenerator gen = new PSGenerator(out);
- parser.setNestedDocumentHandler(new DefaultNestedDocumentHandler(gen));
+ parser.addListener(new DefaultNestedDocumentHandler(gen));
+ parser.addListener(new IncludeResourceListener(gen));
//Skip DSC header
DSCHeaderComment header = DSCTools.checkAndSkipDSC30Header(parser);
@@ -140,7 +189,7 @@
new DSCCommentHiResBoundingBox(documentBoundingBox).generate(gen);
PSFontUtils.determineSuppliedFonts(resTracker, fontInfo, fontInfo.getUsedFonts());
- registerSuppliedForms(resTracker, formResources);
+ registerSuppliedForms(resTracker, globalFormResources);
//Supplied Resources
DSCCommentDocumentSuppliedResources supplied
@@ -174,7 +223,7 @@
throw new DSCException("Didn't find %FOPFontSetup comment in stream");
}
PSFontUtils.writeFontDict(gen, fontInfo, fontInfo.getUsedFonts());
- generateForms(resTracker, userAgent, formResources, gen);
+ generateForms(globalFormResources, gen);
//Skip the prolog and to the first page
DSCComment pageOrTrailer = parser.nextDSCComment(DSCConstants.PAGE, gen);
@@ -218,115 +267,64 @@
}
}
- private static void generateForms(ResourceTracker resTracker, FOUserAgent userAgent,
- Map formResources, PSGenerator gen) throws IOException {
+ private void generateForms(Map formResources, PSGenerator gen) throws IOException {
if (formResources == null) {
return;
}
Iterator iter = formResources.values().iterator();
while (iter.hasNext()) {
PSImageFormResource form = (PSImageFormResource)iter.next();
- final String uri = form.getImageURI();
+ generateFormForImage(gen, form);
+ }
+ }
- ImageManager manager = userAgent.getFactory().getImageManager();
- ImageInfo info = null;
- try {
- ImageSessionContext sessionContext = userAgent.getImageSessionContext();
- info = manager.getImageInfo(uri, sessionContext);
-
- ImageFlavor[] flavors;
- if (gen.getPSLevel() >= 3) {
- flavors = LEVEL_3_FLAVORS_FORM;
- } else {
- flavors = LEVEL_2_FLAVORS_FORM;
- }
- Map hints = ImageUtil.getDefaultHints(sessionContext);
- org.apache.xmlgraphics.image.loader.Image img = manager.getImage(
- info, flavors, hints, sessionContext);
-
- String imageDescription = info.getMimeType() + " " + info.getOriginalURI();
- final Dimension2D dimensionsPt = info.getSize().getDimensionPt();
- final Dimension2D dimensionsMpt = info.getSize().getDimensionMpt();
-
- if (img instanceof ImageGraphics2D) {
- final ImageGraphics2D imageG2D = (ImageGraphics2D)img;
- FormGenerator formGen = new FormGenerator(
- form.getName(), imageDescription, dimensionsPt) {
-
- protected void generatePaintProc(PSGenerator gen)
- throws IOException {
- gen.getResourceTracker().notifyResourceUsageOnPage(
- PSProcSets.EPS_PROCSET);
- gen.writeln("BeginEPSF");
- PSGraphics2DAdapter adapter = new PSGraphics2DAdapter(gen, false);
- adapter.paintImage(imageG2D.getGraphics2DImagePainter(),
- null,
- 0, 0,
- (int)Math.round(dimensionsMpt.getWidth()),
- (int)Math.round(dimensionsMpt.getHeight()));
- gen.writeln("EndEPSF");
- }
+ private void generateFormForImage(PSGenerator gen, PSImageFormResource form)
+ throws IOException {
+ final String uri = form.getImageURI();
+
+ ImageManager manager = userAgent.getFactory().getImageManager();
+ ImageInfo info = null;
+ try {
+ ImageSessionContext sessionContext = userAgent.getImageSessionContext();
+ info = manager.getImageInfo(uri, sessionContext);
+
+ //Create a rendering context for form creation
+ PSRenderingContext formContext = new PSRenderingContext(
+ userAgent, gen, fontInfo, true);
+
+ ImageFlavor[] flavors;
+ ImageHandlerRegistry imageHandlerRegistry
+ = userAgent.getFactory().getImageHandlerRegistry();
+ flavors = imageHandlerRegistry.getSupportedFlavors(formContext);
+
+ Map hints = ImageUtil.getDefaultHints(sessionContext);
+ org.apache.xmlgraphics.image.loader.Image img = manager.getImage(
+ info, flavors, hints, sessionContext);
+
+ ImageHandler basicHandler = imageHandlerRegistry.getHandler(formContext, img);
+ if (basicHandler == null) {
+ throw new UnsupportedOperationException(
+ "No ImageHandler available for image: "
+ + img.getInfo() + " (" + img.getClass().getName() + ")");
+ }
- };
- formGen.generate(gen);
- } else if (img instanceof ImageRendered) {
- ImageRendered imgRend = (ImageRendered)img;
- RenderedImage ri = imgRend.getRenderedImage();
- FormGenerator formGen = new ImageFormGenerator(
- form.getName(), imageDescription,
- info.getSize().getDimensionPt(),
- ri, false);
- formGen.generate(gen);
- } else if (img instanceof ImageXMLDOM) {
- throw new UnsupportedOperationException(
- "Embedding an ImageXMLDOM as a form isn't supported, yet");
- } else if (img instanceof ImageRawStream) {
- final ImageRawStream raw = (ImageRawStream)img;
- if (raw instanceof ImageRawEPS) {
- final ImageRawEPS eps = (ImageRawEPS)raw;
- throw new UnsupportedOperationException(
- "Embedding EPS as forms isn't supported, yet");
- /*
- InputStream in = eps.createInputStream();
- try {
- FormGenerator formGen = new EPSFormGenerator(form.getName(),
- imageDescription, dimensions, in);
- formGen.generate(gen);
- } finally {
- IOUtils.closeQuietly(in);
- }*/
- } else if (raw instanceof ImageRawCCITTFax) {
- ImageRawCCITTFax jpeg = (ImageRawCCITTFax)raw;
- ImageEncoder encoder = new ImageEncoderCCITTFax(jpeg);
- FormGenerator formGen = new ImageFormGenerator(
- form.getName(), imageDescription,
- info.getSize().getDimensionPt(),
- info.getSize().getDimensionPx(),
- encoder,
- jpeg.getColorSpace(), 1, false);
- formGen.generate(gen);
- } else if (raw instanceof ImageRawJPEG) {
- ImageRawJPEG jpeg = (ImageRawJPEG)raw;
- ImageEncoder encoder = new ImageEncoderJPEG(jpeg);
- FormGenerator formGen = new ImageFormGenerator(
- form.getName(), imageDescription,
- info.getSize().getDimensionPt(),
- info.getSize().getDimensionPx(),
- encoder,
- jpeg.getColorSpace(), jpeg.isInverted());
- formGen.generate(gen);
- } else {
- throw new UnsupportedOperationException("Unsupported raw image: " + info);
- }
- } else {
- throw new UnsupportedOperationException("Unsupported image type: " + img);
- }
- } catch (ImageException ie) {
- ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
- userAgent.getEventBroadcaster());
- eventProducer.imageError(resTracker, (info != null ? info.toString() : uri),
- ie, null);
+ if (!(basicHandler instanceof PSImageHandler)) {
+ throw new IllegalStateException(
+ "ImageHandler implementation doesn't behave properly."
+ + " It should have returned false in isCompatible(). Class: "
+ + basicHandler.getClass().getName());
}
+ PSImageHandler handler = (PSImageHandler)basicHandler;
+ if (log.isTraceEnabled()) {
+ log.trace("Using ImageHandler: " + handler.getClass().getName());
+ }
+ handler.generateForm(formContext, img, form);
+
+ } catch (ImageException ie) {
+ ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
+ userAgent.getEventBroadcaster());
+ eventProducer.imageError(resTracker, (info != null ? info.toString() : uri),
+ ie, null);
}
}
@@ -354,4 +352,50 @@
return formGen;
}
+ private class IncludeResourceListener implements DSCListener {
+
+ private PSGenerator gen;
+
+ public IncludeResourceListener(PSGenerator gen) {
+ this.gen = gen;
+ }
+
+ /** {@inheritDoc} */
+ public void processEvent(DSCEvent event, DSCParser parser)
+ throws IOException, DSCException {
+ if (event.isDSCComment() && event instanceof DSCCommentIncludeResource) {
+ DSCCommentIncludeResource include = (DSCCommentIncludeResource)event;
+ PSResource res = include.getResource();
+ if (res.getType().equals(PSResource.TYPE_FORM)) {
+ if (inlineFormResources.containsValue(res)) {
+ PSImageFormResource form = (PSImageFormResource)
+ inlineFormResources.get(res);
+ //Create an inline form
+ //Wrap in save/restore pair to release memory
+ gen.writeln("save");
+ generateFormForImage(gen, form);
+ boolean execformFound = false;
+ DSCEvent next = parser.nextEvent();
+ if (next.isLine()) {
+ PostScriptLine line = next.asLine();
+ if (line.getLine().endsWith(" execform")) {
+ line.generate(gen);
+ execformFound = true;
+ }
+ }
+ if (!execformFound) {
+ throw new IOException(
+ "Expected a PostScript line in the form: <form> execform");
+ }
+ gen.writeln("restore");
+ } else {
+ //Do nothing
+ }
+ parser.next();
+ }
+ }
+ }
+
+ }
+
}
Added: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/AbstractPostScriptTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/AbstractPostScriptTestCase.java?rev=727405&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/AbstractPostScriptTestCase.java (added)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/AbstractPostScriptTestCase.java Wed Dec 17 07:01:21 2008
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.ps;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.MissingResourceException;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.stream.StreamSource;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+
+import org.apache.xmlgraphics.ps.PSResource;
+import org.apache.xmlgraphics.ps.dsc.DSCException;
+import org.apache.xmlgraphics.ps.dsc.DSCParser;
+import org.apache.xmlgraphics.ps.dsc.events.AbstractResourceDSCComment;
+import org.apache.xmlgraphics.ps.dsc.events.DSCComment;
+import org.apache.xmlgraphics.ps.dsc.events.DSCEvent;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.Fop;
+import org.apache.fop.apps.FopFactory;
+import org.apache.fop.apps.MimeConstants;
+
+/**
+ * Abstract base class for PostScript verification tests.
+ */
+public abstract class AbstractPostScriptTestCase extends TestCase {
+
+ /** the JAXP TransformerFactory */
+ protected TransformerFactory tFactory = TransformerFactory.newInstance();
+ /** the FopFactory */
+ protected FopFactory fopFactory = FopFactory.newInstance();
+
+ /**
+ * Renders a test file.
+ * @param ua the user agent (with override set!)
+ * @param resourceName the resource name for the FO file
+ * @param suffix a suffix for the output filename
+ * @return the output file
+ * @throws Exception if an error occurs
+ */
+ protected File renderFile(FOUserAgent ua, String resourceName, String suffix)
+ throws Exception {
+ File outputFile = new File("build/test-results/" + resourceName + suffix + ".ps");
+ File outputDir = outputFile.getParentFile();
+ FileUtils.forceMkdir(outputDir);
+
+ // Prepare input file
+ InputStream in = getClass().getResourceAsStream(resourceName);
+ if (in == null) {
+ throw new MissingResourceException(resourceName + " not found in resources",
+ getClass().getName(), null);
+ }
+ try {
+ Source src = new StreamSource(in);
+
+ // Create PostScript
+ OutputStream out = new java.io.FileOutputStream(outputFile);
+ out = new java.io.BufferedOutputStream(out);
+ try {
+ Fop fop = fopFactory.newFop(MimeConstants.MIME_POSTSCRIPT, ua, out);
+ SAXResult res = new SAXResult(fop.getDefaultHandler());
+
+ Transformer transformer = tFactory.newTransformer();
+ transformer.transform(src, res);
+ } finally {
+ IOUtils.closeQuietly(out);
+ }
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
+ return outputFile;
+ }
+
+ /**
+ * Scans for a certain resource DSC comment and checks against a given resource.
+ * @param parser the DSC parser
+ * @param comment the comment to scan for
+ * @param resource the resource to check against
+ * @throws IOException if an I/O error occurs
+ * @throws DSCException if a DSC error occurs
+ */
+ protected void checkResourceComment(DSCParser parser, String comment, PSResource resource)
+ throws IOException, DSCException {
+ AbstractResourceDSCComment resComment;
+ resComment = (AbstractResourceDSCComment)gotoDSCComment(parser, comment);
+ assertEquals(resource, resComment.getResource());
+ }
+
+ /**
+ * Advances the DSC parser to a DSC comment with the given name.
+ * @param parser the DSC parser
+ * @param name the name of the DSC comment
+ * @return the DSC comment
+ * @throws IOException if an I/O error occurs
+ * @throws DSCException if a DSC error occurs
+ */
+ protected static DSCComment gotoDSCComment(DSCParser parser, String name)
+ throws IOException, DSCException {
+ while (parser.hasNext()) {
+ DSCEvent event = parser.nextEvent();
+ if (event.isDSCComment()) {
+ DSCComment comment = event.asDSCComment();
+ if (comment.getName().equals(name)) {
+ return comment;
+ }
+ }
+ }
+ return null;
+ }
+
+}
Propchange: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/AbstractPostScriptTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/AbstractPostScriptTestCase.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ImageHandlingTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ImageHandlingTestCase.java?rev=727405&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ImageHandlingTestCase.java (added)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ImageHandlingTestCase.java Wed Dec 17 07:01:21 2008
@@ -0,0 +1,188 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.ps;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.io.IOUtils;
+
+import org.apache.xmlgraphics.ps.DSCConstants;
+import org.apache.xmlgraphics.ps.PSResource;
+import org.apache.xmlgraphics.ps.dsc.DSCException;
+import org.apache.xmlgraphics.ps.dsc.DSCParser;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPage;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPages;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentTitle;
+import org.apache.xmlgraphics.ps.dsc.events.DSCEvent;
+
+import org.apache.fop.apps.FOUserAgent;
+
+/**
+ * Tests the image handling in PostScript output.
+ */
+public class ImageHandlingTestCase extends AbstractPostScriptTestCase {
+
+ /**
+ * Tests JPEG handling with the {@link PSRenderer}.
+ * @throws Exception if an error occurs
+ */
+ public void testJPEGImageWithRendererLevel3() throws Exception {
+ innerTestJPEGImageWithRenderer(3);
+ }
+
+ /**
+ * Tests JPEG handling with the {@link PSRenderer}.
+ * @throws Exception if an error occurs
+ */
+ public void testJPEGImageWithRendererLevel2() throws Exception {
+ innerTestJPEGImageWithRenderer(2);
+ }
+
+ /**
+ * Tests JPEG handling with the {@link PSDocumentHandler}.
+ * @throws Exception if an error occurs
+ */
+ public void testJPEGImageWithIFLevel3() throws Exception {
+ innerTestJPEGImageWithIF(3);
+ }
+
+ /**
+ * Tests JPEG handling with the {@link PSDocumentHandler}.
+ * @throws Exception if an error occurs
+ */
+ public void testJPEGImageWithIFLevel2() throws Exception {
+ innerTestJPEGImageWithIF(2);
+ }
+
+ private void innerTestJPEGImageWithRenderer(int level) throws Exception {
+ FOUserAgent ua = fopFactory.newFOUserAgent();
+ PSRenderer renderer = new PSRenderer();
+ renderer.setUserAgent(ua);
+ PSRenderingUtil psUtil = renderer.getPSUtil();
+ psUtil.setLanguageLevel(level);
+ psUtil.setOptimizeResources(true);
+ ua.setRendererOverride(renderer);
+
+ // Prepare output file
+ File outputFile = renderFile(ua, "ps-jpeg-image.fo", "-rend-l" + psUtil.getLanguageLevel());
+ verifyPostScriptFile(outputFile, psUtil.getLanguageLevel());
+ }
+
+ private void innerTestJPEGImageWithIF(int level) throws Exception {
+ FOUserAgent ua = fopFactory.newFOUserAgent();
+ PSDocumentHandler handler = new PSDocumentHandler();
+ handler.setUserAgent(ua);
+ PSRenderingUtil psUtil = handler.getPSUtil();
+ psUtil.setLanguageLevel(level);
+ psUtil.setOptimizeResources(true);
+ ua.setDocumentHandlerOverride(handler);
+
+ // Prepare output file
+ File outputFile = renderFile(ua, "ps-jpeg-image.fo", "-if-l" + psUtil.getLanguageLevel());
+ verifyPostScriptFile(outputFile, psUtil.getLanguageLevel());
+ }
+
+ private void verifyPostScriptFile(File psFile, int level)
+ throws IOException, DSCException {
+ InputStream in = new java.io.FileInputStream(psFile);
+ in = new java.io.BufferedInputStream(in);
+ try {
+ DSCParser parser = new DSCParser(in);
+
+ DSCCommentPages pages = (DSCCommentPages)gotoDSCComment(parser, DSCConstants.PAGES);
+ assertEquals(1, pages.getPageCount());
+
+ //Skip procsets and encoding
+ gotoDSCComment(parser, DSCConstants.BEGIN_RESOURCE);
+ gotoDSCComment(parser, DSCConstants.BEGIN_RESOURCE);
+ gotoDSCComment(parser, DSCConstants.BEGIN_RESOURCE);
+
+ PSResource form2 = new PSResource(PSResource.TYPE_FORM, "FOPForm:2");
+ checkResourceComment(parser, DSCConstants.BEGIN_RESOURCE, form2);
+ DSCCommentTitle title = (DSCCommentTitle)parser.nextEvent().asDSCComment();
+ assertEquals("image/jpeg test/resources/images/bgimg300dpi.jpg", title.getTitle());
+
+ String resourceContent = getResourceContent(parser);
+
+ if (level == 3) {
+ assertContains(resourceContent, "/FOPForm:2");
+ assertContains(resourceContent, "/DCTDecode filter");
+ assertContains(resourceContent, "/ReusableStreamDecode filter");
+ } else {
+ assertContains(resourceContent, "/FOPForm:2");
+ assertContains(resourceContent, "/DCTDecode filter");
+ assertAbsent(resourceContent, "/ReusableStreamDecode filter");
+ }
+
+ //---=== Page 1 ===---
+ DSCCommentPage page = (DSCCommentPage)gotoDSCComment(parser, DSCConstants.PAGE);
+ assertEquals(1, page.getPagePosition());
+
+ PSResource form1 = new PSResource(PSResource.TYPE_FORM, "FOPForm:1");
+ checkResourceComment(parser, DSCConstants.BEGIN_RESOURCE, form1);
+ title = (DSCCommentTitle)parser.nextEvent().asDSCComment();
+ assertEquals("image/jpeg test/resources/images/bgimg72dpi.jpg", title.getTitle());
+ resourceContent = getResourceContent(parser);
+
+ if (level == 3) {
+ assertContains(resourceContent, "/FOPForm:1");
+ assertContains(resourceContent, "/DCTDecode filter");
+ assertContains(resourceContent, "/ReusableStreamDecode filter");
+ } else {
+ assertContains(resourceContent, "/FOPForm:1");
+ assertContains(resourceContent, "/DCTDecode filter");
+ assertAbsent(resourceContent, "/ReusableStreamDecode filter");
+ }
+
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
+ }
+
+ private void assertMatches(String text, String regex) {
+ assertTrue("Text didn't match '" + regex + "'", text.matches(regex));
+ }
+
+ private void assertContains(String text, String searchString) {
+ assertTrue("Text doesn't contain '" + searchString + "'", text.indexOf(searchString) >= 0);
+ }
+
+ private void assertAbsent(String text, String searchString) {
+ assertTrue("Text contains '" + searchString + "'", text.indexOf(searchString) < 0);
+ }
+
+ private String getResourceContent(DSCParser parser) throws IOException, DSCException {
+ StringBuffer sb = new StringBuffer();
+ while (parser.hasNext()) {
+ DSCEvent event = parser.nextEvent();
+ if (event.isLine()) {
+ sb.append(event.asLine().getLine()).append('\n');
+ } else if (event.isDSCComment()) {
+ if (DSCConstants.END_RESOURCE.equals(event.asDSCComment().getName())) {
+ break;
+ }
+ }
+ }
+ return sb.toString();
+ }
+
+}
Propchange: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ImageHandlingTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ImageHandlingTestCase.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ResourceOptimizationTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ResourceOptimizationTestCase.java?rev=727405&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ResourceOptimizationTestCase.java (added)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ResourceOptimizationTestCase.java Wed Dec 17 07:01:21 2008
@@ -0,0 +1,222 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.ps;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Set;
+
+import org.apache.commons.io.IOUtils;
+
+import org.apache.xmlgraphics.ps.DSCConstants;
+import org.apache.xmlgraphics.ps.PSResource;
+import org.apache.xmlgraphics.ps.dsc.DSCException;
+import org.apache.xmlgraphics.ps.dsc.DSCListener;
+import org.apache.xmlgraphics.ps.dsc.DSCParser;
+import org.apache.xmlgraphics.ps.dsc.DefaultNestedDocumentHandler;
+import org.apache.xmlgraphics.ps.dsc.events.AbstractResourcesDSCComment;
+import org.apache.xmlgraphics.ps.dsc.events.DSCAtend;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentBeginDocument;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentDocumentNeededResources;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentDocumentSuppliedResources;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentEndOfFile;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentIncludeResource;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPage;
+import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPages;
+
+import org.apache.fop.apps.FOUserAgent;
+
+/**
+ * Tests the PostScript resource optimization (selective de-duplication of
+ * images that are used multiple times).
+ */
+public class ResourceOptimizationTestCase extends AbstractPostScriptTestCase {
+
+ /**
+ * Tests resource optimization with the {@link PSRenderer}.
+ * @throws Exception if an error occurs
+ */
+ public void testResourceOptimizationWithRenderer() throws Exception {
+ FOUserAgent ua = fopFactory.newFOUserAgent();
+ PSRenderer renderer = new PSRenderer();
+ renderer.setUserAgent(ua);
+ // This is the important part: we're enabling resource optimization
+ renderer.getPSUtil().setOptimizeResources(true);
+ ua.setRendererOverride(renderer);
+
+ // Prepare output file
+ File outputFile = renderFile(ua, "ps-resources.fo",
+ "-rend-l" + renderer.getPSUtil().getLanguageLevel());
+ verifyPostScriptFile(outputFile);
+ }
+
+ /**
+ * Tests resource optimization with the {@link PSDocumentHandler}.
+ * @throws Exception if an error occurs
+ */
+ public void testResourceOptimizationWithIF() throws Exception {
+ FOUserAgent ua = fopFactory.newFOUserAgent();
+ PSDocumentHandler handler = new PSDocumentHandler();
+ handler.setUserAgent(ua);
+ // This is the important part: we're enabling resource optimization
+ handler.getPSUtil().setOptimizeResources(true);
+ ua.setDocumentHandlerOverride(handler);
+
+ // Prepare output file
+ File outputFile = renderFile(ua, "ps-resources.fo",
+ "-if-l" + handler.getPSUtil().getLanguageLevel());
+ verifyPostScriptFile(outputFile);
+ }
+
+ private void verifyPostScriptFile(File psFile) throws IOException, DSCException {
+ InputStream in = new java.io.FileInputStream(psFile);
+ in = new java.io.BufferedInputStream(in);
+ try {
+ DSCParser parser = new DSCParser(in);
+
+ //The first form is for arrow_down_small.png (to be reused)
+ PSResource form1 = new PSResource(PSResource.TYPE_FORM, "FOPForm:1");
+ PSResource helvetica = new PSResource(PSResource.TYPE_FONT, "Helvetica");
+ PSResource helveticaBold = new PSResource(PSResource.TYPE_FONT, "Helvetica-Bold");
+
+ PSResource res;
+ DSCCommentPages pages = (DSCCommentPages)gotoDSCComment(parser, DSCConstants.PAGES);
+ assertEquals(2, pages.getPageCount());
+
+ DSCCommentDocumentSuppliedResources supplied
+ = (DSCCommentDocumentSuppliedResources)gotoDSCComment(parser,
+ DSCConstants.DOCUMENT_SUPPLIED_RESOURCES);
+ Set resources = supplied.getResources();
+ assertEquals(4, resources.size());
+ assertTrue(resources.contains(form1));
+ assertTrue("Expected barcode.eps as supplied resource",
+ resources.contains(new PSResource(PSResource.TYPE_FILE,
+ "test/resources/images/barcode.eps")));
+
+ DSCCommentDocumentNeededResources needed
+ = (DSCCommentDocumentNeededResources)gotoDSCComment(parser,
+ DSCConstants.DOCUMENT_NEEDED_RESOURCES);
+ resources = needed.getResources();
+ assertEquals(2, resources.size());
+ assertTrue("Expected Helvetica as needed resource",
+ resources.contains(new PSResource(PSResource.TYPE_FONT, "Helvetica")));
+ assertTrue("Expected Helvetica-Bold as needed resource",
+ resources.contains(new PSResource(PSResource.TYPE_FONT, "Helvetica-Bold")));
+
+ //Some document structure checking
+ assertNotNull(gotoDSCComment(parser, DSCConstants.BEGIN_DEFAULTS));
+ assertNotNull(gotoDSCComment(parser, DSCConstants.END_DEFAULTS));
+ assertNotNull(gotoDSCComment(parser, DSCConstants.BEGIN_PROLOG));
+ assertNotNull(gotoDSCComment(parser, DSCConstants.END_PROLOG));
+ assertNotNull(gotoDSCComment(parser, DSCConstants.BEGIN_SETUP));
+
+ //Check includes for the two referenced base 14 fonts
+ DSCCommentIncludeResource include;
+ Collection strings = new java.util.HashSet(
+ Arrays.asList(new String[] {"Helvetica", "Helvetica-Bold"}));
+ for (int i = 0; i < 2; i++) {
+ include = (DSCCommentIncludeResource)gotoDSCComment(
+ parser, DSCConstants.INCLUDE_RESOURCE);
+ res = include.getResource();
+ assertEquals(PSResource.TYPE_FONT, res.getType());
+ strings.remove(res.getName());
+ }
+ assertEquals(0, strings.size());
+
+ checkResourceComment(parser, DSCConstants.BEGIN_RESOURCE,
+ new PSResource(PSResource.TYPE_ENCODING, "WinAnsiEncoding"));
+
+ //Here, we encounter form 1 again
+ checkResourceComment(parser, DSCConstants.BEGIN_RESOURCE, form1);
+
+ assertNotNull(gotoDSCComment(parser, DSCConstants.END_SETUP));
+ //Now the actual pages begin
+
+ //---=== Page 1 ===---
+ DSCCommentPage page = (DSCCommentPage)gotoDSCComment(parser, DSCConstants.PAGE);
+ assertEquals(1, page.getPagePosition());
+
+ assertEquals(DSCAtend.class,
+ gotoDSCComment(parser, DSCConstants.PAGE_RESOURCES).getClass());
+ assertNotNull(gotoDSCComment(parser, DSCConstants.BEGIN_PAGE_SETUP));
+ assertNotNull(gotoDSCComment(parser, DSCConstants.END_PAGE_SETUP));
+
+ PSResource form2 = new PSResource(PSResource.TYPE_FORM, "FOPForm:2");
+ checkResourceComment(parser, DSCConstants.BEGIN_RESOURCE, form2);
+ assertNotNull(gotoDSCComment(parser, DSCConstants.PAGE_TRAILER));
+
+ AbstractResourcesDSCComment pageResources;
+ pageResources = (AbstractResourcesDSCComment)gotoDSCComment(
+ parser, DSCConstants.PAGE_RESOURCES);
+ resources = pageResources.getResources();
+ assertEquals(5, resources.size());
+ assertTrue(resources.contains(form1));
+ assertTrue(resources.contains(form2));
+ assertTrue(resources.contains(helvetica));
+ assertTrue(resources.contains(helveticaBold));
+
+ //---=== Page 2 ===---
+ page = (DSCCommentPage)gotoDSCComment(parser, DSCConstants.PAGE);
+ assertEquals(2, page.getPagePosition());
+
+ assertEquals(DSCAtend.class,
+ gotoDSCComment(parser, DSCConstants.PAGE_RESOURCES).getClass());
+ assertNotNull(gotoDSCComment(parser, DSCConstants.BEGIN_PAGE_SETUP));
+ assertNotNull(gotoDSCComment(parser, DSCConstants.END_PAGE_SETUP));
+
+ DSCCommentBeginDocument beginDocument;
+ beginDocument = (DSCCommentBeginDocument)gotoDSCComment(
+ parser, DSCConstants.BEGIN_DOCUMENT);
+ assertEquals("test/resources/images/barcode.eps",
+ beginDocument.getResource().getName());
+ DSCListener listener = new DefaultNestedDocumentHandler(null);
+ listener.processEvent(beginDocument, parser);
+
+ //And again (the barcode is generated twice)
+ beginDocument = (DSCCommentBeginDocument)gotoDSCComment(
+ parser, DSCConstants.BEGIN_DOCUMENT);
+ assertEquals("test/resources/images/barcode.eps",
+ beginDocument.getResource().getName());
+ listener.processEvent(beginDocument, parser);
+
+ assertNotNull(gotoDSCComment(parser, DSCConstants.PAGE_TRAILER));
+ pageResources = (AbstractResourcesDSCComment)gotoDSCComment(
+ parser, DSCConstants.PAGE_RESOURCES);
+ resources = pageResources.getResources();
+ assertEquals(6, resources.size());
+ assertTrue(resources.contains(form1));
+ assertFalse(resources.contains(form2));
+ assertTrue(resources.contains(helvetica));
+ assertTrue(resources.contains(helveticaBold));
+ assertTrue(resources.contains(beginDocument.getResource()));
+
+ assertNotNull(gotoDSCComment(parser, DSCConstants.TRAILER));
+ //No headers in between, as they should have been put at the beginning of the file
+ assertEquals(DSCCommentEndOfFile.class, parser.nextEvent().asDSCComment().getClass());
+
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
+ }
+
+}
Propchange: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ResourceOptimizationTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ResourceOptimizationTestCase.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-jpeg-image.fo
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-jpeg-image.fo?rev=727405&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-jpeg-image.fo (added)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-jpeg-image.fo Wed Dec 17 07:01:21 2008
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="2cm">
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+ <fo:page-sequence master-reference="A4">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block>JPEG image:</fo:block>
+ <fo:block><fo:external-graphic src="test/resources/images/bgimg72dpi.jpg"/></fo:block>
+ <fo:block>
+ <fo:external-graphic src="test/resources/images/bgimg300dpi.jpg"/>
+ <fo:external-graphic src="test/resources/images/bgimg300dpi.jpg"/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+</fo:root>
Propchange: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-jpeg-image.fo
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-jpeg-image.fo
------------------------------------------------------------------------------
svn:keywords = Id
Added: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-resources.fo
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-resources.fo?rev=727405&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-resources.fo (added)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-resources.fo Wed Dec 17 07:01:21 2008
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="2cm">
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+ <fo:page-sequence master-reference="A4">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block font-weight="bold">PostScript Resource Optimization Test</fo:block>
+ <fo:block>Used again later:</fo:block>
+ <fo:block><fo:external-graphic src="test/resources/images/arrow_down_small.png"/></fo:block>
+ <fo:block>Used only once in the whole document:</fo:block>
+ <fo:block><fo:external-graphic src="test/resources/images/arrow_up_small.png"/></fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ <fo:page-sequence master-reference="A4">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block font-weight="bold">PostScript Resource Optimization Test</fo:block>
+ <fo:block>Image already used in previous page-sequence:</fo:block>
+ <fo:block>
+ <fo:external-graphic src="test/resources/images/arrow_down_small.png" content-width="80%"/>
+ <fo:external-graphic src="test/resources/images/arrow_down_small.png"/>
+ <fo:external-graphic src="test/resources/images/arrow_down_small.png" content-width="120%"/>
+ </fo:block>
+ <fo:block>Can't currently reuse EPS images:</fo:block>
+ <fo:block>
+ <fo:external-graphic src="test/resources/images/barcode.eps"/>
+ <fo:external-graphic src="test/resources/images/barcode.eps"/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+</fo:root>
Propchange: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-resources.fo
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/test/java/org/apache/fop/render/ps/ps-resources.fo
------------------------------------------------------------------------------
svn:keywords = Id
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org