Author: jeremias
Date: Fri Jan 16 06:35:12 2009
New Revision: 735028

URL: http://svn.apache.org/viewvc?rev=735028&view=rev
Log:
Added support for the AFP Extensions.
Added default font setup.
Added a last-resort font selection fallback for cases where an IF file was not 
created with the right font set.

Modified:
    
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/afp/AFPDocumentHandler.java
    
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/afp/AFPPainter.java

Modified: 
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/afp/AFPDocumentHandler.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/afp/AFPDocumentHandler.java?rev=735028&r1=735027&r2=735028&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/afp/AFPDocumentHandler.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/afp/AFPDocumentHandler.java
 Fri Jan 16 06:35:12 2009
@@ -23,6 +23,7 @@
 import java.awt.Dimension;
 import java.awt.geom.AffineTransform;
 import java.io.IOException;
+import java.util.Map;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -31,8 +32,15 @@
 import org.apache.fop.afp.AFPResourceManager;
 import org.apache.fop.afp.AFPUnitConverter;
 import org.apache.fop.afp.DataStream;
+import org.apache.fop.afp.fonts.AFPFontCollection;
 import org.apache.fop.afp.fonts.AFPPageFonts;
 import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.fonts.FontCollection;
+import org.apache.fop.fonts.FontEventAdapter;
+import org.apache.fop.fonts.FontInfo;
+import org.apache.fop.fonts.FontManager;
+import org.apache.fop.render.afp.extensions.AFPElementMapping;
+import org.apache.fop.render.afp.extensions.AFPPageSetup;
 import 
org.apache.fop.render.intermediate.AbstractBinaryWritingIFDocumentHandler;
 import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
@@ -60,6 +68,12 @@
     /** the AFP datastream */
     private DataStream dataStream;
 
+    /** the map of page segments */
+    private Map/*<String,String>*/pageSegmentMap
+        = new java.util.HashMap/*<String,String>*/();
+
+    private boolean inPageHeader;
+
     /**
      * Default constructor.
      */
@@ -89,6 +103,19 @@
         return new AFPRendererConfigurator(getUserAgent());
     }
 
+    /** {...@inheritdoc} */
+    public void setDefaultFontInfo(FontInfo fontInfo) {
+        FontManager fontManager = getUserAgent().getFactory().getFontManager();
+        FontCollection[] fontCollections = new FontCollection[] {
+            new AFPFontCollection(getUserAgent().getEventBroadcaster(), null)
+        };
+
+        FontInfo fi = (fontInfo != null ? fontInfo : new FontInfo());
+        fi.setEventListener(new 
FontEventAdapter(getUserAgent().getEventBroadcaster()));
+        fontManager.setup(fi, fontCollections);
+        setFontInfo(fi);
+    }
+
     AFPPaintingState getPaintingState() {
         return this.paintingState;
     }
@@ -168,6 +195,7 @@
     public void startPage(int index, String name, String pageMasterName, 
Dimension size)
                 throws IFException {
         paintingState.clear();
+        pageSegmentMap.clear();
 
         AffineTransform baseTransform = getBaseTransform();
         paintingState.concatenate(baseTransform);
@@ -183,20 +211,17 @@
 
         dataStream.startPage(pageWidth, pageHeight, pageRotation,
                 resolution, resolution);
-
-        //TODO Handle page extensions
-        //renderPageObjectExtensions(pageViewport);
-
     }
 
     /** {...@inheritdoc} */
     public void startPageHeader() throws IFException {
         super.startPageHeader();
-
+        this.inPageHeader = true;
     }
 
     /** {...@inheritdoc} */
     public void endPageHeader() throws IFException {
+        this.inPageHeader = false;
         super.endPageHeader();
     }
 
@@ -225,12 +250,33 @@
 
     /** {...@inheritdoc} */
     public void handleExtensionObject(Object extension) throws IFException {
-        /*
-        try {
-        } catch (IOException ioe) {
-            throw new IFException("I/O error in handleExtensionObject()", ioe);
+        if (extension instanceof AFPPageSetup) {
+            AFPPageSetup aps = (AFPPageSetup)extension;
+            if (!inPageHeader) {
+                throw new IFException(
+                    "AFP page setup extension encountered outside the page 
header: " + aps, null);
+            }
+            String element = aps.getElementName();
+            if (AFPElementMapping.INCLUDE_PAGE_OVERLAY.equals(element)) {
+                String overlay = aps.getName();
+                if (overlay != null) {
+                    dataStream.createIncludePageOverlay(overlay);
+                }
+            } else if (AFPElementMapping.INCLUDE_PAGE_SEGMENT.equals(element)) 
{
+                String name = aps.getName();
+                String source = aps.getValue();
+                pageSegmentMap.put(source, name);
+            } else if (AFPElementMapping.TAG_LOGICAL_ELEMENT.equals(element)) {
+                String name = aps.getName();
+                String value = aps.getValue();
+                dataStream.createTagLogicalElement(name, value);
+            } else if (AFPElementMapping.NO_OPERATION.equals(element)) {
+                String content = aps.getContent();
+                if (content != null) {
+                    dataStream.createNoOperation(content);
+                }
+            }
         }
-        */
     }
 
     // ---=== AFPCustomizable ===---
@@ -265,4 +311,14 @@
         resourceManager.setDefaultResourceGroupFilePath(filePath);
     }
 
+    /**
+     * Returns the page segment name for a given URI if it actually represents 
a page segment.
+     * Otherwise, it just returns null.
+     * @param uri the URI that identifies the page segment
+     * @return the page segment name or null if there's no page segment for 
the given URI
+     */
+    String getPageSegmentNameFor(String uri) {
+        return (String)pageSegmentMap.get(uri);
+    }
+
 }

Modified: 
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/afp/AFPPainter.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/afp/AFPPainter.java?rev=735028&r1=735027&r2=735028&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/afp/AFPPainter.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/afp/AFPPainter.java
 Fri Jan 16 06:35:12 2009
@@ -186,7 +186,14 @@
 
     /** {...@inheritdoc} */
     public void drawImage(String uri, Rectangle rect) throws IFException {
-        drawImageUsingURI(uri, rect);
+        String name = documentHandler.getPageSegmentNameFor(uri);
+        if (name != null) {
+            float[] srcPts = {rect.x, rect.y};
+            int[] coords = unitConv.mpts2units(srcPts);
+            getDataStream().createIncludePageSegment(name, coords[X], 
coords[Y]);
+        } else {
+            drawImageUsingURI(uri, rect);
+        }
     }
 
     /** {...@inheritdoc} */
@@ -314,6 +321,10 @@
                 state.getFontFamily(), state.getFontStyle(), 
state.getFontWeight());
         //TODO Ignored: state.getFontVariant()
         String fontKey = getFontInfo().getInternalFontKey(triplet);
+        if (fontKey == null) {
+            fontKey = getFontInfo().getInternalFontKey(
+                    new FontTriplet("any", Font.STYLE_NORMAL, 
Font.WEIGHT_NORMAL));
+        }
 
         // register font as necessary
         Map/*<String,FontMetrics>*/ fontMetricMap = 
documentHandler.getFontInfo().getFonts();



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to