freetype-devel
[Top][All Lists]
Advanced

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

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


From: Behdad Esfahbod
Subject: Re: [ft-devel] Minor modification of `FT_Outline_Check'?
Date: Wed, 31 Aug 2016 19:45:55 -0700

Still confused.  What's wrong with an outline with 0 contours and
points.  Ie. empty?

On Thu, Aug 25, 2016 at 2:26 AM, Werner LEMBERG <address@hidden> wrote:
>
>>>   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;
>   }
>
>
>     Werner



-- 
behdad
http://behdad.org/



reply via email to

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