Вы можете создать путь, используя Font.getPath
.Путь состоит из инструкций перемещения, линии, кривой и четырехугольника и закрытия, доступ к которым осуществляется через path.commands
.Конечно, сначала вам нужно будет преобразовать инструкции кривой Безье в маленькие сегменты.
После того, как у вас есть набор замкнутых путей, вам необходимо определить, какие из них являются дырками.Внутренние контуры будут ориентированы в направлении, противоположном внешним, и вы можете назначить их наименьшему внешнему контуру, содержащему их.Когда у вас есть группывы должны быть в состоянии передать его в библиотеку earcut.
Это простая реализация, в которой предполагается, что пересечений нет.Для меня это работало очень хорошо для большинства шрифтов, за исключением очень немногих «причудливых» шрифтов, которые имеют пересекающиеся пути.
Вот рабочий пример: https://jsbin.com/gecakub/edit?html,js,output
Вместо создания сеток для каждой строкиВы также можете создать их для отдельных символов, а затем расположить их самостоятельно, используя данные кернинга из библиотеки.
Редактировать: это решение будет работать только для шрифтов TTF, хотя может быть легкос поправкой на CCF (.otf
), игнорируя ориентацию пути и используя более точную проверку «путь А находится внутри пути B», если только шрифт не имеет пересекающихся путей.