1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-04 10:19:33 +02:00

overlap bottom margin area of top element with top margin area of bottom element

This commit is contained in:
Nikolay Pultsin 2014-06-06 05:49:11 +01:00
parent 8a0c09c934
commit e4280c88ec
2 changed files with 61 additions and 17 deletions

View file

@ -35,7 +35,9 @@ final class ZLTextLineInfo {
int Width;
int Height;
int Descent;
int VSpaceBefore;
int VSpaceAfter;
boolean PreviousInfoUsed;
int SpaceCounter;
ZLTextStyle StartStyle;
@ -57,6 +59,14 @@ final class ZLTextLineInfo {
return EndElementIndex == ParagraphCursorLength;
}
void adjust(ZLTextLineInfo previous) {
if (!PreviousInfoUsed && previous != null) {
Height -= Math.min(previous.VSpaceAfter, VSpaceBefore);
PreviousInfoUsed = true;
}
}
@Override
public boolean equals(Object o) {
ZLTextLineInfo info = (ZLTextLineInfo)o;
return
@ -65,6 +75,7 @@ final class ZLTextLineInfo {
(StartCharIndex == info.StartCharIndex);
}
@Override
public int hashCode() {
return ParagraphCursor.hashCode() + StartElementIndex + 239 * StartCharIndex;
}

View file

@ -495,7 +495,9 @@ public abstract class ZLTextView extends ZLTextViewBase {
int x = getLeftMargin();
int y = getTopMargin();
int index = 0;
ZLTextLineInfo previousInfo = null;
for (ZLTextLineInfo info : lineInfos) {
info.adjust(previousInfo);
prepareTextLine(page, info, x, y);
y += info.Height + info.Descent + info.VSpaceAfter;
labels[++index] = page.TextElementMap.size();
@ -503,6 +505,7 @@ public abstract class ZLTextView extends ZLTextViewBase {
y = getTopMargin();
x += page.getTextWidth() + getSpaceBetweenColumns();
}
previousInfo = info;
}
x = getLeftMargin();
@ -967,15 +970,17 @@ public abstract class ZLTextView extends ZLTextViewBase {
page.LineInfos.clear();
page.Column0Height = 0;
boolean nextParagraph;
ZLTextLineInfo info = null;
do {
final ZLTextLineInfo previousInfo = info;
resetTextStyle();
final ZLTextParagraphCursor paragraphCursor = result.getParagraphCursor();
final int wordIndex = result.getElementIndex();
applyStyleChanges(paragraphCursor, 0, wordIndex);
ZLTextLineInfo info = new ZLTextLineInfo(paragraphCursor, wordIndex, result.getCharIndex(), getTextStyle());
info = new ZLTextLineInfo(paragraphCursor, wordIndex, result.getCharIndex(), getTextStyle());
final int endIndex = info.ParagraphCursorLength;
while (info.EndElementIndex != endIndex) {
info = processTextLine(page, paragraphCursor, info.EndElementIndex, info.EndCharIndex, endIndex);
info = processTextLine(page, paragraphCursor, info.EndElementIndex, info.EndCharIndex, endIndex, previousInfo);
textAreaHeight -= info.Height + info.Descent;
if (textAreaHeight < 0 && page.LineInfos.size() > page.Column0Height) {
if (page.Column0Height == 0 && page.twoColumnView()) {
@ -1022,12 +1027,14 @@ public abstract class ZLTextView extends ZLTextViewBase {
ZLTextParagraphCursor paragraphCursor,
final int startIndex,
final int startCharIndex,
final int endIndex
final int endIndex,
ZLTextLineInfo previousInfo
) {
final ZLPaintContext context = getContext();
final ZLTextLineInfo info = new ZLTextLineInfo(paragraphCursor, startIndex, startCharIndex, getTextStyle());
final ZLTextLineInfo cachedInfo = myLineInfoCache.get(info);
if (cachedInfo != null) {
cachedInfo.adjust(previousInfo);
applyStyleChanges(paragraphCursor, startIndex, cachedInfo.EndElementIndex);
return cachedInfo;
}
@ -1200,7 +1207,14 @@ public abstract class ZLTextView extends ZLTextViewBase {
setTextStyle(storedStyle);
if (isFirstLine) {
info.Height += info.StartStyle.getSpaceBefore(metrics());
info.VSpaceBefore = info.StartStyle.getSpaceBefore(metrics());
if (previousInfo != null) {
info.PreviousInfoUsed = true;
info.Height += Math.max(0, info.VSpaceBefore - previousInfo.VSpaceAfter);
} else {
info.PreviousInfoUsed = false;
info.Height += info.VSpaceBefore;
}
}
if (info.isEndOfParagraph()) {
info.VSpaceAfter = getTextStyle().getSpaceAfter(metrics());
@ -1520,25 +1534,37 @@ public abstract class ZLTextView extends ZLTextViewBase {
return (unit == SizeUnit.PIXEL_UNIT) ? (info.Height + info.Descent + info.VSpaceAfter) : (info.IsVisible ? 1 : 0);
}
private int paragraphSize(ZLTextPage page, ZLTextWordCursor cursor, boolean beforeCurrentPosition, int unit) {
private static class ParagraphSize {
public int Height;
public int TopMargin;
public int BottomMargin;
}
private ParagraphSize paragraphSize(ZLTextPage page, ZLTextWordCursor cursor, boolean beforeCurrentPosition, int unit) {
final ParagraphSize size = new ParagraphSize();
final ZLTextParagraphCursor paragraphCursor = cursor.getParagraphCursor();
if (paragraphCursor == null) {
return 0;
return size;
}
final int endElementIndex =
beforeCurrentPosition ? cursor.getElementIndex() : paragraphCursor.getParagraphLength();
resetTextStyle();
int size = 0;
int wordIndex = 0;
int charIndex = 0;
ZLTextLineInfo info = null;
while (wordIndex != endElementIndex) {
ZLTextLineInfo info = processTextLine(page, paragraphCursor, wordIndex, charIndex, endElementIndex);
final ZLTextLineInfo prev = info;
info = processTextLine(page, paragraphCursor, wordIndex, charIndex, endElementIndex, prev);
wordIndex = info.EndElementIndex;
charIndex = info.EndCharIndex;
size += infoSize(info, unit);
size.Height += infoSize(info, unit);
if (prev == null) {
size.TopMargin = info.VSpaceBefore;
}
size.BottomMargin = info.VSpaceAfter;
}
return size;
@ -1554,8 +1580,9 @@ public abstract class ZLTextView extends ZLTextViewBase {
resetTextStyle();
applyStyleChanges(paragraphCursor, 0, cursor.getElementIndex());
while (!cursor.isEndOfParagraph() && (size > 0)) {
ZLTextLineInfo info = processTextLine(page, paragraphCursor, cursor.getElementIndex(), cursor.getCharIndex(), endElementIndex);
ZLTextLineInfo info = null;
while (!cursor.isEndOfParagraph() && size > 0) {
info = processTextLine(page, paragraphCursor, cursor.getElementIndex(), cursor.getCharIndex(), endElementIndex, info);
cursor.moveTo(info.EndElementIndex, info.EndCharIndex);
size -= infoSize(info, unit);
}
@ -1569,12 +1596,14 @@ public abstract class ZLTextView extends ZLTextViewBase {
return end;
}
private ZLTextWordCursor findStart(ZLTextPage page, ZLTextWordCursor end, int unit, int size) {
private ZLTextWordCursor findStart(ZLTextPage page, ZLTextWordCursor end, int unit, int height) {
final ZLTextWordCursor start = new ZLTextWordCursor(end);
size -= paragraphSize(page, start, true, unit);
ParagraphSize size = paragraphSize(page, start, true, unit);
height -= size.Height;
boolean positionChanged = !start.isStartOfParagraph();
start.moveToParagraphStart();
while (size > 0) {
while (height > 0) {
final ParagraphSize previousSize = size;
if (positionChanged && start.getParagraphCursor().isEndOfSection()) {
break;
}
@ -1584,9 +1613,13 @@ public abstract class ZLTextView extends ZLTextViewBase {
if (!start.getParagraphCursor().isEndOfSection()) {
positionChanged = true;
}
size -= paragraphSize(page, start, false, unit);
size = paragraphSize(page, start, false, unit);
height -= size.Height;
if (previousSize != null) {
height += Math.min(size.BottomMargin, previousSize.TopMargin);
}
skip(page, start, unit, -size);
}
skip(page, start, unit, -height);
if (unit == SizeUnit.PIXEL_UNIT) {
boolean sameStart = start.samePositionAs(end);