TheDotFactory формат

Скажите плиз кто работал с TDF
создает файл .с , а в нем массив , дескрипторы и вот такая запись

// 
//  Font data for Times New Roman 8pt
// 

// Character bitmaps for Times New Roman 8pt
const uint_8 timesNewRoman_8ptBitmaps[] = 
{
	// @0 'Q' (7 pixels wide)
	0x38, //   --###--
	0x44, //   -#---#-
	0x82, //   #-----#
	0x82, //   #-----#
	0x82, //   #-----#
	0x82, //   #-----#
	0x44, //   -#---#-
	0x38, //   --###--
	0x08, //   ----#--
	0x06, //   -----##
};

// Character descriptors for Times New Roman 8pt
// { [Char width in bits], [Offset into timesNewRoman_8ptCharBitmaps in bytes] }
const FONT_CHAR_INFO timesNewRoman_8ptDescriptors[] = 
{
	{7, 0}, 		// Q 
};

// Font information for Times New Roman 8pt
const FONT_INFO timesNewRoman_8ptFontInfo =
{
	2, //  Character height
	'Q', //  Start character
	'Q', //  End character
	2, //  Width, in pixels, of space character
	timesNewRoman_8ptDescriptors, //  Character descriptor array
	timesNewRoman_8ptBitmaps, //  Character bitmap array
};

Никак не разберусь , что за
2, // Character height
высота-то 8 и что за ширина пробела
2, // Width, in pixels, of space character

спасибо

если без пробела две Q подряд вывести - они же склеенные получатся, верно?

--###----###--
-#---#--#---#-
#-----##-----#
#-----##-----#
#-----##-----#
#-----##-----#
-#---#--#---#-
--###----###--
----#------#--
-----##-----##

--###------###--
-#---#----#---#-
#-----#--#-----#
#-----#--#-----#
#-----#--#-----#
#-----#--#-----#
-#---#----#---#-
--###------###--
----#--------#--
-----##-------##

насчет высоты хз, может тоже межстрочный интервал в пикселях, или высота строки как множитель к высоте символа

Элементарный подсчет говорит, что если строки с 9 по 18, то это 10 строк, а не 8. А дальше остается только гадать:

  • указано количество пикселей сверх значения 8,
  • указан межстрочный интервал в пикселях,
  • указана высота знакоместа в байтах, считая, что один пиксель - один бит.

думаю, назначение полей можно установить, посмотрев исходники вывода на экран

Если знаете процедуру вывода символа по шаблону TDF или библиотеку которая TDF использует. укажите ссылку.Я изучу… просто не нашел примера . Мне собственно и надо для моей реализации вывода…т.к сейчас моя процедура использует из примеров стм32 готовые . естественно мало и без кирилицы…
Спасибо

можно ссылку?

ссылку чего ?

ссылку на пример кода с использованием TDF… или что вы там имели в виду, когда писали:

TDF в разработке пытаюсь на него перейти , а пока использую шрифты встроеные в STM32 их всего 5 штук где-то , и они сильно урезаные

Может так:

const FONT_INFO timesNewRoman_8ptFontInfo =
{
2, // Character height ----высота пробела
‘Q’, // Start character
‘Q’, // End character
2, // Width, in pixels, of space character— ширина пробела
timesNewRoman_8ptDescriptors, // Character descriptor array
timesNewRoman_8ptBitmaps, // Character bitmap array
};

const FONT_CHAR_INFO timesNewRoman_8ptDescriptors =
{
{7, 0}, // Q семь столбцов, пробел
};

Это для экономии памяти сделано ИМХО.

Разные вариации не на что не повлияли .. но это уже не важно. я тут нашел более интересный формат в TDF с жатием RLE его ковыряю

Так надо всё “в комплексе” менять

“Пробел” - это, вероятно, кернинг.

Возможно, я не силён в этой теме. Имел ввиду отступы сверху и сбоку.
Чтобы в знакогенераторе постоянно на одном и том же месте нули не писать, один раз в структуре описывается

В СТМ32 есть встроенные шрифты?
Опять же, можно ссылку?

@karasik_mk1 , если бы вы начились правильно задавать вопросы, насколько всем проще было бы… и даже Вам самому.
Шрифты скорее всего в какой-то графической библиотеке… и шрифтов этих просто море без всяких TDF… вы просто не умеете искать.

