glib/tests/CMakeLists.txt |    1 
 glib/tests/check_bb.c     |   22 +++++++++++++------
 poppler/BBoxOutputDev.cc  |   51 +++++++++++++++++++++++-----------------------
 3 files changed, 42 insertions(+), 32 deletions(-)

New commits:
commit 69794176c8be5ebfa2a60d1261c8532695d18681
Author: sgerwk <[email protected]>
Date:   Tue Jun 30 18:13:26 2020 +0000

    fix boundingbox of type3 fonts

diff --git a/glib/tests/CMakeLists.txt b/glib/tests/CMakeLists.txt
index 591c5982..ee3dbb44 100644
--- a/glib/tests/CMakeLists.txt
+++ b/glib/tests/CMakeLists.txt
@@ -40,6 +40,7 @@ poppler_add_testcase(poppler-check-bb NestedLayers.pdf 0 191 
612 792)
 poppler_add_testcase(poppler-check-bb A6EmbeddedFiles.pdf 18 18 558.36 751.92)
 poppler_add_testcase(poppler-check-bb latex-hyperref-checkbox-issue-655.pdf 
148.71 123.81 308.11 704.57)
 poppler_add_testcase(poppler-check-bb utf16le-annot.pdf 52.98 55.61 101.23 
95.29)
+poppler_add_testcase(poppler-check-bb type3.pdf -p 10 125.80 130 509.30 695 
125.80 132 538.03 693)
 
 add_executable(pdfdrawbb pdfdrawbb.c)
 target_link_libraries(pdfdrawbb poppler-glib)
diff --git a/glib/tests/check_bb.c b/glib/tests/check_bb.c
index 3170299a..5ef9f95d 100644
--- a/glib/tests/check_bb.c
+++ b/glib/tests/check_bb.c
@@ -12,8 +12,8 @@
 /*
  * compare floating-point coordinates
  */
-int equal(double a, double b) {
-       return fabs(a - b) < 0.01;
+int equal(double a, double b, double precision) {
+       return fabs(a - b) < precision;
 }
 
 /*
@@ -28,6 +28,7 @@ int main(int argc, char *argv[]) {
        PopplerRectangle bb, correct;
        GError *err = NULL;
        int argx;
+       double precision = 0.01;
 
                                /* open file */
 
@@ -43,6 +44,14 @@ int main(int argc, char *argv[]) {
                exit(EXIT_FAILURE);
        }
 
+                               /* precision */
+
+       argx = 2;
+       if (! strcmp(argv[argx], "-p")) {
+               precision = atof(argv[argx + 1]);
+               argx += 2;
+       }
+
                                /* pages */
 
        npages = poppler_document_get_n_pages(doc);
@@ -53,7 +62,6 @@ int main(int argc, char *argv[]) {
 
                                /* check the bounding box */
 
-       argx = 2;
        for (n = 0; n < poppler_document_get_n_pages(doc); n++) {
                g_print("    page: %d\n", n + 1);
 
@@ -76,10 +84,10 @@ int main(int argc, char *argv[]) {
                correct.y2 = atof(argv[argx++]);
                g_print("        correct:      %g,%g - %g,%g\n",
                        correct.x1, correct.y1, correct.x2, correct.y2);
-               if (! equal(bb.x1, correct.x1) ||
-                   ! equal(bb.x2, correct.x2) ||
-                   ! equal(bb.y1, correct.y1) ||
-                   ! equal(bb.x2, correct.x2)) {
+               if (! equal(bb.x1, correct.x1, precision) ||
+                   ! equal(bb.x2, correct.x2, precision) ||
+                   ! equal(bb.y1, correct.y1, precision) ||
+                   ! equal(bb.x2, correct.x2, precision)) {
                        g_print("bounding box differs from expected\n");
                        exit(EXIT_FAILURE);
                }
diff --git a/poppler/BBoxOutputDev.cc b/poppler/BBoxOutputDev.cc
index b37f21c9..f909e7eb 100644
--- a/poppler/BBoxOutputDev.cc
+++ b/poppler/BBoxOutputDev.cc
@@ -110,9 +110,8 @@ void BBoxOutputDev::drawChar(GfxState *state,
        GfxFont *font;
        double leftent, rightent, ascent, descent;
        const double *fm, *fb;
-       Matrix fmat;
-       double fontSize;
-       double fx, fy, nx, ny;
+       double fontSize, w, adjust;
+       double fx, fy;
 
        if (! text)
                return;
@@ -126,13 +125,6 @@ void BBoxOutputDev::drawChar(GfxState *state,
 
        fontSize = state->getFontSize();
 
-       if (font->getType() != fontType3)
-               fmat.init(1, 0, 0, 1, 0, 0);
-       else {
-               fm = font->getFontMatrix();
-               fmat.init(fm[0], fm[1], fm[2], fm[3], fm[4], fm[5]);
-       }
-
        fb = font->getFontBBox();
        if (font->getWMode() == writingModeHorizontal) {
                leftent = 0;
@@ -152,26 +144,35 @@ void BBoxOutputDev::drawChar(GfxState *state,
                ascent = 0;
                descent = 0;
        }
-       if (font->getType() == fontType3) {
-               ascent *= 1000;
-               descent *= 1000;
+
+       if (font->getType() != fontType3)
+               adjust = 1;
+       else {
+               // adjust font size for type3 fonts,
+               // similar to TextPage::updateFont()
+               w = ((Gfx8BitFont *) font)->getWidth(code);
+               adjust = w / 0.5;
+               fm = font->getFontMatrix();
+               if (fm[0] != 0)
+                       adjust *= fabs(fm[3] / fm[0]);
        }
 
-       fmat.transform(leftent, descent, &fx, &fy);
-       state->textTransformDelta(fx, fy, &nx, &ny);
-       updatePoint(&bb, nx + x, ny + y, state);
+       ascent *= adjust * fontSize;
+       descent *= adjust * fontSize;
+       leftent *= adjust * fontSize;
+       rightent *= adjust * fontSize;
+
+       state->textTransformDelta(leftent, descent, &fx, &fy);
+       updatePoint(&bb, fx + x, fy + y, state);
 
-       fmat.transform(rightent, ascent, &fx, &fy);
-       state->textTransformDelta(fx, fy, &nx, &ny);
-       updatePoint(&bb, nx + x, ny + y, state);
+       state->textTransformDelta(rightent, ascent, &fx, &fy);
+       updatePoint(&bb, fx + x, fy + y, state);
 
-       fmat.transform(leftent * fontSize, descent * fontSize, &fx, &fy);
-       state->textTransformDelta(fx, fy, &nx, &ny);
-       updatePoint(&bb, nx + x + dx, ny + y + dy, state);
+       state->textTransformDelta(leftent, descent, &fx, &fy);
+       updatePoint(&bb, fx + x + dx, fy + y + dy, state);
 
-       fmat.transform(rightent * fontSize, ascent * fontSize, &fx, &fy);
-       state->textTransformDelta(fx, fy, &nx, &ny);
-       updatePoint(&bb, nx + x + dx, ny + y + dy, state);
+       state->textTransformDelta(rightent, ascent, &fx, &fy);
+       updatePoint(&bb, fx + x + dx, fy + y + dy, state);
 }
 
 /* update the bounding box with a new point */
_______________________________________________
poppler mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to