keiron      02/01/11 02:48:00

  Modified:    src/org/apache/fop/layout Tag: fop-0_20_2-maintain
                        LineArea.java
  Log:
  improved line breaking for japanese
  Submitted by: Satoshi Ishigami <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.53.2.4  +74 -10    xml-fop/src/org/apache/fop/layout/LineArea.java
  
  Index: LineArea.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/org/apache/fop/layout/LineArea.java,v
  retrieving revision 1.53.2.3
  retrieving revision 1.53.2.4
  diff -u -r1.53.2.3 -r1.53.2.4
  --- LineArea.java     11 Jan 2002 10:20:50 -0000      1.53.2.3
  +++ LineArea.java     11 Jan 2002 10:48:00 -0000      1.53.2.4
  @@ -1,5 +1,5 @@
   /*
  - * $Id: LineArea.java,v 1.53.2.3 2002/01/11 10:20:50 keiron Exp $
  + * $Id: LineArea.java,v 1.53.2.4 2002/01/11 10:48:00 keiron Exp $
    * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
    * For details on use and redistribution please refer to the
    * LICENSE file included with these sources.
  @@ -71,6 +71,7 @@
       protected static final int NOTHING = 0;
       protected static final int WHITESPACE = 1;
       protected static final int TEXT = 2;
  +    protected static final int MULTIBYTECHAR = 3;
   
       /* the character type of the previous character */
       protected int prev = NOTHING;
  @@ -210,6 +211,7 @@
           System.arraycopy(odata, 0, dataCopy, 0, odata.length);
   
           boolean isText = false;
  +        boolean isMultiByteChar = false;
   
           /* iterate over each character */
           for (int i = start; i < end; i++) {
  @@ -220,6 +222,7 @@
                       || (c == '\u2028'))) {
                   charWidth = getCharWidth(c);
                   isText = true;
  +                isMultiByteChar = (c > 127);
                   // Add support for zero-width spaces
                   if (charWidth <= 0 && c != '\u200B' && c != '\uFEFF')
                       charWidth = whitespaceWidth;
  @@ -230,6 +233,7 @@
                       charWidth = getCharWidth(c);
   
                   isText = false;
  +                isMultiByteChar = false;
   
                   if (prev == WHITESPACE) {
   
  @@ -268,7 +272,7 @@
                           return i + 1;
                       }
   
  -                } else if (prev == TEXT) {
  +                } else if (prev == TEXT || prev == MULTIBYTECHAR ) {
   
                       // if current is WHITESPACE and previous TEXT
                       // the current word made it, so
  @@ -388,6 +392,7 @@
   
               if (isText) {                        // current is TEXT
   
  +                int curr = isMultiByteChar ? MULTIBYTECHAR : TEXT;
                   if (prev == WHITESPACE) {
   
                       // if current is TEXT and previous WHITESPACE
  @@ -401,15 +406,74 @@
                               return i;
                           }
                       }
  -                    prev = TEXT;
  +                    prev = curr;
                       wordStart = i;
                       wordLength = 1;
  -                } else if (prev == TEXT) {
  -                    wordLength++;
  -                    wordWidth += charWidth;
  +                } else if (prev == TEXT || prev == MULTIBYTECHAR ) {
  +                                     if ( prev == TEXT && curr == TEXT || ! 
canBreakMidWord()) {
  +                         wordLength++;
  +                     wordWidth += charWidth;
  +                                     } else {
  +
  +//                    if (spaceWidth > 0) { // for text-align="justify"
  +                        InlineSpace is = new InlineSpace(spaceWidth);
  +                        if (prevUlState) {
  +                            is.setUnderlined(textState.getUnderlined());
  +                        }
  +                        if (prevOlState) {
  +                            is.setOverlined(textState.getOverlined());
  +                        }
  +                        if (prevLTState) {
  +                            is.setLineThrough(textState.getLineThrough());
  +                        }
  +                        addChild(is);
  +                        finalWidth += spaceWidth;
  +                        spaceWidth = 0;
  +//                    }
  +
  +                    // add any pending areas
  +
  +                    Enumeration e = pendingAreas.elements();
  +                    while (e.hasMoreElements()) {
  +                        Box box = (Box)e.nextElement();
  +                        if (box instanceof InlineArea) {
  +                            if (ls != null) {
  +                                Rectangle lr =
  +                                    new Rectangle(finalWidth, 0,
  +                                                  
((InlineArea)box).getContentWidth(),
  +                                                  fontState.getFontSize());
  +                                ls.addRect(lr, this, (InlineArea)box);
  +                            }
  +                        }
  +                        addChild(box);
  +                    }
  +
  +                    finalWidth += pendingWidth;
  +
  +                    // reset pending areas array
  +                    pendingWidth = 0;
  +                    pendingAreas = new Vector();
  +
  +                    // add the current word
  +
  +                    if (wordLength > 0) {
  +                        // The word might contain nonbreaking
  +                        // spaces. Split the word and add InlineSpace
  +                        // as necessary. All spaces inside the word
  +                        // Have a fixed width.
  +                        addSpacedWord(new String(data, wordStart, wordLength),
  +                                      ls, finalWidth, 0, textState, false);
  +                        finalWidth += wordWidth;
  +                                     }
  +                                             spaceWidth = 0;
  +                                             wordStart = i;
  +                                             wordLength = 1;
  +                         wordWidth = charWidth;
  +                                     }
  +                                     prev = curr;
                   } else {                         // nothing previous
   
  -                    prev = TEXT;
  +                    prev = curr;
                       wordStart = i;
                       wordLength = 1;
                       wordWidth = charWidth;
  @@ -419,7 +483,7 @@
                           > this.getContentWidth()) {
   
                       // BREAK MID WORD
  -                    if (canBreakMidWord()) {
  +/*                    if (canBreakMidWord()) {
                           addSpacedWord(new String(data, wordStart, wordLength - 1),
                                         ls,
                                         finalWidth + spaceWidth
  @@ -429,7 +493,7 @@
                           wordWidth = 0;
                           return i;
                       }
  -
  +*/
                       if (this.wrapOption == WrapOption.WRAP) {
   
                           if (hyphProps.hyphenate == Hyphenate.TRUE) {
  @@ -476,7 +540,7 @@
               }
           } // end of iteration over text
   
  -        if (prev == TEXT) {
  +        if (prev == TEXT || prev == MULTIBYTECHAR) {
   
               if (spaceWidth > 0) {
                   InlineSpace pis = new InlineSpace(spaceWidth);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to