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 vh...@apache.org on 2012/04/05 18:20:17 UTC

svn commit: r1309921 [33/42] - in /xmlgraphics/fop/branches/Temp_TrueTypeInPostScript: ./ examples/embedding/ examples/embedding/java/embedding/ examples/embedding/java/embedding/atxml/ examples/embedding/java/embedding/tools/ examples/plan/src/org/apa...

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java Thu Apr  5 16:19:19 2012
@@ -19,7 +19,6 @@
 
 package org.apache.fop.render.pcl;
 
-import java.awt.Graphics2D;
 import java.util.List;
 
 import org.apache.avalon.framework.configuration.Configuration;
@@ -108,11 +107,10 @@ public class PCLRendererConfigurator ext
                 throws FOPException {
         FontManager fontManager = userAgent.getFactory().getFontManager();
 
-        Graphics2D graphics2D = Java2DFontMetrics.createFontMetricsGraphics2D();
-
-        List fontCollections = new java.util.ArrayList();
-        fontCollections.add(new Base14FontCollection(graphics2D));
-        fontCollections.add(new InstalledFontCollection(graphics2D));
+        final Java2DFontMetrics java2DFontMetrics = new Java2DFontMetrics();
+        final List fontCollections = new java.util.ArrayList();
+        fontCollections.add(new Base14FontCollection(java2DFontMetrics));
+        fontCollections.add(new InstalledFontCollection(java2DFontMetrics));
 
         Configuration cfg = super.getRendererConfig(documentHandler.getMimeType());
         if (cfg != null) {
@@ -120,7 +118,8 @@ public class PCLRendererConfigurator ext
             FontEventListener listener = new FontEventAdapter(
                     userAgent.getEventBroadcaster());
             List fontList = buildFontList(cfg, fontResolver, listener);
-            fontCollections.add(new ConfiguredFontCollection(fontResolver, fontList));
+            fontCollections.add(new ConfiguredFontCollection(fontResolver, fontList,
+                                userAgent.isComplexScriptFeaturesEnabled()));
         }
 
         fontManager.setup(fontInfo,

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererContext.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererContext.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererContext.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererContext.java Thu Apr  5 16:19:19 2012
@@ -83,4 +83,4 @@ public class PCLRendererContext extends 
                             PCLConstants.COLOR_CANVAS)));
     }
 
-}
\ No newline at end of file
+}

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingMode.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingMode.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingMode.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingMode.java Thu Apr  5 16:19:19 2012
@@ -30,23 +30,26 @@ public final class PCLRenderingMode impl
     private static final long serialVersionUID = 6359884255324755026L;
 
     /** "Quality" rendering (mixed native and bitmap for improved quality) */
-    public static final PCLRenderingMode QUALITY = new PCLRenderingMode("quality");
+    public static final PCLRenderingMode QUALITY = new PCLRenderingMode("quality", 1.0f);
     /** "Speed" rendering (maximum speed with native rendering, reduced visual quality) */
-    public static final PCLRenderingMode SPEED = new PCLRenderingMode("speed");
+    public static final PCLRenderingMode SPEED = new PCLRenderingMode("speed", 0.25f);
     /**
      * "Bitmap" rendering (pages are painted entirely as bitmaps, maximum quality,
      * reduced performance)
      */
-    public static final PCLRenderingMode BITMAP = new PCLRenderingMode("bitmap");
+    public static final PCLRenderingMode BITMAP = new PCLRenderingMode("bitmap", 1.0f);
 
     private String name;
+    private float defaultDitheringQuality;
 
     /**
      * Constructor to add a new named item.
      * @param name Name of the item.
+     * @param defaultDitheringQuality the default dithering quality (0.0f..1.0f)
      */
-    private PCLRenderingMode(String name) {
+    private PCLRenderingMode(String name, float defaultDitheringQuality) {
         this.name = name;
+        this.defaultDitheringQuality = defaultDitheringQuality;
     }
 
     /** @return the name of the enum */
@@ -55,6 +58,14 @@ public final class PCLRenderingMode impl
     }
 
     /**
+     * Returns the default dithering quality for this rendering mode.
+     * @return the default dithering quality (0.0f..1.0f)
+     */
+    public float getDefaultDitheringQuality() {
+        return this.defaultDitheringQuality;
+    }
+
+    /**
      * Returns the enumeration/singleton object based on its name.
      * @param name the name of the enumeration value
      * @return the enumeration object
@@ -76,6 +87,7 @@ public final class PCLRenderingMode impl
     }
 
     /** {@inheritDoc} */
