diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextStyle.java b/src/org/geometerplus/zlibrary/text/view/ZLTextStyle.java index 79df83b7d..49db219a9 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextStyle.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextStyle.java @@ -46,8 +46,8 @@ public abstract class ZLTextStyle { public abstract int getFirstLineIndentDelta(); public abstract int getLineSpacePercent(); public abstract int getVerticalShift(); - public abstract int getSpaceBefore(); - public abstract int getSpaceAfter(); + public abstract int getSpaceBefore(ZLTextMetrics metrics); + public abstract int getSpaceAfter(ZLTextMetrics metrics); public abstract byte getAlignment(); public abstract boolean allowHyphenations(); diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java index e48dde935..b02f408a1 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java @@ -645,8 +645,8 @@ public abstract class ZLTextView extends ZLTextViewBase { charsPerParagraph * 1.2f); final int strHeight = getWordHeight() + getContext().getDescent(); - final int effectiveHeight = (int) (textHeight - (getTextStyle().getSpaceBefore() - + getTextStyle().getSpaceAfter()) / charsPerParagraph); + final int effectiveHeight = (int) (textHeight - (getTextStyle().getSpaceBefore(metrics()) + + getTextStyle().getSpaceAfter(metrics())) / charsPerParagraph); final int linesPerPage = effectiveHeight / strHeight; return charsPerLine * linesPerPage; @@ -1198,10 +1198,10 @@ public abstract class ZLTextView extends ZLTextViewBase { setTextStyle(storedStyle); if (isFirstLine) { - info.Height += info.StartStyle.getSpaceBefore(); + info.Height += info.StartStyle.getSpaceBefore(metrics()); } if (info.isEndOfParagraph()) { - info.VSpaceAfter = getTextStyle().getSpaceAfter(); + info.VSpaceAfter = getTextStyle().getSpaceAfter(metrics()); } if (info.EndElementIndex != endIndex || endIndex == info.ParagraphCursorLength) { diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java b/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java index 51c37126c..33312a4ea 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java @@ -47,7 +47,7 @@ abstract class ZLTextViewBase extends ZLView { myMetrics = null; } - private ZLTextMetrics metrics() { + protected ZLTextMetrics metrics() { // this local variable is used to guarantee null will not // be returned from this method enen in multi-thread environment ZLTextMetrics m = myMetrics; diff --git a/src/org/geometerplus/zlibrary/text/view/style/ZLTextBaseStyle.java b/src/org/geometerplus/zlibrary/text/view/style/ZLTextBaseStyle.java index f992e1e3a..62726dd37 100644 --- a/src/org/geometerplus/zlibrary/text/view/style/ZLTextBaseStyle.java +++ b/src/org/geometerplus/zlibrary/text/view/style/ZLTextBaseStyle.java @@ -134,12 +134,12 @@ public class ZLTextBaseStyle extends ZLTextStyle { } @Override - public int getSpaceBefore() { + public int getSpaceBefore(ZLTextMetrics metrics) { return 0; } @Override - public int getSpaceAfter() { + public int getSpaceAfter(ZLTextMetrics metrics) { return 0; } diff --git a/src/org/geometerplus/zlibrary/text/view/style/ZLTextDecoratedStyle.java b/src/org/geometerplus/zlibrary/text/view/style/ZLTextDecoratedStyle.java index 87a2d076d..b12214d03 100644 --- a/src/org/geometerplus/zlibrary/text/view/style/ZLTextDecoratedStyle.java +++ b/src/org/geometerplus/zlibrary/text/view/style/ZLTextDecoratedStyle.java @@ -40,6 +40,8 @@ public abstract class ZLTextDecoratedStyle extends ZLTextStyle { private boolean myIsNotCached = true; private int myFontSize; + private int mySpaceBefore; + private int mySpaceAfter; private ZLTextMetrics myMetrics; protected ZLTextDecoratedStyle(ZLTextStyle base, ZLTextHyperlink hyperlink) { @@ -63,6 +65,8 @@ public abstract class ZLTextDecoratedStyle extends ZLTextStyle { private void initMetricsCache(ZLTextMetrics metrics) { myMetrics = metrics; myFontSize = getFontSizeInternal(metrics); + mySpaceBefore = getSpaceBeforeInternal(metrics); + mySpaceAfter = getSpaceAfterInternal(metrics); } @Override @@ -83,6 +87,24 @@ public abstract class ZLTextDecoratedStyle extends ZLTextStyle { } protected abstract int getFontSizeInternal(ZLTextMetrics metrics); + @Override + public final int getSpaceBefore(ZLTextMetrics metrics) { + if (!metrics.equals(myMetrics)) { + initMetricsCache(metrics); + } + return mySpaceBefore; + } + protected abstract int getSpaceBeforeInternal(ZLTextMetrics metrics); + + @Override + public final int getSpaceAfter(ZLTextMetrics metrics) { + if (!metrics.equals(myMetrics)) { + initMetricsCache(metrics); + } + return mySpaceAfter; + } + protected abstract int getSpaceAfterInternal(ZLTextMetrics metrics); + @Override public final boolean isItalic() { if (myIsNotCached) { diff --git a/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java b/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java index 88ca46448..a63f8ae64 100644 --- a/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java +++ b/src/org/geometerplus/zlibrary/text/view/style/ZLTextExplicitlyDecoratedStyle.java @@ -152,13 +152,27 @@ public class ZLTextExplicitlyDecoratedStyle extends ZLTextDecoratedStyle impleme // TODO: implement return Parent.getVerticalShift(); } - public int getSpaceBefore() { - // TODO: implement - return Parent.getSpaceBefore(); + @Override + protected int getSpaceBeforeInternal(ZLTextMetrics metrics) { + if (myEntry instanceof ZLTextCSSStyleEntry && !BaseStyle.UseCSSFontFamilyOption.getValue()) { + return Parent.getSpaceBefore(metrics); + } + + if (!myEntry.isFeatureSupported(LENGTH_SPACE_BEFORE)) { + return Parent.getSpaceBefore(metrics); + } + return myEntry.getLength(LENGTH_SPACE_BEFORE, metrics); } - public int getSpaceAfter() { - // TODO: implement - return Parent.getSpaceAfter(); + @Override + protected int getSpaceAfterInternal(ZLTextMetrics metrics) { + if (myEntry instanceof ZLTextCSSStyleEntry && !BaseStyle.UseCSSFontFamilyOption.getValue()) { + return Parent.getSpaceAfter(metrics); + } + + if (!myEntry.isFeatureSupported(LENGTH_SPACE_AFTER)) { + return Parent.getSpaceAfter(metrics); + } + return myEntry.getLength(LENGTH_SPACE_AFTER, metrics); } public byte getAlignment() { if (myEntry instanceof ZLTextCSSStyleEntry && !BaseStyle.UseCSSTextAlignmentOption.getValue()) { diff --git a/src/org/geometerplus/zlibrary/text/view/style/ZLTextFullyDecoratedStyle.java b/src/org/geometerplus/zlibrary/text/view/style/ZLTextFullyDecoratedStyle.java index da862ab62..b3926855e 100644 --- a/src/org/geometerplus/zlibrary/text/view/style/ZLTextFullyDecoratedStyle.java +++ b/src/org/geometerplus/zlibrary/text/view/style/ZLTextFullyDecoratedStyle.java @@ -20,6 +20,7 @@ package org.geometerplus.zlibrary.text.view.style; import org.geometerplus.zlibrary.text.model.ZLTextAlignmentType; +import org.geometerplus.zlibrary.text.model.ZLTextMetrics; import org.geometerplus.zlibrary.text.view.ZLTextHyperlink; import org.geometerplus.zlibrary.text.view.ZLTextStyle; @@ -53,12 +54,12 @@ public class ZLTextFullyDecoratedStyle extends ZLTextPartiallyDecoratedStyle { } @Override - public int getSpaceBefore() { + protected int getSpaceBeforeInternal(ZLTextMetrics metrics) { return myFullDecoration.SpaceBeforeOption.getValue(); } @Override - public int getSpaceAfter() { + protected int getSpaceAfterInternal(ZLTextMetrics metrics) { return myFullDecoration.SpaceAfterOption.getValue(); } diff --git a/src/org/geometerplus/zlibrary/text/view/style/ZLTextPartiallyDecoratedStyle.java b/src/org/geometerplus/zlibrary/text/view/style/ZLTextPartiallyDecoratedStyle.java index 60413e899..25d2ad536 100644 --- a/src/org/geometerplus/zlibrary/text/view/style/ZLTextPartiallyDecoratedStyle.java +++ b/src/org/geometerplus/zlibrary/text/view/style/ZLTextPartiallyDecoratedStyle.java @@ -131,13 +131,13 @@ class ZLTextPartiallyDecoratedStyle extends ZLTextDecoratedStyle { } @Override - public int getSpaceBefore() { - return Parent.getSpaceBefore(); + protected int getSpaceBeforeInternal(ZLTextMetrics metrics) { + return Parent.getSpaceBefore(metrics); } @Override - public int getSpaceAfter() { - return Parent.getSpaceAfter(); + protected int getSpaceAfterInternal(ZLTextMetrics metrics) { + return Parent.getSpaceAfter(metrics); } @Override