Manuel Mall wrote:
this is my code after integrating your patch to add the knuth elements
for line end / start border/padding for the common justify="start" or
"end" case. What I am getting now is a space at the beginning of each
line break!:
if (lineStartBAP != 0 || lineEndBAP != 0) {
sequence.add
(new KnuthGlue(lineEndBAP, 0, 0,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthPenalty(0, 0, false,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthGlue(wordSpaceIPD.opt - (lineStartBAP + lineEndBAP),
wordSpaceIPD.max - wordSpaceIPD.opt,
wordSpaceIPD.opt - wordSpaceIPD.min,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthInlineBox(0, 0, 0, 0,
notifyPos(new LeafPosition(this, -1)), true));
sequence.add
(new KnuthPenalty(0, KnuthElement.INFINITE, false,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthGlue(lineStartBAP, 0, 0,
new LeafPosition(this, vecAreaInfo.size() - 1), false));
} else {
...
}
The LeafPosition(this, vecAreaInfo.size() - 1) (the Position containing
the index of the AreaInfo objects storing information about the space)
should be the one that is discared if a line break happens: i.e. the
second one instead of the third.
With this change, this sequence should be correct for a space in justified
text.
With left- / right-aligned text the overall stretch and shrink of the sequence
should not be changed, so the sequence should be:
sequence.add
(new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH,
0,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthPenalty(0, 0, false,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthGlue(wordSpaceIPD.opt - (lineStartBAP + lineEndBAP),
- 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH,
0,
new LeafPosition(***, false));
sequence.add
(new KnuthInlineBox(0, 0, 0, 0,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthPenalty(0, KnuthElement.INFINITE, false,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthGlue(lineStartBAP, 0, 0,
new LeafPosition(this, -1), true));
With centered text the combined sequence should be:
sequence.add
(new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH,
0,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthPenalty(0, 0, false,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthGlue(wordSpaceIPD.opt - (lineStartBAP + lineEndBAP),
- 6 * LineLayoutManager.DEFAULT_SPACE_WIDTH,
0,
new LeafPosition(***, false));
sequence.add
(new KnuthInlineBox(0, 0, 0, 0,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthPenalty(0, KnuthElement.INFINITE, false,
new LeafPosition(this, -1), true));
sequence.add
(new KnuthGlue(lineStartBAP,
3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
new LeafPosition(this, -1), true));
The Position marked *** should be a LeafPosition(this, vecAreaInfo.size()
- 1); as it is in the element more connected with the "real" space (if
this element is ignored, the space is too) maybe it is this one that must
be "notified".
[from your other message]
I am also unsure what the correct knuth element sequences are in the
case of the forced line break and for hyphenation.
A forced line break should not be very different from the "real" end of
the inline, so I think it should be enough to add a box/glue element
(according to the conditionality [1]) whose width is lineEndBAP before the
penalty. In this case, the next returned sequence should start with the
elements for the initial border and padding.
As per the hyphenation, I think we could use the same sequence created for
a space (according to the alignment), but with the first penalty (the
second element) having the width of the "-".
While answering your message I noticed that there are some inconstitencies
in the TextLM: for example, the LineLM.DEFAULT_SPACE_WIDTH is not used
everywhere it should ... I'll try and find some time to fix them.
I hope I did not answer you too late, otherwise ... "tomorrow is another
day" :-)
The time difference between Italy and Australia can hinder communication!
Regards
Luca
[1] in effects, as a preserved line break forces the end of a line, if
border and padding are conditional there is no need to add any element, as
we are already sure it's the last inline area in the line!