[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [ft-devel] Minor modification of `FT_Outline_Check'?

From: Werner LEMBERG
Subject: Re: [ft-devel] Minor modification of `FT_Outline_Check'?
Date: Thu, 25 Aug 2016 11:26:12 +0200 (CEST)

>>   I found a .ttf file on the web whose outline->n_points and
>>   outline->n_contours are zero. FT_Outline_Check() reports success
>>   because of this condition:
>>     /* empty glyph? */
>>     if ( n_points == 0 && n_contours == 0 )
>>       return FT_Err_Ok;
>>   However, the for loop in FT_Outline_Decompose()
>>     for ( n = 0; n < outline->n_contours; n++ )
>>   is never executed which implies that the if condition should
>>   return failure.  I gather that FT_Outline_Decompose() should be
>>   called only if FT_Outline_Check() returns success, but, according
>>   to current code and one of my test files, FT_Outline_Decompose()
>>   should not be called at all.
>>   If you agree, can you fix the if statement in the next release?
>>   And, maybe, you even need to change "and" to "or" as well.
>> I'm inclined to do that, also clarifying the documentation to
>> explicitly explain what a valid outline means.
> I don't understand what the problem is.  What am I missing?

Ah, ok.  Here's the contributor's code snippet, part of a new tutorial
example that will demonstrate the `FT_Outline_Decompose' function to
print a single character's outline in SVG format.

  // This function is a work around a minor bug in FT_Outline_Check()
  // in FreeType 2.6.5 (see comment below).  It's better to check an
  // outline and display an error message for some .ttf files that we
  // don't know how handle than to generate an empty path element.

  bool OutlinePrinter::CheckOutline() const
    FT_Face      face    = m_face.m_ftFace;
    FT_GlyphSlot slot    = face->glyph;
    FT_Outline  &outline = slot->outline;

    if (slot->format != FT_GLYPH_FORMAT_OUTLINE)
      return false;     // Should never happen. Just an extra check

    // We need to perform this check because FT_Outline_Check() in
    // FreeType 2.6.5 returns success for outlines with n_contours and
    // n_points equal to zero.  There are such *.ttf files and in this
    // case FT_Outline_Decompose() will return success too without
    // doing anything because it iterates over the contours.

    if (outline.n_contours <= 0 || outline.n_points <= 0)
      return false;     // This happens for some *.ttf files

    FT_Error error = FT_Outline_Check(&outline);

    return error == 0;


reply via email to

[Prev in Thread] Current Thread [Next in Thread]