Библиотека SNAAB ILI9341 и редактор шрифта

snaab
Offline
Зарегистрирован: 22.09.2021

При разработке одного из проектов на 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), распространяемой свободно.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Спасибо.

b707
Offline
Зарегистрирован: 26.05.2017

Посмотрите шрифты Адафруит, там все это есть - таблица символов, кодирование только закрашенных точек, непрерывные битмапы... может и не стоило изобретать велосипед?

b707
Offline
Зарегистрирован: 26.05.2017

Посмотрел код - очевидно, что про Адафруит вы знаете :) , ибо структура фонта один в один передрана оттуда :) Да и сама библиоека на 90% просто копипаст. Как-то некрасиво получается называть это все своим именем - хоть бы упомянули, на основе чего сделана "ваша" библиотека.

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

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

пожалуй, я вашу идею со списком запомню... может пригодится в моих поделках

snaab
Offline
Зарегистрирован: 22.09.2021

b707 Спасибо за анализ. При разработке библиотеки и обслуживающих её программы ставилась простая задача - как можно дальше дистанцироваться от библиотек Adafruit - чтобы, как Вы  верно отметили, не было обвинений, что что-то сперли. В латинском языке всего 26 символов -убогий набор символов для названия функций библиотек. Совпадения в названиях функций возможны, тем более, что есть просто устаканенные названия функций. и тем не менее: любые совпадения - не более чем случайность: согласитесь, что воровать и выкладывать это на всеобщее обозрение - невиданная глупость.  При разработке обозначенной библиотеки были проанализированы все доступные библиотеки (или почти все ;) и оригинальные и основанные на Adafruit - у всех библиотек имелся общий недостаток - сложность компилирования шрифтов, необходимость наличия посильных знаний у пользователей, применяющих эти библиотеки - а ведь как известно - платформа Arduino  и создана для того, что бы пользователи, не обладающие всем объемом специальных знаний, могли спокойно конструировать потребные им вещи. Согласитесь -конверторы кириллицы в шрифтах Adafruit - уже напряг для рядового пользователя, и таких проблем можно найти множество. Гораздо проще предоставить конечному пользователю удобную библиотеку и обслуживающие ее программы. Ведь не всегда требуется отображать видео из последнего блокбастера. У нас возникла следующая задача - на Arduino Nano построить контроллер управления УМЗЧ - со всеми прилагаемыми функциями - управлением громкостью, балансом, тембром, переключением входов, контролем защиты АС, управлением от IR-пульта, многоуровневым меню - и т.д. и тп. и все на Nano - именно здесь Adafruit и просело - простите, эта библиотека просто жрала память микроконтроллера. Adafruit - прекрасная, мощная библиотека, хвала ей и честь! Но при реализации  определенных задач - как слон в посудной лавке.

snaab
Offline
Зарегистрирован: 22.09.2021

