[Poppler-bugs] [Bug 106150] New: [PATCH] Arthur support for Type3 fonts -- alternative implementation

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Fri Apr 20 14:34:40 UTC 2018


https://bugs.freedesktop.org/show_bug.cgi?id=106150

            Bug ID: 106150
           Summary: [PATCH] Arthur support for Type3 fonts -- alternative
                    implementation
           Product: poppler
           Version: unspecified
          Hardware: Other
                OS: All
            Status: NEW
          Severity: normal
          Priority: medium
         Component: arthur backend
          Assignee: poppler-bugs at lists.freedesktop.org
          Reporter: oliver.sander at tu-dresden.de

Created attachment 138952
  --> https://bugs.freedesktop.org/attachment.cgi?id=138952&action=edit
Patch that implements type3 font support in Arthur backend using
beginType3Char/endType3Char

The attached patch contains an alternative implementation of type3 font support
for the Arthur backend, which uses the beginType3Char/endType3Char methods.  It
is a lot simpler---just compare the size of this patch with the one from 

  https://bugs.freedesktop.org/show_bug.cgi?id=105772

The new patch is orthogonal to the old one.  You can have them both together,
and switch between them using the return value of the interpretType3Chars
method (false: old patch, true: new patch).  I think we need to compare the
two: the new patch is much simpler, but the old one does some caching and
may(!) be faster.  

Unfortunately, the patch triggers a problem which I think is a bug in Gfx.cc,
but it may also be insufficient understanding on my part.  With the patch
applied, poppler will only render the first type3 glyph, and all others remain
invisible.  The problem is Gfx.cc:4017:

      restoreStateStack(savedState);
      // GfxState::restore() does *not* restore the current position,
      // so we deal with it here using (curX, curY) and (lineX, lineY)
      curX += tdx;
      curY += tdy;
      state->moveTo(curX, curY);
      out->updateCTM(state, 0, 0, 0, 0, 0, 0);

This code is executed after the call to endType3Char.  However, transforming
the CTM by a zero matrix results in a scale factor of zero, and all glyphs are
henceforth reduced to a single point.  Therefore, that call to updateCTM looks
very fishy to me.  When I remove it, the type3 support in my patch works.

Now, the call to updateCTM is there for a reason.  Thomas Freitag introduced it
in 182abe4ed5c0773073c6751a26a7c4e40e99e02e to fix bug #95344.  I admit haven't
looked further into that issue.  Thomas, if you are reading this: do you
remember why you had to multiply the CTM by 0?

Incidentally, in my understanding of the updateCTM method, the line Gfx.cc:3972

      out->updateCTM(state, 1, 0, 0, 1, 0, 0);

is useless, because it simply multiplies the current CTM by an identity matrix.

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/poppler-bugs/attachments/20180420/61754362/attachment.html>


More information about the Poppler-bugs mailing list