diff options
-rw-r--r-- | src/org/apache/fop/area/CTM.java | 59 | ||||
-rw-r--r-- | src/org/apache/fop/fo/PropertyManager.java | 5 | ||||
-rw-r--r-- | src/org/apache/fop/fo/pagination/RegionBody.java | 10 | ||||
-rw-r--r-- | src/org/apache/fop/fo/pagination/SimplePageMaster.java | 2 |
4 files changed, 63 insertions, 13 deletions
diff --git a/src/org/apache/fop/area/CTM.java b/src/org/apache/fop/area/CTM.java index 6ed7ea726..9a4ee968c 100644 --- a/src/org/apache/fop/area/CTM.java +++ b/src/org/apache/fop/area/CTM.java @@ -21,9 +21,9 @@ import org.apache.fop.fo.properties.WritingMode; public class CTM implements Serializable { private double a,b,c,d,e,f; - private static CTM s_CTM_lrtb = new CTM(1,0,0,-1,0,0); - private static CTM s_CTM_rltb = new CTM(-1,0,0,-1,0,0); - private static CTM s_CTM_tbrl = new CTM(0,-1,-1,0,0,0); + private static CTM s_CTM_lrtb = new CTM(1,0,0,1,0,0); + private static CTM s_CTM_rltb = new CTM(-1,0,0,1,0,0); + private static CTM s_CTM_tbrl = new CTM(0,1,-1,0,0,0); /** * Create the identity matrix */ @@ -61,6 +61,15 @@ public class CTM implements Serializable { this.f = y; } + protected CTM(CTM ctm) { + this.a = ctm.a; + this.b = ctm.b; + this.c = ctm.c; + this.d = ctm.d; + this.e = ctm.e; + this.f = ctm.f; + } + /** * Return a CTM which will transform coordinates for a particular writing-mode * into normalized first quandrant coordinates. @@ -72,13 +81,24 @@ public class CTM implements Serializable { * CTM is being set. */ static public CTM getWMctm(int wm, int ipd, int bpd) { + CTM wmctm; switch (wm) { case WritingMode.LR_TB: - return s_CTM_lrtb.translate(0,bpd); + return new CTM(s_CTM_lrtb); case WritingMode.RL_TB: - return s_CTM_rltb.translate(ipd, bpd); + { + wmctm = new CTM(s_CTM_rltb); + wmctm.e = ipd; + return wmctm; + } + //return s_CTM_rltb.translate(ipd, 0); case WritingMode.TB_RL: // CJK - return s_CTM_tbrl.translate(bpd, ipd); + { + wmctm = new CTM(s_CTM_tbrl); + wmctm.e = bpd; + return wmctm; + } + //return s_CTM_tbrl.translate(0, ipd); default: return null; } @@ -110,10 +130,25 @@ public class CTM implements Serializable { * @return CTM The result of rotating this CTM. */ public CTM rotate(double angle) { - double rad = Math.toRadians(angle); - double cos = Math.cos(rad); - double sin = Math.sin(rad); - CTM rotate= new CTM(cos, sin, -sin, cos, 0, 0); + double cos, sin; + if (angle == 90.0) { + cos = 0.0; + sin = 1.0; + } + else if (angle == 270.0) { + cos = 0.0; + sin = -1.0; + } + else if (angle == 180.0) { + cos = -1.0; + sin = 0.0; + } + else { + double rad = Math.toRadians(angle); + cos = Math.cos(rad); + sin = Math.sin(rad); + } + CTM rotate= new CTM(cos,-sin, sin, cos, 0, 0); return multiply(rotate); } @@ -167,4 +202,8 @@ public class CTM implements Serializable { } return new Rectangle(x1t, y1t, x2t-x1t, y2t-y1t); } + + public String toString() { + return "[" + a + " " + b + " " + c + " " + d + " " + e + " " + f + "]"; + } } diff --git a/src/org/apache/fop/fo/PropertyManager.java b/src/org/apache/fop/fo/PropertyManager.java index 6048d4937..9ea6b25fc 100644 --- a/src/org/apache/fop/fo/PropertyManager.java +++ b/src/org/apache/fop/fo/PropertyManager.java @@ -278,19 +278,20 @@ public class PropertyManager { * (Note: scrolling between region vp and ref area when doing online content!) */ CTM ctm = new CTM(absVPrect.getX(), absVPrect.getY()); + // First transform for rotation if (absRefOrient != 0) { // Rotation implies translation to keep the drawing area in the // first quadrant. Note: rotation is counter-clockwise switch (absRefOrient) { case 90: - ctm = ctm.translate(height, 0); // height = absVPrect.width + ctm = ctm.translate(0, width); // width = absVPrect.height break; case 180: ctm = ctm.translate(width, height); break; case 270: - ctm = ctm.translate(0, width); // width = absVPrect.height + ctm = ctm.translate(height,0); // height = absVPrect.width break; } ctm = ctm.rotate(absRefOrient); diff --git a/src/org/apache/fop/fo/pagination/RegionBody.java b/src/org/apache/fop/fo/pagination/RegionBody.java index 181f6378a..5a6429ed2 100644 --- a/src/org/apache/fop/fo/pagination/RegionBody.java +++ b/src/org/apache/fop/fo/pagination/RegionBody.java @@ -36,9 +36,18 @@ public class RegionBody extends Region { // Need these in writing-mode relative coordinates // Or shall we get absolute and transform to relative using writing mode? MarginProps mProps = propMgr.getMarginProps(); + /** + System.err.println("BodyRegion margin props=" + mProps.startIndent + "," + + mProps.spaceBefore + "," + mProps.endIndent + "," + + mProps.spaceAfter); + return new Rectangle( mProps.startIndent, mProps.spaceBefore, reldims.ipd - mProps.startIndent - mProps.endIndent, reldims.bpd - mProps.spaceBefore - mProps.spaceAfter); + **/ + return new Rectangle( mProps.marginLeft, mProps.marginTop, + reldims.ipd - mProps.marginLeft - mProps.marginRight, + reldims.bpd - mProps.marginTop - mProps.marginBottom); } protected void setRegionTraits(RegionReference r, Rectangle2D absRegVPRect) { @@ -66,6 +75,7 @@ public class RegionBody extends Region { public RegionReference makeRegionReferenceArea(Rectangle2D absRegVPRect) { // Should set some column stuff here I think, or put it elsewhere BodyRegion body = new BodyRegion(); + setRegionTraits(body, absRegVPRect); int columnCount= this.properties.get("column-count").getNumber().intValue(); if ((columnCount > 1) && (overflow == Overflow.SCROLL)) { diff --git a/src/org/apache/fop/fo/pagination/SimplePageMaster.java b/src/org/apache/fop/fo/pagination/SimplePageMaster.java index 42b4c4f0e..9cd1dea09 100644 --- a/src/org/apache/fop/fo/pagination/SimplePageMaster.java +++ b/src/org/apache/fop/fo/pagination/SimplePageMaster.java @@ -85,7 +85,7 @@ public class SimplePageMaster extends FObj { * The media rectangle itself is (0,0,pageWidth,pageHeight). */ Rectangle pageRefRect = - new Rectangle(mProps.marginLeft, mProps.marginBottom, + new Rectangle(mProps.marginLeft, mProps.marginTop, pageWidth - mProps.marginLeft - mProps.marginRight, pageHeight - mProps.marginTop - mProps.marginBottom); |