Для этого взял один из примеров, в котором есть ряд шрифтов, максимальный 16 на 28 пикселей. Данные шрифты отображаются на дисплее нормально, но мне нужны более крупные шрифты, поэтому добавляю свои (вариант умножать уже имеющиеся шрифты не подходит, слишком пиксельно получается). В MatrixFont генерирую шрифт 32х48.
Далее пробую его выводить (умножая на 4) и наблюдается ряд проблем. Одна из которых это неполный вывод значения.
Для простоты оставил первый символ сгенерированного шрифта, а именно пробел - " ". Но заполнил его чередующимися 0 и 1. По сути на дисплей должен вывестись прямоугольник из полосок размером 32 на 48 пикселей (соотношение сторон 2 : 3).
Но на дисплее я получаю прямоугольник ровно в 2 раза уже, чем тот, что должен быть, соотношение сторон 1 : 3. Не могу найти причину данного поведения. Может у кого есть догадки?
Вывод символа:
Код: Выделить всё
ST7789_DrawChar( 10, 25, RGB565( 255, 255, 255 ) , RGB565( 0, 0, 0 ) , 0, &Font_32x48, 4, ' ');
Код: Выделить всё
void ST7789_DrawChar(uint16_t x, uint16_t y, uint16_t TextColor, uint16_t BgColor, uint8_t TransparentBg, FontDef_t* Font, uint8_t multiplier, unsigned char ch){
uint32_t i, b, j;
uint32_t X = x, Y = y;
uint8_t xx, yy;
if( multiplier < 1 ){
multiplier = 1;
}
//Check available space in LCD
if (ST7789_Width >= ( x + Font->FontWidth) || ST7789_Height >= ( y + Font->FontHeight)){
//Go through font
for (i = 0; i < Font->FontHeight; i++) {
if( ch < 127 ){
b = Font->data[(ch - 32) * Font->FontHeight + i];
}
else if( (uint8_t) ch > 191 ){
// +96 это так как латинские символы и знаки в шрифтах занимают 96 позиций
// и если в шрифте который содержит сперва латиницу и спец символы и потом
// только кирилицу то нужно добавлять 95 если шрифт
// содержит только кирилицу то +96 не нужно
b = Font->data[((ch - 192) + 96) * Font->FontHeight + i];
}
else if( (uint8_t) ch == 168 ){ // 168 символ по ASCII - Ё
// 160 эллемент ( символ Ё )
b = Font->data[( 160 ) * Font->FontHeight + i];
}
else if( (uint8_t) ch == 184 ){ // 184 символ по ASCII - ё
// 161 эллемент ( символ ё )
b = Font->data[( 161 ) * Font->FontHeight + i];
}
//-------------------------------------------------------------------
//---- Украинская раскладка ----------------------------------------------------
else if( (uint8_t) ch == 170 ){ // 168 символ по ASCII - Є
// 162 эллемент ( символ Є )
b = Font->data[( 162 ) * Font->FontHeight + i];
}
else if( (uint8_t) ch == 175 ){ // 184 символ по ASCII - Ї
// 163 эллемент ( символ Ї )
b = Font->data[( 163 ) * Font->FontHeight + i];
}
else if( (uint8_t) ch == 178 ){ // 168 символ по ASCII - І
// 164 эллемент ( символ І )
b = Font->data[( 164 ) * Font->FontHeight + i];
}
else if( (uint8_t) ch == 179 ){ // 184 символ по ASCII - і
// 165 эллемент ( символ і )
b = Font->data[( 165 ) * Font->FontHeight + i];
}
else if( (uint8_t) ch == 186 ){ // 184 символ по ASCII - є
// 166 эллемент ( символ є )
b = Font->data[( 166 ) * Font->FontHeight + i];
}
else if( (uint8_t) ch == 191 ){ // 168 символ по ASCII - ї
// 167 эллемент ( символ ї )
b = Font->data[( 167 ) * Font->FontHeight + i];
}
//-----------------------------------------------------------------------------
for (j = 0; j < Font->FontWidth; j++) {
if ((b << j) & 0x8000) {
for (yy = 0; yy < multiplier; yy++){
for (xx = 0; xx < multiplier; xx++){
ST7789_DrawPixel(X+xx, Y+yy, TextColor);
}
}
}
else if( TransparentBg ){
for (yy = 0; yy < multiplier; yy++){
for (xx = 0; xx < multiplier; xx++){
ST7789_DrawPixel(X+xx, Y+yy, BgColor);
}
}
}
X = X + multiplier;
}
X = x;
Y = Y + multiplier;
}
}
}
Код: Выделить всё
const uint16_t Font32x48 [] = {
0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, // номер в Acii - 32 < >
};


