]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
changed the parent to FONode
authorKeiron Liddle <keiron@apache.org>
Fri, 9 Nov 2001 11:32:42 +0000 (11:32 +0000)
committerKeiron Liddle <keiron@apache.org>
Fri, 9 Nov 2001 11:32:42 +0000 (11:32 +0000)
changed a few more vector and hashtable
change master-name to master-reference for page-sequence, single-page-master-reference, repeatable-page-masterreference,conditional-page-master-reference
added pdf text element bridge for simple text
some other changes that will hopefully make things simpler to handle in the future

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

109 files changed:
src/org/apache/fop/apps/Driver.java
src/org/apache/fop/apps/Options.java
src/org/apache/fop/area/Area.java
src/org/apache/fop/area/PageViewport.java
src/org/apache/fop/datatypes/LengthBase.java
src/org/apache/fop/extensions/ExtensionElementMapping.java
src/org/apache/fop/extensions/ExtensionObj.java
src/org/apache/fop/extensions/Label.java
src/org/apache/fop/extensions/Outline.java
src/org/apache/fop/fo/ColorProfile.java
src/org/apache/fop/fo/Declarations.java
src/org/apache/fop/fo/ElementMapping.java
src/org/apache/fop/fo/FOElementMapping.java
src/org/apache/fop/fo/FONode.java
src/org/apache/fop/fo/FOText.java
src/org/apache/fop/fo/FOTreeBuilder.java
src/org/apache/fop/fo/FObj.java
src/org/apache/fop/fo/FObjMixed.java
src/org/apache/fop/fo/Title.java
src/org/apache/fop/fo/ToBeImplementedElement.java
src/org/apache/fop/fo/Unknown.java
src/org/apache/fop/fo/UnknownXMLObj.java
src/org/apache/fop/fo/XMLElement.java
src/org/apache/fop/fo/XMLObj.java
src/org/apache/fop/fo/expr/BodyStartFunction.java
src/org/apache/fop/fo/expr/LabelEndFunction.java
src/org/apache/fop/fo/flow/BasicLink.java
src/org/apache/fop/fo/flow/BidiOverride.java
src/org/apache/fop/fo/flow/Block.java
src/org/apache/fop/fo/flow/BlockContainer.java
src/org/apache/fop/fo/flow/Character.java
src/org/apache/fop/fo/flow/ExternalGraphic.java
src/org/apache/fop/fo/flow/Float.java
src/org/apache/fop/fo/flow/Flow.java
src/org/apache/fop/fo/flow/Footnote.java
src/org/apache/fop/fo/flow/FootnoteBody.java
src/org/apache/fop/fo/flow/InitialPropertySet.java
src/org/apache/fop/fo/flow/Inline.java
src/org/apache/fop/fo/flow/InlineContainer.java
src/org/apache/fop/fo/flow/InstreamForeignObject.java
src/org/apache/fop/fo/flow/Leader.java
src/org/apache/fop/fo/flow/ListBlock.java
src/org/apache/fop/fo/flow/ListItem.java
src/org/apache/fop/fo/flow/ListItemBody.java
src/org/apache/fop/fo/flow/ListItemLabel.java
src/org/apache/fop/fo/flow/Marker.java
src/org/apache/fop/fo/flow/MultiCase.java
src/org/apache/fop/fo/flow/MultiProperties.java
src/org/apache/fop/fo/flow/MultiPropertySet.java
src/org/apache/fop/fo/flow/MultiSwitch.java
src/org/apache/fop/fo/flow/MultiToggle.java
src/org/apache/fop/fo/flow/PageNumber.java
src/org/apache/fop/fo/flow/PageNumberCitation.java
src/org/apache/fop/fo/flow/RetrieveMarker.java
src/org/apache/fop/fo/flow/StaticContent.java
src/org/apache/fop/fo/flow/Table.java
src/org/apache/fop/fo/flow/TableAndCaption.java
src/org/apache/fop/fo/flow/TableBody.java
src/org/apache/fop/fo/flow/TableCaption.java
src/org/apache/fop/fo/flow/TableCell.java
src/org/apache/fop/fo/flow/TableColumn.java
src/org/apache/fop/fo/flow/TableFooter.java
src/org/apache/fop/fo/flow/TableHeader.java
src/org/apache/fop/fo/flow/TableRow.java
src/org/apache/fop/fo/flow/Wrapper.java
src/org/apache/fop/fo/pagination/ConditionalPageMasterReference.java
src/org/apache/fop/fo/pagination/LayoutMasterSet.java
src/org/apache/fop/fo/pagination/PageMasterReference.java
src/org/apache/fop/fo/pagination/PageSequence.java
src/org/apache/fop/fo/pagination/PageSequenceMaster.java
src/org/apache/fop/fo/pagination/Region.java
src/org/apache/fop/fo/pagination/RegionAfter.java
src/org/apache/fop/fo/pagination/RegionBefore.java
src/org/apache/fop/fo/pagination/RegionBody.java
src/org/apache/fop/fo/pagination/RegionEnd.java
src/org/apache/fop/fo/pagination/RegionStart.java
src/org/apache/fop/fo/pagination/RepeatablePageMasterAlternatives.java
src/org/apache/fop/fo/pagination/RepeatablePageMasterReference.java
src/org/apache/fop/fo/pagination/Root.java
src/org/apache/fop/fo/pagination/SimplePageMaster.java
src/org/apache/fop/fo/pagination/SinglePageMasterReference.java
src/org/apache/fop/fonts/TTFSubSetFile.java
src/org/apache/fop/image/FopImageFactory.java
src/org/apache/fop/image/ImageArea.java
src/org/apache/fop/layout/FontDescriptor.java
src/org/apache/fop/layout/FontState.java
src/org/apache/fop/layout/hyphenation/HyphenationTree.java
src/org/apache/fop/layout/hyphenation/PatternConsumer.java
src/org/apache/fop/layout/hyphenation/PatternParser.java
src/org/apache/fop/pdf/PDFNumber.java
src/org/apache/fop/pdf/PDFPages.java
src/org/apache/fop/pdf/PDFState.java
src/org/apache/fop/render/awt/AWTFontMetrics.java
src/org/apache/fop/render/pdf/FontSetup.java
src/org/apache/fop/render/pdf/fonts/LazyFont.java
src/org/apache/fop/render/pdf/fonts/MultiByteFont.java
src/org/apache/fop/render/pdf/fonts/SingleByteFont.java
src/org/apache/fop/render/xml/XMLRenderer.java
src/org/apache/fop/svg/PDFDocumentGraphics2D.java
src/org/apache/fop/svg/PDFGraphics2D.java
src/org/apache/fop/svg/PDFTextElementBridge.java [new file with mode: 0644]
src/org/apache/fop/svg/PDFTextPainter.java
src/org/apache/fop/svg/PDFTranscoder.java
src/org/apache/fop/svg/SVGArea.java
src/org/apache/fop/svg/SVGElement.java
src/org/apache/fop/svg/SVGElementMapping.java
src/org/apache/fop/svg/SVGObj.java
src/org/apache/fop/svg/SVGUserAgent.java
src/org/apache/fop/system/BufferManager.java

index 3aa93e725a52ca181ec3a89f403d32e73ef10165..d9144270aabbe51c2f15212a5202267a46bf6f37 100644 (file)
@@ -19,8 +19,6 @@ import org.apache.fop.tools.DocumentReader;
 
 import org.apache.fop.render.pdf.PDFRenderer;
 
-import org.apache.fop.system.BufferManager;
-
 import org.apache.log.*;
 import org.apache.log.format.*;
 import org.apache.log.output.io.*;
@@ -173,8 +171,6 @@ public class Driver {
     /**
      * the system resources that FOP will use
      */
-    private BufferManager _bufferManager;
-
     private Logger log;
 
     public static final String getParserClassName() {
@@ -194,9 +190,7 @@ public class Driver {
      */
     public Driver() {
         _stream = null;
-        _bufferManager = new BufferManager();
         _treeBuilder = new FOTreeBuilder();
-        _treeBuilder.setBufferManager(_bufferManager);
         setupDefaultMappings();
     }
 
@@ -522,7 +516,6 @@ public class Driver {
     /* Set up the system buffers */
 
     public void setBufferFile(File bufferFile) {
-        this._bufferManager.addBufferFile(bufferFile);
     }
 
     /**
index 133dd0c11854a5c6b406d7235d7051c4ebc6e04d..9253c32c6b7e77238e90a2e9d056d65514aed21c 100644 (file)
@@ -80,7 +80,6 @@ public class Options {
         if (dumpConfiguration) {
             Configuration.put("dumpConfiguration", "true");
             Configuration.dumpConfiguration();
-            System.exit(0);
         }
 
         // quiet mode
index 6a03182756ec91ae30e009dfc6afae075b77d7a6..c6a763b3e89c84c2d1e47cd5e32a7e68cbae76f2 100644 (file)
@@ -9,6 +9,14 @@ package org.apache.fop.area;
 
 import java.io.Serializable;
 
+// If the area appears more than once in the output
+// or if the area has external data it is cached
+// to keep track of it and to minimize rendered output
+// renderers can render the output once and display it
+// for every occurence
+// this should also extend to all outputs (including PDFGraphics2D)
+// and all types of renderers
+
 /**
  * Base object for all areas.
  */
index 18e8ba4ff3df8ff1a2e05bbded6d003ae409fb35..b31ce3030e2281020093d94fe987ca5b22aa497d 100644 (file)
@@ -28,6 +28,11 @@ public class PageViewport {
     // the information is kept for future reference
     ArrayList idReferences = null;
 
+    // this keeps a list of currently unresolved areas or extensions
+    // once the things is resolved it is removed
+    // when this is empty the page can be rendered
+    ArrayList unresolved = null;
+
     public void setClip(boolean c) {
         clip = c;
     }
index 539467e955fe3a52bd57b924b5551721788aba49..31eee88021092f7311be850a7769e46d480d1999 100644 (file)
@@ -8,6 +8,7 @@
 package org.apache.fop.datatypes;
 
 import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.messaging.MessageHandler;
 
@@ -75,10 +76,11 @@ public class LengthBase implements PercentBase {
             return parentFO.getContentWidth();
         case CONTAINING_REFAREA:    // example: start-indent, end-indent
          {
-            FObj fo;
-            for (fo = parentFO; fo != null &&!fo.generatesReferenceAreas();
-                    fo = fo.getParent());
-            return (fo != null ? fo.getContentWidth() : 0);
+            //FONode fo;
+            //for (fo = parentFO; fo != null && !fo.generatesReferenceAreas();
+            //        fo = fo.getParent());
+            //return (((fo != null) && (fo instanceof FObj)) ? ((FObj)fo).getContentWidth() : 0);
+            return 0;
         }
         case CUSTOM_BASE:
             MessageHandler.errorln("!!! LengthBase.getBaseLength() called on CUSTOM_BASE type !!!");
index 70e72cd302423700a5651fa1a3f35fed42f8b8f2..c14d0d353d369639ab1eaad60fc1d210d09d83a6 100644 (file)
@@ -7,11 +7,11 @@
 
 package org.apache.fop.extensions;
 
-import org.apache.fop.fo.*;
+import org.apache.fop.fo.FONode;
+import org.apache.fop.fo.ElementMapping;
+import org.apache.fop.fo.FOTreeBuilder;
 
-import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.Iterator;
 
 public class ExtensionElementMapping implements ElementMapping {
 
@@ -29,13 +29,13 @@ public class ExtensionElementMapping implements ElementMapping {
     }
 
     class O extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Outline(parent);
         }
     }
 
     class L extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Label(parent);
         }
     }
index 170e198be809b0ef81f3716715908a9632487b42..3ae492d18816a27f9a340e4ade23985879b99bf2 100644 (file)
@@ -10,9 +10,6 @@ package org.apache.fop.extensions;
 import org.apache.fop.fo.*;
 import org.apache.fop.layout.*;
 import org.apache.fop.apps.FOPException;
-import org.apache.fop.fo.properties.ExtensionPropertyMapping;
-
-import org.xml.sax.Attributes;
 
 /**
  * base class for extension objects
@@ -24,7 +21,7 @@ public abstract class ExtensionObj extends FObj {
      * @param parent the parent formatting object
      * @param propertyList the explicit properties of this object
      */
-    public ExtensionObj(FObj parent) {
+    public ExtensionObj(FONode parent) {
         super(parent);
     }
 
@@ -32,7 +29,6 @@ public abstract class ExtensionObj extends FObj {
      * Called for extensions within a page sequence or flow. These extensions
      * are allowed to generate visible areas within the layout.
      *
-     *
      * @param area
      */
     public Status layout(Area area) throws FOPException {
@@ -52,18 +48,5 @@ public abstract class ExtensionObj extends FObj {
         ExtensionArea extArea = new ExtensionArea(this);
         areaTree.addExtension(this);
     }
-
-    protected PropertyListBuilder getListBuilder() {
-            PropertyListBuilder plb = new PropertyListBuilder();
-            plb.addList(ExtensionPropertyMapping.getGenericMappings());
-        return plb;
-    }
-
-    public void handleAttrs(Attributes attlist) throws FOPException {
-        String uri = ExtensionElementMapping.URI;
-        properties =
-                    getListBuilder().makeList(uri, name, attlist,
-                                                (parent == null) ? null
-                                                : parent.properties, parent);
-    }
 }
+
index cbc274413314f645a5daaed4f7f3bb5da6d2b4cd..fc645d4aa24441212981061a471d07ff74a6c3ee 100644 (file)
@@ -9,11 +9,10 @@ package org.apache.fop.extensions;
 
 import org.apache.fop.fo.*;
 
-
 public class Label extends ExtensionObj {
     private String _label = "";
 
-    public Label(FObj parent) {
+    public Label(FONode parent) {
         super(parent);
     }
 
@@ -25,5 +24,4 @@ public class Label extends ExtensionObj {
         return _label;
     }
 
-
 }
index eb5d9da0ef63b27252be32ed5e14a0384fe12c59..48efad0f4540f1a4d5abbda516b70003d00e8092 100644 (file)
@@ -19,7 +19,7 @@ import org.xml.sax.Attributes;
 
 public class Outline extends ExtensionObj {
     private Label _label;
-    private Vector _outlines = new Vector();
+    private ArrayList _outlines = new ArrayList();
 
     private String _internalDestination;
     private String _externalDestination;
@@ -34,16 +34,15 @@ public class Outline extends ExtensionObj {
      */
     private Object _rendererObject;
 
-    public Outline(FObj parent) {
+    public Outline(FONode parent) {
         super(parent);
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
-        super.handleAttrs(attlist);
         _internalDestination =
-            this.properties.get("internal-destination").getString();
+            attlist.getValue(null, "internal-destination");
         _externalDestination =
-            this.properties.get("external-destination").getString();
+            attlist.getValue(null, "external-destination");
         if (_externalDestination != null &&!_externalDestination.equals("")) {
             log.warn("fox:outline external-destination not supported currently.");
         }
@@ -66,12 +65,10 @@ public class Outline extends ExtensionObj {
         if (obj instanceof Label) {
             _label = (Label)obj;
         } else if (obj instanceof Outline) {
-            _outlines.addElement(obj);
+            _outlines.add(obj);
         }
-        super.addChild(obj);
     }
 
-
     public void setRendererObject(Object o) {
         _rendererObject = o;
     }
@@ -88,7 +85,7 @@ public class Outline extends ExtensionObj {
         return _label == null ? new Label(this) : _label;
     }
 
-    public Vector getOutlines() {
+    public ArrayList getOutlines() {
         return _outlines;
     }
 
@@ -96,7 +93,5 @@ public class Outline extends ExtensionObj {
         return _internalDestination;
     }
 
-
-
 }
 
index d3cb86eba4df43e353ef3ed9f8df74725300bde9..e58dd18e5cac94fb44c7ba7fae1f7706d09e58f8 100644 (file)
@@ -15,14 +15,12 @@ import org.apache.fop.layout.AreaTree;
 import org.apache.fop.apps.FOPException;
 
 /**
- * The fo:root formatting object. Contains page masters, root extensions,
- * page-sequences.
+ * The fo:color-profile formatting object.
  */
 public class ColorProfile extends ToBeImplementedElement {
 
-    protected ColorProfile(FObj parent) {
+    protected ColorProfile(FONode parent) {
         super(parent);
-        this.name = "fo:color-profile";
 
         // this.properties.get("src");
         // this.properties.get("color-profile-name");
index b7bcb7b7fc253063465315cb89596008eab43d2f..1c4e783d05f02011cba21e6aa9eb91d1c9f594db 100644 (file)
@@ -18,9 +18,8 @@ import org.apache.fop.apps.FOPException;
  */
 public class Declarations extends ToBeImplementedElement {
 
-    protected Declarations(FObj parent) {
+    protected Declarations(FONode parent) {
         super(parent);
-        this.name = "fo:declarations";
     }
 
 }
index d9e86be9a25a56620c7005084b2fdc85e8b566a8..591412be4c6cbdd524f4163b685cd80bd0bbf107 100644 (file)
@@ -12,10 +12,12 @@ package org.apache.fop.fo;
  * the given builder.
  */
 public interface ElementMapping {
+    public static final String DEFAULT = "<default>";
+
     public void addToBuilder(FOTreeBuilder builder);
 
     public static class Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return null;
         }
     }
index 978a909d47a38f8b38ce5fec1c3e0c6d1e2d65d1..5c4e248e7f780c7ea9c463b260bec20c51f41974 100644 (file)
@@ -7,7 +7,6 @@
 
 package org.apache.fop.fo;
 
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 
@@ -112,337 +111,337 @@ public class FOElementMapping implements ElementMapping {
     }
 
     class R extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Root(parent);
         }
     }
 
     class Dec extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Declarations(parent);
         }
     }
 
     class CP extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new ColorProfile(parent);
         }
     }
 
     class PS extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new PageSequence(parent);
         }
     }
 
     class LMS extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new LayoutMasterSet(parent);
         }
     }
 
     class PSM extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new PageSequenceMaster(parent);
         }
     }
 
     class SPMR extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new SinglePageMasterReference(parent);
         }
     }
 
     class RPMR extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new RepeatablePageMasterReference(parent);
         }
     }
 
     class RPMA extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new RepeatablePageMasterAlternatives(parent);
         }
     }
 
     class CPMR extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new ConditionalPageMasterReference(parent);
         }
     }
 
     class SPM extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new SimplePageMaster(parent);
         }
     }
 
     class RB extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new RegionBody(parent);
         }
     }
 
     class RBefore extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new RegionBefore(parent);
         }
     }
 
     class RA extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new RegionAfter(parent);
         }
     }
 
     class RS extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new RegionStart(parent);
         }
     }
 
     class RE extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new RegionEnd(parent);
         }
     }
 
     class Fl extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Flow(parent);
         }
     }
 
     class SC extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new StaticContent(parent);
         }
     }
 
     class T extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Title(parent);
         }
     }
 
     class B extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Block(parent);
         }
     }
 
     class BC extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new BlockContainer(parent);
         }
     }
 
     class BO extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new BidiOverride(parent);
         }
     }
 
     class Ch extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new org.apache.fop.fo.flow.Character(parent);
         }
     }
 
     class IPS extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new InitialPropertySet(parent);
         }
     }
 
     class EG extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new ExternalGraphic(parent);
         }
     }
 
     class IFO extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new InstreamForeignObject(parent);
         }
     }
 
     class In extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Inline(parent);
         }
     }
 
     class IC extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new InlineContainer(parent);
         }
     }
 
     class L extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Leader(parent);
         }
     }
 
     class PN extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new PageNumber(parent);
         }
     }
 
     class PNC extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new PageNumberCitation(parent);
         }
     }
 
     class TAC extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new TableAndCaption(parent);
         }
     }
 
     class Ta extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Table(parent);
         }
     }
 
     class TC extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new TableColumn(parent);
         }
     }
 
     class TCaption extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new TableCaption(parent);
         }
     }
 
     class TH extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new TableHeader(parent);
         }
     }
 
     class TF extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new TableFooter(parent);
         }
     }
 
     class TB extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new TableBody(parent);
         }
     }
 
     class TR extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new TableRow(parent);
         }
     }
 
     class TCell extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new TableCell(parent);
         }
     }
 
     class LB extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new ListBlock(parent);
         }
     }
 
     class LI extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new ListItem(parent);
         }
     }
 
     class LIB extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new ListItemBody(parent);
         }
     }
 
     class LIL extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new ListItemLabel(parent);
         }
     }
 
     class BL extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new BasicLink(parent);
         }
     }
 
     class MS extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new MultiSwitch(parent);
         }
     }
 
     class MC extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new MultiCase(parent);
         }
     }
 
     class MT extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new MultiToggle(parent);
         }
     }
 
     class MP extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new MultiProperties(parent);
         }
     }
 
     class MPS extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new MultiPropertySet(parent);
         }
     }
 
     class F extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new org.apache.fop.fo.flow.Float(parent);
         }
     }
 
     class Foot extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Footnote(parent);
         }
     }
 
     class FB extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new FootnoteBody(parent);
         }
     }
 
     class W extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Wrapper(parent);
         }
     }
 
     class M extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Marker(parent);
         }
     }
 
     class RM extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new RetrieveMarker(parent);
         }
     }
