From b4c6724ac10059e980fb1aede0ea04dd9a81c3b2 Mon Sep 17 00:00:00 2001 From: Adrian Cumiskey Date: Thu, 20 Nov 2008 16:44:30 +0000 Subject: [PATCH] Merged revisions 718666,718705,719038,719110 via svnmerge from https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk ........ r718666 | adelmelle | 2008-11-18 17:58:54 +0000 (Tue, 18 Nov 2008) | 1 line Bugfix: do not reset TextLM.hasChanged, but combine (||) with previous value. ........ r718705 | adelmelle | 2008-11-18 20:14:22 +0000 (Tue, 18 Nov 2008) | 1 line Change FontCache.changeLock to a boolean[1], so it can be serialized... ........ r719038 | jeremias | 2008-11-19 19:46:45 +0000 (Wed, 19 Nov 2008) | 1 line Reduced warning on ascender+descender > EM box to DEBUG level, as this case is compensated for by additional code in guessVerticalMetricsFromGlyphBBox() and is therefore only confusing. I tested problematic fonts and they show an acceptable line layout. No semantics changed. ........ r719110 | adelmelle | 2008-11-19 22:45:06 +0000 (Wed, 19 Nov 2008) | 3 lines Bugzilla 46240: Fixed a bug in combining break-before with a span change. ........ git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AFPGOCAResources@719276 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/fop/fonts/FontCache.java | 2 +- .../apache/fop/fonts/truetype/TTFFile.java | 31 ++++++---- .../fop/layoutmgr/FlowLayoutManager.java | 9 ++- .../apache/fop/layoutmgr/LayoutContext.java | 26 ++++++-- .../layoutmgr/inline/TextLayoutManager.java | 2 +- status.xml | 3 + .../block_break-before_bug46240.xml | 59 +++++++++++++++++++ 7 files changed, 107 insertions(+), 25 deletions(-) create mode 100644 test/layoutengine/standard-testcases/block_break-before_bug46240.xml diff --git a/src/java/org/apache/fop/fonts/FontCache.java b/src/java/org/apache/fop/fonts/FontCache.java index a3ff1b672..fceeacb7b 100644 --- a/src/java/org/apache/fop/fonts/FontCache.java +++ b/src/java/org/apache/fop/fonts/FontCache.java @@ -64,7 +64,7 @@ public final class FontCache implements Serializable { private transient boolean changed = false; /** change lock */ - private final Object changeLock = new Object(); + private final boolean[] changeLock = new boolean[1]; /** master mapping of font url -> font info. This needs to be * a list, since a TTC file may contain more than 1 font. */ diff --git a/src/java/org/apache/fop/fonts/truetype/TTFFile.java b/src/java/org/apache/fop/fonts/truetype/TTFFile.java index 409b3908b..7198888f1 100644 --- a/src/java/org/apache/fop/fonts/truetype/TTFFile.java +++ b/src/java/org/apache/fop/fonts/truetype/TTFFile.java @@ -1248,10 +1248,11 @@ public class TTFFile { } } - log.debug("Font box height: " + (ascender - descender)); - if (ascender - descender > upem) { - log.warn("Ascender and descender together are larger than the em box." - + " This could lead to a wrong baseline placement in Apache FOP."); + if (log.isDebugEnabled()) { + log.debug("Font box height: " + (ascender - descender)); + if (ascender - descender > upem) { + log.debug("Ascender and descender together are larger than the em box."); + } } } @@ -1259,7 +1260,7 @@ public class TTFFile { // Approximate capHeight from height of "H" // It's most unlikely that a font misses the PCLT table // This also assumes that postscriptnames exists ("H") - // Should look it up int the cmap (that wouldn't help + // Should look it up in the cmap (that wouldn't help // for charsets without H anyway...) // Same for xHeight with the letter "x" int localCapHeight = 0; @@ -1294,10 +1295,12 @@ public class TTFFile { } } } - log.debug("Ascender from glyph 'd': " + localAscender - + " " + convertTTFUnit2PDFUnit(localAscender)); - log.debug("Descender from glyph 'p': " + localDescender - + " " + convertTTFUnit2PDFUnit(localDescender)); + if (log.isDebugEnabled()) { + log.debug("Ascender from glyph 'd': " + localAscender + + " " + convertTTFUnit2PDFUnit(localAscender)); + log.debug("Descender from glyph 'p': " + localDescender + + " " + convertTTFUnit2PDFUnit(localDescender)); + } if (ascender - descender > upem) { log.debug("Replacing specified ascender/descender with derived values to get values" + " which fit in the em box."); @@ -1305,10 +1308,12 @@ public class TTFFile { descender = localDescender; } - log.debug("xHeight from glyph 'x': " + localXHeight - + " " + convertTTFUnit2PDFUnit(localXHeight)); - log.debug("CapHeight from glyph 'H': " + localCapHeight - + " " + convertTTFUnit2PDFUnit(localCapHeight)); + if (log.isDebugEnabled()) { + log.debug("xHeight from glyph 'x': " + localXHeight + + " " + convertTTFUnit2PDFUnit(localXHeight)); + log.debug("CapHeight from glyph 'H': " + localCapHeight + + " " + convertTTFUnit2PDFUnit(localCapHeight)); + } if (capHeight == 0) { capHeight = localCapHeight; if (capHeight == 0) { diff --git a/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java b/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java index 293d6dbe0..42f08a42d 100644 --- a/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/FlowLayoutManager.java @@ -50,8 +50,6 @@ public class FlowLayoutManager extends BlockStackingLayoutManager /** Array of areas currently being filled stored by area class */ private BlockParent[] currentAreas = new BlockParent[Area.CLASS_MAX]; - private int currentSpan = EN_NONE; - /** * This is the top level layout manager. * It is created by the PageSequence FO. @@ -89,10 +87,11 @@ public class FlowLayoutManager extends BlockStackingLayoutManager } else if (curLM instanceof BlockContainerLayoutManager) { span = ((BlockContainerLayoutManager)curLM).getBlockContainerFO().getSpan(); } + + int currentSpan = context.getCurrentSpan(); if (currentSpan != span) { log.debug("span change from " + currentSpan + " to " + span); context.signalSpanChange(span); - currentSpan = span; SpaceResolver.resolveElementList(returnList); return returnList; } @@ -228,7 +227,7 @@ public class FlowLayoutManager extends BlockStackingLayoutManager oldElement = (KnuthElement)oldListIterator.next(); if (oldElement.getPosition() instanceof NonLeafPosition) { // oldElement was created by a descendant of this FlowLM - oldElement.setPosition(((NonLeafPosition)oldElement.getPosition()).getPosition()); + oldElement.setPosition((oldElement.getPosition()).getPosition()); } else { // thisElement was created by this FlowLM, remove it oldListIterator.remove(); @@ -344,7 +343,7 @@ public class FlowLayoutManager extends BlockStackingLayoutManager * @return the BPD of the content area */ public int getContentAreaBPD() { - return (int) getCurrentPV().getBodyRegion().getBPD(); + return getCurrentPV().getBodyRegion().getBPD(); } } diff --git a/src/java/org/apache/fop/layoutmgr/LayoutContext.java b/src/java/org/apache/fop/layoutmgr/LayoutContext.java index 8b716dfde..3526ed239 100644 --- a/src/java/org/apache/fop/layoutmgr/LayoutContext.java +++ b/src/java/org/apache/fop/layoutmgr/LayoutContext.java @@ -88,7 +88,8 @@ public class LayoutContext { */ private MinOptMax stackLimitIP; - /** True if current element list is spanning in multi-column layout. */ + /** to keep track of spanning in multi-column layout */ + private int currentSpan = Constants.NOT_SET; private int nextSpan = Constants.NOT_SET; /** inline-progression-dimension of nearest ancestor reference area */ @@ -522,22 +523,37 @@ public class LayoutContext { } /** - * @return true if the current element list ends early because of a span change - * in multi-column layout. + * @return one of: {@link Constants#NOT_SET}, {@link Constants#EN_NONE} + * {@link Constants#EN_ALL} */ public int getNextSpan() { return nextSpan; } + /** + * @return one of: {@link Constants#NOT_SET}, {@link Constants#EN_NONE} + * {@link Constants#EN_ALL} + */ + public int getCurrentSpan() { + return (currentSpan == Constants.NOT_SET) + ? Constants.EN_NONE : currentSpan; + } + /** * Used to signal the PSLM that the element list ends early because of a span change in * multi-column layout. * @param span the new span value (legal values: NOT_SET, EN_NONE, EN_ALL) */ public void signalSpanChange(int span) { - if (span == Constants.NOT_SET || span == Constants.EN_NONE || span == Constants.EN_ALL) { + switch (span) { + case Constants.NOT_SET: + case Constants.EN_NONE: + case Constants.EN_ALL: + this.currentSpan = this.nextSpan; this.nextSpan = span; - } else { + break; + default: + assert false; throw new IllegalArgumentException("Illegal value on signalSpanChange() for span: " + span); } diff --git a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java index 459bce0e8..27ed38b53 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java @@ -910,7 +910,7 @@ public class TextLayoutManager extends LeafNodeLayoutManager { } startIndex = stopIndex; } - this.hasChanged = !nothingChanged; + this.hasChanged = (this.hasChanged || !nothingChanged); } /** {@inheritDoc} */ diff --git a/status.xml b/status.xml index c0e1e5a3d..ce3bc60d5 100644 --- a/status.xml +++ b/status.xml @@ -65,6 +65,9 @@ More robust AFP font parsing, although it is still in need of some rework in the future. + + Fixed a bug when combining break-before with a span change. + Fixed some multi-threading issues in FontCache.java: