From: Yegor Kozlov Date: Sun, 4 Dec 2011 11:16:57 +0000 (+0000) Subject: improved rendering of groupped shapes in xslf X-Git-Tag: REL_3_8_BETA5~13 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=99bd60879af990d6962f36fff29902078be8a11a;p=poi.git improved rendering of groupped shapes in xslf git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1210089 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java index 67af3a179c..b46ae8b2bc 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java @@ -102,7 +102,6 @@ class RenderableShape { */ public Paint selectPaint(Graphics2D graphics, XmlObject obj, CTSchemeColor phClr, PackagePart parentPart) { XSLFTheme theme = _shape.getSheet().getTheme(); - Rectangle2D anchor = _shape.getAnchor(); Paint paint = null; if (obj instanceof CTNoFillProperties) { @@ -119,6 +118,7 @@ class RenderableShape { paint = createTexturePaint(blipFill, graphics, parentPart); } else if (obj instanceof CTGradientFillProperties) { + Rectangle2D anchor = getAnchor(graphics); CTGradientFillProperties gradFill = (CTGradientFillProperties) obj; if (gradFill.isSetLin()) { paint = createLinearGradientPaint(graphics, gradFill, anchor, theme, phClr); @@ -477,8 +477,6 @@ class RenderableShape { float lineWidth = (float) _shape.getLineWidth(); if(lineWidth == 0.0f) lineWidth = 0.25f; // Both PowerPoint and OOo draw zero-length lines as 0.25pt - Number fontScale = (Number)graphics.getRenderingHint(XSLFRenderingHint.GROUP_SCALE); - if(fontScale != null) lineWidth *= fontScale.floatValue(); LineDash lineDash = _shape.getLineDash(); float[] dash = null; @@ -512,7 +510,7 @@ class RenderableShape { } public void render(Graphics2D graphics){ - Collection elems = computeOutlines(); + Collection elems = computeOutlines(graphics); // shadow XSLFShadow shadow = _shape.getShadow(); @@ -549,7 +547,7 @@ class RenderableShape { } } - private Collection computeOutlines() { + private Collection computeOutlines(Graphics2D graphics) { Collection lst = new ArrayList(); CustomGeometry geom = _shape.getGeometry(); @@ -557,7 +555,7 @@ class RenderableShape { return lst; } - Rectangle2D anchor = _shape.getAnchor(); + Rectangle2D anchor = getAnchor(graphics); for (Path p : geom) { double w = p.getW() == -1 ? anchor.getWidth() * Units.EMU_PER_POINT : p.getW(); @@ -615,4 +613,16 @@ class RenderableShape { return lst; } + public Rectangle2D getAnchor(Graphics2D graphics) { + Rectangle2D anchor = _shape.getAnchor(); + if(graphics == null) { + return anchor; + } + + AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM); + if(tx != null) { + anchor = tx.createTransformedShape(anchor).getBounds2D(); + } + return anchor; + } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java index 7993f11dda..66cb5abb53 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java @@ -282,16 +282,15 @@ public class XSLFGroupShape extends XSLFShape { // anchor of this group relative to the parent shape Rectangle2D exterior = getAnchor(); - graphics.translate(exterior.getX(), exterior.getY()); - double scaleX = exterior.getWidth() / interior.getWidth(); - double scaleY = exterior.getHeight() / interior.getHeight(); + AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM); + AffineTransform tx0 = new AffineTransform(tx); - // group transform scales shapes but not fonts - Number prevFontScale = (Number)graphics.getRenderingHint(XSLFRenderingHint.GROUP_SCALE); - graphics.setRenderingHint(XSLFRenderingHint.GROUP_SCALE, Math.abs(1/scaleY)); + double scaleX = interior.getWidth() == 0. ? 1.0 : exterior.getWidth() / interior.getWidth(); + double scaleY = interior.getHeight() == 0. ? 1.0 : exterior.getHeight() / interior.getHeight(); - graphics.scale(scaleX, scaleY); - graphics.translate(-interior.getX(), -interior.getY()); + tx.translate(exterior.getX(), exterior.getY()); + tx.scale(scaleX, scaleY); + tx.translate(-interior.getX(), -interior.getY()); for (XSLFShape shape : getShapes()) { // remember the initial transform and restore it after we are done with the drawing @@ -306,7 +305,7 @@ public class XSLFGroupShape extends XSLFShape { graphics.setRenderingHint(XSLFRenderingHint.GRESTORE, true); } - graphics.setRenderingHint(XSLFRenderingHint.GROUP_SCALE, prevFontScale); + graphics.setRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM, tx0); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFImageRendener.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFImageRendener.java index 3c3d49bfca..06ba185135 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFImageRendener.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFImageRendener.java @@ -80,19 +80,14 @@ public class XSLFImageRendener { Rectangle2D anchor) { try { BufferedImage img = ImageIO.read(data.getPackagePart().getInputStream()); - Number groupScale = (Number)graphics.getRenderingHint(XSLFRenderingHint.GROUP_SCALE); - if(groupScale != null) { - double sx = anchor.getWidth()/img.getWidth(); - double sy = anchor.getHeight()/img.getHeight(); - double tx = anchor.getX(); - double ty = anchor.getY(); - AffineTransform at = new AffineTransform(sx, 0, 0, sy, tx, ty) ; - graphics.drawRenderedImage(img, at); - } else { - graphics.drawImage(img, - (int) anchor.getX(), (int) anchor.getY(), - (int) anchor.getWidth(), (int) anchor.getHeight(), null); - } + double sx = anchor.getWidth()/img.getWidth(); + double sy = anchor.getHeight()/img.getHeight(); + double tx = anchor.getX(); + double ty = anchor.getY(); + AffineTransform at = new AffineTransform(sx, 0, 0, sy, tx, ty) ; + + graphics.drawRenderedImage(img, at); + return true; } catch (Exception e) { return false; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java index ac4a4d2870..dd25953da6 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java @@ -16,6 +16,7 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; +import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.util.Beta; @@ -77,7 +78,12 @@ public final class XSLFNotes extends XSLFSheet { } @Override - public XSLFSheet getMasterSheet() { + public XSLFNotesMaster getMasterSheet() { + for (POIXMLDocumentPart p : getRelations()) { + if (p instanceof XSLFNotesMaster){ + return (XSLFNotesMaster)p; + } + } return null; } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java index 1b5bbea2e4..75cc4d15d0 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java @@ -129,7 +129,10 @@ public class XSLFPictureShape extends XSLFSimpleShape { XSLFImageRendener renderer = (XSLFImageRendener)graphics.getRenderingHint(XSLFRenderingHint.IMAGE_RENDERER); if(renderer == null) renderer = new XSLFImageRendener(); - renderer.drawImage(graphics, data, getAnchor()); + RenderableShape rShape = new RenderableShape(this); + Rectangle2D anchor = rShape.getAnchor(graphics); + + renderer.drawImage(graphics, data, anchor); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRenderingHint.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRenderingHint.java index 1b467ce82a..715530c67c 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRenderingHint.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRenderingHint.java @@ -75,7 +75,7 @@ public class XSLFRenderingHint extends RenderingHints.Key { public static final int TEXT_AS_SHAPES = 2; @Internal - static final XSLFRenderingHint GROUP_SCALE = new XSLFRenderingHint(5); + static final XSLFRenderingHint GROUP_TRANSFORM = new XSLFRenderingHint(5); /** * Use this object to resolve unknown / missing fonts when rendering slides diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java index 00191df6f0..c22d0fdf70 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java @@ -24,6 +24,7 @@ import org.apache.poi.util.Internal; import org.apache.xmlbeans.XmlObject; import java.awt.Graphics2D; +import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; /** @@ -131,6 +132,10 @@ public abstract class XSLFShape { */ protected void applyTransform(Graphics2D graphics) { Rectangle2D anchor = getAnchor(); + AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM); + if(tx != null) { + anchor = tx.createTransformedShape(anchor).getBounds2D(); + } // rotation double rotation = getRotation(); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java index fb8da22e17..ce568f0ff6 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java @@ -430,6 +430,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements Iterable getDecorationOutlines(){ + private List getDecorationOutlines(Graphics2D graphics){ List lst = new ArrayList(); - Outline head = getHeadDecoration(); + Outline head = getHeadDecoration(graphics); if(head != null) lst.add(head); - Outline tail = getTailDecoration(); + Outline tail = getTailDecoration(graphics); if(tail != null) lst.add(tail); return lst; } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java index 833e6deb93..5f9713e7ee 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java @@ -19,10 +19,14 @@ package org.apache.poi.xslf.usermodel; +import org.apache.poi.POIXMLException; import org.apache.poi.util.Internal; import org.apache.poi.util.Units; import org.apache.xmlbeans.XmlCursor; +import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; +import org.apache.xmlbeans.impl.values.XmlAnyTypeImpl; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTDTable; import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObjectData; import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; import org.openxmlformats.schemas.drawingml.x2006.main.CTTable; @@ -50,13 +54,23 @@ public class XSLFTable extends XSLFGraphicFrame implements Iterable(_table.sizeOfTrArray()); for(CTTableRow row : _table.getTrList()) _rows.add(new XSLFTableRow(row, this)); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java index 67a5013c83..b7901c4f12 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java @@ -633,12 +633,13 @@ public class XSLFTextParagraph implements Iterable{ * * @return wrapping width in points */ - double getWrappingWidth(boolean firstLine){ + double getWrappingWidth(boolean firstLine, Graphics2D graphics){ // internal margins for the text box double leftInset = _shape.getLeftInset(); double rightInset = _shape.getRightInset(); - Rectangle2D anchor = _shape.getAnchor(); + RenderableShape rShape = new RenderableShape(_shape); + Rectangle2D anchor = rShape.getAnchor(graphics); double leftMargin = getLeftMargin(); double indent = getIndent(); @@ -667,7 +668,8 @@ public class XSLFTextParagraph implements Iterable{ public double draw(Graphics2D graphics, double x, double y){ double leftInset = _shape.getLeftInset(); double rightInset = _shape.getRightInset(); - Rectangle2D anchor = _shape.getAnchor(); + RenderableShape rShape = new RenderableShape(_shape); + Rectangle2D anchor = rShape.getAnchor(graphics); double penY = y; double leftMargin = getLeftMargin(); @@ -758,10 +760,8 @@ public class XSLFTextParagraph implements Iterable{ string.addAttribute(TextAttribute.FAMILY, fontFamily, startIndex, endIndex); float fontSz = (float)run.getFontSize(); - Number fontScale = (Number)graphics.getRenderingHint(XSLFRenderingHint.GROUP_SCALE); - if(fontScale != null) fontSz *= fontScale.floatValue(); - string.addAttribute(TextAttribute.SIZE, fontSz , startIndex, endIndex); + if(run.isBold()) { string.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, startIndex, endIndex); } @@ -827,7 +827,7 @@ public class XSLFTextParagraph implements Iterable{ for (;;) { int startIndex = measurer.getPosition(); - double wrappingWidth = getWrappingWidth(_lines.size() == 0) + 1; // add a pixel to compensate rounding errors + double wrappingWidth = getWrappingWidth(_lines.size() == 0, graphics) + 1; // add a pixel to compensate rounding errors // shape width can be smaller that the sum of insets (this was proved by a test file) if(wrappingWidth < 0) wrappingWidth = 1; @@ -901,21 +901,23 @@ public class XSLFTextParagraph implements Iterable{ CTTextParagraphProperties getDefaultMasterStyle(){ CTPlaceholder ph = _shape.getCTPlaceholder(); String defaultStyleSelector; - switch(ph.getType().intValue()){ - case STPlaceholderType.INT_TITLE: - case STPlaceholderType.INT_CTR_TITLE: - defaultStyleSelector = "titleStyle"; - break; - case STPlaceholderType.INT_FTR: - case STPlaceholderType.INT_SLD_NUM: - case STPlaceholderType.INT_DT: - defaultStyleSelector = "otherStyle"; - break; - default: - defaultStyleSelector = "bodyStyle"; - break; + if(ph == null) defaultStyleSelector = "otherStyle"; // no placeholder means plain text box + else { + switch(ph.getType().intValue()){ + case STPlaceholderType.INT_TITLE: + case STPlaceholderType.INT_CTR_TITLE: + defaultStyleSelector = "titleStyle"; + break; + case STPlaceholderType.INT_FTR: + case STPlaceholderType.INT_SLD_NUM: + case STPlaceholderType.INT_DT: + defaultStyleSelector = "otherStyle"; + break; + default: + defaultStyleSelector = "bodyStyle"; + break; + } } - int level = getLevel(); // wind up and find the root master sheet which must be slide master @@ -951,7 +953,9 @@ public class XSLFTextParagraph implements Iterable{ XMLSlideShow ppt = getParentShape().getSheet().getSlideShow(); CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(getLevel()); if(themeProps != null) ok = visitor.fetch(themeProps); - } else { + } + + if(!ok){ // defaults for placeholders are defined in the slide master CTTextParagraphProperties defaultProps = getDefaultMasterStyle(); if(defaultProps != null) ok = visitor.fetch(defaultProps); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java index cb7e5fc12f..cd94cdd0b3 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java @@ -478,8 +478,8 @@ public class XSLFTextRun { fetcher.isFetchingFromMaster = true; ok = fetcher.fetch(themeProps); } - } else { - // defaults for placeholders are defined in the slide master + } + if (!ok) { CTTextParagraphProperties defaultProps = _p.getDefaultMasterStyle(); if(defaultProps != null) { fetcher.isFetchingFromMaster = true; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java index c54d74e1f4..5cdbcef18f 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java @@ -469,7 +469,8 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable< public void drawContent(Graphics2D graphics) { breakText(graphics); - Rectangle2D anchor = getAnchor(); + RenderableShape rShape = new RenderableShape(this); + Rectangle2D anchor = rShape.getAnchor(graphics); double x = anchor.getX() + getLeftInset(); double y = anchor.getY(); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java index 4f921ac05a..2176a1b2ea 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java @@ -62,5 +62,18 @@ public class TestXSLFTextBox extends TestCase { pPr.getLatin().setTypeface("Arial"); assertEquals(9.0, r.getFontSize()); assertEquals("Arial", r.getFontFamily()); + + // unset font size in presentation.xml. The value should be taken from master slide + // from /p:sldMaster/p:txStyles/p:otherStyle/a:lvl1pPr/a:defRPr + ppt.getCTPresentation().getDefaultTextStyle().getLvl1PPr().getDefRPr().unsetSz(); + pPr = slide.getSlideMaster().getXmlObject().getTxStyles().getOtherStyle().getLvl1PPr().getDefRPr(); + assertEquals(1800, pPr.getSz()); + assertEquals(18.0, r.getFontSize()); + pPr.setSz(2000); + assertEquals(20.0, r.getFontSize()); + + pPr.unsetSz(); // Should never be + assertEquals(-1.0, r.getFontSize()); + } } \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java index 62d3c52397..d2d8823b12 100755 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java @@ -51,16 +51,16 @@ public class TestXSLFTextParagraph extends TestCase { // Case 1: bullet=false, leftMargin=0, indent=0. expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; assertEquals(285.6, expectedWidth); // 300 - 7.2 - 7.2 - 0 - assertEquals(expectedWidth, p.getWrappingWidth(true)); - assertEquals(expectedWidth, p.getWrappingWidth(false)); + assertEquals(expectedWidth, p.getWrappingWidth(true, null)); + assertEquals(expectedWidth, p.getWrappingWidth(false, null)); p.setLeftMargin(36); // 0.5" leftMargin = p.getLeftMargin(); assertEquals(36.0, leftMargin); expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; assertEquals(249.6, expectedWidth, 1E-5); // 300 - 7.2 - 7.2 - 36 - assertEquals(expectedWidth, p.getWrappingWidth(true)); - assertEquals(expectedWidth, p.getWrappingWidth(false)); + assertEquals(expectedWidth, p.getWrappingWidth(true, null)); + assertEquals(expectedWidth, p.getWrappingWidth(false, null)); // increase insets, the wrapping width should get smaller sh.setLeftInset(10); @@ -71,8 +71,8 @@ public class TestXSLFTextParagraph extends TestCase { assertEquals(10.0, rightInset); expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36 - assertEquals(expectedWidth, p.getWrappingWidth(true)); - assertEquals(expectedWidth, p.getWrappingWidth(false)); + assertEquals(expectedWidth, p.getWrappingWidth(true, null)); + assertEquals(expectedWidth, p.getWrappingWidth(false, null)); // set a positive indent of a 0.5 inch. This means "First Line" indentation: // |<--- indent -->|Here goes first line of the text @@ -83,11 +83,11 @@ public class TestXSLFTextParagraph extends TestCase { assertEquals(36.0, indent); expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin - indent; assertEquals(208.0, expectedWidth); // 300 - 10 - 10 - 36 - 6.4 - assertEquals(expectedWidth, p.getWrappingWidth(true)); // first line is indented + assertEquals(expectedWidth, p.getWrappingWidth(true, null)); // first line is indented // other lines are not indented expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36 - assertEquals(expectedWidth, p.getWrappingWidth(false)); + assertEquals(expectedWidth, p.getWrappingWidth(false, null)); // set a negative indent of a 1 inch. This means "Hanging" indentation: // Here goes first line of the text @@ -97,11 +97,11 @@ public class TestXSLFTextParagraph extends TestCase { assertEquals(-72.0, indent); expectedWidth = anchor.getWidth() - leftInset - rightInset; assertEquals(280.0, expectedWidth); // 300 - 10 - 10 - assertEquals(expectedWidth, p.getWrappingWidth(true)); // first line is NOT indented + assertEquals(expectedWidth, p.getWrappingWidth(true, null)); // first line is NOT indented // other lines are indented by leftMargin (the value of indent is not used) expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36 - assertEquals(expectedWidth, p.getWrappingWidth(false)); + assertEquals(expectedWidth, p.getWrappingWidth(false, null)); } /**