Как создавать и редактировать шрифты для библиотеки Adafruit GFX?

Я заметил, что шрифт TomThumb.h, включенный в библиотеку Adafruit GFX, имеет символы разной ширины, что является проблемой для меня, потому что я выполняю обработку текста, которая требует, чтобы символы имели одинаковые размеры (ширину и высоту). Я также заметил, что шрифт TomThumb.h пропускает некоторые символы (например,') и так далее. Мне нужен способ создания/редактирования шрифтов для Adafruit GFX (где я использую Adafruit_ST7735 на 1,8-дюймовом TFT-дисплее). Я поискал в Интернете, но не смог найти ничего приличного.

, 👍1

Обсуждение

Библиотека поставляется с несколькими шрифтами. Те, что называются " *Mono*", являются моноширинными, что означает, что все символы имеют одинаковый размер., @Majenko

@Majenko Интересно. Я думал, что по умолчанию все символы должны принимать равные размеры., @JingleBells

Нет. Каждый символ в шрифте ("глиф") задает размеры и смещение символа, а также "аванс" - как далеко нужно переместить курсор после печати символа., @Majenko

@Majenko Я удивлен, что нет простого способа создать шрифты для Adafruit GFX. Это относительно поддерживаемая и используемая библиотека., @JingleBells

У меня есть различные утилиты для DisplayCore, но DisplayCore не работает на Arduino., @Majenko

@Majenko Моя главная цель здесь - отобразить текст книги. Есть ли способ сделать это без использования моноширинного шрифта? Потому что я предварительно обрабатываю текст на телефоне и делаю все это, подсчитывая, сколько символов может поместиться в строке, и так далее, поэтому, когда слово не подходит, оно переходит к следующей строке... вы поняли мою идею. Можно ли сделать весь when-word-doesn't-fit-goes-on-next-line и с функцией переключения страниц, используя немоноширинный шрифт? Полагаю, мне нужно знать, сколько пикселей занимает каждый символ, чтобы делать вычисления..., @JingleBells

Разделите текст на слова и используйте функцию getTextBounds, чтобы узнать, насколько он широк. Добавьте ширину пробела. Если он помещается в текущую строку, то распечатайте его. В противном случае начните новую строку и распечатайте ее. Конечно, вам придется поддерживать свои собственные координаты курсора., @Majenko

@Majenko Звучит великолепно! Что вы имеете в виду насчет координат курсора?, @JingleBells

Чтобы вы знали, где напечатать следующее слово., @Majenko

@Majenko О, понял. getTextBounds() требует начальных x и y слова. Ах, это будет довольно болезненно, но у меня нет другого выбора. Спасибо, что помогли мне! :-), @JingleBells

@Majenko О функциональности страницы, у вас есть представление о том, как это можно сделать? Я читаю содержание книги с SD-карты. Проблема с функциональностью подкачки заключается в том, что если я нахожусь на странице 82, мне приходится обрабатывать все страницы до 82, и по мере того, как я углубляюсь в книгу, она начинает отставать. Я готов опустить страницы целиком, но мне нужен какой-то способ вернуть человека на то место в книге, откуда он ушел, чтобы он мог продолжить чтение. Каков был бы лучший способ сделать это?, @JingleBells

@Majenko После небольшого исследования я думаю, что смогу сделать это с помощью fseek и запомнить последний символ последнего слова... Большое вам спасибо за то, что помогли мне и предложили вышеприведенный метод. Ты самый лучший!, @JingleBells

@Majenko Одна вещь, которая неясна, как бы я пошел на предыдущие страницы? Если я нахожусь на какой-то странице, обработал ее и отобразил, как мне перейти на предыдущую страницу, не зная, какой символ искать и так далее...?, @JingleBells

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

@Majenko Хм, я конвертирую PDF в текст и отправляю его с телефона на Arduino через BT, а затем отображаю текст на 1,8-дюймовом TFT-дисплее. Как еще я могу его хранить, когда моя цель-сделать что-то вроде электронного ридера?, @JingleBells

Может быть, визуализировать страницы на телефоне в виде растровых изображений и отображать их на экране?, @Majenko

@Majenko Хорошее предложение, но текст может быть не виден или читаем, потому что TFT-дисплей довольно маленький (1,8 дюйма) и имеет размер 128x160 пикселей, и я не думаю, что содержимое PDF-страницы будет видно :P, @JingleBells

Я имею в виду не страницы в формате PDF, а предварительно отрисованные выбранным вами шрифтом., @Majenko

@Majenko Да, но проблема символов шрифтов, имеющих разную ширину, сохраняется. Насколько я понял, на телефоне я создаю растровое изображение 128x160, где накладываю текст выбранным шрифтом, но мне все равно придется выполнять ту же обработку текста, как если бы он обрабатывался на Arduino как текст. Это становится действительно сложным, поэтому я думаю, что обработаю txt на Arduino методом, который вы предложили выше, с помощью getTextBounds..., @JingleBells

@Majenko Идея сделать это с растровыми изображениями хороша, но сравнивая плюсы и минусы с обработкой на ходу с помощью getTextBounds (), последний лучше, потому что он позволяет динамически изменять шрифт, менее сложен и менее тяжел (потому что текстовые файлы легче растровых изображений страниц).. А также скорость загрузки будет намного быстрее. Скажи мне, что ты думаешь :-), @JingleBells


4 ответа


0

Одно из возможных решений, которое у вас уже может быть: есть небольшая утилита под названием fontconvert, которая является частью библиотеки Adafruit GFX. Исходный код устанавливается по умолчанию вместе с библиотекой Adafruit GFX в Arduino/libraries/Adafruit_GFX_Library / fontconvert Вам нужен Linux, чтобы скомпилировать его из предоставленного исходного кода. Он также компилируется и работает на Raspberry Pi.

Он заботится о преобразовании шрифтов TrueType (полностью или частично) в формат Adafruit GFX. В каталоге fontconvert есть некоторая документация по его компиляции и использованию.

,

Спасибо, я нашел его. К сожалению, у меня нет ни Linux, ни Raspberry Pi. Я мог бы установить виртуальную машину Linux. Нет ли более простого способа? Например, какой-то инструмент, куда вы помещаете отдельные пиксели для каждого символа., @JingleBells

Ну, есть [это](https://forum.arduino.cc/index.php?topic=447956.0). Я не знаю, насколько это полезно для вас, но вы могли бы взглянуть на него., @StarCat

Спасибо, я посмотрю. Я надеюсь, что это сделает свою работу, @JingleBells


1

Я нашел онлайн - редактор, который может анализировать заголовки шрифтов Adafruit GFX, изменять и экспортировать результат для создания нового заголовка шрифта. Это работает очень хорошо. Может быть, немного поздно помогать ОП, но для тех, кто еще ищет...

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

веб-страница: https://tchapi.github.io/Adafruit-GFX-Font-Customiser/
github: https://github.com/tchapi/Adafruit-GFX-Font-Customiser

,

Это прекрасно работает, как только вы в этом разберетесь., @Jack O'Flaherty


0

Я использовал этот сайт для создания различных шрифтов, размеров и т. Д. с успехом.

http://oleddisplay.squix.ch/#/home

,

0

Я использовал truetype2gfx — преобразование шрифтов из TrueType в Adafruit GFX.

Он может создавать различные размеры до полного стандартного шрифта.

,

@ocrdu - вы заходили на сайт и опробовали «инструмент»? Как это сработало для вас?, @VE7JRO