You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by lf...@apache.org on 2006/02/07 13:29:32 UTC

svn commit: r375585 - in /xmlgraphics/fop/trunk: ./ src/java/org/apache/fop/layoutmgr/inline/ test/layoutengine/ test/layoutengine/standard-testcases/

Author: lfurini
Date: Tue Feb  7 04:29:19 2006
New Revision: 375585

URL: http://svn.apache.org/viewcvs?rev=375585&view=rev
Log:
Fix for bug 38507: the elements representing a non-breaking space were not always correct, sometimes allowing a break.

This also solves another bug concerning the incorrect suppression of a nbsp at the beginning of a line.

A bit of clean-up in TextLayoutManager

Removed:
    xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2a.xml
Modified:
    xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
    xmlgraphics/fop/trunk/status.xml
    xmlgraphics/fop/trunk/test/layoutengine/disabled-testcases.xml
    xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2.xml
    xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_3.xml

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java?rev=375585&r1=375584&r2=375585&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java Tue Feb  7 04:29:19 2006
@@ -752,204 +752,141 @@
         LinkedList spaceElements = new LinkedList();
         LeafPosition mainPosition = new LeafPosition(this, leafValue);
         
-        // add a penalty to avoid the next glue element to be
-        // a feasible line break
         if (textArray[ai.iStartIndex] == NBSPACE) {
-            spaceElements.add
-            (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                    new LeafPosition(this, -1),
-                    false));
-        }
-        
-        switch (alignment) {
-        case EN_CENTER :
-            // centered text:
-            // if the second element is chosen as a line break these elements 
-            // add a constant amount of stretch at the end of a line and at the
-            // beginning of the next one, otherwise they don't add any stretch
-            /*
-            spaceElements.add
-            (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                    new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthPenalty(0,
-                    (textArray[ai.iStartIndex] == NBSPACE ? KnuthElement.INFINITE : 0),
-                    false, new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthGlue(ai.ipdArea.opt,
-                    - 6 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                    mainPosition, false));
-            spaceElements.add
-            (new KnuthInlineBox(0, 0, 0, 0,
-                    new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                    new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                    new LeafPosition(this, -1), false));
-            */
-            spaceElements.add
-                (new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                               new LeafPosition(this, -1), true));
-            spaceElements.add
-                (new KnuthPenalty(0,
-                        (textArray[ai.iStartIndex] == NBSPACE ? KnuthElement.INFINITE : 0),
+            // a non-breaking space
+            //TODO: other kinds of non-breaking spaces
+            if (alignment == EN_JUSTIFY) {
+                // the space can stretch and shrink, and must be preserved
+                // when starting a line
+                spaceElements.add(new KnuthInlineBox(0, null,
+                        notifyPos(new LeafPosition(this, -1)), true));
+                spaceElements.add(new KnuthPenalty(0, KnuthElement.INFINITE,
                         false, new LeafPosition(this, -1), false));
-            spaceElements.add
-                (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP),
-                               -6 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                               mainPosition, false));
-            spaceElements.add
-                (new KnuthInlineBox(0, null,
-                                    notifyPos(new LeafPosition(this, -1)), true));
-            spaceElements.add
-                (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                                  new LeafPosition(this, -1), true));
-            spaceElements.add
-                (new KnuthGlue(lineStartBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                               new LeafPosition(this, -1), true));
-            break;
-            
-        case EN_START  : // fall through
-        case EN_END    :
-            // left- or right-aligned text:
-            // if the second element is chosen as a line break these elements 
-            // add a constant amount of stretch at the end of a line, otherwise
-            // they don't add any stretch
-            /*
-            spaceElements.add
-            (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                    new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthPenalty(0, 0, false,
-                    new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthGlue(ai.ipdArea.opt,
-                    - 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                    mainPosition, false));
-            */
-            if (lineStartBAP != 0 || lineEndBAP != 0) {
-                spaceElements.add
-                    (new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                   new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, 0, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP),
-                                   -3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                   mainPosition, false));
-                spaceElements.add
-                    (new KnuthInlineBox(0, null,
-                                        notifyPos(new LeafPosition(this, -1)), false));
-                spaceElements.add
-                   (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                                     new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(lineStartBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
+                spaceElements.add(new KnuthGlue(ai.ipdArea.opt, ai.ipdArea.max - ai.ipdArea.opt, 
+                        ai.ipdArea.opt - ai.ipdArea.min, mainPosition, false));
             } else {
-                spaceElements.add
-                    (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                   new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, 0, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt,
-                                   -3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                   mainPosition, false));
+                // the space does not need to stretch or shrink, and must be
+                // preserved when starting a line
+                spaceElements.add(new KnuthInlineBox(ai.ipdArea.opt, null,
+                        mainPosition, true));
             }
