jeremias 2005/01/17 02:38:02
Modified: src/java/org/apache/fop/layoutmgr
BlockContainerLayoutManager.java
src/java/org/apache/fop/fo/properties
CorrespondingPropertyMaker.java
IndentPropertyMaker.java
src/java/org/apache/fop/render AbstractRenderer.java
src/java/org/apache/fop/render/pdf PDFRenderer.java
Log:
block-containers improved/fixed. The following features are implemented and
testcases exist:
left, right, top, bottom, width, height, block-progression-dimension
(partial), inline-progression-dimension (partial), borders, padding, indents,
reference-orientation.
autoheight works only for in-flow BCs ATM.
start-indent calculation fixed: uses inherited value if rules in 5.3.2 don't
apply.
Revision Changes Path
1.29 +186 -103
xml-fop/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java
Index: BlockContainerLayoutManager.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/layoutmgr/BlockContainerLayoutManager.java,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- BlockContainerLayoutManager.java 12 Jan 2005 12:03:00 -0000 1.28
+++ BlockContainerLayoutManager.java 17 Jan 2005 10:38:02 -0000 1.29
@@ -19,16 +19,16 @@
package org.apache.fop.layoutmgr;
import java.util.List;
+import java.awt.Point;
import java.awt.geom.Rectangle2D;
import org.apache.fop.area.Area;
import org.apache.fop.area.BlockViewport;
import org.apache.fop.area.Block;
import org.apache.fop.area.PageViewport;
-import org.apache.fop.fo.Constants;
+import org.apache.fop.area.Trait;
import org.apache.fop.fo.flow.BlockContainer;
import org.apache.fop.fo.properties.CommonAbsolutePosition;
-import org.apache.fop.fo.properties.FixedLength;
import org.apache.fop.area.CTM;
import org.apache.fop.datatypes.FODimension;
import org.apache.fop.datatypes.Length;
@@ -52,6 +52,8 @@
private boolean clip = false;
private Length width;
private Length height;
+ private int vpContentIPD;
+ private int vpContentBPD;
// When viewport should grow with the content.
private boolean autoHeight = true;
@@ -67,6 +69,9 @@
fobj = node;
}
+ /**
+ * @return the currently applicable page viewport
+ */
protected PageViewport getPageViewport() {
LayoutManager lm = this;
while (lm != null && !(lm instanceof PageSequenceLayoutManager)) {
@@ -83,74 +88,14 @@
* @see org.apache.fop.layoutmgr.AbstractLayoutManager#initProperties()
*/
protected void initProperties() {
- log.debug(fobj.getBlockProgressionDimension().getOptimum());
- log.debug(fobj.getInlineProgressionDimension().getOptimum());
abProps = fobj.getCommonAbsolutePosition();
- log.debug(abProps);
-
- int iIndents = fobj.getCommonMarginBlock().startIndent.getValue();
- iIndents += fobj.getCommonMarginBlock().endIndent.getValue();
- int bIndents =
fobj.getCommonBorderPaddingBackground().getBPPaddingAndBorder(false);
-
-
- if (abProps.absolutePosition == EN_ABSOLUTE && false) {
- Rectangle2D rect = new
Rectangle2D.Double(abProps.left.getValue(),
- abProps.top.getValue(),
- abProps.right.getValue() -
abProps.left.getValue(),
- abProps.bottom.getValue() -
abProps.top.getValue());
- relDims = new FODimension(0, 0);
- absoluteCTM =
CTM.getCTMandRelDims(fobj.getReferenceOrientation(),
- fobj.getWritingMode(), rect, relDims);
- } else if (abProps.absolutePosition == EN_FIXED
- || abProps.absolutePosition == EN_ABSOLUTE) {
- Rectangle2D viewArea = getPageViewport().getViewArea();
- double x = viewArea.getX() + abProps.left.getValue();
- double y = viewArea.getY() + abProps.top.getValue();
- double w = 0.0;
- if (abProps.right.getEnum() == Constants.EN_AUTO) {
- if (fobj.getWidth().getEnum() == Constants.EN_AUTO) {
- w = viewArea.getWidth() - x;
- } else {
- if (fobj.getReferenceOrientation() % 180 == 0) {
- w =
fobj.getInlineProgressionDimension().getOptimum().getLength().getValue();
- } else {
- w =
fobj.getBlockProgressionDimension().getOptimum().getLength().getValue();
- }
- }
- } else {
- w = viewArea.getWidth() - x - abProps.right.getValue();
- }
- double h = 0.0;
- if (abProps.bottom.getEnum() == Constants.EN_AUTO) {
- if (fobj.getHeight().getEnum() == Constants.EN_AUTO) {
- h = viewArea.getHeight() - y;
- } else {
- if (fobj.getReferenceOrientation() % 180 == 0) {
- h =
fobj.getBlockProgressionDimension().getOptimum().getLength().getValue();
- } else {
- h =
fobj.getInlineProgressionDimension().getOptimum().getLength().getValue();
- }
- }
- } else {
- h = viewArea.getHeight() - y - abProps.bottom.getValue();
- }
- log.debug("x=" + x + " y=" + y + " w=" + w + " h=" + h + "
orient=" + fobj.getReferenceOrientation());
- if (w != 0) {
- this.width = new FixedLength((int)w);
- }
- if (h != 0) {
- this.height = new FixedLength((int)h);
- }
- Rectangle2D rect = new Rectangle2D.Double(x, y, w, h);
- relDims = new FODimension(0, 0);
- absoluteCTM =
CTM.getCTMandRelDims(fobj.getReferenceOrientation(),
- fobj.getWritingMode(), rect, relDims);
- }
- if (height == null) {
+ boolean rotated = (fobj.getReferenceOrientation() % 180 != 0);
+ if (rotated) {
+ height =
fobj.getInlineProgressionDimension().getOptimum().getLength();
+ width =
fobj.getBlockProgressionDimension().getOptimum().getLength();
+ } else {
height =
fobj.getBlockProgressionDimension().getOptimum().getLength();
- }
- if (width == null) {
width =
fobj.getInlineProgressionDimension().getOptimum().getLength();
}
}
@@ -159,6 +104,19 @@
return
fobj.getInlineProgressionDimension().getOptimum().getLength().getValue();
}
+ private int getSpaceBefore() {
+ return fobj.getCommonMarginBlock().spaceBefore
+ .getOptimum().getLength().getValue();
+ }
+
+ private int getBPIndents() {
+ int indents = 0;
+ indents +=
fobj.getCommonMarginBlock().spaceBefore.getOptimum().getLength().getValue();
+ indents +=
fobj.getCommonMarginBlock().spaceAfter.getOptimum().getLength().getValue();
+ indents +=
fobj.getCommonBorderPaddingBackground().getBPPaddingAndBorder(false);
+ return indents;
+ }
+
private int getIPIndents() {
int iIndents = 0;
iIndents += fobj.getCommonMarginBlock().startIndent.getValue();
@@ -166,48 +124,83 @@
return iIndents;
}
+ private boolean isAbsoluteOrFixed() {
+ return (abProps.absolutePosition == EN_ABSOLUTE)
+ || (abProps.absolutePosition == EN_FIXED);
+ }
+
+ private boolean isFixed() {
+ return (abProps.absolutePosition == EN_FIXED);
+ }
+
+ /**
+ * @see
org.apache.fop.layoutmgr.LayoutManager#getNextBreakPoss(org.apache.fop.layoutmgr.LayoutContext)
+ */
public BreakPoss getNextBreakPoss(LayoutContext context) {
- if (abProps.absolutePosition == EN_ABSOLUTE) {
- return getAbsoluteBreakPoss(context);
- } else if (abProps.absolutePosition == EN_FIXED) {
+ if (isAbsoluteOrFixed()) {
return getAbsoluteBreakPoss(context);
}
+ boolean rotated = (fobj.getReferenceOrientation() % 180 != 0);
//vals[0] == 0.0;
referenceIPD = context.getRefIPD();
- int bpd = context.getStackLimit().opt;
- if (width.getEnum() != EN_AUTO) {
- referenceIPD = width.getValue();
- }
+ int maxbpd = context.getStackLimit().opt;
+ int allocBPD, allocIPD;
if (height.getEnum() != EN_AUTO) {
- bpd = height.getValue();
+ allocBPD = height.getValue(); //this is the content-height
+ allocBPD += getBPIndents();
+ } else {
+ allocBPD = maxbpd;
+ }
+ if (width.getEnum() != EN_AUTO) {
+ allocIPD = width.getValue(); //this is the content-width
+ allocIPD += getIPIndents();
+ } else {
+ allocIPD = referenceIPD;
}
- int contentIPD = referenceIPD - getIPIndents();
+
+ vpContentBPD = allocBPD - getBPIndents();
+ vpContentIPD = allocIPD - getIPIndents();
+
+ double contentRectOffsetX = 0;
+ contentRectOffsetX +=
fobj.getCommonMarginBlock().startIndent.getValue();
+ double contentRectOffsetY = 0;
+ //contentRectOffsetY +=
fobj.getCommonMarginBlock().startIndent.getValue();
+ contentRectOffsetY += getSpaceBefore();
+ contentRectOffsetY +=
fobj.getCommonBorderPaddingBackground().getBorderBeforeWidth(false);
+ contentRectOffsetY +=
fobj.getCommonBorderPaddingBackground().getPaddingBefore(false);
- Rectangle2D rect = new Rectangle2D.Double(0, 0, contentIPD, bpd);
+ Rectangle2D rect = new Rectangle2D.Double(
+ contentRectOffsetX, contentRectOffsetY,
+ vpContentIPD, vpContentBPD);
relDims = new FODimension(0, 0);
absoluteCTM = CTM.getCTMandRelDims(fobj.getReferenceOrientation(),
fobj.getWritingMode(), rect, relDims);
double[] vals = absoluteCTM.toArray();
MinOptMax stackLimit;
- boolean rotated = vals[0] == 0.0;
if (rotated) {
// rotated 90 degrees
+ /*
if (relDims.ipd > context.getRefIPD()) {
relDims.ipd = context.getRefIPD();
- }
- stackLimit = new MinOptMax(relDims.ipd);
+ }*/
+ //stackLimit = new MinOptMax(relDims.ipd);
+ /*
if (width.getEnum() == EN_AUTO) {
relDims.bpd = context.getStackLimit().opt;
}
absoluteCTM = new CTM(vals[0], vals[1], vals[2], vals[3], 0, 0);
+ */
+ //absoluteCTM = new CTM(vals[0], vals[1], vals[2], vals[3],
vals[5], vals[4]);
} else {
+ /*
if (vals[0] == -1.0) {
absoluteCTM = new CTM(vals[0], vals[1], vals[2], vals[3], 0,
0);
- }
- stackLimit = context.getStackLimit();
+ }*/
+ //stackLimit = context.getStackLimit();
}
+ stackLimit = new MinOptMax(relDims.bpd);
LayoutManager curLM; // currently active LM
@@ -216,10 +209,11 @@
// stackSize.add(spaceBefore);
BreakPoss lastPos = null;
- fobj.setLayoutDimension(PercentBase.BLOCK_IPD, contentIPD);
- fobj.setLayoutDimension(PercentBase.BLOCK_BPD, bpd);
- fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_IPD, contentIPD);
- fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_BPD, bpd);
+ //TODO fix layout dimensions!
+ fobj.setLayoutDimension(PercentBase.BLOCK_IPD, allocIPD);
+ fobj.setLayoutDimension(PercentBase.BLOCK_BPD, allocBPD);
+ fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_IPD, relDims.ipd);
+ fobj.setLayoutDimension(PercentBase.REFERENCE_AREA_BPD, relDims.bpd);
while ((curLM = getChildLM()) != null) {
// Make break positions and return blocks!
@@ -230,7 +224,7 @@
childLC.setStackLimit(
MinOptMax.subtract(stackLimit,
stackSize));
- childLC.setRefIPD(contentIPD);
+ childLC.setRefIPD(relDims.ipd);
boolean over = false;
while (!curLM.isFinished()) {
@@ -274,20 +268,94 @@
BreakPoss breakPoss;
breakPoss = new BreakPoss(new LeafPosition(this,
childBreaks.size() - 1));
- breakPoss.setStackingSize(new MinOptMax(contentIPD));
+ breakPoss.setStackingSize(new MinOptMax(relDims.ipd));
return breakPoss;
}
return null;
}
+ private Point getAbsOffset() {
+ int x = 0;
+ int y = 0;
+ if (abProps.left.getEnum() != EN_AUTO) {
+ x = abProps.left.getValue();
+ }
+ if (abProps.top.getEnum() != EN_AUTO) {
+ y = abProps.top.getValue();
+ }
+ return new Point(x, y);
+ }
+
+ /**
+ * Generate and return the next break possibility for absolutely
positioned
+ * block-containers.
+ * @param context LayoutContext to work with
+ * @return the next break position
+ * @see
org.apache.fop.layoutmgr.LayoutManager#getNextBreakPoss(org.apache.fop.layoutmgr.LayoutContext)
+ */
public BreakPoss getAbsoluteBreakPoss(LayoutContext context) {
LayoutManager curLM ; // currently active LM
MinOptMax stackSize = new MinOptMax();
- int ipd = relDims.ipd;
+ Point offset = getAbsOffset();
+ int allocBPD, allocIPD;
+ if (height.getEnum() != EN_AUTO) {
+ allocBPD = height.getValue(); //this is the content-height
+ allocBPD += getBPIndents();
+ } else {
+ allocBPD = 0;
+ if (abProps.bottom.getEnum() != EN_AUTO) {
+ if (isFixed()) {
+ allocBPD =
(int)getPageViewport().getViewArea().getHeight();
+ } else {
+ allocBPD = context.getStackLimit().opt;
+ }
+ allocBPD -= offset.y;
+ if (abProps.bottom.getEnum() != EN_AUTO) {
+ allocBPD -= abProps.bottom.getValue();
+ }
+ }
+ }
+ if (width.getEnum() != EN_AUTO) {
+ allocIPD = width.getValue(); //this is the content-width
+ allocIPD += getIPIndents();
+ } else {
+ if (isFixed()) {
+ allocIPD = (int)getPageViewport().getViewArea().getWidth();
+ } else {
+ allocIPD = context.getRefIPD();
+ }
+ if (abProps.left.getEnum() != EN_AUTO) {
+ allocIPD -= abProps.left.getValue();
+ }
+ if (abProps.right.getEnum() != EN_AUTO) {
+ allocIPD -= abProps.right.getValue();
+ }
+ }
+
+ vpContentBPD = allocBPD - getBPIndents();
+ vpContentIPD = allocIPD - getIPIndents();
+
+ double contentRectOffsetX = offset.getX();
+ contentRectOffsetX +=
fobj.getCommonMarginBlock().startIndent.getValue();
+ double contentRectOffsetY = offset.getY();
+ contentRectOffsetY += getSpaceBefore();
+ contentRectOffsetY +=
fobj.getCommonBorderPaddingBackground().getBorderBeforeWidth(false);
+ contentRectOffsetY +=
fobj.getCommonBorderPaddingBackground().getPaddingBefore(false);
+
+ Rectangle2D rect = new Rectangle2D.Double(
+ contentRectOffsetX, contentRectOffsetY,
+ vpContentIPD, vpContentBPD);
+ relDims = new FODimension(0, 0);
+ absoluteCTM = CTM.getCTMandRelDims(
+ fobj.getReferenceOrientation(),
+ fobj.getWritingMode(),
+ rect, relDims);
+ //referenceIPD = relDims.ipd + getIPIndents();
+
while ((curLM = getChildLM()) != null) {
// Make break positions and return blocks!
// Set up a LayoutContext
@@ -295,7 +363,7 @@
LayoutContext childLC = new LayoutContext(0);
childLC.setStackLimit(new MinOptMax(1000000));
- childLC.setRefIPD(ipd);
+ childLC.setRefIPD(relDims.ipd);
while (!curLM.isFinished()) {
if ((bp = curLM.getNextBreakPoss(childLC)) != null) {
@@ -364,26 +432,41 @@
public Area getParentArea(Area childArea) {
if (curBlockArea == null) {
viewportBlockArea = new BlockViewport();
+ viewportBlockArea.addTrait(Trait.IS_VIEWPORT_AREA, Boolean.TRUE);
TraitSetter.addBorders(viewportBlockArea,
fobj.getCommonBorderPaddingBackground());
TraitSetter.addBackground(viewportBlockArea,
fobj.getCommonBorderPaddingBackground());
+ TraitSetter.addMargins(viewportBlockArea, null,
+ fobj.getCommonBorderPaddingBackground(),
+ fobj.getCommonMarginBlock());
+ viewportBlockArea.setCTM(absoluteCTM);
+ viewportBlockArea.setIPD(vpContentIPD);
+ viewportBlockArea.setBPD(vpContentBPD);
+ viewportBlockArea.setClip(clip);
+ viewportBlockArea.addTrait(Trait.SPACE_BEFORE, new
Integer(getSpaceBefore()));
+
if (abProps.absolutePosition == EN_ABSOLUTE
|| abProps.absolutePosition == EN_FIXED) {
- viewportBlockArea.setXOffset(abProps.left.getValue());
- viewportBlockArea.setYOffset(abProps.top.getValue());
- viewportBlockArea.setIPD(width.getValue());
- viewportBlockArea.setBPD(height.getValue());
-
- viewportBlockArea.setCTM(absoluteCTM);
- viewportBlockArea.setClip(clip);
+ Point offset = getAbsOffset();
+ viewportBlockArea.setXOffset(offset.x);
+ viewportBlockArea.setYOffset(offset.y);
autoHeight = false;
} else {
- double[] vals = absoluteCTM.toArray();
+ //double[] vals = absoluteCTM.toArray();
+ boolean rotated = (fobj.getReferenceOrientation() % 180 !=
0); //vals[0] == 0.0;
+ if (rotated) {
+ autoHeight = false;
+ } else {
+ autoHeight = (height.getEnum() == EN_AUTO);
+ if (autoHeight) {
+ viewportBlockArea.setBPD(0);
+ }
+ }
+ /*
boolean rotated = vals[0] == 0.0;
if (rotated) {
- viewportBlockArea.setIPD(relDims.ipd);
- viewportBlockArea.setBPD(relDims.bpd);
- viewportBlockArea.setCTM(absoluteCTM);
+ viewportBlockArea.setIPD(vpContentIPD);
+ viewportBlockArea.setBPD(vpContentBPD);
viewportBlockArea.setClip(clip);
autoHeight = false;
} else if (vals[0] == -1.0) {
@@ -394,7 +477,6 @@
viewportBlockArea.setBPD(relDims.bpd);
autoHeight = false;
}
- viewportBlockArea.setCTM(absoluteCTM);
viewportBlockArea.setClip(clip);
} else {
viewportBlockArea.setIPD(relDims.ipd);
@@ -402,10 +484,11 @@
viewportBlockArea.setBPD(relDims.bpd);
autoHeight = false;
}
- }
+ }*/
}
curBlockArea = new Block();
+ curBlockArea.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE);
if (abProps.absolutePosition == EN_ABSOLUTE) {
viewportBlockArea.setPositioning(Block.ABSOLUTE);
1.8 +8 -7
xml-fop/src/java/org/apache/fop/fo/properties/CorrespondingPropertyMaker.java
Index: CorrespondingPropertyMaker.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/fo/properties/CorrespondingPropertyMaker.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- CorrespondingPropertyMaker.java 28 Oct 2004 10:00:24 -0000 1.7
+++ CorrespondingPropertyMaker.java 17 Jan 2005 10:38:02 -0000 1.8
@@ -76,13 +76,14 @@
}
PropertyList pList = getWMPropertyList(propertyList);
- int correspondingId = pList.getWritingMode(lr_tb, rl_tb, tb_rl);
+ if (pList != null) {
+ int correspondingId = pList.getWritingMode(lr_tb, rl_tb, tb_rl);
- if (pList.getExplicit(correspondingId) != null) {
- return true;
- } else {
- return false;
- }
+ if (pList.getExplicit(correspondingId) != null) {
+ return true;
+ }
+ }
+ return false;
}
/**
1.11 +21 -5
xml-fop/src/java/org/apache/fop/fo/properties/IndentPropertyMaker.java
Index: IndentPropertyMaker.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/fo/properties/IndentPropertyMaker.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- IndentPropertyMaker.java 12 Jan 2005 11:38:00 -0000 1.10
+++ IndentPropertyMaker.java 17 Jan 2005 10:38:02 -0000 1.11
@@ -69,6 +69,9 @@
*/
public Property compute(PropertyList propertyList) throws
PropertyException {
PropertyList pList = getWMPropertyList(propertyList);
+ if (pList == null) {
+ return null;
+ }
// Calculate the values as described in 5.3.2.
Numeric padding = getCorresponding(paddingCorresponding,
propertyList).getNumeric();
@@ -80,7 +83,14 @@
if (propertyList.getExplicitOrShorthand(marginProp) == null) {
Property indent = propertyList.getExplicit(baseMaker.propId);
if (indent == null) {
- margin = new FixedLength(0);
+ //Neither start-indent nor margin is specified, use inherited
+ //margin = new FixedLength(0);
+ /*
+ Numeric v = new FixedLength(0);
+ v = NumericOp.addition(v,
propertyList.getInherited(baseMaker.propId).getNumeric());
+ return (Property)v;
+ */
+ return null;
} else {
margin =
propertyList.getExplicit(baseMaker.propId).getNumeric();
margin = NumericOp.subtraction(margin,
@@ -95,7 +105,9 @@
Numeric v = new FixedLength(0);
if (!propertyList.getFObj().generatesReferenceAreas()) {
// The inherited_value_of([start|end]-indent)
- v = NumericOp.addition(v,
propertyList.getInherited(baseMaker.propId).getNumeric());
+ //if (!propertyList.getParentFObj().generatesReferenceAreas()) {
+ v = NumericOp.addition(v,
propertyList.getInherited(baseMaker.propId).getNumeric());
+ //}
}
// The corresponding absolute margin-[right|left}.
v = NumericOp.addition(v, margin);
@@ -107,7 +119,11 @@
private Property getCorresponding(int[] corresponding, PropertyList
propertyList)
throws PropertyException {
PropertyList pList = getWMPropertyList(propertyList);
- int wmcorr = pList.getWritingMode(corresponding[0],
corresponding[1], corresponding[2]);
- return propertyList.get(wmcorr);
+ if (pList != null) {
+ int wmcorr = pList.getWritingMode(corresponding[0],
corresponding[1], corresponding[2]);
+ return propertyList.get(wmcorr);
+ } else {
+ return null;
+ }
}
}
1.41 +1 -1
xml-fop/src/java/org/apache/fop/render/AbstractRenderer.java
Index: AbstractRenderer.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/render/AbstractRenderer.java,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- AbstractRenderer.java 12 Jan 2005 12:03:00 -0000 1.40
+++ AbstractRenderer.java 17 Jan 2005 10:38:02 -0000 1.41
@@ -466,7 +466,7 @@
int saveBP = currentBPPosition;
// Calculate the position of the content rectangle.
- if (parent != null) {
+ if (parent != null &&
!Boolean.TRUE.equals(parent.getTrait(Trait.IS_VIEWPORT_AREA))) {
currentBPPosition += parent.getBorderAndPaddingWidthBefore();
/* This is unnecessary now as we're going to use the *-indent
traits
currentIPPosition += parent.getBorderAndPaddingWidthStart();
1.68 +37 -15
xml-fop/src/java/org/apache/fop/render/pdf/PDFRenderer.java
Index: PDFRenderer.java
===================================================================
RCS file:
/home/cvs/xml-fop/src/java/org/apache/fop/render/pdf/PDFRenderer.java,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -r1.67 -r1.68
--- PDFRenderer.java 13 Jan 2005 00:06:25 -0000 1.67
+++ PDFRenderer.java 17 Jan 2005 10:38:02 -0000 1.68
@@ -675,6 +675,11 @@
String saveFontName = currentFontName;
CTM ctm = bv.getCTM();
+ int borderPaddingStart = bv.getBorderAndPaddingWidthStart();
+ int borderPaddingBefore = bv.getBorderAndPaddingWidthBefore();
+ float x,y;
+ x = (float)(bv.getXOffset() + containingIPPosition) / 1000f;
+ y = (float)(bv.getYOffset() + containingBPPosition) / 1000f;
if (bv.getPositioning() == Block.ABSOLUTE
|| bv.getPositioning() == Block.FIXED) {
@@ -684,28 +689,30 @@
ctm = tempctm.multiply(ctm);
getLogger().debug("tempctm=" + tempctm + " ctm=" + ctm);
- float x,y;
- x = (float)(bv.getXOffset() + containingIPPosition) / 1000f;
- y = (float)(bv.getYOffset() + containingBPPosition) / 1000f;
+ //This is the content-rect
float width = (float)bv.getIPD() / 1000f;
float height = (float)bv.getBPD() / 1000f;
getLogger().debug("renderBlockViewport: x=" + x + " y=" + y + "
width=" + width + " height=" + height);
- int borderPaddingStart = bv.getBorderAndPaddingWidthStart();
- int borderPaddingBefore = bv.getBorderAndPaddingWidthBefore();
-
+ //Adjust for spaces (from margin or indirectly by start-indent
etc.
Integer spaceStart = (Integer) bv.getTrait(Trait.SPACE_START);
if (spaceStart != null) {
x += spaceStart.floatValue() / 1000;
}
+ Integer spaceBefore = (Integer) bv.getTrait(Trait.SPACE_BEFORE);
+ if (spaceBefore != null) {
+ y += spaceBefore.floatValue() / 1000;
+ }
- width += borderPaddingStart / 1000f;
- width += bv.getBorderAndPaddingWidthEnd() / 1000f;
- height += borderPaddingBefore / 1000f;
- height += bv.getBorderAndPaddingWidthAfter() / 1000f;
+ float bpwidth = (borderPaddingStart +
bv.getBorderAndPaddingWidthEnd()) / 1000f;
+ float bpheight = (borderPaddingBefore +
bv.getBorderAndPaddingWidthAfter()) / 1000f;
- drawBackAndBorders(bv, x, y, width, height);
+ drawBackAndBorders(bv, x, y, width + bpwidth, height + bpheight);
+ //Now adjust for border/padding
+ x += borderPaddingStart / 1000f;
+ y += borderPaddingBefore / 1000f;
+
if (bv.getClip()) {
saveGraphicsState();
clip(x, y, width, height);
@@ -729,6 +736,17 @@
currentBPPosition = saveBP;
} else {
+ Integer spaceBefore = (Integer)bv.getTrait(Trait.SPACE_BEFORE);
+ if (spaceBefore != null) {
+ currentBPPosition += spaceBefore.intValue();
+ }
+
+ //borders and background in the old coordinate system
+ handleBlockTraits(bv);
+
+ CTM tempctm = new CTM(containingIPPosition, currentBPPosition +
containingBPPosition);
+ ctm = tempctm.multiply(ctm);
+ /*
if (ctm != null) {
double[] vals = ctm.toArray();
//boolean aclock = vals[2] == 1.0;
@@ -737,21 +755,25 @@
} else if (vals[0] == -1.0) {
ctm = ctm.translate(-saveIP - bv.getIPD(), -saveBP -
bv.getBPD());
} else {
- ctm = ctm.translate(saveBP, saveIP - bv.getIPD());
+ //ctm = ctm.translate(saveBP, saveIP - bv.getIPD());
+ //ctm = ctm.translate(saveIP, saveBP);
}
}
+ ctm = new CTM().translate(saveIP, saveBP).multiply(ctm);
+ */
+
+ //Now adjust for border/padding
+ x += borderPaddingStart / 1000f;
+ y += borderPaddingBefore / 1000f;
// clip if necessary
if (bv.getClip()) {
saveGraphicsState();
- float x = (float)bv.getXOffset() / 1000f;
- float y = (float)bv.getYOffset() / 1000f;
float width = (float)bv.getIPD() / 1000f;
float height = (float)bv.getBPD() / 1000f;
clip(x, y, width, height);
}
- handleBlockTraits(bv);
if (ctm != null) {
startVParea(ctm);
currentIPPosition = 0;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]