You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ac...@apache.org on 2008/05/06 11:14:48 UTC

svn commit: r653718 [2/3] - in /xmlgraphics/fop/branches/Temp_AFPGOCAResources: ./ src/java/org/apache/fop/fo/ src/java/org/apache/fop/fo/flow/ src/java/org/apache/fop/fo/properties/ src/java/org/apache/fop/layoutmgr/ src/java/org/apache/fop/layoutmgr/...

Modified: xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java?rev=653718&r1=653717&r2=653718&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java (original)
+++ xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java Tue May  6 02:14:47 2008
@@ -62,33 +62,40 @@
      * Number of word-spaces?
      */
     private class AreaInfo {
-        private short iStartIndex;
-        private short iBreakIndex;
-        private short iWScount;
-        private short iLScount;
-        private MinOptMax ipdArea;
-        private boolean bHyphenated;
+        private short startIndex;
+        private short breakIndex;
+        private short wordSpaceCount;
+        private short letterSpaceCount;
+        private MinOptMax areaIPD;
+        private boolean isHyphenated;
         private boolean isSpace;
         private boolean breakOppAfter;
-        public AreaInfo(short iSIndex, short iBIndex, short iWS, short iLS,
-                        MinOptMax ipd, boolean bHyph, boolean isSpace, boolean breakOppAfter) {
-            iStartIndex = iSIndex;
-            iBreakIndex = iBIndex;
-            iWScount = iWS;
-            iLScount = iLS;
-            ipdArea = ipd;
-            bHyphenated = bHyph;
+
+        AreaInfo(short startIndex,
+                        short breakIndex,
+                        short wordSpaceCount,
+                        short letterSpaceCount,
+                        MinOptMax areaIPD,
+                        boolean isHyphenated,
+                        boolean isSpace,
+                        boolean breakOppAfter) {
+            this.startIndex = startIndex;
+            this.breakIndex = breakIndex;
+            this.wordSpaceCount = wordSpaceCount;
+            this.letterSpaceCount = letterSpaceCount;
+            this.areaIPD = areaIPD;
+            this.isHyphenated = isHyphenated;
             this.isSpace = isSpace;
             this.breakOppAfter = breakOppAfter;
         }
-        
+
         public String toString() {
-            return "[ lscnt=" +  iLScount
-                + ", wscnt=" + iWScount
-                + ", ipd=" + ipdArea.toString()
-                + ", sidx=" + iStartIndex
-                + ", bidx=" + iBreakIndex
-                + ", hyph=" + bHyphenated
+            return "[ lscnt=" + letterSpaceCount
+                + ", wscnt=" + wordSpaceCount
+                + ", ipd=" + areaIPD.toString()
+                + ", sidx=" + startIndex
+                + ", bidx=" + breakIndex
+                + ", hyph=" + isHyphenated
                 + ", space=" + isSpace
                 + "]";
         }
@@ -120,7 +127,7 @@
 
     /** Used to reduce instantiation of MinOptMax with zero length. Do not modify! */
     private static final MinOptMax ZERO_MINOPTMAX = new MinOptMax(0);
-    
+
     private FOText foText;
     private char[] textArray;
     /**
@@ -133,14 +140,8 @@
     private static final char NEWLINE = '\n';
 
     private Font font = null;
-    /** Start index of first character in this parent Area */
-    private short iAreaStart = 0;
     /** Start index of next TextArea */
-    private short iNextStart = 0;
-    /** Size since last makeArea call, except for last break */
-    private MinOptMax ipdTotal;
-    /** Size including last break possibility returned */
-    // private MinOptMax nextIPD = new MinOptMax(0);
+    private short nextStart = 0;
     /** size of a space character (U+0020) glyph in current font */
     private int spaceCharIPD;
     private MinOptMax wordSpaceIPD;
@@ -152,23 +153,23 @@
     /** 1/2 of word-spacing value */
     private SpaceVal halfWS;
     /** 1/2 of letter-spacing value */
-    private SpaceVal halfLS; 
-    /** Number of space characters after previous possible break position. */
-    private int iNbSpacesPending;
-
-    private boolean bChanged = false;
-    private int iReturnedIndex = 0;
-    private short iThisStart = 0;
-    private short iTempStart = 0;
+    private SpaceVal halfLS;
+
+    private boolean hasChanged = false;
+    private int returnedIndex = 0;
+    private short thisStart = 0;
+    private short tempStart = 0;
     private LinkedList changeList = null;
 
     private AlignmentContext alignmentContext = null;
 
     private int lineStartBAP = 0;
     private int lineEndBAP = 0;
-    
+
     private boolean keepTogether;
 
+    private final Position auxiliaryPosition = new LeafPosition(this, -1);
+
     /**
      * Create a Text layout manager.
      *
@@ -177,7 +178,7 @@
     public TextLayoutManager(FOText node) {
         super();
         foText = node;
-        
+
         textArray = new char[node.endIndex - node.startIndex];
         System.arraycopy(node.ca, node.startIndex, textArray, 0,
             node.endIndex - node.startIndex);
@@ -185,22 +186,39 @@
 
         vecAreaInfo = new java.util.ArrayList();
     }
-    
+
+    private KnuthPenalty makeZeroWidthPenalty(int penaltyValue) {
+        return new KnuthPenalty(
+                0,
+                penaltyValue,
+                false,
+                auxiliaryPosition,
+                true);
+    }
+
+    private KnuthBox makeAuxiliaryZeroWidthBox() {
+        return new KnuthInlineBox(
+                0,
+                null,
+                notifyPos(new LeafPosition(this, -1)),
+                true);
+    }
+
     /** {@inheritDoc} */
     public void initialize() {
         FontInfo fi = foText.getFOEventHandler().getFontInfo();
         FontTriplet[] fontkeys = foText.getCommonFont().getFontState(fi);
         font = fi.getFontInstance(fontkeys[0], foText.getCommonFont().fontSize.getValue(this));
-        
+
         // With CID fonts, space isn't neccesary currentFontState.width(32)
         spaceCharIPD = font.getCharWidth(' ');
         // Use hyphenationChar property
         hyphIPD = foText.getCommonHyphenation().getHyphIPD(font);
-        
+
         SpaceVal ls = SpaceVal.makeLetterSpacing(foText.getLetterSpacing());
         halfLS = new SpaceVal(MinOptMax.multiply(ls.getSpace(), 0.5),
                 ls.isConditional(), ls.isForcing(), ls.getPrecedence());
-        
+
         ws = SpaceVal.makeWordSpacing(foText.getWordSpacing(), ls, font);
         // Make half-space: <space> on either side of a word-space)
         halfWS = new SpaceVal(MinOptMax.multiply(ws.getSpace(), 0.5),
@@ -219,33 +237,9 @@
         // in the SpaceVal.makeWordSpacing() method
         letterSpaceIPD = ls.getSpace();
         wordSpaceIPD = MinOptMax.add(new MinOptMax(spaceCharIPD), ws.getSpace());
-        
-        keepTogether = foText.getKeepTogether().getWithinLine().getEnum() == Constants.EN_ALWAYS;
 
-    }
+        keepTogether = foText.getKeepTogether().getWithinLine().getEnum() == Constants.EN_ALWAYS;
 
-    // TODO: see if we can use normal getNextBreakPoss for this with
-    // extra hyphenation information in LayoutContext
-    private boolean getHyphenIPD(HyphContext hc, MinOptMax hyphIPD) {
-        // Skip leading word-space before calculating count?
-        boolean bCanHyphenate = true;
-        int iStopIndex = iNextStart + hc.getNextHyphPoint();
-
-        if (textArray.length < iStopIndex) {
-            iStopIndex = textArray.length;
-            bCanHyphenate = false;
-        }
-        hc.updateOffset(iStopIndex - iNextStart);
-
-        for (; iNextStart < iStopIndex; iNextStart++) {
-            char c = textArray[iNextStart];
-            hyphIPD.opt += font.getCharWidth(c);
-            // letter-space?
-        }
-        // Need to include hyphen size too, but don't count it in the
-        // stored running total, since it would be double counted
-        // with later hyphenation points
-        return bCanHyphenate;
     }
 
     /**
@@ -262,8 +256,8 @@
 
         // Add word areas
         AreaInfo ai = null;
-        int iWScount = 0;
-        int iLScount = 0;
+        int wordSpaceCount = 0;
+        int letterSpaceCount = 0;
         int firstAreaInfoIndex = -1;
         int lastAreaInfoIndex = 0;
         MinOptMax realWidth = new MinOptMax(0);
@@ -281,102 +275,102 @@
                 if (firstAreaInfoIndex == -1) {
                     firstAreaInfoIndex = tbpNext.getLeafPos();
                 }
-                iWScount += ai.iWScount;
-                iLScount += ai.iLScount;
-                realWidth.add(ai.ipdArea);
+                wordSpaceCount += ai.wordSpaceCount;
+                letterSpaceCount += ai.letterSpaceCount;
+                realWidth.add(ai.areaIPD);
                 lastAreaInfoIndex = tbpNext.getLeafPos();
             }
         }
         if (ai == null) {
             return;
         }
-        int textLength = ai.iBreakIndex - ai.iStartIndex;
-        if (ai.iLScount == textLength && !ai.bHyphenated
+        int textLength = ai.breakIndex - ai.startIndex;
+        if (ai.letterSpaceCount == textLength && !ai.isHyphenated
                    && context.isLastArea()) {
             // the line ends at a character like "/" or "-";
             // remove the letter space after the last character
             realWidth.add(MinOptMax.multiply(letterSpaceIPD, -1));
-            iLScount--;
+            letterSpaceCount--;
         }
-        
-        for (int i = ai.iStartIndex; i < ai.iBreakIndex; i++) {
-            MinOptMax ladj = letterAdjustArray[i + 1]; 
+
+        for (int i = ai.startIndex; i < ai.breakIndex; i++) {
+            MinOptMax ladj = letterAdjustArray[i + 1];
             if (ladj != null && ladj.isElastic()) {
-                iLScount++;
+                letterSpaceCount++;
             }
         }
 
         // add hyphenation character if the last word is hyphenated
-        if (context.isLastArea() && ai.bHyphenated) {
+        if (context.isLastArea() && ai.isHyphenated) {
             realWidth.add(new MinOptMax(hyphIPD));
         }
 
         // Calculate adjustments
-        int iDifference = 0;
-        int iTotalAdjust = 0;
-        int iWordSpaceDim = wordSpaceIPD.opt;
-        int iLetterSpaceDim = letterSpaceIPD.opt;
-        double dIPDAdjust = context.getIPDAdjust();
+        int difference = 0;
+        int totalAdjust = 0;
+        int wordSpaceDim = wordSpaceIPD.opt;
+        int letterSpaceDim = letterSpaceIPD.opt;
+        double ipdAdjust = context.getIPDAdjust();
         double dSpaceAdjust = context.getSpaceAdjust(); // not used
 
         // calculate total difference between real and available width
-        if (dIPDAdjust > 0.0) {
-            iDifference = (int) ((double) (realWidth.max - realWidth.opt)
-                                * dIPDAdjust);
+        if (ipdAdjust > 0.0) {
+            difference = (int) ((double) (realWidth.max - realWidth.opt)
+                                * ipdAdjust);
         } else {
-            iDifference = (int) ((double) (realWidth.opt - realWidth.min)
-                                * dIPDAdjust);
+            difference = (int) ((double) (realWidth.opt - realWidth.min)
+                                * ipdAdjust);
         }
-        
+
         // set letter space adjustment
-        if (dIPDAdjust > 0.0) {
-            iLetterSpaceDim
+        if (ipdAdjust > 0.0) {
+            letterSpaceDim
                 += (int) ((double) (letterSpaceIPD.max - letterSpaceIPD.opt)
-                         * dIPDAdjust);
+                         * ipdAdjust);
         } else  {
-            iLetterSpaceDim
+            letterSpaceDim
                 += (int) ((double) (letterSpaceIPD.opt - letterSpaceIPD.min)
-                         * dIPDAdjust);
+                         * ipdAdjust);
         }
-        iTotalAdjust += (iLetterSpaceDim - letterSpaceIPD.opt) * iLScount;
+        totalAdjust += (letterSpaceDim - letterSpaceIPD.opt) * letterSpaceCount;
 
         // set word space adjustment
-        // 
-        if (iWScount > 0) {
-            iWordSpaceDim += (int) ((iDifference - iTotalAdjust) / iWScount);
+        //
+        if (wordSpaceCount > 0) {
+            wordSpaceDim += (difference - totalAdjust) / wordSpaceCount;
         } else {
             // there are no word spaces in this area
         }
-        iTotalAdjust += (iWordSpaceDim - wordSpaceIPD.opt) * iWScount;
-        if (iTotalAdjust != iDifference) {
+        totalAdjust += (wordSpaceDim - wordSpaceIPD.opt) * wordSpaceCount;
+        if (totalAdjust != difference) {
             // the applied adjustment is greater or smaller than the needed one
             log.trace("TextLM.addAreas: error in word / letter space adjustment = "
-                    + (iTotalAdjust - iDifference));
-            // set iTotalAdjust = iDifference, so that the width of the TextArea
+                    + (totalAdjust - difference));
+            // set totalAdjust = difference, so that the width of the TextArea
             // will counterbalance the error and the other inline areas will be
             // placed correctly
-            iTotalAdjust = iDifference;
+            totalAdjust = difference;
         }
 
-        TextArea t = createTextArea(realWidth, iTotalAdjust, context,
+        TextArea t = createTextArea(realWidth, totalAdjust, context,
                                     wordSpaceIPD.opt - spaceCharIPD,
                                     firstAreaInfoIndex, lastAreaInfoIndex,
                                     context.isLastArea());
 
-        // iWordSpaceDim is computed in relation to wordSpaceIPD.opt
+        // wordSpaceDim is computed in relation to wordSpaceIPD.opt
         // but the renderer needs to know the adjustment in relation
         // to the size of the space character in the current font;
         // moreover, the pdf renderer adds the character spacing even to
         // the last character of a word and to space characters: in order
         // to avoid this, we must subtract the letter space width twice;
         // the renderer will compute the space width as:
-        //   space width = 
+        //   space width =
         //     = "normal" space width + letterSpaceAdjust + wordSpaceAdjust
         //     = spaceCharIPD + letterSpaceAdjust +
-        //       + (iWordSpaceDim - spaceCharIPD -  2 * letterSpaceAdjust)
-        //     = iWordSpaceDim - letterSpaceAdjust
-        t.setTextLetterSpaceAdjust(iLetterSpaceDim);
-        t.setTextWordSpaceAdjust(iWordSpaceDim - spaceCharIPD
+        //       + (wordSpaceDim - spaceCharIPD -  2 * letterSpaceAdjust)
+        //     = wordSpaceDim - letterSpaceAdjust
+        t.setTextLetterSpaceAdjust(letterSpaceDim);
+        t.setTextWordSpaceAdjust(wordSpaceDim - spaceCharIPD
                                  - 2 * t.getTextLetterSpaceAdjust());
         if (context.getIPDAdjust() != 0) {
             // add information about space width
@@ -395,7 +389,7 @@
      * @param context the layout context
      * @param spaceDiff unused
      * @param firstIndex the index of the first AreaInfo used for the TextArea
-     * @param lastIndex the index of the last AreaInfo used for the TextArea 
+     * @param lastIndex the index of the last AreaInfo used for the TextArea
      * @param isLastArea is this TextArea the last in a line?
      * @return the new text area
      */
@@ -431,7 +425,7 @@
             if (areaInfo.isSpace) {
                 // areaInfo stores information about spaces
                 // add the spaces - except zero-width spaces - to the TextArea
-                for (int j = areaInfo.iStartIndex; j < areaInfo.iBreakIndex; j++) {
+                for (int j = areaInfo.startIndex; j < areaInfo.breakIndex; j++) {
                     char spaceChar = textArray[j];
                     if (!CharUtilities.isZeroWidthSpace(spaceChar)) {
                         textArea.addSpace(spaceChar, 0,
@@ -445,13 +439,13 @@
                     wordStartIndex = i;
                     len = 0;
                 }
-                len += areaInfo.iBreakIndex - areaInfo.iStartIndex;
+                len += areaInfo.breakIndex - areaInfo.startIndex;
                 if (i == lastIndex || ((AreaInfo) vecAreaInfo.get(i + 1)).isSpace) {
                     // here ends a new word
                     // add a word to the TextArea
                     if (isLastArea
-                        && i == lastIndex 
-                        && areaInfo.bHyphenated) {
+                        && i == lastIndex
+                        && areaInfo.isHyphenated) {
                         len++;
                     }
                     StringBuffer wordChars = new StringBuffer(len);
@@ -459,10 +453,10 @@
                     int letter = 0;
                     for (int j = wordStartIndex; j <= i; j++) {
                         AreaInfo ai = (AreaInfo) vecAreaInfo.get(j);
-                        int lsCount = ai.iLScount;
-                        wordChars.append(textArray, ai.iStartIndex, ai.iBreakIndex - ai.iStartIndex);
-                        for (int k = 0; k < ai.iBreakIndex - ai.iStartIndex; k++) {
-                            MinOptMax adj = letterAdjustArray[ai.iStartIndex + k];
+                        int lsCount = ai.letterSpaceCount;
+                        wordChars.append(textArray, ai.startIndex, ai.breakIndex - ai.startIndex);
+                        for (int k = 0; k < ai.breakIndex - ai.startIndex; k++) {
+                            MinOptMax adj = letterAdjustArray[ai.startIndex + k];
                             if (letter > 0) {
                                 letterAdjust[letter] = (adj != null ? adj.opt : 0);
                             }
@@ -475,8 +469,8 @@
                     }
                     // String wordChars = new String(textArray, wordStartIndex, len);
                     if (isLastArea
-                        && i == lastIndex 
-                        && areaInfo.bHyphenated) {
+                        && i == lastIndex
+                        && areaInfo.isHyphenated) {
                         // add the hyphenation character
                         wordChars.append(foText.getCommonHyphenation().getHyphChar(font));
                     }
@@ -487,21 +481,13 @@
         }
         TraitSetter.addFontTraits(textArea, font);
         textArea.addTrait(Trait.COLOR, foText.getColor());
-        
+
         TraitSetter.addTextDecoration(textArea, foText.getTextDecoration());
-        
+
         return textArea;
     }
-    
-    private void addToLetterAdjust(int index, int width) {
-        if (letterAdjustArray[index] == null) {
-            letterAdjustArray[index] = new MinOptMax(width);
-        } else {
-            letterAdjustArray[index].add(width);
-        }
-    }
 
-    private void addToLetterAdjust(int index, MinOptMax width) {
+    private void addToLetterAdjust(int index, int width) {
         if (letterAdjustArray[index] == null) {
             letterAdjustArray[index] = new MinOptMax(width);
         } else {
@@ -519,7 +505,7 @@
             || CharUtilities.isNonBreakableSpace(ch)
             || CharUtilities.isFixedWidthSpace(ch);
     }
-    
+
     /** {@inheritDoc} */
     public LinkedList getNextKnuthElements(LayoutContext context, int alignment) {
         lineStartBAP = context.getLineStartBorderAndPaddingWidth();
@@ -533,14 +519,14 @@
         returnList.add(sequence);
 
         LineBreakStatus lbs = new LineBreakStatus();
-        iThisStart = iNextStart;
+        thisStart = nextStart;
         boolean inWord = false;
         boolean inWhitespace = false;
-        char ch = 0; 
-        while (iNextStart < textArray.length) {
-            ch = textArray[iNextStart]; 
+        char ch = 0;
+        while (nextStart < textArray.length) {
+            ch = textArray[nextStart];
             boolean breakOpportunity = false;
-            byte breakAction = keepTogether? LineBreakStatus.PROHIBITED_BREAK : lbs.nextChar(ch);
+            byte breakAction = keepTogether ? LineBreakStatus.PROHIBITED_BREAK : lbs.nextChar(ch);
             switch (breakAction) {
                 case LineBreakStatus.COMBINING_PROHIBITED_BREAK:
                 case LineBreakStatus.PROHIBITED_BREAK:
@@ -558,14 +544,14 @@
             if (inWord) {
                 if (breakOpportunity || isSpace(ch) || ch == NEWLINE) {
                     //Word boundary found, process widths and kerning
-                    int lastIndex = iNextStart;
+                    short lastIndex = nextStart;
                     while (lastIndex > 0 && textArray[lastIndex - 1] == CharUtilities.SOFT_HYPHEN) {
                         lastIndex--;
                     }
-                    int wordLength = lastIndex - iThisStart;
+                    int wordLength = lastIndex - thisStart;
                     boolean kerning = font.hasKerning();
                     MinOptMax wordIPD = new MinOptMax(0);
-                    for (int i = iThisStart; i < lastIndex; i++) {
+                    for (int i = thisStart; i < lastIndex; i++) {
                         char c = textArray[i];
 
                         //character width
@@ -575,11 +561,11 @@
                         //kerning
                         if (kerning) {
                             int kern = 0;
-                            if (i > iThisStart) {
+                            if (i > thisStart) {
                                 char previous = textArray[i - 1];
                                 kern = font.getKernValue(previous, c) * font.getFontSize() / 1000;
-                            } else if (prevAi != null && !prevAi.isSpace && prevAi.iBreakIndex > 0) {
-                                char previous = textArray[prevAi.iBreakIndex - 1];
+                            } else if (prevAi != null && !prevAi.isSpace && prevAi.breakIndex > 0) {
+                                char previous = textArray[prevAi.breakIndex - 1];
                                 kern = font.getKernValue(previous, c) * font.getFontSize() / 1000;
                             }
                             if (kern != 0) {
@@ -605,94 +591,91 @@
                     wordIPD.add(MinOptMax.multiply(letterSpaceIPD, iLetterSpaces));
 
                     // create the AreaInfo object
-                    ai = new AreaInfo(iThisStart, (short)lastIndex, (short) 0,
+                    ai = new AreaInfo(thisStart, lastIndex, (short) 0,
                             (short) iLetterSpaces,
                             wordIPD, textArray[lastIndex] == CharUtilities.SOFT_HYPHEN, false, breakOpportunity);
-                    vecAreaInfo.add(ai);
                     prevAi = ai;
-                    iTempStart = iNextStart;
+                    vecAreaInfo.add(ai);
+                    tempStart = nextStart;
 
-                    // create the elements
-                    sequence.addAll(createElementsForAWordFragment(alignment, ai,
-                            vecAreaInfo.size() - 1, letterSpaceIPD));
+                    //add the elements
+                    addElementsForAWordFragment(sequence, alignment, ai,
+                            vecAreaInfo.size() - 1, letterSpaceIPD);
                     ai = null;
-
-                    iThisStart = iNextStart;
+                    thisStart = nextStart;
                 }
             } else if (inWhitespace) {
                 if (ch != CharUtilities.SPACE || breakOpportunity) {
                     // End of whitespace
                     // create the AreaInfo object
-                    ai = new AreaInfo(iThisStart, (short) (iNextStart),
-                            (short) (iNextStart - iThisStart), (short) 0,
-                            MinOptMax.multiply(wordSpaceIPD, iNextStart - iThisStart),
-                            false, true, breakOpportunity); 
+                    ai = new AreaInfo(thisStart, nextStart,
+                            (short) (nextStart - thisStart), (short) 0,
+                            MinOptMax.multiply(wordSpaceIPD, nextStart - thisStart),
+                            false, true, breakOpportunity);
                     vecAreaInfo.add(ai);
                     prevAi = ai;
 
                     // create the elements
-                    sequence.addAll
-                        (createElementsForASpace(alignment, ai, vecAreaInfo.size() - 1));
+                    addElementsForASpace(sequence, alignment, ai, vecAreaInfo.size() - 1);
                     ai = null;
 
-                    iThisStart = iNextStart;
+                    thisStart = nextStart;
                 }
             } else {
                 if (ai != null) {
                     vecAreaInfo.add(ai);
                     prevAi = ai;
-                    ai.breakOppAfter = ch == CharUtilities.SPACE || breakOpportunity;
-                    sequence.addAll
-                        (createElementsForASpace(alignment, ai, vecAreaInfo.size() - 1));
+                    ai.breakOppAfter = (ch == CharUtilities.SPACE) || breakOpportunity;
+                    addElementsForASpace(sequence, alignment, ai, vecAreaInfo.size() - 1);
                     ai = null;
                 }
                 if (breakAction == LineBreakStatus.EXPLICIT_BREAK) {
                     if (lineEndBAP != 0) {
-                        sequence.add
-                            (new KnuthGlue(lineEndBAP, 0, 0,
-                                           new LeafPosition(this, -1), true));
+                        sequence.add(
+                                new KnuthGlue(lineEndBAP, 0, 0,
+                                              auxiliaryPosition, true));
                     }
                     sequence.endSequence();
                     sequence = new InlineKnuthSequence();
                     returnList.add(sequence);
                 }
             }
-            
-            if ((ch == CharUtilities.SPACE 
-                    && foText.getWhitespaceTreatment() == Constants.EN_PRESERVE) 
+
+            if ((ch == CharUtilities.SPACE
+                    && foText.getWhitespaceTreatment() == Constants.EN_PRESERVE)
                     || ch == CharUtilities.NBSPACE) {
                 // preserved space or non-breaking space:
                 // create the AreaInfo object
-                ai = new AreaInfo(iNextStart, (short) (iNextStart + 1),
+                ai = new AreaInfo(nextStart, (short) (nextStart + 1),
                         (short) 1, (short) 0,
                         wordSpaceIPD, false, true, breakOpportunity);
-                iThisStart = (short) (iNextStart + 1);
+                thisStart = (short) (nextStart + 1);
             } else if (CharUtilities.isFixedWidthSpace(ch) || CharUtilities.isZeroWidthSpace(ch)) {
                 // create the AreaInfo object
                 MinOptMax ipd = new MinOptMax(font.getCharWidth(ch));
-                ai = new AreaInfo(iNextStart, (short) (iNextStart + 1),
+                ai = new AreaInfo(nextStart, (short) (nextStart + 1),
                         (short) 0, (short) 0,
-                        ipd, false, true, breakOpportunity); 
-                iThisStart = (short) (iNextStart + 1);
+                        ipd, false, true, breakOpportunity);
+                thisStart = (short) (nextStart + 1);
             } else if (ch == NEWLINE) {
                 // linefeed; this can happen when linefeed-treatment="preserve"
-                iThisStart = (short) (iNextStart + 1);
+                thisStart = (short) (nextStart + 1);
             }
             inWord = !isSpace(ch) && ch != NEWLINE;
             inWhitespace = ch == CharUtilities.SPACE && foText.getWhitespaceTreatment() != Constants.EN_PRESERVE;
-            iNextStart++;
+            nextStart++;
         } // end of while
-        
+
         // Process any last elements
         if (inWord) {
-            int lastIndex = iNextStart;
-            if (textArray[iNextStart - 1] == CharUtilities.SOFT_HYPHEN) {
+            int lastIndex = nextStart;
+            if (textArray[nextStart - 1] == CharUtilities.SOFT_HYPHEN) {
                 lastIndex--;
             }
-            int wordLength = lastIndex - iThisStart;
+            int wordLength = lastIndex - thisStart;
             boolean kerning = font.hasKerning();
             MinOptMax wordIPD = new MinOptMax(0);
-            for (int i = iThisStart; i < lastIndex; i++) {
+            for (int i = thisStart; i < lastIndex; i++) {
                 char c = textArray[i];
 
                 //character width
@@ -702,11 +685,11 @@
                 //kerning
                 if (kerning) {
                     int kern = 0;
-                    if (i > iThisStart) {
+                    if (i > thisStart) {
                         char previous = textArray[i - 1];
                         kern = font.getKernValue(previous, c) * font.getFontSize() / 1000;
                     } else if (prevAi != null && !prevAi.isSpace) {
-                        char previous = textArray[prevAi.iBreakIndex - 1];
+                        char previous = textArray[prevAi.breakIndex - 1];
                         kern = font.getKernValue(previous, c) * font.getFontSize() / 1000;
                     }
                     if (kern != 0) {
@@ -720,38 +703,36 @@
             wordIPD.add(MinOptMax.multiply(letterSpaceIPD, iLetterSpaces));
 
             // create the AreaInfo object
-            ai = new AreaInfo(iThisStart, (short)lastIndex, (short) 0,
+            ai = new AreaInfo(thisStart, (short)lastIndex, (short) 0,
                     (short) iLetterSpaces,
                     wordIPD, false, false, false);
             vecAreaInfo.add(ai);
-            iTempStart = iNextStart;
+            tempStart = nextStart;
 
             // create the elements
-            sequence.addAll(createElementsForAWordFragment(alignment, ai,
-                    vecAreaInfo.size() - 1, letterSpaceIPD));
+            addElementsForAWordFragment(sequence, alignment, ai,
+                    vecAreaInfo.size() - 1, letterSpaceIPD);
             ai = null;
         } else if (inWhitespace) {
-            ai = new AreaInfo(iThisStart, (short) (iNextStart),
-                    (short) (iNextStart - iThisStart), (short) 0,
-                    MinOptMax.multiply(wordSpaceIPD, iNextStart - iThisStart),
-                    false, true, true); 
+            ai = new AreaInfo(thisStart, (short) (nextStart),
+                    (short) (nextStart - thisStart), (short) 0,
+                    MinOptMax.multiply(wordSpaceIPD, nextStart - thisStart),
+                    false, true, true);
             vecAreaInfo.add(ai);
 
             // create the elements
-            sequence.addAll
-                (createElementsForASpace(alignment, ai, vecAreaInfo.size() - 1));
+            addElementsForASpace(sequence, alignment, ai, vecAreaInfo.size() - 1);
             ai = null;
         } else if (ai != null) {
             vecAreaInfo.add(ai);
             ai.breakOppAfter = ch == CharUtilities.ZERO_WIDTH_SPACE;
-            sequence.addAll
-                (createElementsForASpace(alignment, ai, vecAreaInfo.size() - 1));
+            addElementsForASpace(sequence, alignment, ai, vecAreaInfo.size() - 1);
             ai = null;
         } else if (ch == NEWLINE) {
             if (lineEndBAP != 0) {
                 sequence.add
                     (new KnuthGlue(lineEndBAP, 0, 0,
-                                   new LeafPosition(this, -1), true));
+                                   auxiliaryPosition, true));
             }
             sequence.endSequence();
             sequence = new InlineKnuthSequence();
@@ -782,29 +763,29 @@
         //element could refer to '-1' position, for non-collapsed spaces (?)
         if (idx > -1) {
             AreaInfo ai = (AreaInfo) vecAreaInfo.get(idx);
-            ai.iLScount++;
-            ai.ipdArea.add(letterSpaceIPD);
-            if (BREAK_CHARS.indexOf(textArray[iTempStart - 1]) >= 0) {
+            ai.letterSpaceCount++;
+            ai.areaIPD.add(letterSpaceIPD);
+            if (BREAK_CHARS.indexOf(textArray[tempStart - 1]) >= 0) {
                 // the last character could be used as a line break
                 // append new elements to oldList
                 oldListIterator = oldList.listIterator(oldList.size());
                 oldListIterator.add(new KnuthPenalty(0, KnuthPenalty.FLAGGED_PENALTY, true,
-                                                     new LeafPosition(this, -1), false));
+                                                     auxiliaryPosition, false));
                 oldListIterator.add(new KnuthGlue(letterSpaceIPD.opt,
                                            letterSpaceIPD.max - letterSpaceIPD.opt,
                                            letterSpaceIPD.opt - letterSpaceIPD.min,
-                                           new LeafPosition(this, -1), false));
+                                           auxiliaryPosition, false));
             } else if (letterSpaceIPD.min == letterSpaceIPD.max) {
                 // constant letter space: replace the box
-                oldListIterator.set(new KnuthInlineBox(ai.ipdArea.opt, alignmentContext, pos, false));
+                oldListIterator.set(new KnuthInlineBox(ai.areaIPD.opt, alignmentContext, pos, false));
             } else {
                 // adjustable letter space: replace the glue
                 oldListIterator.next(); // this would return the penalty element
                 oldListIterator.next(); // this would return the glue element
-                oldListIterator.set(new KnuthGlue(ai.iLScount * letterSpaceIPD.opt,
-                                                  ai.iLScount * (letterSpaceIPD.max - letterSpaceIPD.opt),
-                                                  ai.iLScount * (letterSpaceIPD.opt - letterSpaceIPD.min),
-                                                  new LeafPosition(this, -1), true));
+                oldListIterator.set(new KnuthGlue(ai.letterSpaceCount * letterSpaceIPD.opt,
+                                                  ai.letterSpaceCount * (letterSpaceIPD.max - letterSpaceIPD.opt),
+                                                  ai.letterSpaceCount * (letterSpaceIPD.opt - letterSpaceIPD.min),
+                                                  auxiliaryPosition, true));
             }
         }
         return oldList;
@@ -844,37 +825,37 @@
     public void hyphenate(Position pos, HyphContext hc) {
         AreaInfo ai
             = (AreaInfo) vecAreaInfo.get(((LeafPosition) pos).getLeafPos());
-        int iStartIndex = ai.iStartIndex;
-        int iStopIndex;
-        boolean bNothingChanged = true;
+        int startIndex = ai.startIndex;
+        int stopIndex;
+        boolean nothingChanged = true;
 
-        while (iStartIndex < ai.iBreakIndex) {
+        while (startIndex < ai.breakIndex) {
             MinOptMax newIPD = new MinOptMax(0);
-            boolean bHyphenFollows;
+            boolean hyphenFollows;
 
             if (hc.hasMoreHyphPoints()
-                && (iStopIndex = iStartIndex + hc.getNextHyphPoint())
-                <= ai.iBreakIndex) {
-                // iStopIndex is the index of the first character
+                && (stopIndex = startIndex + hc.getNextHyphPoint())
+                <= ai.breakIndex) {
+                // stopIndex is the index of the first character
                 // after a hyphenation point
-                bHyphenFollows = true;
+                hyphenFollows = true;
             } else {
                 // there are no more hyphenation points,
-                // or the next one is after ai.iBreakIndex
-                bHyphenFollows = false;
-                iStopIndex = ai.iBreakIndex;
+                // or the next one is after ai.breakIndex
+                hyphenFollows = false;
+                stopIndex = ai.breakIndex;
             }
 
-            hc.updateOffset(iStopIndex - iStartIndex);
+            hc.updateOffset(stopIndex - startIndex);
 
-            //log.info("Word: " + new String(textArray, iStartIndex, iStopIndex - iStartIndex));
-            for (int i = iStartIndex; i < iStopIndex; i++) {
+            //log.info("Word: " + new String(textArray, startIndex, stopIndex - startIndex));
+            for (int i = startIndex; i < stopIndex; i++) {
                 char c = textArray[i];
                 newIPD.add(new MinOptMax(font.getCharWidth(c)));
-                //if (i > iStartIndex) {
-                if (i < iStopIndex) {
+                //if (i > startIndex) {
+                if (i < stopIndex) {
                     MinOptMax la = this.letterAdjustArray[i + 1];
-                    if ((i == iStopIndex - 1) && bHyphenFollows) {
+                    if ((i == stopIndex - 1) && hyphenFollows) {
                         //the letter adjust here needs to be handled further down during
                         //element generation because it depends on hyph/no-hyph condition
                         la = null;
@@ -885,69 +866,66 @@
                 }
             }
             // add letter spaces
-            boolean bIsWordEnd
-                = iStopIndex == ai.iBreakIndex
-                && ai.iLScount < (ai.iBreakIndex - ai.iStartIndex);
+            boolean isWordEnd
+                = stopIndex == ai.breakIndex
+                && ai.letterSpaceCount < (ai.breakIndex - ai.startIndex);
             newIPD.add(MinOptMax.multiply(letterSpaceIPD,
-                                          (bIsWordEnd
-                                           ? (iStopIndex - iStartIndex - 1)
-                                           : (iStopIndex - iStartIndex))));
-
-            if (!(bNothingChanged
-                  && iStopIndex == ai.iBreakIndex 
-                  && bHyphenFollows == false)) {
+                                          (isWordEnd
+                                           ? (stopIndex - startIndex - 1)
+                                           : (stopIndex - startIndex))));
+
+            if (!(nothingChanged
+                  && stopIndex == ai.breakIndex
+                  && !hyphenFollows)) {
                 // the new AreaInfo object is not equal to the old one
                 if (changeList == null) {
                     changeList = new LinkedList();
                 }
                 changeList.add
                     (new PendingChange
-                     (new AreaInfo((short) iStartIndex, (short) iStopIndex,
+                     (new AreaInfo((short) startIndex, (short) stopIndex,
                                    (short) 0,
-                                   (short) (bIsWordEnd
-                                            ? (iStopIndex - iStartIndex - 1)
-                                            : (iStopIndex - iStartIndex)),
-                                   newIPD, bHyphenFollows, false, false),
+                                   (short) (isWordEnd
+                                            ? (stopIndex - startIndex - 1)
+                                            : (stopIndex - startIndex)),
+                                   newIPD, hyphenFollows, false, false),
                       ((LeafPosition) pos).getLeafPos()));
-                bNothingChanged = false;
+                nothingChanged = false;
             }
-            iStartIndex = iStopIndex;
-        }
-        if (!bChanged && !bNothingChanged) {
-            bChanged = true;
+            startIndex = stopIndex;
         }
+        hasChanged = !nothingChanged;
     }
 
     /** {@inheritDoc} */
     public boolean applyChanges(List oldList) {
         setFinished(false);
 
-        if (changeList != null) {
-            int iAddedAI = 0;
-            int iRemovedAI = 0;
-            int iOldIndex = -1;
-            PendingChange currChange = null;
+        if (changeList != null && !changeList.isEmpty()) {
+            int areaInfosAdded = 0;
+            int areaInfosRemoved = 0;
+            int oldIndex = -1, changeIndex;
+            PendingChange currChange;
             ListIterator changeListIterator = changeList.listIterator();
             while (changeListIterator.hasNext()) {
                 currChange = (PendingChange) changeListIterator.next();
-                if (currChange.index != iOldIndex) {
-                    iRemovedAI++;
-                    iAddedAI++;
-                    iOldIndex = currChange.index;
-                    vecAreaInfo.remove(currChange.index + iAddedAI - iRemovedAI);
-                    vecAreaInfo.add(currChange.index + iAddedAI - iRemovedAI,
-                                    currChange.ai);
+                if (currChange.index != oldIndex) {
+                    areaInfosRemoved++;
+                    areaInfosAdded++;
+                    oldIndex = currChange.index;
+                    changeIndex = currChange.index + areaInfosAdded - areaInfosRemoved;
+                    vecAreaInfo.remove(changeIndex);
                 } else {
-                    iAddedAI++;
-                    vecAreaInfo.add(currChange.index + iAddedAI - iRemovedAI,
-                                    currChange.ai);
+                    areaInfosAdded++;
+                    changeIndex = currChange.index + areaInfosAdded - areaInfosRemoved;
                 }
+                vecAreaInfo.add(changeIndex, currChange.ai);
             }
             changeList.clear();
         }
 
-        iReturnedIndex = 0;
-        return bChanged;
+        returnedIndex = 0;
+        return hasChanged;
     }
 
     /** {@inheritDoc} */
@@ -959,18 +937,16 @@
 
         LinkedList returnList = new LinkedList();
 
-        while (iReturnedIndex < vecAreaInfo.size()) {
-            AreaInfo ai = (AreaInfo) vecAreaInfo.get(iReturnedIndex);
-            if (ai.iWScount == 0) {
+        while (returnedIndex < vecAreaInfo.size()) {
+            AreaInfo ai = (AreaInfo) vecAreaInfo.get(returnedIndex);
+            if (ai.wordSpaceCount == 0) {
                 // ai refers either to a word or a word fragment
-                returnList.addAll
-                (createElementsForAWordFragment(alignment, ai, iReturnedIndex, letterSpaceIPD));
+                addElementsForAWordFragment(returnList, alignment, ai, returnedIndex, letterSpaceIPD);
             } else {
                 // ai refers to a space
-                returnList.addAll
-                (createElementsForASpace(alignment, ai, iReturnedIndex));
+                addElementsForASpace(returnList, alignment, ai, returnedIndex);
             }
-            iReturnedIndex++;
+            returnedIndex++;
         } // end of while
         setFinished(true);
         //ElementListObserver.observe(returnList, "text-changed", null);
@@ -979,63 +955,55 @@
 
     /** {@inheritDoc} */
     public void getWordChars(StringBuffer sbChars, Position pos) {
-        int iLeafValue = ((LeafPosition) pos).getLeafPos();
-        if (iLeafValue != -1) {
-            AreaInfo ai = (AreaInfo) vecAreaInfo.get(iLeafValue);
-            sbChars.append(new String(textArray, ai.iStartIndex,
-                                      ai.iBreakIndex - ai.iStartIndex));
+        int leafValue = ((LeafPosition) pos).getLeafPos();
+        if (leafValue != -1) {
+            AreaInfo ai = (AreaInfo) vecAreaInfo.get(leafValue);
+            sbChars.append(textArray, ai.startIndex, ai.breakIndex - ai.startIndex);
         }
     }
 
-    private LinkedList createElementsForASpace(int alignment,
-            AreaInfo ai, int leafValue) {
-        LinkedList spaceElements = new LinkedList();
+    private void addElementsForASpace(List baseList,
+                                      int alignment,
+                                      AreaInfo ai,
+                                      int leafValue) {
         LeafPosition mainPosition = new LeafPosition(this, leafValue);
-        
+
         if (!ai.breakOppAfter) {
             // a non-breaking space
             if (alignment == EN_JUSTIFY) {
                 // the space can stretch and shrink, and must be preserved
                 // when starting a line
-                spaceElements.add(new KnuthInlineBox(0, null,
-                        notifyPos(new LeafPosition(this, -1)), true));
-                spaceElements.add(new KnuthPenalty(0, KnuthElement.INFINITE,
-                        false, new LeafPosition(this, -1), false));
-                spaceElements.add(new KnuthGlue(ai.ipdArea.opt, ai.ipdArea.max - ai.ipdArea.opt, 
-                        ai.ipdArea.opt - ai.ipdArea.min, mainPosition, false));
+                baseList.add(makeAuxiliaryZeroWidthBox());
+                baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                baseList.add(new KnuthGlue(ai.areaIPD.opt, ai.areaIPD.max - ai.areaIPD.opt,
+                        ai.areaIPD.opt - ai.areaIPD.min, mainPosition, false));
             } else {
                 // the space does not need to stretch or shrink, and must be
                 // preserved when starting a line
-                spaceElements.add(new KnuthInlineBox(ai.ipdArea.opt, null,
+                baseList.add(new KnuthInlineBox(ai.areaIPD.opt, null,
                         mainPosition, true));
             }
         } else {
-            if (textArray[ai.iStartIndex] != CharUtilities.SPACE
+            if (textArray[ai.startIndex] != CharUtilities.SPACE
                     || foText.getWhitespaceTreatment() == Constants.EN_PRESERVE) {
                 // a breaking space that needs to be preserved
                 switch (alignment) {
                 case EN_CENTER:
                     // centered text:
-                    // if the second element is chosen as a line break these elements 
+                    // if the second element is chosen as a line break these elements
                     // add a constant amount of stretch at the end of a line and at the
                     // beginning of the next one, otherwise they don't add any stretch
-                    spaceElements.add(new KnuthGlue(lineEndBAP,
+                    baseList.add(new KnuthGlue(lineEndBAP,
                             3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                            new LeafPosition(this, -1), false));
-                    spaceElements
-                            .add(new KnuthPenalty(
-                                    0,
-                                    0, false,
-                                    new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthGlue(
+                            auxiliaryPosition, false));
+                    baseList.add(makeZeroWidthPenalty(0));
+                    baseList.add(new KnuthGlue(
                             - (lineStartBAP + lineEndBAP), -6
                             * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                            new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthInlineBox(0, null,
-                            notifyPos(new LeafPosition(this, -1)), false));
-                    spaceElements.add(new KnuthPenalty(0, KnuthElement.INFINITE,
-                            false, new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt + lineStartBAP,
+                            auxiliaryPosition, false));
+                    baseList.add(makeAuxiliaryZeroWidthBox());
+                    baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                    baseList.add(new KnuthGlue(ai.areaIPD.opt + lineStartBAP,
                             3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
                             mainPosition, false));
                     break;
@@ -1043,124 +1011,102 @@
                 case EN_START: // fall through
                 case EN_END:
                     // left- or right-aligned text:
-                    // if the second element is chosen as a line break these elements 
+                    // if the second element is chosen as a line break these elements
                     // add a constant amount of stretch at the end of a line, otherwise
                     // they don't add any stretch
-                    spaceElements.add(new KnuthGlue(lineEndBAP,
+                    baseList.add(new KnuthGlue(lineEndBAP,
                             3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                            new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthPenalty(0, 0, false,
-                            new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthGlue(
+                            auxiliaryPosition, false));
+                    baseList.add(makeZeroWidthPenalty(0));
+                    baseList.add(new KnuthGlue(
                             - (lineStartBAP + lineEndBAP), -3
                             * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                            new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthInlineBox(0, null,
-                            notifyPos(new LeafPosition(this, -1)), false));
-                    spaceElements.add(new KnuthPenalty(0,
-                            KnuthElement.INFINITE, false, new LeafPosition(
-                                    this, -1), false));
-                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt + lineStartBAP, 0, 0,
+                            auxiliaryPosition, false));
+                    baseList.add(makeAuxiliaryZeroWidthBox());
+                    baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                    baseList.add(new KnuthGlue(ai.areaIPD.opt + lineStartBAP, 0, 0,
                             mainPosition, false));
                     break;
 
                 case EN_JUSTIFY:
                     // justified text:
                     // the stretch and shrink depends on the space width
-                    spaceElements.add(new KnuthGlue(lineEndBAP, 0, 0,
-                            new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthPenalty(0, 0, false,
-                            new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthGlue(
-                            - (lineStartBAP + lineEndBAP), ai.ipdArea.max
-                            - ai.ipdArea.opt, ai.ipdArea.opt - ai.ipdArea.min,
-                            new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthInlineBox(0, null,
-                            notifyPos(new LeafPosition(this, -1)), false));
-                    spaceElements.add(new KnuthPenalty(0,
-                            KnuthElement.INFINITE, false, new LeafPosition(
-                                    this, -1), false));
-                    spaceElements.add(new KnuthGlue(lineStartBAP + ai.ipdArea.opt, 0, 0,
+                    baseList.add(new KnuthGlue(lineEndBAP, 0, 0,
+                            auxiliaryPosition, false));
+                    baseList.add(makeZeroWidthPenalty(0));
+                    baseList.add(new KnuthGlue(
+                            - (lineStartBAP + lineEndBAP), ai.areaIPD.max
+                            - ai.areaIPD.opt, ai.areaIPD.opt - ai.areaIPD.min,
+                            auxiliaryPosition, false));
+                    baseList.add(makeAuxiliaryZeroWidthBox());
+                    baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                    baseList.add(new KnuthGlue(lineStartBAP + ai.areaIPD.opt, 0, 0,
                             mainPosition, false));
                     break;
 
                 default:
                     // last line justified, the other lines unjustified:
                     // use only the space stretch
-                    spaceElements.add(new KnuthGlue(lineEndBAP, 0, 0,
-                            new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthPenalty(0, 0, false,
-                            new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthGlue(
-                            - (lineStartBAP + lineEndBAP), ai.ipdArea.max
-                            - ai.ipdArea.opt, 0,
-                            new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthInlineBox(0, null,
-                            notifyPos(new LeafPosition(this, -1)), false));
-                    spaceElements.add(new KnuthPenalty(0,
-                            KnuthElement.INFINITE, false, new LeafPosition(
-                                    this, -1), false));
-                    spaceElements.add(new KnuthGlue(lineStartBAP + ai.ipdArea.opt, 0, 0,
+                    baseList.add(new KnuthGlue(lineEndBAP, 0, 0,
+                            auxiliaryPosition, false));
+                    baseList.add(makeZeroWidthPenalty(0));
+                    baseList.add(new KnuthGlue(
+                            - (lineStartBAP + lineEndBAP), ai.areaIPD.max
+                            - ai.areaIPD.opt, 0,
+                            auxiliaryPosition, false));
+                    baseList.add(makeAuxiliaryZeroWidthBox());
+                    baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                    baseList.add(new KnuthGlue(lineStartBAP + ai.areaIPD.opt, 0, 0,
                             mainPosition, false));
-                } 
+                }
             } else {
                 // a (possible block) of breaking spaces
                 switch (alignment) {
                 case EN_CENTER:
                     // centered text:
-                    // if the second element is chosen as a line break these elements 
+                    // if the second element is chosen as a line break these elements
                     // add a constant amount of stretch at the end of a line and at the
                     // beginning of the next one, otherwise they don't add any stretch
-                    spaceElements.add(new KnuthGlue(lineEndBAP,
+                    baseList.add(new KnuthGlue(lineEndBAP,
                             3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                            new LeafPosition(this, -1), false));
-                    spaceElements
-                            .add(new KnuthPenalty(
-                                    0, 0, false,
-                                    new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt
+                            auxiliaryPosition, false));
+                    baseList.add(makeZeroWidthPenalty(0));
+                    baseList.add(new KnuthGlue(ai.areaIPD.opt
                             - (lineStartBAP + lineEndBAP), -6
                             * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
                             mainPosition, false));
-                    spaceElements.add(new KnuthInlineBox(0, null,
-                            notifyPos(new LeafPosition(this, -1)), false));
-                    spaceElements.add(new KnuthPenalty(0, KnuthElement.INFINITE,
-                            false, new LeafPosition(this, -1), false));
-                    spaceElements.add(new KnuthGlue(lineStartBAP,
+                    baseList.add(makeAuxiliaryZeroWidthBox());
+                    baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                    baseList.add(new KnuthGlue(lineStartBAP,
                             3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                            new LeafPosition(this, -1), false));
+                            auxiliaryPosition, false));
                     break;
 
                 case EN_START: // fall through
                 case EN_END:
                     // left- or right-aligned text:
-                    // if the second element is chosen as a line break these elements 
+                    // if the second element is chosen as a line break these elements
                     // add a constant amount of stretch at the end of a line, otherwise
                     // they don't add any stretch
                     if (lineStartBAP != 0 || lineEndBAP != 0) {
-                        spaceElements.add(new KnuthGlue(lineEndBAP,
+                        baseList.add(new KnuthGlue(lineEndBAP,
                                 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                new LeafPosition(this, -1), false));
-                        spaceElements.add(new KnuthPenalty(0, 0, false,
-                                new LeafPosition(this, -1), false));
-                        spaceElements.add(new KnuthGlue(ai.ipdArea.opt
+                                auxiliaryPosition, false));
+                        baseList.add(makeZeroWidthPenalty(0));
+                        baseList.add(new KnuthGlue(ai.areaIPD.opt
                                 - (lineStartBAP + lineEndBAP), -3
                                 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
                                 mainPosition, false));
-                        spaceElements.add(new KnuthInlineBox(0, null,
-                                notifyPos(new LeafPosition(this, -1)), false));
-                        spaceElements.add(new KnuthPenalty(0,
-                                KnuthElement.INFINITE, false, new LeafPosition(
-                                        this, -1), false));
-                        spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0,
-                                new LeafPosition(this, -1), false));
+                        baseList.add(makeAuxiliaryZeroWidthBox());
+                        baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                        baseList.add(new KnuthGlue(lineStartBAP, 0, 0,
+                                auxiliaryPosition, false));
                     } else {
-                        spaceElements.add(new KnuthGlue(0,
+                        baseList.add(new KnuthGlue(0,
                                 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                new LeafPosition(this, -1), false));
-                        spaceElements.add(new KnuthPenalty(0, 0, false,
-                                new LeafPosition(this, -1), false));
-                        spaceElements.add(new KnuthGlue(ai.ipdArea.opt, -3
+                                auxiliaryPosition, false));
+                        baseList.add(makeZeroWidthPenalty(0));
+                        baseList.add(new KnuthGlue(ai.areaIPD.opt, -3
                                 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
                                 mainPosition, false));
                     }
@@ -1170,26 +1116,22 @@
                     // justified text:
                     // the stretch and shrink depends on the space width
                     if (lineStartBAP != 0 || lineEndBAP != 0) {
-                        spaceElements.add(new KnuthGlue(lineEndBAP, 0, 0,
-                                new LeafPosition(this, -1), false));
-                        spaceElements.add(new KnuthPenalty(0, 0, false,
-                                new LeafPosition(this, -1), false));
-                        spaceElements.add(new KnuthGlue(
-                                ai.ipdArea.opt - (lineStartBAP + lineEndBAP),
-                                ai.ipdArea.max - ai.ipdArea.opt,
-                                ai.ipdArea.opt - ai.ipdArea.min,
+                        baseList.add(new KnuthGlue(lineEndBAP, 0, 0,
+                                auxiliaryPosition, false));
+                        baseList.add(makeZeroWidthPenalty(0));
+                        baseList.add(new KnuthGlue(
+                                ai.areaIPD.opt - (lineStartBAP + lineEndBAP),
+                                ai.areaIPD.max - ai.areaIPD.opt,
+                                ai.areaIPD.opt - ai.areaIPD.min,
                                 mainPosition, false));
-                        spaceElements.add(new KnuthInlineBox(0, null,
-                                notifyPos(new LeafPosition(this, -1)), false));
-                        spaceElements.add(new KnuthPenalty(0,
-                                KnuthElement.INFINITE, false, new LeafPosition(
-                                        this, -1), false));
-                        spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0,
-                                new LeafPosition(this, -1), false));
+                        baseList.add(makeAuxiliaryZeroWidthBox());
+                        baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                        baseList.add(new KnuthGlue(lineStartBAP, 0, 0,
+                                auxiliaryPosition, false));
                     } else {
-                        spaceElements.add(new KnuthGlue(ai.ipdArea.opt,
-                                ai.ipdArea.max - ai.ipdArea.opt,
-                                ai.ipdArea.opt - ai.ipdArea.min,
+                        baseList.add(new KnuthGlue(ai.areaIPD.opt,
+                                ai.areaIPD.max - ai.areaIPD.opt,
+                                ai.areaIPD.opt - ai.areaIPD.min,
                                 mainPosition, false));
                     }
                     break;
@@ -1198,279 +1140,190 @@
                     // last line justified, the other lines unjustified:
                     // use only the space stretch
                     if (lineStartBAP != 0 || lineEndBAP != 0) {
-                        spaceElements.add(new KnuthGlue(lineEndBAP, 0, 0,
-                                new LeafPosition(this, -1), false));
-                        spaceElements.add(new KnuthPenalty(0, 0, false,
-                                new LeafPosition(this, -1), false));
-                        spaceElements.add(new KnuthGlue(
-                                ai.ipdArea.opt - (lineStartBAP + lineEndBAP),
-                                ai.ipdArea.max - ai.ipdArea.opt,
+                        baseList.add(new KnuthGlue(lineEndBAP, 0, 0,
+                                auxiliaryPosition, false));
+                        baseList.add(makeZeroWidthPenalty(0));
+                        baseList.add(new KnuthGlue(
+                                ai.areaIPD.opt - (lineStartBAP + lineEndBAP),
+                                ai.areaIPD.max - ai.areaIPD.opt,
                                 0, mainPosition, false));
-                        spaceElements.add(new KnuthInlineBox(0, null,
-                                notifyPos(new LeafPosition(this, -1)), false));
-                        spaceElements.add(new KnuthPenalty(0,
-                                KnuthElement.INFINITE, false, new LeafPosition(
-                                        this, -1), false));
-                        spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0,
-                                new LeafPosition(this, -1), false));
+                        baseList.add(makeAuxiliaryZeroWidthBox());
+                        baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                        baseList.add(new KnuthGlue(lineStartBAP, 0, 0,
+                                auxiliaryPosition, false));
                     } else {
-                        spaceElements.add(new KnuthGlue(ai.ipdArea.opt,
-                                ai.ipdArea.max - ai.ipdArea.opt, 0,
+                        baseList.add(new KnuthGlue(ai.areaIPD.opt,
+                                ai.areaIPD.max - ai.areaIPD.opt, 0,
                                 mainPosition, false));
                     }
                 }
             }
         }
-        
-        return spaceElements;
     }
 
-    private LinkedList createElementsForAWordFragment(int alignment,
-            AreaInfo ai, int leafValue, MinOptMax letterSpaceWidth) {
-        LinkedList wordElements = new LinkedList();
+    private void addElementsForAWordFragment(List baseList,
+                                             int alignment,
+                                             AreaInfo ai,
+                                             int leafValue,
+                                             MinOptMax letterSpaceWidth) {
+
         LeafPosition mainPosition = new LeafPosition(this, leafValue);
 
         // if the last character of the word fragment is '-' or '/',
         // the fragment could end a line; in this case, it loses one
         // of its letter spaces;
-        boolean bSuppressibleLetterSpace = ai.breakOppAfter && !ai.bHyphenated;
+        boolean suppressibleLetterSpace = ai.breakOppAfter && !ai.isHyphenated;
 
         if (letterSpaceWidth.min == letterSpaceWidth.max) {
             // constant letter spacing
-            wordElements.add
-                (new KnuthInlineBox(
-                        bSuppressibleLetterSpace 
-                                ? ai.ipdArea.opt - letterSpaceWidth.opt
-                                : ai.ipdArea.opt,
+            baseList.add(new KnuthInlineBox(
+                        suppressibleLetterSpace
+                                ? ai.areaIPD.opt - letterSpaceWidth.opt
+                                : ai.areaIPD.opt,
                         alignmentContext,
                         notifyPos(mainPosition), false));
         } else {
             // adjustable letter spacing
-            int unsuppressibleLetterSpaces 
-                = bSuppressibleLetterSpace ? ai.iLScount - 1 : ai.iLScount;
-            wordElements.add
-                (new KnuthInlineBox(ai.ipdArea.opt
-                        - ai.iLScount * letterSpaceWidth.opt,
+            int unsuppressibleLetterSpaces
+                = suppressibleLetterSpace ? ai.letterSpaceCount - 1 : ai.letterSpaceCount;
+            baseList.add
+                (new KnuthInlineBox(ai.areaIPD.opt
+                        - ai.letterSpaceCount * letterSpaceWidth.opt,
                         alignmentContext,
                         notifyPos(mainPosition), false));
-            wordElements.add
-                (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                        new LeafPosition(this, -1), true));
-            wordElements.add
+            baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+            baseList.add
                 (new KnuthGlue(unsuppressibleLetterSpaces * letterSpaceWidth.opt,
                         unsuppressibleLetterSpaces * (letterSpaceWidth.max - letterSpaceWidth.opt),
                         unsuppressibleLetterSpaces * (letterSpaceWidth.opt - letterSpaceWidth.min),
-                        new LeafPosition(this, -1), true));
-            wordElements.add
-                (new KnuthInlineBox(0, null,
-                              notifyPos(new LeafPosition(this, -1)), true));
+                        auxiliaryPosition, true));
+            baseList.add(makeAuxiliaryZeroWidthBox());
         }
- 
+
         // extra-elements if the word fragment is the end of a syllable,
         // or it ends with a character that can be used as a line break
-        if (ai.bHyphenated) {
+        if (ai.isHyphenated) {
             MinOptMax widthIfNoBreakOccurs = null;
-            if (ai.iBreakIndex < textArray.length) {
+            if (ai.breakIndex < textArray.length) {
                 //Add in kerning in no-break condition
-                widthIfNoBreakOccurs = letterAdjustArray[ai.iBreakIndex];
+                widthIfNoBreakOccurs = letterAdjustArray[ai.breakIndex];
             }
-            //if (ai.iBreakIndex)
-            
+            //if (ai.breakIndex)
+
             // the word fragment ends at the end of a syllable:
             // if a break occurs the content width increases,
             // otherwise nothing happens
-            wordElements.addAll(createElementsForAHyphen(alignment, hyphIPD, widthIfNoBreakOccurs, ai.breakOppAfter && ai.bHyphenated));
-        } else if (bSuppressibleLetterSpace) {
+            addElementsForAHyphen(baseList, alignment, hyphIPD, widthIfNoBreakOccurs, ai.breakOppAfter && ai.isHyphenated);
+        } else if (suppressibleLetterSpace) {
             // the word fragment ends with a character that acts as a hyphen
             // if a break occurs the width does not increase,
             // otherwise there is one more letter space
-            wordElements.addAll(createElementsForAHyphen(alignment, 0, letterSpaceWidth, true));
+            addElementsForAHyphen(baseList, alignment, 0, letterSpaceWidth, true);
         }
-        return wordElements;
     }
 
     // static final int SOFT_HYPHEN_PENALTY = KnuthPenalty.FLAGGED_PENALTY / 10;
     static final int SOFT_HYPHEN_PENALTY = 1;
-    private LinkedList createElementsForAHyphen(int alignment,
-            int widthIfBreakOccurs, MinOptMax widthIfNoBreakOccurs, boolean unflagged) {
+
+    private void addElementsForAHyphen(List baseList,
+                                       int alignment,
+                                       int widthIfBreakOccurs,
+                                       MinOptMax widthIfNoBreakOccurs,
+                                       boolean unflagged) {
         if (widthIfNoBreakOccurs == null) {
             widthIfNoBreakOccurs = ZERO_MINOPTMAX;
         }
-        LinkedList hyphenElements = new LinkedList();
-        
+
         switch (alignment) {
         case EN_CENTER :
             // centered text:
-            /*
-            hyphenElements.add
-                (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                        new LeafPosition(this, -1), false));
-            hyphenElements.add
-                (new KnuthPenalty(hyphIPD,
-                        KnuthPenalty.FLAGGED_PENALTY, true,
-                        new LeafPosition(this, -1), false));
-            hyphenElements.add
-                (new KnuthGlue(0,
-                        - 6 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                        new LeafPosition(this, -1), false));
-            hyphenElements.add
-                (new KnuthInlineBox(0, 0, 0, 0,
-                        new LeafPosition(this, -1), false));
-            hyphenElements.add
-                (new KnuthPenalty(0, KnuthElement.INFINITE, true,
-                        new LeafPosition(this, -1), false));
-            hyphenElements.add
-                (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                        new LeafPosition(this, -1), false));
-            */
-            hyphenElements.add
-                (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                        new LeafPosition(this, -1), true));
-            hyphenElements.add
-                (new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                               new LeafPosition(this, -1), true));
-            hyphenElements.add
-                (new KnuthPenalty(hyphIPD,
+            baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+            baseList.add(new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                               auxiliaryPosition, true));
+            baseList.add(new KnuthPenalty(hyphIPD,
                         unflagged ? SOFT_HYPHEN_PENALTY : KnuthPenalty.FLAGGED_PENALTY, !unflagged,
-                        new LeafPosition(this, -1), false));
-            hyphenElements.add
-                (new KnuthGlue(-(lineEndBAP + lineStartBAP),
+                        auxiliaryPosition, false));
+            baseList.add(new KnuthGlue(-(lineEndBAP + lineStartBAP),
                         -6 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                        new LeafPosition(this, -1), false));
-            hyphenElements.add
-                (new KnuthInlineBox(0, null,
-                                    notifyPos(new LeafPosition(this, -1)), true));
-            hyphenElements.add
-               (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                                 new LeafPosition(this, -1), true));
-            hyphenElements.add
-                (new KnuthGlue(lineStartBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                               new LeafPosition(this, -1), true));
+                        auxiliaryPosition, false));
+            baseList.add(makeAuxiliaryZeroWidthBox());
+            baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+            baseList.add(new KnuthGlue(lineStartBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                               auxiliaryPosition, true));
             break;
-            
+
         case EN_START  : // fall through
         case EN_END    :
             // left- or right-aligned text:
-            /*
-            hyphenElements.add
-                (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                        new LeafPosition(this, -1), false));
-            hyphenElements.add
-                (new KnuthPenalty(widthIfBreakOccurs,
-                        KnuthPenalty.FLAGGED_PENALTY, true,
-                        new LeafPosition(this, -1), false));
-             hyphenElements.add
-                (new KnuthGlue(widthIfNoBreakOccurs.opt,
-                        - 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                        new LeafPosition(this, -1), false));
-            */
             if (lineStartBAP != 0 || lineEndBAP != 0) {
-                hyphenElements.add
-                    (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                            new LeafPosition(this, -1), true));
-                hyphenElements.add
-                    (new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                   new LeafPosition(this, -1), false));
-                hyphenElements.add
-                    (new KnuthPenalty(widthIfBreakOccurs,
+                baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                baseList.add(new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                                   auxiliaryPosition, false));
+                baseList.add(new KnuthPenalty(widthIfBreakOccurs,
                             unflagged ? SOFT_HYPHEN_PENALTY : KnuthPenalty.FLAGGED_PENALTY, !unflagged,
-                            new LeafPosition(this, -1), false));
-                hyphenElements.add
-                    (new KnuthGlue(widthIfNoBreakOccurs.opt - (lineStartBAP + lineEndBAP),
+                            auxiliaryPosition, false));
+                baseList.add(new KnuthGlue(widthIfNoBreakOccurs.opt - (lineStartBAP + lineEndBAP),
                                    -3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                   new LeafPosition(this, -1), false));
-                hyphenElements.add
-                    (new KnuthInlineBox(0, null,
-                                        notifyPos(new LeafPosition(this, -1)), false));
-                hyphenElements.add
-                   (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                                     new LeafPosition(this, -1), false));
-                hyphenElements.add
-                    (new KnuthGlue(lineStartBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
+                                   auxiliaryPosition, false));
+                baseList.add(makeAuxiliaryZeroWidthBox());
+                baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                baseList.add(new KnuthGlue(lineStartBAP, 0, 0,
+                                   auxiliaryPosition, false));
             } else {
-                hyphenElements.add
-                    (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                            new LeafPosition(this, -1), true));
-                hyphenElements.add
-                    (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                            new LeafPosition(this, -1), false));
-                hyphenElements.add
-                    (new KnuthPenalty(widthIfBreakOccurs,
+                baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                baseList.add(new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                            auxiliaryPosition, false));
+                baseList.add(new KnuthPenalty(widthIfBreakOccurs,
                             unflagged ? SOFT_HYPHEN_PENALTY : KnuthPenalty.FLAGGED_PENALTY, !unflagged,
-                            new LeafPosition(this, -1), false));
-                hyphenElements.add
-                    (new KnuthGlue(widthIfNoBreakOccurs.opt,
+                            auxiliaryPosition, false));
+                baseList.add(new KnuthGlue(widthIfNoBreakOccurs.opt,
                             -3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                            new LeafPosition(this, -1), false));
+                            auxiliaryPosition, false));
             }
             break;
-            
+
         default:
             // justified text, or last line justified:
             // just a flagged penalty
-            /*
-            hyphenElements.add
-                (new KnuthPenalty(widthIfBreakOccurs,
-                        KnuthPenalty.FLAGGED_PENALTY, true,
-                        new LeafPosition(this, -1), false));
-            */
             if (lineStartBAP != 0 || lineEndBAP != 0) {
-                hyphenElements.add
-                    (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                            new LeafPosition(this, -1), true));
-
-                hyphenElements.add
-                    (new KnuthGlue(lineEndBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
-                hyphenElements.add
-                    (new KnuthPenalty(widthIfBreakOccurs,
+                baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                baseList.add(new KnuthGlue(lineEndBAP, 0, 0,
+                                   auxiliaryPosition, false));
+                baseList.add(new KnuthPenalty(widthIfBreakOccurs,
                             unflagged ? SOFT_HYPHEN_PENALTY : KnuthPenalty.FLAGGED_PENALTY, !unflagged,
-                            new LeafPosition(this, -1), false));
+                            auxiliaryPosition, false));
                 // extra elements representing a letter space that is suppressed
                 // if a break occurs
                 if (widthIfNoBreakOccurs.min != 0
                     || widthIfNoBreakOccurs.max != 0) {
-                    hyphenElements.add
-                        (new KnuthGlue(widthIfNoBreakOccurs.opt - (lineStartBAP + lineEndBAP),
+                    baseList.add(new KnuthGlue(widthIfNoBreakOccurs.opt - (lineStartBAP + lineEndBAP),
                                 widthIfNoBreakOccurs.max - widthIfNoBreakOccurs.opt,
                                 widthIfNoBreakOccurs.opt - widthIfNoBreakOccurs.min,
-                                new LeafPosition(this, -1), false));
+                                auxiliaryPosition, false));
                 } else {
-                    hyphenElements.add
-                        (new KnuthGlue(-(lineStartBAP + lineEndBAP), 0, 0,
-                                       new LeafPosition(this, -1), false));
+                    baseList.add(new KnuthGlue(-(lineStartBAP + lineEndBAP), 0, 0,
+                                       auxiliaryPosition, false));
                 }
-                hyphenElements.add
-                    (new KnuthInlineBox(0, null,
-                                        notifyPos(new LeafPosition(this, -1)), false));
-                hyphenElements.add
-                    (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                                      new LeafPosition(this, -1), false));
-                hyphenElements.add
-                    (new KnuthGlue(lineStartBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
+                baseList.add(makeAuxiliaryZeroWidthBox());
+                baseList.add(makeZeroWidthPenalty(KnuthPenalty.INFINITE));
+                baseList.add(new KnuthGlue(lineStartBAP, 0, 0,
+                                   auxiliaryPosition, false));
             } else {
-                hyphenElements.add
-                    (new KnuthPenalty(widthIfBreakOccurs,
+                baseList.add(new KnuthPenalty(widthIfBreakOccurs,
                             unflagged ? SOFT_HYPHEN_PENALTY : KnuthPenalty.FLAGGED_PENALTY, !unflagged,
-                            new LeafPosition(this, -1), false));
+                            auxiliaryPosition, false));
                 // extra elements representing a letter space that is suppressed
                 // if a break occurs
                 if (widthIfNoBreakOccurs.min != 0
                     || widthIfNoBreakOccurs.max != 0) {
-                    hyphenElements.add
-                        (new KnuthGlue(widthIfNoBreakOccurs.opt,
+                    baseList.add(new KnuthGlue(widthIfNoBreakOccurs.opt,
                                 widthIfNoBreakOccurs.max - widthIfNoBreakOccurs.opt,
                                 widthIfNoBreakOccurs.opt - widthIfNoBreakOccurs.min,
-                                new LeafPosition(this, -1), false));
+                                auxiliaryPosition, false));
                 }
             }
         }
-        
-        return hyphenElements;
-    }
     
-}
-
+    }
 
+}

Modified: xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java?rev=653718&r1=653717&r2=653718&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java (original)
+++ xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java Tue May  6 02:14:47 2008
@@ -83,7 +83,6 @@
      */
     public TableCellLayoutManager(TableCell node, PrimaryGridUnit pgu) {
         super(node);
-        fobj = node;
         this.primaryGridUnit = pgu;
     }
 

Modified: xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/render/pcl/PCLRenderer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/render/pcl/PCLRenderer.java?rev=653718&r1=653717&r2=653718&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/render/pcl/PCLRenderer.java (original)
+++ xmlgraphics/fop/branches/Temp_AFPGOCAResources/src/java/org/apache/fop/render/pcl/PCLRenderer.java Tue May  6 02:14:47 2008
@@ -156,6 +156,11 @@
      */
     private boolean disabledPJL = false;
     
+    /** contains the pageWith of the last printed page */
+    private long pageWidth = 0;
+    /** contains the pageHeight of the last printed page */
+    private long pageHeight = 0;
+    
     /**
      * Create the PCL renderer
      */
@@ -416,29 +421,34 @@
     }
 
     private void selectPageFormat(long pagewidth, long pageheight) throws IOException {
-        this.currentPageDefinition = PCLPageDefinition.getPageDefinition(
-                pagewidth, pageheight, 1000);
-        
-        if (this.currentPageDefinition == null) {
-            this.currentPageDefinition = PCLPageDefinition.getDefaultPageDefinition();
-            PCLEventProducer eventProducer = PCLEventProducer.Provider.get(
-                    getUserAgent().getEventBroadcaster());
-            eventProducer.paperTypeUnavailable(this, pagewidth, pageheight,
-                    this.currentPageDefinition.getName());
-        }
-        if (log.isDebugEnabled()) {
-            log.debug("page size: " + currentPageDefinition.getPhysicalPageSize());
-            log.debug("logical page: " + currentPageDefinition.getLogicalPageRect());
-        }
-        if (this.currentPageDefinition.isLandscapeFormat()) {
-            gen.writeCommand("&l1O"); //Orientation
-        } else {
-            gen.writeCommand("&l0O"); //Orientation
+        //Only set the page format if it changes (otherwise duplex printing won't work) 
+        if ((pagewidth != this.pageWidth) || (pageheight != this.pageHeight))  {
+            this.pageWidth = pagewidth;
+            this.pageHeight = pageheight;
+            
+            this.currentPageDefinition = PCLPageDefinition.getPageDefinition(
+                    pagewidth, pageheight, 1000);
+            
+            if (this.currentPageDefinition == null) {
+                this.currentPageDefinition = PCLPageDefinition.getDefaultPageDefinition();
+                log.warn("Paper type could not be determined. Falling back to: " 
+                        + this.currentPageDefinition.getName());
+            }
+            if (log.isDebugEnabled()) {
+                log.debug("page size: " + currentPageDefinition.getPhysicalPageSize());
+                log.debug("logical page: " + currentPageDefinition.getLogicalPageRect());
+            }
+            
+            if (this.currentPageDefinition.isLandscapeFormat()) {
+                gen.writeCommand("&l1O"); //Landscape Orientation
+            } else {
+                gen.writeCommand("&l0O"); //Portrait Orientation
+            }
+            gen.selectPageSize(this.currentPageDefinition.getSelector());
+            
+            gen.clearHorizontalMargins();
+            gen.setTopMargin(0);
         }
-        gen.selectPageSize(this.currentPageDefinition.getSelector());
-        
-        gen.clearHorizontalMargins();
-        gen.setTopMargin(0);
     }
 
     /** Saves the current graphics state on the stack. */

Modified: xmlgraphics/fop/branches/Temp_AFPGOCAResources/status.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AFPGOCAResources/status.xml?rev=653718&r1=653717&r2=653718&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AFPGOCAResources/status.xml (original)
+++ xmlgraphics/fop/branches/Temp_AFPGOCAResources/status.xml Tue May  6 02:14:47 2008
@@ -60,12 +60,23 @@
       <action context="Renderers" dev="AC" importance="high" type="add">
         Added de-duplication and externalization support for IOCA and GOCA data resource objects.
       </action -->
-      <action context="Code" dev="AD" type="fix" fixed-bug="44203">
+      <action context="Renderers" dev="JM" type="fix" fixes-bug="43650">
+        PCL Renderer: Improved page format selection so it doesn't interfere with
+        duplex printing.
+      </action>
+      <action context="Layout" dev="AD" type="fix" fixes-bug="42703">
+        Fixed a regression introduced by the fix for
+        <link href="https://issues.apache.org/bugzilla/show_bug.cgi?id=44286">Bugzilla 44286</link>.
+      </action>
+      <action context="Layout" dev="AD" type="fix" fixes-bug="43591">
+        Activated min-height/max-height and min-width/max-width properties.
+      </action>
+      <action context="Code" dev="AD" type="fix" fixes-bug="44203">
         Fixed a logic error in Hyphenator.java:
         If the source had an associated InputStream, an UnsupportedOperationException was
         triggered.
       </action>
-      <action context="Code" dev="AD" type="add" fixes-bug="44634">
+      <action context="Renderers" dev="AD" type="add" fixes-bug="44634">
         Add partial support for the "show-destination" property on fo:basic-link
         (PDF output only; see limitations on the compliance page)
       </action>

Modified: xmlgraphics/fop/branches/Temp_AFPGOCAResources/test/fotree/testcases/table_retrieve-table-marker.fo
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AFPGOCAResources/test/fotree/testcases/table_retrieve-table-marker.fo?rev=653718&r1=653717&r2=653718&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AFPGOCAResources/test/fotree/testcases/table_retrieve-table-marker.fo (original)
+++ xmlgraphics/fop/branches/Temp_AFPGOCAResources/test/fotree/testcases/table_retrieve-table-marker.fo Tue May  6 02:14:47 2008
@@ -35,8 +35,8 @@
           <fo:table-row>
             <fo:table-cell number-columns-spanned="2">
               <fo:block>
-                <fo:retrieve-table-marker marker-class-name="mc1">
-                  <test:assert property="marker-class-name" expected="mc1" />
+                <fo:retrieve-table-marker retrieve-class-name="mc1">
+                  <test:assert property="retrieve-class-name" expected="mc1" />
                   <test:assert property="retrieve-position-within-table" expected="FIRST_STARTING" />
                   <test:assert property="retrieve-boundary-within-table" expected="TABLE" />
                 </fo:retrieve-table-marker>



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