b707. В дополнение. Функции вывода графических примитивов - оригинальные, посмотрите внимательно отрисовку окружностей, закругленных прямоугольников и т. д.  А что касается вывода на экран шрифтов и изображений - то из-за оригинальной структуры шрифтов и изображений - обозначенные функции совпадать не могут, по определению. Еще раз благодарю Stanley Huang (http://arduinodev.com) за код, использованный в предлагаемой библиотеке.

b707
Offline
Зарегистрирован: 26.05.2017

snaab пишет:

При разработке библиотеки и обслуживающих её программы ставилась простая задача - как можно дальше дистанцироваться от библиотек Adafruit - чтобы, как Вы  верно отметили, не было обвинений, что что-то сперли. Совпадения в названиях функций возможны,  и тем не менее: любые совпадения - не более чем случайность: согласитесь, что воровать и выкладывать это на всеобщее обозрение - невиданная глупость. 

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

Достаточно сравнить формат фонтов в адафруте и у вас. Фонт Адафруит состоит из двух отдельных массивов - в одном хранятся битмапы символов, в другом - размеры и отступы каждой буквы. У вас - полная копия, даже описание структур практически совпадают. Отличительной особенностью фонтов Адафруит является то, что в битмапе хранятся только "закрашенные" пиксели - ровно как у вас, причем вы бесстыдно подаете это как свое достижение - "в компилированном файле шрифта содержатся не полные знакоместа символов, а только их активные части, что дополнительно снижает объем задействованной памяти микроконтроллера."

да что говорить, давайте просто сравним форматы, вот ваш

/*************************************************************************
* The CharInfo structure contains information about the font character.
* For more details, see SNAAB FontEditor (www.snaabsys.ru)
*************************************************************************/
typedef struct {
  uint8_t  code;          // current code 
  uint8_t  topoffset;     // top offset of character in pixels
  uint8_t  realwidth;     // real width of character in pixels
  uint8_t  realheight;    // real height of character in pixels
  uint8_t  space;         // distance between characters in pixels  
  uint16_t blocksize;     // size in bytes of character
  uint16_t blockstart;    // start of characters
} CharInfo;

а вот адафруит

/// Font data stored PER GLYPH
typedef struct {
	uint16_t bitmapOffset;     ///< Pointer into GFXfont->bitmap
	uint8_t  width;            ///< Bitmap dimensions in pixels
        uint8_t  height;           ///< Bitmap dimensions in pixels
	uint8_t  xAdvance;         ///< Distance to advance cursor (x axis)
	int8_t   xOffset;          ///< X dist from cursor pos to UL corner
        int8_t   yOffset;          ///< Y dist from cursor pos to UL corner
} GFXglyph;

и в чем разница? что вы поменяли названия полей и переставили их местами?

Простите, но все это больше похоже на неуклюжие попытки замести следы.

А поступить честно было очень просто. Лицензия библиотеки Адафруит не запрещает модифицировать ее для своих нужд. Главное - сохранить в коде ссылки на оригинал. Гораздо честнее было не скрывать, что вы стартовали свою разработку на основе Адафруит. Еще правильнее было бы, как я уже писал - унаследовать класс своей библиотеки от Адафруит, что автоматически обеспечило бы вам продвижение в ардуиносообщество. посколько адафруит используется в куче проектов.

Но вы выбрали кривой путь - скопировать чужую либу и выдать за свою. Это воровство.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

snaab пишет:

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

Надо сказать, очень странная задача.

Вот просто попытайтесь ответить: зачем пользователю библиотека, максимально дистанцированная от Адафрут?

b707
Offline
Зарегистрирован: 26.05.2017

andriano пишет:

snaab пишет:

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

Надо сказать, очень странная задача.

да ну, совершенно понятная задача :) - максимально замаскировать родство своей библиотеки с адафруит, чтобы выдать ее за свою оригинальную разработку и в дальнейшем ее продавать ... ну или просто "для престижу". Ребята не понимают, что эта самая "задача" дистанцирования - как раз выдает их с головой. Тут. что называется. "на воре шапка горит".

А если речь шла бы о заботе о пользователях Ардуино, как нас пытаюстся уверить - улучшить библиотеку Адафруит можно не скрывая оригинальных копирайтов. Лицензия GPL не запрещает модификацию кода. Но продать ее как свою тогда было бы трудно :)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ТС'а случаем не Александр Майоров (ака гивер), зовут ?
Методы присваивания библиотек и манера общения один в один

Logik
Offline
Зарегистрирован: 05.08.2014

snaab пишет:

 здесь Adafruit и просело - простите, эта библиотека просто жрала память микроконтроллера.

Так давно известный факт. Хочешь масштабируемый шрифт - делай векторный.

Logik
Offline
Зарегистрирован: 05.08.2014

А че 707 так возбудился то? Если реально

" При выводе одной и той же строки текста тремя шрифтами в первом примере загрузка памяти (для Arduino Nano) составляет 74%, во втором - 19%."

Эффект налицо, слава гиверу!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Logik пишет:

А че 707 так возбудился то? Если реально

" При выводе одной и той же строки текста тремя шрифтами в первом примере загрузка памяти (для Arduino Nano) составляет 74%, во втором - 19%."

Эффект налицо, слава гиверу!

Ну так при использовании специально подобранного примера можно получить любой желаемый заранее результат.

Уверен, что можно привести и другой пример - где описываемая библиотека будет жрать больше памяти.

lilik
Offline
Зарегистрирован: 19.10.2017

Logik пишет:

Так давно известный факт. Хочешь масштабируемый шрифт - делай векторный.

А нет универсальной функции, скажем картинку 8*8 пикселей в 16*16, 32*32 и т.д. на экранчик выводить? Просто тогда храним 1 шрифт.

Logik
Offline
Зарегистрирован: 05.08.2014

но тогда пиксели станут большими и квадратными. Иногда можно терпеть, но в целом не блеск

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

Logik пишет:

А че 707 так возбудился то? Если реально

" При выводе одной и той же строки текста тремя шрифтами в первом примере загрузка памяти (для Arduino Nano) составляет 74%, во втором - 19%."

Эффект налицо, слава гиверу!

Ну так при использовании специально подобранного примера можно получить любой желаемый заранее результат.

Уверен, что можно привести и другой пример - где описываемая библиотека будет жрать больше памяти.

