FreeType использует три типа точек: на кривой, квадратичные контрольные точки (также известные как «конические») и кубические контрольные точки.Квадратичные контрольные точки сгруппированы с точками на кривой по обе стороны от них, чтобы сформировать три точки, необходимые для определения квадратичного сплайна Безье.Кубические контрольные точки должны быть в парах и сгруппированы с точками на кривой с обеих сторон, чтобы составить четыре точки, необходимые для кубического сплайна Безье.
Однако для квадратичной записи существует сокращенная записьтолько очки.Там, где квадратичные точки расположены рядом друг с другом, точка управления на кривой интерполируется между ними.И есть другое соглашение, что если замкнутый путь начинается с квадратичной точки, исследуется последняя точка пути, и если он квадратичный, точка на кривой интерполируется между ними, и путь берется для начала сэта кривая точка;если последняя точка не является квадратичной контрольной точкой, она сама используется для начальной точки.
Если вы хотите точно увидеть, как это делается, посмотрите исходный код FreeType.Функция FT_Outline_Decompose проходит путь и преобразует его в серию линий и кривых обоих типов.Он находится в этом файле:
http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/src/base/ftoutln.c
Особый интерес начинается с этого комментария (еще раз отметим, что «конический» в данном контексте означает то же, что и «квадратичный»):
/* first point is conic control. Yes, this happens. */