aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/java/org/apache/fop/area/Page.java27
-rw-r--r--src/java/org/apache/fop/fo/flow/AbstractGraphics.java256
-rw-r--r--src/java/org/apache/fop/fo/flow/ExternalGraphic.java170
-rw-r--r--src/java/org/apache/fop/fo/flow/InstreamForeignObject.java199
-rw-r--r--src/java/org/apache/fop/fo/pagination/Region.java4
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionAfter.java46
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionBefore.java45
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionBody.java59
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionEnd.java40
-rw-r--r--src/java/org/apache/fop/fo/pagination/RegionStart.java42
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java308
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java117
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java229
-rw-r--r--src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java7
-rw-r--r--src/java/org/apache/fop/render/xml/XMLRenderer.java7
15 files changed, 775 insertions, 781 deletions
diff --git a/src/java/org/apache/fop/area/Page.java b/src/java/org/apache/fop/area/Page.java
index 0778fab47..3f03bfa8a 100644
--- a/src/java/org/apache/fop/area/Page.java
+++ b/src/java/org/apache/fop/area/Page.java
@@ -92,14 +92,21 @@ public class Page implements Serializable, Cloneable {
* use the LengthBase.BLOCK_WIDTH.
*/
SimplePercentBaseContext pageWidthContext
- = new SimplePercentBaseContext(null, LengthBase.CONTAINING_BLOCK_WIDTH, pageViewPortDims.ipd);
+ = new SimplePercentBaseContext(null, LengthBase.CONTAINING_BLOCK_WIDTH
+ , pageViewPortDims.ipd);
SimplePercentBaseContext pageHeightContext
- = new SimplePercentBaseContext(null, LengthBase.CONTAINING_BLOCK_WIDTH, pageViewPortDims.bpd);
+ = new SimplePercentBaseContext(null, LengthBase.CONTAINING_BLOCK_WIDTH
+ , pageViewPortDims.bpd);
- Rectangle pageRefRect =
- new Rectangle(mProps.marginLeft.getValue(pageWidthContext), mProps.marginTop.getValue(pageHeightContext),
- pageViewPortDims.ipd - mProps.marginLeft.getValue(pageWidthContext) - mProps.marginRight.getValue(pageWidthContext),
- pageViewPortDims.bpd - mProps.marginTop.getValue(pageHeightContext) - mProps.marginBottom.getValue(pageHeightContext));
+ Rectangle pageRefRect
+ = new Rectangle(mProps.marginLeft.getValue(pageWidthContext)
+ , mProps.marginTop.getValue(pageHeightContext)
+ , pageViewPortDims.ipd
+ - mProps.marginLeft.getValue(pageWidthContext)
+ - mProps.marginRight.getValue(pageWidthContext)
+ , pageViewPortDims.bpd
+ - mProps.marginTop.getValue(pageHeightContext)
+ - mProps.marginBottom.getValue(pageHeightContext));
// Set up the CTM on the page reference area based on writing-mode
// and reference-orientation
@@ -112,7 +119,7 @@ public class Page implements Serializable, Cloneable {
for (Iterator regenum = spm.getRegions().values().iterator();
regenum.hasNext();) {
Region r = (Region)regenum.next();
- RegionViewport rvp = makeRegionViewport(r, reldims, pageCTM, pageViewPortDims);
+ RegionViewport rvp = makeRegionViewport(r, reldims, pageCTM, spm);
if (r.getNameId() == Constants.FO_REGION_BODY) {
rr = new BodyRegion((RegionBody) r, rvp);
} else {
@@ -133,13 +140,15 @@ public class Page implements Serializable, Cloneable {
/**
* Creates a RegionViewport Area object for this pagination Region.
+ * @param r the region the viewport is to be created for
* @param reldims relative dimensions
* @param pageCTM page coordinate transformation matrix
+ * @param spm the simple-page-master for this page
* @return the new region viewport
*/
private RegionViewport makeRegionViewport(Region r, FODimension reldims, CTM pageCTM,
- FODimension pageViewPortDims) {
- Rectangle2D relRegionRect = r.getViewportRectangle(reldims, pageViewPortDims);
+ SimplePageMaster spm) {
+ Rectangle2D relRegionRect = r.getViewportRectangle(reldims, spm);
Rectangle2D absRegionRect = pageCTM.transform(relRegionRect);
// Get the region viewport rectangle in absolute coords by
// transforming it using the page CTM
diff --git a/src/java/org/apache/fop/fo/flow/AbstractGraphics.java b/src/java/org/apache/fop/fo/flow/AbstractGraphics.java
new file mode 100644
index 000000000..b9f360c2c
--- /dev/null
+++ b/src/java/org/apache/fop/fo/flow/AbstractGraphics.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed 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.fo.flow;
+
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.datatypes.Length;
+import org.apache.fop.fo.FONode;
+import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.PropertyList;
+import org.apache.fop.fo.properties.CommonAccessibility;
+import org.apache.fop.fo.properties.CommonAural;
+import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
+import org.apache.fop.fo.properties.CommonMarginInline;
+import org.apache.fop.fo.properties.CommonRelativePosition;
+import org.apache.fop.fo.properties.KeepProperty;
+import org.apache.fop.fo.properties.LengthRangeProperty;
+
+/**
+ * Common base class for instream-foreign-object and external-graphics
+ * flow formatting objects.
+ */
+public abstract class AbstractGraphics extends FObj {
+
+ // The value of properties relevant for fo:instream-foreign-object
+ // and external-graphics.
+ private CommonAccessibility commonAccessibility;
+ private CommonAural commonAural;
+ private CommonBorderPaddingBackground commonBorderPaddingBackground;
+ private CommonMarginInline commonMarginInline;
+ private CommonRelativePosition commonRelativePosition;
+ private Length alignmentAdjust;
+ private int alignmentBaseline;
+ private Length baselineShift;
+ private LengthRangeProperty blockProgressionDimension;
+ // private ToBeImplementedProperty clip;
+ private Length contentHeight;
+ private String contentType;
+ private Length contentWidth;
+ private int displayAlign;
+ private int dominantBaseline;
+ private Length height;
+ private String id;
+ private LengthRangeProperty inlineProgressionDimension;
+ private KeepProperty keepWithNext;
+ private KeepProperty keepWithPrevious;
+ private Length lineHeight;
+ private int overflow;
+ private int scaling;
+ private int scalingMethod;
+ private int textAlign;
+ private int verticalAlign; // shorthand!!!
+ private Length width;
+ // End of property values
+
+ /**
+ * constructs an instream-foreign-object object (called by Maker).
+ *
+ * @param parent the parent formatting object
+ */
+ public AbstractGraphics(FONode parent) {
+ super(parent);
+ }
+
+ /**
+ * @see org.apache.fop.fo.FObj#bind(PropertyList)
+ */
+ public void bind(PropertyList pList) throws FOPException {
+ commonAccessibility = pList.getAccessibilityProps();
+ commonAural = pList.getAuralProps();
+ commonBorderPaddingBackground = pList.getBorderPaddingBackgroundProps();
+ commonMarginInline = pList.getMarginInlineProps();
+ commonRelativePosition = pList.getRelativePositionProps();
+ alignmentAdjust = pList.get(PR_ALIGNMENT_ADJUST).getLength();
+ alignmentBaseline = pList.get(PR_ALIGNMENT_BASELINE).getEnum();
+ baselineShift = pList.get(PR_BASELINE_SHIFT).getLength();
+ blockProgressionDimension = pList.get(PR_BLOCK_PROGRESSION_DIMENSION).getLengthRange();
+ // clip = pList.get(PR_CLIP);
+ contentHeight = pList.get(PR_CONTENT_HEIGHT).getLength();
+ contentType = pList.get(PR_CONTENT_TYPE).getString();
+ contentWidth = pList.get(PR_CONTENT_WIDTH).getLength();
+ displayAlign = pList.get(PR_DISPLAY_ALIGN).getEnum();
+ dominantBaseline = pList.get(PR_DOMINANT_BASELINE).getEnum();
+ height = pList.get(PR_HEIGHT).getLength();
+ id = pList.get(PR_ID).getString();
+ inlineProgressionDimension = pList.get(PR_INLINE_PROGRESSION_DIMENSION).getLengthRange();
+ keepWithNext = pList.get(PR_KEEP_WITH_NEXT).getKeep();
+ keepWithPrevious = pList.get(PR_KEEP_WITH_PREVIOUS).getKeep();
+ lineHeight = pList.get(PR_LINE_HEIGHT).getLength();
+ overflow = pList.get(PR_OVERFLOW).getEnum();
+ scaling = pList.get(PR_SCALING).getEnum();
+ scalingMethod = pList.get(PR_SCALING_METHOD).getEnum();
+ textAlign = pList.get(PR_TEXT_ALIGN).getEnum();
+ verticalAlign = pList.get(PR_VERTICAL_ALIGN).getEnum();
+ width = pList.get(PR_WIDTH).getLength();
+ }
+
+ /**
+ * Given the ipd and the content width calculates the
+ * required x offset based on the text-align property
+ * @param ipd the inline-progression-dimension of the object
+ * @param cwidth the calculated content width of the object
+ * @return the X offset
+ */
+ public int computeXOffset (int ipd, int cwidth) {
+ int xoffset = 0;
+ switch (textAlign) {
+ case EN_CENTER:
+ xoffset = (ipd - cwidth) / 2;
+ break;
+ case EN_END:
+ xoffset = ipd - cwidth;
+ break;
+ case EN_START:
+ break;
+ case EN_JUSTIFY:
+ default:
+ break;
+ }
+ return xoffset;
+ }
+
+ /**
+ * Given the bpd and the content height calculates the
+ * required y offset based on the display-align property
+ * @param bpd the block-progression-dimension of the object
+ * @param cheight the calculated content height of the object
+ * @return the Y offset
+ */
+ public int computeYOffset(int bpd, int cheight) {
+ int yoffset = 0;
+ switch (displayAlign) {
+ case EN_BEFORE:
+ break;
+ case EN_AFTER:
+ yoffset = bpd - cheight;
+ break;
+ case EN_CENTER:
+ yoffset = (bpd - cheight) / 2;
+ break;
+ case EN_AUTO:
+ default:
+ break;
+ }
+ return yoffset;
+ }
+
+ /**
+ * @return the "id" property.
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @return the Common Border, Padding, and Background Properties.
+ */
+ public CommonBorderPaddingBackground getCommonBorderPaddingBackground() {
+ return commonBorderPaddingBackground;
+ }
+
+ /**
+ * @return the "line-height" property.
+ */
+ public Length getLineHeight() {
+ return lineHeight;
+ }
+
+ /**
+ * @return the "inline-progression-dimension" property.
+ */
+ public LengthRangeProperty getInlineProgressionDimension() {
+ return inlineProgressionDimension;
+ }
+
+ /**
+ * @return the "block-progression-dimension" property.
+ */
+ public LengthRangeProperty getBlockProgressionDimension() {
+ return blockProgressionDimension;
+ }
+
+ /**
+ * @return the "height" property.
+ */
+ public Length getHeight() {
+ return height;
+ }
+
+ /**
+ * @return the "width" property.
+ */
+ public Length getWidth() {
+ return width;
+ }
+
+ /**
+ * @return the "content-height" property.
+ */
+ public Length getContentHeight() {
+ return contentHeight;
+ }
+
+ /**
+ * @return the "content-width" property.
+ */
+ public Length getContentWidth() {
+ return contentWidth;
+ }
+
+ /**
+ * @return the "scaling" property.
+ */
+ public int getScaling() {
+ return scaling;
+ }
+
+ /**
+ * @return the "vertical-align" property.
+ */
+ public int getVerticalAlign() {
+ return verticalAlign;
+ }
+
+ /**
+ * @return the "overflow" property.
+ */
+ public int getOverflow() {
+ return overflow;
+ }
+
+ /**
+ * @see org.apache.fop.fo.IntrinsicSizeAccess#getIntrinsicWidth()
+ */
+ public abstract int getIntrinsicWidth();
+
+ /**
+ * @see org.apache.fop.fo.IntrinsicSizeAccess#getIntrinsicHeight()
+ */
+ public abstract int getIntrinsicHeight();
+}
diff --git a/src/java/org/apache/fop/fo/flow/ExternalGraphic.java b/src/java/org/apache/fop/fo/flow/ExternalGraphic.java
index 156d5bf21..5fa54cef4 100644
--- a/src/java/org/apache/fop/fo/flow/ExternalGraphic.java
+++ b/src/java/org/apache/fop/fo/flow/ExternalGraphic.java
@@ -18,60 +18,24 @@
package org.apache.fop.fo.flow;
-import org.xml.sax.Locator;
-
import org.apache.fop.apps.FOPException;
-import org.apache.fop.datatypes.Length;
import org.apache.fop.fo.FONode;
-import org.apache.fop.fo.FObj;
import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.ValidationException;
-import org.apache.fop.fo.properties.CommonAccessibility;
-import org.apache.fop.fo.properties.CommonAural;
-import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
-import org.apache.fop.fo.properties.CommonMarginInline;
-import org.apache.fop.fo.properties.CommonRelativePosition;
-import org.apache.fop.fo.properties.KeepProperty;
-import org.apache.fop.fo.properties.LengthRangeProperty;
import org.apache.fop.image.FopImage;
import org.apache.fop.image.ImageFactory;
+import org.xml.sax.Locator;
/**
* External graphic formatting object.
* This FO node handles the external graphic. It creates an image
* inline area that can be added to the area tree.
*/
-public class ExternalGraphic extends FObj {
+public class ExternalGraphic extends AbstractGraphics {
// The value of properties relevant for fo:external-graphic.
- private CommonAccessibility commonAccessibility;
- private CommonAural commonAural;
- private CommonBorderPaddingBackground commonBorderPaddingBackground;
- private CommonMarginInline commonMarginInline;
- private CommonRelativePosition commonRelativePosition;
- private Length alignmentAdjust;
- private int alignmentBaseline;
- private Length baselineShift;
- private LengthRangeProperty blockProgressionDimension;
- // private ToBeImplementedProperty clip;
- private Length contentHeight;
- private String contentType;
- private Length contentWidth;
- private int displayAlign;
- private int dominantBaseline;
- private Length height;
- private String id;
- private LengthRangeProperty inlineProgressionDimension;
- private KeepProperty keepWithNext;
- private KeepProperty keepWithPrevious;
- private Length lineHeight;
- private int overflow;
- private int scaling;
- private int scalingMethod;
+ // All but one of the e-g properties are kept in AbstractGraphics
private String src;
- private int textAlign;
- private int verticalAlign; //Extra
- private Length width;
// End of property values
//Additional values
@@ -91,34 +55,8 @@ public class ExternalGraphic extends FObj {
* @see org.apache.fop.fo.FObj#bind(PropertyList)
*/
public void bind(PropertyList pList) throws FOPException {
- commonAccessibility = pList.getAccessibilityProps();
- commonAural = pList.getAuralProps();
- commonBorderPaddingBackground = pList.getBorderPaddingBackgroundProps();
- commonMarginInline = pList.getMarginInlineProps();
- commonRelativePosition = pList.getRelativePositionProps();
- alignmentAdjust = pList.get(PR_ALIGNMENT_ADJUST).getLength();
- alignmentBaseline = pList.get(PR_ALIGNMENT_BASELINE).getEnum();
- baselineShift = pList.get(PR_BASELINE_SHIFT).getLength();
- blockProgressionDimension = pList.get(PR_BLOCK_PROGRESSION_DIMENSION).getLengthRange();
- // clip = pList.get(PR_CLIP);
- contentHeight = pList.get(PR_CONTENT_HEIGHT).getLength();
- contentType = pList.get(PR_CONTENT_TYPE).getString();
- contentWidth = pList.get(PR_CONTENT_WIDTH).getLength();
- displayAlign = pList.get(PR_DISPLAY_ALIGN).getEnum();
- dominantBaseline = pList.get(PR_DOMINANT_BASELINE).getEnum();
- height = pList.get(PR_HEIGHT).getLength();
- id = pList.get(PR_ID).getString();
- inlineProgressionDimension = pList.get(PR_INLINE_PROGRESSION_DIMENSION).getLengthRange();
- keepWithNext = pList.get(PR_KEEP_WITH_NEXT).getKeep();
- keepWithPrevious = pList.get(PR_KEEP_WITH_PREVIOUS).getKeep();
- lineHeight = pList.get(PR_LINE_HEIGHT).getLength();
- overflow = pList.get(PR_OVERFLOW).getEnum();
- scaling = pList.get(PR_SCALING).getEnum();
- scalingMethod = pList.get(PR_SCALING_METHOD).getEnum();
+ super.bind(pList);
src = pList.get(PR_SRC).getString();
- textAlign = pList.get(PR_TEXT_ALIGN).getEnum();
- verticalAlign = pList.get(PR_VERTICAL_ALIGN).getEnum();
- width = pList.get(PR_WIDTH).getLength();
//Additional processing: preload image
url = ImageFactory.getURL(getSrc());
@@ -139,7 +77,7 @@ public class ExternalGraphic extends FObj {
* @see org.apache.fop.fo.FONode#startOfNode
*/
protected void startOfNode() throws FOPException {
- checkId(id);
+ checkId(getId());
getFOEventHandler().image(this);
}
@@ -153,83 +91,6 @@ public class ExternalGraphic extends FObj {
}
/**
- * @return the Common Border, Padding, and Background Properties.
- */
- public CommonBorderPaddingBackground getCommonBorderPaddingBackground() {
- return commonBorderPaddingBackground;
- }
-
- /**
- * @return the Common Margin Properties-Inline.
- */
- public CommonMarginInline getCommonMarginInline() {
- return commonMarginInline;
- }
-
- /**
- * @return the "block-progression-dimension" property.
- */
- public LengthRangeProperty getBlockProgressionDimension() {
- return blockProgressionDimension;
- }
-
- /**
- * @return the "content-height" property.
- */
- public Length getContentHeight() {
- return contentHeight;
- }
-
- /**
- * @return the "content-width" property.
- */
- public Length getContentWidth() {
- return contentWidth;
- }
-
- /**
- * @return the "display-align" property.
- */
- public int getDisplayAlign() {
- return displayAlign;
- }
-
- /**
- * @return the "height" property.
- */
- public Length getHeight() {
- return height;
- }
-
- /**
- * @return the "id" property.
- */
- public String getId() {
- return id;
- }
-
- /**
- * @return the "inline-progression-dimension" property.
- */
- public LengthRangeProperty getInlineProgressionDimension() {
- return inlineProgressionDimension;
- }
-
- /**
- * @return the "overflow" property.
- */
- public int getOverflow() {
- return overflow;
- }
-
- /**
- * @return the "scaling" property.
- */
- public int getScaling() {
- return scaling;
- }
-
- /**
* @return the "src" property.
*/
public String getSrc() {
@@ -244,27 +105,6 @@ public class ExternalGraphic extends FObj {
}
/**
- * @return the "text-align" property.
- */
- public int getTextAlign() {
- return textAlign;
- }
-
- /**
- * @return the "width" property.
- */
- public Length getWidth() {
- return width;
- }
-
- /**
- * @return the "vertical-align" property.
- */
- public int getVerticalAlign() {
- return verticalAlign;
- }
-
- /**
* @see org.apache.fop.fo.FObj#getName()
*/
public String getName() {
diff --git a/src/java/org/apache/fop/fo/flow/InstreamForeignObject.java b/src/java/org/apache/fop/fo/flow/InstreamForeignObject.java
index cfe90d07f..e59015947 100644
--- a/src/java/org/apache/fop/fo/flow/InstreamForeignObject.java
+++ b/src/java/org/apache/fop/fo/flow/InstreamForeignObject.java
@@ -19,59 +19,21 @@
package org.apache.fop.fo.flow;
import java.awt.geom.Point2D;
-
-import org.xml.sax.Locator;
-
import org.apache.fop.apps.FOPException;
-import org.apache.fop.datatypes.Length;
import org.apache.fop.fo.FONode;
-import org.apache.fop.fo.FObj;
-import org.apache.fop.fo.PropertyList;
import org.apache.fop.fo.ValidationException;
import org.apache.fop.fo.XMLObj;
-import org.apache.fop.fo.properties.CommonAccessibility;
-import org.apache.fop.fo.properties.CommonAural;
-import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
-import org.apache.fop.fo.properties.CommonMarginInline;
-import org.apache.fop.fo.properties.CommonRelativePosition;
-import org.apache.fop.fo.properties.KeepProperty;
-import org.apache.fop.fo.properties.LengthRangeProperty;
+import org.xml.sax.Locator;
/**
* The instream-foreign-object flow formatting object.
* This is an atomic inline object that contains
* xml data.
*/
-public class InstreamForeignObject extends FObj {
+public class InstreamForeignObject extends AbstractGraphics {
// The value of properties relevant for fo:instream-foreign-object.
- private CommonAccessibility commonAccessibility;
- private CommonAural commonAural;
- private CommonBorderPaddingBackground commonBorderPaddingBackground;
- private CommonMarginInline commonMarginInline;
- private CommonRelativePosition commonRelativePosition;
- private Length alignmentAdjust;
- private int alignmentBaseline;
- private Length baselineShift;
- private LengthRangeProperty blockProgressionDimension;
- // private ToBeImplementedProperty clip;
- private Length contentHeight;
- private String contentType;
- private Length contentWidth;
- private int displayAlign;
- private int dominantBaseline;
- private Length height;
- private String id;
- private LengthRangeProperty inlineProgressionDimension;
- private KeepProperty keepWithNext;
- private KeepProperty keepWithPrevious;
- private Length lineHeight;
- private int overflow;
- private int scaling;
- private int scalingMethod;
- private int textAlign;
- private int verticalAlign; // shorthand!!!
- private Length width;
+ // All property values contained in AbstractGraphics
// End of property values
//Additional value
@@ -87,43 +49,10 @@ public class InstreamForeignObject extends FObj {
}
/**
- * @see org.apache.fop.fo.FObj#bind(PropertyList)
- */
- public void bind(PropertyList pList) throws FOPException {
- commonAccessibility = pList.getAccessibilityProps();
- commonAural = pList.getAuralProps();
- commonBorderPaddingBackground = pList.getBorderPaddingBackgroundProps();
- commonMarginInline = pList.getMarginInlineProps();
- commonRelativePosition = pList.getRelativePositionProps();
- alignmentAdjust = pList.get(PR_ALIGNMENT_ADJUST).getLength();
- alignmentBaseline = pList.get(PR_ALIGNMENT_BASELINE).getEnum();
- baselineShift = pList.get(PR_BASELINE_SHIFT).getLength();
- blockProgressionDimension = pList.get(PR_BLOCK_PROGRESSION_DIMENSION).getLengthRange();
- // clip = pList.get(PR_CLIP);
- contentHeight = pList.get(PR_CONTENT_HEIGHT).getLength();
- contentType = pList.get(PR_CONTENT_TYPE).getString();
- contentWidth = pList.get(PR_CONTENT_WIDTH).getLength();
- displayAlign = pList.get(PR_DISPLAY_ALIGN).getEnum();
- dominantBaseline = pList.get(PR_DOMINANT_BASELINE).getEnum();
- height = pList.get(PR_HEIGHT).getLength();
- id = pList.get(PR_ID).getString();
- inlineProgressionDimension = pList.get(PR_INLINE_PROGRESSION_DIMENSION).getLengthRange();
- keepWithNext = pList.get(PR_KEEP_WITH_NEXT).getKeep();
- keepWithPrevious = pList.get(PR_KEEP_WITH_PREVIOUS).getKeep();
- lineHeight = pList.get(PR_LINE_HEIGHT).getLength();
- overflow = pList.get(PR_OVERFLOW).getEnum();
- scaling = pList.get(PR_SCALING).getEnum();
- scalingMethod = pList.get(PR_SCALING_METHOD).getEnum();
- textAlign = pList.get(PR_TEXT_ALIGN).getEnum();
- verticalAlign = pList.get(PR_VERTICAL_ALIGN).getEnum();
- width = pList.get(PR_WIDTH).getLength();
- }
-
- /**
* @see org.apache.fop.fo.FONode#startOfNode
*/
protected void startOfNode() throws FOPException {
- checkId(id);
+ checkId(getId());
}
/**
@@ -150,126 +79,6 @@ public class InstreamForeignObject extends FObj {
}
}
- public int computeXOffset (int ipd, int cwidth) {
- int xoffset = 0;
- switch (textAlign) {
- case EN_CENTER:
- xoffset = (ipd - cwidth) / 2;
- break;
- case EN_END:
- xoffset = ipd - cwidth;
- break;
- case EN_START:
- break;
- case EN_JUSTIFY:
- default:
- break;
- }
- return xoffset;
- }
-
- public int computeYOffset(int bpd, int cheight) {
- int yoffset = 0;
- switch (displayAlign) {
- case EN_BEFORE:
- break;
- case EN_AFTER:
- yoffset = bpd - cheight;
- break;
- case EN_CENTER:
- yoffset = (bpd - cheight) / 2;
- break;
- case EN_AUTO:
- default:
- break;
- }
- return yoffset;
- }
-
- /**
- * @return the "id" property.
- */
- public String getId() {
- return id;
- }
-
- /**
- * @return the Common Border, Padding, and Background Properties.
- */
- public CommonBorderPaddingBackground getCommonBorderPaddingBackground() {
- return commonBorderPaddingBackground;
- }
-
- /**
- * @return the "line-height" property.
- */
- public Length getLineHeight() {
- return lineHeight;
- }
-
- /**
- * @return the "inline-progression-dimension" property.
- */
- public LengthRangeProperty getInlineProgressionDimension() {
- return inlineProgressionDimension;
- }
-
- /**
- * @return the "block-progression-dimension" property.
- */
- public LengthRangeProperty getBlockProgressionDimension() {
- return blockProgressionDimension;
- }
-
- /**
- * @return the "height" property.
- */
- public Length getHeight() {
- return height;
- }
-
- /**
- * @return the "width" property.
- */
- public Length getWidth() {
- return width;
- }
-
- /**
- * @return the "content-height" property.
- */
- public Length getContentHeight() {
- return contentHeight;
- }
-
- /**
- * @return the "content-width" property.
- */
- public Length getContentWidth() {
- return contentWidth;
- }
-
- /**
- * @return the "scaling" property.
- */
- public int getScaling() {
- return scaling;
- }
-
- /**
- * @return the "vertical-align" property.
- */
- public int getVerticalAlign() {
- return verticalAlign;
- }
-
- /**
- * @return the "overflow" property.
- */
- public int getOverflow() {
- return overflow;
- }
-
/**
* @see org.apache.fop.fo.FObj#getName()
*/
diff --git a/src/java/org/apache/fop/fo/pagination/Region.java b/src/java/org/apache/fop/fo/pagination/Region.java
index 4980d057e..756b2be03 100644
--- a/src/java/org/apache/fop/fo/pagination/Region.java
+++ b/src/java/org/apache/fop/fo/pagination/Region.java
@@ -99,11 +99,11 @@ public abstract class Region extends FObj {
/**
* @param pageRefRect reference dimension of the page area.
- * @param pageViewRectRect page view port dimensions.
+ * @param spm the simple page master this region belongs to.
* @return the rectangle for the viewport area
*/
public abstract Rectangle getViewportRectangle(FODimension pageRefRect
- , FODimension pageViewPortRect);
+ , SimplePageMaster spm);
/**
* Returns the default region name (xsl-region-before, xsl-region-start,
diff --git a/src/java/org/apache/fop/fo/pagination/RegionAfter.java b/src/java/org/apache/fop/fo/pagination/RegionAfter.java
index 68d6d066d..776f9d764 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionAfter.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionAfter.java
@@ -40,31 +40,43 @@ public class RegionAfter extends RegionBA {
}
/**
- * @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension)
+ * @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension, SimplePageMaster)
*/
- public Rectangle getViewportRectangle (FODimension reldims, FODimension pageViewPortRect) {
- // Depends on extent, precedence ans writing mode
- /* Special rules apply to resolving extent.
- * In the property subsystem the extent property is configured to
- * using BLOCK_WIDTH as its percent base.
- * However, depending on the writing mode extent import resolved either
- * against the page width or the page height.
+ public Rectangle getViewportRectangle (FODimension reldims, SimplePageMaster spm) {
+ /* Special rules apply to resolving extent as values are resolved relative
+ * to the page size and reference orientation.
*/
- Rectangle vpRect;
- SimplePercentBaseContext pageWidthContext
- = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.ipd);
- SimplePercentBaseContext pageHeightContext
- = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.bpd);
+ SimplePercentBaseContext pageWidthContext;
+ SimplePercentBaseContext pageHeightContext;
+ if (spm.getReferenceOrientation() % 180 == 0) {
+ pageWidthContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageWidth().getValue());
+ pageHeightContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageHeight().getValue());
+ } else {
+ // invert width and height since top left are rotated by 90 (cl or ccl)
+ pageWidthContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageHeight().getValue());
+ pageHeightContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageWidth().getValue());
+ }
SimplePercentBaseContext neighbourContext;
- if (getWritingMode() == EN_LR_TB || getWritingMode() == EN_RL_TB) {
+ Rectangle vpRect;
+ if (spm.getWritingMode() == EN_LR_TB || spm.getWritingMode() == EN_RL_TB) {
neighbourContext = pageWidthContext;
- vpRect = new Rectangle(0, reldims.bpd - getExtent().getValue(pageHeightContext), reldims.ipd, getExtent().getValue(pageHeightContext));
+ vpRect = new Rectangle(0, reldims.bpd - getExtent().getValue(pageHeightContext)
+ , reldims.ipd, getExtent().getValue(pageHeightContext));
} else {
neighbourContext = pageHeightContext;
- vpRect = new Rectangle(0, reldims.bpd - getExtent().getValue(pageWidthContext), getExtent().getValue(pageWidthContext), reldims.ipd);
+ vpRect = new Rectangle(0, reldims.bpd - getExtent().getValue(pageWidthContext)
+ , getExtent().getValue(pageWidthContext), reldims.ipd);
}
if (getPrecedence() == EN_FALSE) {
- adjustIPD(vpRect, getWritingMode(), neighbourContext);
+ adjustIPD(vpRect, spm.getWritingMode(), neighbourContext);
}
return vpRect;
}
diff --git a/src/java/org/apache/fop/fo/pagination/RegionBefore.java b/src/java/org/apache/fop/fo/pagination/RegionBefore.java
index c1f683c05..53279e4da 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionBefore.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionBefore.java
@@ -46,28 +46,33 @@ public class RegionBefore extends RegionBA {
}
/**
- * @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension)
+ * @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension, SimplePageMaster)
*/
- public Rectangle getViewportRectangle (FODimension reldims, FODimension pageViewPortRect) {
- // Depends on extent, precedence and writing mode
- // This should return rectangle in writing-mode coordinates relative
- // to the page-reference area rectangle
- // This means the origin is (start, before) and the dimensions are (ipd,bpd)
- // Before is always 0, start depends on extent
- // ipd depends on precedence, bpd=extent
- /* Special rules apply to resolving extent.
- * In the property subsystem the extent property is configured to
- * using BLOCK_WIDTH as its percent base.
- * However, depending on the writing mode extent import resolved either
- * against the page width or the page height.
+ public Rectangle getViewportRectangle (FODimension reldims, SimplePageMaster spm) {
+ /* Special rules apply to resolving extent as values are resolved relative
+ * to the page size and reference orientation.
*/
- Rectangle vpRect;
- SimplePercentBaseContext pageWidthContext
- = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.ipd);
- SimplePercentBaseContext pageHeightContext
- = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.bpd);
+ SimplePercentBaseContext pageWidthContext;
+ SimplePercentBaseContext pageHeightContext;
+ if (spm.getReferenceOrientation() % 180 == 0) {
+ pageWidthContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageWidth().getValue());
+ pageHeightContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageHeight().getValue());
+ } else {
+ // invert width and height since top left are rotated by 90 (cl or ccl)
+ pageWidthContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageHeight().getValue());
+ pageHeightContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageWidth().getValue());
+ }
SimplePercentBaseContext neighbourContext;
- if (getWritingMode() == EN_LR_TB || getWritingMode() == EN_RL_TB) {
+ Rectangle vpRect;
+ if (spm.getWritingMode() == EN_LR_TB || spm.getWritingMode() == EN_RL_TB) {
neighbourContext = pageWidthContext;
vpRect = new Rectangle(0, 0, reldims.ipd, getExtent().getValue(pageHeightContext));
} else {
@@ -75,7 +80,7 @@ public class RegionBefore extends RegionBA {
vpRect = new Rectangle(0, 0, getExtent().getValue(pageWidthContext), reldims.ipd);
}
if (getPrecedence() == EN_FALSE) {
- adjustIPD(vpRect, getWritingMode(), neighbourContext);
+ adjustIPD(vpRect, spm.getWritingMode(), neighbourContext);
}
return vpRect;
}
diff --git a/src/java/org/apache/fop/fo/pagination/RegionBody.java b/src/java/org/apache/fop/fo/pagination/RegionBody.java
index 835802469..855b2747f 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionBody.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionBody.java
@@ -63,13 +63,14 @@ public class RegionBody extends Region {
* these cases, but we will need to be able to change Numeric
* values in order to do this.
*/
- attributeError("If overflow property is set to \"scroll\"," +
- " a column-count other than \"1\" may not be specified.");
+ attributeError("If overflow property is set to \"scroll\","
+ + " a column-count other than \"1\" may not be specified.");
}
}
/**
* Return the Common Margin Properties-Block.
+ * @return the Common Margin Properties-Block.
*/
public CommonMarginBlock getCommonMarginBlock() {
return commonMarginBlock;
@@ -77,6 +78,7 @@ public class RegionBody extends Region {
/**
* Return the "column-count" property.
+ * @return the "column-count" property.
*/
public int getColumnCount() {
return columnCount.getValue();
@@ -84,35 +86,60 @@ public class RegionBody extends Region {
/**
* Return the "column-gap" property.
+ * @return the "column-gap" property.
*/
public int getColumnGap() {
return columnGap.getValue();
}
/**
- * @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension)
+ * @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension, SimplePageMaster)
*/
- public Rectangle getViewportRectangle (FODimension reldims, FODimension pageViewPortRect) {
+ public Rectangle getViewportRectangle (FODimension reldims, SimplePageMaster spm) {
/* Special rules apply to resolving margins in the page context.
* Contrary to normal margins in this case top and bottom margin
* are resolved relative to the height. In the property subsystem
* all margin properties are configured to using BLOCK_WIDTH.
* That's why we 'cheat' here and setup a context for the height but
* use the LengthBase.BLOCK_WIDTH.
- * Also the values are resolved relative to the page size.
+ * Also the values are resolved relative to the page size
+ * and reference orientation.
*/
- SimplePercentBaseContext pageWidthContext
- = new SimplePercentBaseContext(null, LengthBase.CONTAINING_BLOCK_WIDTH, pageViewPortRect.ipd);
- SimplePercentBaseContext pageHeightContext
- = new SimplePercentBaseContext(null, LengthBase.CONTAINING_BLOCK_WIDTH, pageViewPortRect.bpd);
+ SimplePercentBaseContext pageWidthContext;
+ SimplePercentBaseContext pageHeightContext;
+ if (spm.getReferenceOrientation() % 180 == 0) {
+ pageWidthContext = new SimplePercentBaseContext(null,
+ LengthBase.CONTAINING_BLOCK_WIDTH,
+ spm.getPageWidth().getValue());
+ pageHeightContext = new SimplePercentBaseContext(null,
+ LengthBase.CONTAINING_BLOCK_WIDTH,
+ spm.getPageHeight().getValue());
+ } else {
+ // invert width and height since top left are rotated by 90 (cl or ccl)
+ pageWidthContext = new SimplePercentBaseContext(null,
+ LengthBase.CONTAINING_BLOCK_WIDTH,
+ spm.getPageHeight().getValue());
+ pageHeightContext = new SimplePercentBaseContext(null,
+ LengthBase.CONTAINING_BLOCK_WIDTH,
+ spm.getPageWidth().getValue());
+ }
- int left = commonMarginBlock.marginLeft.getValue(pageWidthContext);
- int right = commonMarginBlock.marginRight.getValue(pageWidthContext);
- int top = commonMarginBlock.marginTop.getValue(pageHeightContext);
- int bottom = commonMarginBlock.marginBottom.getValue(pageHeightContext);
- return new Rectangle(left, top,
- reldims.ipd - left - right,
- reldims.bpd - top - bottom);
+ int start;
+ int end;
+ if (spm.getWritingMode() == EN_LR_TB) { // Left-to-right
+ start = commonMarginBlock.marginLeft.getValue(pageWidthContext);
+ end = commonMarginBlock.marginRight.getValue(pageWidthContext);
+ } else { // all other supported modes are right-to-left
+ start = commonMarginBlock.marginRight.getValue(pageWidthContext);
+ end = commonMarginBlock.marginLeft.getValue(pageWidthContext);
+ }
+ int before = commonMarginBlock.spaceBefore.getOptimum(pageHeightContext)
+ .getLength().getValue(pageHeightContext);
+ int after = commonMarginBlock.spaceAfter.getOptimum(pageHeightContext)
+ .getLength().getValue(pageHeightContext);
+ return new Rectangle(start, before,
+ reldims.ipd - start - end,
+ reldims.bpd - before - after);
}
/**
diff --git a/src/java/org/apache/fop/fo/pagination/RegionEnd.java b/src/java/org/apache/fop/fo/pagination/RegionEnd.java
index a097ec375..eadc08992 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionEnd.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionEnd.java
@@ -39,23 +39,33 @@ public class RegionEnd extends RegionSE {
}
/**
- * @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension)
+ * @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension, SimplePageMaster)
*/
- public Rectangle getViewportRectangle (FODimension reldims, FODimension pageViewPortRect) {
- // Depends on extent, precedence and writing mode
- /* Special rules apply to resolving extent.
- * In the property subsystem the extent property is configured to
- * using BLOCK_WIDTH as its percent base.
- * However, depending on the writing mode extent import resolved either
- * against the page width or the page height.
+ public Rectangle getViewportRectangle (FODimension reldims, SimplePageMaster spm) {
+ /* Special rules apply to resolving extent as values are resolved relative
+ * to the page size and reference orientation.
*/
- Rectangle vpRect;
- SimplePercentBaseContext pageWidthContext
- = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.ipd);
- SimplePercentBaseContext pageHeightContext
- = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.bpd);
+ SimplePercentBaseContext pageWidthContext;
+ SimplePercentBaseContext pageHeightContext;
+ if (spm.getReferenceOrientation() % 180 == 0) {
+ pageWidthContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageWidth().getValue());
+ pageHeightContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageHeight().getValue());
+ } else {
+ // invert width and height since top left are rotated by 90 (cl or ccl)
+ pageWidthContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageHeight().getValue());
+ pageHeightContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageWidth().getValue());
+ }
SimplePercentBaseContext neighbourContext;
- if (getWritingMode() == EN_LR_TB || getWritingMode() == EN_RL_TB) {
+ Rectangle vpRect;
+ if (spm.getWritingMode() == EN_LR_TB || spm.getWritingMode() == EN_RL_TB) {
neighbourContext = pageHeightContext;
vpRect = new Rectangle(reldims.ipd - getExtent().getValue(pageWidthContext), 0,
getExtent().getValue(pageWidthContext), reldims.bpd);
@@ -65,7 +75,7 @@ public class RegionEnd extends RegionSE {
vpRect = new Rectangle(reldims.ipd - getExtent().getValue(pageHeightContext), 0,
reldims.bpd, getExtent().getValue(pageHeightContext));
}
- adjustIPD(vpRect, getWritingMode(), neighbourContext);
+ adjustIPD(vpRect, spm.getWritingMode(), neighbourContext);
return vpRect;
}
diff --git a/src/java/org/apache/fop/fo/pagination/RegionStart.java b/src/java/org/apache/fop/fo/pagination/RegionStart.java
index 2de7cc68f..2d74069bc 100644
--- a/src/java/org/apache/fop/fo/pagination/RegionStart.java
+++ b/src/java/org/apache/fop/fo/pagination/RegionStart.java
@@ -39,32 +39,40 @@ public class RegionStart extends RegionSE {
}
/**
- * @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension)
+ * @see org.apache.fop.fo.pagination.Region#getViewportRectangle(FODimension, SimplePageMaster)
*/
- public Rectangle getViewportRectangle (FODimension reldims, FODimension pageViewPortRect) {
- // Depends on extent, precedence and writing mode
- // This is the rectangle relative to the page-reference area in
- // writing-mode relative coordinates
- /* Special rules apply to resolving extent.
- * In the property subsystem the extent property is configured to
- * using BLOCK_WIDTH as its percent base.
- * However, depending on the writing mode extent import resolved either
- * against the page width or the page height.
+ public Rectangle getViewportRectangle (FODimension reldims, SimplePageMaster spm) {
+ /* Special rules apply to resolving extent as values are resolved relative
+ * to the page size and reference orientation.
*/
- Rectangle vpRect;
- SimplePercentBaseContext pageWidthContext
- = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.ipd);
- SimplePercentBaseContext pageHeightContext
- = new SimplePercentBaseContext(null, LengthBase.CUSTOM_BASE, pageViewPortRect.bpd);
+ SimplePercentBaseContext pageWidthContext;
+ SimplePercentBaseContext pageHeightContext;
+ if (spm.getReferenceOrientation() % 180 == 0) {
+ pageWidthContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageWidth().getValue());
+ pageHeightContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageHeight().getValue());
+ } else {
+ // invert width and height since top left are rotated by 90 (cl or ccl)
+ pageWidthContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageHeight().getValue());
+ pageHeightContext = new SimplePercentBaseContext(null,
+ LengthBase.CUSTOM_BASE,
+ spm.getPageWidth().getValue());
+ }
SimplePercentBaseContext neighbourContext;
- if (getWritingMode() == EN_LR_TB || getWritingMode() == EN_RL_TB) {
+ Rectangle vpRect;
+ if (spm.getWritingMode() == EN_LR_TB || spm.getWritingMode() == EN_RL_TB) {
neighbourContext = pageHeightContext;
vpRect = new Rectangle(0, 0, getExtent().getValue(pageWidthContext), reldims.bpd);
} else {
neighbourContext = pageWidthContext;
vpRect = new Rectangle(0, 0, reldims.bpd, getExtent().getValue(pageHeightContext));
}
- adjustIPD(vpRect, getWritingMode(), neighbourContext);
+ adjustIPD(vpRect, spm.getWritingMode(), neighbourContext);
return vpRect;
}
diff --git a/src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java
new file mode 100644
index 000000000..ec36508f2
--- /dev/null
+++ b/src/java/org/apache/fop/layoutmgr/inline/AbstractGraphicsLayoutManager.java
@@ -0,0 +1,308 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed 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.layoutmgr.inline;
+
+import java.awt.geom.Rectangle2D;
+import java.util.LinkedList;
+
+import org.apache.fop.area.Area;
+import org.apache.fop.area.inline.InlineArea;
+import org.apache.fop.area.inline.Viewport;
+import org.apache.fop.datatypes.Length;
+import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.fo.FObj;
+import org.apache.fop.fo.flow.AbstractGraphics;
+import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
+import org.apache.fop.layoutmgr.LayoutContext;
+import org.apache.fop.layoutmgr.TraitSetter;
+
+
+/**
+ * LayoutManager handling the common tasks for the fo:instream-foreign-object
+ * and fo:external-graphics formatting objects
+ */
+public abstract class AbstractGraphicsLayoutManager extends LeafNodeLayoutManager {
+
+ protected AbstractGraphics fobj;
+
+ /**
+ * Constructor
+ * @param node the formatting object that creates this area
+ * @param parent the parent layout manager
+ */
+ public AbstractGraphicsLayoutManager(AbstractGraphics node) {
+ super(node);
+ fobj = node;
+ }
+
+ /**
+ * Get the inline area created by this element.
+ *
+ * @return the viewport inline area
+ */
+ private Viewport getInlineArea() {
+
+ // viewport size is determined by block-progression-dimension
+ // and inline-progression-dimension
+
+ // if replaced then use height then ignore block-progression-dimension
+ //int h = this.propertyList.get("height").getLength().mvalue();
+
+ // use specified line-height then ignore dimension in height direction
+ boolean hasLH = false; //propertyList.get("line-height").getSpecifiedValue() != null;
+
+ Length len;
+
+ int bpd = -1;
+ int ipd = -1;
+ boolean bpdauto = false;
+ if (hasLH) {
+ bpd = fobj.getLineHeight().getValue(this);
+ } else {
+ // this property does not apply when the line-height applies
+ // isn't the block-progression-dimension always in the same
+ // direction as the line height?
+ len = fobj.getBlockProgressionDimension().getOptimum(this).getLength();
+ if (len.getEnum() != EN_AUTO) {
+ bpd = len.getValue(this);
+ } else {
+ len = fobj.getHeight();
+ if (len.getEnum() != EN_AUTO) {
+ bpd = len.getValue(this);
+ }
+ }
+ }
+
+ len = fobj.getInlineProgressionDimension().getOptimum(this).getLength();
+ if (len.getEnum() != EN_AUTO) {
+ ipd = len.getValue(this);
+ } else {
+ len = fobj.getWidth();
+ if (len.getEnum() != EN_AUTO) {
+ ipd = len.getValue(this);
+ }
+ }
+
+ // if auto then use the intrinsic size of the content scaled
+ // to the content-height and content-width
+ int cwidth = -1;
+ int cheight = -1;
+ len = fobj.getContentWidth();
+ if (len.getEnum() != EN_AUTO) {
+ if (len.getEnum() == EN_SCALE_TO_FIT) {
+ if (ipd != -1) {
+ cwidth = ipd;
+ }
+ } else {
+ cwidth = len.getValue(this);
+ }
+ }
+ len = fobj.getContentHeight();
+ if (len.getEnum() != EN_AUTO) {
+ if (len.getEnum() == EN_SCALE_TO_FIT) {
+ if (bpd != -1) {
+ cwidth = bpd;
+ }
+ } else {
+ cheight = len.getValue(this);
+ }
+ }
+
+ int scaling = fobj.getScaling();
+ if ((scaling == EN_UNIFORM) || (cwidth == -1) || cheight == -1) {
+ if (cwidth == -1 && cheight == -1) {
+ cwidth = fobj.getIntrinsicWidth();
+ cheight = fobj.getIntrinsicHeight();
+ } else if (cwidth == -1) {
+ cwidth = (int)(fobj.getIntrinsicWidth() * (double)cheight
+ / fobj.getIntrinsicHeight());
+ } else if (cheight == -1) {
+ cheight = (int)(fobj.getIntrinsicHeight() * (double)cwidth
+ / fobj.getIntrinsicWidth());
+ } else {
+ // adjust the larger
+ double rat1 = cwidth / fobj.getIntrinsicWidth();
+ double rat2 = cheight / fobj.getIntrinsicHeight();
+ if (rat1 < rat2) {
+ // reduce cheight
+ cheight = (int)(rat1 * fobj.getIntrinsicHeight());
+ } else if (rat1 > rat2) {
+ cwidth = (int)(rat2 * fobj.getIntrinsicWidth());
+ }
+ }
+ }
+
+ if (ipd == -1) {
+ ipd = cwidth;
+ }
+ if (bpd == -1) {
+ bpd = cheight;
+ }
+
+ boolean clip = false;
+ if (cwidth > ipd || cheight > bpd) {
+ int overflow = fobj.getOverflow();
+ if (overflow == EN_HIDDEN) {
+ clip = true;
+ } else if (overflow == EN_ERROR_IF_OVERFLOW) {
+ fobj.getLogger().error("Object overflows the viewport: clipping");
+ clip = true;
+ }
+ }
+
+ int xoffset = fobj.computeXOffset(ipd, cwidth);
+ int yoffset = fobj.computeYOffset(bpd, cheight);
+
+ CommonBorderPaddingBackground borderProps = fobj.getCommonBorderPaddingBackground();
+
+ //Determine extra BPD from borders etc.
+ int beforeBPD = borderProps.getPadding(CommonBorderPaddingBackground.BEFORE, false, this);
+ beforeBPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.BEFORE,
+ false);
+ int afterBPD = borderProps.getPadding(CommonBorderPaddingBackground.AFTER, false, this);
+ afterBPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.AFTER, false);
+
+ yoffset += beforeBPD;
+ //bpd += beforeBPD;
+ //bpd += afterBPD;
+
+ //Determine extra IPD from borders etc.
+ int startIPD = borderProps.getPadding(CommonBorderPaddingBackground.START,
+ false/*bNotFirst*/, this);
+ startIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.START,
+ false/*bNotFirst*/);
+ int endIPD = borderProps.getPadding(CommonBorderPaddingBackground.END, false/*bNotLast*/, this);
+ endIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.END, false/*bNotLast*/);
+
+ xoffset += startIPD;
+ //ipd += startIPD;
+ //ipd += endIPD;
+
+ Rectangle2D placement = new Rectangle2D.Float(xoffset, yoffset, cwidth, cheight);
+
+ Area viewportArea = getChildArea();
+ TraitSetter.setProducerID(viewportArea, fobj.getId());
+
+ Viewport vp = new Viewport(viewportArea);
+ TraitSetter.setProducerID(vp, fobj.getId());
+ vp.setIPD(ipd);
+ vp.setBPD(bpd);
+ vp.setContentPosition(placement);
+ vp.setClip(clip);
+ vp.setOffset(0);
+
+ // Common Border, Padding, and Background Properties
+ TraitSetter.addBorders(vp, fobj.getCommonBorderPaddingBackground(), this);
+ TraitSetter.addBackground(vp, fobj.getCommonBorderPaddingBackground(), this);
+
+ return vp;
+ }
+
+ /**
+ * @see org.apache.fop.layoutmgr.LayoutManager#getNextKnuthElements(LayoutContext, int)
+ */
+ public LinkedList getNextKnuthElements(LayoutContext context,
+ int alignment) {
+ Viewport areaCurrent = getInlineArea();
+ setCurrentArea(areaCurrent);
+ setAlignment(fobj.getVerticalAlign());
+ setLead(areaCurrent.getAllocBPD());
+ return super.getNextKnuthElements(context, alignment);
+ }
+
+ /**
+ * @see org.apache.fop.layoutmgr.inline.LeafNodeLayoutManager#addId()
+ */
+ protected void addId() {
+ getPSLM().addIDToPage(fobj.getId());
+ }
+
+ /**
+ * Offset this area.
+ * Offset the inline area in the bpd direction when adding the
+ * inline area.
+ * This is used for vertical alignment.
+ * External graphic uses the large allocation rectangle so we have
+ * to take the border/padding into account as well.
+ * @param area the inline area to be updated
+ * @param context the layout context used for adding the area
+ * @see LeafNodeLayoutManager#offsetArea(InlineArae, LayoutContext)
+ */
+ protected void offsetArea(InlineArea area, LayoutContext context) {
+ int bpd = area.getBPD()
+ + area.getBorderAndPaddingWidthBefore()
+ + area.getBorderAndPaddingWidthAfter();
+ switch (verticalAlignment) {
+ case EN_MIDDLE:
+ area.setOffset(context.getMiddleBaseline() - bpd / 2);
+ break;
+ case EN_TOP:
+ area.setOffset(context.getTopBaseline());
+ break;
+ case EN_BOTTOM:
+ area.setOffset(context.getBottomBaseline() - bpd);
+ break;
+ case EN_BASELINE:
+ default:
+ area.setOffset(context.getBaseline() - bpd);
+ break;
+ }
+ }
+
+ /**
+ * Returns the image of foreign object area to be put into
+ * the viewport.
+ * @return the appropriate area
+ */
+ abstract Area getChildArea();
+
+ // --------- Property Resolution related functions --------- //
+
+ /**
+ * @see org.apache.fop.datatypes.PercentBaseContext#getBaseLength(int, FObj)
+ */
+ public int getBaseLength(int lengthBase, FObj fobj) {
+ switch (lengthBase) {
+ case LengthBase.IMAGE_INTRINSIC_WIDTH:
+ return getIntrinsicWidth();
+ case LengthBase.IMAGE_INTRINSIC_HEIGHT:
+ return getIntrinsicHeight();
+ default: // Delegate to super class
+ return super.getBaseLength(lengthBase, fobj);
+ }
+ }
+
+ /**
+ * Returns the intrinsic width of the e-g.
+ * @return the width of the element
+ */
+ protected int getIntrinsicWidth() {
+ return fobj.getIntrinsicWidth();
+ }
+
+ /**
+ * Returns the intrinsic height of the e-g.
+ * @return the height of the element
+ */
+ protected int getIntrinsicHeight() {
+ return fobj.getIntrinsicHeight();
+ }
+
+}
+
diff --git a/src/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java
index b31b5ea04..e6ddcffbd 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/ExternalGraphicLayoutManager.java
@@ -18,41 +18,19 @@
package org.apache.fop.layoutmgr.inline;
-// Java
import java.awt.geom.Rectangle2D;
-import java.util.LinkedList;
-
-// FOP
+import org.apache.fop.area.Area;
import org.apache.fop.area.inline.Image;
-import org.apache.fop.area.inline.InlineArea;
-import org.apache.fop.area.inline.Viewport;
-import org.apache.fop.datatypes.Length;
-import org.apache.fop.datatypes.LengthBase;
-import org.apache.fop.fo.FObj;
import org.apache.fop.fo.flow.ExternalGraphic;
-import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
-import org.apache.fop.layoutmgr.LayoutContext;
-import org.apache.fop.layoutmgr.TraitSetter;
+
/**
* LayoutManager for the fo:external-graphic formatting object
*/
-public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
+public class ExternalGraphicLayoutManager extends AbstractGraphicsLayoutManager {
private ExternalGraphic fobj;
- private int breakAfter;
- private int breakBefore;
- private int align;
- private int startIndent;
- private int endIndent;
- private int spaceBefore;
- private int spaceAfter;
- private int viewWidth = -1;
- private int viewHeight = -1;
- private boolean clip = false;
- private Rectangle2D placement = null;
-
/**
* Constructor
*
@@ -68,6 +46,7 @@ public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
* This gets the sizes for the image and the dimensions and clipping.
* @todo see if can simplify property handling logic
*/
+ /*
private void setup() {
// assume lr-tb for now and just use the .optimum value of the range
Length ipd = fobj.getInlineProgressionDimension().getOptimum(this).getLength();
@@ -195,97 +174,35 @@ public class ExternalGraphicLayoutManager extends LeafNodeLayoutManager {
afterBPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.AFTER, false);
yoffset += beforeBPD;
+ viewBPD = viewHeight;
viewHeight += beforeBPD;
viewHeight += afterBPD;
//Determine extra IPD from borders etc.
int startIPD = borderProps.getPadding(CommonBorderPaddingBackground.START,
- false/*bNotFirst*/, this);
+ false, this);
startIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.START,
- false/*bNotFirst*/);
- int endIPD = borderProps.getPadding(CommonBorderPaddingBackground.END, false/*bNotLast*/, this);
- endIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.END, false/*bNotLast*/);
+ false);
+ int endIPD = borderProps.getPadding(CommonBorderPaddingBackground.END, false, this);
+ endIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.END, false);
xoffset += startIPD;
+ viewIPD = viewWidth;
viewWidth += startIPD;
viewWidth += endIPD;
placement = new Rectangle2D.Float(xoffset, yoffset, cwidth, cheight);
}
-
- /**
- * @see org.apache.fop.layoutmgr.LayoutManager#getNextKnuthElements(LayoutContext, int)
- */
- public LinkedList getNextKnuthElements(LayoutContext context,
- int alignment) {
- setup();
- InlineArea area = getExternalGraphicInlineArea();
- setCurrentArea(area);
- setAlignment(fobj.getVerticalAlign());
- setLead(viewHeight);
- return super.getNextKnuthElements(context, alignment);
- }
-
- /**
- * Get the inline area for this external grpahic.
- * This creates the image area and puts it inside a viewport.
- *
- * @return the viewport containing the image area
- */
- public InlineArea getExternalGraphicInlineArea() {
- Image imArea = new Image(fobj.getSrc());
- TraitSetter.setProducerID(imArea, fobj.getId());
- Viewport vp = new Viewport(imArea);
- TraitSetter.setProducerID(vp, fobj.getId());
- vp.setIPD(viewWidth);
- vp.setBPD(viewHeight);
- vp.setClip(clip);
- vp.setContentPosition(placement);
- vp.setOffset(0);
-
- // Common Border, Padding, and Background Properties
- TraitSetter.addBorders(vp, fobj.getCommonBorderPaddingBackground(), this);
- TraitSetter.addBackground(vp, fobj.getCommonBorderPaddingBackground(), this);
-
- return vp;
- }
-
- /** @see org.apache.fop.layoutmgr.inline.LeafNodeLayoutManager#addId() */
- protected void addId() {
- getPSLM().addIDToPage(fobj.getId());
- }
-
- // --------- Property Resolution related functions --------- //
+ */
/**
- * @see org.apache.fop.datatypes.PercentBaseContext#getBaseLength(int, FObj)
- */
- public int getBaseLength(int lengthBase, FObj fobj) {
- switch (lengthBase) {
- case LengthBase.IMAGE_INTRINSIC_WIDTH:
- return getIntrinsicWidth();
- case LengthBase.IMAGE_INTRINSIC_HEIGHT:
- return getIntrinsicHeight();
- default: // Delegate to super class
- return super.getBaseLength(lengthBase, fobj);
- }
- }
-
- /**
- * Returns the intrinsic width of the e-g.
- * @return the width of the element
- */
- protected int getIntrinsicWidth() {
- return fobj.getIntrinsicWidth();
- }
-
- /**
- * Returns the intrinsic height of the e-g.
- * @return the height of the element
+ * Get the inline area created by this element.
+ *
+ * @return the inline area
*/
- protected int getIntrinsicHeight() {
- return fobj.getIntrinsicHeight();
+ protected Area getChildArea() {
+ return new Image(fobj.getSrc());
}
-
+
}
diff --git a/src/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java b/src/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java
index 995bfc6c2..4a6865543 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/InstreamForeignObjectLM.java
@@ -18,33 +18,21 @@
package org.apache.fop.layoutmgr.inline;
-// Java
-import java.awt.geom.Rectangle2D;
-import java.util.LinkedList;
-
-// FOP
-import org.apache.fop.datatypes.Length;
-import org.apache.fop.datatypes.LengthBase;
+import org.apache.fop.area.Area;
+import org.apache.fop.area.inline.ForeignObject;
import org.apache.fop.fo.XMLObj;
import org.apache.fop.fo.flow.InstreamForeignObject;
-import org.apache.fop.fo.properties.CommonBorderPaddingBackground;
-import org.apache.fop.layoutmgr.TraitSetter;
-import org.apache.fop.area.inline.ForeignObject;
-import org.apache.fop.area.inline.Viewport;
-import org.apache.fop.fo.FObj;
-import org.apache.fop.layoutmgr.LayoutContext;
/**
* LayoutManager for the fo:instream-foreign-object formatting object
*/
-public class InstreamForeignObjectLM extends LeafNodeLayoutManager {
+public class InstreamForeignObjectLM extends AbstractGraphicsLayoutManager {
private InstreamForeignObject fobj;
/**
* Constructor
* @param node the formatting object that creates this area
- * @param parent the parent layout manager
*/
public InstreamForeignObjectLM(InstreamForeignObject node) {
super(node);
@@ -54,221 +42,16 @@ public class InstreamForeignObjectLM extends LeafNodeLayoutManager {
/**
* Get the inline area created by this element.
*
- * @return the viewport inline area
+ * @return the inline area
*/
- private Viewport getInlineArea() {
+ protected Area getChildArea() {
XMLObj child = (XMLObj) fobj.getChildXMLObj();
- // viewport size is determined by block-progression-dimension
- // and inline-progression-dimension
-
- // if replaced then use height then ignore block-progression-dimension
- //int h = this.propertyList.get("height").getLength().mvalue();
-
- // use specified line-height then ignore dimension in height direction
- boolean hasLH = false; //propertyList.get("line-height").getSpecifiedValue() != null;
-
- Length len;
-
- int bpd = -1;
- int ipd = -1;
- boolean bpdauto = false;
- if (hasLH) {
- bpd = fobj.getLineHeight().getValue(this);
- } else {
- // this property does not apply when the line-height applies
- // isn't the block-progression-dimension always in the same
- // direction as the line height?
- len = fobj.getBlockProgressionDimension().getOptimum(this).getLength();
- if (len.getEnum() != EN_AUTO) {
- bpd = len.getValue(this);
- } else {
- len = fobj.getHeight();
- if (len.getEnum() != EN_AUTO) {
- bpd = len.getValue(this);
- }
- }
- }
-
- len = fobj.getInlineProgressionDimension().getOptimum(this).getLength();
- if (len.getEnum() != EN_AUTO) {
- ipd = len.getValue(this);
- } else {
- len = fobj.getWidth();
- if (len.getEnum() != EN_AUTO) {
- ipd = len.getValue(this);
- }
- }
-
- // if auto then use the intrinsic size of the content scaled
- // to the content-height and content-width
- int cwidth = -1;
- int cheight = -1;
- len = fobj.getContentWidth();
- if (len.getEnum() != EN_AUTO) {
- if (len.getEnum() == EN_SCALE_TO_FIT) {
- if (ipd != -1) {
- cwidth = ipd;
- }
- } else {
- cwidth = len.getValue(this);
- }
- }
- len = fobj.getContentHeight();
- if (len.getEnum() != EN_AUTO) {
- if (len.getEnum() == EN_SCALE_TO_FIT) {
- if (bpd != -1) {
- cwidth = bpd;
- }
- } else {
- cheight = len.getValue(this);
- }
- }
-
- int scaling = fobj.getScaling();
- if ((scaling == EN_UNIFORM) || (cwidth == -1) || cheight == -1) {
- if (cwidth == -1 && cheight == -1) {
- cwidth = fobj.getIntrinsicWidth();
- cheight = fobj.getIntrinsicHeight();
- } else if (cwidth == -1) {
- cwidth = (int)(fobj.getIntrinsicWidth() * (double)cheight
- / fobj.getIntrinsicHeight());
- } else if (cheight == -1) {
- cheight = (int)(fobj.getIntrinsicHeight() * (double)cwidth
- / fobj.getIntrinsicWidth());
- } else {
- // adjust the larger
- double rat1 = cwidth / fobj.getIntrinsicWidth();
- double rat2 = cheight / fobj.getIntrinsicHeight();
- if (rat1 < rat2) {
- // reduce cheight
- cheight = (int)(rat1 * fobj.getIntrinsicHeight());
- } else if (rat1 > rat2) {
- cwidth = (int)(rat2 * fobj.getIntrinsicWidth());
- }
- }
- }
-
- if (ipd == -1) {
- ipd = cwidth;
- }
- if (bpd == -1) {
- bpd = cheight;
- }
-
- boolean clip = false;
- if (cwidth > ipd || cheight > bpd) {
- int overflow = fobj.getOverflow();
- if (overflow == EN_HIDDEN) {
- clip = true;
- } else if (overflow == EN_ERROR_IF_OVERFLOW) {
- fobj.getLogger().error("Instream foreign object overflows the viewport: clipping");
- clip = true;
- }
- }
-
- int xoffset = fobj.computeXOffset(ipd, cwidth);
- int yoffset = fobj.computeYOffset(bpd, cheight);
-
- CommonBorderPaddingBackground borderProps = fobj.getCommonBorderPaddingBackground();
-
- //Determine extra BPD from borders etc.
- int beforeBPD = borderProps.getPadding(CommonBorderPaddingBackground.BEFORE, false, this);
- beforeBPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.BEFORE,
- false);
- int afterBPD = borderProps.getPadding(CommonBorderPaddingBackground.AFTER, false, this);
- afterBPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.AFTER, false);
-
- yoffset += beforeBPD;
- bpd += beforeBPD;
- bpd += afterBPD;
-
- //Determine extra IPD from borders etc.
- int startIPD = borderProps.getPadding(CommonBorderPaddingBackground.START,
- false/*bNotFirst*/, this);
- startIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.START,
- false/*bNotFirst*/);
- int endIPD = borderProps.getPadding(CommonBorderPaddingBackground.END, false/*bNotLast*/, this);
- endIPD += borderProps.getBorderWidth(CommonBorderPaddingBackground.END, false/*bNotLast*/);
-
- xoffset += startIPD;
- ipd += startIPD;
- ipd += endIPD;
-
- Rectangle2D placement = new Rectangle2D.Float(xoffset, yoffset, cwidth, cheight);
-
org.w3c.dom.Document doc = child.getDOMDocument();
String ns = child.getDocumentNamespace();
- //fobj.childNodes = null; This is bad for i-f-o in static-content!!!!!
- ForeignObject foreign = new ForeignObject(doc, ns);
- TraitSetter.setProducerID(foreign, fobj.getId());
-
- Viewport vp = new Viewport(foreign);
- TraitSetter.setProducerID(vp, fobj.getId());
- vp.setIPD(ipd);
- vp.setBPD(bpd);
- vp.setContentPosition(placement);
- vp.setClip(clip);
- vp.setOffset(0);
-
- // Common Border, Padding, and Background Properties
- TraitSetter.addBorders(vp, fobj.getCommonBorderPaddingBackground(), this);
- TraitSetter.addBackground(vp, fobj.getCommonBorderPaddingBackground(), this);
-
- return vp;
- }
-
- /**
- * @see org.apache.fop.layoutmgr.LayoutManager#getNextKnuthElements(LayoutContext, int)
- */
- public LinkedList getNextKnuthElements(LayoutContext context,
- int alignment) {
- Viewport areaCurrent = getInlineArea();
- setCurrentArea(areaCurrent);
- setAlignment(fobj.getVerticalAlign());
- setLead(areaCurrent.getBPD());
- return super.getNextKnuthElements(context, alignment);
- }
-
- /**
- * @see org.apache.fop.layoutmgr.inline.LeafNodeLayoutManager#addId()
- */
- protected void addId() {
- getPSLM().addIDToPage(fobj.getId());
+ return new ForeignObject(doc, ns);
}
-
- // --------- Property Resolution related functions --------- //
- /**
- * @see org.apache.fop.datatypes.PercentBaseContext#getBaseLength(int, FObj)
- */
- public int getBaseLength(int lengthBase, FObj fobj) {
- switch (lengthBase) {
- case LengthBase.IMAGE_INTRINSIC_WIDTH:
- return getIntrinsicWidth();
- case LengthBase.IMAGE_INTRINSIC_HEIGHT:
- return getIntrinsicHeight();
- default: // Delegate to super class
- return super.getBaseLength(lengthBase, fobj);
- }
- }
-
- /**
- * Returns the intrinsic width of the e-g.
- * @return the width of the element
- */
- protected int getIntrinsicWidth() {
- return fobj.getIntrinsicWidth();
- }
-
- /**
- * Returns the intrinsic height of the e-g.
- * @return the height of the element
- */
- protected int getIntrinsicHeight() {
- return fobj.getIntrinsicHeight();
- }
-
}
diff --git a/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java b/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
index 398ba939f..a89ee7383 100644
--- a/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
+++ b/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
@@ -187,8 +187,11 @@ public abstract class AbstractPathOrientedRenderer extends PrintRenderer {
for (int y = 0; y < vertCount; y++) {
// place once
Rectangle2D pos;
- pos = new Rectangle2D.Float(sx + (x * fopimage.getIntrinsicWidth()),
- sy + (y * fopimage.getIntrinsicHeight()),
+ // Image positions are relative to the currentIP/BP
+ pos = new Rectangle2D.Float(sx - currentIPPosition
+ + (x * fopimage.getIntrinsicWidth()),
+ sy - currentBPPosition
+ + (y * fopimage.getIntrinsicHeight()),
fopimage.getIntrinsicWidth(),
fopimage.getIntrinsicHeight());
drawImage(back.getURL(), pos);
diff --git a/src/java/org/apache/fop/render/xml/XMLRenderer.java b/src/java/org/apache/fop/render/xml/XMLRenderer.java
index 9622ecc87..ba395c984 100644
--- a/src/java/org/apache/fop/render/xml/XMLRenderer.java
+++ b/src/java/org/apache/fop/render/xml/XMLRenderer.java
@@ -375,6 +375,7 @@ public class XMLRenderer extends PrintRenderer {
atts.clear();
addAreaAttributes(region);
addTraitAttributes(region);
+ addAttribute("ctm", region.getCTM().toString());
if (region.getRegionClass() == FO_REGION_BEFORE) {
startElement("regionBefore", atts);
renderRegion(region);
@@ -524,6 +525,7 @@ public class XMLRenderer extends PrintRenderer {
atts.clear();
addAreaAttributes(viewport);
addTraitAttributes(viewport);
+ addAttribute("offset", viewport.getOffset());
startElement("viewport", atts);
super.renderViewport(viewport);
endElement("viewport");
@@ -554,6 +556,8 @@ public class XMLRenderer extends PrintRenderer {
/**
* Renders an fo:foreing-object.
* @param fo the foreign object
+ * @param pos the position of the foreign object
+ * @see org.apache.fop.render.AbstractRenderer#renderForeignObject(ForeignObject, Rectangle2D)
*/
public void renderForeignObject(ForeignObject fo, Rectangle2D pos) {
atts.clear();
@@ -622,6 +626,9 @@ public class XMLRenderer extends PrintRenderer {
endElement("inlineparent");
}
+ /**
+ * @see org.apache.fop.render.AbstractRenderer#renderInlineBlockParent(InlineBlockParent)
+ */
protected void renderInlineBlockParent(InlineBlockParent ibp) {
atts.clear();
addAreaAttributes(ibp);