pbwest      2002/10/30 06:41:50

  Modified:    src/org/apache/fop/fo Tag: FOP_0-20-0_Alt-Design FONode.java
  Log:
  sparsePropsSet support, including new constructor with
  sparsePropsMap, sparseIndices and numProps.  makeSparsePropsSet().
  getSparsePropValue().  Mods to getProperty for null propertySet.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.19.2.20 +81 -13    xml-fop/src/org/apache/fop/fo/FONode.java
  
  Index: FONode.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/fo/FONode.java,v
  retrieving revision 1.19.2.19
  retrieving revision 1.19.2.20
  diff -u -r1.19.2.19 -r1.19.2.20
  --- FONode.java       24 Oct 2002 14:51:52 -0000      1.19.2.19
  +++ FONode.java       30 Oct 2002 14:41:49 -0000      1.19.2.20
  @@ -7,6 +7,7 @@
   import org.apache.fop.fo.properties.Property;
   import org.apache.fop.fo.expr.PropertyException;
   import org.apache.fop.fo.expr.PropertyParser;
  +import org.apache.fop.datatypes.Ints;
   import org.apache.fop.datatypes.PropertyValue;
   import org.apache.fop.datatypes.PropertyValueList;
   import org.apache.fop.datatypes.Numeric;
  @@ -62,31 +63,62 @@
       protected XMLNamespaces namespaces;
       /** The FO type. */
       public final int type;
  -    /** The attributes defined on this node. */
  +
  +    /** The attributes defined on this node. When the FO subtree of this
  +     * node has been constructed, it will be deleted. */
       public FOAttributes foAttributes;
  -    /** The unmodifiable map of properties defined on this node. */
  +    /** The map of properties specified on this node. N.B. This
  +      * <tt>HashMap</tt> starts life in FOAttributes.  It is modifiable, and
  +      * will be modified when is contains shorthands or compounds.
  +      * When the FO subtree of this node has been constructed, and the
  +      * <i>propertySet</i> is complete, it will be deleted. */
       public HashMap foProperties = null;
       /** The sorted keys of <i>foProperties</i>. */
       protected Integer[] foKeys = null;
       /** The size of <i>foKeys</i>. */
       private int numAttrs = 0;
  -    /** The property expression parser in the FOTree. */
  -    protected PropertyParser exprParser;
  -    /** The property set for this node. */
  -    protected PropertyValue[] propertySet;
  -    /** BitSet of properties for which have been specified on this node. */
  +    /** BitSet of properties which have been specified on this node. */
       private BitSet specifiedProps =
                                   new BitSet(PropNames.LAST_PROPERTY_INDEX + 1);
  +
  +    /** The property set for this node.  This reference has two lives.
  +        During FO subtree building, it holds all values which may potentially
  +        be defined on the node.  It must, therefore, be able to accommodate
  +        every property.  When FO subtree construction is completed, the
  +        <i>sparsePropsSet</i> array is constructed for use during Area
  +        tree building, and <i>propertySet</i> is nullified.
  +        While <i>sparsePropsSet</i> is null,
  +        this variable will be a reference to the complete property set. */
  +    private PropertyValue[] propertySet;
  +    /** The set of properties directly applicable to this node.  Its size is
  +        determined by the <i>numProps</i> value passed in to the constructor.
  +        */
  +    private PropertyValue[] sparsePropsSet;
  +    /** Map of <tt>Integer</tt> indices of <i>sparsePropsSet</i> array.
  +        It is indexed by the FO index of the FO associated with a given
  +        position in the <i>propertySet</i> array. */
  +    private final HashMap sparsePropsMap;
  +    /** An array of of the applicable property indices, in property index
  +        order. */
  +    private final int[] sparseIndices;
  +    /** The number of applicable properties. Size of <i>sparsePropsSet</i>. */
  +    private final int numProps;
  +
  +    /** The property expression parser in the FOTree. */
  +    protected PropertyParser exprParser;
  +
       /** The <i>attrSet</i> argument. */
       public final int attrSet;
       /** The <tt>ROBitSet</tt> of the <i>attrSet</i> argument. */
       protected ROBitSet attrBitSet;
  +
       /** The <tt>ROBitSet</tt> of inherited properties for the
           <i>attrSet</i> argument. */
       //protected ROBitSet inheritedBitSet;
       /** The <tt>ROBitSet</tt> of non-inherited properties for the
           <i>attrSet</i> argument. */
       //protected ROBitSet nonInheritedBitSet;
  +
       /** Ancestor reference area of this FONode. */
       protected FONode ancestorRefArea = null;
   
  @@ -101,7 +133,8 @@
        * node
        */
       public FONode
  -        (FOTree foTree, int type, FONode parent, FoXMLEvent event, int attrSet)
  +        (FOTree foTree, int type, FONode parent, FoXMLEvent event, int attrSet,
  +            HashMap sparsePropsMap, int[] sparseIndices, int numProps)
           throws Tree.TreeException, FOPException, PropertyException
       {
           foTree.super(parent);
  @@ -110,6 +143,9 @@
           this.parent = parent;
           this.event = event;
           this.attrSet = attrSet;
  +        this.sparsePropsMap = sparsePropsMap;
  +        this.sparseIndices = sparseIndices;
  +        this.numProps = numProps;
           attrBitSet = FOPropertySets.getAttrROBitSet(attrSet);
           //inheritedBitSet = FOPropertySets.getInheritedROBitSet(attrSet);
           //nonInheritedBitSet = FOPropertySets.getNonInheritedROBitSet(attrSet);
  @@ -182,9 +218,25 @@
           return prop.refineParsing(pv.getProperty(), this, pv);
       }
   
  +    public void makeSparsePropsSet() throws PropertyException {
  +        sparsePropsSet = new PropertyValue[numProps];
  +        // Scan the sparseIndices array, and copy the PropertyValue from
  +        // propertySet[], if it exists.  Else generate the pertinent value
  +        // for that property.
  +        for (int i = 0; i < numProps; i++)
  +            sparsePropsSet[i] = getPropertyValue(sparseIndices[i]);
  +        // Clean up structures that are no longer needed
  +        propertySet = null;
  +        specifiedProps = null;
  +        attrBitSet = null;
  +        foKeys = null;
  +        foProperties = null;
  +        foAttributes = null;
  +    }
  +
       /**
        * Get the eclosing <tt>FOTree</tt> instance of this <tt>FONode</tt>.
  -     * @return the <tt.FOTree</tt>.
  +     * @return the <tt>FOTree</tt>.
        */
       public FOTree getFOTree() {
           return foTree;
  @@ -335,16 +387,32 @@
                   throws PropertyException
       {
           PropertyValue pval;
  +        if (propertySet == null) {
  +            return IndirectValue.adjustedPropertyValue
  +                                            (getSparsePropValue(property));
  +        }
           if ((pval = propertySet[property]) != null) 
               return IndirectValue.adjustedPropertyValue(pval);
           if (parent != null && PropertyConsts.pconsts.isInherited(property))
               return (propertySet[property] =
  -                               IndirectValue.adjustedPropertyValue
  +                           IndirectValue.adjustedPropertyValue
                                           (parent.getPropertyValue(property)));
           else // root
               return (propertySet[property] =
  -                        IndirectValue.adjustedPropertyValue
  +                    IndirectValue.adjustedPropertyValue
                           (PropertyConsts.pconsts.getInitialValue(property)));
  +    }
  +
  +    /**
  +     * Get the property value for the given property from the
  +     * <i>sparsePropsSet</i> array.
  +     * @param prop - the <tt>int</tt> property index.
  +     * @return the <tt>PropertyValue</tt> for the specified property.
  +     */
  +    public PropertyValue getSparsePropValue(int prop) {
  +        return sparsePropsSet[
  +            ((Integer)(sparsePropsMap.get(Ints.consts.get(prop)))).intValue()
  +                            ];
       }
   
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to