From eb2dae3ff914bad79818905ed699e18124dfd5c5 Mon Sep 17 00:00:00 2001 From: Simon Pepping Date: Thu, 22 Dec 2005 10:34:19 +0000 Subject: [PATCH] Add a letterspace in InlineKnuthSequence git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@358552 13f79535-47bb-0310-9956-ffa450edef68 --- .../fop/layoutmgr/InlineKnuthSequence.java | 47 +++++++++++++++++++ .../layoutmgr/inline/LineLayoutManager.java | 34 -------------- .../inline_letter-spacing_2.xml | 43 +++++++++++++++++ 3 files changed, 90 insertions(+), 34 deletions(-) create mode 100644 test/layoutengine/standard-testcases/inline_letter-spacing_2.xml diff --git a/src/java/org/apache/fop/layoutmgr/InlineKnuthSequence.java b/src/java/org/apache/fop/layoutmgr/InlineKnuthSequence.java index 7872193f3..6932b7600 100644 --- a/src/java/org/apache/fop/layoutmgr/InlineKnuthSequence.java +++ b/src/java/org/apache/fop/layoutmgr/InlineKnuthSequence.java @@ -18,8 +18,12 @@ package org.apache.fop.layoutmgr; +import java.util.LinkedList; import java.util.List; +import org.apache.fop.layoutmgr.inline.InlineLevelLayoutManager; +import org.apache.fop.layoutmgr.inline.KnuthInlineBox; + /** * @@ -65,6 +69,14 @@ public class InlineKnuthSequence extends KnuthSequence { if (!canAppendSequence(sequence)) { return false; } + // does the first element of the first paragraph add to an existing word? + KnuthElement lastOldElement, firstNewElement; + lastOldElement = getLast(); + firstNewElement = sequence.getElement(0); + if (firstNewElement.isBox() && !firstNewElement.isAuxiliary() + && lastOldElement.isBox() && lastOldElement.getW() != 0) { + addALetterSpace(); + } addAll(sequence); return true; } @@ -92,4 +104,39 @@ public class InlineKnuthSequence extends KnuthSequence { return this; } + public void addALetterSpace() { + KnuthBox prevBox = (KnuthBox) removeLast(); + LinkedList oldList = new LinkedList(); + // if there are two consecutive KnuthBoxes the + // first one does not represent a whole word, + // so it must be given one more letter space + if (!prevBox.isAuxiliary()) { + // if letter spacing is constant, + // only prevBox needs to be replaced; + oldList.add(prevBox); + } else { + // prevBox is the last element + // in the sub-sequence + // + // the letter space is added to , + // while the other elements are not changed + oldList.add(prevBox); + oldList.addFirst((KnuthGlue) removeLast()); + oldList.addFirst((KnuthPenalty) removeLast()); + oldList.addFirst((KnuthBox) removeLast()); + } + // adding a letter space could involve, according to the text + // represented by oldList, replacing a glue element or adding + // new elements + addAll(((InlineLevelLayoutManager) + prevBox.getLayoutManager()) + .addALetterSpaceTo(oldList)); + if (((KnuthInlineBox) prevBox).isAnchor()) { + // prevBox represents a footnote citation: copy footnote info + // from prevBox to the new box + KnuthInlineBox newBox = (KnuthInlineBox) getLast(); + newBox.setFootnoteBodyLM(((KnuthInlineBox) prevBox).getFootnoteBodyLM()); + } + } + } diff --git a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java index c96adde02..adad62799 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java @@ -339,40 +339,6 @@ public class LineLayoutManager extends InlineStackingLayoutManager } } - private void addALetterSpace() { - KnuthBox prevBox = (KnuthBox) removeLast(); - LinkedList oldList = new LinkedList(); - // if there are two consecutive KnuthBoxes the - // first one does not represent a whole word, - // so it must be given one more letter space - if (!prevBox.isAuxiliary()) { - // if letter spacing is constant, - // only prevBox needs to be replaced; - oldList.add(prevBox); - } else { - // prevBox is the last element - // in the sub-sequence - // - // the letter space is added to , - // while the other elements are not changed - oldList.add(prevBox); - oldList.addFirst((KnuthGlue) removeLast()); - oldList.addFirst((KnuthPenalty) removeLast()); - oldList.addFirst((KnuthBox) removeLast()); - } - // adding a letter space could involve, according to the text - // represented by oldList, replacing a glue element or adding - // new elements - addAll(((InlineLevelLayoutManager) - prevBox.getLayoutManager()) - .addALetterSpaceTo(oldList)); - if (((KnuthInlineBox) prevBox).isAnchor()) { - // prevBox represents a footnote citation: copy footnote info - // from prevBox to the new box - KnuthInlineBox newBox = (KnuthInlineBox) getLast(); - newBox.setFootnoteBodyLM(((KnuthInlineBox) prevBox).getFootnoteBodyLM()); - } - } } private class LineBreakingAlgorithm extends BreakingAlgorithm { diff --git a/test/layoutengine/standard-testcases/inline_letter-spacing_2.xml b/test/layoutengine/standard-testcases/inline_letter-spacing_2.xml new file mode 100644 index 000000000..27d5f245d --- /dev/null +++ b/test/layoutengine/standard-testcases/inline_letter-spacing_2.xml @@ -0,0 +1,43 @@ + + + + +

+ This test checks whether letterspacing is applied between across + fo:inline elements in the same word. +

+
+ + + + + + + + + + + + normal + + + + + + + + + + +
-- 2.39.5