-            break;
-            
-        case EN_JUSTIFY:
-            // justified text:
-            // the stretch and shrink depends on the space width
-            /*
-            spaceElements.add
-            (new KnuthGlue(ai.ipdArea.opt,
-                    ai.ipdArea.max - ai.ipdArea.opt,
-                    ai.ipdArea.opt - ai.ipdArea.min,
-                    mainPosition, false));
-            */
-            if (lineStartBAP != 0 || lineEndBAP != 0) {
-                spaceElements.add
-                    (new KnuthGlue(lineEndBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, 0, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP),
-                                   ai.ipdArea.max - ai.ipdArea.opt,
-                                   ai.ipdArea.opt - ai.ipdArea.min,
-                                   mainPosition, false));
-                spaceElements.add
-                    (new KnuthInlineBox(0, null,
-                                        notifyPos(new LeafPosition(this, -1)), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(lineStartBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
-            } else {
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt,
-                            ai.ipdArea.max - ai.ipdArea.opt,
-                            ai.ipdArea.opt - ai.ipdArea.min,
+        } else {
+            // a breaking space
+            switch (alignment) {
+            case EN_CENTER:
+                // centered text:
+                // if the second element is chosen as a line break these elements 
+                // add a constant amount of stretch at the end of a line and at the
+                // beginning of the next one, otherwise they don't add any stretch
+                spaceElements.add(new KnuthGlue(lineEndBAP,
+                        3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                        new LeafPosition(this, -1), false));
+                spaceElements
+                        .add(new KnuthPenalty(
+                                0,
+                                (textArray[ai.iStartIndex] == NBSPACE ? KnuthElement.INFINITE
+                                        : 0), false,
+                                new LeafPosition(this, -1), false));
+                spaceElements.add(new KnuthGlue(ai.ipdArea.opt
+                        - (lineStartBAP + lineEndBAP), -6
+                        * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                        mainPosition, false));
+                spaceElements.add(new KnuthInlineBox(0, null,
+                        notifyPos(new LeafPosition(this, -1)), false));
+                spaceElements.add(new KnuthPenalty(0, KnuthElement.INFINITE,
+                        false, new LeafPosition(this, -1), false));
+                spaceElements.add(new KnuthGlue(lineStartBAP,
+                        3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                        new LeafPosition(this, -1), false));
+                break;
+
+            case EN_START: // fall through
+            case EN_END:
+                // left- or right-aligned text:
+                // if the second element is chosen as a line break these elements 
+                // add a constant amount of stretch at the end of a line, otherwise
+                // they don't add any stretch
+                if (lineStartBAP != 0 || lineEndBAP != 0) {
+                    spaceElements.add(new KnuthGlue(lineEndBAP,
+                            3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthPenalty(0, 0, false,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt
+                            - (lineStartBAP + lineEndBAP), -3
+                            * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
                             mainPosition, false));
-            }
-            break;
-            
-        default:
-            // last line justified, the other lines unjustified:
-            // use only the space stretch
-            /*
-            spaceElements.add
-            (new KnuthGlue(ai.ipdArea.opt,
-                    ai.ipdArea.max - ai.ipdArea.opt, 0,
-                    mainPosition, false));
-            */
-            if (lineStartBAP != 0 || lineEndBAP != 0) {
-                spaceElements.add
-                    (new KnuthGlue(lineEndBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, 0, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP),
-                                   ai.ipdArea.max - ai.ipdArea.opt, 0,
-                                   mainPosition, false));
-                spaceElements.add
-                    (new KnuthInlineBox(0, null,
-                                        notifyPos(new LeafPosition(this, -1)), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(lineStartBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
-            } else {
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt,
-                                    ai.ipdArea.max - ai.ipdArea.opt, 0,
-                                    mainPosition, false));
+                    spaceElements.add(new KnuthInlineBox(0, null,
+                            notifyPos(new LeafPosition(this, -1)), false));
+                    spaceElements.add(new KnuthPenalty(0,
+                            KnuthElement.INFINITE, false, new LeafPosition(
+                                    this, -1), false));
+                    spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0,
+                            new LeafPosition(this, -1), false));
+                } else {
+                    spaceElements.add(new KnuthGlue(0,
+                            3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthPenalty(0, 0, false,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt, -3
+                            * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                            mainPosition, false));
+                }
+                break;
+
+            case EN_JUSTIFY:
+                // justified text:
+                // the stretch and shrink depends on the space width
+                if (lineStartBAP != 0 || lineEndBAP != 0) {
+                    spaceElements.add(new KnuthGlue(lineEndBAP, 0, 0,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthPenalty(0, 0, false,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt
+                            - (lineStartBAP + lineEndBAP), ai.ipdArea.max
+                            - ai.ipdArea.opt, ai.ipdArea.opt - ai.ipdArea.min,
+                            mainPosition, false));
+                    spaceElements.add(new KnuthInlineBox(0, null,
+                            notifyPos(new LeafPosition(this, -1)), false));
+                    spaceElements.add(new KnuthPenalty(0,
+                            KnuthElement.INFINITE, false, new LeafPosition(
+                                    this, -1), false));
+                    spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0,
+                            new LeafPosition(this, -1), false));
+                } else {
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt,
+                            ai.ipdArea.max - ai.ipdArea.opt, ai.ipdArea.opt
+                                    - ai.ipdArea.min, mainPosition, false));
+                }
+                break;
+
+            default:
+                // last line justified, the other lines unjustified:
+                // use only the space stretch
+                if (lineStartBAP != 0 || lineEndBAP != 0) {
+                    spaceElements.add(new KnuthGlue(lineEndBAP, 0, 0,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthPenalty(0, 0, false,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt
+                            - (lineStartBAP + lineEndBAP), ai.ipdArea.max
+                            - ai.ipdArea.opt, 0, mainPosition, false));
+                    spaceElements.add(new KnuthInlineBox(0, null,
+                            notifyPos(new LeafPosition(this, -1)), false));
+                    spaceElements.add(new KnuthPenalty(0,
+                            KnuthElement.INFINITE, false, new LeafPosition(
+                                    this, -1), false));
+                    spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0,
+                            new LeafPosition(this, -1), false));
+                } else {
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt,
+                            ai.ipdArea.max - ai.ipdArea.opt, 0, mainPosition,
+                            false));
+                }
             }
         }
         