Кирилица двух байтная и просто так воткнуть шрифт с чужой библы не получиться , (да и если даже найти … сегодня мне нужно мелкий уплотненный, завтра - большой и толстый.. гораздо проще разобраться как их самому сделать , чтоб потом не рыскать по всему интернету теряя кучу времени…
Но буду очень признателен если Вы мне найдете хоть один для стм32 с поддержкой кирилицы (ssd1963) маштабируемый
А насчет вопроса … Что не так спросил ? Кто работал и за что отвечает параметр… Что тут не так можно понять если работаешь с TDF.
Ссыль на используемые фонты - C:\ctm32\repository\STM32Cube_FW_F4_V1.28.0\Utilities\Fonts это встроенные в стм32 кубе

И да …я уже написал - вопрос про кто работал , актуален . про параметр нет! т.к нашел в TDF возможность делать запакованный шрифт , который экономит память т.к встроенной ее всегда маловато :slight_smile: , а у него формат совсем другой…
В принципе подвижки есть , но столкнулся с проблемой .. как посчитать кол-во символов в си, у не терменируемой строки , если она содержит и латиницу и кирилицу , а также как узнать на сколько байт сдвигать счетчик на 1 или на 2 байта (в зависимости кирилица или латиница) в строке которая находиться const char* pStr например Pstring_RLE(10, 210, WHITE, BLACK, "АВБабвASDFGHasdfgh12345",2);

Вроде понял…

Было на форуме, поиск рулит.

я уже разобрался

Вдруг понадобится, дл, utf 8
‘’’
inline unsigned char calcBytesInCharUTF8(const unsigned char * inChar) {
if ((inChar) <= 0x7F) {
return 1;
} else if (((inChar) >= 0xC2) && ((inChar) <= 0xDF) && ((inChar + 1) >= 0x80) && ((inChar + 1) <= 0xBF)) {
return 2;
} else if (((inChar) >= 0xE1) && ((inChar) <= 0xEC) && ((inChar + 1) >= 0x80) && ((inChar + 1) <= 0xBF) && (
(inChar + 2) >= 0x80) && ((inChar + 2) <= 0xBF)) {
return 3;
} else if (((inChar) >= 0xEE) && ((inChar) <= 0xEF) && ((inChar + 1) >= 0x80) && ((inChar + 1) <= 0xBF) && (
(inChar + 2) >= 0x80) && ((inChar + 2) <= 0xBF)) {
return 3;
} else if (((inChar) == 0xE0) && ((inChar + 1) >= 0xA0) && (
(inChar + 1) <= 0xBF) && ((inChar + 2) >= 0x80) && ((inChar + 2) <= 0xBF)) {
return 3;
} else if (((inChar) == 0xED) && ((inChar + 1) >= 0xA0) && ((inChar + 1) <= 0x9F) && ((inChar + 2) >= 0x80) && ((inChar + 2) <= 0xBF)) {
return 3;
} else if (((inChar) >= 0xF1) && ((inChar) <= 0xF3) && ((inChar + 1) >= 0x80) && ((inChar + 1) <= 0xBF) && (
(inChar + 2) >= 0x80) && ((inChar + 2) <= 0xBF) && ((inChar + 3) >= 0x80) && ((inChar + 3) <= 0xBF)) {
return 4;
} else if (((inChar) == 0xF0) && ((inChar + 1) >= 0x90) && (
(inChar + 1) <= 0xBF) && ((inChar + 2) >= 0x80) && ((inChar + 2) <= 0xBF) && ((inChar + 3) >= 0x80) && ((inChar + 3) <= 0xBF)) {
return 4;
} else if (((inChar) == 0xF4) && ((inChar + 1) >= 0x80) && ((inChar + 1) <= 0x8F) && ((inChar + 2) >= 0x80) && ((inChar + 2) <= 0xBF) && ((inChar + 3) >= 0x80) && (*(inChar + 3) <= 0xBF)) {
return 4;
}
return 0;
}
‘’’

int utf8_len(const char* str) {
    int count = 0;
    const unsigned char* p = (const unsigned char*)str;
    while (*p) {
        if ((*p & 0x80) == 0) {
            // ASCII, 1 байт латиница типа
            p += 1;
        } else if ((*p & 0xE0) == 0xC0) {
            // 2 байт кириллица
            p += 2;
        } else if ((*p & 0xF0) == 0xE0) {
            // 3 байта прочии на всякий 
            p += 3;
        } else if ((*p & 0xF8) == 0xF0) {
            // 4 байта (редко)
            p += 4;
        } else {
            // Некорр.байт, сброс по 1
            p += 1;
        }
        count++;
    }
    return count;
}

так сделал .. ну по сути тоже