]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Merged /xmlgraphics/fop/trunk:r1080139-1094916
authorSimon Pepping <spepping@apache.org>
Tue, 19 Apr 2011 09:01:37 +0000 (09:01 +0000)
committerSimon Pepping <spepping@apache.org>
Tue, 19 Apr 2011 09:01:37 +0000 (09:01 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_ComplexScripts@1094946 13f79535-47bb-0310-9956-ffa450edef68

22 files changed:
1  2 
build.xml
src/java/org/apache/fop/area/AreaTreeParser.java
src/java/org/apache/fop/area/RegionViewport.java
src/java/org/apache/fop/area/inline/AbstractTextArea.java
src/java/org/apache/fop/area/inline/BasicLinkArea.java
src/java/org/apache/fop/area/inline/FilledArea.java
src/java/org/apache/fop/area/inline/InlineArea.java
src/java/org/apache/fop/area/inline/InlineParent.java
src/java/org/apache/fop/area/inline/InlineViewport.java
src/java/org/apache/fop/fonts/BFEntry.java
src/java/org/apache/fop/layoutmgr/ExternalDocumentLayoutManager.java
src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java
src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java
src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
src/java/org/apache/fop/render/AbstractRenderer.java
src/java/org/apache/fop/render/intermediate/IFParser.java
src/java/org/apache/fop/render/intermediate/IFRenderer.java
src/java/org/apache/fop/render/intermediate/IFSerializer.java
src/java/org/apache/fop/render/java2d/Java2DRenderer.java
src/java/org/apache/fop/render/xml/XMLRenderer.java
test/layoutengine/disabled-testcases.xml

diff --cc build.xml
Simple merge
index 08997a8179ea8dd511b91b4381654206ed0fa89d,1558e81608e1e49fec6bc6bef888dfd00e719e11..3488209391709340a4ce0a3e380064e5d66ca8d5
@@@ -185,4 -185,15 +185,15 @@@ public abstract class AbstractTextArea 
      public void setBaselineOffset(int baselineOffset) {
          this.baselineOffset = baselineOffset;
      }
 -        return getOffset();
+     @Override
+     int getVirtualOffset() {
++        return getBlockProgressionOffset();
+     }
+     @Override
+     int getVirtualBPD() {
+         /* Word and space areas don't have a properly set bpd; return this area's bpd instead. */
+         return getBPD();
+     }
  }
index 0000000000000000000000000000000000000000,fce9139441c9f5a7d01db3a982c332a3373c2ba7..1fedf5624d382e2c84c056eb8c2ba44704c67e58
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,53 +1,53 @@@
 -        setOffset(getOffset() + minChildOffset);
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ /* $Id$ */
+ package org.apache.fop.area.inline;
+ import org.apache.fop.area.Area;
+ /**
+  * An inline area produced by an fo:basic-link element. This class implements a different
+  * behavior to what is prescribed by the XSL-FO 1.1 Recommendation. With the standard
+  * behavior, there is no easy way to make a link cover e.g. a whole image.
+  *
+  * <p>See following bug report at W3C's:
+  * http://www.w3.org/Bugs/Public/show_bug.cgi?id=11672</p>
+  */
+ public class BasicLinkArea extends InlineParent {
+     private static final long serialVersionUID = 5183753430412208151L;
+     @Override
+     public void setParentArea(Area parentArea) {
+         super.setParentArea(parentArea);
+         /*
+          * Perform necessary modifications to make this area encompass all of its children
+          * elements, so as to have a useful active area. We assume that this method is
+          * called after all of the children areas have been added to this area.
+          */
+         /* Make this area start at its beforest child. */
 -            inline.setOffset(inline.getOffset() - minChildOffset);
++        setBlockProgressionOffset(getBlockProgressionOffset() + minChildOffset);
+         /* Update children offsets accordingly. */
+         for (InlineArea inline : inlines) {
++            inline.setBlockProgressionOffset(inline.getBlockProgressionOffset() - minChildOffset);
+         }
+         setBPD(getVirtualBPD());
+     }
+ }
index 2b586b680a1b80ab44cc458eef53076ad0b2e2f5,e0207ada630876e18804466cb4fec7300e8eec39..b34796e56089e2b2cfbf337c56e96685bbab28e6
@@@ -60,10 -60,10 +60,10 @@@ public class FilledArea extends InlineP
              InlineArea child = (InlineArea) childrenIterator.next();
              if (child instanceof InlineParent) {
                  setChildOffset(((InlineParent) child).getChildAreas().listIterator(), v);
-             } else if (child instanceof org.apache.fop.area.inline.Viewport) {
+             } else if (child instanceof InlineViewport) {
                  // nothing
              } else {
 -                child.setOffset(v);
 +                child.setBlockProgressionOffset(v);
              }
          }
      }
