[cairo-bugs] [Bug 43686] New: Artifact when drawing the letter 'u' from DejaVuSans.ttf

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Sat Dec 10 02:08:39 PST 2011


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

             Bug #: 43686
           Summary: Artifact when drawing the letter 'u' from
                    DejaVuSans.ttf
    Classification: Unclassified
           Product: cairo
           Version: 1.10.3
          Platform: Other
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: medium
         Component: freetype font backend
        AssignedTo: david at freetype.org
        ReportedBy: tristan.van.berkom at gmail.com
         QAContact: cairo-bugs at cairographics.org


Created attachment 54283
  --> https://bugs.freedesktop.org/attachment.cgi?id=54283
Screenshot showing artifact on the letter 'u'

This is originally filed as a pangocairo bug here:
   http://bugzilla.gnome.org/show_bug.cgi?id=665384

The attached screenshot show the problem (it happens to be rendered
using pangocairo onto a CoglTexture and displayed with Clutter, that
should of course not be relevant...).

I've made a printout of the resulting path drawing just
the letter 'u', here it is for reference:

Header: move to
 Point 1: x = 7.437500 y = 48.250000
Header: line to
 Point 1: x = 7.437500 y = 27.000000
Header: line to
 Point 1: x = 13.187500 y = 27.000000
Header: line to
 Point 1: x = 13.187500 y = 48.015625
Header: curve to
 Point 1: x = 13.187500 y = 51.339844
 Point 2: x = 13.832031 y = 53.835938
 Point 3: x = 15.125000 y = 55.500000
Header: curve to
 Point 1: x = 16.414062 y = 57.156250
 Point 2: x = 18.351562 y = 57.984375
 Point 3: x = 20.937500 y = 57.984375
Header: curve to
 Point 1: x = 24.039062 y = 57.984375
 Point 2: x = 26.492188 y = 56.996094
 Point 3: x = 28.296875 y = 55.015625
Header: curve to
 Point 1: x = 30.097656 y = 53.027344
 Point 2: x = 31.000000 y = 50.320312
 Point 3: x = 31.000000 y = 46.890625
Header: line to
 Point 1: x = 31.000000 y = 27.000000
Header: line to
 Point 1: x = 36.750000 y = 27.000000
Header: line to
 Point 1: x = 36.750000 y = 62.156250
Header: line to
 Point 1: x = 31.000000 y = 62.156250
Header: line to
 Point 1: x = 31.000000 y = 56.703125
Header: curve to
 Point 1: x = 29.601562 y = 58.828125
 Point 2: x = 27.984375 y = 60.414062
 Point 3: x = 26.140625 y = 61.453125
Header: curve to
 Point 1: x = 24.296875 y = 62.484375
 Point 2: x = 22.156250 y = 63.000000
 Point 3: x = 19.718750 y = 63.000000
Header: curve to
 Point 1: x = 15.695312 y = 63.000000
 Point 2: x = 12.644531 y = 61.750000
 Point 3: x = 10.562500 y = 59.250000
Header: curve to
 Point 1: x = 8.476562 y = 56.742188
 Point 2: x = 7.437500 y = 53.074219
 Point 3: x = 7.437500 y = 48.250000
Header: close path
Header: move to
 Point 1: x = 21.906250 y = 26.156250
Header: close path

And some comments from Behdad which should be useful in
fixing the problem here:
==========================================================
In cairo-ft-font.c:

Around here:

    /* Font glyphs have an inverted Y axis compared to cairo. */ 
    FT_Outline_Transform (&glyph->outline, &invert_y); 
    if (FT_Outline_Decompose (&glyph->outline, &outline_funcs, path)) { 
↦       _cairo_path_fixed_destroy (path); 
↦       return _cairo_error (CAIRO_STATUS_NO_MEMORY); 
    }  

    status = _cairo_path_fixed_close_path (path); 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    if (unlikely (status)) { 
↦       _cairo_path_fixed_destroy (path); 
↦       return status; 
    } 

This logic should be updated instead to check whether the last operation is a
move_to, and in that case simply drop the move_to instead of adding a
close_path().  In fact, same fix is needed in the move_to outline_funcs
callback too.

One should also pursue a fix in FreeType.  And in DejaVu.  And possibly
Fontforge who generated the TTF.
==========================================================

As I can only attach one file at a time, following up next with
an attachment of the actual DejaVuSans.ttf from my system which
is showing the problem.

-- 
Configure bugmail: https://bugs.freedesktop.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA Contact for the bug.


More information about the cairo-bugs mailing list