diff options
author | Adrian Cumiskey <acumiskey@apache.org> | 2008-05-06 09:14:47 +0000 |
---|---|---|
committer | Adrian Cumiskey <acumiskey@apache.org> | 2008-05-06 09:14:47 +0000 |
commit | e413e9c8a102146703e2f47291f5894476edc48b (patch) | |
tree | 1fffea5e760640b3fec268be2446e4791bebf50a /src/java/org/apache | |
parent | 57f554c453e44d309ddba9ac748772c13b24cf38 (diff) | |
download | xmlgraphics-fop-e413e9c8a102146703e2f47291f5894476edc48b.tar.gz xmlgraphics-fop-e413e9c8a102146703e2f47291f5894476edc48b.zip |
Merged revisions 652821-652822,652835,653036,653045,653048,653106,653144,653202,653204,653311,653564 via svnmerge from
https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk
........
r652821 | adelmelle | 2008-05-02 17:58:26 +0100 (Fri, 02 May 2008) | 6 lines
Cleanup/Correction after r657673
-> added missing file FObj.java
-> pushed retrieve-class-name upwards to AbstractRetrieveMarker as a common property
-> corrected use of property-name "retrieve-class-name" in source and testcase
-> improved consistency in code-style
........
r652822 | adelmelle | 2008-05-02 18:00:33 +0100 (Fri, 02 May 2008) | 1 line
Expand imports...
........
r652835 | adelmelle | 2008-05-02 18:28:25 +0100 (Fri, 02 May 2008) | 3 lines
Bugzilla 42703:
Fixed a regression introduced by the fix for Bugzilla 44286
........
r653036 | adelmelle | 2008-05-03 11:21:45 +0100 (Sat, 03 May 2008) | 2 lines
Cleanup: improve code-readibility
........
r653045 | adelmelle | 2008-05-03 11:51:16 +0100 (Sat, 03 May 2008) | 2 lines
Tweak/correction: save local hash-code (as originally intended...)
........
r653048 | adelmelle | 2008-05-03 11:55:07 +0100 (Sat, 03 May 2008) | 2 lines
Tweaks: make fobj member final; have default implementations for some methods throw an UnsupportedOperationException instead of merely logging an error
........
r653106 | acumiskey | 2008-05-03 20:07:18 +0100 (Sat, 03 May 2008) | 1 line
Fixed the build. Assignment on final variable fobj.
........
r653144 | acumiskey | 2008-05-03 22:29:09 +0100 (Sat, 03 May 2008) | 1 line
Fix that preserves the final status of the fobj member variable.
........
r653202 | adelmelle | 2008-05-04 12:37:31 +0100 (Sun, 04 May 2008) | 2 lines
Change private element-generating methods to add the elements to a passed List (improves code-readability and reduces the amount of temporary LinkedList instances)
........
r653204 | adelmelle | 2008-05-04 14:04:28 +0100 (Sun, 04 May 2008) | 4 lines
Further refinements:
-> use cached auxiliary position where possible (analogous to BlockStackingLM)
-> consolidate makeXXXPenalty() helpers
........
r653311 | jeremias | 2008-05-05 07:50:54 +0100 (Mon, 05 May 2008) | 6 lines
Bugzilla #43650:
PCL Renderer: Improved page format selection so it doesn't interfere with duplex printing.
Submitted by: Thomas Margreiter <tm.at.felder.at>
Note:
I've only been able to verify that the change doesn't have any negative effects on simplex printers.
........
r653564 | adelmelle | 2008-05-05 20:27:10 +0100 (Mon, 05 May 2008) | 2 lines
Correction of indentation
........
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AFPGOCAResources@653718 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache')
10 files changed, 572 insertions, 710 deletions
diff --git a/src/java/org/apache/fop/fo/FObj.java b/src/java/org/apache/fop/fo/FObj.java index a2b09640b..79b04c4d7 100644 --- a/src/java/org/apache/fop/fo/FObj.java +++ b/src/java/org/apache/fop/fo/FObj.java @@ -427,12 +427,12 @@ public abstract class FObj extends FONode implements Constants { */ protected boolean isBlockItem(String nsURI, String lName) { return (FO_URI.equals(nsURI) - && (lName.equals("block") - || lName.equals("table") - || lName.equals("table-and-caption") - || lName.equals("block-container") - || lName.equals("list-block") - || lName.equals("float") + && ("block".equals(lName) + || "table".equals(lName) + || "table-and-caption".equals(lName) + || "block-container".equals(lName) + || "list-block".equals(lName) + || "float".equals(lName) || isNeutralItem(nsURI, lName))); } @@ -446,21 +446,21 @@ public abstract class FObj extends FONode implements Constants { */ protected boolean isInlineItem(String nsURI, String lName) { return (FO_URI.equals(nsURI) - && (lName.equals("bidi-override") - || lName.equals("character") - || lName.equals("external-graphic") - || lName.equals("instream-foreign-object") - || lName.equals("inline") - || lName.equals("inline-container") - || lName.equals("leader") - || lName.equals("page-number") - || lName.equals("page-number-citation") - || lName.equals("page-number-citation-last") - || lName.equals("basic-link") - || (lName.equals("multi-toggle") + && ("bidi-override".equals(lName) + || "character".equals(lName) + || "external-graphic".equals(lName) + || "instream-foreign-object".equals(lName) + || "inline".equals(lName) + || "inline-container".equals(lName) + || "leader".equals(lName) + || "page-number".equals(lName) + || "page-number-citation".equals(lName) + || "page-number-citation-last".equals(lName) + || "basic-link".equals(lName) + || ("multi-toggle".equals(lName) && (getNameId() == FO_MULTI_CASE || findAncestor(FO_MULTI_CASE) > 0)) - || (lName.equals("footnote") + || ("footnote".equals(lName) && !isOutOfLineFODescendant) || isNeutralItem(nsURI, lName))); } @@ -487,11 +487,12 @@ public abstract class FObj extends FONode implements Constants { */ boolean isNeutralItem(String nsURI, String lName) { return (FO_URI.equals(nsURI) - && (lName.equals("multi-switch") - || lName.equals("multi-properties") - || lName.equals("wrapper") - || (!isOutOfLineFODescendant && lName.equals("float")) - || lName.equals("retrieve-marker"))); + && ("multi-switch".equals(lName) + || "multi-properties".equals(lName) + || "wrapper".equals(lName) + || (!isOutOfLineFODescendant && "float".equals(lName)) + || "retrieve-marker".equals(lName) + || "retrieve-table-marker".equals(lName))); } /** diff --git a/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java b/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java index bfebf6233..557a1778e 100644 --- a/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java +++ b/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java @@ -116,6 +116,7 @@ public class XMLWhiteSpaceHandler { if (ancestor.getNameId() == Constants.FO_BLOCK) { currentBlock = (Block) ancestor; + nestedBlockStack.push(currentBlock); } } else if (!nestedBlockStack.isEmpty()) { currentBlock = (Block) nestedBlockStack.peek(); @@ -206,9 +207,7 @@ public class XMLWhiteSpaceHandler { /* end of block: clear the references and pop the * nested block stack */ if (!nestedBlockStack.empty()) { - currentBlock = (Block) nestedBlockStack.pop(); - } else { - currentBlock = null; + nestedBlockStack.pop(); } charIter = null; } diff --git a/src/java/org/apache/fop/fo/flow/AbstractRetrieveMarker.java b/src/java/org/apache/fop/fo/flow/AbstractRetrieveMarker.java index 334f98e2f..83a0ddbdc 100644 --- a/src/java/org/apache/fop/fo/flow/AbstractRetrieveMarker.java +++ b/src/java/org/apache/fop/fo/flow/AbstractRetrieveMarker.java @@ -23,9 +23,11 @@ import org.apache.fop.fo.FOText; import org.apache.fop.fo.FObj; import org.apache.fop.fo.FObjMixed; import org.apache.fop.fo.PropertyList; +import org.apache.fop.fo.ValidationException; import org.apache.fop.fo.flow.table.TableFObj; import org.apache.fop.fo.flow.table.Table; import org.apache.fop.apps.FOPException; +import org.xml.sax.Locator; import java.util.Iterator; @@ -40,6 +42,8 @@ public abstract class AbstractRetrieveMarker extends FObjMixed { private PropertyList propertyList; + private String retrieveClassName; + /** * Create a new AbstractRetrieveMarker instance that * is a child of the given {@link FONode} @@ -52,11 +56,26 @@ public abstract class AbstractRetrieveMarker extends FObjMixed { /** * {@inheritDoc} + * <p>XSL Content Model: empty + */ + protected void validateChildNode(Locator loc, String nsURI, String localName) + throws ValidationException { + if (FO_URI.equals(nsURI)) { + invalidChildError(loc, nsURI, localName); + } + } + + /** + * {@inheritDoc} * Store a reference to the parent {@link PropertyList} * to be used when the retrieve-marker is resolved. */ public void bind(PropertyList pList) throws FOPException { super.bind(pList); + this.retrieveClassName = pList.get(PR_RETRIEVE_CLASS_NAME).getString(); + if (retrieveClassName == null || retrieveClassName.equals("")) { + missingPropertyError("retrieve-class-name"); + } this.propertyList = pList.getParentPropertyList(); } @@ -169,4 +188,14 @@ public abstract class AbstractRetrieveMarker extends FObjMixed { } } + /** + * Return the value for the <code>retrieve-class-name</code> + * property + * + * @return the value for retrieve-class-name + */ + public String getRetrieveClassName() { + return this.retrieveClassName; + } + } diff --git a/src/java/org/apache/fop/fo/flow/RetrieveMarker.java b/src/java/org/apache/fop/fo/flow/RetrieveMarker.java index b75e14664..c696d3d14 100644 --- a/src/java/org/apache/fop/fo/flow/RetrieveMarker.java +++ b/src/java/org/apache/fop/fo/flow/RetrieveMarker.java @@ -19,12 +19,9 @@ package org.apache.fop.fo.flow; -import java.util.Iterator; - import org.apache.fop.apps.FOPException; import org.apache.fop.fo.FONode; import org.apache.fop.fo.PropertyList; -import org.apache.fop.fo.ValidationException; import org.xml.sax.Locator; import org.xml.sax.Attributes; @@ -37,7 +34,6 @@ import org.xml.sax.Attributes; public class RetrieveMarker extends AbstractRetrieveMarker { // The value of properties relevant for fo:retrieve-marker. - private String retrieveClassName; private int retrievePosition; private int retrieveBoundary; // End of property values @@ -46,7 +42,7 @@ public class RetrieveMarker extends AbstractRetrieveMarker { * Create a new RetrieveMarker instance that is a * child of the given {@link FONode}. * - * @param parent {@link FONode} that is the parent of this object + * @param parent the parent {@link FONode} */ public RetrieveMarker(FONode parent) { super(parent); @@ -72,47 +68,34 @@ public class RetrieveMarker extends AbstractRetrieveMarker { /** {@inheritDoc} */ public void bind(PropertyList pList) throws FOPException { - - retrieveClassName = pList.get(PR_RETRIEVE_CLASS_NAME).getString(); - retrievePosition = pList.get(PR_RETRIEVE_POSITION).getEnum(); - retrieveBoundary = pList.get(PR_RETRIEVE_BOUNDARY).getEnum(); - - if (retrieveClassName == null || retrieveClassName.equals("")) { - missingPropertyError("retrieve-class-name"); - } super.bind(pList); + this.retrievePosition = pList.get(PR_RETRIEVE_POSITION).getEnum(); + this.retrieveBoundary = pList.get(PR_RETRIEVE_BOUNDARY).getEnum(); } /** - * {@inheritDoc} - * XSL Content Model: empty - */ - protected void validateChildNode(Locator loc, String nsURI, String localName) - throws ValidationException { - if (FO_URI.equals(nsURI)) { - invalidChildError(loc, nsURI, localName); - } - } - - /** - * @return the "retrieve-class-name" property. - */ - public String getRetrieveClassName() { - return retrieveClassName; - } - - /** - * @return the "retrieve-position" property (enum value). + * Return the value for the <code>retrieve-position</code> + * property + * @return the value for retrieve-position-within-table; one of + * {@link org.apache.fop.fo.Constants#EN_FSWP}, + * {@link org.apache.fop.fo.Constants#EN_FIC}, + * {@link org.apache.fop.fo.Constants#EN_LSWP}, + * {@link org.apache.fop.fo.Constants#EN_LEWP}. */ public int getRetrievePosition() { - return retrievePosition; + return this.retrievePosition; } /** - * @return the "retrieve-boundary" property (enum value). + * Return the value for the <code>retrieve-boundary</code> + * property + * @return the value for retrieve-boundary-within-table; one of + * {@link org.apache.fop.fo.Constants#EN_PAGE}, + * {@link org.apache.fop.fo.Constants#EN_PAGE_SEQUENCE}, + * {@link org.apache.fop.fo.Constants#EN_DOCUMENT}. */ public int getRetrieveBoundary() { - return retrieveBoundary; + return this.retrieveBoundary; } /** {@inheritDoc} */ diff --git a/src/java/org/apache/fop/fo/flow/RetrieveTableMarker.java b/src/java/org/apache/fop/fo/flow/RetrieveTableMarker.java index 4a7b8af0d..9d04e308d 100644 --- a/src/java/org/apache/fop/fo/flow/RetrieveTableMarker.java +++ b/src/java/org/apache/fop/fo/flow/RetrieveTableMarker.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id:$ */ +/* $Id$ */ package org.apache.fop.fo.flow; import org.apache.fop.fo.FONode; @@ -30,8 +30,7 @@ import org.xml.sax.Attributes; */ public class RetrieveTableMarker extends AbstractRetrieveMarker { - // The value of properties relevant for fo:retrieve-marker. - private String retrieveClassName; + // The value of properties relevant for fo:retrieve-table-marker. private int retrievePositionWithinTable; private int retrieveBoundaryWithinTable; // end property values @@ -46,7 +45,11 @@ public class RetrieveTableMarker extends AbstractRetrieveMarker { super(parent); } - /** {@inheritDoc} */ + /** + * {@inheritDoc} + * <i>NOTE: An <code>fo:retrieve-table-marker</code> is only permitted as a descendant + * of an <code>fo:table-header</code> or an <code>fo:table-footer</code>.</i> + */ public void processNode(String elementName, Locator locator, Attributes attlist, PropertyList pList) throws FOPException { if (findAncestor(FO_TABLE_HEADER) < 0 && findAncestor(FO_TABLE_FOOTER) < 0) { @@ -59,18 +62,13 @@ public class RetrieveTableMarker extends AbstractRetrieveMarker { /** {@inheritDoc} */ public void bind(PropertyList pList) throws FOPException { - this.retrieveClassName = pList.get(PR_RETRIEVE_CLASS_NAME).getString(); + super.bind(pList); this.retrievePositionWithinTable = pList.get(PR_RETRIEVE_POSITION_WITHIN_TABLE).getEnum(); this.retrieveBoundaryWithinTable = pList.get(PR_RETRIEVE_BOUNDARY_WITHIN_TABLE).getEnum(); } - /** {@inheritDoc} */ - public String getRetrieveClassName() { - return this.retrieveClassName; - } - /** * Return the value for the <code>retrieve-position-within-table</code> * property diff --git a/src/java/org/apache/fop/fo/properties/CommonHyphenation.java b/src/java/org/apache/fop/fo/properties/CommonHyphenation.java index f47ddbe0c..dfafa3b16 100644 --- a/src/java/org/apache/fop/fo/properties/CommonHyphenation.java +++ b/src/java/org/apache/fop/fo/properties/CommonHyphenation.java @@ -203,7 +203,7 @@ public final class CommonHyphenation { /** {@inheritDoc} */ public int hashCode() { - if (hash == 0) { + if (this.hash == 0) { int hash = 17; hash = 37 * hash + (language == null ? 0 : language.hashCode()); hash = 37 * hash + (script == null ? 0 : script.hashCode()); @@ -215,8 +215,9 @@ public final class CommonHyphenation { (hyphenationPushCharacterCount == null ? 0 : hyphenationPushCharacterCount.hashCode()); hash = 37 * hash + (hyphenationRemainCharacterCount == null ? 0 : hyphenationRemainCharacterCount.hashCode()); + this.hash = hash; } - return hash; + return this.hash; } } diff --git a/src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java b/src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java index c5e0ddfc9..7fd289c05 100644 --- a/src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/AbstractBaseLayoutManager.java @@ -29,7 +29,7 @@ import org.apache.fop.fo.FObj; * The base class for nearly all LayoutManagers. * Provides the functionality for merging the {@link LayoutManager} * and the {@link org.apache.fop.datatypes.PercentBaseContext} interfaces - * into a common base calls for all higher LayoutManagers. + * into a common base class for all higher LayoutManagers. */ public abstract class AbstractBaseLayoutManager implements LayoutManager, PercentBaseContext { @@ -39,7 +39,7 @@ public abstract class AbstractBaseLayoutManager /** Indicator if this LM generates block areas */ protected boolean generatesBlockArea = false; /** The formatting object for this LM */ - protected FObj fobj = null; + protected final FObj fobj; /** * logging instance @@ -50,6 +50,7 @@ public abstract class AbstractBaseLayoutManager * Abstract base layout manager. */ public AbstractBaseLayoutManager() { + fobj = null; } /** @@ -58,7 +59,7 @@ public abstract class AbstractBaseLayoutManager * @param fo the formatting object for this layout manager */ public AbstractBaseLayoutManager(FObj fo) { - fobj = fo; + this.fobj = fo; setGeneratesReferenceArea(fo.generatesReferenceAreas()); if (getGeneratesReferenceArea()) { setGeneratesBlockArea(true); @@ -67,9 +68,7 @@ public abstract class AbstractBaseLayoutManager // --------- Property Resolution related functions --------- // - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public int getBaseLength(int lengthBase, FObj fobj) { if (fobj == this.fobj) { switch (lengthBase) { @@ -82,7 +81,7 @@ public abstract class AbstractBaseLayoutManager case LengthBase.CONTAINING_REFAREA_WIDTH: return getReferenceAreaIPD(); default: - log.error(new Exception("Unknown base type for LengthBase:" + lengthBase)); + log.error("Unknown base type for LengthBase:" + lengthBase); return 0; } } else { @@ -112,9 +111,7 @@ public abstract class AbstractBaseLayoutManager } lm = lm.getParent(); } - if (lm == null) { - log.error("No parent LM found"); - } + log.error("No parent LM found"); return 0; } @@ -131,9 +128,7 @@ public abstract class AbstractBaseLayoutManager } lm = lm.getParent(); } - if (lm == null) { - log.error("No parent LM found"); - } + log.error("No parent LM found"); return 0; } @@ -176,9 +171,7 @@ public abstract class AbstractBaseLayoutManager } lm = lm.getParent(); } - if (lm == null) { - log.error("No parent LM found"); - } + log.error("No parent LM found"); return 0; } @@ -195,31 +188,31 @@ public abstract class AbstractBaseLayoutManager } lm = lm.getParent(); } - if (lm == null) { - log.error("No parent LM found"); - } + log.error("No parent LM found"); return 0; } /** * {@inheritDoc} + * <i>NOTE: Should be overridden by subclasses. + * Default implementation throws an <code>UnsupportedOperationException</code>.</i> */ public int getContentAreaIPD() { - log.error("getContentAreaIPD called when it should have been overwritten"); - return 0; + throw new UnsupportedOperationException( + "getContentAreaIPD() called when it should have been overridden"); } /** * {@inheritDoc} + * <i>NOTE: Should be overridden by subclasses. + * Default implementation throws an <code>UnsupportedOperationException</code>.</i> */ public int getContentAreaBPD() { - log.error("getContentAreaBPD called when it should have been overwritten"); - return 0; + throw new UnsupportedOperationException( + "getContentAreaBPD() called when it should have been overridden"); } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public boolean getGeneratesReferenceArea() { return generatesReferenceArea; } @@ -234,9 +227,7 @@ public abstract class AbstractBaseLayoutManager this.generatesReferenceArea = generatesReferenceArea; } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public boolean getGeneratesBlockArea() { return generatesBlockArea; } @@ -250,9 +241,7 @@ public abstract class AbstractBaseLayoutManager this.generatesBlockArea = generatesBlockArea; } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public boolean getGeneratesLineArea() { return false; } diff --git a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java index 40e1c087a..be8a13d50 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java @@ -62,33 +62,40 @@ public class TextLayoutManager extends LeafNodeLayoutManager { * 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { /** 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { /** 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 class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { // in the SpaceVal.makeWordSpacing() method letterSpaceIPD = ls.getSpace(); wordSpaceIPD = MinOptMax.add(new MinOptMax(spaceCharIPD), ws.getSpace()); - - 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); + keepTogether = foText.getKeepTogether().getWithinLine().getEnum() == Constants.EN_ALWAYS; - 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { // 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { * @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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { } // 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { } 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { || CharUtilities.isNonBreakableSpace(ch) || CharUtilities.isFixedWidthSpace(ch); } - + /** {@inheritDoc} */ public LinkedList getNextKnuthElements(LayoutContext context, int alignment) { lineStartBAP = context.getLineStartBorderAndPaddingWidth(); @@ -533,14 +519,14 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { //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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { //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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { //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 class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { } } // 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)))); + (isWordEnd + ? (stopIndex - startIndex - 1) + : (stopIndex - startIndex)))); - if (!(bNothingChanged - && iStopIndex == ai.iBreakIndex - && bHyphenFollows == false)) { + 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { /** {@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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { // 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 @@ public class TextLayoutManager extends LeafNodeLayoutManager { // 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; - } -} - + } +} diff --git a/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java b/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java index 430356bec..6afb57dca 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableCellLayoutManager.java @@ -83,7 +83,6 @@ public class TableCellLayoutManager extends BlockStackingLayoutManager */ public TableCellLayoutManager(TableCell node, PrimaryGridUnit pgu) { super(node); - fobj = node; this.primaryGridUnit = pgu; } diff --git a/src/java/org/apache/fop/render/pcl/PCLRenderer.java b/src/java/org/apache/fop/render/pcl/PCLRenderer.java index b89fba9c1..921856b07 100644 --- a/src/java/org/apache/fop/render/pcl/PCLRenderer.java +++ b/src/java/org/apache/fop/render/pcl/PCLRenderer.java @@ -156,6 +156,11 @@ public class PCLRenderer extends PrintRenderer { */ 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 @@ public class PCLRenderer extends PrintRenderer { } 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. */ |