+    @Override
     public String toString() {
         return "PCLRenderingMode:" + name;
     }

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingUtil.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingUtil.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingUtil.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingUtil.java Thu Apr  5 16:19:19 2012
@@ -47,6 +47,9 @@ public class PCLRenderingUtil {
      */
     private PCLRenderingMode renderingMode = PCLRenderingMode.SPEED;
 
+    /** Controls the dithering quality when rendering gray or color images. */
+    private float ditheringQuality = 0.5f;
+
     /**
      * Controls whether all text should be painted as text. This is a fallback setting in case
      * the mixture of native and bitmapped text does not provide the necessary quality.
@@ -88,6 +91,7 @@ public class PCLRenderingUtil {
      */
     public void setRenderingMode(PCLRenderingMode mode) {
         this.renderingMode = mode;
+        this.ditheringQuality = mode.getDefaultDitheringQuality();
     }
 
     /**
@@ -99,6 +103,14 @@ public class PCLRenderingUtil {
     }
 
     /**
+     * Returns the dithering quality to be used when encoding gray or color images.
+     * @return the quality (0.0f..1.0f)
+     */
+    public float getDitheringQuality() {
+        return this.ditheringQuality;
+    }
+
+    /**
      * Controls whether PJL commands shall be generated by the PCL renderer.
      * @param disable true to disable PJL commands
      */

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/extensions/PCLElementMapping.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/extensions/PCLElementMapping.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/extensions/PCLElementMapping.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/extensions/PCLElementMapping.java Thu Apr  5 16:19:19 2012
@@ -57,7 +57,7 @@ public class PCLElementMapping extends E
     protected void initialize() {
 
         if (foObjs == null) {
-            foObjs = new HashMap();
+            foObjs = new HashMap<String, Maker>();
             //No extension elements, yet, only attributes
         }
 

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java Thu Apr  5 16:19:19 2012
@@ -25,6 +25,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 import org.apache.xmlgraphics.image.loader.Image;
+import org.apache.xmlgraphics.java2d.color.profile.ColorProfileUtil;
 
 import org.apache.fop.pdf.PDFColor;
 import org.apache.fop.pdf.PDFConformanceException;
@@ -34,8 +35,8 @@ import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFICCBasedColorSpace;
 import org.apache.fop.pdf.PDFICCStream;
 import org.apache.fop.pdf.PDFImage;
+import org.apache.fop.pdf.PDFName;
 import org.apache.fop.pdf.PDFReference;
-import org.apache.fop.util.ColorProfileUtil;
 
 /**
  * Abstract PDFImage implementation for the PDF renderer.
@@ -126,9 +127,15 @@ public abstract class AbstractImageAdapt
                 pdfICCStream = cs.getICCStream();
             }
         } else {
-            if (cs == null && desc.startsWith("sRGB")) {
+            if (cs == null) {
+                if (desc == null || !desc.startsWith("sRGB")) {
+                    log.warn("The default sRGB profile was indicated,"
+                            + " but the profile description does not match what was expected: "
+                            + desc);
+                }
                 //It's the default sRGB profile which we mapped to DefaultRGB in PDFRenderer
-                cs = doc.getResources().getColorSpace("DefaultRGB");
+                cs = (PDFICCBasedColorSpace)doc.getResources().getColorSpace(
+                        new PDFName("DefaultRGB"));
             }
             if (cs == null) {
                 // sRGB hasn't been set up for the PDF document

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java Thu Apr  5 16:19:19 2012
@@ -22,8 +22,6 @@ package org.apache.fop.render.pdf;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.w3c.dom.Node;
-
 import org.apache.fop.events.EventBroadcaster;
 import org.apache.fop.pdf.PDFName;
 import org.apache.fop.pdf.PDFObject;
@@ -37,9 +35,11 @@ final class FOToPDFRoleMap {
     /**
      * Standard structure types defined by the PDF Reference, Fourth Edition (PDF 1.5).
      */
-    private static final Map STANDARD_STRUCTURE_TYPES = new HashMap();
+    private static final Map<String, PDFName> STANDARD_STRUCTURE_TYPES
+            = new HashMap<String, PDFName>();
 
-    private static final Map DEFAULT_MAPPINGS = new java.util.HashMap();
+    private static final Map<String, Mapper> DEFAULT_MAPPINGS
+            = new java.util.HashMap<String, Mapper>();
 
     private static final PDFName THEAD;
     private static final PDFName NON_STRUCT;
@@ -172,7 +172,7 @@ final class FOToPDFRoleMap {
      * @return the structure type or null if no match could be found
      */
     public static PDFName mapFormattingObject(String fo, PDFObject parent) {
-        Mapper mapper = (Mapper)DEFAULT_MAPPINGS.get(fo);
+        Mapper mapper = (Mapper) DEFAULT_MAPPINGS.get(fo);
         if (mapper != null) {
             return mapper.getStructureType(parent);
         } else {
@@ -180,27 +180,32 @@ final class FOToPDFRoleMap {
         }
     }
 
-    public static PDFName mapFormattingObject(Node fo, PDFObject parent,
-            EventBroadcaster eventBroadcaster) {
+    /**
+     * Maps a Formatting Object to a PDFName representing the associated structure type.
+     * @param fo the formatting object's local name
+     * @param role the value of the formatting object's role property
+     * @param parent the parent of the structure element to be mapped
+     * @param eventBroadcaster the event broadcaster
+     * @return the structure type or null if no match could be found
+     */
+    public static PDFName mapFormattingObject(String fo, String role,
+            PDFObject parent, EventBroadcaster eventBroadcaster) {
         PDFName type = null;
-        Node role = fo.getAttributes().getNamedItemNS(null, "role");
         if (role == null) {
-            type = mapFormattingObject(fo.getLocalName(), parent);
+            type = mapFormattingObject(fo, parent);
         } else {
-            String customType = role.getNodeValue();
-            type = (PDFName) STANDARD_STRUCTURE_TYPES.get(customType);
+            type = (PDFName) STANDARD_STRUCTURE_TYPES.get(role);
             if (type == null) {
-                String foName = fo.getLocalName();
-                type = mapFormattingObject(foName, parent);
+                type = mapFormattingObject(fo, parent);
                 PDFEventProducer.Provider.get(eventBroadcaster).nonStandardStructureType(fo,
-                        foName, customType, type.toString().substring(1));
+                        fo, role, type.toString().substring(1));
             }
         }
         assert type != null;
         return type;
     }
 
-    private static interface Mapper {
+    private interface Mapper {
         PDFName getStructureType(PDFObject parent);
     }
 
@@ -222,7 +227,7 @@ final class FOToPDFRoleMap {
 
         public PDFName getStructureType(PDFObject parent) {
             PDFStructElem grandParent = (PDFStructElem)
-                ((PDFStructElem)parent).getParentStructElem();
+                ((PDFStructElem) parent).getParentStructElem();
             //TODO What to do with cells from table-footer? Currently they are mapped on TD.
             PDFName type;
             if (THEAD.equals(grandParent.getStructureType())) {

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java Thu Apr  5 16:19:19 2012
@@ -27,6 +27,7 @@ import java.awt.image.RenderedImage;
 import java.io.IOException;
 import java.io.OutputStream;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -78,12 +79,14 @@ public class ImageRenderedAdapter extend
     }
 
     /** {@inheritDoc} */
+    @Override
     public int getWidth() {
         RenderedImage ri = getImage().getRenderedImage();
         return ri.getWidth();
     }
 
     /** {@inheritDoc} */
+    @Override
     public int getHeight() {
         RenderedImage ri = getImage().getRenderedImage();
         return ri.getHeight();
@@ -94,11 +97,13 @@ public class ImageRenderedAdapter extend
     }
 
     /** {@inheritDoc} */
+    @Override
     protected ColorSpace getImageColorSpace() {
         return getEffectiveColorModel().getColorSpace();
     }
 
     /** {@inheritDoc} */
+    @Override
     protected ICC_Profile getEffectiveICCProfile() {
         ColorSpace cs = getImageColorSpace();
         if (cs instanceof ICC_ColorSpace) {
@@ -110,6 +115,7 @@ public class ImageRenderedAdapter extend
     }
 
     /** {@inheritDoc} */
+    @Override
     public void setup(PDFDocument doc) {
         RenderedImage ri = getImage().getRenderedImage();
 
@@ -145,6 +151,7 @@ public class ImageRenderedAdapter extend
     }
 
     /** {@inheritDoc} */
+    @Override
     public boolean isTransparent() {
         ColorModel cm = getEffectiveColorModel();
         if (cm instanceof IndexColorModel) {
@@ -172,7 +179,7 @@ public class ImageRenderedAdapter extend
                     i < ((IndexColorModel) cm).getMapSize();
                     i++) {
                 if ((alphas[i] & 0xFF) == 0) {
-                    return new Integer(i);
+                    return Integer.valueOf(i);
                 }
             }
         }
@@ -180,6 +187,7 @@ public class ImageRenderedAdapter extend
     }
 
     /** {@inheritDoc} */
+    @Override
     public PDFColor getTransparentColor() {
         ColorModel cm = getEffectiveColorModel();
         if (cm instanceof IndexColorModel) {
@@ -196,11 +204,13 @@ public class ImageRenderedAdapter extend
     }
 
     /** {@inheritDoc} */
+    @Override
     public String getMask() {
         return maskRef;
     }
 
     /** {@inheritDoc} */
+    @Override
     public PDFReference getSoftMaskReference() {
         return softMask;
     }
@@ -212,12 +222,18 @@ public class ImageRenderedAdapter extend
 
     /** {@inheritDoc} */
     public void outputContents(OutputStream out) throws IOException {
+        long start = System.currentTimeMillis();
         encodingHelper.encode(out);
+        long duration = System.currentTimeMillis() - start;
+        if (log.isDebugEnabled()) {
+            log.debug("Image encoding took " + duration + "ms");
+        }
     }
 
     private static final int MAX_HIVAL = 255;
 
     /** {@inheritDoc} */
+    @Override
     public void populateXObjectDictionary(PDFDictionary dict) {
         ColorModel cm = getEffectiveColorModel();
         if (cm instanceof IndexColorModel) {
@@ -237,7 +253,7 @@ public class ImageRenderedAdapter extend
             if (hival > MAX_HIVAL) {
                 throw new UnsupportedOperationException("hival must not go beyond " + MAX_HIVAL);
             }
-            indexed.add(new Integer(hival));
+            indexed.add(Integer.valueOf(hival));
             int[] palette = new int[c];
             icm.getRGBs(palette);
             ByteArrayOutputStream baout = new ByteArrayOutputStream();
@@ -250,6 +266,7 @@ public class ImageRenderedAdapter extend
                 baout.write(entry & 0xFF);
             }
             indexed.add(baout.toByteArray());
+            IOUtils.closeQuietly(baout);
 
             dict.put("ColorSpace", indexed);
             dict.put("BitsPerComponent", icm.getPixelSize());

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFConfigurationConstants.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFConfigurationConstants.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFConfigurationConstants.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFConfigurationConstants.java Thu Apr  5 16:19:19 2012
@@ -38,12 +38,44 @@ public interface PDFConfigurationConstan
     String NO_EDIT_CONTENT = "noedit";
     /** PDF encryption parameter: Forbids annotations, datatype: Boolean or "true"/"false" */
     String NO_ANNOTATIONS = "noannotations";
+
+    /**
+     * PDF encryption parameter: Forbids filling in existing interactive forms, datatype:
+     * Boolean or "true"/"false"
+     */
+    String NO_FILLINFORMS = "nofillinforms";
+
+    /**
+     * PDF encryption parameter: Forbids extracting text and graphics, datatype: Boolean
+     * or "true"/"false"
+     */
+    String NO_ACCESSCONTENT = "noaccesscontent";
+
+    /**
+     * PDF encryption parameter: Forbids assembling document, datatype: Boolean or
+     * "true"/"false"
+     */
+    String NO_ASSEMBLEDOC = "noassembledoc";
+
+    /**
+     * PDF encryption parameter: Forbids printing to high quality, datatype: Boolean or
+     * "true"/"false"
+     */
+    String NO_PRINTHQ = "noprinthq";
+
+    /**
+     * PDF encryption length parameter: must be a multiple of 8 between 40 and 128,
+     * default value 40, datatype: int.
+     */
+    String ENCRYPTION_LENGTH = "encryption-length";
     /** Rendering Options key for the PDF/A mode. */
     String PDF_A_MODE = "pdf-a-mode";
     /** Rendering Options key for the PDF/X mode. */
     String PDF_X_MODE = "pdf-x-mode";
     /** Rendering Options key for the ICC profile for the output intent. */
     String KEY_OUTPUT_PROFILE = "output-profile";
+    /** PDF version entry: specify the version of the PDF document created, datatype: String */
+    String PDF_VERSION = "version";
     /**
      * Rendering Options key for disabling the sRGB color space (only possible if no PDF/A or
      * PDF/X profile is active).

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java Thu Apr  5 16:19:19 2012
@@ -25,7 +25,7 @@ import java.awt.geom.AffineTransform;
 import java.io.IOException;
 import java.io.OutputStream;
 
-import org.apache.fop.pdf.PDFColor;
+import org.apache.fop.pdf.PDFColorHandler;
 import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFFilterList;
 import org.apache.fop.pdf.PDFNumber;
@@ -51,6 +51,8 @@ public class PDFContentGenerator {
     /** the current stream to add PDF commands to */
     private PDFStream currentStream;
 
+    private PDFColorHandler colorHandler;
+
     /** drawing state */
     protected PDFPaintingState currentState = null;
     /** Text generation utility holding the current font status */
@@ -80,6 +82,7 @@ public class PDFContentGenerator {
         };
 
         this.currentState = new PDFPaintingState();
+        this.colorHandler = new PDFColorHandler(document.getResources());
     }
 
     /**
@@ -267,10 +270,10 @@ public class PDFContentGenerator {
     /** Indicates the end of a text object. */
     protected void endTextObject() {
         if (textutil.isInTextObject()) {
+            textutil.endTextObject();
             if (this.inMarkedContentSequence) {
                 endMarkedContentSequence();
             }
-            textutil.endTextObject();
         }
     }
 
@@ -344,8 +347,9 @@ public class PDFContentGenerator {
      */
     public void setColor(Color col, boolean fill, PDFStream stream) {
         assert stream != null;
-        PDFColor color = new PDFColor(this.document, col);
-        stream.add(color.getColorSpaceOut(fill));
+        StringBuffer sb = new StringBuffer();
+        setColor(col, fill, sb);
+        stream.add(sb.toString());
     }
 
     /**
@@ -367,8 +371,7 @@ public class PDFContentGenerator {
      */
     protected void setColor(Color col, boolean fill, StringBuffer pdf) {
         if (pdf != null) {
-            PDFColor color = new PDFColor(this.document, col);
-            pdf.append(color.getColorSpaceOut(fill));
+            colorHandler.establishColor(pdf, col, fill);
         } else {
             setColor(col, fill, this.currentStream);
         }

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java Thu Apr  5 16:19:19 2012
@@ -25,49 +25,47 @@ import java.awt.geom.AffineTransform;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 
-import org.w3c.dom.NodeList;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 import org.apache.xmlgraphics.xmp.Metadata;
 
+import org.apache.fop.accessibility.StructureTreeEventHandler;
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.fo.extensions.xmp.XMPMetadata;
 import org.apache.fop.pdf.PDFAnnotList;
 import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFPage;
-import org.apache.fop.pdf.PDFReference;
 import org.apache.fop.pdf.PDFResourceContext;
 import org.apache.fop.pdf.PDFResources;
 import org.apache.fop.render.extensions.prepress.PageBoundaries;
 import org.apache.fop.render.extensions.prepress.PageScale;
 import org.apache.fop.render.intermediate.AbstractBinaryWritingIFDocumentHandler;
 import org.apache.fop.render.intermediate.IFContext;
-import org.apache.fop.render.intermediate.IFDocumentHandler;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
 import org.apache.fop.render.intermediate.IFDocumentNavigationHandler;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFPainter;
 import org.apache.fop.render.pdf.extensions.PDFEmbeddedFileExtensionAttachment;
-import org.apache.fop.util.XMLUtil;
 
 /**
- * {@link IFDocumentHandler} implementation that produces PDF.
+ * {@link org.apache.fop.render.intermediate.IFDocumentHandler} implementation that produces PDF.
  */
 public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler {
 
     /** logging instance */
     private static Log log = LogFactory.getLog(PDFDocumentHandler.class);
 
-    private int pageSequenceIndex;
-
     private boolean accessEnabled;
 
     private PDFLogicalStructureHandler logicalStructureHandler;
 
+    private PDFStructureTreeBuilder structureTreeBuilder;
+
     /** the PDF Document being created */
     protected PDFDocument pdfDoc;
 
@@ -93,7 +91,7 @@ public class PDFDocumentHandler extends 
     protected PageReference currentPageRef;
 
     /** Used for bookmarks/outlines. */
-    protected Map pageReferences = new java.util.HashMap();
+    protected Map<Integer, PageReference> pageReferences = new HashMap<Integer, PageReference>();
 
     private final PDFDocumentNavigationHandler documentNavigationHandler
             = new PDFDocumentNavigationHandler(this);
@@ -145,15 +143,23 @@ public class PDFDocumentHandler extends 
             this.pdfDoc = pdfUtil.setupPDFDocument(this.outputStream);
             this.accessEnabled = getUserAgent().isAccessibilityEnabled();
             if (accessEnabled) {
-                pdfDoc.getRoot().makeTagged();
-                logicalStructureHandler = new PDFLogicalStructureHandler(pdfDoc,
-                        getUserAgent().getEventBroadcaster());
+                setupAccessibility();
             }
         } catch (IOException e) {
             throw new IFException("I/O error in startDocument()", e);
         }
     }
 
+    private void setupAccessibility() {
+        pdfDoc.getRoot().makeTagged();
+        logicalStructureHandler = new PDFLogicalStructureHandler(pdfDoc);
+        // TODO this is ugly. All the necessary information should be available
+        // at creation time in order to enforce immutability
+        structureTreeBuilder.setPdfFactory(pdfDoc.getFactory());
+        structureTreeBuilder.setLogicalStructureHandler(logicalStructureHandler);
+        structureTreeBuilder.setEventBroadcaster(getUserAgent().getEventBroadcaster());
+    }
+
     /** {@inheritDoc} */
     public void endDocumentHeader() throws IFException {
         pdfUtil.generateDefaultXMPMetadata();
@@ -178,18 +184,7 @@ public class PDFDocumentHandler extends 
 
     /** {@inheritDoc} */
     public void startPageSequence(String id) throws IFException {
-        //TODO page sequence title
-
-        if (this.pdfDoc.getRoot().getLanguage() == null
-                && getContext().getLanguage() != null) {
-            //No document-level language set, so we use the first page-sequence's language
-            this.pdfDoc.getRoot().setLanguage(XMLUtil.toRFC3066(getContext().getLanguage()));
-        }
-
-        if (accessEnabled) {
-            NodeList nodes = getUserAgent().getStructureTree().getPageSequence(pageSequenceIndex++);
-            logicalStructureHandler.processStructureTree(nodes, getContext().getLanguage());
-        }
+        //nop
     }
 
     /** {@inheritDoc} */
@@ -238,7 +233,7 @@ public class PDFDocumentHandler extends 
         pdfUtil.generatePageLabel(index, name);
 
         currentPageRef = new PageReference(currentPage, size);
-        this.pageReferences.put(new Integer(index), currentPageRef);
+        this.pageReferences.put(Integer.valueOf(index), currentPageRef);
 
         this.generator = new PDFContentGenerator(this.pdfDoc, this.outputStream,
                 this.currentPage);
@@ -289,9 +284,9 @@ public class PDFDocumentHandler extends 
     /** {@inheritDoc} */
     public void handleExtensionObject(Object extension) throws IFException {
         if (extension instanceof XMPMetadata) {
-            pdfUtil.renderXMPMetadata((XMPMetadata)extension);
+            pdfUtil.renderXMPMetadata((XMPMetadata) extension);
         } else if (extension instanceof Metadata) {
-            XMPMetadata wrapper = new XMPMetadata(((Metadata)extension));
+            XMPMetadata wrapper = new XMPMetadata(((Metadata) extension));
             pdfUtil.renderXMPMetadata(wrapper);
         } else if (extension instanceof PDFEmbeddedFileExtensionAttachment) {
             PDFEmbeddedFileExtensionAttachment embeddedFile
@@ -307,22 +302,28 @@ public class PDFDocumentHandler extends 
         }
     }
 
+    /** {@inheritDoc} */
+    public void setDocumentLocale(Locale locale) {
+        pdfDoc.getRoot().setLanguage(locale);
+    }
+
     PageReference getPageReference(int pageIndex) {
-        return (PageReference)this.pageReferences.get(
-                new Integer(pageIndex));
+        return this.pageReferences.get(Integer.valueOf(pageIndex));
     }
 
     static final class PageReference {
 
-        private final PDFReference pageRef;
+        private final String pageRef;
         private final Dimension pageDimension;
 
         private PageReference(PDFPage page, Dimension dim) {
-            this.pageRef = page.makeReference();
+            // Avoid keeping references to PDFPage as memory usage is
+            // considerably increased when handling thousands of pages.
+            this.pageRef = page.makeReference().toString();
             this.pageDimension = new Dimension(dim);
         }
 
-        public PDFReference getPageRef() {
+        public String getPageRef() {
             return this.pageRef;
         }
 
@@ -331,4 +332,11 @@ public class PDFDocumentHandler extends 
         }
     }
 
+    @Override
+    public StructureTreeEventHandler getStructureTreeEventHandler() {
+        if (structureTreeBuilder == null) {
+            structureTreeBuilder = new PDFStructureTreeBuilder();
+        }
+        return structureTreeBuilder;
+    }
 }

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandlerMaker.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandlerMaker.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandlerMaker.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandlerMaker.java Thu Apr  5 16:19:19 2012
@@ -36,6 +36,9 @@ public class PDFDocumentHandlerMaker ext
     public IFDocumentHandler makeIFDocumentHandler(FOUserAgent ua) {
         PDFDocumentHandler handler = new PDFDocumentHandler();
         handler.setContext(new IFContext(ua));
+        if (ua.isAccessibilityEnabled()) {
+            ua.setStructureTreeEventHandler(handler.getStructureTreeEventHandler());
+        }
         return handler;
     }
 

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java Thu Apr  5 16:19:19 2012
@@ -31,6 +31,7 @@ import org.apache.fop.pdf.PDFFactory;
 import org.apache.fop.pdf.PDFGoTo;
 import org.apache.fop.pdf.PDFLink;
 import org.apache.fop.pdf.PDFOutline;
+import org.apache.fop.pdf.PDFStructElem;
 import org.apache.fop.render.intermediate.IFDocumentNavigationHandler;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.extensions.AbstractAction;
@@ -111,10 +112,9 @@ public class PDFDocumentNavigationHandle
         PDFLink pdfLink = getPDFDoc().getFactory().makeLink(
                 targetRect2D, pdfAction);
         if (pdfLink != null) {
-            String ptr = link.getAction().getStructurePointer();
-            if (documentHandler.getUserAgent().isAccessibilityEnabled()
-                    && ptr != null && ptr.length() > 0) {
-                documentHandler.getLogicalStructureHandler().addLinkContentItem(pdfLink, ptr);
+            PDFStructElem structure = (PDFStructElem) link.getAction().getStructureTreeElement();
+            if (documentHandler.getUserAgent().isAccessibilityEnabled() && structure != null) {
+                documentHandler.getLogicalStructureHandler().addLinkContentItem(pdfLink, structure);
             }
             documentHandler.currentPage.addAnnotation(pdfLink);
         }
@@ -189,7 +189,7 @@ public class PDFDocumentNavigationHandle
         p2d = new Point2D.Double(
                 action.getTargetLocation().x / 1000.0,
                 (pageRef.getPageDimension().height - action.getTargetLocation().y) / 1000.0);
-        String pdfPageRef = pageRef.getPageRef().toString();
+        String pdfPageRef = pageRef.getPageRef();
         pdfGoTo.setPageReference(pdfPageRef);
         pdfGoTo.setPosition(p2d);
 

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.java Thu Apr  5 16:19:19 2012
@@ -65,4 +65,14 @@ public interface PDFEventProducer extend
      * @event.severity WARN
      */
     void nonStandardStructureType(Object source, String fo, String type, String fallback);
+
+    /**
+     * The encryption length must be a multiple of 8 between 40 and 128.
+     *
+     * @param source the event source
+     * @param originalValue requested encryption length
+     * @param correctedValue corrected encryption length
+     * @event.severity WARN
+     */
+    void incorrectEncryptionLength(Object source, int originalValue, int correctedValue);
 }

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.xml?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.xml (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.xml Thu Apr  5 16:19:19 2012
@@ -2,4 +2,5 @@
 <catalogue xml:lang="en">
   <message key="nonFullyResolvedLinkTargets">{count} link target{count,equals,1,,s} could not be fully resolved and now point{count,equals,1,,s} to the top of the page or {count,equals,1,is,are} dysfunctional.</message>
   <message key="nonStandardStructureType">‘{type}’ is not a standard structure type defined by the PDF Reference. Falling back to ‘{fallback}’.</message>
+  <message key="incorrectEncryptionLength">Encryption length must be a multiple of 8 between 40 and 128. Setting encryption length to {correctedValue} instead of {originalValue}.</message>
 </catalogue>

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java Thu Apr  5 16:19:19 2012
@@ -31,6 +31,7 @@ import org.apache.xmlgraphics.image.load
 import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D;
 
 import org.apache.fop.render.AbstractImageHandlerGraphics2D;
+import org.apache.fop.render.ImageHandlerUtil;
 import org.apache.fop.render.RenderingContext;
 import org.apache.fop.render.pdf.PDFLogicalStructureHandler.MarkedContentInfo;
 import org.apache.fop.svg.PDFGraphics2D;
@@ -60,8 +61,8 @@ public class PDFImageHandlerGraphics2D e
         float imw = (float)dim.getWidth() / 1000f;
         float imh = (float)dim.getHeight() / 1000f;
 
-        float sx = fwidth / (float)imw;
-        float sy = fheight / (float)imh;
+        float sx = fwidth / imw;
+        float sy = fheight / imh;
 
         generator.comment("G2D start");
         boolean accessibilityEnabled = context.getUserAgent().isAccessibilityEnabled();
@@ -123,8 +124,16 @@ public class PDFImageHandlerGraphics2D e
 
     /** {@inheritDoc} */
     public boolean isCompatible(RenderingContext targetContext, Image image) {
-        return (image == null || image instanceof ImageGraphics2D)
+        boolean supported = (image == null || image instanceof ImageGraphics2D)
                 && targetContext instanceof PDFRenderingContext;
+        if (supported) {
+            String mode = (String)targetContext.getHint(ImageHandlerUtil.CONVERSION_MODE);
+            if (ImageHandlerUtil.isConversionModeBitmap(mode)) {
+                //Disabling this image handler automatically causes a bitmap to be generated
+                return false;
+            }
+        }
+        return supported;
     }
 
 }

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawCCITTFax.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawCCITTFax.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawCCITTFax.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawCCITTFax.java Thu Apr  5 16:19:19 2012
@@ -19,44 +19,26 @@
 
 package org.apache.fop.render.pdf;
 
-import java.awt.Rectangle;
-import java.io.IOException;
-
 import org.apache.xmlgraphics.image.loader.Image;
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
 import org.apache.xmlgraphics.image.loader.impl.ImageRawCCITTFax;
 
 import org.apache.fop.pdf.PDFImage;
-import org.apache.fop.pdf.PDFXObject;
-import org.apache.fop.render.ImageHandler;
 import org.apache.fop.render.RenderingContext;
 
 /**
  * Image handler implementation which handles CCITT encoded images (CCITT fax group 3/4)
  * for PDF output.
  */
-public class PDFImageHandlerRawCCITTFax implements ImageHandler {
+public class PDFImageHandlerRawCCITTFax extends AbstractPDFImageHandler {
 
     private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
         ImageFlavor.RAW_CCITTFAX,
     };
 
-    /** {@inheritDoc} */
-    public void handleImage(RenderingContext context, Image image, Rectangle pos)
-                throws IOException {
-        PDFRenderingContext pdfContext = (PDFRenderingContext)context;
-        PDFContentGenerator generator = pdfContext.getGenerator();
-        ImageRawCCITTFax ccitt = (ImageRawCCITTFax)image;
-
-        PDFImage pdfimage = new ImageRawCCITTFaxAdapter(ccitt, image.getInfo().getOriginalURI());
-        PDFXObject xobj = generator.getDocument().addImage(
-                generator.getResourceContext(), pdfimage);
-
-        float x = (float)pos.getX() / 1000f;
-        float y = (float)pos.getY() / 1000f;
-        float w = (float)pos.getWidth() / 1000f;
-        float h = (float)pos.getHeight() / 1000f;
-        generator.placeImage(x, y, w, h, xobj);
+    @Override
+    PDFImage createPDFImage(Image image, String xobjectKey) {
+        return new ImageRawCCITTFaxAdapter((ImageRawCCITTFax) image, xobjectKey);
     }
 
     /** {@inheritDoc} */

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java Thu Apr  5 16:19:19 2012
@@ -19,56 +19,32 @@
 
 package org.apache.fop.render.pdf;
 
-import java.awt.Rectangle;
-import java.io.IOException;
-
 import org.apache.xmlgraphics.image.loader.Image;
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
 import org.apache.xmlgraphics.image.loader.impl.ImageRawJPEG;
 
 import org.apache.fop.pdf.PDFImage;
-import org.apache.fop.pdf.PDFXObject;
-import org.apache.fop.render.ImageHandler;
 import org.apache.fop.render.RenderingContext;
-import org.apache.fop.render.pdf.PDFLogicalStructureHandler.MarkedContentInfo;
 
 /**
  * Image handler implementation which handles raw JPEG images for PDF output.
  */
-public class PDFImageHandlerRawJPEG implements ImageHandler {
+public class PDFImageHandlerRawJPEG extends AbstractPDFImageHandler {
 
     private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
         ImageFlavor.RAW_JPEG,
     };
 
     /** {@inheritDoc} */
-    public void handleImage(RenderingContext context, Image image, Rectangle pos)
-                throws IOException {
-        PDFRenderingContext pdfContext = (PDFRenderingContext)context;
-        PDFContentGenerator generator = pdfContext.getGenerator();
-        ImageRawJPEG imageJPEG = (ImageRawJPEG)image;
-
-        PDFImage pdfimage = new ImageRawJPEGAdapter(imageJPEG, image.getInfo().getOriginalURI());
-        PDFXObject xobj = generator.getDocument().addImage(
-                generator.getResourceContext(), pdfimage);
-
-        float x = (float)pos.getX() / 1000f;
-        float y = (float)pos.getY() / 1000f;
-        float w = (float)pos.getWidth() / 1000f;
-        float h = (float)pos.getHeight() / 1000f;
-        if (context.getUserAgent().isAccessibilityEnabled()) {
-            MarkedContentInfo mci = pdfContext.getMarkedContentInfo();
-            generator.placeImage(x, y, w, h, xobj, mci.tag, mci.mcid);
-        } else {
-            generator.placeImage(x, y, w, h, xobj);
-        }
-    }
-
-    /** {@inheritDoc} */
     public int getPriority() {
         return 100;
     }
 
+    @Override
+    PDFImage createPDFImage(Image image, String xobjectKey) {
+        return new ImageRawJPEGAdapter((ImageRawJPEG) image, xobjectKey);
+    }
+
     /** {@inheritDoc} */
     public Class getSupportedImageClass() {
         return ImageRawJPEG.class;

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java Thu Apr  5 16:19:19 2012
@@ -19,50 +19,26 @@
 
 package org.apache.fop.render.pdf;
 
-import java.awt.Rectangle;
-import java.io.IOException;
-
 import org.apache.xmlgraphics.image.loader.Image;
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
 import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
 
 import org.apache.fop.pdf.PDFImage;
-import org.apache.fop.pdf.PDFXObject;
-import org.apache.fop.render.ImageHandler;
 import org.apache.fop.render.RenderingContext;
-import org.apache.fop.render.pdf.PDFLogicalStructureHandler.MarkedContentInfo;
 
 /**
  * Image handler implementation which handles RenderedImage instances for PDF output.
  */
-public class PDFImageHandlerRenderedImage implements ImageHandler {
+public class PDFImageHandlerRenderedImage extends AbstractPDFImageHandler {
 
     private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
         ImageFlavor.BUFFERED_IMAGE,
         ImageFlavor.RENDERED_IMAGE
     };
 
-    /** {@inheritDoc} */
-    public void handleImage(RenderingContext context, Image image, Rectangle pos)
-                throws IOException {
-        PDFRenderingContext pdfContext = (PDFRenderingContext)context;
-        PDFContentGenerator generator = pdfContext.getGenerator();
-        ImageRendered imageRend = (ImageRendered)image;
-
-        PDFImage pdfimage = new ImageRenderedAdapter(imageRend, image.getInfo().getOriginalURI());
-        PDFXObject xobj = generator.getDocument().addImage(
-                generator.getResourceContext(), pdfimage);
-
-        float x = (float)pos.getX() / 1000f;
-        float y = (float)pos.getY() / 1000f;
-        float w = (float)pos.getWidth() / 1000f;
-        float h = (float)pos.getHeight() / 1000f;
-        if (context.getUserAgent().isAccessibilityEnabled()) {
-            MarkedContentInfo mci = pdfContext.getMarkedContentInfo();
-            generator.placeImage(x, y, w, h, xobj, mci.tag, mci.mcid);
-        } else {
-            generator.placeImage(x, y, w, h, xobj);
-        }
+    @Override
+    PDFImage createPDFImage(Image image, String xobjectKey) {
+        return new ImageRenderedAdapter((ImageRendered) image, xobjectKey);
     }
 
     /** {@inheritDoc} */

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerSVG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerSVG.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerSVG.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerSVG.java Thu Apr  5 16:19:19 2012
@@ -24,22 +24,27 @@ import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
 import java.io.IOException;
 
+import org.w3c.dom.Document;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 import org.apache.batik.bridge.BridgeContext;
 import org.apache.batik.bridge.GVTBuilder;
 import org.apache.batik.dom.svg.SVGDOMImplementation;
 import org.apache.batik.gvt.GraphicsNode;
 import org.apache.batik.util.SVGConstants;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 
 import org.apache.xmlgraphics.image.loader.Image;
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
 import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
+import org.apache.xmlgraphics.util.UnitConv;
 
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.image.loader.batik.BatikImageFlavors;
 import org.apache.fop.image.loader.batik.BatikUtil;
 import org.apache.fop.render.ImageHandler;
+import org.apache.fop.render.ImageHandlerUtil;
 import org.apache.fop.render.RenderingContext;
 import org.apache.fop.render.pdf.PDFLogicalStructureHandler.MarkedContentInfo;
 import org.apache.fop.svg.PDFAElementBridge;
@@ -47,7 +52,6 @@ import org.apache.fop.svg.PDFBridgeConte
 import org.apache.fop.svg.PDFGraphics2D;
 import org.apache.fop.svg.SVGEventProducer;
 import org.apache.fop.svg.SVGUserAgent;
-import org.w3c.dom.Document;
 
 /**
  * Image Handler implementation which handles SVG images.
@@ -58,7 +62,8 @@ public class PDFImageHandlerSVG implemen
     private static Log log = LogFactory.getLog(PDFImageHandlerSVG.class);
 
     /** {@inheritDoc} */
-    public void handleImage(RenderingContext context, Image image, Rectangle pos)
+    public void handleImage(RenderingContext context,                // CSOK: MethodLength
+                            Image image, Rectangle pos)
                 throws IOException {
         PDFRenderingContext pdfContext = (PDFRenderingContext)context;
         PDFContentGenerator generator = pdfContext.getGenerator();
@@ -109,11 +114,13 @@ public class PDFImageHandlerSVG implemen
         //Scaling and translation for the bounding box of the image
         AffineTransform scaling = new AffineTransform(
                 sx, 0, 0, sy, pos.x / 1000f, pos.y / 1000f);
+        double sourceScale = UnitConv.IN2PT / uaResolution;
+        scaling.scale(sourceScale, sourceScale);
 
         //Scale for higher resolution on-the-fly images from Batik
-        double s = uaResolution / deviceResolution;
         AffineTransform resolutionScaling = new AffineTransform();
-        resolutionScaling.scale(s, s);
+        double targetScale = uaResolution / deviceResolution;
+        resolutionScaling.scale(targetScale, targetScale);
         resolutionScaling.scale(1.0 / sx, 1.0 / sy);
 
         //Transformation matrix that establishes the local coordinate system for the SVG graphic
@@ -122,22 +129,38 @@ public class PDFImageHandlerSVG implemen
         imageTransform.concatenate(scaling);
         imageTransform.concatenate(resolutionScaling);
 
+        if (log.isTraceEnabled()) {
+            log.trace("nat size: " + w + "/" + h);
+            log.trace("req size: " + pos.width + "/" + pos.height);
+            log.trace("source res: " + uaResolution + ", targetRes: " + deviceResolution
+                    + " --> target scaling: " + targetScale);
+            log.trace(image.getSize());
+            log.trace("sx: " + sx + ", sy: " + sy);
+            log.trace("scaling: " + scaling);
+            log.trace("resolution scaling: " + resolutionScaling);
+            log.trace("image transform: " + resolutionScaling);
+        }
+
         /*
          * Clip to the svg area.
          * Note: To have the svg overlay (under) a text area then use
          * an fo:block-container
          */
-        generator.comment("SVG setup");
+        if (log.isTraceEnabled()) {
+            generator.comment("SVG setup");
+        }
         generator.saveGraphicsState();
         if (context.getUserAgent().isAccessibilityEnabled()) {
             MarkedContentInfo mci = pdfContext.getMarkedContentInfo();
             generator.beginMarkedContentSequence(mci.tag, mci.mcid);
         }
-        generator.setColor(Color.black, false);
-        generator.setColor(Color.black, true);
+        generator.updateColor(Color.black, false, null);
+        generator.updateColor(Color.black, true, null);
 
         if (!scaling.isIdentity()) {
-            generator.comment("viewbox");
+            if (log.isTraceEnabled()) {
+                generator.comment("viewbox");
+            }
             generator.add(CTMHelper.toPDFString(scaling, false) + " cm\n");
         }
 
@@ -150,8 +173,10 @@ public class PDFImageHandlerSVG implemen
         graphics.setGraphicContext(new org.apache.xmlgraphics.java2d.GraphicContext());
 
         if (!resolutionScaling.isIdentity()) {
-            generator.comment("resolution scaling for " + uaResolution
-                        + " -> " + deviceResolution + "\n");
+            if (log.isTraceEnabled()) {
+                generator.comment("resolution scaling for " + uaResolution
+                        + " -> " + deviceResolution);
+            }
             generator.add(
                     CTMHelper.toPDFString(resolutionScaling, false) + " cm\n");
             graphics.scale(
@@ -159,7 +184,9 @@ public class PDFImageHandlerSVG implemen
                     1.0 / resolutionScaling.getScaleY());
         }
 
-        generator.comment("SVG start");
+        if (log.isTraceEnabled()) {
+            generator.comment("SVG start");
+        }
 
         //Save state and update coordinate system for the SVG image
         generator.getState().save();
@@ -175,6 +202,7 @@ public class PDFImageHandlerSVG implemen
         graphics.setOutputStream(generator.getOutputStream());
         try {
             root.paint(graphics);
+            ctx.dispose();
             generator.add(graphics.getString());
         } catch (Exception e) {
             SVGEventProducer eventProducer = SVGEventProducer.Provider.get(
@@ -187,7 +215,9 @@ public class PDFImageHandlerSVG implemen
         } else {
             generator.restoreGraphicsState();
         }
-        generator.comment("SVG end");
+        if (log.isTraceEnabled()) {
+            generator.comment("SVG end");
+        }
     }
 
     /** {@inheritDoc} */
@@ -209,10 +239,18 @@ public class PDFImageHandlerSVG implemen
 
     /** {@inheritDoc} */
     public boolean isCompatible(RenderingContext targetContext, Image image) {
-        return (image == null
+        boolean supported = (image == null
                 || (image instanceof ImageXMLDOM
                         && image.getFlavor().isCompatible(BatikImageFlavors.SVG_DOM)))
                 && targetContext instanceof PDFRenderingContext;
+        if (supported) {
+            String mode = (String)targetContext.getHint(ImageHandlerUtil.CONVERSION_MODE);
+            if (ImageHandlerUtil.isConversionModeBitmap(mode)) {
+                //Disabling this image handler automatically causes a bitmap to be generated
+                return false;
+            }
+        }
+        return supported;
     }
 
 }

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java Thu Apr  5 16:19:19 2012
@@ -19,16 +19,8 @@
 
 package org.apache.fop.render.pdf;
 
-import java.util.HashMap;
 import java.util.Locale;
-import java.util.Map;
 
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.apache.fop.events.EventBroadcaster;
-import org.apache.fop.fo.extensions.ExtensionElementMapping;
-import org.apache.fop.fo.extensions.InternalElementMapping;
 import org.apache.fop.pdf.PDFArray;
 import org.apache.fop.pdf.PDFDictionary;
 import org.apache.fop.pdf.PDFDocument;
@@ -53,13 +45,6 @@ class PDFLogicalStructureHandler {
 
     private final PDFDocument pdfDoc;
 
-    private final EventBroadcaster eventBroadcaster;
-
-    /**
-     * Map of references to the corresponding structure elements.
-     */
-    private final Map structTreeMap = new HashMap();
-
     private final PDFParentTree parentTree = new PDFParentTree();
 
     private int parentTreeKey;
@@ -108,73 +93,24 @@ class PDFLogicalStructureHandler {
      *
      * @param pdfDoc a document
      */
-    PDFLogicalStructureHandler(PDFDocument pdfDoc, EventBroadcaster eventBroadcaster) {
+    PDFLogicalStructureHandler(PDFDocument pdfDoc) {
         this.pdfDoc = pdfDoc;
-        this.eventBroadcaster = eventBroadcaster;
-        PDFStructTreeRoot structTreeRoot = pdfDoc.getFactory().makeStructTreeRoot(parentTree);
-        rootStructureElement = pdfDoc.getFactory().makeStructureElement(
+        PDFStructTreeRoot structTreeRoot = pdfDoc.makeStructTreeRoot(parentTree);
+        rootStructureElement = pdfDoc.makeStructureElement(
                 FOToPDFRoleMap.mapFormattingObject("root", structTreeRoot), structTreeRoot);
         structTreeRoot.addKid(rootStructureElement);
     }
 
-    /**
-     * Converts the given structure tree into PDF.
-     *
-     * @param structureTree the structure tree of the current page sequence
-     * @param language language set on the page sequence
-     */
-    void processStructureTree(NodeList structureTree, Locale language) {
-        pdfDoc.enforceLanguageOnRoot();
-        PDFStructElem structElemPart = pdfDoc.getFactory().makeStructureElement(
+
+    PDFStructElem createPageSequence(Locale language) {
+        PDFStructElem structElemPart = pdfDoc.makeStructureElement(
                 FOToPDFRoleMap.mapFormattingObject("page-sequence", rootStructureElement),
                 rootStructureElement);
         rootStructureElement.addKid(structElemPart);
         if (language != null) {
             structElemPart.setLanguage(language);
         }
-
-        for (int i = 0, n = structureTree.getLength(); i < n; i++) {
-            Node node = structureTree.item(i);
-            assert node.getLocalName().equals("flow")
-                    || node.getLocalName().equals("static-content");
-            PDFStructElem structElemSect = pdfDoc.getFactory().makeStructureElement(
-                    FOToPDFRoleMap.mapFormattingObject(node.getLocalName(), structElemPart),
-                    structElemPart);
-            structElemPart.addKid(structElemSect);
-            NodeList childNodes = node.getChildNodes();
-            for (int j = 0, m = childNodes.getLength(); j < m; j++) {
-                processNode(childNodes.item(j), structElemSect, true);
-            }
-        }
-    }
-
-    private void processNode(Node node, PDFStructElem parent, boolean addKid) {
-        Node attr = node.getAttributes().getNamedItemNS(InternalElementMapping.URI, "ptr");
-        assert attr != null;
-        String ptr = attr.getNodeValue();
-        PDFStructElem structElem = pdfDoc.getFactory().makeStructureElement(
-                FOToPDFRoleMap.mapFormattingObject(node, parent, eventBroadcaster), parent);
-        // TODO necessary? If a page-sequence is empty (e.g., contains a single
-        // empty fo:block), should the block still be added to the structure
-        // tree? This is not being done for descendant empty elements...
-        if (addKid) {
-            parent.addKid(structElem);
-        }
-        String nodeName = node.getLocalName();
-        if (nodeName.equals("external-graphic") || nodeName.equals("instream-foreign-object")) {
-            Node altTextNode = node.getAttributes().getNamedItemNS(
-                    ExtensionElementMapping.URI, "alt-text");
-            if (altTextNode != null) {
-                structElem.put("Alt", altTextNode.getNodeValue());
-            } else {
-                structElem.put("Alt", "No alternate text specified");
-            }
-        }
-        structTreeMap.put(ptr, structElem);
-        NodeList nodes = node.getChildNodes();
-        for (int i = 0, n = nodes.getLength(); i < n; i++) {
-            processNode(nodes.item(i), structElem, false);
-        }
+        return structElemPart;
     }
 
     private int getNextParentTreeKey() {
@@ -208,96 +144,79 @@ class PDFLogicalStructureHandler {
         parentTree.getNums().put(currentPage.getStructParents(), pageParentTreeArray);
     }
 
-    private MarkedContentInfo addToParentTree(String structurePointer) {
-        PDFStructElem parent = (PDFStructElem) structTreeMap.get(structurePointer);
-        if (parent == null) {
-            return ARTIFACT;
-        } else {
-            pageParentTreeArray.add(parent);
-            String type = parent.getStructureType().toString();
-            int mcid = pageParentTreeArray.length() - 1;
-            return new MarkedContentInfo(type, mcid, parent);
-        }
+    private MarkedContentInfo addToParentTree(PDFStructElem structureTreeElement) {
+        PDFStructElem parent = (structureTreeElement instanceof PDFStructElem.Placeholder)
+                ? structureTreeElement.getParentStructElem()
+                : structureTreeElement;
+        pageParentTreeArray.add(parent);
+        String type = parent.getStructureType().toString();
+        int mcid = pageParentTreeArray.length() - 1;
+        return new MarkedContentInfo(type, mcid, structureTreeElement);
     }
 
     /**
      * Adds a content item corresponding to text into the structure tree, if
      * there is a structure element associated to it.
      *
-     * @param structurePointer reference to the parent structure element of the
-     * piece of text
+     * @param structElem the parent structure element of the piece of text
      * @return the necessary information for bracketing the content as a
      * marked-content sequence. If there is no element in the structure tree
      * associated to that content, returns an instance whose
      * {@link MarkedContentInfo#tag} value is <code>null</code>. The content
      * must then be treated as an artifact.
      */
-    MarkedContentInfo addTextContentItem(String structurePointer) {
-        MarkedContentInfo mci = addToParentTree(structurePointer);
-        if (mci != ARTIFACT) {
+    MarkedContentInfo addTextContentItem(PDFStructElem structElem) {
+        if (structElem == null) {
+            return ARTIFACT;
+        } else {
+            MarkedContentInfo mci = addToParentTree(structElem);
             PDFDictionary contentItem = new PDFDictionary();
             contentItem.put("Type", MCR);
             contentItem.put("Pg", this.currentPage);
             contentItem.put("MCID", mci.mcid);
             mci.parent.addKid(contentItem);
+            return mci;
         }
-        return mci;
     }
 
     /**
      * Adds a content item corresponding to an image into the structure tree, if
      * there is a structure element associated to it.
      *
-     * @param structurePointer reference to the parent structure element of the
-     * image
+     * @param structElem the parent structure element of the image
      * @return the necessary information for bracketing the content as a
      * marked-content sequence. If there is no element in the structure tree
      * associated to that image, returns an instance whose
-     * {@link MarkedContentInfo#tag} value is <code>null</code>. The image
-     * must then be treated as an artifact.
+     * {@link MarkedContentInfo#tag} value is <code>null</code>. The image must
+     * then be treated as an artifact.
      */
-    MarkedContentInfo addImageContentItem(String structurePointer) {
-        MarkedContentInfo mci = addToParentTree(structurePointer);
-        if (mci != ARTIFACT) {
+    MarkedContentInfo addImageContentItem(PDFStructElem structElem) {
+        if (structElem == null) {
+            return ARTIFACT;
+        } else {
+            MarkedContentInfo mci = addToParentTree(structElem);
             mci.parent.setMCIDKid(mci.mcid);
             mci.parent.setPage(this.currentPage);
+            return mci;
         }
-        return mci;
     }
 
-    // While the PDF spec allows images to be referred as PDF objects, this
-    // makes the Acrobat Pro checker complain that the image is not accessible.
-    // Its alt-text is still read aloud though. Using marked-content sequences
-    // like for text works.
-//    MarkedContentInfo addImageObject(String parentReference) {
-//        MarkedContentInfo mci = addToParentTree(parentReference);
-//        if (mci != ARTIFACT) {
-//            PDFDictionary contentItem = new PDFDictionary();
-//            contentItem.put("Type", OBJR);
-//            contentItem.put("Pg", this.currentPage);
-//            contentItem.put("Obj", null);
-//            mci.parent.addKid(contentItem);
-//        }
-//        return mci;
-//    }
-
     /**
      * Adds a content item corresponding to the given link into the structure
      * tree.
      *
      * @param link a link
-     * @param structurePointer reference to the corresponding parent structure element
+     * @param structureTreeElement its parent structure element
      */
-    void addLinkContentItem(PDFLink link, String structurePointer) {
+    void addLinkContentItem(PDFLink link, PDFStructElem structureTreeElement) {
         int structParent = getNextParentTreeKey();
         link.setStructParent(structParent);
-        parentTree.getNums().put(structParent, link);
         PDFDictionary contentItem = new PDFDictionary();
         contentItem.put("Type", OBJR);
         contentItem.put("Pg", this.currentPage);
         contentItem.put("Obj", link);
-        PDFStructElem parent = (PDFStructElem) structTreeMap.get(structurePointer);
-        parent.addKid(contentItem);
+        parentTree.getNums().put(structParent, structureTreeElement);
+        structureTreeElement.addKid(contentItem);
     }
 
 }

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFPainter.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFPainter.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFPainter.java Thu Apr  5 16:19:19 2012
@@ -37,6 +37,7 @@ import org.apache.fop.fonts.SingleByteFo
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFNumber;
+import org.apache.fop.pdf.PDFStructElem;
 import org.apache.fop.pdf.PDFTextUtil;
 import org.apache.fop.pdf.PDFXObject;
 import org.apache.fop.render.RenderingContext;
@@ -44,8 +45,10 @@ import org.apache.fop.render.intermediat
 import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFState;
+import org.apache.fop.render.intermediate.IFUtil;
 import org.apache.fop.render.pdf.PDFLogicalStructureHandler.MarkedContentInfo;
 import org.apache.fop.traits.BorderProps;
+import org.apache.fop.traits.Direction;
 import org.apache.fop.traits.RuleStyle;
 import org.apache.fop.util.CharUtilities;
 
@@ -84,6 +87,7 @@ public class PDFPainter extends Abstract
     }
 
     /** {@inheritDoc} */
+    @Override
     protected IFContext getContext() {
         return this.documentHandler.getContext();
     }
@@ -132,27 +136,28 @@ public class PDFPainter extends Abstract
         PDFXObject xobject = getPDFDoc().getXObject(uri);
         if (xobject != null) {
             if (accessEnabled) {
-                String ptr = getContext().getStructurePointer();
-                prepareImageMCID(ptr);
+                PDFStructElem structElem = (PDFStructElem) getContext().getStructureTreeElement();
+                prepareImageMCID(structElem);
                 placeImageAccess(rect, xobject);
             } else {
                 placeImage(rect, xobject);
             }
         } else {
             if (accessEnabled) {
-                String ptr = getContext().getStructurePointer();
-                prepareImageMCID(ptr);
+                PDFStructElem structElem = (PDFStructElem) getContext().getStructureTreeElement();
+                prepareImageMCID(structElem);
             }
             drawImageUsingURI(uri, rect);
             flushPDFDoc();
         }
     }
 
-    private void prepareImageMCID(String ptr) {
-        imageMCI = logicalStructureHandler.addImageContentItem(ptr);
+    private void prepareImageMCID(PDFStructElem structElem) {
+        imageMCI = logicalStructureHandler.addImageContentItem(structElem);
     }
 
     /** {@inheritDoc} */
+    @Override
     protected RenderingContext createRenderingContext() {
         PDFRenderingContext pdfContext = new PDFRenderingContext(
                 getUserAgent(), generator, this.documentHandler.currentPage, getFontInfo());
@@ -192,8 +197,8 @@ public class PDFPainter extends Abstract
     /** {@inheritDoc} */
     public void drawImage(Document doc, Rectangle rect) throws IFException {
         if (accessEnabled) {
-            String ptr = getContext().getStructurePointer();
-            prepareImageMCID(ptr);
+            PDFStructElem structElem = (PDFStructElem) getContext().getStructureTreeElement();
+            prepareImageMCID(structElem);
         }
         drawImageUsingDocument(doc, rect);
         flushPDFDoc();
@@ -255,12 +260,13 @@ public class PDFPainter extends Abstract
     }
 
     /** {@inheritDoc} */
-    public void drawBorderRect(Rectangle rect, BorderProps before, BorderProps after,
-            BorderProps start, BorderProps end) throws IFException {
-        if (before != null || after != null || start != null || end != null) {
+    @Override
+    public void drawBorderRect(Rectangle rect, BorderProps top, BorderProps bottom,
+            BorderProps left, BorderProps right) throws IFException {
+        if (top != null || bottom != null || left != null || right != null) {
             generator.endTextObject();
             try {
-                this.borderPainter.drawBorders(rect, before, after, start, end);
+                this.borderPainter.drawBorders(rect, top, bottom, left, right);
             } catch (IOException ioe) {
                 throw new IFException("I/O error while drawing borders", ioe);
             }
@@ -268,6 +274,7 @@ public class PDFPainter extends Abstract
     }
 
     /** {@inheritDoc} */
+    @Override
     public void drawLine(Point start, Point end, int width, Color color, RuleStyle style)
         throws IFException {
         generator.endTextObject();
@@ -278,7 +285,7 @@ public class PDFPainter extends Abstract
         if (fontName == null) {
             throw new NullPointerException("fontName must not be null");
         }
-        Typeface tf = (Typeface)getFontInfo().getFonts().get(fontName);
+        Typeface tf = getFontInfo().getFonts().get(fontName);
         if (tf instanceof LazyFont) {
             tf = ((LazyFont)tf).getRealFont();
         }
@@ -286,12 +293,12 @@ public class PDFPainter extends Abstract
     }
 
     /** {@inheritDoc} */
-    public void drawText(int x, int y, int letterSpacing, int wordSpacing, int[] dx,
+    public void drawText(int x, int y, int letterSpacing, int wordSpacing, int[][] dp,
             String text)
             throws IFException {
         if (accessEnabled) {
-            String ptr = getContext().getStructurePointer();
-            MarkedContentInfo mci = logicalStructureHandler.addTextContentItem(ptr);
+            PDFStructElem structElem = (PDFStructElem) getContext().getStructureTreeElement();
+            MarkedContentInfo mci = logicalStructureHandler.addTextContentItem(structElem);
             if (generator.getTextUtil().isInTextObject()) {
                 generator.separateTextElements(mci.tag, mci.mcid);
             }
@@ -304,6 +311,19 @@ public class PDFPainter extends Abstract
 
         FontTriplet triplet = new FontTriplet(
                 state.getFontFamily(), state.getFontStyle(), state.getFontWeight());
+
+        if ( ( dp == null ) || IFUtil.isDPOnlyDX ( dp ) ) {
+            drawTextWithDX ( x, y, text, triplet, letterSpacing,
+                             wordSpacing, IFUtil.convertDPToDX ( dp ) );
+        } else {
+            drawTextWithDP ( x, y, text, triplet, letterSpacing,
+                             wordSpacing, dp );
+        }
+    }
+
+    private void drawTextWithDX ( int x, int y, String text, FontTriplet triplet,
+                                  int letterSpacing, int wordSpacing, int[] dx ) {
+
         //TODO Ignored: state.getFontVariant()
         //TODO Opportunity for font caching if font state is more heavily used
         String fontKey = getFontInfo().getInternalFontKey(triplet);
@@ -337,16 +357,7 @@ public class PDFPainter extends Abstract
             float glyphAdjust = 0;
             if (font.hasChar(orgChar)) {
                 ch = font.mapChar(orgChar);
-                if (singleByteFont != null && singleByteFont.hasAdditionalEncodings()) {
-                    int encoding = ch / 256;
-                    if (encoding == 0) {
-                        textutil.updateTf(fontName, fontSize, tf.isMultiByte());
-                    } else {
-                        textutil.updateTf(fontName + "_" + Integer.toString(encoding),
-                                fontSize, tf.isMultiByte());
-                        ch = (char)(ch % 256);
-                    }
-                }
+                ch = selectAndMapSingleByteFont(singleByteFont, fontName, fontSize, textutil, ch);
                 if ((wordSpacing != 0) && CharUtilities.isAdjustableSpace(orgChar)) {
                     glyphAdjust += wordSpacing;
                 }
@@ -362,6 +373,8 @@ public class PDFPainter extends Abstract
                         glyphAdjust += wordSpacing;
                     }
                 }
+                ch = selectAndMapSingleByteFont(singleByteFont, fontName, fontSize,
+                        textutil, ch);
             }
             textutil.writeTJMappedChar(ch);
 
@@ -377,4 +390,83 @@ public class PDFPainter extends Abstract
         textutil.writeTJ();
     }
 
+    private static int[] paZero = new int[4];
+
+    private void drawTextWithDP ( int x, int y, String text, FontTriplet triplet,
+                                  int letterSpacing, int wordSpacing, int[][] dp ) {
+        assert text != null;
+        assert triplet != null;
+        assert dp != null;
+        String          fk              = getFontInfo().getInternalFontKey(triplet);
+        Typeface        tf              = getTypeface(fk);
+        if ( tf.isMultiByte() ) {
+            int         fs              = state.getFontSize();
+            float       fsPoints        = fs / 1000f;
+            Font        f               = getFontInfo().getFontInstance(triplet, fs);
+            // String      fn              = f.getFontName();
+            PDFTextUtil tu              = generator.getTextUtil();
+            double      xc              = 0f;
+            double      yc              = 0f;
+            double      xoLast          = 0f;
+            double      yoLast          = 0f;
+            double      wox             = wordSpacing;
+            tu.writeTextMatrix ( new AffineTransform ( 1, 0, 0, -1, x / 1000f, y / 1000f ) );
+            tu.updateTf ( fk, fsPoints, true );
+            generator.updateCharacterSpacing ( letterSpacing / 1000f );
+            for ( int i = 0, n = text.length(); i < n; i++ ) {
+                char    ch              = text.charAt ( i );
+                int[]   pa              = ( i < dp.length ) ? dp [ i ] : paZero;
+                double  xo              = xc + pa[0];
+                double  yo              = yc + pa[1];
+                double  xa              = f.getCharWidth(ch) + maybeWordOffsetX ( wox, ch, null );
+                double  ya              = 0;
+                double  xd              = ( xo - xoLast ) / 1000f;
+                double  yd              = ( yo - yoLast ) / 1000f;
+                tu.writeTd ( xd, yd );
+                tu.writeTj ( f.mapChar ( ch ) );
+                xc += xa + pa[2];
+                yc += ya + pa[3];
+                xoLast = xo;
+                yoLast = yo;
+            }
+        }
+    }
+
+    private double maybeWordOffsetX ( double wox, char ch, Direction dir ) {
+        if ( ( wox != 0 )
+             && CharUtilities.isAdjustableSpace ( ch )
+             && ( ( dir == null ) || dir.isHorizontal() ) ) {
+            return wox;
+        } else {
+            return 0;
+        }
+    }
+
+    /*
+    private double maybeWordOffsetY ( double woy, char ch, Direction dir ) {
+        if ( ( woy != 0 )
+             && CharUtilities.isAdjustableSpace ( ch ) && dir.isVertical()
+             && ( ( dir != null ) && dir.isVertical() ) ) {
+            return woy;
+        } else {
+            return 0;
+        }
+    }
+    */
+
+    private char selectAndMapSingleByteFont(SingleByteFont singleByteFont, String fontName,
+            float fontSize, PDFTextUtil textutil, char ch) {
+        if (singleByteFont != null && singleByteFont.hasAdditionalEncodings()) {
+            int encoding = ch / 256;
+            if (encoding == 0) {
+                textutil.updateTf(fontName, fontSize, singleByteFont.isMultiByte());
+            } else {
+                textutil.updateTf(fontName + "_" + Integer.toString(encoding),
+                        fontSize, singleByteFont.isMultiByte());
+                ch = (char)(ch % 256);
+            }
+        }
+        return ch;
+    }
+
 }

Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java Thu Apr  5 16:19:19 2012
@@ -81,7 +81,7 @@ public class PDFRendererConfigurator ext
             Configuration encryptionParamsConfig
                 = cfg.getChild(PDFConfigurationConstants.ENCRYPTION_PARAMS, false);
         if (encryptionParamsConfig != null) {
-            PDFEncryptionParams encryptionParams = new PDFEncryptionParams();
+            PDFEncryptionParams encryptionParams = pdfUtil.getEncryptionParams();
             Configuration ownerPasswordConfig = encryptionParamsConfig.getChild(
                     PDFConfigurationConstants.OWNER_PASSWORD, false);
             if (ownerPasswordConfig != null) {
@@ -118,8 +118,35 @@ public class PDFRendererConfigurator ext
             if (noAnnotationsConfig != null) {
                 encryptionParams.setAllowEditAnnotations(false);
             }
-            pdfUtil.setEncryptionParams(encryptionParams);
+            Configuration noFillInForms = encryptionParamsConfig.getChild(
+                    PDFConfigurationConstants.NO_FILLINFORMS, false);
+            if (noFillInForms != null) {
+                encryptionParams.setAllowFillInForms(false);
+            }
+            Configuration noAccessContentConfig = encryptionParamsConfig.getChild(
+                    PDFConfigurationConstants.NO_ACCESSCONTENT, false);
+            if (noAccessContentConfig != null) {
+                encryptionParams.setAllowAccessContent(false);
+            }
+            Configuration noAssembleDocConfig = encryptionParamsConfig.getChild(
+                    PDFConfigurationConstants.NO_ASSEMBLEDOC, false);
+            if (noAssembleDocConfig != null) {
+                encryptionParams.setAllowAssembleDocument(false);
+            }
+            Configuration noPrintHqConfig = encryptionParamsConfig.getChild(
+                    PDFConfigurationConstants.NO_PRINTHQ, false);
+            if (noPrintHqConfig != null) {
+                encryptionParams.setAllowPrintHq(false);
+            }
+            Configuration encryptionLengthConfig = encryptionParamsConfig.getChild(
+                    PDFConfigurationConstants.ENCRYPTION_LENGTH, false);
+            if (encryptionLengthConfig != null) {
+                int encryptionLength = checkEncryptionLength(
+                        Integer.parseInt(encryptionLengthConfig.getValue(null)));
+                encryptionParams.setEncryptionLengthInBits(encryptionLength);
+            }
         }
+
         s = cfg.getChild(PDFConfigurationConstants.KEY_OUTPUT_PROFILE, true).getValue(null);
         if (s != null) {
             pdfUtil.setOutputProfileURI(s);
@@ -130,6 +157,40 @@ public class PDFRendererConfigurator ext
             pdfUtil.setDisableSRGBColorSpace(
                     disableColorSpaceConfig.getValueAsBoolean(false));
         }
+
+        setPDFDocVersion(cfg, pdfUtil);
+    }
+
+    private int checkEncryptionLength(int encryptionLength) {
+        int correctEncryptionLength = encryptionLength;
+        if (encryptionLength < 40) {
+            correctEncryptionLength = 40;
+        } else if (encryptionLength > 128) {
+            correctEncryptionLength = 128;
+        } else if (encryptionLength % 8 != 0) {
+            correctEncryptionLength = ((int) Math.round(encryptionLength / 8.0f)) * 8;
+        }
+        if (correctEncryptionLength != encryptionLength) {
+            PDFEventProducer.Provider.get(userAgent.getEventBroadcaster())
+                    .incorrectEncryptionLength(this, encryptionLength, correctEncryptionLength);
+        }
+        return correctEncryptionLength;
+    }
+
+    private void setPDFDocVersion(Configuration cfg, PDFRenderingUtil pdfUtil) throws FOPException {
+        Configuration pdfVersion = cfg.getChild(PDFConfigurationConstants.PDF_VERSION, false);
+        if (pdfVersion != null) {
+            String version = pdfVersion.getValue(null);
+            if (version != null && version.length() != 0) {
+                try {
+                    pdfUtil.setPDFVersion(version);
+                } catch (IllegalArgumentException e) {
+                    throw new FOPException(e.getMessage());
+                }
+            } else {
+                throw new FOPException("The PDF version has not been set.");
+            }
+        }
     }
 
     /**



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