Отрисовка TrueType контуров
Модератор: Модераторы
Вот сделал выжимку минимум того, что нужно чтобы достать точки из TrueType файлов и добавил возможность повышения качества кривых. (проверок на ошибки почти никаких нет)
Триангулятор нужно из другого проекта вытаскивать, чуть позже выложу. Но по поводу скорости его работы ничего хорошего сказать не могу, его явно оптимизировать нужно, но по идее планируется один раз получить треугольники и более его не запускать, так что пока тормознутость триангулятора можно потерпеть.
Триангулятор нужно из другого проекта вытаскивать, чуть позже выложу. Но по поводу скорости его работы ничего хорошего сказать не могу, его явно оптимизировать нужно, но по идее планируется один раз получить треугольники и более его не запускать, так что пока тормознутость триангулятора можно потерпеть.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Впечатляет. Я когда ознакомился с описанием ttf почемуто сразу решил что свою реализацию делать небуду, ограничусь штатной))
Судя по наличию метода SaveToFile это для редактора шрифтов?
в демонстрационном проекте пришлось поправить строки вида
на
в паре мест
Судя по наличию метода SaveToFile это для редактора шрифтов?
в демонстрационном проекте пришлось поправить строки вида
Код: Выделить всё
FTTReder.UpQuality(@glf, @glfq, Edit2.TxtToInt);на
Код: Выделить всё
FTTReder.UpQuality(@glf, @glfq, strtoint(Edit2.Text));в паре мест
"Судя по наличию метода SaveToFile это для редактора шрифтов?" нет, модуль MemoryWork, не писался специально под эту задачу, он у меня уже очень давно, с его помощью очень удобно читать/писать структуры в памяти, формат которых очень разнообразен (то байты, то слова, то целые, то вещественные и т.д.).
Edit2.TxtToInt - да, это я в исходниках помпонента добавил, т.к. надоело писать каждый раз, это: strtoint(Edit2.Text).
Добавлено спустя 11 минут 55 секунд:
Добавли триангулятор, работает он не очень шустро, но пользоваться можно. Для символа на картинке расчёт занимает около 300 мс, в результате формируется 87 треугольников.

Edit2.TxtToInt - да, это я в исходниках помпонента добавил, т.к. надоело писать каждый раз, это: strtoint(Edit2.Text).
Добавлено спустя 11 минут 55 секунд:
Добавли триангулятор, работает он не очень шустро, но пользоваться можно. Для символа на картинке расчёт занимает около 300 мс, в результате формируется 87 треугольников.