index caafab5a57e8b4d6778e051b4d732cc42cc18d52,d62e6f721522934b503844f0b4a02f2508657ef6..c17bd4b3d28daf8caf47a74127e60ddaa09dbf02
@@@ -268,4 -251,32 +268,31 @@@ public class InlineArea extends Area 
              storedIPDVariation += ipdVariation;
          }
      }
 -        return getOffset();
+     /**
+      * Returns the offset that this area would have if its offset and size were taking
+      * children areas into account. The bpd of an inline area is taken from its nominal
+      * font and doesn't depend on the bpds of its children elements. However, in the case
+      * of a basic-link element we want the active area to cover all of the children
+      * elements.
+      *
+      * @return the offset that this area would have if the before-edge of its
+      * content-rectangle were coinciding with the <q>beforest</q> before-edge of its
+      * children allocation-rectangles.
+      * @see #getVirtualBPD()
+      * @see BasicLinkArea
+      */
+     int getVirtualOffset() {
++        return getBlockProgressionOffset();
+     }
+     /**
+      * Returns the block-progression-dimension that this area would have if it were taking
+      * its children elements into account. See {@linkplain #getVirtualOffset()}.
+      *
+      * @return the bpd
+      */
+     int getVirtualBPD() {
+         return getBPD();
+     }
  }
 -
index f2d218daec6547ba51e25ef523160b6d38138bfc,521080469fdb5e2e51fbcf069491a69d4b6dc221..7419ff06673ed3fc5999e2b7203f8b19ef0739e1
@@@ -56,16 -55,26 +56,27 @@@ public class InlineParent extends Inlin
          if (inlines.size() == 0) {
              autoSize = (getIPD() == 0);
          }
