Отрисовка TrueType контуров

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Отрисовка TrueType контуров

Сообщение Sasha » 15.12.2015 02:15:26

Вот сделал выжимку минимум того, что нужно чтобы достать точки из TrueType файлов и добавил возможность повышения качества кривых. (проверок на ошибки почти никаких нет)
Триангулятор нужно из другого проекта вытаскивать, чуть позже выложу. Но по поводу скорости его работы ничего хорошего сказать не могу, его явно оптимизировать нужно, но по идее планируется один раз получить треугольники и более его не запускать, так что пока тормознутость триангулятора можно потерпеть.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Sasha
новенький
 
Сообщения: 41
Зарегистрирован: 07.12.2015 01:27:43

Re: Отрисовка TrueType контуров

Сообщение zub » 15.12.2015 02:46:34

Впечатляет. Я когда ознакомился с описанием ttf почемуто сразу решил что свою реализацию делать небуду, ограничусь штатной))
Судя по наличию метода SaveToFile это для редактора шрифтов?

в демонстрационном проекте пришлось поправить строки вида
Код: Выделить всё
FTTReder.UpQuality(@glf, @glfq, Edit2.TxtToInt);

на
Код: Выделить всё
FTTReder.UpQuality(@glf, @glfq, strtoint(Edit2.Text));

в паре мест
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Отрисовка TrueType контуров

Сообщение Sasha » 16.12.2015 15:56:08

"Судя по наличию метода SaveToFile это для редактора шрифтов?" нет, модуль MemoryWork, не писался специально под эту задачу, он у меня уже очень давно, с его помощью очень удобно читать/писать структуры в памяти, формат которых очень разнообразен (то байты, то слова, то целые, то вещественные и т.д.).
Edit2.TxtToInt - да, это я в исходниках помпонента добавил, т.к. надоело писать каждый раз, это: strtoint(Edit2.Text).

Добавлено спустя 11 минут 55 секунд:
Добавли триангулятор, работает он не очень шустро, но пользоваться можно. Для символа на картинке расчёт занимает около 300 мс, в результате формируется 87 треугольников.
Изображение
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Sasha
новенький
 
Сообщения: 41
Зарегистрирован: 07.12.2015 01:27:43

Re: Отрисовка TrueType контуров

Сообщение zub » 16.12.2015 17:25:57