Ну если так - определить условия, при которых лучше та или иная либа. Может автор сам и подскажет, когда его код хуже адафрукта.

snaab
Offline
Зарегистрирован: 22.09.2021

b707, Спасибо. Метрика шрифта описывается многими параметрами - tmHeight,  tmAscent, tmDescent, tmInternalLeading, tmExternalLeading и ещё 15 параметров - структура tagTEXTMETRIC. Использование этой структуры - плагиат? Посмотрите внимательно на нашу структуру описания шрифта - текущий код символа, отступ от верха знакоместа до значимой части символа, действительные ширина и высота символа, дистанция между символами, размер текущего символа в байтах, адрес начала изображения символа в массиве шрифта - что здесь украдено у Adafruit? Ширина и высота -так в Adafruit передаются параметры знакоместа символа, которые значительно больше реального начертания символа, или сами параметры width  и height нельзя использовать?

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

 Если реально

" При выводе одной и той же строки текста тремя шрифтами в первом примере загрузка памяти (для Arduino Nano) составляет 74%, во втором - 19%."

Эффект налицо, слава гиверу!

так никто не спорит, идея с выкидыванием лишних букв из фонта довольно интересная. Если у тебя в программе только две надписи "Start" и "Stop" - то понятно что если выкинуть из фонта все остальные буквы - программа займет в памяти значительно меньше места :)

А возбудился я совсем по иному поводу. Формат фонта, упаковка символов, вообще вся логика библиотеки - 100% слизана у Адафруит. В таких случаях принято хотя бы в шапке библиотеки сделать ссылку на оригинал и отметить. что твоя либа создана на базе такой-то и такой-то. Ребята же откровенно присвоили чужие разработки. Более того, они очевидно заметали следы, делая свое творение непохожим на оригинал - меняли названия методов, переставили поля в структуре шрифта. Но это бес толку, тот кто работал с адафруит - тут же узнает ее в этом творении

snaab
Offline
Зарегистрирован: 22.09.2021

b707, Спасибо. В открытом коде речи о продаже не может идти.

b707
Offline
Зарегистрирован: 26.05.2017

snaab пишет:

Посмотрите внимательно на нашу структуру описания шрифта - текущий код символа, отступ от верха знакоместа до значимой части символа, действительные ширина и высота символа, дистанция между символами, размер текущего символа в байтах, адрес начала изображения символа в массиве шрифта - что здесь украдено у Adafruit?

да все :)  кроме кода символа, который реально не нужен, потому что вычисляется из кода первого символа и позиции в архиве

Вот, иду прям по вашему тексту:

- отступ от верха знакоместа до значимой части символа -
у вас - uint8_t  topoffset;     у адафруит  - int8_t   yOffset;

-действительные ширина и высота символа,
snaab - realwidth realheight   adafruint - width height (эти парметры у адафруит - полностью аналогичны вашим "реальным" ширине и высоте. читайте описание)

-дистанция между символами,
snaab - space      adafruit - xAdvance

-- размер текущего символа в байтах и адрес начала изображения символа в массиве шрифта
snaab - blocksize blockstart  адафруит тут обходится только одним bitmapOffset, потому что размер легко вычисляется из разницы соседних оффсетов

 

Итого структура шрифта ПОЛНОСТЬЮ слизана у Адафруит. включая самую интересную "изюминку" - хранение упакованных битмапов, содержащих только значимые пиксели символа.
 

 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

snaab, судя по тому, как вы спорите с очевидным - вы, похоже, сам не программист и этот код не писали и даже не очень читали., верно?

