]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
a simple impl of getting ipd and line height
authorKeiron Liddle <keiron@apache.org>
Thu, 21 Mar 2002 09:37:15 +0000 (09:37 +0000)
committerKeiron Liddle <keiron@apache.org>
Thu, 21 Mar 2002 09:37:15 +0000 (09:37 +0000)
some adjustments to user agent

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@194714 13f79535-47bb-0310-9956-ffa450edef68

17 files changed:
src/org/apache/fop/fo/FOText.java
src/org/apache/fop/fo/FOUserAgent.java
src/org/apache/fop/fo/FObjMixed.java
src/org/apache/fop/fo/TextInfo.java [new file with mode: 0644]
src/org/apache/fop/fo/flow/Block.java
src/org/apache/fop/fo/flow/InstreamForeignObject.java
src/org/apache/fop/image/ImageLoader.java
src/org/apache/fop/image/analyser/SVGReader.java
src/org/apache/fop/image/analyser/XMLReader.java
src/org/apache/fop/layoutmgr/AbstractLayoutManager.java
src/org/apache/fop/layoutmgr/BlockLayoutManager.java
src/org/apache/fop/layoutmgr/LayoutManager.java
src/org/apache/fop/layoutmgr/LineLayoutManager.java
src/org/apache/fop/layoutmgr/PageLayoutManager.java
src/org/apache/fop/layoutmgr/TextLayoutManager.java
src/org/apache/fop/render/RendererContext.java
src/org/apache/fop/render/pdf/PDFXMLHandler.java

