реконструкция контура свободного шрифта не соответствует шрифту

Ниже приведены двухсимвольные контуры, извлеченные с использованием freetype и обработанные в некоторых циклах с использованием формулы кривой квадрата Безье (помогает обычный шрифт opensans ttf). Я не уверен, что то, что я сделал, правильно, шрифты, сгенерированные кодом c ++, не идентичны официальным аналогам.

Код получит контур буквы, выполнит итерацию по ней, получит две точки и одну точку отклонения (квадратные контрольные / конечные точки Безье) и вычислит результирующие точки, используя формулу конического Безье. Точки выбрасываются на консоли (цель отладки). Использование gnuplot для рисования результирующих точек, соединяющих каждую точку (с опцией линий в gnuplot).

Это буква ч и е:

http://imgur.com/JyHkZ7H,Aapr6zX

Что странно в букве e, так это то, что внутренний контур заканчивается во внешней точке (Coes не соединяется с начальной точкой). Это приведет к проблемам при триангуляции контурного полигона.

Я пропускаю какую-то опцию при загрузке / шрифте, загрузке письма в свободном шрифте?

Ниже вы можете увидеть соответствующие части кода.

Открытие шрифта:

FT_New_Face(ft, "OpenSans-Regular.ttf", 0, &this->face)

Создание глифа:

FT_GlyphSlot g = this->face->glyph;

Создание лица из письма:

for (p = text; *p; p++) {

/* Try to load and render the character */
if (FT_Load_Char(this->face, *p, FT_LOAD_RENDER))
continue;

Итерация по сгенерированному плану Freetype:

char       tag           = *g->outline.tags;
int start_point = 0;
int end_point;
for(int current_contour = 0; current_contour < g->outline.n_contours; current_contour++){
end_point = g->outline.contours[current_contour];
for(int current_point = start_point; current_point <= end_point; current_point++){
std::bitset<8>first_tags(tag);
FT_Vector first_point = g->outline.points[current_point];
tag++;current_point++;
if(first_tags[0] == FT_CURVE_TAG_ON){
std::bitset<8>second_tags(tag);
FT_Vector second_point = g->outline.points[current_point];
tag++;current_point++;
if(second_tags[0] != FT_CURVE_TAG_ON){
std::bitset<8>third_tags(tag);
FT_Vector third_point = g->outline.points[current_point];
if(current_point-1 == end_point){
third_point = g->outline.points[start_point];
}
for(double t = 0; t <= 1; t+=0.01){
FT_Vector letter_point;
letter_point.x = (1-t)*(1-t)*first_point.x+2*(1-t)*t*second_point.x + t*t*third_point.x;
letter_point.y = (1-t)*(1-t)*first_point.y+2*(1-t)*t*second_point.y + t*t*third_point.y;
if(current_letter == 1){
std::cout << letter_point.x << " " << letter_point.y << std::endl;
}
}
current_point--;
}
}
}
start_point = end_point+1;
}

Благодарю.

1

Решение

Доступ к массиву тегов по ключу устранил большинство проблем

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]