Skip to content

Commit

Permalink
#594 #458 Test with font-size much larger than line height.
Browse files Browse the repository at this point in the history
With changes to get it working and test proof.
  • Loading branch information
danfickle committed Nov 28, 2020
1 parent 8985e5a commit d06ccc5
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1092,11 +1092,33 @@ public void addPage(CssContext c) {
pages.add(pageBox);
}

/**
* Returns the page box for a Y position.
* If the y position is less than 0 then the first page will
* be returned if available.
* Returns null if there are no pages available or absY
* is past the last page.
*/
public PageBox getFirstPage(CssContext c, int absY) {
return getPage(c, absY);
PageBox page = getPage(c, absY);

if (page == null && absY < 0) {
List<PageBox> pages = getPages();

if (!pages.isEmpty()) {
return pages.get(0);
}
}

return page;
}

public PageBox getFirstPage(CssContext c, Box box) {
if (box instanceof LineBox) {
LineBox lb = (LineBox) box;
return getPage(c, lb.getMinPaintingTop());
}

return getPage(c, box.getAbsY());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,20 @@ public void setPaintingTop(int paintingTop) {
_paintingTop = paintingTop;
}

public int getMinPaintingTop() {
int paintingAbsTop = getAbsY() + getPaintingTop();
int lineAbsTop = getAbsY();

return Math.min(lineAbsTop, paintingAbsTop);
}

public int getMaxPaintingBottom() {
int paintingAbsBottom = getAbsY() + getPaintingTop() + getPaintingHeight();
int lineAbsBottom = getAbsY() + getHeight();

return Math.max(paintingAbsBottom, lineAbsBottom);
}

public void addAllChildren(List<? super Box> list, Layer layer) {
for (int i = 0; i < getChildCount(); i++) {
Box child = getChild(i);
Expand Down Expand Up @@ -650,27 +664,21 @@ public void analyzePageBreaks(LayoutContext c, ContentLimitContainer container)
container.updateTop(c, getAbsY());
container.updateBottom(c, getAbsY() + getHeight());
}

public void checkPagePosition(LayoutContext c, boolean alwaysBreak) {
if (! c.isPageBreaksAllowed()) {
return;
}

PageBox pageBox = c.getRootLayer().getFirstPage(c, this);
if (pageBox != null) {
// We need to force a page break if any of our content goes over a page break,
// otherwise we will get repeated content in page margins (because content is
// printed on both pages).

// Painting top and bottom take account of line-height other than 1.
int paintingAbsTop = getAbsY() + getPaintingTop();
int paintingAbsBottom = paintingAbsTop + getPaintingHeight();

int lineAbsTop = getAbsY();
int lineAbsBottom = lineAbsTop + getHeight();

int leastAbsY = Math.min(paintingAbsTop, lineAbsTop);
int greatestAbsY = Math.max(paintingAbsBottom, lineAbsBottom);
int greatestAbsY = getMaxPaintingBottom();
int leastAbsY = getMinPaintingTop();

boolean needsPageBreak =
alwaysBreak || greatestAbsY >= pageBox.getBottom() - c.getExtraSpaceBottom();
Expand All @@ -680,7 +688,6 @@ public void checkPagePosition(LayoutContext c, boolean alwaysBreak) {
calcCanvasLocation();
} else if (pageBox.getTop() + c.getExtraSpaceTop() > getAbsY()) {
int diff = pageBox.getTop() + c.getExtraSpaceTop() - getAbsY();

setY(getY() + diff);
calcCanvasLocation();
}
Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<html>
<head>
<style>
@page {
size: 150px 100px;
margin: 15px;
}
body {
margin: 0;
}
</style>
</head>
<body>
<div style="height: 20px;">SPACER</div>
<div style="line-height: 20px; font-size: 60px;">Line One</div>
</body>
</html>
Original file line number Diff line number Diff line change
Expand Up @@ -1286,6 +1286,15 @@ public void testIssue599TrimLeadingSpaceException() throws IOException {
assertTrue(vt.runTest("issue-599-trim-leading-space-exception"));
}

/**
* Tests auto page break before line-box with content
* much larger than line-height.
*/
@Test
public void testPr610ForcePageBreakLine() throws IOException {
assertTrue(vt.runTest("pr-610-force-page-break-line"));
}

// TODO:
// + Elements that appear just on generated overflow pages.
// + content property (page counters, etc)
Expand Down

0 comments on commit d06ccc5

Please sign in to comment.