0.3сек ИМХО черезчур медленно. скорость глу я не замерял, как и количество треугольников на символ, но добавление в программу триангуляции никаких задержек не добавило. Вот картинка с набором треугольников и результатом работы глу http://i71.fastpic.ru/big/2015/0530/a0/ ... dc76a0.png
если предположить что для отображения сразу после загрузки чертежа мне понадобится символов ~30~40, 30*0.3=9сек задержка((

Но всеравно большое спасибо!
Трингулятор генерит стрипы и фаны?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Отрисовка TrueType контуров

Сообщение Sasha » 16.12.2015 18:29:00

Да 0,3 секунды это очень медленно, но пользоваться им для триангуляции "на лету" я не собираюсь, триангуляция будет выполняться один раз при инициализации.
По поводу скорости glu я даже не сомневался, что он справляется с этой задачей лучше, я полагаю он пользуется аппаратными средствами видеокарты во время расчётов.

Триангулятор генерит независимый набор треугольников и отрезков. Каждый треугольник или отрезок описывается номерами точек из массива символа. Если честно очень плохо себе представляю как все эти треугольники сделать связанными, для некоторых символов это просто невозможно.
Sasha
новенький
 
Сообщения: 41
Зарегистрирован: 07.12.2015 01:27:43

Re: Отрисовка TrueType контуров

Сообщение zub » 16.12.2015 18:34:12

>>я полагаю он пользуется аппаратными средствами видеокарты во время расчётов.
Нет, там чисто cpu`шная реализация
>>для некоторых символов это просто невозможно.
Понятно что не всё можно связать. у глу на выходе может оказаться несколько стрипов\фанов и несколько отдельных треугольников
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Отрисовка TrueType контуров

Сообщение StarikPro » 26.12.2015 12:02:54

Sasha писал(а):Читаю файлы напрямую. Мне нужны только точки символов, а для этого можно обойтись одним модулем.

А не могли бы поделится алгоритмом, или подсказать в каком поле файла шрифта описаны контуры и как их читать? Решал аналогичную задачу, но в определённый момент надоело копаться в документации, и решил отложить до лучших времён. Пока остановился на растровых шрифтах.

Добавлено спустя 2 минуты 38 секунд:
Sasha писал(а):Вот сделал выжимку минимум того, что нужно чтобы достать точки из TrueType файлов и добавил возможность...

Упс, поленился прочитать сразу ветку, оказывается уже поделились :D
Спасибо большое!!!
StarikPro
новенький
 
Сообщения: 18
Зарегистрирован: 24.08.2014 18:22:08

Re: Отрисовка TrueType контуров

Сообщение MylnikovDm » 19.01.2016 13:12:30

За готовую библиотечку по чтению контура символов TTF премного благо дарю!
MylnikovDm
постоялец
 
Сообщения: 103
Зарегистрирован: 15.02.2007 21:26:10
Откуда: Челябинск

Re: Отрисовка TrueType контуров

Сообщение xterro » 19.01.2016 14:12:48

Добавли триангулятор, работает он не очень шустро, но пользоваться можно

Можно узнать, зачем? В GLU же уже есть триангулятор, или предполагается отрисовывать контуры не только с помощью OpenGL?
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: Отрисовка TrueType контуров

Сообщение MylnikovDm » 19.01.2016 14:26:54

xterro писал(а):Можно узнать, зачем? В GLU же уже есть триангулятор, или предполагается отрисовывать контуры не только с помощью OpenGL?

А триангулятор GLU работает с невыпуклыми полигонами?
MylnikovDm
постоялец
 
Сообщения: 103
Зарегистрирован: 15.02.2007 21:26:10
Откуда: Челябинск

Re: Отрисовка TrueType контуров

Сообщение xterro » 19.01.2016 14:29:20

хм.. понятно )
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: Отрисовка TrueType контуров

Сообщение zub » 19.01.2016 18:46:37

GLU умеет и выпуклые и невыпуклые и складывать\вычитать полигоны (т.е. с дырками тоже умеет)
Если взять реализацию GLU от месы а не от микрософта (не поддерживает GLU_EXT_nurbs_tessellator), то можно получать назад в программу результаты триангуляции и рисовать хоть чем, а не только opengl
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Отрисовка TrueType контуров

Сообщение Sasha » 21.01.2016 11:26:03

xterro писал(а):Можно узнать, зачем? В GLU же уже есть триангулятор, или предполагается отрисовывать контуры не только с помощью OpenGL?

Я не знал как работать с GLUшным триангулятором, мне показалось свой написать будет проще (найвный :) ).
Сейчас я конечно пользуюсь GLUшным, но с ним тоже не всё гладко. Когда я попытался передавать не только координаты точек но
и цвет, меня ожидал облом. Программа для Linux не захотела нормально работать в Win7, вместо цветов точек передавались нули.
Победить проблему я не смог. Для текста это конечно не очень страшно, редко когда бывает, что каждая точка у символа имеет свой
цвет, поэтому я не стал дальше копаться.
Единственный плюс самописного триангулятора я считаю, то какие треугольники он строит, т.к. написан с учётом правил триангуляции Делоне,
поэтому треугольники получаются "красивее".

zub писал(а):Если взять реализацию GLU от месы а не от микрософта (не поддерживает GLU_EXT_nurbs_tessellator), то можно получать назад в программу результаты триангуляции и рисовать хоть чем, а не только opengl

Насколько я понял, результат триангуляции можно получить в лубом случае, если назначить свои функции обратного вызова, или я что-то не так понял?
Я назначал свои обработчики и смотрел, что приходит в параметрах, там всё по честному (кроме проблем с цветом для каждой точки в Win7),
можно получить полный список точек и как их соединять.

Добавлено спустя 29 минут 17 секунд:
Затевалось это всё для создания простой альтернативы, выводу текста с помощью текстур. Уж очень некрасиво (на мой взгляд), выглядит текстурный способ.
Я боялся только за скорость вывода, куча треугольников, против 4-х точек с текстурой. Но как оказалось после нескольких тестов, OpenGLю, до оного места, что выводить, время отрисовки получилось одинаковое.
Ещё и кроссплотформенность получилась.
Есть неприятный минус, который хотелось бы убрать, я не понял как вытащить точки не из файла ttf, а из объекта TFont, чтобы шрифт можно было бы задавать с помощью диалога, и чтобы это так же работало везде. С текстурным вариантом такой проблемы нет.
Напишите, если кто знает.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Sasha
новенький
 
Сообщения: 41
Зарегистрирован: 07.12.2015 01:27:43

Re: Отрисовка TrueType контуров

Сообщение zub » 21.01.2016 12:41:05

>>Насколько я понял, результат триангуляции можно получить в лубом случае, если назначить свои функции обратного вызова, или я что-то не так понял?
Это я соврал, извиняюсь. да из триангулятора можно всё выудить без проблем. Я перепутал тесселятор сплайнов и триангуляцию - микрософтный GLU умеет только отрисовать nurbs, месавский может вернуть результат тесселяции в программу.

>>Но как оказалось после нескольких тестов, OpenGLю, до оного места, что выводить, время отрисовки получилось одинаковое.
Если рендерить много текста - разница набежит, Хотя переключение текстур тоже дорогая операция, возможно если постоянно переключать весь выигрышь съестся.

>>Есть неприятный минус, который хотелось бы убрать, я не понял как вытащить точки не из файла ttf, а из объекта TFont
Я не использую стандартный диалог, при старте программы прошариваю пути (сохраненные в настройках типа c:\windows\fonts, при желании их можно подправить) ищу ttf файлы и потом в своем диалоге предлагаю только их. Думаю что и для TFont можно выяснить семейство к которому он принадлежит и попытаться найти соответствующий ttf
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Отрисовка TrueType контуров

Сообщение MylnikovDm » 21.01.2016 13:21:10

>>Есть неприятный минус, который хотелось бы убрать, я не понял как вытащить точки не из файла ttf, а из объекта TFont, чтобы шрифт можно было бы задавать с помощью диалога, и чтобы это так же работало везде. С текстурным вариантом такой проблемы нет.
Напишите, если кто знает.<<
Объект TFont работает через функции API, которые в разных системах работают по разному. В Windows все шрифты лежат в папке windows\fonts, в других системах по другому.
Но в любом случае доступа к файлам шрифтов вы не получите. Так что на вашем месте лучше сделать собственный менеджер шрифтов, который будет считывать доступные файлы шрифтов из указанных папок, а потом уже выдавать пользователю список найденых шрифтов для выбора. Некоторые программы, типа InkScape или GIMP именно так и делают. Считывают шрифты при загрузке, используюя потом собственный менеджер.

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

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

Я бы сделал нечто среднее между вторым и третьим вариантом. При старте программы загрузил файлы шрифтов из указанных папок, получив список доступных шрифтов. При этом, если необходимо, можно сделать загрузку шрифтов из других папок, а не только из системных. А для символов сделал бы что-то типа кэша, когда при первой отрисовке символа делается расчёт набора теругольников, которые порсле этого сохраняются, чтобы при следущей отрисовке использовать уже готовый набор. В конечном итоге при выводе надписей будет постепенно накапливаться набор отрендерённых симовлов. В Windows реализован похожий механизм, только они хранят растроые матрицы для каждого использованного симовла шрифта, с учётом рамзера и угла наклона. В данном же случае учитывать рамзер и угол не требуется, поскольку эти преобразования можно быстро сделать с уже готовым набором треугольников символа перед его выводом.
MylnikovDm
постоялец
 
Сообщения: 103
Зарегистрирован: 15.02.2007 21:26:10
Откуда: Челябинск

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 219

Рейтинг@Mail.ru