-        // TODO
-        // Add zero width box to avoid any nbspace to be removed
-        // at the end of a paragraph.
-        // This is kind of a hack and should be removed once the
-        // whole line building and white space handling is revisited.
-        if (textArray[ai.iStartIndex] == NBSPACE) {
-            spaceElements.add
-                (new KnuthInlineBox(0, null,
-                                    notifyPos(new LeafPosition(this, -1)), true));
-        }
         return spaceElements;
     }
 

Modified: xmlgraphics/fop/trunk/status.xml
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/status.xml?rev=375585&r1=375584&r2=375585&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/status.xml (original)
+++ xmlgraphics/fop/trunk/status.xml Tue Feb  7 04:29:19 2006
@@ -27,6 +27,9 @@
 
   <changes>
     <release version="FOP Trunk">
+      <action context="Code" dev="LF" type="fix" fixes-bug="38507">
+        Bugfix: The elements representing a non-breaking space weren't always correct.
+      </action>
       <action context="Code" dev="JM" type="fix" fixes-bug="38453">
         Bugfix: Text-decoration was not promoted if no text-decoration attribute was
         specified on a nested element.

Modified: xmlgraphics/fop/trunk/test/layoutengine/disabled-testcases.xml
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/test/layoutengine/disabled-testcases.xml?rev=375585&r1=375584&r2=375585&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/disabled-testcases.xml (original)
+++ xmlgraphics/fop/trunk/test/layoutengine/disabled-testcases.xml Tue Feb  7 04:29:19 2006
@@ -62,19 +62,6 @@
     stacking constraints which it shouldn't.</description>
   </testcase>
   <testcase>