-         if (childArea instanceof InlineArea) {
-             InlineArea inlineChildArea = (InlineArea) childArea;
-             inlines.add(inlineChildArea);
-             // set the parent area for the child area
-             inlineChildArea.setParentArea(this);
-             if (autoSize) {
-                 increaseIPD(inlineChildArea.getAllocIPD());
-             }
+         InlineArea childArea = (InlineArea) c;
+         inlines.add(childArea);
+         // set the parent area for the child area
+         childArea.setParentArea(this);
+         if (autoSize) {
+             increaseIPD(childArea.getAllocIPD());
 +            updateLevel ( childArea.getBidiLevel() );
          }
 -        return getOffset() + minChildOffset;
+         int childOffset = childArea.getVirtualOffset();
+         minChildOffset = Math.min(minChildOffset, childOffset);
+         maxAfterEdge = Math.max(maxAfterEdge, childOffset + childArea.getVirtualBPD());
+     }
+     @Override
+     int getVirtualOffset() {
++        return getBlockProgressionOffset() + minChildOffset;
+     }
+     @Override
+     int getVirtualBPD() {
+         return maxAfterEdge - minChildOffset;
      }
  
      /**
index 0000000000000000000000000000000000000000,68cc9a79750dc027ebb23d4c541380cf946f9370..bc32a92d09124db4aedcfdb5911d9e0363957af1
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,141 +1,141 @@@
 -        out.writeObject(props);
+ /*
+  * Licensed to the Apache Software Foundation (ASF) under one or more
+  * contributor license agreements.  See the NOTICE file distributed with
+  * this work for additional information regarding copyright ownership.
+  * The ASF licenses this file to You under the Apache License, Version 2.0
+  * (the "License"); you may not use this file except in compliance with
+  * the License.  You may obtain a copy of the License at
+  *
+  *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ /* $Id$ */
+ package org.apache.fop.area.inline;
+ import java.awt.Rectangle;
+ import java.awt.geom.Rectangle2D;
+ import java.io.IOException;
+ import java.util.HashMap;
+ import org.apache.fop.area.Area;
+ import org.apache.fop.area.Viewport;
+ /**
+  * Inline viewport area.
+  * This is an inline-level viewport area for inline container,
+  * external graphic and instream foreign object. This viewport
+  * holds the area and positions it.
+  */
+ public class InlineViewport extends InlineArea implements Viewport {
+     private static final long serialVersionUID = 813338534627918689L;
+     // contents could be container, foreign object or image
+     private Area content;
+     // clipping for the viewport
+     private boolean clip = false;
+     // position of the child area relative to this area
+     private Rectangle2D contentPosition;
+     /**
+      * Create a new viewport area with the content area.
+      *
+      * @param child the child content area of this viewport
+      */
+     public InlineViewport(Area child) {
+         this.content = child;
+     }
+     /**
+      * Set the clip of this viewport.
+      *
+      * @param c true if this viewport should clip
+      */
+     public void setClip(boolean c) {
+         this.clip = c;
+     }
+     /** {@inheritDoc} */
+     public boolean hasClip() {
+         return this.clip;
+     }
+     /** {@inheritDoc} */
+     public Rectangle getClipRectangle() {
+         if (clip) {
+             return new Rectangle(getIPD(), getBPD());
+         } else {
+             return null;
+         }
+     }
+     /**
+      * Set the position and size of the content of this viewport.
+      *
+      * @param cp the position and size to place the content
+      */
+     public void setContentPosition(Rectangle2D cp) {
+         this.contentPosition = cp;
+     }
+     /**
+      * Get the position and size of the content of this viewport.
+      *
+      * @return the position and size to place the content
+      */
+     public Rectangle2D getContentPosition() {
+         return this.contentPosition;
+     }
+     /**
+      * Sets the content area.
+      * @param content the content area
+      */
+     public void setContent(Area content) {
+         this.content = content;
+     }
+     /**
+      * Get the content area for this viewport.
+      *
+      * @return the content area
+      */
+     public Area getContent() {
+         return this.content;
+     }
+     private void writeObject(java.io.ObjectOutputStream out)
+     throws IOException {
+         out.writeBoolean(contentPosition != null);
+         if (contentPosition != null) {
+             out.writeFloat((float) contentPosition.getX());
+             out.writeFloat((float) contentPosition.getY());
+             out.writeFloat((float) contentPosition.getWidth());
+             out.writeFloat((float) contentPosition.getHeight());
+         }
+         out.writeBoolean(clip);
 -        this.props = (HashMap) in.readObject();
++        out.writeObject(traits);
+         out.writeObject(content);
+     }
+     private void readObject(java.io.ObjectInputStream in)
+     throws IOException, ClassNotFoundException {
+         if (in.readBoolean()) {
+             contentPosition = new Rectangle2D.Float(in.readFloat(),
+                                                     in.readFloat(),
+                                                     in.readFloat(),
+                                                     in.readFloat());
+         }
+         this.clip = in.readBoolean();
++        this.traits = (HashMap) in.readObject();
+         this.content = (Area) in.readObject();
+     }
+ }
index 2ae978b26a28a63136a3329fde8bd6ab1cfbbda7,e04b021e4a0138d9e4e1c59969bd38fed64580de..d3c7956ba20a9aa24b56ab7d69037d2be76ca34d
@@@ -65,17 -65,12 +65,18 @@@ public class BFEntry 
      }
  
      /** {@inheritDoc} */
+     @Override
      public String toString() {
-         StringBuffer sb = new StringBuffer();
+         StringBuilder sb = new StringBuilder("BFEntry: ");
 -        sb.append("Unicode ").append(getUnicodeStart()).append("..").append(getUnicodeEnd());
 -        sb.append(" --> ").append(getGlyphStartIndex()).append("..");
 -        sb.append(getGlyphStartIndex() + getUnicodeEnd() - getUnicodeStart());
 +        sb.append ( "{ UC[" );
 +        sb.append ( unicodeStart );
 +        sb.append ( ',' );
 +        sb.append ( unicodeEnd );
 +        sb.append ( "]: GC[" );
 +        sb.append ( glyphStartIndex );
 +        sb.append ( ',' );
 +        sb.append ( glyphStartIndex + ( unicodeEnd - unicodeStart ) );
 +        sb.append ( "] }" );
          return sb.toString();
      }
  
index 7b4b36eccf7014b487df6289078fd6a3655719f0,14ce7474af81eacf40fb9bad27cd460e8aa0e6b3..fb5bd393ac4f0a5e8e2c4ac690dd1fdc2ebd3453
@@@ -198,14 -198,14 +198,14 @@@ public class InlineLayoutManager extend
      /**
       * Create and initialize an <code>InlineArea</code>
       *
-      * @param hasInlineParent   true if the parent is an inline
+      * @param isInline   true if the parent is an inline
       * @return the area
       */
