Библиотека SNAAB ILI9341 и редактор шрифта
- Войдите на сайт для отправки комментариев
При разработке одного из проектов на Arduino Nano возникла задача, кроме обработки значительной периферии, выводить на 2,4 ' TFT дисплей с драйвером ILI9341 шрифты нескольких размеров - понятно, что память в Nano быстро закончилась. Использовать в проекте другие контроллеры, например Mega, представлялось необоснованным. Так появилась библиотека SNAAB ILI9341 (http://snaabsys.ru/download/download.html), работающая с дисплеем по аппаратной шине SPI. Отличительной особенностью предлагаемой библиотеки является структура ListChar, содержащая перечень доступных символов в выбранном шрифте. Использование этой структуры позволяет удалить из шрифта не используемые в проекте символы, существенно уменьшая используемую память микроконтроллера. Кроме того, в компилированном файле шрифта содержатся не полные знакоместа символов, а только их активные части, что дополнительно снижает объем задействованной памяти микроконтроллера. Эффективность предложенных мер по уменьшению используемого объема памяти микроконтроллера можно оценить в примерах drawFont и drawFont_Limit. При выводе одной и той же строки текста тремя шрифтами в первом примере загрузка памяти (для Arduino Nano) составляет 74%, во втором - 19%.
В библиотеке имеется вывод мнемонических изображений глубиной два цвета. Для уменьшения объема памяти микроконтроллера, занимаемого изображениями, выравнивание scanline битмапов не выполняется, изображения передаются сплошным массивом.
Подготовка компилированных шрифтов и изображений производится в программе SNAAB FontEditor (http://snaabsys.ru/products/feditor/feditor.html), распространяемой свободно.
Спасибо.
Посмотрите шрифты Адафруит, там все это есть - таблица символов, кодирование только закрашенных точек, непрерывные битмапы... может и не стоило изобретать велосипед?
Посмотрел код - очевидно, что про Адафруит вы знаете :) , ибо структура фонта один в один передрана оттуда :) Да и сама библиоека на 90% просто копипаст. Как-то некрасиво получается называть это все своим именем - хоть бы упомянули, на основе чего сделана "ваша" библиотека.
А еще лучше, если вы реально знаете Си++ - было бы унаследовать вашу библиотеку от Адафруит. Тогда очень многие методы, такие как рисование линий, точек и полигонов - можно было бы не тупо копипастить, а просто вызывать из родительской библиотеки. Да и ассортимент поддерживаемых дисплеев сразу расширился с одной модели до нескольких десятков.
Справедливости ради - идея со списком символов в фонте хороша. Разобрался и вижу. что в Адафруите такого нет. Но если не ошибаюсь, это единственная новинка, которая отличают ваши фонты от Адафруит. Тем правильнее было бы не городить вокруг этого совсем новую библмиотеку, а встроить лист символов в Адафруит.
пожалуй, я вашу идею со списком запомню... может пригодится в моих поделках
b707 Спасибо за анализ. При разработке библиотеки и обслуживающих её программы ставилась простая задача - как можно дальше дистанцироваться от библиотек Adafruit - чтобы, как Вы верно отметили, не было обвинений, что что-то сперли. В латинском языке всего 26 символов -убогий набор символов для названия функций библиотек. Совпадения в названиях функций возможны, тем более, что есть просто устаканенные названия функций. и тем не менее: любые совпадения - не более чем случайность: согласитесь, что воровать и выкладывать это на всеобщее обозрение - невиданная глупость. При разработке обозначенной библиотеки были проанализированы все доступные библиотеки (или почти все ;) и оригинальные и основанные на Adafruit - у всех библиотек имелся общий недостаток - сложность компилирования шрифтов, необходимость наличия посильных знаний у пользователей, применяющих эти библиотеки - а ведь как известно - платформа Arduino и создана для того, что бы пользователи, не обладающие всем объемом специальных знаний, могли спокойно конструировать потребные им вещи. Согласитесь -конверторы кириллицы в шрифтах Adafruit - уже напряг для рядового пользователя, и таких проблем можно найти множество. Гораздо проще предоставить конечному пользователю удобную библиотеку и обслуживающие ее программы. Ведь не всегда требуется отображать видео из последнего блокбастера. У нас возникла следующая задача - на Arduino Nano построить контроллер управления УМЗЧ - со всеми прилагаемыми функциями - управлением громкостью, балансом, тембром, переключением входов, контролем защиты АС, управлением от IR-пульта, многоуровневым меню - и т.д. и тп. и все на Nano - именно здесь Adafruit и просело - простите, эта библиотека просто жрала память микроконтроллера. Adafruit - прекрасная, мощная библиотека, хвала ей и честь! Но при реализации определенных задач - как слон в посудной лавке.
b707. В дополнение. Функции вывода графических примитивов - оригинальные, посмотрите внимательно отрисовку окружностей, закругленных прямоугольников и т. д. А что касается вывода на экран шрифтов и изображений - то из-за оригинальной структуры шрифтов и изображений - обозначенные функции совпадать не могут, по определению. Еще раз благодарю Stanley Huang (http://arduinodev.com) за код, использованный в предлагаемой библиотеке.
При разработке библиотеки и обслуживающих её программы ставилась простая задача - как можно дальше дистанцироваться от библиотек Adafruit - чтобы, как Вы верно отметили, не было обвинений, что что-то сперли. Совпадения в названиях функций возможны, и тем не менее: любые совпадения - не более чем случайность: согласитесь, что воровать и выкладывать это на всеобщее обозрение - невиданная глупость.
простите, но если вы хотели избежать обвинений в плагиате - вы выбрали очень странный путь. Скопипровать чужую библиотеку, поменяв названия и имена функций и старательно делать вид, что вы все придумали сами - это и есть плагиат в самом худшем виде. А то что ваша библиотека - клон Адафруит, очевидно любому, кто серьезно работал с библиотекой.
Достаточно сравнить формат фонтов в адафруте и у вас. Фонт Адафруит состоит из двух отдельных массивов - в одном хранятся битмапы символов, в другом - размеры и отступы каждой буквы. У вас - полная копия, даже описание структур практически совпадают. Отличительной особенностью фонтов Адафруит является то, что в битмапе хранятся только "закрашенные" пиксели - ровно как у вас, причем вы бесстыдно подаете это как свое достижение - "в компилированном файле шрифта содержатся не полные знакоместа символов, а только их активные части, что дополнительно снижает объем задействованной памяти микроконтроллера."
да что говорить, давайте просто сравним форматы, вот ваш
а вот адафруит
и в чем разница? что вы поменяли названия полей и переставили их местами?
Простите, но все это больше похоже на неуклюжие попытки замести следы.
А поступить честно было очень просто. Лицензия библиотеки Адафруит не запрещает модифицировать ее для своих нужд. Главное - сохранить в коде ссылки на оригинал. Гораздо честнее было не скрывать, что вы стартовали свою разработку на основе Адафруит. Еще правильнее было бы, как я уже писал - унаследовать класс своей библиотеки от Адафруит, что автоматически обеспечило бы вам продвижение в ардуиносообщество. посколько адафруит используется в куче проектов.
Но вы выбрали кривой путь - скопировать чужую либу и выдать за свою. Это воровство.
При разработке библиотеки и обслуживающих её программы ставилась простая задача - как можно дальше дистанцироваться от библиотек Adafruit - чтобы, как Вы верно отметили, не было обвинений, что что-то сперли.
Надо сказать, очень странная задача.
Вот просто попытайтесь ответить: зачем пользователю библиотека, максимально дистанцированная от Адафрут?
При разработке библиотеки и обслуживающих её программы ставилась простая задача - как можно дальше дистанцироваться от библиотек Adafruit - чтобы, как Вы верно отметили, не было обвинений, что что-то сперли.
Надо сказать, очень странная задача.
да ну, совершенно понятная задача :) - максимально замаскировать родство своей библиотеки с адафруит, чтобы выдать ее за свою оригинальную разработку и в дальнейшем ее продавать ... ну или просто "для престижу". Ребята не понимают, что эта самая "задача" дистанцирования - как раз выдает их с головой. Тут. что называется. "на воре шапка горит".
А если речь шла бы о заботе о пользователях Ардуино, как нас пытаюстся уверить - улучшить библиотеку Адафруит можно не скрывая оригинальных копирайтов. Лицензия GPL не запрещает модификацию кода. Но продать ее как свою тогда было бы трудно :)
ТС'а случаем не Александр Майоров (ака гивер), зовут ?
Методы присваивания библиотек и манера общения один в один
здесь Adafruit и просело - простите, эта библиотека просто жрала память микроконтроллера.
Так давно известный факт. Хочешь масштабируемый шрифт - делай векторный.
А че 707 так возбудился то? Если реально
" При выводе одной и той же строки текста тремя шрифтами в первом примере загрузка памяти (для Arduino Nano) составляет 74%, во втором - 19%."
Эффект налицо, слава гиверу!
А че 707 так возбудился то? Если реально
" При выводе одной и той же строки текста тремя шрифтами в первом примере загрузка памяти (для Arduino Nano) составляет 74%, во втором - 19%."
Эффект налицо, слава гиверу!
Ну так при использовании специально подобранного примера можно получить любой желаемый заранее результат.
Уверен, что можно привести и другой пример - где описываемая библиотека будет жрать больше памяти.
Так давно известный факт. Хочешь масштабируемый шрифт - делай векторный.
А нет универсальной функции, скажем картинку 8*8 пикселей в 16*16, 32*32 и т.д. на экранчик выводить? Просто тогда храним 1 шрифт.
но тогда пиксели станут большими и квадратными. Иногда можно терпеть, но в целом не блеск
А че 707 так возбудился то? Если реально
" При выводе одной и той же строки текста тремя шрифтами в первом примере загрузка памяти (для Arduino Nano) составляет 74%, во втором - 19%."
Эффект налицо, слава гиверу!
Ну так при использовании специально подобранного примера можно получить любой желаемый заранее результат.
Уверен, что можно привести и другой пример - где описываемая библиотека будет жрать больше памяти.
Ну если так - определить условия, при которых лучше та или иная либа. Может автор сам и подскажет, когда его код хуже адафрукта.
b707, Спасибо. Метрика шрифта описывается многими параметрами - tmHeight, tmAscent, tmDescent, tmInternalLeading, tmExternalLeading и ещё 15 параметров - структура tagTEXTMETRIC. Использование этой структуры - плагиат? Посмотрите внимательно на нашу структуру описания шрифта - текущий код символа, отступ от верха знакоместа до значимой части символа, действительные ширина и высота символа, дистанция между символами, размер текущего символа в байтах, адрес начала изображения символа в массиве шрифта - что здесь украдено у Adafruit? Ширина и высота -так в Adafruit передаются параметры знакоместа символа, которые значительно больше реального начертания символа, или сами параметры width и height нельзя использовать?
Если реально
" При выводе одной и той же строки текста тремя шрифтами в первом примере загрузка памяти (для Arduino Nano) составляет 74%, во втором - 19%."
Эффект налицо, слава гиверу!
так никто не спорит, идея с выкидыванием лишних букв из фонта довольно интересная. Если у тебя в программе только две надписи "Start" и "Stop" - то понятно что если выкинуть из фонта все остальные буквы - программа займет в памяти значительно меньше места :)
А возбудился я совсем по иному поводу. Формат фонта, упаковка символов, вообще вся логика библиотеки - 100% слизана у Адафруит. В таких случаях принято хотя бы в шапке библиотеки сделать ссылку на оригинал и отметить. что твоя либа создана на базе такой-то и такой-то. Ребята же откровенно присвоили чужие разработки. Более того, они очевидно заметали следы, делая свое творение непохожим на оригинал - меняли названия методов, переставили поля в структуре шрифта. Но это бес толку, тот кто работал с адафруит - тут же узнает ее в этом творении
b707, Спасибо. В открытом коде речи о продаже не может идти.
Посмотрите внимательно на нашу структуру описания шрифта - текущий код символа, отступ от верха знакоместа до значимой части символа, действительные ширина и высота символа, дистанция между символами, размер текущего символа в байтах, адрес начала изображения символа в массиве шрифта - что здесь украдено у Adafruit?
да все :) кроме кода символа, который реально не нужен, потому что вычисляется из кода первого символа и позиции в архиве
Вот, иду прям по вашему тексту:
- отступ от верха знакоместа до значимой части символа -
у вас - uint8_t topoffset; у адафруит - int8_t yOffset;
-действительные ширина и высота символа,
snaab - realwidth realheight adafruint - width height (эти парметры у адафруит - полностью аналогичны вашим "реальным" ширине и высоте. читайте описание)
-дистанция между символами,
snaab - space adafruit - xAdvance
-- размер текущего символа в байтах и адрес начала изображения символа в массиве шрифта
snaab - blocksize blockstart адафруит тут обходится только одним bitmapOffset, потому что размер легко вычисляется из разницы соседних оффсетов
Итого структура шрифта ПОЛНОСТЬЮ слизана у Адафруит. включая самую интересную "изюминку" - хранение упакованных битмапов, содержащих только значимые пиксели символа.
snaab, судя по тому, как вы спорите с очевидным - вы, похоже, сам не программист и этот код не писали и даже не очень читали., верно?
Если вам эту либу написал Stanley Huang (http://arduinodev.com) , как вы пишете выше - значит это не вы, а он скопипастил код от адафруит. Если вы за это еще и денег заплатили как за оригинальную разработку - остается посочуствовать. Но в том. что это плагиат - можете не сомневатся, все "отличия" вашей библиотеки от адафруит шиты белыми нитками.
b707, Спасибо. Давайте внимательно рассмотрим предлагаемую структуру описания шрифта. Пожалуйста, запустите программу SNAAB FontEditor, выберите любые шрифт и символ. Значимая часть знакоместа символа, т.е. та, которую и необходимо переносить в память микроконтроллера, будет ограничена прямоугольником красного цвета. Зачем передавать отступ слева от начала знакоместа до значимой части символа? Это необходимо в векторных, масштабируемых шрифтах. В растровых шрифтах, которые используются в данной библиотеке - смысла нет, усекаем. Зачем в растровом шрифте передавать все, что ниже базовой линии, если там нет изображения символа - усекаем. Зачем передавать правую часть знакоместа, где нет отображения символа - усекаем и передаем только расстояние до следующего символа в строке. При такой организации нужно передавать отступ от верха знакоместа до значимой части символа - она разная у символов, передавать реальные размеры каждого символа - согласитесь, буквы ш и точка имеют разную ширину и высоту, нужно передавать реальные размеры каждого символа в байтах и адрес начала каждого символа в массиве шрифта. Что здесь украдено у Adafruit?
выберите любые шрифт и символ. Значимая часть знакоместа символа, т.е. та, которую и необходимо переносить в память микроконтроллера, будет ограничена прямоугольником красного цвета. Зачем передавать отступ слева от начала знакоместа до значимой части символа? Это необходимо в векторных, масштабируемых шрифтах. В растровых шрифтах, которые используются в данной библиотеке - смысла нет, усекаем. Зачем в растровом шрифте передавать все, что ниже базовой линии, если там нет изображения символа - усекаем. Зачем передавать правую часть знакоместа, где нет отображения символа - усекаем и передаем только расстояние до следующего символа в строке. При такой организации нужно передавать отступ от верха знакоместа до значимой части символа - она разная у символов, передавать реальные размеры каждого символа - согласитесь, буквы ш и точка имеют разную ширину и высоту, нужно передавать реальные размеры каждого символа в байтах и адрес начала каждого символа в массиве шрифта. Что здесь украдено у Adafruit?
Что здесь украдено у Adafruit? - ВСЕ
надеюсь, вы читаете по английски? Посмотрите описание формата фонта Адафруит: https://glenviewsoftware.com/projects/products/adafonteditor/adafruit-gfx-font-format/ и сравните с тем, что написали вы.
Вы убедитесь, что весь ваш новаторский принцип не хранить пустоты вокруг символа - 100% плагиат.
картинка из мануала Адафруит:
Тут показан символ кавычки. Внешний размер знакоместа практически равен размеру символа "b" справа, но в матрице фонта хранится только маленький прямоугольничек размерами width x height
snaab, похоже ваш программист с китайской фамилией вас подставил - продал вам перелицованную библиотеку Адафруит :)))
Пожалуйста, запустите программу SNAAB FontEditor,
Совпадения продолжаются? :)
Вы в курсе, что в Адафруите тоже есть фонт эдитор, преобразующий TTF фонты в структуру, описанную выше? - как-то подозрительно похоже на вашу програму, не находите?
интересно, а ваш фонт-эдитор не тот же программист писал? не удивлюсь, если ваша программа - лишь оболочка к фонтэдитору адафруит.
Дорого заплатили то?
b707, Спасибо. Бедный Stanley Huang, но упрекать его не следует. Из его разработки взята только инициализация дисплея, обращение к столбцам и строкам. Не более.
b707, Спасибо. Бедный Stanley Huang, но упрекать его не следует. Из его разработки взята только инициализация дисплея, обращение к столбцам и строкам. Не более.
ну значит у этого плагиата другой "автор". Надеюсь это не вы - уж слишком наивно вы бросились опровергать очевидное. Похоже вы и правда не знали, что вся ваша библиотека краденая. Ну или настолько бесстыдны. что умеете врать прямо в глаза.
хотя. конечно, не исключен и обратный вариант - это Адафруит подсмотрел вашу разработку и быстренько внедрил метод упаковки битмапа в свои фонты :)))))
b707, Спасибо. Кроме конвертора от Adafruit есть еще много других - например, MicroElectronika GLCD Font Creator, Fony, CXFontGenerator, TheDotFactory и тд.
b707, Спасибо. Кроме конвертора от Adafruit есть еще много других - например, MicroElectronika GLCD Font Creator, Fony, CXFontGenerator, TheDotFactory и тд.
Про ваш фонтэдитор я утверждать не могу - я его не изучал и даже не скачивал... и не хочу.
Но если его вам писали за деньги и вы заказчик - я бы вам советовал попросить независмого программиста сделать экспертизу. Возможно, авторы софта вас обманывают.
Ну что, надеюсь по поводу вашей библиотеки сомнений больше нет? Может для справедливости попросим снести ветку. чтобы не позорится?