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 ph...@apache.org on 2011/09/26 12:06:22 UTC

svn commit: r1175764 - in /xmlgraphics/fop/trunk: src/java/org/apache/fop/render/ps/PSImageHandlerGraphics2D.java status.xml

Author: phancock
Date: Mon Sep 26 10:06:22 2011
New Revision: 1175764

URL: http://svn.apache.org/viewvc?rev=1175764&view=rev
Log:
Bugzilla#51760: PS images stored as an embedded file which has no length limit.

Modified:
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSImageHandlerGraphics2D.java
    xmlgraphics/fop/trunk/status.xml

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSImageHandlerGraphics2D.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSImageHandlerGraphics2D.java?rev=1175764&r1=1175763&r2=1175764&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSImageHandlerGraphics2D.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSImageHandlerGraphics2D.java Mon Sep 26 10:06:22 2011
@@ -26,6 +26,7 @@ import java.awt.geom.Dimension2D;
 import java.awt.geom.Rectangle2D;
 import java.io.IOException;
 
+import org.apache.fop.render.RenderingContext;
 import org.apache.xmlgraphics.image.loader.Image;
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
 import org.apache.xmlgraphics.image.loader.ImageInfo;
@@ -36,8 +37,6 @@ import org.apache.xmlgraphics.ps.FormGen
 import org.apache.xmlgraphics.ps.PSGenerator;
 import org.apache.xmlgraphics.ps.PSProcSets;
 
-import org.apache.fop.render.RenderingContext;
-
 /**
  * Image handler implementation which handles vector graphics (Java2D) for PostScript output.
  */
@@ -97,34 +96,14 @@ public class PSImageHandlerGraphics2D im
     }
 
     /** {@inheritDoc} */
-    public void generateForm(RenderingContext context, Image image, PSImageFormResource form)
+    public void generateForm(RenderingContext context, Image image, final PSImageFormResource form)
             throws IOException {
         PSRenderingContext psContext = (PSRenderingContext)context;
         PSGenerator gen = psContext.getGenerator();
         final ImageGraphics2D imageG2D = (ImageGraphics2D)image;
         ImageInfo info = image.getInfo();
-        String imageDescription = info.getMimeType() + " " + info.getOriginalURI();
-        final Dimension2D dimensionsPt = info.getSize().getDimensionPt();
-        final Dimension2D dimensionsMpt = info.getSize().getDimensionMpt();
-
-        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");
-            }
-
-        };
+        FormGenerator formGen = buildFormGenerator(gen.getPSLevel(), form, info, imageG2D);
         formGen.generate(gen);
     }
     /** {@inheritDoc} */
@@ -150,4 +129,70 @@ public class PSImageHandlerGraphics2D im
         return false;
     }
 
+    private FormGenerator buildFormGenerator(int psLanguageLevel, final PSImageFormResource form,
+            final ImageInfo info, final ImageGraphics2D imageG2D) {
+        String imageDescription = info.getMimeType() + " " + info.getOriginalURI();
+        final Dimension2D dimensionsPt = info.getSize().getDimensionPt();
+        final Dimension2D dimensionsMpt = info.getSize().getDimensionMpt();
+        FormGenerator formGen;
+
+        if (psLanguageLevel <= 2) {
+            formGen = new EPSFormGenerator(form.getName(), imageDescription, dimensionsPt) {
+
+                @Override
+                void doGeneratePaintProc(PSGenerator gen) throws IOException {
+                    paintImageG2D(imageG2D, dimensionsMpt, gen);
+                }
+            };
+        } else {
+            formGen = new EPSFormGenerator(form.getName(), imageDescription, dimensionsPt) {
+
+                @Override
+                protected void generateAdditionalDataStream(PSGenerator gen) throws IOException {
+                    gen.writeln("/" + form.getName() + ":Data currentfile <<");
+                    gen.writeln("  /Filter /SubFileDecode");
+                    gen.writeln("  /DecodeParms << /EODCount 0 /EODString (%FOPEndOfData) >>");
+                    gen.writeln(">> /ReusableStreamDecode filter");
+                    paintImageG2D(imageG2D, dimensionsMpt, gen);
+                    gen.writeln("%FOPEndOfData");
+                    gen.writeln("def");
+                }
+
+                @Override
+                void doGeneratePaintProc(PSGenerator gen) throws IOException {
+                    gen.writeln(form.getName() + ":Data 0 setfileposition");
+                    gen.writeln(form.getName() + ":Data cvx exec");
+                }
+            };
+        }
+        return formGen;
+    }
+
+    private static abstract class EPSFormGenerator extends FormGenerator {
+
+        EPSFormGenerator(String formName, String title, Dimension2D dimensions) {
+            super(formName, title, dimensions);
+        }
+
+        protected void paintImageG2D(final ImageGraphics2D imageG2D, Dimension2D dimensionsMpt,
+                PSGenerator gen) throws IOException {
+            PSGraphics2DAdapter adapter = new PSGraphics2DAdapter(gen, false);
+            adapter.paintImage(imageG2D.getGraphics2DImagePainter(),
+                        null,
+                        0, 0,
+                        (int) Math.round(dimensionsMpt.getWidth()),
+                        (int) Math.round(dimensionsMpt.getHeight()));
+        }
+
+        @Override
+        protected final void generatePaintProc(PSGenerator gen) throws IOException {
+            gen.getResourceTracker().notifyResourceUsageOnPage(
+                    PSProcSets.EPS_PROCSET);
+            gen.writeln("BeginEPSF");
+            doGeneratePaintProc(gen);
+            gen.writeln("EndEPSF");
+        }
+
+        abstract void doGeneratePaintProc(PSGenerator gen) throws IOException;
+    }
 }

Modified: xmlgraphics/fop/trunk/status.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/status.xml?rev=1175764&r1=1175763&r2=1175764&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/status.xml (original)
+++ xmlgraphics/fop/trunk/status.xml Mon Sep 26 10:06:22 2011
@@ -60,6 +60,11 @@
       documents. Example: the fix of marks layering will be such a case when it's done.
     -->
     <release version="FOP Trunk" date="TBD">
+      <action context="Fonts" dev="PH" type="fix" fixes-bug="51760" due-to="Mehdi Houshmand">
+        Changes the way PostScript handles Graphics2D images such that if the language is set to
+        level 3, the image is stored as an embedded file which has no length limit.  Previously it
+        was stored as an array which has a implementation limit of 65535 elements.
+      </action>
       <action context="Fonts" dev="PH" type="fix" fixes-bug="51759" due-to="Mehdi Houshmand">
         PDFFactory responsible for asdigning name to a subset font.
       </action>



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org