-     protected InlineArea createArea(boolean hasInlineParent) {
+     protected InlineArea createArea(boolean isInline) {
          InlineArea area;
-         if (hasInlineParent) {
-             area = new InlineParent();
+         if (isInline) {
+             area = createInlineParent();
 -            area.setOffset(0);
 +            area.setBlockProgressionOffset(0);
          } else {
              area = new InlineBlockParent();
          }
index 7347eb3af5222df8d8b64e04ae5d5b594c297367,5e696801d003dce34d0656174aa50ecf8cc12e91..ea92eb53a1626b3e07333fd0979b727ec06f3fc8
@@@ -1433,9 -1431,8 +1434,9 @@@ public class LineLayoutManager extends 
          }
          lineArea.setBPD(lbp.lineHeight);
          lineArea.setIPD(lbp.lineWidth);
-         lineArea.addTrait(Trait.SPACE_BEFORE, new Integer(lbp.spaceBefore));
-         lineArea.addTrait(Trait.SPACE_AFTER, new Integer(lbp.spaceAfter));
 +        lineArea.setBidiLevel(bidiLevel);
+         lineArea.addTrait(Trait.SPACE_BEFORE, lbp.spaceBefore);
+         lineArea.addTrait(Trait.SPACE_AFTER, lbp.spaceAfter);
          alignmentContext.resizeLine(lbp.lineHeight, lbp.baseline);
  
          if (seq instanceof Paragraph) {
index 9f10a3b6109e98c6f186698873c97e046896cec5,45a02a9772eaad4fa1a881e36c2af60d5184847f..0256c05c4359502fbeab92c9d78c9cb00f9edff3
@@@ -685,10 -685,10 +685,10 @@@ public abstract class AbstractPathOrien
       * This renders an inline viewport by clipping if necessary.
       * @param viewport the viewport to handle
       */
-     public void renderViewport(Viewport viewport) {
+     public void renderInlineViewport(InlineViewport viewport) {
  
          float x = currentIPPosition / 1000f;
 -        float y = (currentBPPosition + viewport.getOffset()) / 1000f;
 +        float y = (currentBPPosition + viewport.getBlockProgressionOffset()) / 1000f;
          float width = viewport.getIPD() / 1000f;
          float height = viewport.getBPD() / 1000f;
          // TODO: Calculate the border rect correctly.
index 5660b7ec47d3ecf727d97d274f25a524de230eb7,7ff236d160867eefd8491a1919645e9de5b60715..2c4dc84bdc2292c6b7cffb898f82617d733484ed
@@@ -736,10 -734,10 +735,10 @@@ public abstract class AbstractRendere
       * Render the given Viewport.
       * @param viewport the viewport to render
       */
-     protected void renderViewport(Viewport viewport) {
+     protected void renderInlineViewport(InlineViewport viewport) {
          Area content = viewport.getContent();
          int saveBP = currentBPPosition;
 -        currentBPPosition += viewport.getOffset();
 +        currentBPPosition += viewport.getBlockProgressionOffset();
          Rectangle2D contpos = viewport.getContentPosition();
          if (content instanceof Image) {
              renderImage((Image) content, contpos);
index f8dd9b40a5d4f9f183b938ed0264b98238ac03b4,471a982ca6288c814f50294a17a480418ef07aec..4d307217b12fde5bb838e071acc58b1c0e9a405a
@@@ -550,8 -556,9 +556,9 @@@ public class IFSerializer extends Abstr
  
      /** {@inheritDoc} */
      public void drawText(int x, int y, int letterSpacing, int wordSpacing,
 -            int[] dx, String text) throws IFException {
 +            int[][] dp, String text) throws IFException {
          try {
+             addID();
              AttributesImpl atts = new AttributesImpl();
              addAttribute(atts, "x", Integer.toString(x));
              addAttribute(atts, "y", Integer.toString(y));
index 0d500d5a83b5e2b84fb7beba173a5a79e7849216,21d28042dfce20708331bdbc4876b25a9ff7d2ca..a36e6542b03d38d0410a15290fc141810942ecf4
@@@ -750,9 -747,9 +750,9 @@@ public class XMLRenderer extends Abstra
          atts.clear();
          addAreaAttributes(viewport);
          addTraitAttributes(viewport);
 -        addAttribute("offset", viewport.getOffset());
 +        addAttribute("offset", viewport.getBlockProgressionOffset());
          addAttribute("pos", viewport.getContentPosition());
-         if (viewport.getClip()) {
+         if (viewport.hasClip()) {
              addAttribute("clip", "true");
          }
          startElement("viewport", atts);