index e020ccfa18f8a728ac6ba47e36b4e58620b2dddd..ac18fb1c7fedd75bb1c9dd1d2a8879ea876357b7 100644 (file)
@@ -35,22 +35,6 @@ public class FOText extends FObj {
     protected int start;
     protected int length;
     TextInfo textInfo;
-
-    public static class TextInfo {
-        public FontState fs;
-        public float red;
-        public float green;
-        public float blue;
-        public int wrapOption;
-        public int whiteSpaceCollapse;
-        public int verticalAlign;
-
-        // Textdecoration
-        public boolean underlined = false;
-        public boolean overlined = false;
-        public boolean lineThrough = false;
-    }
-
     TextState ts;
 
     public FOText(char[] chars, int s, int e, TextInfo ti) {
index 2dbf98c1a19382a2e61533a59af4bcf0b1a71e14..4736ed51fcc8894c6d5229834a9eba4f0ea2c8ad 100644 (file)
@@ -44,14 +44,25 @@ public class FOUserAgent {
         return log;
     }
 
-    public void setBaseDirectory(String b) {
+    public void setBaseURL(String b) {
         base = b;
     }
 
-    public String getBaseDirectory() {
+    public String getBaseURL() {
         return base;
     }
 
+    public float getPixelToMM() {
+        return 0.35277777777777777778f;
+    }
+
+    /**
+     * If to create hot links to footnotes and before floats.
+     */
+    public boolean linkToFootnotes() {
+        return true;
+    }
+
     /**
      * Set the default xml handler for the given mime type.
      */
@@ -92,10 +103,11 @@ public class FOUserAgent {
                 handler.handleXML(ctx, doc, namespace);
             } catch (Throwable t) {
                 // could not handle document
-                ctx.getLogger().error("Could not render XML", t);
+                log.error("Could not render XML", t);
             }
         } else {
             // no handler found for document
+            log.debug("No handler defined for XML: " + namespace);
         }
     }
 }
index d525fb243037cd1fde03d3dfcba52d876f54bf36..ac1489b8f33006ced8e9f967a58068e738718a88 100644 (file)
@@ -20,7 +20,7 @@ import org.apache.fop.datatypes.ColorType;
  * and their processing
  */
 public class FObjMixed extends FObj {
-    FOText.TextInfo textInfo = null;
+    TextInfo textInfo = null;
     FontInfo fontInfo=null;
 
     public FObjMixed(FONode parent) {
@@ -33,7 +33,7 @@ public class FObjMixed extends FObj {
 
     protected void addCharacters(char data[], int start, int length) {
         if(textInfo == null) {
-           textInfo = new FOText.TextInfo();
+           textInfo = new TextInfo();
 
            try {
                textInfo.fs = propMgr.getFontState(fontInfo);
@@ -43,9 +43,7 @@ public class FObjMixed extends FObj {
            }
 
             ColorType c = getProperty("color").getColorType();
-            textInfo.red = c.red();
-            textInfo.green = c.green();
-            textInfo.blue = c.blue();
+            textInfo.color = c;
 
             textInfo.verticalAlign =
                 getProperty("vertical-align").getEnum();
@@ -98,7 +96,5 @@ public class FObjMixed extends FObj {
        return new RecursiveCharIterator(this);
     }
 
-
-
 }
 
diff --git a/src/org/apache/fop/fo/TextInfo.java b/src/org/apache/fop/fo/TextInfo.java
new file mode 100644 (file)
index 0000000..868c843
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * $Id$
+ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
+ * For details on use and redistribution please refer to the
+ * LICENSE file included with these sources."
+ */
+
+package org.apache.fop.fo;
+
+// FOP
+import org.apache.fop.layout.Area;
+import org.apache.fop.layout.BlockArea;
+import org.apache.fop.layout.FontState;
+import org.apache.fop.layout.*;
+import org.apache.fop.datatypes.*;
+import org.apache.fop.fo.properties.*;
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.layoutmgr.LayoutManager;
+import org.apache.fop.layoutmgr.TextLayoutManager;
+
+import java.util.NoSuchElementException;
+
+/**
+ */
+    public class TextInfo {
+        public FontState fs;
+        public ColorType color;
+        public int wrapOption;
+        public int whiteSpaceCollapse;
+        public int verticalAlign;
+
+        // Textdecoration
+        public boolean underlined = false;
+        public boolean overlined = false;
+        public boolean lineThrough = false;
+    }
+
index 3dc075b974783f11e96e1bed4243a97fcac89101..43f56705afb91e08b11b177068f58d8c79b35f58 100644 (file)
@@ -367,15 +367,30 @@ public class Block extends FObjMixed {
     }
 
     public LayoutManager getLayoutManager() {
-       return new BlockLayoutManager(this);
-    }
+BlockLayoutManager blm = new BlockLayoutManager(this);
+TextInfo ti = new TextInfo();
+
+/*      try {
+    ti.fs = propMgr.getFontState(fontInfo);
+      } catch (FOPException fopex) {
+    log.error("Error setting FontState for characters: " +
+        fopex.getMessage());
+      }*/
+
+            ColorType c = getProperty("color").getColorType();
+            ti.color = c;
 
+            ti.verticalAlign =
+                getProperty("vertical-align").getEnum();
+
+blm.setBlockTextInfo(ti);
+       return blm;
+    }
 
     public boolean generatesInlineAreas() {
         return false;
     }
 
-
     public void addChild(FONode child) {
        // Handle whitespace based on values of properties
        // Handle a sequence of inline-producing children in
index 84c623075b31544a87ce7566adafa3b5f194a0ee..915e97bc3c26e39ef397c4011b25a6535570e054 100644 (file)
@@ -133,6 +133,10 @@ public class InstreamForeignObject extends FObj {
         ForeignObject foreign = new ForeignObject(doc, ns);
 
         areaCurrent = new Viewport(foreign);
+        areaCurrent.setWidth((int)size.getX() * 1000);
+        areaCurrent.setHeight((int)size.getY() * 1000);
+        areaCurrent.setOffset(0);
+
         return areaCurrent;
     }
 
index 679cf2325b14103c38aed86cd98ed4b065c7964c..5c836368b1f486e979d191bb33a8e1792a1c2410 100644 (file)
@@ -30,7 +30,7 @@ class ImageLoader {
         if (!valid || image != null) {
             return image;
         }
-        String base = userAgent.getBaseDirectory();
+        String base = userAgent.getBaseURL();
         image = ImageFactory.loadImage(url, base, userAgent);
         if (image == null) {
             cache.invalidateImage(url, userAgent);
index 8791b3420db62e142fbf33c8f93a7c9edaed7fd1..e4416d33e54f0f7d0cd530b961d62e138825c884 100644 (file)
@@ -164,8 +164,7 @@ public class SVGReader implements ImageReader {
                 Element e = ((SVGDocument) doc).getRootElement();
                 String s;
                 SVGUserAgent userAg =
-                  new SVGUserAgent(new AffineTransform());
-                userAg.setLogger(ua.getLogger());
+                  new SVGUserAgent(ua, new AffineTransform());
                 BridgeContext ctx = new BridgeContext(userAg);
                 UnitProcessor.Context uctx =
                   UnitProcessor.createContext(ctx, e);
index ab66be98124a0f85d9c0e9440cc49eff1c838108..5bce255f75868e4bc91e92bd4dfdf2b8c4b6d572 100644 (file)
@@ -82,7 +82,7 @@ public class XMLReader implements ImageReader {
                 }
             }
         } catch (Exception e) {
-            e.printStackTrace();
+            //e.printStackTrace();
             try {
                 is.reset();
             } catch (IOException ioe) { }
index deb7027fe3076a6593f5cdf31a09a0551eb9c8d1..df6d58a45562da30c1afaa1498bb52bf2c6bf5dd 100644 (file)
@@ -30,6 +30,9 @@ public abstract class AbstractLayoutManager implements LayoutManager {
         this.parentLM = lm;
     }
 
+    public int getContentIPD() {
+        return 0;
+    }
 
     /**
      * Propagates to lower level layout managers. It iterates over the
index 291f05d2ab9ca470fd5d39015e88fb14b0d3412b..416506a8970adaa8fe72821aada00421feb6c8ca 100644 (file)
@@ -8,6 +8,7 @@
 package org.apache.fop.layoutmgr;
 
 import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.TextInfo;
 import org.apache.fop.area.Area;
 import org.apache.fop.area.BlockParent;
 import org.apache.fop.area.Block;
@@ -26,17 +27,21 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
         super(fobj);
     }
 
-    // DESIGN. Potential alternative to getParentArea() scheme
-    //     /**
-    //      * Called by child layout manager to get the available space for
-    //      * content in the inline progression direction.
-    //      * Note that a manager may need to ask its parent for this.
-    //      * For a block area, available IPD is determined by indents.
-    //      */
-    //     public int getContentIPD() {
-    //         getArea(); // make if not existing
-    //         return blockArea.getIPD();
-    //     }
+    public void setBlockTextInfo(TextInfo ti) {
+
+    }
+
+    /**
+     * Called by child layout manager to get the available space for
+     * content in the inline progression direction.
+     * Note that a manager may need to ask its parent for this.
+     * For a block area, available IPD is determined by indents.
+     */
+    public int getContentIPD() {
+        // adjust for side floats and indents
+        //getParentArea(null); // make if not existing
+        return curBlockArea.getIPD();
+    }
 
     /**
      * Generate areas by tellings all layout managers for its FO's
@@ -77,8 +82,9 @@ public class BlockLayoutManager extends BlockStackingLayoutManager {
             curBlockArea = new Block();
             // Set up dimensions
             // Must get dimensions from parent area
-            //MinOptMax referenceIPD = parentLM.getReferenceIPD();
             Area parentArea = parentLM.getParentArea(curBlockArea);
+            int referenceIPD = parentArea.getIPD();
+            curBlockArea.setIPD(referenceIPD);
             // Get reference IPD from parentArea
             setCurrentArea(curBlockArea); // ??? for generic operations
         }
index 7f8b4756bd9f4391438a4b0305463c232535c642..4d3878b9975f4f9b0e7d6133b8791b0161c1034c 100644 (file)
@@ -20,4 +20,5 @@ public interface LayoutManager {
     public void addChild (Area childArea);
     public boolean splitArea(Area areaToSplit, SplitContext context);
     public void setParentLM(LayoutManager lm);
+    public int getContentIPD();
 }
index 4d87d859d46e4253e4a78c112f43e92bfd550f85..c7829fbdf6d7d62b26604e1db2bdb8ba0a082c06 100644 (file)
@@ -15,6 +15,8 @@ import org.apache.fop.area.MinOptMax;
 import org.apache.fop.area.inline.InlineArea;
 
 import java.util.ListIterator;
+import java.util.List;
+import java.util.Iterator;
 
 /**
  * LayoutManager for lines. It builds one or more lines containing
@@ -29,6 +31,7 @@ public class LineLayoutManager extends AbstractLayoutManager {
     private boolean bFirstLine;
     private LayoutManager curLM;
     private MinOptMax remainingIPD;
+    private int lineHeight = 14000;
 
     public LineLayoutManager(ListIterator fobjIter) {
         super(null);
@@ -68,7 +71,17 @@ public class LineLayoutManager extends AbstractLayoutManager {
         if (lineArea != null) {
             // Adjust spacing as necessary
             // Calculate height, based on content (or does the Area do this?)
-            lineArea.setHeight(14000);
+            int maxHeight = lineHeight;
+            List inlineAreas = lineArea.getInlineAreas();
+            for(Iterator iter = inlineAreas.iterator(); iter.hasNext(); ) {
+                InlineArea inline = (InlineArea)iter.next();
+                int h = inline.getHeight();
+                if(h > maxHeight) {
+                    maxHeight = h;
+                }
+            }
+            lineArea.setHeight(maxHeight);
+
             parentLM.addChild(lineArea);
             lineArea = null;
         }
@@ -96,8 +109,7 @@ public class LineLayoutManager extends AbstractLayoutManager {
         // lineArea.setContentIPD(parent.getContentIPD());
         // remainingIPD = parent.getContentIPD();
         // OR???
-        // remainingIPD = parentLM.getContentIPD();
-        remainingIPD = new MinOptMax(300000); // TESTING!!!
+        remainingIPD = new MinOptMax(parentLM.getContentIPD());
         this.bFirstLine = false;
     }
 
index caa55a4f8a33433b28d1b697fde68c9fb2568cbd..d88d5d410c97255da15e7fe50668c5f3677a75a0 100644 (file)
@@ -130,13 +130,12 @@ public class PageLayoutManager extends AbstractLayoutManager implements Runnable
         // for a float. When?
     }
 
-
-
     private PageViewport makeNewPage(boolean bIsBlank, boolean bIsLast) {
         finishPage();
         try {
             curPage = ((PageSequence) fobj).createPage(bIsBlank, bIsLast);
         } catch (FOPException fopex) { /* ???? */
+            fopex.printStackTrace();
         }
         curBody = (BodyRegion) curPage.getPage(). getRegion(
                     RegionReference.BODY).getRegion();
@@ -306,10 +305,9 @@ public class PageLayoutManager extends AbstractLayoutManager implements Runnable
         curBody.setMainReference(new MainReference());
     }
 
-
-
     private Flow createFlow() {
         curFlow = new Flow();
+        curFlow.setIPD(curSpan.getIPD()); // adjust for columns
         // Set IPD and max BPD on the curFlow from curBody
         curSpan.addFlow(curFlow);
         return curFlow;
@@ -328,6 +326,10 @@ public class PageLayoutManager extends AbstractLayoutManager implements Runnable
         //     }
         //     else newpos = new MinOptMax();
         curSpan = new Span(numCols);
+        // get Width or Height as IPD for span
+        curSpan.setIPD((int) curPage.getPage(). getRegion(
+                    RegionReference.BODY).getViewArea().getWidth());
+
         //curSpan.setPosition(BPD, newpos);
         curBody.getMainReference().addSpan(curSpan);
         createFlow();
index 635aa8792318bd04c3cdc5fd34001dba9eda491b..73594a7d739b2f651492485c11d345d90275542e 100644 (file)
@@ -8,9 +8,9 @@
 package org.apache.fop.layoutmgr;
 
 import org.apache.fop.fo.FObj;
-import org.apache.fop.fo.FOText; // For TextInfo: TODO: make independent!
+import org.apache.fop.fo.TextInfo;
 import org.apache.fop.area.Area;
-import org.apache.fop.area.Property;
+import org.apache.fop.area.Trait;
 import org.apache.fop.area.inline.Word;
 import org.apache.fop.area.inline.Space;
 import org.apache.fop.util.CharUtilities;
@@ -26,7 +26,7 @@ import java.util.ListIterator;
 public class TextLayoutManager extends LeafNodeLayoutManager {
 
     private char[] chars;
-    private FOText.TextInfo textInfo;
+    private TextInfo textInfo;
 
     private static final char NEWLINE = '\n';
     private static final char RETURN = '\r';
@@ -42,7 +42,7 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
     protected static final int TEXT = 2;
 
     public TextLayoutManager(FObj fobj, char[] chars,
-                             FOText.TextInfo textInfo) {
+                             TextInfo textInfo) {
         super(fobj);
         this.chars = chars;
         this.textInfo = textInfo;
@@ -72,7 +72,7 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
         // With CID fonts, space isn't neccesary currentFontState.width(32)
         int whitespaceWidth = CharUtilities.getCharWidth(' ', textInfo.fs);
 
-        int wordStart = 0;
+        int wordStart = -1;
         int wordLength = 0;
         int wordWidth = 0;
         int spaceWidth = 0;
@@ -152,15 +152,8 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
                         // spaces. Split the word and add Space
                         // as necessary. All spaces inside the word
                         // Have a fixed width.
-                        Word curWordArea = new Word();
-                        curWordArea.setWidth(wordWidth);
-                        curWordArea.setWord( new String(chars, wordStart + 1,
-                                                        wordLength));
-                        Property prop = new Property();
-                        prop.propType = Property.FONT_STATE;
-                        prop.data = textInfo.fs;
-                        curWordArea.addProperty(prop);
-                        parentLM.addChild(curWordArea);
+                        parentLM.addChild(createWord(new String(chars, wordStart + 1,
+                                                        wordLength), wordWidth));
 
                         // reset word width
                         wordWidth = 0;
@@ -221,21 +214,27 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
                 wordLength = chars.length - 1 - wordStart;
             }
 
-            Word curWordArea = new Word();
-            curWordArea.setWidth(wordWidth);
-            curWordArea.setWord(
-              new String(chars, wordStart + 1, wordLength));
-            Property prop = new Property();
-            prop.propType = Property.FONT_STATE;
-            prop.data = textInfo.fs;
-            curWordArea.addProperty(prop);
-            parentLM.addChild(curWordArea);
+            parentLM.addChild(createWord(new String(chars, wordStart + 1, wordLength), wordWidth));
 
         }
 
         chars = null;
     }
 
+    protected Word createWord(String str, int width) {
+        Word curWordArea = new Word();
+        curWordArea.setWidth(width);
+        curWordArea.setHeight(textInfo.fs.getAscender() - textInfo.fs.getDescender());
+        curWordArea.setOffset(textInfo.fs.getAscender());
+
+        curWordArea.setWord(str);
+        Trait prop = new Trait();
+        prop.propType = Trait.FONT_STATE;
+        prop.data = textInfo.fs;
+        curWordArea.addTrait(prop);
+        return curWordArea;
+    }
+
     /** Try to split the word area by hyphenating the word. */
     public boolean splitArea(Area areaToSplit, SplitContext context) {
         context.nextArea = areaToSplit;
index 2049a95a1cb2e39660849e46fab94fcb9d2f6b62..3706935aa0e0411d0683b5d66f1f6b3e02b7efd8 100644 (file)
@@ -6,6 +6,8 @@
  */
 package org.apache.fop.render;
 
+import org.apache.fop.fo.FOUserAgent;
+
 import org.apache.log.Logger;
 
 import java.util.HashMap;
@@ -17,7 +19,7 @@ import java.util.HashMap;
  */
 public class RendererContext {
     String mime;
-    Logger log;
+    FOUserAgent userAgent;
     HashMap props = new HashMap();
 
     public RendererContext(String m) {
@@ -28,12 +30,12 @@ public class RendererContext {
         return mime;
     }
 
-    public void setLogger(Logger logger) {
-        log = logger;
+    public void setUserAgent(FOUserAgent ua) {
+        userAgent = ua;
     }
 
-    public Logger getLogger() {
-        return log;
+    public FOUserAgent getUserAgent() {
+        return userAgent;
     }
 
     public void setProperty(String name, Object val) {
index da936ec4c3c78bd3e32d09ec339d8b6ebbea2f49..521c09fd3a4d9314d746f3d793e701460a8fc4a3 100644 (file)
@@ -12,6 +12,7 @@ import org.apache.fop.render.XMLHandler;
 import org.apache.fop.render.RendererContext;
 import org.apache.fop.pdf.*;
 import org.apache.fop.svg.*;
+import org.apache.fop.svg.SVGUserAgent;
 import org.apache.fop.layout.FontState;
 
 import org.apache.log.Logger;
@@ -104,9 +105,8 @@ public static final String PDF_YPOS = "ypos";
             float sx = 1, sy = 1;
             int xOffset = pdfInfo.x, yOffset = pdfInfo.y;
 
-            org.apache.fop.svg.SVGUserAgent ua
-                 = new org.apache.fop.svg.SVGUserAgent(new AffineTransform());
-            ua.setLogger(context.getLogger());
+            SVGUserAgent ua
+                 = new SVGUserAgent(context.getUserAgent(), new AffineTransform());
 
             GVTBuilder builder = new GVTBuilder();
             BridgeContext ctx = new BridgeContext(ua);
@@ -122,7 +122,7 @@ public static final String PDF_YPOS = "ypos";
             try {
                 root = builder.build(ctx, doc);
             } catch (Exception e) {
-                context.getLogger().error("svg graphic could not be built: "
+                context.getUserAgent().getLogger().error("svg graphic could not be built: "
                                        + e.getMessage(), e);
                 return;
             }
@@ -168,7 +168,7 @@ public static final String PDF_YPOS = "ypos";
                 root.paint(graphics);
                 pdfInfo.currentStream.add(graphics.getString());
             } catch (Exception e) {
-                context.getLogger().error("svg graphic could not be rendered: "
+                context.getUserAgent().getLogger().error("svg graphic could not be rendered: "
                                        + e.getMessage(), e);
             }