-    <name>Non breaking space removal</name>
-    <file>block_white-space_2.xml</file>
-    <description>A non breaking space is incorrectly
-    removed from the start of a line.</description>
-  </testcase>
-  <testcase>
-    <name>Non breaking spaces must not be breakable</name>
-    <file>block_white-space_3.xml</file>
-    <description>A non breaking space incorrectly
-    causes a break possibility. The element list is wrong.</description>
-    <reference>http://issues.apache.org/bugzilla/show_bug.cgi?id=38507</reference>
-  </testcase>
-  <testcase>
     <name>block white-space-collapse 2</name>
     <file>block_white-space-collapse_2.xml</file>
     <description>First line-break occurs after the fifth space following the

Modified: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2.xml
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2.xml?rev=375585&r1=375584&r2=375585&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2.xml (original)
+++ xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2.xml Tue Feb  7 04:29:19 2006
@@ -19,11 +19,6 @@
   <info>
     <p>
       This test checks non breaking white space.
-      Note: This test currently fails because the first non breaking space on
-      each line is incorrectly removed. There is a duplicate test
-      block_white-space_2a.xml whose checks have been adjusted to cater for 
-      this defect. Once the problem is fixed block_white-space_2a.xml should
-      be removed from the test suite.
     </p>
   </info>
   <fo>

Modified: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_3.xml
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_3.xml?rev=375585&r1=375584&r2=375585&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_3.xml (original)
+++ xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_3.xml Tue Feb  7 04:29:19 2006
@@ -32,6 +32,7 @@
         <fo:flow flow-name="xsl-region-body">
           <fo:block background-color="yellow">« text »</fo:block><!-- normal spaces here -->
           <fo:block background-color="red">«&#160;text&#160;»</fo:block>
+          <fo:block background-color="blue" text-align="justify">«&#160;text&#160;»</fo:block>
         </fo:flow>
       </fo:page-sequence>
     </fo:root>
@@ -60,16 +61,31 @@
       <box/>
 
       <!-- first nbsp -->
-      <penalty w="0" p="INF"/>
-      <glue w="3336" y="0" z="0"/>
+      <box w="3336"/>
+      
+      <box/>
+      
+      <!-- second nbsp -->
+      <box w="3336"/>
+      
+      <box/>
+      
+      <skip>3</skip>
+    </element-list>
+    <element-list category="line" index="2">
+      <box/>
+
+      <!-- first nbsp -->
       <box w="0"/>
+      <penalty w="0" p="inf"/>
+      <glue w="3336" y="1668" z="1112"/>
       
       <box/>
       
       <!-- second nbsp -->
-      <penalty w="0" p="INF"/>
-      <glue w="3336" y="0" z="0"/>
       <box w="0"/>
+      <penalty w="0" p="inf"/>
+      <glue w="3336" y="1668" z="1112"/>
       
       <box/>
       



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org