У вас нет необходимых прав для просмотра вложений в этом сообщении.
0.3сек ИМХО черезчур медленно. скорость глу я не замерял, как и количество треугольников на символ, но добавление в программу триангуляции никаких задержек не добавило. Вот картинка с набором треугольников и результатом работы глу http://i71.fastpic.ru/big/2015/0530/a0/ ... dc76a0.png
если предположить что для отображения сразу после загрузки чертежа мне понадобится символов ~30~40, 30*0.3=9сек задержка((
Но всеравно большое спасибо!
Трингулятор генерит стрипы и фаны?
если предположить что для отображения сразу после загрузки чертежа мне понадобится символов ~30~40, 30*0.3=9сек задержка((
Но всеравно большое спасибо!
Трингулятор генерит стрипы и фаны?
Да 0,3 секунды это очень медленно, но пользоваться им для триангуляции "на лету" я не собираюсь, триангуляция будет выполняться один раз при инициализации.
По поводу скорости glu я даже не сомневался, что он справляется с этой задачей лучше, я полагаю он пользуется аппаратными средствами видеокарты во время расчётов.
Триангулятор генерит независимый набор треугольников и отрезков. Каждый треугольник или отрезок описывается номерами точек из массива символа. Если честно очень плохо себе представляю как все эти треугольники сделать связанными, для некоторых символов это просто невозможно.
По поводу скорости glu я даже не сомневался, что он справляется с этой задачей лучше, я полагаю он пользуется аппаратными средствами видеокарты во время расчётов.
Триангулятор генерит независимый набор треугольников и отрезков. Каждый треугольник или отрезок описывается номерами точек из массива символа. Если честно очень плохо себе представляю как все эти треугольники сделать связанными, для некоторых символов это просто невозможно.
>>я полагаю он пользуется аппаратными средствами видеокарты во время расчётов.
Нет, там чисто cpu`шная реализация
>>для некоторых символов это просто невозможно.
Понятно что не всё можно связать. у глу на выходе может оказаться несколько стрипов\фанов и несколько отдельных треугольников
Нет, там чисто cpu`шная реализация
>>для некоторых символов это просто невозможно.
Понятно что не всё можно связать. у глу на выходе может оказаться несколько стрипов\фанов и несколько отдельных треугольников
Sasha писал(а):Читаю файлы напрямую. Мне нужны только точки символов, а для этого можно обойтись одним модулем.
А не могли бы поделится алгоритмом, или подсказать в каком поле файла шрифта описаны контуры и как их читать? Решал аналогичную задачу, но в определённый момент надоело копаться в документации, и решил отложить до лучших времён. Пока остановился на растровых шрифтах.
Добавлено спустя 2 минуты 38 секунд:
Sasha писал(а):Вот сделал выжимку минимум того, что нужно чтобы достать точки из TrueType файлов и добавил возможность...
Упс, поленился прочитать сразу ветку, оказывается уже поделились
Спасибо большое!!!
-
MylnikovDm
- постоялец
- Сообщения: 103
- Зарегистрирован: 15.02.2007 20:26:10
- Откуда: Челябинск
За готовую библиотечку по чтению контура символов TTF премного благо дарю!
Добавли триангулятор, работает он не очень шустро, но пользоваться можно
Можно узнать, зачем? В GLU же уже есть триангулятор, или предполагается отрисовывать контуры не только с помощью OpenGL?
-
MylnikovDm
- постоялец
- Сообщения: 103
- Зарегистрирован: 15.02.2007 20:26:10
- Откуда: Челябинск
xterro писал(а):Можно узнать, зачем? В GLU же уже есть триангулятор, или предполагается отрисовывать контуры не только с помощью OpenGL?
А триангулятор GLU работает с невыпуклыми полигонами?
хм.. понятно )
GLU умеет и выпуклые и невыпуклые и складывать\вычитать полигоны (т.е. с дырками тоже умеет)
Если взять реализацию GLU от месы а не от микрософта (не поддерживает GLU_EXT_nurbs_tessellator), то можно получать назад в программу результаты триангуляции и рисовать хоть чем, а не только opengl
Если взять реализацию GLU от месы а не от микрософта (не поддерживает GLU_EXT_nurbs_tessellator), то можно получать назад в программу результаты триангуляции и рисовать хоть чем, а не только opengl
xterro писал(а):Можно узнать, зачем? В GLU же уже есть триангулятор, или предполагается отрисовывать контуры не только с помощью OpenGL?
Я не знал как работать с GLUшным триангулятором, мне показалось свой написать будет проще (найвный
Сейчас я конечно пользуюсь GLUшным, но с ним тоже не всё гладко. Когда я попытался передавать не только координаты точек но
и цвет, меня ожидал облом. Программа для Linux не захотела нормально работать в Win7, вместо цветов точек передавались нули.
Победить проблему я не смог. Для текста это конечно не очень страшно, редко когда бывает, что каждая точка у символа имеет свой
цвет, поэтому я не стал дальше копаться.
Единственный плюс самописного триангулятора я считаю, то какие треугольники он строит, т.к. написан с учётом правил триангуляции Делоне,
поэтому треугольники получаются "красивее".
zub писал(а):Если взять реализацию GLU от месы а не от микрософта (не поддерживает GLU_EXT_nurbs_tessellator), то можно получать назад в программу результаты триангуляции и рисовать хоть чем, а не только opengl
Насколько я понял, результат триангуляции можно получить в лубом случае, если назначить свои функции обратного вызова, или я что-то не так понял?
Я назначал свои обработчики и смотрел, что приходит в параметрах, там всё по честному (кроме проблем с цветом для каждой точки в Win7),
можно получить полный список точек и как их соединять.
Добавлено спустя 29 минут 17 секунд:
Затевалось это всё для создания простой альтернативы, выводу текста с помощью текстур. Уж очень некрасиво (на мой взгляд), выглядит текстурный способ.
Я боялся только за скорость вывода, куча треугольников, против 4-х точек с текстурой. Но как оказалось после нескольких тестов, OpenGLю, до оного места, что выводить, время отрисовки получилось одинаковое.
Ещё и кроссплотформенность получилась.
Есть неприятный минус, который хотелось бы убрать, я не понял как вытащить точки не из файла ttf, а из объекта TFont, чтобы шрифт можно было бы задавать с помощью диалога, и чтобы это так же работало везде. С текстурным вариантом такой проблемы нет.
Напишите, если кто знает.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
>>Насколько я понял, результат триангуляции можно получить в лубом случае, если назначить свои функции обратного вызова, или я что-то не так понял?
Это я соврал, извиняюсь. да из триангулятора можно всё выудить без проблем. Я перепутал тесселятор сплайнов и триангуляцию - микрософтный GLU умеет только отрисовать nurbs, месавский может вернуть результат тесселяции в программу.
>>Но как оказалось после нескольких тестов, OpenGLю, до оного места, что выводить, время отрисовки получилось одинаковое.
Если рендерить много текста - разница набежит, Хотя переключение текстур тоже дорогая операция, возможно если постоянно переключать весь выигрышь съестся.
>>Есть неприятный минус, который хотелось бы убрать, я не понял как вытащить точки не из файла ttf, а из объекта TFont
Я не использую стандартный диалог, при старте программы прошариваю пути (сохраненные в настройках типа c:\windows\fonts, при желании их можно подправить) ищу ttf файлы и потом в своем диалоге предлагаю только их. Думаю что и для TFont можно выяснить семейство к которому он принадлежит и попытаться найти соответствующий ttf
Это я соврал, извиняюсь. да из триангулятора можно всё выудить без проблем. Я перепутал тесселятор сплайнов и триангуляцию - микрософтный GLU умеет только отрисовать nurbs, месавский может вернуть результат тесселяции в программу.
>>Но как оказалось после нескольких тестов, OpenGLю, до оного места, что выводить, время отрисовки получилось одинаковое.
Если рендерить много текста - разница набежит, Хотя переключение текстур тоже дорогая операция, возможно если постоянно переключать весь выигрышь съестся.
>>Есть неприятный минус, который хотелось бы убрать, я не понял как вытащить точки не из файла ttf, а из объекта TFont
Я не использую стандартный диалог, при старте программы прошариваю пути (сохраненные в настройках типа c:\windows\fonts, при желании их можно подправить) ищу ttf файлы и потом в своем диалоге предлагаю только их. Думаю что и для TFont можно выяснить семейство к которому он принадлежит и попытаться найти соответствующий ttf
-
MylnikovDm
- постоялец
- Сообщения: 103
- Зарегистрирован: 15.02.2007 20:26:10
- Откуда: Челябинск
>>Есть неприятный минус, который хотелось бы убрать, я не понял как вытащить точки не из файла ttf, а из объекта TFont, чтобы шрифт можно было бы задавать с помощью диалога, и чтобы это так же работало везде. С текстурным вариантом такой проблемы нет.
Напишите, если кто знает.<<
Объект TFont работает через функции API, которые в разных системах работают по разному. В Windows все шрифты лежат в папке windows\fonts, в других системах по другому.
Но в любом случае доступа к файлам шрифтов вы не получите. Так что на вашем месте лучше сделать собственный менеджер шрифтов, который будет считывать доступные файлы шрифтов из указанных папок, а потом уже выдавать пользователю список найденых шрифтов для выбора. Некоторые программы, типа InkScape или GIMP именно так и делают. Считывают шрифты при загрузке, используюя потом собственный менеджер.
При этом можно сделать разный уровень загрузки. Например, можно только считать имена файлов, не загружая сами шрифты. С другой стороны, можно загрузить найденные файлы шрифтов, чтобы получить метаданные, внутреннее название шрифта и т.п., но не рендерить символы шрифта. Тогда конкретный символ будет рендериться при его отрисовке.
А можно сделать не только загрузку шрифтов, но и рендер символов, в вашем случае разбиение на треугольники, после чего хранить для каждого символа готовый набор данных. Это будет занимать время при загрузке, но потом ускорит вывод текста.
Я бы сделал нечто среднее между вторым и третьим вариантом. При старте программы загрузил файлы шрифтов из указанных папок, получив список доступных шрифтов. При этом, если необходимо, можно сделать загрузку шрифтов из других папок, а не только из системных. А для символов сделал бы что-то типа кэша, когда при первой отрисовке символа делается расчёт набора теругольников, которые порсле этого сохраняются, чтобы при следущей отрисовке использовать уже готовый набор. В конечном итоге при выводе надписей будет постепенно накапливаться набор отрендерённых симовлов. В Windows реализован похожий механизм, только они хранят растроые матрицы для каждого использованного симовла шрифта, с учётом рамзера и угла наклона. В данном же случае учитывать рамзер и угол не требуется, поскольку эти преобразования можно быстро сделать с уже готовым набором треугольников символа перед его выводом.
Напишите, если кто знает.<<
Объект TFont работает через функции API, которые в разных системах работают по разному. В Windows все шрифты лежат в папке windows\fonts, в других системах по другому.
Но в любом случае доступа к файлам шрифтов вы не получите. Так что на вашем месте лучше сделать собственный менеджер шрифтов, который будет считывать доступные файлы шрифтов из указанных папок, а потом уже выдавать пользователю список найденых шрифтов для выбора. Некоторые программы, типа InkScape или GIMP именно так и делают. Считывают шрифты при загрузке, используюя потом собственный менеджер.
При этом можно сделать разный уровень загрузки. Например, можно только считать имена файлов, не загружая сами шрифты. С другой стороны, можно загрузить найденные файлы шрифтов, чтобы получить метаданные, внутреннее название шрифта и т.п., но не рендерить символы шрифта. Тогда конкретный символ будет рендериться при его отрисовке.
А можно сделать не только загрузку шрифтов, но и рендер символов, в вашем случае разбиение на треугольники, после чего хранить для каждого символа готовый набор данных. Это будет занимать время при загрузке, но потом ускорит вывод текста.
Я бы сделал нечто среднее между вторым и третьим вариантом. При старте программы загрузил файлы шрифтов из указанных папок, получив список доступных шрифтов. При этом, если необходимо, можно сделать загрузку шрифтов из других папок, а не только из системных. А для символов сделал бы что-то типа кэша, когда при первой отрисовке символа делается расчёт набора теругольников, которые порсле этого сохраняются, чтобы при следущей отрисовке использовать уже готовый набор. В конечном итоге при выводе надписей будет постепенно накапливаться набор отрендерённых симовлов. В Windows реализован похожий механизм, только они хранят растроые матрицы для каждого использованного симовла шрифта, с учётом рамзера и угла наклона. В данном же случае учитывать рамзер и угол не требуется, поскольку эти преобразования можно быстро сделать с уже готовым набором треугольников символа перед его выводом.
