From a2e76a7c705a64c8b156a412e72a35ee48557b4e Mon Sep 17 00:00:00 2001 From: danfickle Date: Thu, 27 Dec 2018 16:27:58 +1100 Subject: [PATCH] #180 - FIX - Line boxes were causing overflow pages (and appearing on them) despite being in overflow hidden containers. Also enable test demonstrating this scenario. --- .../render/displaylist/PagedBoxCollector.java | 29 ++++++++---------- .../text/horiz-page-overflow-hidden.pdf | Bin 0 -> 6575 bytes .../TextVisualRegressionTest.java | 1 - 3 files changed, 13 insertions(+), 17 deletions(-) create mode 100644 openhtmltopdf-examples/src/main/resources/visualtest/expected/text/horiz-page-overflow-hidden.pdf diff --git a/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/displaylist/PagedBoxCollector.java b/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/displaylist/PagedBoxCollector.java index db40ee5d5..1f2fe49e5 100644 --- a/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/displaylist/PagedBoxCollector.java +++ b/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/displaylist/PagedBoxCollector.java @@ -317,7 +317,7 @@ public void collectFloats(CssContext c, Layer layer) { PageResult pgRes = getPageResult(i); PageBox pageBox = getPageBox(i); - if (intersectsAggregateBounds(pgRes.getContentWindowOnDocument(pageBox, c), floater)) { + if (intersectsAggregateBounds(c, pgRes.getContentWindowOnDocument(pageBox, c), floater)) { pgRes.addFloat(floater); } @@ -491,7 +491,7 @@ private void addLineBoxToShadowPage(CssContext c, Layer layer, LineBox container PageBox pageBox = getPageBox(basePageNumber); Rectangle shadowPageClip = pageResult.getShadowWindowOnDocument(pageBox, c, shadowPageNumber); - if (intersectsAggregateBounds(shadowPageClip, container)) { + if (intersectsAggregateBounds(c, shadowPageClip, container)) { PageResult shadowPageResult = getOrCreateShadowPage(pageResult, shadowPageNumber); shadowPageResult.addInline(container); @@ -509,7 +509,7 @@ private void addLineBoxToAll(CssContext c, Layer layer, LineBox container, int b PageBox pageBox = getPageBox(basePageNumber); Rectangle pageClip = pageResult.getContentWindowOnDocument(pageBox, c); - if (intersectsAggregateBounds(pageClip, container)) { + if (intersectsAggregateBounds(c, pageClip, container)) { pageResult.addInline(container); // Recursively add all children of the line box to the inlines list. @@ -629,7 +629,7 @@ private void addBoxToShadowPages( Rectangle shadowPageClip = pageResult.getShadowWindowOnDocument(basePageBox, c, i); boolean intersects = addToMethod.boundsBox() == AddToShadowPage.AGGREGATE_BOX ? - intersectsAggregateBounds(shadowPageClip, container) : + intersectsAggregateBounds(c, shadowPageClip, container) : intersectsBorderBoxBounds(c, shadowPageClip, container); if (intersects) { @@ -689,7 +689,7 @@ private void addBlock(Box container, PageResult pageResult) { } } - private boolean intersectsAggregateBounds(Shape clip, Box box) { + private boolean intersectsAggregateBounds(CssContext c, Shape clip, Box box) { if (clip == null) { return true; } @@ -702,14 +702,7 @@ private boolean intersectsAggregateBounds(Shape clip, Box box) { Rectangle bounds = info.getAggregateBounds(); - AffineTransform ctm = box.getContainingLayer().getCurrentTransformMatrix(); - - if (ctm == null) { - return clip.intersects(bounds); - } else { - Shape boxShape = ctm.createTransformedShape(bounds); - return clip.intersects(boxShape.getBounds2D()); - } + return boxIntersects(c, clip, box, bounds); } /** @@ -719,20 +712,24 @@ private boolean intersectsAggregateBounds(Shape clip, Box box) { private boolean intersectsBorderBoxBounds(CssContext c, Shape clip, Box box) { Rectangle borderBoxBounds = box.getBorderBox(c); + return boxIntersects(c, clip, box, borderBoxBounds); + } + + private boolean boxIntersects(CssContext c, Shape clip, Box box, Rectangle boxBounds) { AffineTransform ctm = box.getContainingLayer().getCurrentTransformMatrix(); Area overflowClip = box.getAbsoluteClipBox(c); if (ctm == null && overflowClip == null) { - return clip.intersects(borderBoxBounds); + return clip.intersects(boxBounds); } else if (ctm != null && overflowClip == null) { - Shape boxShape = ctm.createTransformedShape(borderBoxBounds); + Shape boxShape = ctm.createTransformedShape(boxBounds); Area boxArea = new Area(boxShape); Area clipArea = new Area(clip); boxArea.intersect(clipArea); return !boxArea.isEmpty(); } else { // if (overflowClip != null) - Area boxArea = new Area(ctm == null ? borderBoxBounds : ctm.createTransformedShape(borderBoxBounds)); + Area boxArea = new Area(ctm == null ? boxBounds : ctm.createTransformedShape(boxBounds)); boxArea.intersect(overflowClip); boxArea.intersect(new Area(clip)); diff --git a/openhtmltopdf-examples/src/main/resources/visualtest/expected/text/horiz-page-overflow-hidden.pdf b/openhtmltopdf-examples/src/main/resources/visualtest/expected/text/horiz-page-overflow-hidden.pdf new file mode 100644 index 0000000000000000000000000000000000000000..129f71c13586640e1a162d890219a284fdf3e77e GIT binary patch literal 6575 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 MLKYToKJL)}0KZbXi2wiq literal 0 HcmV?d00001 diff --git a/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/TextVisualRegressionTest.java b/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/TextVisualRegressionTest.java index 3043c7af4..f667ce324 100644 --- a/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/TextVisualRegressionTest.java +++ b/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/TextVisualRegressionTest.java @@ -196,7 +196,6 @@ public void testHorizPageOverflowInlineBlock2() throws IOException { * is absolute block and a case where content is a static block. */ @Test - @Ignore // Text is causing overflow pages and text appears on overflow pages in contravention of overflow hidden. public void testHorizPageOverflowHidden() throws IOException { assertTrue(run("horiz-page-overflow-hidden")); }