Если вам эту либу написал Stanley Huang (http://arduinodev.com) , как вы пишете выше - значит это не вы, а он скопипастил код от адафруит. Если вы за это еще и денег заплатили как за оригинальную разработку - остается посочуствовать. Но в том. что это плагиат - можете не сомневатся, все "отличия" вашей библиотеки от адафруит шиты белыми нитками.

snaab
Offline
Зарегистрирован: 22.09.2021

b707, Спасибо. Давайте внимательно рассмотрим предлагаемую структуру описания шрифта. Пожалуйста, запустите программу SNAAB FontEditor, выберите любые шрифт и символ. Значимая часть знакоместа символа, т.е. та, которую и необходимо переносить в память микроконтроллера, будет ограничена прямоугольником красного цвета. Зачем передавать отступ слева от начала знакоместа до значимой части символа? Это необходимо в векторных, масштабируемых шрифтах. В растровых шрифтах, которые используются в данной библиотеке - смысла нет, усекаем. Зачем в растровом шрифте передавать все, что ниже базовой линии, если там нет изображения символа - усекаем. Зачем передавать правую часть знакоместа, где нет отображения символа - усекаем и передаем только расстояние до следующего символа в строке. При такой организации нужно передавать отступ от верха знакоместа до значимой части символа - она разная у символов, передавать реальные размеры каждого символа - согласитесь, буквы ш и точка имеют разную ширину и высоту, нужно передавать реальные размеры каждого символа в байтах и адрес начала каждого символа в массиве шрифта. Что здесь украдено у Adafruit?

b707
Offline
Зарегистрирован: 26.05.2017

snaab пишет:

выберите любые шрифт и символ. Значимая часть знакоместа символа, т.е. та, которую и необходимо переносить в память микроконтроллера, будет ограничена прямоугольником красного цвета. Зачем передавать отступ слева от начала знакоместа до значимой части символа? Это необходимо в векторных, масштабируемых шрифтах. В растровых шрифтах, которые используются в данной библиотеке - смысла нет, усекаем. Зачем в растровом шрифте передавать все, что ниже базовой линии, если там нет изображения символа - усекаем. Зачем передавать правую часть знакоместа, где нет отображения символа - усекаем и передаем только расстояние до следующего символа в строке. При такой организации нужно передавать отступ от верха знакоместа до значимой части символа - она разная у символов, передавать реальные размеры каждого символа - согласитесь, буквы ш и точка имеют разную ширину и высоту, нужно передавать реальные размеры каждого символа в байтах и адрес начала каждого символа в массиве шрифта. Что здесь украдено у Adafruit?

Что здесь украдено у Adafruit?  - ВСЕ

надеюсь, вы читаете по английски? Посмотрите описание формата фонта Адафруит: https://glenviewsoftware.com/projects/products/adafonteditor/adafruit-gfx-font-format/ и сравните с тем, что написали вы.

Вы убедитесь, что весь ваш новаторский принцип не хранить пустоты вокруг символа - 100% плагиат.

b707
Offline
Зарегистрирован: 26.05.2017

картинка из мануала Адафруит:

Тут показан символ кавычки. Внешний размер знакоместа практически равен размеру символа "b" справа, но в матрице фонта хранится только маленький прямоугольничек размерами width x height

snaab, похоже ваш программист с китайской фамилией вас подставил - продал вам перелицованную библиотеку Адафруит :)))

b707
Offline
Зарегистрирован: 26.05.2017

snaab пишет:

Пожалуйста, запустите программу SNAAB FontEditor,

Совпадения продолжаются? :)

 Вы в курсе, что в Адафруите тоже есть фонт эдитор, преобразующий TTF фонты в структуру, описанную выше? - как-то подозрительно похоже на вашу програму, не находите?

интересно, а ваш фонт-эдитор не тот же программист писал? не удивлюсь, если ваша программа - лишь оболочка к фонтэдитору адафруит.

 

Дорого заплатили то?

snaab
Offline
Зарегистрирован: 22.09.2021

b707, Спасибо. Бедный Stanley Huang, но упрекать его не следует. Из его разработки взята только инициализация дисплея, обращение к столбцам и строкам. Не более.

b707
Offline
Зарегистрирован: 26.05.2017

snaab пишет:

b707, Спасибо. Бедный Stanley Huang, но упрекать его не следует. Из его разработки взята только инициализация дисплея, обращение к столбцам и строкам. Не более.

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

b707
Offline
Зарегистрирован: 26.05.2017

хотя. конечно, не исключен и обратный вариант - это Адафруит подсмотрел вашу разработку и быстренько внедрил метод упаковки битмапа в свои фонты :)))))

snaab
Offline
Зарегистрирован: 22.09.2021

b707, Спасибо. Кроме конвертора от Adafruit есть еще много других - например, MicroElectronika GLCD Font Creator, Fony, CXFontGenerator, TheDotFactory и тд.

b707
Offline
Зарегистрирован: 26.05.2017

snaab пишет:

b707, Спасибо. Кроме конвертора от Adafruit есть еще много других - например, MicroElectronika GLCD Font Creator, Fony, CXFontGenerator, TheDotFactory и тд.

Про ваш фонтэдитор я утверждать не могу - я его не изучал и даже не скачивал...  и не хочу.

Но если его вам писали за деньги и вы заказчик - я бы вам советовал попросить независмого программиста сделать экспертизу. Возможно, авторы софта вас обманывают.

 

Ну что, надеюсь по поводу вашей библиотеки сомнений больше нет? Может для справедливости попросим снести ветку. чтобы не позорится?