index 0843f51e1333318e00087410cfe20de469c3c8f6..911020b9e2e2e96c4864937fa9fde236f093630f 100644 (file)
  * LICENSE file included with these sources.
  */
 
-
 package org.apache.fop.fo;
 
 // FOP
 import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.StreamRenderer;
 import org.apache.fop.layout.Area;
-import org.apache.fop.layout.AreaClass;
-import org.apache.fop.layout.LinkSet;
-import org.apache.fop.system.BufferManager;
-import org.apache.fop.fo.flow.Marker;
 
 import org.apache.log.Logger;
 
-// Java
-import java.util.Vector;
-import java.util.Hashtable;
-
 import org.xml.sax.Attributes;
 
 /**
- * base class for nodes in the formatting object tree
+ * base class for nodes in the XML tree
  *
- * Modified by Mark Lillywhite mark-fop@inomial.com. Made
- * Vector a protected member. (/me things this should be
- * a private member with an API for adding children;
- * this woudl save a lot of memory because the Vector
- * would not have to be instantiated unless the node had
- * children).
  */
 abstract public class FONode {
-
-    protected FObj parent;
-
-    protected String areaClass = AreaClass.UNASSIGNED;
-
-    public BufferManager bufferManager;
-
-    protected Vector children = new Vector();    // made public for searching for id's
-
-    /**
-     * value of marker before layout begins
-     */
-    public final static int START = -1000;
-
-    /**
-     * value of marker after break-after
-     */
-    public final static int BREAK_AFTER = -1001;
-
-    /**
-     * where the layout was up to.
-     * for FObjs it is the child number
-     * for FOText it is the character number
-     */
-    protected int marker = START;
-
-    protected boolean isInTableCell = false;
-
-    protected int forcedStartOffset = 0;
-    protected int forcedWidth = 0;
-
-    protected int widows = 0;
-    protected int orphans = 0;
-
-    protected LinkSet linkSet;
-
-    // count of areas generated-by/returned-by
-    public int areasGenerated = 0;
-
-    // markers
-    protected Hashtable markers;
+    protected FONode parent;
+    protected String name;
 
     protected Logger log;
 
-    protected FONode(FObj parent) {
+    protected FONode(FONode parent) {
         this.parent = parent;
-        if (parent != null) {
-            this.bufferManager = parent.bufferManager;
-        }
-
-        markers = new Hashtable();
+    }
 
-        if (null != parent)
-            this.areaClass = parent.areaClass;
+    public void setName(String str) {
+        name = str;
     }
 
     public void setLogger(Logger logger) {
         log = logger;
     }
 
-    public void handleAttrs(Attributes attlist) throws FOPException {
+    public void setUserAgent(FOUserAgent ua) {
     }
 
-    public void setIsInTableCell() {
-        this.isInTableCell = true;
-        // made recursive by Eric Schaeffer
-        for (int i = 0; i < this.children.size(); i++) {
-            FONode child = (FONode)this.children.elementAt(i);
-            child.setIsInTableCell();
-        }
+    public void setStreamRenderer(StreamRenderer st) {
     }
 
-    public void forceStartOffset(int offset) {
-        this.forcedStartOffset = offset;
-        // made recursive by Eric Schaeffer
-        for (int i = 0; i < this.children.size(); i++) {
-            FONode child = (FONode)this.children.elementAt(i);
-            child.forceStartOffset(offset);
-        }
-    }
-
-    public void forceWidth(int width) {
-        this.forcedWidth = width;
-        // made recursive by Eric Schaeffer
-        for (int i = 0; i < this.children.size(); i++) {
-            FONode child = (FONode)this.children.elementAt(i);
-            child.forceWidth(width);
-        }
-    }
-
-    public void resetMarker() {
-        this.marker = START;
-        int numChildren = this.children.size();
-        for (int i = 0; i < numChildren; i++) {
-            ((FONode)children.elementAt(i)).resetMarker();
-        }
-    }
-
-    public void setWidows(int wid) {
-        widows = wid;
-    }
-
-    public void setOrphans(int orph) {
-        orphans = orph;
-    }
-
-    public void removeAreas() {
-        // still to do
-    }
-
-
-    protected void addChild(FONode child) {
-        children.addElement(child);
-    }
-
-    public FObj getParent() {
-        return this.parent;
-    }
-
-    public void setBufferManager(BufferManager bufferManager) {
-        this.bufferManager = bufferManager;
-    }
-
-    public BufferManager getBufferManager() {
-        return this.bufferManager;
-    }
-
-    public void setLinkSet(LinkSet linkSet) {
-        this.linkSet = linkSet;
-        for (int i = 0; i < this.children.size(); i++) {
-            FONode child = (FONode)this.children.elementAt(i);
-            child.setLinkSet(linkSet);
-        }
+    public void handleAttrs(Attributes attlist) throws FOPException {
     }
 
-    public LinkSet getLinkSet() {
-        return this.linkSet;
+    /**
+     * returns the name of the object
+     * @return the name of this object
+     */
+    public String getName() {
+        return this.name;
     }
 
-    abstract public Status layout(Area area) throws FOPException;
-
     /**
-     * lets outside sources access the property list
-     * first used by PageNumberCitation to find the "id" property
-     * returns null by default, overide this function when there is a property list
-     * @param name - the name of the desired property to obtain
-     * @returns the property
+     * adds characters (does nothing here)
+     * @param data text
+     * @param start start position
+     * @param length length of the text
      */
-    public Property getProperty(String name) {
-        return (null);
+    protected void addCharacters(char data[], int start, int length) {
+        // ignore
     }
 
     /**
-     * At the start of a new span area layout may be partway through a
-     * nested FO, and balancing requires rollback to this known point.
-     * The snapshot records exactly where layout is at.
-     * @param snapshot a Vector of markers (Integer)
-     * @returns the updated Vector of markers (Integers)
+     * generates the area or areas for this formatting object
+     * and adds these to the area. This method should always be
+     * overridden by all sub classes
+     *
+     * @param area
      */
-    public Vector getMarkerSnapshot(Vector snapshot) {
-        snapshot.addElement(new Integer(this.marker));
-
-        // terminate if no kids or child not yet accessed
-        if (this.marker < 0)
-            return snapshot;
-        else if (children.isEmpty())
-            return snapshot;
-        else
-            return ((FONode)children.elementAt(this.marker)).getMarkerSnapshot(snapshot);
+    public Status layout(Area area) throws FOPException {
+        // should always be overridden
+        return new Status(Status.OK);
     }
 
     /**
-     * When balancing occurs, the flow layout() method restarts at the
-     * point specified by the current marker snapshot, which is retrieved
-     * and restored using this method.
-     * @param snapshot the Vector of saved markers (Integers)
+     *
      */
-    public void rollback(Vector snapshot) {
-        this.marker = ((Integer)snapshot.elementAt(0)).intValue();
-        snapshot.removeElementAt(0);
-
-        if (this.marker == START) {
-            // make sure all the children of this FO are also reset
-            resetMarker();
-            return;
-        } else if ((this.marker == -1) || children.isEmpty())
-            return;
-
-        int numChildren = this.children.size();
-
-        if (this.marker <= START) {
-            return;
-        }
-
-        for (int i = this.marker + 1; i < numChildren; i++) {
-            FONode fo = (FONode)children.elementAt(i);
-            fo.resetMarker();
-        }
-        ((FONode)children.elementAt(this.marker)).rollback(snapshot);
+    protected void start() {
+        // do nothing by default
     }
 
-
-    public void addMarker(Marker marker) throws FOPException {
-        String mcname = marker.getMarkerClassName();
-        if (!markers.containsKey(mcname) && children.isEmpty()) {
-            markers.put(mcname, marker);
-        } else {
-            log.error("fo:marker must be an initial child,"
-                                   + "and 'marker-class-name' must be unique for same parent");
-            throw new FOPException("fo:marker must be an initial child,"
-                                   + "and 'marker-class-name' must be unique for same parent");
-        }
+    /**
+     *
+     */
+    protected void end() {
+        // do nothing by default
     }
 
-    public boolean hasMarkers() {
-        return !markers.isEmpty();
+    protected void addChild(FONode child) {
     }
 
-    public Vector getMarkers() {
-        return new Vector(markers.values());
+    public FONode getParent() {
+        return this.parent;
     }
 
 }
index bc86aba2067d2df0ae2038add871c6218d6ec23d..b0ebd2b4bc12295bbbc6c077f2822845d1b23c18 100644 (file)
@@ -26,67 +26,42 @@ import org.apache.fop.system.BufferManager;
  * longer than the lifetime of the object itself, causing
  * excessive memory consumption and OOM errors.
  */
-public class FOText extends FONode {
+public class FOText extends FObj {
 
     protected char[] ca;
     protected int start;
     protected int length;
-
-    FontState fs;
-    float red;
-    float green;
-    float blue;
-    int wrapOption;
-    int whiteSpaceCollapse;
-    int verticalAlign;
-
-    // Textdecoration
-    protected boolean underlined = false;
-    protected boolean overlined = false;
-    protected boolean lineThrough = false;
+    TextInfo textInfo;
+
+    public static class TextInfo {
+        FontState fs;
+        float red;
+        float green;
+        float blue;
+        int wrapOption;
+        int whiteSpaceCollapse;
+        int verticalAlign;
+
+        // Textdecoration
+        protected boolean underlined = false;
+        protected boolean overlined = false;
+        protected boolean lineThrough = false;
+    }
 
     TextState ts;
 
-
-    public FOText(char[] chars, int s, int e, FObj parent) {
-        super(parent);
+    public FOText(char[] chars, int s, int e, TextInfo ti) {
+        super(null);
         this.start = 0;
         this.ca = new char[e - s];
         for (int i = s; i < e; i++)
             ca[i - s] = chars[i];
         this.length = e - s;
-
-        /* ML - remove refs to BufferManager
-        this.bufferManager = parent.bufferManager;
-        if (this.bufferManager != null) {
-            bufferManager.writeBuffer((Object)this, ca);
-    } else {
-            System.out.println("abnormal exit");
-            System.exit(0);
-    }
-        */
-    }
-
-    public void setUnderlined(boolean ul) {
-        this.underlined = ul;
-    }
-
-    public void setOverlined(boolean ol) {
-        this.overlined = ol;
+        textInfo = ti;
     }
 
-    public void setLineThrough(boolean lt) {
-        this.lineThrough = lt;
-    }
-
-
     public boolean willCreateArea() {
-        // ML - remove refs to BufferManager
-        //char ca[] = this.bufferManager.readBuffer((Object)this);
-
-        this.whiteSpaceCollapse =
-            this.parent.properties.get("white-space-collapse").getEnum();
-        if (this.whiteSpaceCollapse == WhiteSpaceCollapse.FALSE
+        if (textInfo.whiteSpaceCollapse == WhiteSpaceCollapse.FALSE
                 && length > 0) {
             return true;
         }
@@ -102,55 +77,24 @@ public class FOText extends FONode {
     }
 
     public Status layout(Area area) throws FOPException {
-        // ML - remove refs to BufferManager
-        // char ca[] = this.bufferManager.readBuffer((Object)this);
         if (!(area instanceof BlockArea)) {
             log.error("text outside block area"
                                    + new String(ca, start, length));
             return new Status(Status.OK);
         }
         if (this.marker == START) {
-            String fontFamily =
-                this.parent.properties.get("font-family").getString();
-            String fontStyle =
-                this.parent.properties.get("font-style").getString();
-            String fontWeight =
-                this.parent.properties.get("font-weight").getString();
-            int fontSize =
-                this.parent.properties.get("font-size").getLength().mvalue();
-            // font-variant support
-            // added by Eric SCHAEFFER
-            int fontVariant =
-                this.parent.properties.get("font-variant").getEnum();
-
-            this.fs = new FontState(area.getFontInfo(), fontFamily,
-                                    fontStyle, fontWeight, fontSize,
-                                    fontVariant);
-
-            ColorType c = this.parent.properties.get("color").getColorType();
-            this.red = c.red();
-            this.green = c.green();
-            this.blue = c.blue();
-
-            this.verticalAlign =
-                this.parent.properties.get("vertical-align").getEnum();
-
-            this.wrapOption =
-                this.parent.properties.get("wrap-option").getEnum();
-            this.whiteSpaceCollapse =
-                this.parent.properties.get("white-space-collapse").getEnum();
             this.ts = new TextState();
-            ts.setUnderlined(underlined);
-            ts.setOverlined(overlined);
-            ts.setLineThrough(lineThrough);
+            ts.setUnderlined(textInfo.underlined);
+            ts.setOverlined(textInfo.overlined);
+            ts.setLineThrough(textInfo.lineThrough);
 
             this.marker = this.start;
         }
         int orig_start = this.marker;
-        this.marker = addText((BlockArea)area, fs, red, green, blue,
-                              wrapOption, this.getLinkSet(),
-                              whiteSpaceCollapse, ca, this.marker, length,
-                              ts, verticalAlign);
+        this.marker = addText((BlockArea)area, textInfo.fs, textInfo.red, textInfo.green, textInfo.blue,
+                              textInfo.wrapOption, this.getLinkSet(),
+                              textInfo.whiteSpaceCollapse, ca, this.marker, length,
+                              ts, textInfo.verticalAlign);
         if (this.marker == -1) {
 
 
@@ -290,5 +234,5 @@ public class FOText extends FONode {
         return -1;
     }
 
-
 }
+
index 6d6fd41727b56a7f4bdab5941fef0383817c1a82..16d4bdc8a01807e1392657413f2795b0237d114f 100644 (file)
@@ -12,7 +12,6 @@ import org.apache.fop.layout.AreaTree;
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.StreamRenderer;
 import org.apache.fop.fo.pagination.Root;
-import org.apache.fop.system.BufferManager;
 import org.apache.fop.fo.pagination.PageSequence;
 import org.apache.fop.extensions.ExtensionObj;
 
@@ -53,15 +52,13 @@ public class FOTreeBuilder extends DefaultHandler {
     /**
      * current formatting object being handled
      */
-    protected FObj currentFObj = null;
+    protected FONode currentFObj = null;
 
     /**
      * the root of the formatting object tree
      */
     protected FObj rootFObj = null;
 
-    public BufferManager bufferManager;
-
     /**
      * set of names of formatting objects encountered but unknown
      */
@@ -73,8 +70,8 @@ public class FOTreeBuilder extends DefaultHandler {
      * (mark-fop@inomial.com)
      */
     private StreamRenderer streamRenderer;
-
     private Logger log;
+    private FOUserAgent userAgent;
 
     public FOTreeBuilder() {}
 
@@ -114,7 +111,7 @@ public class FOTreeBuilder extends DefaultHandler {
     throws SAXException {
         currentFObj.end();
 
-        currentFObj = (FObj)currentFObj.getParent();
+        currentFObj = currentFObj.getParent();
     }
 
     /**
@@ -139,7 +136,7 @@ public class FOTreeBuilder extends DefaultHandler {
     public void startElement(String uri, String localName, String rawName,
                              Attributes attlist) throws SAXException {
         /* the formatting object started */
-        FObj fobj;
+        FONode fobj;
 
         /* the maker for the formatting object started */
         ElementMapping.Maker fobjMaker = null;
@@ -149,7 +146,7 @@ public class FOTreeBuilder extends DefaultHandler {
             fobjMaker = (ElementMapping.Maker)table.get(localName);
             // try default
             if(fobjMaker == null) {
-                fobjMaker = (ElementMapping.Maker)table.get("<default>");
+                fobjMaker = (ElementMapping.Maker)table.get(ElementMapping.DEFAULT);
             }
         }
 
@@ -158,7 +155,7 @@ public class FOTreeBuilder extends DefaultHandler {
             String fullName = uri + "^" + localName;
             if (!this.unknownFOs.containsKey(fullName)) {
                 this.unknownFOs.put(fullName, "");
-                log.error("Unknown formatting object "
+                log.warn("Unknown formatting object "
                                        + fullName);
             }
             if(namespaces.contains(uri.intern())) {
@@ -174,20 +171,25 @@ public class FOTreeBuilder extends DefaultHandler {
             fobj = fobjMaker.make(currentFObj);
             fobj.setName(localName);
             fobj.setLogger(log);
+            // set the user agent for resolving user agent values
+            fobj.setUserAgent(userAgent);
+            // set the stream renderer so that appropriate
+            // elements can add pages and handle resolving references
+            fobj.setStreamRenderer(streamRenderer);
+
             fobj.handleAttrs(attlist);
         } catch (FOPException e) {
             throw new SAXException(e);
         }
 
         if (rootFObj == null) {
-            rootFObj = fobj;
-            rootFObj.setBufferManager(this.bufferManager);
             if (!fobj.getName().equals("fo:root")) {
                 throw new SAXException(new FOPException("Root element must"
-                                                        + " be root, not "
+                                                        + " be fo:root, not "
                                                         + fobj.getName()));
             }
-        } else if(!(fobj instanceof org.apache.fop.fo.pagination.PageSequence)) {
+            rootFObj = (FObj)fobj;
+        } else {
             currentFObj.addChild(fobj);
         }
 
@@ -204,8 +206,4 @@ public class FOTreeBuilder extends DefaultHandler {
         return (rootFObj != null);
     }
 
-    public void setBufferManager(BufferManager bufferManager) {
-        this.bufferManager = bufferManager;
-    }
-
 }
index 1f626a5baf4f748eef781e731776390219858bba..4c5cb910fbe9077b3d860ad442f4dc08a363c3a9 100644 (file)
@@ -9,33 +9,89 @@ package org.apache.fop.fo;
 
 // FOP
 import org.apache.fop.layout.Area;
+import org.apache.fop.layout.AreaClass;
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.datatypes.IDReferences;
 import org.apache.fop.fo.properties.FOPropertyMapping;
+import org.apache.fop.layout.Area;
+import org.apache.fop.layout.AreaClass;
+import org.apache.fop.layout.LinkSet;
+import org.apache.fop.system.BufferManager;
+import org.apache.fop.fo.flow.Marker;
 
 import org.xml.sax.Attributes;
 
+import java.util.Iterator;
+import java.util.Vector;
+import java.util.Hashtable;
+
 /**
  * base class for representation of formatting objects and their processing
  */
 public class FObj extends FONode {
-
     public PropertyList properties;
     protected PropertyManager propMgr;
+    protected String areaClass = AreaClass.UNASSIGNED;
+
+    /**
+     * value of marker before layout begins
+     */
+    public final static int START = -1000;
+
+    /**
+     * value of marker after break-after
+     */
+    public final static int BREAK_AFTER = -1001;
+
+    /**
+     * where the layout was up to.
+     * for FObjs it is the child number
+     * for FOText it is the character number
+     */
+    protected int marker = START;
+
+    protected Vector children = new Vector();    // made public for searching for id's
 
-    protected String name;
+    protected boolean isInTableCell = false;
 
-    public FObj(FObj parent) {
+    protected int forcedStartOffset = 0;
+    protected int forcedWidth = 0;
+
+    protected int widows = 0;
+    protected int orphans = 0;
+
+    protected LinkSet linkSet;
+
+    // count of areas generated-by/returned-by
+    public int areasGenerated = 0;
+
+    // markers
+    protected Hashtable markers;
+
+    public FObj(FONode parent) {
         super(parent);
+        markers = new Hashtable();
+        if (parent instanceof FObj)
+            this.areaClass = ((FObj)parent).areaClass;
     }
 
     public void setName(String str) {
         name = "fo:" + str;
     }
 
+    protected static PropertyListBuilder plb = null;
+
     protected PropertyListBuilder getListBuilder() {
-            PropertyListBuilder plb = new PropertyListBuilder();
+        if(plb == null) {
+            plb = new PropertyListBuilder();
             plb.addList(FOPropertyMapping.getGenericMappings());
+
+            for (Iterator iter = FOPropertyMapping.getElementMappings().iterator();
+                    iter.hasNext(); ) {
+                String elem = (String)iter.next();
+                plb.addElementList(elem, FOPropertyMapping.getElementMapping(elem));
+            }
+        }
         return plb;
     }
 
@@ -46,10 +102,17 @@ public class FObj extends FONode {
      */
     public void handleAttrs(Attributes attlist) throws FOPException {
         String uri = "http://www.w3.org/1999/XSL/Format";
+        FONode par = parent;
+        while(par != null && !(par instanceof FObj)) {
+            par = par.parent;
+        }
+        PropertyList props = null;
+        if(par != null) {
+            props = ((FObj)par).properties;
+        }
         properties =
                     getListBuilder().makeList(uri, name, attlist,
-                                                (parent == null) ? null
-                                                : parent.properties, parent);
+                                                props, (FObj)par);
         properties.setFObj(this);
         this.propMgr = makePropertyManager(properties);
         setWritingMode();
@@ -59,48 +122,8 @@ public class FObj extends FONode {
         return new PropertyManager(propertyList);
     }
 
-    /**
-     * adds characters (does nothing here)
-     * @param data text
-     * @param start start position
-     * @param length length of the text
-     */
-    protected void addCharacters(char data[], int start, int length) {
-        // ignore
-    }
-
-    /**
-     * generates the area or areas for this formatting object
-     * and adds these to the area. This method should always be
-     * overridden by all sub classes
-     *
-     * @param area
-     */
-    public Status layout(Area area) throws FOPException {
-        // should always be overridden
-        return new Status(Status.OK);
-    }
-
-    /**
-     * returns the name of the formatting object
-     * @return the name of this formatting objects
-     */
-    public String getName() {
-        return this.name;
-    }
-
-    /**
-     *
-     */
-    protected void start() {
-        // do nothing by default
-    }
-
-    /**
-     *
-     */
-    protected void end() {
-        // do nothing by default
+    protected void addChild(FONode child) {
+        children.addElement(child);
     }
 
     /**
@@ -113,7 +136,6 @@ public class FObj extends FONode {
         return (properties.get(name));
     }
 
-
     /**
      * Return the "content width" of the areas generated by this FO.
      * This is used by percent-based properties to get the dimension of
@@ -158,12 +180,159 @@ public class FObj extends FONode {
      */
     protected void setWritingMode() {
         FObj p;
-        FObj parent;
+        FONode parent;
         for (p = this;
-                !p.generatesReferenceAreas() && (parent = p.getParent()) != null;
-                p = parent);
+                !p.generatesReferenceAreas() && (parent = p.getParent()) != null && (parent instanceof FObj);
+                p = (FObj)parent);
         this.properties.setWritingMode(p.getProperty("writing-mode").getEnum());
     }
 
+    public void setIsInTableCell() {
+        this.isInTableCell = true;
+        // made recursive by Eric Schaeffer
+        for (int i = 0; i < this.children.size(); i++) {
+            Object obj = this.children.elementAt(i);
+            if(obj instanceof FObj) {
+                FObj child = (FObj)obj;
+                child.setIsInTableCell();
+            }
+        }
+    }
+    
+    public void forceStartOffset(int offset) {
+        this.forcedStartOffset = offset; 
+        // made recursive by Eric Schaeffer
+        for (int i = 0; i < this.children.size(); i++) {
+            Object obj = this.children.elementAt(i);
+            if(obj instanceof FObj) {
+                FObj child = (FObj)obj;
+                child.forceStartOffset(offset);
+            }
+        }
+    }
+
+    public void forceWidth(int width) {
+        this.forcedWidth = width;
+        // made recursive by Eric Schaeffer
+        for (int i = 0; i < this.children.size(); i++) {
+            Object obj = this.children.elementAt(i);
+            if(obj instanceof FObj) {
+                FObj child = (FObj)obj;
+                child.forceWidth(width);
+            }
+        }
+    }
+
+    public void resetMarker() {
+        this.marker = START;
+        int numChildren = this.children.size();
+        for (int i = 0; i < numChildren; i++) {
+            Object obj = this.children.elementAt(i);
+            if(obj instanceof FObj) {
+                FObj child = (FObj)obj;
+                child.resetMarker();
+            }
+        }
+    }
+
+    public void setWidows(int wid) {
+        widows = wid;
+    }
+    
+    public void setOrphans(int orph) {
+        orphans = orph;
+    }
+
+    public void removeAreas() {
+        // still to do
+    }
+
+    public void setLinkSet(LinkSet linkSet) {
+        this.linkSet = linkSet;
+        for (int i = 0; i < this.children.size(); i++) {
+            Object obj = this.children.elementAt(i);
+            if(obj instanceof FObj) {
+                FObj child = (FObj)obj;
+                child.setLinkSet(linkSet);
+            }
+        }
+    }
+
+    public LinkSet getLinkSet() {
+        return this.linkSet;
+    }
+
+    /**
+     * At the start of a new span area layout may be partway through a
+     * nested FO, and balancing requires rollback to this known point.
+     * The snapshot records exactly where layout is at.
+     * @param snapshot a Vector of markers (Integer)
+     * @returns the updated Vector of markers (Integers)
+     */
+    public Vector getMarkerSnapshot(Vector snapshot) {
+        snapshot.addElement(new Integer(this.marker));
+
+        // terminate if no kids or child not yet accessed
+        if (this.marker < 0)
+            return snapshot;
+        else if (children.isEmpty())
+            return snapshot;
+        else
+            return ((FObj)children.elementAt(this.marker)).getMarkerSnapshot(snapshot);
+    }
+
+    /**
+     * When balancing occurs, the flow layout() method restarts at the
+     * point specified by the current marker snapshot, which is retrieved
+     * and restored using this method.
+     * @param snapshot the Vector of saved markers (Integers)
+     */
+    public void rollback(Vector snapshot) {
+        this.marker = ((Integer)snapshot.elementAt(0)).intValue();
+        snapshot.removeElementAt(0);
+
+        if (this.marker == START) {
+            // make sure all the children of this FO are also reset
+            resetMarker();
+            return;
+        } else if ((this.marker == -1) || children.isEmpty())
+            return;
+
+        int numChildren = this.children.size();
+
+        if (this.marker <= START) {
+            return;
+        }
+
+        for (int i = this.marker + 1; i < numChildren; i++) {
+            Object obj = this.children.elementAt(i);
+            if(obj instanceof FObj) {
+                FObj child = (FObj)obj;
+                child.resetMarker();
+            }
+        }
+        ((FObj)children.elementAt(this.marker)).rollback(snapshot);
+    }
+
+
+    public void addMarker(Marker marker) throws FOPException {
+        String mcname = marker.getMarkerClassName();
+        if (!markers.containsKey(mcname) && children.isEmpty()) {
+            markers.put(mcname, marker);
+        } else {
+            log.error("fo:marker must be an initial child,"
+                                   + "and 'marker-class-name' must be unique for same parent");
+            throw new FOPException("fo:marker must be an initial child,"
+                                   + "and 'marker-class-name' must be unique for same parent");
+        }
+    }
+
+    public boolean hasMarkers() {
+        return !markers.isEmpty();
+    }
+
+    public Vector getMarkers() {
+        return new Vector(markers.values());
+    }
 }
 
index 607211d07abfad216c4d7172accb00925c0b4557..b3c99d8a809dbc8d50d27185eb568c087410fa0f 100644 (file)
@@ -8,20 +8,58 @@
 package org.apache.fop.fo;
 
 import org.apache.fop.layout.Area;
+import org.apache.fop.layout.FontState;
 import org.apache.fop.apps.FOPException;
+import org.apache.fop.datatypes.ColorType;
 
 /**
  * base class for representation of mixed content formatting objects
  * and their processing
  */
 public class FObjMixed extends FObj {
+    FOText.TextInfo textInfo = null;
 
-    public FObjMixed(FObj parent) {
+    public FObjMixed(FONode parent) {
         super(parent);
     }
 
     protected void addCharacters(char data[], int start, int length) {
-        addChild(new FOText(data, start, length, this));
+        if(textInfo == null) {
+            String fontFamily =
+                getProperty("font-family").getString();
+            String fontStyle =
+                getProperty("font-style").getString();
+            String fontWeight =
+                getProperty("font-weight").getString();
+            int fontSize =
+                getProperty("font-size").getLength().mvalue();
+            // font-variant support
+            // added by Eric SCHAEFFER
+            int fontVariant =
+                getProperty("font-variant").getEnum();
+
+            //textInfo.fs = new FontState(area.getFontInfo(), fontFamily,
+            //                        fontStyle, fontWeight, fontSize,
+            //                        fontVariant);
+
+            ColorType c = getProperty("color").getColorType();
+            textInfo.red = c.red();
+            textInfo.green = c.green();
+            textInfo.blue = c.blue();
+
+            textInfo.verticalAlign =
+                getProperty("vertical-align").getEnum();
+
+            textInfo.wrapOption =
+                getProperty("wrap-option").getEnum();
+            textInfo.whiteSpaceCollapse =
+                getProperty("white-space-collapse").getEnum();
+
+        }
+
+        FOText ft = new FOText(data, start, length, textInfo);
+        ft.setLogger(log);
+        addChild(ft);
     }
 
     public Status layout(Area area) throws FOPException {
index f5f4648a8cd8a9e7dc69fe251c33eb62bead91bb..b394d84e33fbda064b819163144616100cabfd89 100644 (file)
@@ -20,9 +20,8 @@ import org.apache.fop.apps.FOPException;
  */
 public class Title extends ToBeImplementedElement {
 
-    public Title(FObj parent) {
+    public Title(FONode parent) {
         super(parent);
-        this.name = "fo:title";
     }
 
     public Status layout(Area area) throws FOPException {
index 3243cd52289637962a19b10c1b0690669b681a65..d214af8e08529a2cac4f670fb9e43441f251815b 100644 (file)
@@ -18,7 +18,7 @@ import org.apache.fop.apps.FOPException;
  */
 public class ToBeImplementedElement extends FObj {
 
-    protected ToBeImplementedElement(FObj parent) {
+    protected ToBeImplementedElement(FONode parent) {
         super(parent);
     }
 
index 0ab6c80e77ac5b7cd03f56b8f90b16ea40e8765c..9d7c819d65443e4fa8c0bd5c1441ea6e9865bcdb 100644 (file)
@@ -21,15 +21,15 @@ import org.apache.fop.apps.FOPException;
  * This prevents any further problems arising from the unknown
  * data.
  */
-public class Unknown extends FObj {
+public class Unknown extends FONode {
 
     public static class Maker extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new Unknown(parent);
         }
     }
 
-    public Unknown(FObj parent) {
+    public Unknown(FONode parent) {
         super(parent);
     }
 
index 97a3f6e8716f55193c8db83218eaa82d404b70cb..b3ba56a531c4a9ee024d9c39d601b6f6c14acf7d 100644 (file)
@@ -25,7 +25,7 @@ public class UnknownXMLObj extends XMLObj {
             space = sp;
         }
 
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new UnknownXMLObj(parent, space);
         }
     }
@@ -36,7 +36,7 @@ public class UnknownXMLObj extends XMLObj {
      * @param parent the parent formatting object
      * @param propertyList the explicit properties of this object
      */
-    protected UnknownXMLObj(FObj parent, String space) {
+    protected UnknownXMLObj(FONode parent, String space) {
         super(parent);
         this.namespace = space;
     }
index 0db6997ed59b739f913e552fa42618b5bf0947ee..f852601c83e54833f170fecd5a10cf9fec9d9fe4 100644 (file)
@@ -27,7 +27,7 @@ public class XMLElement extends XMLObj {
      * @param parent the parent formatting object
      * @param propertyList the explicit properties of this object
      */
-    public XMLElement(FObj parent) {
+    public XMLElement(FONode parent) {
         super(parent);
     }
 
index 9658f855222c2aaf70436262b56fb1befa0f9501..db4dd3962c42e774e4e2aebc9ef41fc5420b1c5a 100644 (file)
@@ -22,11 +22,11 @@ import javax.xml.parsers.DocumentBuilderFactory;
 import java.util.*;
 
 /**
- * Since SVG objects are not layed out then this class checks
- * that this element is not being layed out inside some incorrect
- * element.
+ * Generic XML object.
+ * This is used by xml objects (other than fo) than will build a DOM
+ * with each element.
  */
-public abstract class XMLObj extends FObj {
+public abstract class XMLObj extends FONode {
 
     // temp reference for attributes
     Attributes attr = null;
@@ -39,7 +39,7 @@ public abstract class XMLObj extends FObj {
      * @param parent the parent formatting object
      * @param propertyList the explicit properties of this object
      */
-    public XMLObj(FObj parent) {
+    public XMLObj(FONode parent) {
         super(parent);
     }
 
@@ -52,9 +52,9 @@ public abstract class XMLObj extends FObj {
     }
     public abstract String getNameSpace();
 
-    protected static Hashtable ns = new Hashtable();
+    protected static HashMap ns = new HashMap();
 
-    public void addGraphic(Document doc, Element parent) {
+    public void addElement(Document doc, Element parent) {
         this.doc = doc;
         element = doc.createElementNS(getNameSpace(), name);
 
@@ -121,7 +121,12 @@ public abstract class XMLObj extends FObj {
 
     protected void addChild(FONode child) {
         if (child instanceof XMLObj) {
-            ((XMLObj)child).addGraphic(doc, element);
+            ((XMLObj)child).addElement(doc, element);
+        } else {
+            // in theory someone might want to embed some defined
+            // xml (eg. fo) inside the foreign xml
+            // they could use a different namespace
+            log.debug("Invalid element: " + child.getName() + " inside foreign xml markup");
         }
     }
 
@@ -139,33 +144,10 @@ public abstract class XMLObj extends FObj {
      */
     public Status layout(Area area) throws FOPException {
         /* generate a warning */
-        log.error("" + this.name + " outside foreign xml");
+        log.warn("" + this.name + " outside foreign xml");
 
         /* return status */
         return new Status(Status.OK);
     }
-
-    public void removeID(IDReferences idReferences) {}
-
-    /**
-     * These method overrides prevent problems with the different types.
-     */
-    public void setIsInTableCell() {}
-
-    public void forceStartOffset(int offset) {}
-
-    public void forceWidth(int width) {}
-
-    public void resetMarker() {}
-
-    public void setLinkSet(LinkSet linkSet) {}
-
-    public Vector getMarkerSnapshot(Vector snapshot) {
-        return snapshot;
-    }
-
-    public void rollback(Vector snapshot) {}
-
-    protected void setWritingMode() {}
 }
 
index 41c47ee5555d9390d3d04c64f7b02854647a39b0..0e311de771af0baa14d18c343d414587a1dcaca3 100644 (file)
@@ -9,6 +9,7 @@ package org.apache.fop.fo.expr;
 
 import org.apache.fop.fo.Property;
 import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.flow.ListItem;
 
 public class BodyStartFunction extends FunctionBase {
@@ -22,7 +23,7 @@ public class BodyStartFunction extends FunctionBase {
         Numeric distance =
             pInfo.getPropertyList().get("provisional-distance-between-starts").getNumeric();
 
-        FObj item = pInfo.getFO();
+        FONode item = pInfo.getFO();
         while (item != null &&!(item instanceof ListItem)) {
             item = item.getParent();
         }
@@ -31,7 +32,7 @@ public class BodyStartFunction extends FunctionBase {
         }
 
         Numeric startIndent =
-            item.properties.get("start-indent").getNumeric();
+            ((ListItem)item).properties.get("start-indent").getNumeric();
 
         return new NumericProperty(distance.add(startIndent));
     }
index 46ec2916024cc5bd9f5ba1bb2618deee45145a50..8a835088654b08b2512ea3192418aa67530027de 100644 (file)
@@ -11,6 +11,7 @@ import org.apache.fop.datatypes.*;
 import org.apache.fop.fo.Property;
 import org.apache.fop.fo.LengthProperty;
 import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.flow.ListItem;
 
 public class LabelEndFunction extends FunctionBase {
@@ -27,19 +28,19 @@ public class LabelEndFunction extends FunctionBase {
         Length separation =
             pInfo.getPropertyList().getNearestSpecified("provisional-label-separation").getLength();
 
-        FObj item = pInfo.getFO();
+        FONode item = pInfo.getFO();
         while (item != null &&!(item instanceof ListItem)) {
             item = item.getParent();
         }
         if (item == null) {
             throw new PropertyException("label-end() called from outside an fo:list-item");
         }
-        Length startIndent = item.properties.get("start-indent").getLength();
+        Length startIndent = ((ListItem)item).properties.get("start-indent").getLength();
 
         LinearCombinationLength labelEnd = new LinearCombinationLength();
 
         // Should be CONTAINING_REFAREA but that doesn't work
-        LengthBase base = new LengthBase(item, pInfo.getPropertyList(),
+        LengthBase base = new LengthBase((ListItem)item, pInfo.getPropertyList(),
                                          LengthBase.CONTAINING_BOX);
         PercentLength refWidth = new PercentLength(1.0, base);
 
index e8d19d6e7c5be7a70c0daf75709ac70e67110b76..0530385cd8c49f6f67b60d0ffaadb03cfdacea83 100644 (file)
@@ -20,9 +20,8 @@ import java.awt.Rectangle;
 
 public class BasicLink extends Inline {
 
-    public BasicLink(FObj parent) {
+    public BasicLink(FONode parent) {
         super(parent);
-        this.name = "fo:basic-link";
     }
 
     public Status layout(Area area) throws FOPException {
@@ -94,7 +93,8 @@ public class BasicLink extends Inline {
         int numChildren = this.children.size();
         for (int i = this.marker; i < numChildren; i++) {
             FONode fo = (FONode)children.elementAt(i);
-            fo.setLinkSet(ls);
+            if(fo instanceof FObj)
+                ((FObj)fo).setLinkSet(ls);
 
             Status status;
             if ((status = fo.layout(area)).isIncomplete()) {
index 4127cbe002174a5f42a538962baff5bb97a6b7e1..208f2ae0fb872fb291d983f8cd43c2a9731d3aca 100644 (file)
@@ -19,9 +19,8 @@ import org.apache.fop.apps.FOPException;
  */
 public class BidiOverride extends ToBeImplementedElement {
 
-    public BidiOverride(FObj parent) {
+    public BidiOverride(FONode parent) {
         super(parent);
-        this.name = "fo:bidi-override";
     }
 
     public Status layout(Area area) throws FOPException {
index 687d08bc771e95741b06adeff6cb2795eb7afb88..6cb9fac90c7e305e2285ef7a44d89805a358a83d 100644 (file)
@@ -56,9 +56,8 @@ public class Block extends FObjMixed {
     // this may be helpful on other FOs too
     boolean anythingLaidOut = false;
 
-    public Block(FObj parent) {
+    public Block(FONode parent) {
         super(parent);
-        this.name = "fo:block";
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
@@ -153,8 +152,6 @@ public class Block extends FObjMixed {
             this.blockOrphans =
                 this.properties.get("orphans").getNumber().intValue();
 
-
-
             this.id = this.properties.get("id").getString();
 
             if (area instanceof BlockArea) {
@@ -178,7 +175,7 @@ public class Block extends FObjMixed {
                 FONode fo = (FONode)children.elementAt(i);
                 if (fo instanceof FOText) {
                     if (((FOText)fo).willCreateArea()) {
-                        fo.setWidows(blockWidows);
+                        //fo.setWidows(blockWidows);
                         break;
                     } else {
                         children.removeElementAt(i);
@@ -186,7 +183,7 @@ public class Block extends FObjMixed {
                         i--;
                     }
                 } else {
-                    fo.setWidows(blockWidows);
+                    //fo.setWidows(blockWidows);
                     break;
                 }
             }
@@ -195,11 +192,11 @@ public class Block extends FObjMixed {
                 FONode fo = (FONode)children.elementAt(i);
                 if (fo instanceof FOText) {
                     if (((FOText)fo).willCreateArea()) {
-                        fo.setOrphans(blockOrphans);
+                        //fo.setOrphans(blockOrphans);
                         break;
                     }
                 } else {
-                    fo.setOrphans(blockOrphans);
+                    //fo.setOrphans(blockOrphans);
                     break;
                 }
             }
index 57084d570dd432b3e708f304760304d82f4f0ed8..fc218cb7691dfc9b5697f55ded9d25d51bc5893f 100644 (file)
@@ -39,9 +39,8 @@ public class BlockContainer extends FObj {
 
     PageSequence pageSequence;
 
-    public BlockContainer(FObj parent) {
+    public BlockContainer(FONode parent) {
         super(parent);
-        this.name = "fo:block-container";
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
index ee325b9499f15e5fc996b419734075cbabd34ffd..46507bf9a59e264aba6f370d0f1f92153fcc802a 100644 (file)
@@ -37,7 +37,7 @@ public class Character extends FObj {
     public final static int OK = 0;
     public final static int DOESNOT_FIT = 1;
 
-    public Character(FObj parent) {
+    public Character(FONode parent) {
         super(parent);
         this.name = "fo:character";
     }
@@ -102,7 +102,7 @@ public class Character extends FObj {
 
         int whiteSpaceCollapse =
             this.properties.get("white-space-collapse").getEnum();
-        int wrapOption = this.parent.properties.get("wrap-option").getEnum();
+        int wrapOption = ((FObj)this.parent).properties.get("wrap-option").getEnum();
 
         int tmp = this.properties.get("text-decoration").getEnum();
         if (tmp == org.apache.fop.fo.properties.TextDecoration.UNDERLINE) {
index 5a988f7a0d25e3d80056f8184099b399a103df67..2f36956a1904d854dd9fdc296254261eb4af1ca5 100644 (file)
@@ -36,9 +36,8 @@ public class ExternalGraphic extends FObj {
 
     ImageArea imageArea;
 
-    public ExternalGraphic(FObj parent) {
+    public ExternalGraphic(FONode parent) {
         super(parent);
-        this.name = "fo:external-graphic";
     }
 
     public Status layout(Area area) throws FOPException {
index d77c0d63571c9b1051a67356c341c7ab9115d537..fd85bcc3f6bbe8450efe7a8aac7e4e662f06bdde 100644 (file)
@@ -18,7 +18,7 @@ import org.apache.fop.apps.FOPException;
  */
 public class Float extends ToBeImplementedElement {
 
-    public Float(FObj parent) {
+    public Float(FONode parent) {
         super(parent);
         this.name = "fo:float";
     }
index d705d9cd24afad4a91b04e48fdfc3dcd44c2c6ba..869729cf968f498ca11902c8af1de3d1917d3cd1 100644 (file)
@@ -52,7 +52,7 @@ public class Flow extends FObj {
     private Status _status = new Status(Status.AREA_FULL_NONE);
 
 
-    public Flow(FObj parent) {
+    public Flow(FONode parent) {
         super(parent);
         this.name = getElementName();
     }
index 4cdea7820846843019c969d68dbcc5dc4f989cf7..913b4060e70f366b79d611c88cc756cd38cce304 100644 (file)
@@ -20,7 +20,7 @@ import java.util.Vector;
 
 public class Footnote extends FObj {
 
-    public Footnote(FObj parent) {
+    public Footnote(FONode parent) {
         super(parent);
         this.name = "fo:footnote";
     }
index 5a248712680a86a6c5fc7977dcb3b46c659e6b3f..9f78a13268fb3611e9be17ec666c9bd92611426d 100644 (file)
@@ -27,7 +27,7 @@ public class FootnoteBody extends FObj {
     int endIndent;
     int textIndent;
 
-    public FootnoteBody(FObj parent) {
+    public FootnoteBody(FONode parent) {
         super(parent);
         this.name = "fo:footnote-body";
     }
index 3c081007d4c86d267cc4051883ca0821f78b8191..c24fea35e75567ce866a99e0bc01ff0bf5750ad0 100644 (file)
@@ -19,9 +19,8 @@ import org.apache.fop.apps.FOPException;
  */
 public class InitialPropertySet extends ToBeImplementedElement {
 
-    public InitialPropertySet(FObj parent) {
+    public InitialPropertySet(FONode parent) {
         super(parent);
-        this.name = "fo:initial-property-set";
     }
 
     public Status layout(Area area) throws FOPException {
index e954aa86c37ebac2e99e59d8e2087ef26b5d0d67..e161b3f9aa6d3746a7f4c60ff25260b336745449 100644 (file)
@@ -26,9 +26,8 @@ public class Inline extends FObjMixed {
     protected boolean lineThrough = false;
 
 
-    public Inline(FObj parent) {
+    public Inline(FONode parent) {
         super(parent);
-        this.name = "fo:inline";
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
@@ -88,13 +87,4 @@ public class Inline extends FObjMixed {
         }
     }
 
-    protected void addCharacters(char data[], int start, int length) {
-        FOText ft = new FOText(data, start, length, this);
-        ft.setLogger(log);
-        ft.setUnderlined(underlined);
-        ft.setOverlined(overlined);
-        ft.setLineThrough(lineThrough);
-        children.addElement(ft);
-    }
-
 }
index 0f003208a7a5dbb0048451f8d6e6c07ad9e27da3..78bbbce048bd78dea2cb1317f51704720eb0c3bc 100644 (file)
@@ -20,9 +20,8 @@ import org.xml.sax.Attributes;
  */
 public class InlineContainer extends ToBeImplementedElement {
 
-    public InlineContainer(FObj parent) {
+    public InlineContainer(FONode parent) {
         super(parent);
-        this.name = "fo:inline-container";
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
index 6a6e56e87c798bb4b00c8c62350ae107c0a18451..2f1da66258901ef39f28b8587fab83a4b2128505 100644 (file)
@@ -45,9 +45,8 @@ public class InstreamForeignObject extends FObj {
      * @param parent the parent formatting object
      * @param propertyList the explicit properties of this object
      */
-    public InstreamForeignObject(FObj parent) {
+    public InstreamForeignObject(FONode parent) {
         super(parent);
-        this.name = "fo:instream-foreign-object";
     }
 
     /**
@@ -164,7 +163,6 @@ public class InstreamForeignObject extends FObj {
                 if (this.children.size() > 0) {
                     FONode fo = (FONode)children.elementAt(0);
                     Status status;
-                    // currently FONode must be an SVG
                     if ((status =
                             fo.layout(this.areaCurrent)).isIncomplete()) {
                         return status;
index 20a82b24dfe2de03e18d008d2ca132cee27bf06d..dc3ca017a9a2a1739a4821f4ad97b339f45eae12 100644 (file)
@@ -25,9 +25,8 @@ import org.apache.fop.apps.FOPException;
  */
 public class Leader extends FObjMixed {
 
-    public Leader(FObj parent) {
+    public Leader(FONode parent) {
         super(parent);
-        this.name = "fo:leader";
     }
 
     public Status layout(Area area) throws FOPException {
index ce82cc3b014e1affaf29d073ae6b8dde8aeb9de5..f66c7ab251a210a97ac2c4755e963200d4cff007 100644 (file)
@@ -33,9 +33,8 @@ public class ListBlock extends FObj {
     int spaceBetweenListRows = 0;
     ColorType backgroundColor;
 
-    public ListBlock(FObj parent) {
+    public ListBlock(FONode parent) {
         super(parent);
-        this.name = "fo:list-block";
     }
 
     public Status layout(Area area) throws FOPException {
index 06d802cfe9a5efb68ca75c926cd15d7b70a0f33c..e16d59ce26d21dc047a410a3f669738f09275804 100644 (file)
@@ -32,7 +32,7 @@ public class ListItem extends FObj {
     String id;
     BlockArea blockArea;
 
-    public ListItem(FObj parent) {
+    public ListItem(FONode parent) {
         super(parent);
         this.name = "fo:list-item";
     }
index 40ed3a35b3636c77b243bcbd68cf343ff8ded0eb..7fc5920197577077e86df4f651d941804b5d94ff 100644 (file)
@@ -19,7 +19,7 @@ import java.util.Enumeration;
 
 public class ListItemBody extends FObj {
 
-    public ListItemBody(FObj parent) {
+    public ListItemBody(FONode parent) {
         super(parent);
         this.name = "fo:list-item-body";
     }
index 890247f5795c44a5485875400fc039be6b4c684b..9f8bc76eeaca97472da69a2a8dd0c581db5f4235 100644 (file)
@@ -19,7 +19,7 @@ import java.util.Enumeration;
 
 public class ListItemLabel extends FObj {
 
-    public ListItemLabel(FObj parent) {
+    public ListItemLabel(FONode parent) {
         super(parent);
         this.name = "fo:list-item-label";
     }
index 8267dcdf53736fddf300ec15517108a94802c2b3..5d0a73a683b8f8c725d0b019ceb050fbcf9a03b6 100644 (file)
@@ -21,9 +21,8 @@ public class Marker extends FObjMixed {
     private String markerClassName;
     private Area registryArea;
 
-    public Marker(FObj parent) {
+    public Marker(FONode parent) {
         super(parent);
-        this.name = "fo:marker";
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
@@ -36,11 +35,10 @@ public class Marker extends FObjMixed {
         // check to ensure that no other marker with same parent
         // has this 'marker-class-name' is in addMarker() method
         try {
-            parent.addMarker(this);
+            ((FObj)parent).addMarker(this);
         } catch (FOPException fopex) {
-            // log is null in constructor
-            //log.error("marker cannot be added to '" + parent
-            //                     + "'");
+            log.error("marker cannot be added to '" + parent
+                                 + "'");
         }
     }
 
index 5111cadf382010bf9f95c51b92c38a6403ce4601..5466ae270b92a544d40c63a45de848bfbba5765a 100644 (file)
@@ -18,9 +18,8 @@ import org.apache.fop.apps.FOPException;
  */
 public class MultiCase extends ToBeImplementedElement {
 
-    public MultiCase(FObj parent) {
+    public MultiCase(FONode parent) {
         super(parent);
-        this.name = "fo:multi-case";
     }
 
     public Status layout(Area area) throws FOPException {
index c0262a95b65d2729484cfac46b597dcdfe8db271..6215b1d03502824ae8d9a5d0730bd66ce2d4bd74 100644 (file)
@@ -18,7 +18,7 @@ import org.apache.fop.apps.FOPException;
  */
 public class MultiProperties extends ToBeImplementedElement {
 
-    public MultiProperties(FObj parent) {
+    public MultiProperties(FONode parent) {
         super(parent);
         this.name = "fo:multi-properties";
     }
index aebff3405012b9589ba791f6b6bbbe33b84e2118..8fab59adb846f3e2e68230d6b865fbd808cb552b 100644 (file)
@@ -18,7 +18,7 @@ import org.apache.fop.apps.FOPException;
  */
 public class MultiPropertySet extends ToBeImplementedElement {
 
-    public MultiPropertySet(FObj parent) {
+    public MultiPropertySet(FONode parent) {
         super(parent);
         this.name = "fo:multi-property-set";
     }
index 505efef29b2136cc0e7a07e851f69321c94be33e..4d2c005511ba981f75b6f7c045072437b8db434e 100644 (file)
@@ -18,7 +18,7 @@ import org.apache.fop.apps.FOPException;
  */
 public class MultiSwitch extends ToBeImplementedElement {
 
-    public MultiSwitch(FObj parent) {
+    public MultiSwitch(FONode parent) {
         super(parent);
         this.name = "fo:multi-switch";
     }
index 6605c4fb57f5216b049bdab5ea45c3825f413fac..6eb42b10255421196771a0927a12cf555ee67696 100644 (file)
@@ -18,7 +18,7 @@ import org.apache.fop.apps.FOPException;
  */
 public class MultiToggle extends ToBeImplementedElement {
 
-    public MultiToggle(FObj parent) {
+    public MultiToggle(FONode parent) {
         super(parent);
         this.name = "fo:multi-toggle";
     }
index b67f569fde8fa13b6954f84a9ab2f0224c50e256..b1eb6a69621baa72aa29f7b05777d0142f6aba19 100644 (file)
@@ -27,9 +27,8 @@ public class PageNumber extends FObj {
     int whiteSpaceCollapse;
     TextState ts;
 
-    public PageNumber(FObj parent) {
+    public PageNumber(FONode parent) {
         super(parent);
-        this.name = "fo:page-number";
     }
 
     public Status layout(Area area) throws FOPException {
index b0881783e9ff96ce7a9ec7175d264dfcccb52fde..af9d1eeaf7edd99f57abaffe7aea5553d83eaa7b 100644 (file)
@@ -84,9 +84,8 @@ public class PageNumberCitation extends FObj {
     TextState ts;
 
 
-    public PageNumberCitation(FObj parent) {
+    public PageNumberCitation(FONode parent) {
         super(parent);
-        this.name = "fo:page-number-citation";
     }
 
     public Status layout(Area area) throws FOPException {
index b7f322522535259ed54f2eb5ba5521015ff1d322..859fa18e6c60e5c402216a9fd4e584b076e49462 100644 (file)
@@ -25,7 +25,7 @@ public class RetrieveMarker extends FObjMixed {
     private int retrievePosition;
     private int retrieveBoundary;
 
-    public RetrieveMarker(FObj parent) {
+    public RetrieveMarker(FONode parent) {
         super(parent);
         this.name = "fo:retrieve-marker";
     }
index dd02ff0d34c9e712cc851ef9c81515e55b8c0f4d..643da833a61767bc0d3e272de3a8e8e1dffac182 100644 (file)
@@ -19,7 +19,7 @@ import java.util.Enumeration;
 
 public class StaticContent extends Flow {
 
-    public StaticContent(FObj parent) {
+    public StaticContent(FONode parent) {
         super(parent);
         ((PageSequence)parent).setIsFlowSet(false);    // hacquery of sorts
     }
index 9349b3f918b21a08cf8c71d5ac12a6b96de46973..8ab0d3ce122b44437f13c6f134e04917cb30b598 100644 (file)
@@ -47,7 +47,7 @@ public class Table extends FObj {
 
     AreaContainer areaContainer;
 
-    public Table(FObj parent) {
+    public Table(FONode parent) {
         super(parent);
         this.name = "fo:table";
     }
@@ -228,8 +228,8 @@ public class Table extends FObj {
                     addedFooter = true;
                     tableFooter.resetMarker();
                 }
-                fo.setWidows(widows);
-                fo.setOrphans(orphans);
+                //fo.setWidows(widows);
+                //fo.setOrphans(orphans);
                 ((TableBody)fo).setColumns(columns);
 
                 if ((status = fo.layout(areaContainer)).isIncomplete()) {
index 22db586c16fe0fa229bff32a29bc9f1b64edc3c1..33dae362c4cc1d7f2dd25b855a82adde139d57eb 100644 (file)
@@ -18,9 +18,8 @@ import org.apache.fop.apps.FOPException;
  */
 public class TableAndCaption extends ToBeImplementedElement {
 
-    public TableAndCaption(FObj parent) {
+    public TableAndCaption(FONode parent) {
         super(parent);
-        this.name = "fo:table-and-caption";
     }
 
     public Status layout(Area area) throws FOPException {
index 3b85e07549bbe422ccff836a98144a38ef37b251..930f2a76a6d263bdf9a92e1e702ffbae63f69f1c 100644 (file)
@@ -30,7 +30,7 @@ public class TableBody extends FObj {
 
     AreaContainer areaContainer;
 
-    public TableBody(FObj parent) {
+    public TableBody(FONode parent) {
         super(parent);
         this.name = "fo:table-body";
     }
index ef4ccc62ecde226577534fea7d1980b43998ae58..fef34d462c791a65c24bd92cc7d64e6e9e75ffc1 100644 (file)
@@ -18,9 +18,8 @@ import org.apache.fop.apps.FOPException;
  */
 public class TableCaption extends ToBeImplementedElement {
 
-    public TableCaption(FObj parent) {
+    public TableCaption(FONode parent) {
         super(parent);
-        this.name = "fo:table-caption";
     }
 
     public Status layout(Area area) throws FOPException {
index 87fc89fef300f10a58291349d535a320e1ca0e75..98913d3e850e79b65b70faf065994fff25985c4e 100644 (file)
@@ -86,7 +86,7 @@ public class TableCell extends FObj {
 
     AreaContainer cellArea;
 
-    public TableCell(FObj parent) {
+    public TableCell(FONode parent) {
         super(parent);
         this.name = "fo:table-cell";
     }
index 358fc10a58e4716326097bb6e92f4259b4982f24..f86c107fa48e8d916d87ee2b61e712e3e1c09184 100644 (file)
@@ -28,7 +28,7 @@ public class TableColumn extends FObj {
 
     AreaContainer areaContainer;
 
-    public TableColumn(FObj parent) {
+    public TableColumn(FONode parent) {
         super(parent);
         this.name = "fo:table-column";
     }
index f69a47308219e419852ddb4bce2f68e9c6be3590..128d8cc1346a5daee59236ec7eca0921daa493ca 100644 (file)
@@ -24,7 +24,7 @@ public class TableFooter extends TableBody {
         areaContainer.setYPosition(value + 2 * spaceBefore);
     }
 
-    public TableFooter(FObj parent) {
+    public TableFooter(FONode parent) {
         super(parent);
         this.name = "fo:table-footer";
     }
index c103b6da1845ebf5fc74087220d530132c9fd8c8..703abc31f29f3d5754d8dca8293bbf4f7573192a 100644 (file)
@@ -16,7 +16,7 @@ import org.apache.fop.apps.FOPException;
 
 public class TableHeader extends TableBody {
 
-    public TableHeader(FObj parent) {
+    public TableHeader(FONode parent) {
         super(parent);
         this.name = "fo:table-header";
     }
index 316d1d8148ae0ad18af32e556bd81e3f59a86f8c..f4b5b75e6b18b9f9be9492a48fe6b8c0ee422c62 100644 (file)
@@ -160,9 +160,8 @@ public class TableRow extends FObj {
     }
 
 
-    public TableRow(FObj parent) {
+    public TableRow(FONode parent) {
         super(parent);
-        this.name = "fo:table-row";
     }
 
     public void setColumns(Vector columns) {
index 9eb8e56dfa607c0636be2d2ad44516a6d5fb9702..f31e4764e72c5d40f0644f3d3efb69e04494c97d 100644 (file)
@@ -23,15 +23,9 @@ import org.apache.fop.layout.*;
  */
 public class Wrapper extends FObjMixed {
 
-    public Wrapper(FObj parent) {
+    public Wrapper(FONode parent) {
         super(parent);
         // check that this occurs inside an fo:flow
     }
 
-    protected void addCharacters(char data[], int start, int length) {
-        FOText ft = new FOText(data, start, length, this);
-        ft.setLogger(log);
-        children.addElement(ft);
-    }
-
 }
index 26ad3ccb962884e0e30867dad837d97abc6ddf80..a614fe21cc5d4cb0d1f21ac4d5fd0470f240be05 100644 (file)
@@ -23,7 +23,7 @@ public class ConditionalPageMasterReference extends FObj {
     private int oddOrEven;
     private int blankOrNotBlank;
 
-    public ConditionalPageMasterReference(FObj parent) {
+    public ConditionalPageMasterReference(FONode parent) {
         super(parent);
 
         this.name = getElementName();
@@ -132,7 +132,7 @@ public class ConditionalPageMasterReference extends FObj {
     }
 
 
-    protected void validateParent(FObj parent) throws FOPException {
+    protected void validateParent(FONode parent) throws FOPException {
         if (parent.getName().equals("fo:repeatable-page-master-alternatives")) {
             this.repeatablePageMasterAlternatives =
                 (RepeatablePageMasterAlternatives)parent;
index 8ac2e8fc96ca8119176e956d2ed68d741626aaf1..82dfd1801ec3ae6a678801f019dcddbe0755eec6 100644 (file)
@@ -26,9 +26,8 @@ public class LayoutMasterSet extends FObj {
 
     private Root root;
 
-    public LayoutMasterSet(FObj parent) {
+    public LayoutMasterSet(FONode parent) {
         super(parent);
-        this.name = "fo:layout-master-set";
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
index 1c9a2f72251358792f1c0a79273b3610a137f61b..3092429a18d779e6cdbe498a2a18604c9e4e5724 100644 (file)
@@ -15,7 +15,7 @@ import org.xml.sax.Attributes;
 
 /**
  * Base PageMasterReference class. Provides implementation for handling the
- * master-name attribute and containment within a PageSequenceMaster
+ * master-reference attribute and containment within a PageSequenceMaster
  */
 public abstract class PageMasterReference extends FObj
     implements SubSequenceSpecifier {
@@ -23,15 +23,15 @@ public abstract class PageMasterReference extends FObj
     private String _masterName;
     private PageSequenceMaster _pageSequenceMaster;
 
-    public PageMasterReference(FObj parent) {
+    public PageMasterReference(FONode parent) {
         super(parent);
         this.name = getElementName();
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
         super.handleAttrs(attlist);
-        if (getProperty("master-name") != null) {
-            setMasterName(getProperty("master-name").getString());
+        if (getProperty("master-reference") != null) {
+            setMasterName(getProperty("master-reference").getString());
         }
         validateParent(parent);
 
@@ -42,7 +42,7 @@ public abstract class PageMasterReference extends FObj
     }
 
     /**
-     * Returns the "master-name" attribute of this page master reference
+     * Returns the "master-reference" attribute of this page master reference
      */
     public String getMasterName() {
         return _masterName;
@@ -61,9 +61,11 @@ public abstract class PageMasterReference extends FObj
                                              boolean isEmptyPage);
 
     /**
-     * Gets the formating object name for this object. Subclasses must provide this.
+     * Gets the formating object name for this object.
+     * Subclasses must provide this.
      *
-     * @return the element name of this reference. e.g. fo:repeatable-page-master-reference
+     * @return the element name of this reference.
+     * e.g. fo:repeatable-page-master-reference
      */
     protected abstract String getElementName();
 
@@ -71,13 +73,13 @@ public abstract class PageMasterReference extends FObj
      * Checks that the parent is the right element. The default implementation
      * checks for fo:page-sequence-master
      */
-    protected void validateParent(FObj parent) throws FOPException {
+    protected void validateParent(FONode parent) throws FOPException {
         if (parent.getName().equals("fo:page-sequence-master")) {
             _pageSequenceMaster = (PageSequenceMaster)parent;
 
             if (getMasterName() == null) {
                 log.warn("" + getElementName()
-                                       + " does not have a master-name and so is being ignored");
+                                       + " does not have a master-reference and so is being ignored");
             } else {
                 _pageSequenceMaster.addSubsequenceSpecifier(this);
             }
@@ -90,7 +92,4 @@ public abstract class PageMasterReference extends FObj
 
     public abstract void reset();
 
-
-
-
 }
index 67d55212e2016083a01ecef6bab874444fc7bd7d..bcdb40e2844a0a172e09ac27ec9b62670fe7a89d 100644 (file)
@@ -69,7 +69,7 @@ public class PageSequence extends FObj {
     private Hashtable _flowMap;
 
     /**
-     * the "master-name" attribute
+     * the "master-reference" attribute
      */
     private String masterName;
 
@@ -121,9 +121,8 @@ public class PageSequence extends FObj {
     private String currentPageMasterName;
 
 
-    public PageSequence(FObj parent) {
+    public PageSequence(FONode parent) {
         super(parent);
-        this.name = "fo:page-sequence";
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
@@ -166,7 +165,7 @@ public class PageSequence extends FObj {
             }
         }
 
-        masterName = this.properties.get("master-name").getString();
+        masterName = this.properties.get("master-reference").getString();
 
         // get the 'format' properties
         this.pageNumberGenerator =
@@ -517,7 +516,7 @@ public class PageSequence extends FObj {
             SimplePageMaster simpleMaster =
                 this.layoutMasterSet.getSimplePageMaster(pageSequenceName);
             if (simpleMaster == null) {
-                throw new FOPException("'master-name' for 'fo:page-sequence'"
+                throw new FOPException("'master-reference' for 'fo:page-sequence'"
                                        + "matches no 'simple-page-master' or 'page-sequence-master'");
             }
             currentPageMasterName = pageSequenceName;
index 6be32ac1e8b4061b6d78d604ef5eb0e3868f905c..8ffcbb9b1692156cb5e440e5aade7b19fc1c8eb9 100644 (file)
@@ -30,9 +30,8 @@ public class PageSequenceMaster extends FObj {
     // references to page-masters. So the methods use the former
     // terminology ('sub-sequence-specifiers', or SSS),
     // but the actual FO's are MasterReferences.
-    public PageSequenceMaster(FObj parent) {
+    public PageSequenceMaster(FONode parent) {
         super(parent);
-        this.name = "fo:page-sequence-master";
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
index f0c8be4776598812a1dd32da6013a3757bfad9c4..c46745f84c5fcb52b74bd4ca4d30574105b289bc 100644 (file)
@@ -9,6 +9,7 @@ package org.apache.fop.fo.pagination;
 
 // FOP
 import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.layout.RegionArea;
@@ -24,7 +25,7 @@ public abstract class Region extends FObj {
     private SimplePageMaster _layoutMaster;
     private String _regionName;
 
-    protected Region(FObj parent) {
+    protected Region(FONode parent) {
         super(parent);
         this.name = getElementName();
     }
index e57034161bb7e8f977a4b87687a4b942cb0b1538..a1eb587d88972397696275694aa1299f06cae3db 100644 (file)
@@ -23,7 +23,7 @@ public class RegionAfter extends Region {
 
     private int precedence;
 
-    public RegionAfter(FObj parent) {
+    public RegionAfter(FONode parent) {
         super(parent);
     }
 
index 6d96aa36560ae4e9280c8568097471ee7b2ec934..ab275d3f021d9368b68404a9d9cc6c6331f40201 100644 (file)
@@ -23,7 +23,7 @@ public class RegionBefore extends Region {
 
     private int precedence;
 
-    public RegionBefore(FObj parent) {
+    public RegionBefore(FONode parent) {
         super(parent);
     }
 
index 97f55127d6f4942f0cb4fb616f8f4b25cad07ba5..5cf97352c711fb5bfbe1d7c1f8f13f18164b3352 100644 (file)
@@ -9,6 +9,7 @@ package org.apache.fop.fo.pagination;
 
 // FOP
 import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.PropertyList;
 import org.apache.fop.fo.properties.Overflow;
 import org.apache.fop.datatypes.ColorType;
@@ -25,7 +26,7 @@ public class RegionBody extends Region {
 
     ColorType backgroundColor;
 
-    public RegionBody(FObj parent) {
+    public RegionBody(FONode parent) {
         super(parent);
     }
 
index b1fecf325a68d7002c10f0498099b4b550036148..5a077a86b3e7789ad22e7fc0a476e700d6572c94 100644 (file)
@@ -20,7 +20,7 @@ public class RegionEnd extends Region {
     public static final String REGION_CLASS = "end";
 
 
-    public RegionEnd(FObj parent) {
+    public RegionEnd(FONode parent) {
         super(parent);
     }
 
index bbd262df380fbd69cfbfe36cf7cea729cfe3e4d2..a4ef1df5a0c907657eae07fd6a699765af6a69e9 100644 (file)
@@ -20,7 +20,7 @@ public class RegionStart extends Region {
     public static final String REGION_CLASS = "start";
 
 
-    public RegionStart(FObj parent) {
+    public RegionStart(FONode parent) {
         super(parent);
     }
 
index 3a6dd83bf19f3ca5e91345e4da0b63db34d22c88..de211a05f7b65ce439a49ab027eb95497b16d18d 100644 (file)
@@ -31,9 +31,8 @@ public class RepeatablePageMasterAlternatives extends FObj
 
     private Vector conditionalPageMasterRefs;
 
-    public RepeatablePageMasterAlternatives(FObj parent) {
+    public RepeatablePageMasterAlternatives(FONode parent) {
         super(parent);
-        this.name = "fo:repeatable-page-master-alternatives";
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
index 521fd02c90d79be45d5a7ef969db0822297ff336..77ae633677242921d5e27f53c5057b9682f244a3 100644 (file)
@@ -22,7 +22,7 @@ public class RepeatablePageMasterReference extends PageMasterReference
     private int maximumRepeats;
     private int numberConsumed = 0;
 
-    public RepeatablePageMasterReference(FObj parent) {
+    public RepeatablePageMasterReference(FONode parent) {
         super(parent);
     }
 
index 4a16a7fd15239a7c17df1432ee30e374b84d5d06..197bb54bc8c4a3a940d09a4a060835807ea5b522 100644 (file)
@@ -33,7 +33,7 @@ public class Root extends FObj {
      */
     private int runningPageNumberCounter = 0;
 
-    public Root(FObj parent) {
+    public Root(FONode parent) {
         super(parent);
 
         // this.properties.get("media-usage");
@@ -53,13 +53,6 @@ public class Root extends FObj {
         this.runningPageNumberCounter = count;
     }
 
-    /**
-     * @deprecated handled by addChild now
-     */
-    public void addPageSequence(PageSequence pageSequence) {
-        this.pageSequences.addElement(pageSequence);
-    }
-
     public int getPageSequenceCount() {
         return pageSequences.size();
     }
index d50194889ba57095ad55a271fdfdfdcd175add4a..853aaada9e06bbd8e44bc8094d6807b2b4e43fdd 100644 (file)
@@ -37,9 +37,8 @@ public class SimplePageMaster extends FObj {
     boolean afterPrecedence;
     int afterHeight;
 
-    public SimplePageMaster(FObj parent) {
+    public SimplePageMaster(FONode parent) {
         super(parent);
-        this.name = "fo:simple-page-master";
     }
 
     public void handleAttrs(Attributes attlist) throws FOPException {
index c22afb672f07c51a8f18f01f3ae323db646d149e..39dfe0bb234f59509e334620df6d9d0088f43808 100644 (file)
@@ -17,7 +17,7 @@ public class SinglePageMasterReference extends PageMasterReference
 
     private int state;
 
-    public SinglePageMasterReference(FObj parent) {
+    public SinglePageMasterReference(FONode parent) {
         super(parent);
         this.state = FIRST;
     }
index 149f7829042797c40a8a03c219017265eeb64584..4ecdb72897a2798892a55af9d4c19d8e84577ca2 100644 (file)
@@ -7,9 +7,9 @@
 
 package org.apache.fop.fonts;
 import java.io.*;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
+import java.util.Iterator;
+import java.util.HashMap;
+import java.util.ArrayList;
 import org.apache.fop.messaging.MessageHandler;
 
 /**
@@ -300,7 +300,7 @@ public class TTFSubSetFile extends TTFFile {
      * Create the glyf table and fill in loca table
      */
     private void createGlyf(FontFileReader in,
-                            Hashtable glyphs) throws IOException {
+                            HashMap glyphs) throws IOException {
         TTFDirTabEntry entry = (TTFDirTabEntry)dirTabs.get("glyf");
         int size = 0;
         int start = 0;
@@ -309,9 +309,9 @@ public class TTFSubSetFile extends TTFFile {
             pad4();
             start = currentPos;
 
-            for (Enumeration e = glyphs.keys(); e.hasMoreElements(); ) {
+            for (Iterator e = glyphs.keySet().iterator(); e.hasNext(); ) {
                 int glyphLength = 0;
-                Integer origIndex = (Integer)e.nextElement();
+                Integer origIndex = (Integer)e.next();
                 Integer subsetIndex = (Integer)glyphs.get(origIndex);
 
                 int nextOffset = 0;
@@ -367,7 +367,7 @@ public class TTFSubSetFile extends TTFFile {
      * metric (key) to the subset metric (value)
      */
     private void createHmtx(FontFileReader in,
-                            Hashtable glyphs) throws IOException {
+                            HashMap glyphs) throws IOException {
         TTFDirTabEntry entry = (TTFDirTabEntry)dirTabs.get("hmtx");
 
         int longHorMetricSize = glyphs.size() * 2;
@@ -377,8 +377,8 @@ public class TTFSubSetFile extends TTFFile {
         if (entry != null) {
             pad4();
             int offset = (int)entry.offset;
-            for (Enumeration e = glyphs.keys(); e.hasMoreElements(); ) {
-                Integer origIndex = (Integer)e.nextElement();
+            for (Iterator e = glyphs.keySet().iterator(); e.hasNext(); ) {
+                Integer origIndex = (Integer)e.next();
                 Integer subsetIndex = (Integer)glyphs.get(origIndex);
 
                 writeUShort(currentPos + subsetIndex.intValue() * 4,
@@ -399,13 +399,13 @@ public class TTFSubSetFile extends TTFFile {
     }
 
     /**
-     * Returns a Vector containing the glyph itself plus all glyphs
+     * Returns a List containing the glyph itself plus all glyphs
      * that this composite glyph uses
      */
-    private Vector getIncludedGlyphs(FontFileReader in, int glyphOffset,
+    private ArrayList getIncludedGlyphs(FontFileReader in, int glyphOffset,
                                      Integer glyphIdx) throws IOException {
-        Vector ret = new Vector();
-        ret.addElement(glyphIdx);
+        ArrayList ret = new ArrayList();
+        ret.add(glyphIdx);
         int offset = glyphOffset + (int)mtx_tab[glyphIdx.intValue()].offset
                      + 10;
         Integer compositeIdx = null;
@@ -414,7 +414,7 @@ public class TTFSubSetFile extends TTFFile {
         while (moreComposites) {
             flags = in.readTTFUShort(offset);
             compositeIdx = new Integer(in.readTTFUShort(offset + 2));
-            ret.addElement(compositeIdx);
+            ret.add(compositeIdx);
 
             offset += 4;
             if ((flags & 1) > 0) {
@@ -445,7 +445,7 @@ public class TTFSubSetFile extends TTFFile {
      * Rewrite all compositepointers in glyphindex glyphIdx
      *
      */
-    private void remapComposite(FontFileReader in, Hashtable glyphs,
+    private void remapComposite(FontFileReader in, HashMap glyphs,
                                 int glyphOffset,
                                 Integer glyphIdx) throws IOException {
         int offset = glyphOffset + (int)mtx_tab[glyphIdx.intValue()].offset
@@ -503,36 +503,36 @@ public class TTFSubSetFile extends TTFFile {
      * mapping
      */
     private void scanGlyphs(FontFileReader in,
-                            Hashtable glyphs) throws IOException {
+                            HashMap glyphs) throws IOException {
         TTFDirTabEntry entry = (TTFDirTabEntry)dirTabs.get("glyf");
-        Hashtable newComposites = null;
-        Hashtable allComposites = new Hashtable();
+        HashMap newComposites = null;
+        HashMap allComposites = new HashMap();
 
         int newIndex = glyphs.size();
 
         if (entry != null) {
             while (newComposites == null || newComposites.size() > 0) {
                 // Inefficient to iterate through all glyphs
-                newComposites = new Hashtable();
+                newComposites = new HashMap();
 
-                for (Enumeration e = glyphs.keys(); e.hasMoreElements(); ) {
-                    Integer origIndex = (Integer)e.nextElement();
+                for (Iterator e = glyphs.keySet().iterator(); e.hasNext(); ) {
+                    Integer origIndex = (Integer)e.next();
 
                     if (in.readTTFShort(entry.offset
                                         + mtx_tab[origIndex.intValue()].offset) < 0) {
                         // origIndex is a composite glyph
                         allComposites.put(origIndex, glyphs.get(origIndex));
-                        Vector composites =
+                        ArrayList composites =
                             getIncludedGlyphs(in, (int)entry.offset,
                                               origIndex);
 
                         // Iterate through all composites pointed to
                         // by this composite and check if they exists
                         // in the glyphs map, add them if not.
-                        for (Enumeration cps = composites.elements();
-                                cps.hasMoreElements(); ) {
+                        for (Iterator cps = composites.iterator();
+                                cps.hasNext(); ) {
 
-                            Integer cIdx = (Integer)cps.nextElement();
+                            Integer cIdx = (Integer)cps.next();
                             if (glyphs.get(cIdx) == null
                                     && newComposites.get(cIdx) == null) {
                                 newComposites.put(cIdx,
@@ -544,19 +544,19 @@ public class TTFSubSetFile extends TTFFile {
                 }
 
                 // Add composites to glyphs
-                for (Enumeration m = newComposites.keys();
-                        m.hasMoreElements(); ) {
-                    Integer im = (Integer)m.nextElement();
+                for (Iterator m = newComposites.keySet().iterator();
+                        m.hasNext(); ) {
+                    Integer im = (Integer)m.next();
                     glyphs.put(im, newComposites.get(im));
                 }
             }
 
             // Iterate through all composites to remap their composite index
 
-            for (Enumeration ce = allComposites.keys();
-                    ce.hasMoreElements(); ) {
+            for (Iterator ce = allComposites.keySet().iterator();
+                    ce.hasNext(); ) {
                 remapComposite(in, glyphs, (int)entry.offset,
-                               (Integer)ce.nextElement());
+                               (Integer)ce.next());
             }
 
         } else {
@@ -572,7 +572,7 @@ public class TTFSubSetFile extends TTFFile {
      */
 
     public byte[] readFont(FontFileReader in, String name,
-                           Hashtable glyphs) throws IOException {
+                           HashMap glyphs) throws IOException {
 
         /*
          * Check if TrueType collection, and that the name
index 4e1ea97e660c661d17e47b9cf0248f468496ad4c..cd777f2e22384db3f73ae0a7c0db3308941e1859 100644 (file)
@@ -66,7 +66,7 @@ public class FopImageFactory {
             try {
                 absoluteURL = new URL(href);
             } catch (MalformedURLException mue) {
-                // if the href contains onl a path then file is assumed
+                // if the href contains only a path then file is assumed
                 absoluteURL = new URL("file:" + href);
             }
             imgIS = absoluteURL.openStream();
index c5d46dc87c63398f42a918c22533a98c863ab515..311e1769a1b42c99b72ad5bd5d8a3a1dfef8f477 100644 (file)
@@ -88,8 +88,5 @@ public class ImageArea extends InlineArea {
         xOffset = startIndent;
     }
 
-
-
 }
 
-
index 513eaacd591df55dbd8b428ac38e6a8ac2aafee4..fb818631b659c90e1c8db30a533db491f5601da8 100644 (file)
@@ -20,7 +20,7 @@ public interface FontDescriptor {
     public int getStemV();
 
     public boolean hasKerningInfo();
-    public java.util.Hashtable getKerningInfo();
+    public java.util.HashMap getKerningInfo();
     public boolean isEmbeddable();
     public byte getSubType();
     public org.apache.fop.pdf.PDFStream getFontFile(int objNum);
index 498db1000c141487bb7b432226079b954ddc5262..16264d6a1fb02740e2bf42f69e2dd9cd39376417 100644 (file)
@@ -7,7 +7,7 @@
 
 package org.apache.fop.layout;
 
-import java.util.Hashtable;
+import java.util.HashMap;
 
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.fo.properties.FontVariant;
@@ -24,7 +24,7 @@ public class FontState {
 
     private FontMetric _metric;
 
-    private static Hashtable EMPTY_HASHTABLE = new Hashtable();
+    private static HashMap EMPTY_HASHTABLE = new HashMap();
 
 
     public FontState(FontInfo fontInfo, String fontFamily, String fontStyle,
@@ -84,9 +84,9 @@ public class FontState {
         return _metric.getXHeight(_fontSize) / 1000;
     }
 
-    public Hashtable getKerning() {
+    public HashMap getKerning() {
         if (_metric instanceof FontDescriptor) {
-            Hashtable ret = ((FontDescriptor)_metric).getKerningInfo();
+            HashMap ret = ((FontDescriptor)_metric).getKerningInfo();
             if (ret != null)
                 return ret;
         }
index d2c0f16bfea07f4cd9c0f2787cb2e34f82096dd6..380b4b67e02f3ab22b94ae95b0a15cc48d50f35f 100644 (file)
@@ -8,8 +8,8 @@
 package org.apache.fop.layout.hyphenation;
 
 import java.io.*;
-import java.util.Vector;
-import java.util.Hashtable;
+import java.util.ArrayList;
+import java.util.HashMap;
 
 /**
  * This tree structure stores the hyphenation patterns in an efficient
@@ -29,7 +29,7 @@ public class HyphenationTree extends TernaryTree implements PatternConsumer,
     /**
      * This map stores hyphenation exceptions
      */
-    protected Hashtable stoplist;
+    protected HashMap stoplist;
 
     /**
      * This map stores the character classes
@@ -42,7 +42,7 @@ public class HyphenationTree extends TernaryTree implements PatternConsumer,
     private transient TernaryTree ivalues;
 
     public HyphenationTree() {
-        stoplist = new Hashtable(23);    // usually a small table
+        stoplist = new HashMap(23);    // usually a small table
         classmap = new TernaryTree();
         vspace = new ByteVector();
         vspace.alloc(1);    // this reserves index 0, which we don't use
@@ -282,10 +282,10 @@ public class HyphenationTree extends TernaryTree implements PatternConsumer,
         String sw = new String(word, 1, len);
         if (stoplist.containsKey(sw)) {
             // assume only simple hyphens (Hyphen.pre="-", Hyphen.post = Hyphen.no = null)
-            Vector hw = (Vector)stoplist.get(sw);
+            ArrayList hw = (ArrayList)stoplist.get(sw);
             int j = 0;
             for (i = 0; i < hw.size(); i++) {
-                Object o = hw.elementAt(i);
+                Object o = hw.get(i);
                 if (o instanceof String) {
                     j += ((String)o).length();
                     if (j >= remainCharCount && j < (len - pushCharCount))
@@ -354,7 +354,7 @@ public class HyphenationTree extends TernaryTree implements PatternConsumer,
      * @param hyphenatedword a vector of alternating strings and
      * {@link Hyphen hyphen} objects.
      */
-    public void addException(String word, Vector hyphenatedword) {
+    public void addException(String word, ArrayList hyphenatedword) {
         stoplist.put(word, hyphenatedword);
     }
 
index 2eacd16a7f4b50868cc8688e2d10baecb32f2690..025d82b0f206dc7e579b6abcc75d6c7aa531a119 100644 (file)
@@ -7,7 +7,7 @@
 
 package org.apache.fop.layout.hyphenation;
 
-import java.util.Vector;
+import java.util.ArrayList;
 
 /**
  * This interface is used to connect the XML pattern file parser to
@@ -32,7 +32,7 @@ public interface PatternConsumer {
      * A hyphenatedword is a vector of alternating String's and
      * {@link Hyphen Hyphen} instances
      */
-    public void addException(String word, Vector hyphenatedword);
+    public void addException(String word, ArrayList hyphenatedword);
 
     /**
      * Add hyphenation patterns.
index 76d0d36f761479e6cfb2ff7b3a6b5a3c45d525da..6581b7216228f9550060b2d2de18cbfccd325030 100644 (file)
@@ -22,7 +22,7 @@ import java.io.FileWriter;
 import java.io.PrintWriter;
 import java.io.IOException;
 import java.io.FileNotFoundException;
-import java.util.Vector;
+import java.util.ArrayList;
 import java.net.URL;
 
 /**
@@ -37,7 +37,7 @@ public class PatternParser extends DefaultHandler implements PatternConsumer {
     int currElement;
     PatternConsumer consumer;
     StringBuffer token;
-    Vector exception;
+    ArrayList exception;
     char hyphenChar;
     String errMsg;
 
@@ -183,10 +183,10 @@ public class PatternParser extends DefaultHandler implements PatternConsumer {
         return pat.toString();
     }
 
-    protected Vector normalizeException(Vector ex) {
-        Vector res = new Vector();
+    protected ArrayList normalizeException(ArrayList ex) {
+        ArrayList res = new ArrayList();
         for (int i = 0; i < ex.size(); i++) {
-            Object item = ex.elementAt(i);
+            Object item = ex.get(i);
             if (item instanceof String) {
                 String str = (String)item;
                 StringBuffer buf = new StringBuffer();
@@ -195,27 +195,27 @@ public class PatternParser extends DefaultHandler implements PatternConsumer {
                     if (c != hyphenChar)
                         buf.append(c);
                     else {
-                        res.addElement(buf.toString());
+                        res.add(buf.toString());
                         buf.setLength(0);
                         char[] h = new char[1];
                         h[0] = hyphenChar;
                         // we use here hyphenChar which is not necessarily
                         // the one to be printed
-                        res.addElement(new Hyphen(new String(h), null, null));
+                        res.add(new Hyphen(new String(h), null, null));
                     }
                 }
                 if (buf.length() > 0)
-                    res.addElement(buf.toString());
+                    res.add(buf.toString());
             } else
-                res.addElement(item);
+                res.add(item);
         }
         return res;
     }
 
-    protected String getExceptionWord(Vector ex) {
+    protected String getExceptionWord(ArrayList ex) {
         StringBuffer res = new StringBuffer();
         for (int i = 0; i < ex.size(); i++) {
-            Object item = ex.elementAt(i);
+            Object item = ex.get(i);
             if (item instanceof String)
                 res.append((String)item);
             else {
@@ -260,12 +260,12 @@ public class PatternParser extends DefaultHandler implements PatternConsumer {
             currElement = ELEM_PATTERNS;
         else if (local.equals("exceptions")) {
             currElement = ELEM_EXCEPTIONS;
-            exception = new Vector();
+            exception = new ArrayList();
         } else if (local.equals("hyphen")) {
             if (token.length() > 0) {
-                exception.addElement(token.toString());
+                exception.add(token.toString());
             }
-            exception.addElement(new Hyphen(attrs.getValue("pre"),
+            exception.add(new Hyphen(attrs.getValue("pre"),
                                             attrs.getValue("no"),
                                             attrs.getValue("post")));
             currElement = ELEM_HYPHEN;
@@ -282,10 +282,10 @@ public class PatternParser extends DefaultHandler implements PatternConsumer {
                 consumer.addClass(word);
                 break;
             case ELEM_EXCEPTIONS:
-                exception.addElement(word);
+                exception.add(word);
                 exception = normalizeException(exception);
                 consumer.addException(getExceptionWord(exception),
-                                      (Vector)exception.clone());
+                                      (ArrayList)exception.clone());
                 break;
             case ELEM_PATTERNS:
                 consumer.addPattern(getPattern(word),
@@ -319,11 +319,11 @@ public class PatternParser extends DefaultHandler implements PatternConsumer {
                 consumer.addClass(word);
                 break;
             case ELEM_EXCEPTIONS:
-                exception.addElement(word);
+                exception.add(word);
                 exception = normalizeException(exception);
                 consumer.addException(getExceptionWord(exception),
-                                      (Vector)exception.clone());
-                exception.removeAllElements();
+                                      (ArrayList)exception.clone());
+                exception.clear();
                 break;
             case ELEM_PATTERNS:
                 consumer.addPattern(getPattern(word),
@@ -391,7 +391,7 @@ public class PatternParser extends DefaultHandler implements PatternConsumer {
         System.out.println("class: " + c);
     }
 
-    public void addException(String w, Vector e) {
+    public void addException(String w, ArrayList e) {
         System.out.println("exception: " + w + " : " + e.toString());
     }
 
index deed898ac66870a5fcddf9ef5550d3657bc65858..66a43d999f7df1cda30fdb8b294927e23c51ae93 100644 (file)
@@ -72,7 +72,6 @@ public class PDFNumber {
     }
 
     public static String doubleOut(double doubleDown, int dec) {
-
         StringBuffer p = new StringBuffer();
         if (doubleDown < 0) {
             doubleDown = -doubleDown;
index 4035fc2ebb45ca3d88597410db243735c18d9eb7..a2f3c91bbbd5a65e2ae6390ddec629ce024db019 100644 (file)
@@ -10,7 +10,7 @@ package org.apache.fop.pdf;
 // Java
 import java.io.PrintWriter;
 import org.apache.fop.messaging.MessageHandler;
-import java.util.Vector;
+import java.util.ArrayList;
 
 /**
  * class representing a /Pages object.
@@ -24,7 +24,7 @@ public class PDFPages extends PDFObject {
     /**
      * the /Page objects
      */
-    protected Vector kids = new Vector();
+    protected ArrayList kids = new ArrayList();
 
     /**
      * the number of /Page objects
@@ -53,7 +53,7 @@ public class PDFPages extends PDFObject {
      * @param page the PDFPage to add.
      */
     public void addPage(PDFPage page) {
-        this.kids.addElement(page.referencePDF());
+        this.kids.add(page.referencePDF());
         page.setParent(this);
         this.incrementCount();
     }
@@ -85,7 +85,7 @@ public class PDFPages extends PDFObject {
                                           + " obj\n<< /Type /Pages\n/Count "
                                           + this.getCount() + "\n/Kids [");
         for (int i = 0; i < kids.size(); i++) {
-            p = p.append(kids.elementAt(i) + " ");
+            p = p.append(kids.get(i) + " ");
         }
         p = p.append("] >>\nendobj\n");
         return p.toString().getBytes();
index add7d7aebd67ab524e1e450ddc34a56224072e6e..ddc66993dd78b66b49f9e88161b9c028d7a80397 100644 (file)
@@ -11,6 +11,9 @@ import java.awt.Shape;
 import java.util.ArrayList;
 import java.util.HashMap;
 
+import java.awt.Color;
+import java.awt.Paint;
+
 /**
  * This keeps information about the current state when writing to pdf.
  * It allows for creating new graphics states with the q operator.
@@ -29,8 +32,8 @@ import java.util.HashMap;
 public class PDFState {
     private final static String COLOR = "color";
     private final static String BACKCOLOR = "backcolor";
-    private final static String PATTERN = "pattern";
-    private final static String BACKPATTERN = "backpattern";
+    private final static String PAINT = "paint";
+    private final static String BACKPAINT = "backpaint";
     private final static String LINECAP = "lineCap";
     private final static String LINEJOIN = "lineJoin";
     private final static String LINEWIDTH = "lineWidth";
@@ -43,10 +46,10 @@ public class PDFState {
     private final static String FONTNAME = "fontName";
     private final static String CLIP = "clip";
 
-    PDFColor color = new PDFColor(0, 0, 0);
-    PDFColor backcolor = new PDFColor(255, 255, 255);
-    PDFPattern pattern = null;
-    PDFPattern backPattern = null;
+    Color color = Color.black;
+    Color backcolor = Color.white;
+    Paint paint = null;
+    Paint backPaint = null;
     int lineCap = 0;
     int lineJoin = 0;
     float lineWidth = 1;
@@ -68,13 +71,45 @@ public class PDFState {
     // this call should be used when the q operator is used
     // so that the state is known when popped
     public void push() {
-        HashMap changedMap = new HashMap();
+        HashMap saveMap = new HashMap();
+        saveMap.put(COLOR, color);
+        saveMap.put(BACKCOLOR, backcolor);
+        saveMap.put(PAINT, paint);
+        saveMap.put(BACKPAINT, backPaint);
+        saveMap.put(LINECAP, new Integer(lineCap));
+        saveMap.put(LINEJOIN, new Integer(lineJoin));
+        saveMap.put(LINEWIDTH, new Float(lineWidth));
+        saveMap.put(MITERLIMIT, new Float(miterLimit));
+        saveMap.put(TEXT, new Boolean(text));
+        saveMap.put(DASHOFFSET, new Integer(dashOffset));
+        saveMap.put(DASHARRAY, dashArray);
+        saveMap.put(TRANSFORM, transform);
+        saveMap.put(FONTSIZE, new Float(fontSize));
+        saveMap.put(FONTNAME, fontName);
+        saveMap.put(CLIP, clip);
 
+        stateStack.add(saveMap);
     }
 
     public void pop() {
         if (getStackLevel() > 0) {
+            HashMap saveMap = (HashMap)stateStack.get(stateStack.size() - 1);
             stateStack.remove(stateStack.size() - 1);
+            color = (Color)saveMap.get(COLOR);
+            backcolor = (Color)saveMap.get(BACKCOLOR);
+            paint = (Paint)saveMap.get(PAINT);
+            backPaint = (Paint)saveMap.get(BACKPAINT);
+            lineCap = ((Integer)saveMap.get(LINECAP)).intValue();
+            lineJoin = ((Integer)saveMap.get(LINEJOIN)).intValue();
+            lineWidth = ((Float)saveMap.get(LINEWIDTH)).floatValue();
+            miterLimit = ((Float)saveMap.get(MITERLIMIT)).floatValue();
+            text = ((Boolean)saveMap.get(TEXT)).booleanValue();
+            dashOffset = ((Integer)saveMap.get(DASHOFFSET)).intValue();
+            dashArray = (int[])saveMap.get(DASHARRAY);
+            transform = (double[])saveMap.get(TRANSFORM);
+            fontSize = ((Float)saveMap.get(FONTSIZE)).floatValue();
+            fontName = (String)saveMap.get(FONTNAME);
+            clip = (Shape)saveMap.get(CLIP);
         }
     }
 
@@ -86,5 +121,61 @@ public class PDFState {
         return false;
     }
 
+    public boolean setColor(Color col) {
+        if(!col.equals(color)) {
+            color = col;
+            return true;
+        }
+        return false;
+    }
+
+    public boolean setBackColor(Color col) {
+        if(!col.equals(backcolor)) {
+            backcolor = col;
+            return true;
+        }
+        return false;
+    }
+
+    public boolean setPaint(Paint p) {
+        if(paint == null) {
+            if(p != null) {
+                paint = p;
+                return true;
+            }
+        } else if(!paint.equals(p)) {
+            paint = p;
+            return true;
+        }
+        return false;
+    }
+
+    public boolean checkClip(Shape cl) {
+        if(clip == null) {
+            if(cl != null) {
+                return true;
+            }
+        } else if(!clip.equals(cl)) {
+            return true;
+        }
+        return false;
+    }
+
+    public void setClip(Shape cl) {
+        clip = cl;
+    }
+
+    public boolean checkTransform(double[] vals) {
+        for(int count = 0; count < transform.length; count++) {
+            if(transform[count] != vals[count]) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public void setTransform(double[] vals) {
+        transform = vals;
+    }
 }
 
index 33a79fe8bb73b8cafc849c75c3e3f9f4ff4cc661..c88493ca238bea374a8c648c8003b08752eff2d7 100644 (file)
@@ -8,7 +8,6 @@
 package org.apache.fop.render.awt;
 
 // FOP
-import org.apache.fop.messaging.MessageHandler;
 import org.apache.fop.layout.FontInfo;
 import org.apache.fop.layout.FontDescriptor;
 import org.apache.fop.layout.FontState;
@@ -37,7 +36,6 @@ import java.awt.font.TextLayout;
  * Since FontState and FontInfo multiply all factors by
  * size, we assume a "standard" font of FONT_SIZE.
  */
-
 public class AWTFontMetrics {
 
     /**
index 33d7ffe7ec1993c32effacf639837beaca405e82..83ea71e8bb472bd980895fa8e9e2158d9dd61d91 100644 (file)
@@ -9,7 +9,6 @@ package org.apache.fop.render.pdf;
 
 // FOP
 import org.apache.fop.render.pdf.fonts.*;
-import org.apache.fop.messaging.MessageHandler;
 import org.apache.fop.layout.FontInfo;
 import org.apache.fop.layout.FontDescriptor;
 import org.apache.fop.pdf.PDFDocument;
@@ -39,7 +38,6 @@ public class FontSetup {
      * @param fontInfo the font info object to set up
      */
     public static void setup(FontInfo fontInfo) {
-        MessageHandler.logln("setting up fonts");
 
         fontInfo.addMetrics("F1", new Helvetica());
         fontInfo.addMetrics("F2", new HelveticaOblique());
@@ -178,9 +176,9 @@ public class FontSetup {
                     }
                 }
             } catch (Exception ex) {
-                MessageHandler.error("Failed to read font metrics file "
-                                     + configFontInfo.getMetricsFile()
-                                     + " : " + ex.getMessage());
+                //MessageHandler.error("Failed to read font metrics file "
+                //                     + configFontInfo.getMetricsFile()
+                //                     + " : " + ex.getMessage());
             }
         }
     }
index e9fc2caee75e45f264eb199acdbdb96e346941ff..062d03f83ce8a4aaced555dc1d3a836e78dc214a 100644 (file)
@@ -11,7 +11,7 @@ import org.apache.fop.render.pdf.Font;
 import org.apache.fop.layout.FontDescriptor;
 import org.apache.fop.pdf.PDFStream;
 import org.apache.fop.messaging.MessageHandler;
-import java.util.Hashtable;
+import java.util.HashMap;
 
 import org.apache.fop.render.pdf.FontReader;
 
@@ -158,7 +158,7 @@ public class LazyFont extends Font implements FontDescriptor {
         return realFontDescriptor.hasKerningInfo();
     }
     
-    public Hashtable getKerningInfo(){
+    public HashMap getKerningInfo(){
         load();
         return realFontDescriptor.getKerningInfo();
     }
index 7a667d79b87a5cbeba28dd25613774a9559a3f77..4f8769fc24e5211461d8e337bdb997bf15423df4 100644 (file)
@@ -24,7 +24,7 @@ import java.io.IOException;
 import java.io.FileInputStream;
 import java.io.File;
 import java.io.BufferedInputStream;
-import java.util.Hashtable;
+import java.util.HashMap;
 
 /**
  * Generic MultiByte (CID) font
@@ -53,7 +53,7 @@ public class MultiByteFont extends CIDFont implements FontDescriptor {
     public int defaultWidth = 0;
     public byte cidType = PDFCIDFont.CID_TYPE2;
 
-    public Hashtable kerning = new Hashtable();
+    public HashMap kerning = new HashMap();
     public boolean useKerning = true;
     private String namePrefix = null;    // Quasi unique prefix
     private static int uniqueCounter = 1;
@@ -66,12 +66,12 @@ public class MultiByteFont extends CIDFont implements FontDescriptor {
     /**
      * usedGlyphs contains orginal, new glyph index
      */
-    private Hashtable usedGlyphs = new Hashtable();
+    private HashMap usedGlyphs = new HashMap();
 
     /**
      * usedGlyphsIndex contains new glyph, original index
      */
-    private Hashtable usedGlyphsIndex = new Hashtable();
+    private HashMap usedGlyphsIndex = new HashMap();
     int usedGlyphsCount = 0;
 
     public MultiByteFont() {
@@ -99,11 +99,11 @@ public class MultiByteFont extends CIDFont implements FontDescriptor {
         return (useKerning & kerning.isEmpty());
     }
 
-    public final java.util.Hashtable getKerningInfo() {
+    public final java.util.HashMap getKerningInfo() {
         if (useKerning)
             return kerning;
         else
-            return new Hashtable();
+            return new HashMap();
     }
 
     public byte getSubType() {
index e780594f02f4153e9ac4f86e5c7680a7dfe3a5d7..7200b92f7d2f84ee65d73dac750a784fd2b16b28 100644 (file)
@@ -16,7 +16,7 @@ import org.apache.fop.pdf.PDFT1Stream;
 import java.io.InputStream;
 import java.io.FileInputStream;
 import java.io.BufferedInputStream;
-import java.util.Hashtable;
+import java.util.HashMap;
 
 /**
  * Generic SingleByte font
@@ -44,7 +44,7 @@ public class SingleByteFont extends Font implements FontDescriptor {
     public int italicAngle = 0;
     public int missingWidth = 0;
 
-    public Hashtable kerning = new Hashtable();
+    public HashMap kerning = new HashMap();
     public boolean useKerning = true;
 
     public int width[] = null;
@@ -54,11 +54,11 @@ public class SingleByteFont extends Font implements FontDescriptor {
         return (useKerning & kerning.isEmpty());
     }
 
-    public final java.util.Hashtable getKerningInfo() {
+    public final java.util.HashMap getKerningInfo() {
         if (useKerning)
             return kerning;
         else
-            return new Hashtable();
+            return new HashMap();
     }
 
     public byte getSubType() {
index e0a35fd36e66a07f40448db3841625615a06d204..1f7976cb449fedb3506b96d67876add7a5f9d5c0 100644 (file)
@@ -77,6 +77,8 @@ public class XMLRenderer extends AbstractRenderer {
 
     public void setUserAgent(FOUserAgent agent) {
         super.setUserAgent(agent);
+
+        //
         //userAgent.addExtensionHandler();
         XMLHandler handler = new XMLXMLHandler();
         userAgent.setDefaultXMLHandler(mimeType, handler);
index a1ffe980d649214f56b395577a7fbc067a3e3028..5c65c8eb0e5c9d1d375ba1daeb623532eaad07ca 100644 (file)
@@ -45,21 +45,19 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D {
 
     /**
      * Create a new PDFDocumentGraphics2D.
-     * This is used to create a new pdf document of the given height
-     * and width.
+     * This is used to create a new pdf document, the height,
+     * width and output stream can be setup later.
+     * For use by the transcoder which needs font information
+     * for the bridge before the document size is known.
      * The resulting document is written to the stream after rendering.
      *
      * @param textAsShapes set this to true so that text will be rendered
      * using curves and not the font.
-     * @param stream the stream that the final document should be written to.
-     * @param width the width of the document
-     * @param height the height of the document
      */
-    public PDFDocumentGraphics2D(boolean textAsShapes, OutputStream stream,
-                                 int width, int height) {
+    PDFDocumentGraphics2D(boolean textAsShapes) {
         super(textAsShapes);
-
-        if (!textAsShapes) {
+    
+        if(!textAsShapes) {
             fontInfo = new FontInfo();
             FontSetup.setup(fontInfo);
             try {
@@ -67,21 +65,43 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D {
                                           "normal", 12, 0);
             } catch (FOPException e) {}
         }
+
         standalone = true;
-        this.stream = stream;
         this.pdfDoc = new PDFDocument();
         this.pdfDoc.setProducer("FOP SVG Renderer");
         pdfStream = this.pdfDoc.makeStream();
-        this.width = width;
-        this.height = height;
+
+        graphicsState = new PDFState();
 
         currentFontName = "";
         currentFontSize = 0;
         currentYPosition = 0;
         currentXPosition = 0;
+    }
 
+    void setupDocument(OutputStream stream, int width, int height) {
+        this.width = width;
+        this.height = height;
+        this.stream = stream;
         currentStream.write("1 0 0 -1 0 " + height + " cm\n");
+    }
 
+    /**
+     * Create a new PDFDocumentGraphics2D.
+     * This is used to create a new pdf document of the given height
+     * and width.
+     * The resulting document is written to the stream after rendering.
+     *
+     * @param textAsShapes set this to true so that text will be rendered
+     * using curves and not the font.
+     * @param stream the stream that the final document should be written to.
+     * @param width the width of the document
+     * @param height the height of the document
+     */
+    public PDFDocumentGraphics2D(boolean textAsShapes, OutputStream stream,
+                                 int width, int height) {
+        this(textAsShapes);
+        setupDocument(stream, width, height);
     }
 
     public FontState getFontState() {
@@ -110,7 +130,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D {
      */
     public void setBackgroundColor(Color col) {
         Color c = col;
-        currentColour = new PDFColor(c.getRed(), c.getGreen(), c.getBlue());
+        PDFColor currentColour = new PDFColor(c.getRed(), c.getGreen(), c.getBlue());
         currentStream.write("q\n");
         currentStream.write(currentColour.getColorSpaceOut(true));
 
index 296ef876838521a642e7322fd389886285cecc78..45bc493c192c108a51ae84f9397ec542537b8824 100644 (file)
@@ -32,15 +32,12 @@ import java.io.*;
 
 import java.util.Map;
 import java.util.ArrayList;
-import java.util.Hashtable;
+import java.util.HashMap;
 
 /**
- * This concrete implementation of <tt>AbstractGraphics2D</tt> is a
- * simple help to programmers to get started with their own
- * implementation of <tt>Graphics2D</tt>.
- * <tt>DefaultGraphics2D</tt> implements all the abstract methods
- * is <tt>AbstractGraphics2D</tt> and makes it easy to start
- * implementing a <tt>Graphic2D</tt> piece-meal.
+ * PDF Graphics 2D.
+ * Used for drawing into a pdf document as if it is a graphics object.
+ * This takes a pdf document and draws into it.
  *
  * @author <a href="mailto:keiron@aftexsw.com">Keiron Liddle</a>
  * @version $Id$
@@ -54,6 +51,11 @@ public class PDFGraphics2D extends AbstractGraphics2D {
      */
     protected PDFDocument pdfDoc;
 
+    /**
+     * the current state of the pdf graphics
+     */
+    PDFState graphicsState;
+
     /**
      * the current annotation list to add annotations to
      */
@@ -87,11 +89,6 @@ public class PDFGraphics2D extends AbstractGraphics2D {
      */
     protected int currentXPosition = 0;
 
-    /**
-     * the current colour for use in svg
-     */
-    PDFColor currentColour = new PDFColor(0, 0, 0);
-
     /**
      * Create a new PDFGraphics2D with the given pdf document info.
      * This is used to create a Graphics object for use inside an already
@@ -108,7 +105,7 @@ public class PDFGraphics2D extends AbstractGraphics2D {
         fontState = fs;
     }
 
-    public PDFGraphics2D(boolean textAsShapes) {
+    protected PDFGraphics2D(boolean textAsShapes) {
         super(textAsShapes);
     }
 
@@ -476,7 +473,6 @@ public class PDFGraphics2D extends AbstractGraphics2D {
         fontState = null;
         currentStream = null;
         currentFontName = null;
-        currentColour = null;
     }
 
     /**
@@ -503,50 +499,60 @@ public class PDFGraphics2D extends AbstractGraphics2D {
             return;
         }
 
-        currentStream.write("q\n");
+        AffineTransform trans = getTransform();
+        double[] tranvals = new double[6];
+        trans.getMatrix(tranvals);
+
         Shape imclip = getClip();
-        writeClip(imclip);
+        boolean newClip = graphicsState.checkClip(imclip);
+        boolean newTransform = graphicsState.checkTransform(tranvals);
+
+        if(newClip || newTransform) { 
+            currentStream.write("q\n");
+            graphicsState.push();
+            if(newClip) {
+                writeClip(imclip);
+            }
+            if(newTransform) {
+                currentStream.write(PDFNumber.doubleOut(tranvals[0], 5) + " "
+                            + PDFNumber.doubleOut(tranvals[1], 5) + " "
+                            + PDFNumber.doubleOut(tranvals[2], 5) + " "
+                            + PDFNumber.doubleOut(tranvals[3], 5) + " "
+                            + PDFNumber.doubleOut(tranvals[4], 5) + " "
+                            + PDFNumber.doubleOut(tranvals[5], 5) + " cm\n");
+            }
+        }
         applyColor(c, false);
 
         applyPaint(getPaint(), false);
         applyStroke(getStroke());
 
-        AffineTransform trans = getTransform();
-        double[] tranvals = new double[6];
-        trans.getMatrix(tranvals);
-        currentStream.write(PDFNumber.doubleOut(tranvals[0]) + " "
-                            + PDFNumber.doubleOut(tranvals[1]) + " "
-                            + PDFNumber.doubleOut(tranvals[2]) + " "
-                            + PDFNumber.doubleOut(tranvals[3]) + " "
-                            + PDFNumber.doubleOut(tranvals[4]) + " "
-                            + PDFNumber.doubleOut(tranvals[5]) + " cm\n");
-
         PathIterator iter = s.getPathIterator(new AffineTransform());
         while (!iter.isDone()) {
             double vals[] = new double[6];
             int type = iter.currentSegment(vals);
             switch (type) {
             case PathIterator.SEG_CUBICTO:
-                currentStream.write(PDFNumber.doubleOut(vals[0]) + " "
-                                    + PDFNumber.doubleOut(vals[1]) + " "
-                                    + PDFNumber.doubleOut(vals[2]) + " "
-                                    + PDFNumber.doubleOut(vals[3]) + " "
-                                    + PDFNumber.doubleOut(vals[4]) + " "
-                                    + PDFNumber.doubleOut(vals[5]) + " c\n");
+                currentStream.write(PDFNumber.doubleOut(vals[0], 5) + " "
+                                    + PDFNumber.doubleOut(vals[1], 5) + " "
+                                    + PDFNumber.doubleOut(vals[2], 5) + " "
+                                    + PDFNumber.doubleOut(vals[3], 5) + " "
+                                    + PDFNumber.doubleOut(vals[4], 5) + " "
+                                    + PDFNumber.doubleOut(vals[5], 5) + " c\n");
                 break;
             case PathIterator.SEG_LINETO:
-                currentStream.write(PDFNumber.doubleOut(vals[0]) + " "
-                                    + PDFNumber.doubleOut(vals[1]) + " l\n");
+                currentStream.write(PDFNumber.doubleOut(vals[0], 5) + " "
+                                    + PDFNumber.doubleOut(vals[1], 5) + " l\n");
                 break;
             case PathIterator.SEG_MOVETO:
-                currentStream.write(PDFNumber.doubleOut(vals[0]) + " "
-                                    + PDFNumber.doubleOut(vals[1]) + " m\n");
+                currentStream.write(PDFNumber.doubleOut(vals[0], 5) + " "
+                                    + PDFNumber.doubleOut(vals[1], 5) + " m\n");
                 break;
             case PathIterator.SEG_QUADTO:
-                currentStream.write(PDFNumber.doubleOut(vals[0]) + " "
-                                    + PDFNumber.doubleOut(vals[1]) + " "
-                                    + PDFNumber.doubleOut(vals[2]) + " "
-                                    + PDFNumber.doubleOut(vals[3]) + " y\n");
+                currentStream.write(PDFNumber.doubleOut(vals[0], 5) + " "
+                                    + PDFNumber.doubleOut(vals[1], 5) + " "
+                                    + PDFNumber.doubleOut(vals[2], 5) + " "
+                                    + PDFNumber.doubleOut(vals[3], 5) + " y\n");
                 break;
             case PathIterator.SEG_CLOSE:
                 currentStream.write("h\n");
@@ -557,7 +563,10 @@ public class PDFGraphics2D extends AbstractGraphics2D {
             iter.next();
         }
         doDrawing(false, true, false);
-        currentStream.write("Q\n");
+        if(newClip || newTransform) {
+            currentStream.write("Q\n");
+            graphicsState.pop();
+        }
     }
 
     protected void writeClip(Shape s) {
@@ -608,7 +617,7 @@ public class PDFGraphics2D extends AbstractGraphics2D {
         Color c = col;
         if (c.getColorSpace().getType()
                 == java.awt.color.ColorSpace.TYPE_RGB) {
-            currentColour = new PDFColor(c.getRed(), c.getGreen(),
+            PDFColor currentColour = new PDFColor(c.getRed(), c.getGreen(),
                                          c.getBlue());
             currentStream.write(currentColour.getColorSpaceOut(fill));
         } else if (c.getColorSpace().getType()
@@ -619,7 +628,7 @@ public class PDFGraphics2D extends AbstractGraphics2D {
                 // convert the float elements to doubles for pdf
                 cmyk[i] = cComps[i];
             }
-            currentColour = new PDFColor(cmyk[0], cmyk[1], cmyk[2], cmyk[3]);
+            PDFColor currentColour = new PDFColor(cmyk[0], cmyk[1], cmyk[2], cmyk[3]);
             currentStream.write(currentColour.getColorSpaceOut(fill));
         } else if (c.getColorSpace().getType()
                    == java.awt.color.ColorSpace.TYPE_2CLR) {
@@ -629,8 +638,8 @@ public class PDFGraphics2D extends AbstractGraphics2D {
             for (int i = 0; i < 1; i++) {
                 blackMagenta[i] = cComps[i];
             }
-            // currentColour = new PDFColor(blackMagenta[0], blackMagenta[1]);
-            currentStream.write(currentColour.getColorSpaceOut(fill));
+            //PDFColor  currentColour = new PDFColor(blackMagenta[0], blackMagenta[1]);
+            //currentStream.write(currentColour.getColorSpaceOut(fill));
         } else {
             System.err.println("Color Space not supported by PDFGraphics2D");
         }
@@ -875,7 +884,7 @@ public class PDFGraphics2D extends AbstractGraphics2D {
 
         currentStream.write("BT\n");
 
-        Hashtable kerning = null;
+        HashMap kerning = null;
         boolean kerningAvailable = false;
 
         kerning = fontState.getKerning();
@@ -952,9 +961,9 @@ public class PDFGraphics2D extends AbstractGraphics2D {
     }
 
     private void addKerning(StringWriter buf, Integer ch1, Integer ch2,
-                            Hashtable kerning, String startText,
+                            HashMap kerning, String startText,
                             String endText) {
-        Hashtable kernPair = (Hashtable)kerning.get(ch1);
+        HashMap kernPair = (HashMap)kerning.get(ch1);
 
         if (kernPair != null) {
             Integer width = (Integer)kernPair.get(ch2);
@@ -1086,15 +1095,28 @@ public class PDFGraphics2D extends AbstractGraphics2D {
                 return;
             }
         }
-        currentStream.write("q\n");
         Shape imclip = getClip();
-        writeClip(imclip);
+        boolean newState = graphicsState.checkClip(imclip);
+
+        if(newState) {
+            currentStream.write("q\n");
+            graphicsState.push();
+            writeClip(imclip);
+            graphicsState.setClip(imclip);
+        }
         c = getColor();
-        applyColor(c, true);
+        if(graphicsState.setColor(c)) {
+            applyColor(c, true);
+        }
         c = getBackground();
-        applyColor(c, false);
+        if(graphicsState.setBackColor(c)) {
+            applyColor(c, false);
+        }
 
-        applyPaint(getPaint(), true);
+        Paint paint = getPaint();
+        if(graphicsState.setPaint(paint)) {
+            applyPaint(paint, true);
+        }
 
         PathIterator iter = s.getPathIterator(getTransform());
         while (!iter.isDone()) {
@@ -1102,26 +1124,26 @@ public class PDFGraphics2D extends AbstractGraphics2D {
             int type = iter.currentSegment(vals);
             switch (type) {
             case PathIterator.SEG_CUBICTO:
-                currentStream.write(PDFNumber.doubleOut(vals[0]) + " "
-                                    + PDFNumber.doubleOut(vals[1]) + " "
-                                    + PDFNumber.doubleOut(vals[2]) + " "
-                                    + PDFNumber.doubleOut(vals[3]) + " "
-                                    + PDFNumber.doubleOut(vals[4]) + " "
-                                    + PDFNumber.doubleOut(vals[5]) + " c\n");
+                currentStream.write(PDFNumber.doubleOut(vals[0], 5) + " "
+                                    + PDFNumber.doubleOut(vals[1], 5) + " "
+                                    + PDFNumber.doubleOut(vals[2], 5) + " "
+                                    + PDFNumber.doubleOut(vals[3], 5) + " "
+                                    + PDFNumber.doubleOut(vals[4], 5) + " "
+                                    + PDFNumber.doubleOut(vals[5], 5) + " c\n");
                 break;
             case PathIterator.SEG_LINETO:
-                currentStream.write(PDFNumber.doubleOut(vals[0]) + " "
-                                    + PDFNumber.doubleOut(vals[1]) + " l\n");
+                currentStream.write(PDFNumber.doubleOut(vals[0], 5) + " "
+                                    + PDFNumber.doubleOut(vals[1], 5) + " l\n");
                 break;
             case PathIterator.SEG_MOVETO:
-                currentStream.write(PDFNumber.doubleOut(vals[0]) + " "
-                                    + PDFNumber.doubleOut(vals[1]) + " m\n");
+                currentStream.write(PDFNumber.doubleOut(vals[0], 5) + " "
+                                    + PDFNumber.doubleOut(vals[1], 5) + " m\n");
                 break;
             case PathIterator.SEG_QUADTO:
-                currentStream.write(PDFNumber.doubleOut(vals[0]) + " "
-                                    + PDFNumber.doubleOut(vals[1]) + " "
-                                    + PDFNumber.doubleOut(vals[2]) + " "
-                                    + PDFNumber.doubleOut(vals[3]) + " y\n");
+                currentStream.write(PDFNumber.doubleOut(vals[0], 5) + " "
+                                    + PDFNumber.doubleOut(vals[1], 5) + " "
+                                    + PDFNumber.doubleOut(vals[2], 5) + " "
+                                    + PDFNumber.doubleOut(vals[3], 5) + " y\n");
                 break;
             case PathIterator.SEG_CLOSE:
                 currentStream.write("h\n");
@@ -1133,7 +1155,10 @@ public class PDFGraphics2D extends AbstractGraphics2D {
         }
         doDrawing(true, false,
                   iter.getWindingRule() == PathIterator.WIND_EVEN_ODD);
-        currentStream.write("Q\n");
+        if(newState) {
+            currentStream.write("Q\n");
+            graphicsState.pop();
+        }
     }
 
     protected void doDrawing(boolean fill, boolean stroke, boolean nonzero) {
diff --git a/src/org/apache/fop/svg/PDFTextElementBridge.java b/src/org/apache/fop/svg/PDFTextElementBridge.java
new file mode 100644 (file)
index 0000000..a4a3759
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * $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.svg;
+
+import org.apache.batik.gvt.TextNode;
+import org.apache.batik.bridge.*;
+
+import org.apache.batik.css.CSSOMReadOnlyStyleDeclaration;
+import org.apache.batik.gvt.CompositeGraphicsNode;
+import org.apache.batik.gvt.GraphicsNode;
+
+import org.apache.fop.layout.FontState;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import org.apache.batik.gvt.GraphicsNode;
+
+/**
+ * Bridge class for the &lt;text> element.
+ * This bridge will use the direct text painter if the text
+ * for the element is simple.
+ *
+ * @author <a href="mailto:keiron@aftexsw.com">Keiron Liddle</a>
+ */
+public class PDFTextElementBridge extends SVGTextElementBridge {
+    private PDFTextPainter pdfTextPainter;
+
+    /**
+     * Constructs a new bridge for the &lt;text> element.
+     */
+    public PDFTextElementBridge(FontState fs) {
+        pdfTextPainter = new PDFTextPainter(fs);
+    }
+
+    public GraphicsNode createGraphicsNode(BridgeContext ctx, Element e) {
+        GraphicsNode node = super.createGraphicsNode(ctx, e);
+        if(isSimple(ctx, e, node)) {
+            ((TextNode)node).setTextPainter(getTextPainter());
+        }
+        return node;
+    }
+
+    private PDFTextPainter getTextPainter() {
+        return pdfTextPainter;
+    }
+
+    /**
+     * Check if text element contains simple text.
+     * This checks the children of the text element to determine
+     * if the text is simple. The text is simple if it can be rendered
+     * with basic text drawing algorithms. This means there are no
+     * alternate characters, the font is known and there are no effects
+     * applied to the text.
+     */
+    private boolean isSimple(BridgeContext ctx, Element element, GraphicsNode node) {
+        CSSOMReadOnlyStyleDeclaration cssDecl
+            = CSSUtilities.getComputedStyle(element);
+        UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, element);
+
+        // Font size, in user space units.
+        float fs = TextUtilities.convertFontSize(element, ctx, cssDecl, uctx);
+        if(((int)fs) != fs) {
+            return false;
+        }
+
+        Element nodeElement;
+        for (Node n = element.getFirstChild();
+             n != null;
+             n = n.getNextSibling()) {
+
+            switch (n.getNodeType()) {
+            case Node.ELEMENT_NODE:
+
+                nodeElement = (Element)n;
+
+                if (n.getLocalName().equals(SVG_TSPAN_TAG)
+                    || n.getLocalName().equals(SVG_ALT_GLYPH_TAG)) {
+                    return false;
+                } else if (n.getLocalName().equals(SVG_TEXT_PATH_TAG)) {
+                    return false;
+                } else if (n.getLocalName().equals(SVG_TREF_TAG)) {
+                    return false;
+                }
+                break;
+            case Node.TEXT_NODE:
+            case Node.CDATA_SECTION_NODE:
+            }
+        }
+
+        if(CSSUtilities.convertFilter(element, node, ctx) != null) {
+            return false;
+        }
+
+        return true;
+    }
+}
index 1e55e7bfd3958a0f0021af4b9123495b7dd349ab..dce7d5231dbea68890c1e52e4dce1d0fff87e1b9 100644 (file)
@@ -103,10 +103,10 @@ public class PDFTextPainter implements TextPainter {
                 String name = fam.getFamilyName();
                 if (fi.hasFont(name, weight, style)) {
                     try {
-                        int fsize = (int)size.floatValue();
+                        int fsize = (int)(size.floatValue() * 1000);
                         fontState = new FontState(fontState.getFontInfo(),
                                                   name, style, weight,
-                                                  fsize * 1000, 0);
+                                                  fsize, 0);
                     } catch (org.apache.fop.apps.FOPException fope) {
                         fope.printStackTrace();
                     }
@@ -117,9 +117,9 @@ public class PDFTextPainter implements TextPainter {
         }
         if (!found) {
             try {
-                int fsize = (int)size.floatValue();
+                int fsize = (int)(size.floatValue() * 1000);
                 fontState = new FontState(fontState.getFontInfo(), "any",
-                                          style, weight, fsize * 1000, 0);
+                                          style, weight, fsize, 0);
             } catch (org.apache.fop.apps.FOPException fope) {
                 fope.printStackTrace();
             }
@@ -230,13 +230,14 @@ public class PDFTextPainter implements TextPainter {
     }
 
     public Shape getDecoratedShape(TextNode node) {
-        System.out.println("PDFText getDecoratedShape");
+        //System.out.println("PDFText getDecoratedShape");
         return new Rectangle(1, 1);
     }
 
     public Rectangle2D getBounds(TextNode node) {
-        System.out.println("PDFText getBounds");
-        return null;
+        //System.out.println("PDFText getBounds");
+        Rectangle2D bounds = new Rectangle2D.Float(0, 0, 100, 12);
+        return bounds;
     }
 
     public Rectangle2D getDecoratedBounds(TextNode node) {
index 568a6ec9c3b17e2e99ffeba855175e3b0fd6fb32..9d5ab9ff8f42664dbe14d5b5eb96c13d32c3695a 100644 (file)
@@ -169,10 +169,11 @@ public class PDFTranscoder extends XMLAbstractTranscoder {
         svgCtx.setPixelToMM(userAgent.getPixelToMM());
         ((SVGOMDocument)document).setSVGContext(svgCtx);
 
-        boolean stroke = true;
+        /*boolean stroke = true;
         if (hints.containsKey(KEY_STROKE_TEXT)) {
             stroke = ((Boolean)hints.get(KEY_STROKE_TEXT)).booleanValue();
-        }
+        }*/
+        PDFDocumentGraphics2D graphics = new PDFDocumentGraphics2D(false);
 
         // build the GVT tree
         GVTBuilder builder = new GVTBuilder();
@@ -181,7 +182,10 @@ public class PDFTranscoder extends XMLAbstractTranscoder {
         TextPainter textPainter = null;
         textPainter = new StrokingTextPainter();
         ctx.setTextPainter(textPainter);
-        
+
+        PDFTextElementBridge pdfTextElementBridge = new PDFTextElementBridge(graphics.getFontState());
+        ctx.putBridge(pdfTextElementBridge);
+
         PDFAElementBridge pdfAElementBridge = new PDFAElementBridge();
         AffineTransform currentTransform = new AffineTransform(1, 0, 0, 1, 0, 0);
         pdfAElementBridge.setCurrentTransform(currentTransform);
@@ -267,14 +271,13 @@ public class PDFTranscoder extends XMLAbstractTranscoder {
         int w = (int)width;
         int h = (int)height;
 
-        PDFDocumentGraphics2D graphics = new PDFDocumentGraphics2D(stroke,
-                output.getOutputStream(), w, h);
+        graphics.setupDocument(output.getOutputStream(), w, h);
         graphics.setSVGDimension(docWidth, docHeight);
         currentTransform.setTransform(1, 0, 0, -1, 0, height);
-        if (!stroke) {
+        /*if (!stroke) {
             textPainter = new PDFTextPainter(graphics.getFontState());
             ctx.setTextPainter(textPainter);
-        }
+        }*/
 
         if (hints.containsKey(ImageTranscoder.KEY_BACKGROUND_COLOR)) {
             graphics.setBackgroundColor((Color)hints.get(ImageTranscoder.KEY_BACKGROUND_COLOR));
index ca8d2164a2cdc20b94f80284800a266a85ec3536..8935b42ac726b1d466d15f549be12a7500b43792 100644 (file)
@@ -12,7 +12,7 @@ import org.apache.fop.render.Renderer;
 import org.apache.fop.layout.FontState;
 import org.apache.fop.layout.Area;
 
-import java.util.*;
+//import java.util.*;
 
 import org.w3c.dom.svg.*;
 import org.w3c.dom.*;
index 4c49334ef6baf0910c7c0316fdba3a50524c490c..cf4fd9c6383676838c3d8dda84c543632ee34b2e 100644 (file)
@@ -52,7 +52,7 @@ public class SVGElement extends SVGObj {
      * @param parent the parent formatting object
      * @param propertyList the explicit properties of this object
      */
-    public SVGElement(FObj parent) {
+    public SVGElement(FONode parent) {
         super(parent);
     }
 
@@ -75,12 +75,8 @@ public class SVGElement extends SVGObj {
             throw new FOPException("SVG not in fo:instream-foreign-object");
         }
 
-        if (this.marker == START) {
             this.fs = area.getFontState();
 
-            this.marker = 0;
-        }
-
         final Element svgRoot = element;
         /* create an SVG area */
         /* if width and height are zero, get the bounds of the content. */
index cea2ea2875bad2a65de48107e714653f4f0c8668..a4db558e0235df2fb0e97e2afde54d8eced319a0 100644 (file)
@@ -7,10 +7,9 @@
 
 package org.apache.fop.svg;
 
-import java.util.Enumeration;
 import java.util.HashMap;
 
-import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FOTreeBuilder;
 import org.apache.fop.fo.ElementMapping;
 import org.apache.fop.apps.Driver;
@@ -33,7 +32,7 @@ public class SVGElementMapping implements ElementMapping {
 
                 foObjs = new HashMap();
                 foObjs.put("svg", new SE());
-                foObjs.put("<default>", new SVGMaker());
+                foObjs.put(DEFAULT, new SVGMaker());
             }
 
             String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
@@ -44,13 +43,13 @@ public class SVGElementMapping implements ElementMapping {
     }
 
     class SVGMaker extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new SVGObj(parent);
         }
     }
 
     class SE extends ElementMapping.Maker {
-        public FObj make(FObj parent) {
+        public FONode make(FONode parent) {
             return new SVGElement(parent);
         }
     }
index f3f72b12a39928630aeabef19f3ea953cccf1796..8d6406ce51dc1195a28664d94365adb80d6af01c 100644 (file)
@@ -8,11 +8,6 @@
 package org.apache.fop.svg;
 
 import org.apache.fop.fo.*;
-import org.apache.fop.layout.Area;
-import org.apache.fop.layout.FontState;
-import org.apache.fop.apps.FOPException;
-
-import org.w3c.dom.Element;
 
 public class SVGObj extends XMLObj {
     /**
@@ -21,7 +16,7 @@ public class SVGObj extends XMLObj {
      * @param parent the parent formatting object
      * @param propertyList the explicit properties of this object
      */
-    public SVGObj(FObj parent) {
+    public SVGObj(FONode parent) {
         super(parent);
     }
 
index 7766a1ea473929fb4ac782d757079eb26ad868bf..9c38085688f892f0d4b4829a8a6be5ad75b155f8 100644 (file)
@@ -115,7 +115,6 @@ public class SVGUserAgent implements UserAgent {
     public void openLink(SVGAElement elt) {
     }
 
-
     public Point getClientAreaLocationOnScreen() {
         return new Point(0, 0);
     }
@@ -146,6 +145,5 @@ public class SVGUserAgent implements UserAgent {
 
     public void handleElement(Element elt, Object data) {}
 
-
 }
 
index 75959de4963d3529071d7a83bcb70232b9f8b91e..2e8b8c4fcfc5035bbbb78c544b0ac581f1512c8c 100644 (file)
@@ -134,7 +134,6 @@ public class BufferManager {
 
             if (csize < values.length) {
                 System.out.println("Cache size too small");
-                System.exit(0);
             }