Pull to refresh
7
0
Роман Романов @small-pro

Программист

Плавное масштабирование текста

Возможно я ошибаюсь, но 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+, но пока таким знанием я не владею.

Плавное масштабирование текста

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

Плавное масштабирование текста

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

Как в TMemo сделать вертикальное выравнивание, отступы и TextHint

Можно попробовать сделать такую запись:
function F1 (var m : TCustomMemo) : boolean;

Далее в коде вызвать хотя бы даже с «родным» наследником Memo1: TMemo
F1 (Memo1);

Компилятор будет не доволен.

Как в TMemo сделать вертикальное выравнивание, отступы и TextHint

Вы абсолютно правы. Это красивое и элегантное решение, чтобы подменить в run-time все компоненты, созданные в дизайне, на свои. Только не всегда нужно заменять абсолютно все.

SetMemo имеет два параметра: указатель на TCustomMemo и AWithFree – уничтожать ли. Т.е. передать можно любого наследника TCustomMemo, не обязательно TMemo, компонент возьмет все необходимые ему свойства. И можно не уничтожать «донора», пусть живет как есть.

Как в TMemo сделать вертикальное выравнивание, отступы и TextHint

Еще и не так можно. Все расскажу, дайте время. На самом деле все просто, если смотреть под иным углом зрения.

Как в TMemo сделать вертикальное выравнивание, отступы и TextHint

Я постараюсь подробно ответить в ближайшее время в статье. Там будет много спорного материала, но это все равно опыт, который мне помогает.

Information

Rating
Does not participate
Location
Ярославль, Ярославская обл., Россия
Date of birth
Registered
Activity