Pull to refresh

Comments 12

Неуверен, но вроде бы, в шрифтах есть информация, какие пары букв следует расположить ближе, какие дальше, назвается это кернинг, соотвественно печать букв по отдельности и серией может отличаться визуально.
Вы абсолютно правы, такая информация имеется. Но, если честно, не представляю, как его можно прикрутить к теме плавного масштаба текста.

Кернинг не учитывается в посимвольном выводе, и это плохо. Но автор этот способ забраковал, стал пользоваться GDI+, а там с кернингом должно быть всё хорошо.

Пока просматривал статью было ощущение «миллион лет до нашей эры». Я даже не про Delphi, а про выбор качественной отрисовки шрифта, которая, как мне показалось, всегда делается системой, только разные прокладки используются. Разве сейчас все, кто хотят использовать хорошую отрисовку шрифта не используют FreeType?
Статья не про качество шрифта, а качество масштабирования. Я не знаю, как с помощью FreeType обеспечить плавное масштабирование текста. Т.е. как сделать так, чтоб отношение высоты текста к его ширине при масштабировании было константой? Если для этого нужно использовать какие-то дополнительные вычисления, то чем FreeType лучше? Если нельзя это сделать одной функцией, как в GDI+, то тем более – какое отношение к теме статьи имеет FreeType?
На этом ресурсе принято обмениваться опытом, знаниями. Можно ли увидеть пример использования FreeType для плавного масштабирования текста?
FreeType может выдавать символ как в виде растрового изображения, так и в виде набора кривых для рисования этого символа самостоятельно. Всё, что вам нужно — это реализовать отрисовку полученных кривых. Векторному формату масштабирование побоку.

Интересно, что, например, Microsoft Word не слишком старается правильно масштабировать текст на экране. При стандартном размере 100% ещё есть какая-то надежда, что то, что мы видим на экране будет выглядеть точно так же на печати. А если уменьшить или увеличить масштаб, то строчки съезжают примерно как в первых вариантах.

А почему просто не доставать глифы и умножать на матрицу со scale/rotate/tranlate? Или отдавать, Freetype готовую матрицу аля FT_Glyph_Transform(glyph, matrix, 0)?
Возможно я ошибаюсь, но FreeType предназначен для растеризации шрифта. В задачи FreeType не входит «рисование» строк. И уж совсем не задача FreeType, так это «плавное масштабирование текста».

Подготовка:
  1. Ищем, качаем, ставим freetype-2.x.x-x-setup;
  2. Или копируем dll с конфигом в папку с проектом. Обычно заказчика очень «радуют» необоснованные дополнительные библиотеки.;
  3. Или пишем для своего проекта дистрибутив, который разместит FreeType где-то подальше от любопытных глаз, что тоже очень радует заказчика, который любит portable версии.

Алгоритм в общем виде:
  1. Получили FT_Face для нужного шрифта;
  2. Установили размер;
  3. Идем в цикле по каждому символу строки;
  4. Получаем glyph по каждому символу;
  5. Получаем кернинг;
  6. Подсчитываем, где он должен быть выведен, с учетом кернинга и специфических параметров символа (про плавный масштаб пока вообще забыли);
  7. Попиксельно выводим в нечто промежуточное;
  8. Освободили все глифы и структуры, выделенные под расчетные дела;
  9. Освободили фейс;
  10. Нечто промежуточное выводим в также посчитанную позицию рабочего контекста.

FreeType для вывода строки

Это все без учета главной цели: чтобы при любом масштабе отношение высоты строки к ее ширине всегда должно быть константой. Т.е. «продергиваний» ширины строки быть не должно. Плюс еще вычисления.

В статье хотелось описать несколько подходов к плавному масштабу, когда овчинка все еще стоит выделки, не увлекаясь кодом исключительно ради кода.
А почему просто не доставать глифы и умножать на матрицу со scale/rotate/tranlate
— просто не получится, т.к. все равно придется много считать, и тратить массу машинного времени на вывод строки.

Честно говоря, ни связи, ни выгод между FreeType и темой статьи не вижу. Опять же, возможно я ошибаюсь, и все можно сделать во FreeType также просто, красиво и быстро, как в GDI+, но пока таким знанием я не владею.

Напишу, хоть и через 4 года

с помощью GDI тоже можно получить растеризацию шрифта в безье-линиях.

  1. создать Path для текста с большим шрифтом

  2. получить кривые через GetPath

  3. отмасштабировать как нужно

  4. вывести через тот же Path например

естественно, но я про вариант, когда ничего стороннего использовать нельзя

Sign up to leave a comment.

Articles