diff --git a/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/ListItemPainter.java b/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/ListItemPainter.java index 6ba115ad6..bbadcfc0e 100755 --- a/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/ListItemPainter.java +++ b/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/ListItemPainter.java @@ -103,17 +103,25 @@ private static void drawGlyph(RenderingContext c, BlockBox box, RenderingHints.VALUE_ANTIALIAS_ON); // calculations for bullets - StrutMetrics strutMetrics = box.getMarkerData().getStructMetrics(); - MarkerData.GlyphMarker marker = box.getMarkerData().getGlyphMarker(); + MarkerData markerData = box.getMarkerData(); + StrutMetrics strutMetrics = markerData.getStructMetrics(); + MarkerData.GlyphMarker marker = markerData.getGlyphMarker(); int x = getReferenceX(c, box); + // see issue 478. To be noted, the X positioning does not consider the available padding space + // (like all the browsers it seems), so if the font is too big, the list decoration will be cut or outside + // the viewport. if (style.getDirection() == IdentValue.LTR) { - x += -marker.getLayoutWidth(); + x += -marker.getLayoutWidth() + marker.getDiameter() * 1.1; } if (style.getDirection() == IdentValue.RTL){ - x += box.getMarkerData().getReferenceLine().getWidth() + marker.getLayoutWidth(); + x += markerData.getReferenceLine().getWidth() + marker.getDiameter() * 1.1; } - int y = getReferenceBaseline(c, box) - - (int)strutMetrics.getAscent() / 2 - marker.getDiameter() / 2; + + // see issue https://github.com/danfickle/openhtmltopdf/issues/478#issuecomment-682066113 + int bottomLine = getReferenceBaseline(c, box); + int top = bottomLine - (int) (strutMetrics.getAscent() / 1.5); + + int y = bottomLine - (bottomLine-top) / 2 - marker.getDiameter() / 2 ; if (listStyle == IdentValue.DISC) { c.getOutputDevice().fillOval(x, y, marker.getDiameter(), marker.getDiameter()); } else if (listStyle == IdentValue.SQUARE) { diff --git a/openhtmltopdf-examples/src/main/resources/visualtest/expected/issue-478-list-decoration-position.pdf b/openhtmltopdf-examples/src/main/resources/visualtest/expected/issue-478-list-decoration-position.pdf new file mode 100644 index 000000000..a04a3b634 Binary files /dev/null and b/openhtmltopdf-examples/src/main/resources/visualtest/expected/issue-478-list-decoration-position.pdf differ diff --git a/openhtmltopdf-examples/src/main/resources/visualtest/expected/replaced-plugin-latex.pdf b/openhtmltopdf-examples/src/main/resources/visualtest/expected/replaced-plugin-latex.pdf index aa0467160..82df1ce47 100644 Binary files a/openhtmltopdf-examples/src/main/resources/visualtest/expected/replaced-plugin-latex.pdf and b/openhtmltopdf-examples/src/main/resources/visualtest/expected/replaced-plugin-latex.pdf differ diff --git a/openhtmltopdf-examples/src/main/resources/visualtest/expected/running-nested-list-items.pdf b/openhtmltopdf-examples/src/main/resources/visualtest/expected/running-nested-list-items.pdf index 0354dbd66..f40b2ae3b 100644 Binary files a/openhtmltopdf-examples/src/main/resources/visualtest/expected/running-nested-list-items.pdf and b/openhtmltopdf-examples/src/main/resources/visualtest/expected/running-nested-list-items.pdf differ diff --git a/openhtmltopdf-examples/src/main/resources/visualtest/expected/text/columns-nested-unbalanced.pdf b/openhtmltopdf-examples/src/main/resources/visualtest/expected/text/columns-nested-unbalanced.pdf index 41ae34698..bd1e0e388 100644 Binary files a/openhtmltopdf-examples/src/main/resources/visualtest/expected/text/columns-nested-unbalanced.pdf and b/openhtmltopdf-examples/src/main/resources/visualtest/expected/text/columns-nested-unbalanced.pdf differ diff --git a/openhtmltopdf-examples/src/main/resources/visualtest/html/issue-478-list-decoration-position.html b/openhtmltopdf-examples/src/main/resources/visualtest/html/issue-478-list-decoration-position.html new file mode 100644 index 000000000..5ab619e30 --- /dev/null +++ b/openhtmltopdf-examples/src/main/resources/visualtest/html/issue-478-list-decoration-position.html @@ -0,0 +1,95 @@ +<html> +<head> + <style> + +@page { + size: 550px 450px; +} + +body { + padding:0; + margin:0; +} + +@font-face { + src: url(fonts/NotoNaskhArabic-Regular.ttf); + font-family: 'arabic'; +} + +@font-face { + src: url(fonts/SourceSansPro-Regular.ttf); + font-family: 'source-sans-pro'; +} + +@font-face { + src: url(fonts/Karla-Bold.ttf); + font-family: 'karla-bold'; +} + +.source-sans-pro { + font-family:source-sans-pro; +} + +.karla-bold { + font-family:karla-bold; +} + +.arabic { + font-family:arabic +} + +.serif { + font-family:serif; +} + +.sans-serif { + font-family:sans-serif; +} + +li { + margin:0; + padding:0; +} + +.e1 { + font-size: 40px; +} +.e2 { + font-size: 55px; +} +</style> +</head> +<body> + +<!-- +To be noted, like in chrome, if the font is _too big_ the decoration will be cut. +Padding left/right can be adjusted if the current heuristic is not good enough. +--> +<ul > + <li class="serif" >A</li> + <li class="e1 serif"> + <p>B</p> + <p>C</p> + </li> + <li class="e2 serif">D</li> + <li class="e3 serif">E</li> +</ul> + +<ul class="arabic" style="direction:rtl; padding-right:40px;padding-left:0px"> + <li>التنازلي 1234 بحق</li> + <li class="e1">التنازلي 1234 بحق</li> <!-- the decoration is partially cut--> + <li class="e2">التنازلي 1234 بحق</li> <!-- the decoration is nearly all cut--> +</ul> + +<ul style="list-style-type:square"> + <li class="karla-bold" >A</li> + <li class="e1 source-sans-pro"> + <p>B</p> + <p>C</p> + </li> + <li class="e2 source-sans-pro">D</li> <!-- the decoration is partially cut--> + <li class="karla-bold">E</li> +</ul> + +</body> +</html> \ No newline at end of file diff --git a/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java b/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java index 524e3c9d1..82804f53a 100644 --- a/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java +++ b/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/VisualRegressionTest.java @@ -7,6 +7,8 @@ import java.nio.charset.StandardCharsets; import java.util.Collections; +import com.openhtmltopdf.bidi.support.ICUBidiReorderer; +import com.openhtmltopdf.bidi.support.ICUBidiSplitter; import com.openhtmltopdf.extend.FSStream; import com.openhtmltopdf.objects.zxing.ZXingObjectDrawer; import org.junit.Before; @@ -1240,6 +1242,14 @@ public void testBarcode() throws IOException { } + @Test + public void testIssue478ListDecorationPosition() throws IOException { + assertTrue(vt.runTest("issue-478-list-decoration-position", builder -> { + builder.useUnicodeBidiSplitter(new ICUBidiSplitter.ICUBidiSplitterFactory()); + builder.useUnicodeBidiReorderer(new ICUBidiReorderer()); + })); + } + // TODO: // + Elements that appear just on generated overflow pages. // + content property (page counters, etc)