diff --git a/font_data.c b/font_data.c index f104f51..af80b05 100644 --- a/font_data.c +++ b/font_data.c @@ -33,9 +33,8 @@ const uint8_t image_data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x02, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x18, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x18, 0x00, 0x11, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC0, 0x04, 0x60, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x04, 0x60, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x00, 0x23, 0x00, 0x04, 0x40, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xE0, 0x00, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x0F, 0xF8, 0x00, }; // Функция для вывода одного символа -void draw_char(uint16_t x, uint16_t y, wchar_t c) { - uint8_t char_width = 22; // Ширина одного символа - uint8_t char_height = 22; // Высота одного символа +void draw_char(uint16_t x, uint16_t y,uint8_t wdh, wchar_t c) { + uint8_t current_char_width = wdh; // Ширина текущего символа uint32_t offset; // Смещение в битах uint32_t font_linear_width=total_chars*char_width; //количество пикселей в одномерной матрице шрифта @@ -50,7 +49,7 @@ void draw_char(uint16_t x, uint16_t y, wchar_t c) { // Проверяем, что не выходим за границы массива uint32_t max_offset = font_linear_width * char_height; // Общий размер массива в битах - if (offset+char_width+(font_linear_width*(char_height-1)) > max_offset) { + if (offset+current_char_width+(font_linear_width*(char_height-1)) > max_offset) { return; } @@ -69,7 +68,7 @@ void draw_char(uint16_t x, uint16_t y, wchar_t c) { ((uint32_t)third_byte)<< 8; prepareDW<<=bit_in_byte; - for (uint8_t col = 0; col < char_width; col++) { + for (uint8_t col = 0; col < current_char_width; col++) { uint8_t prepare= (prepareDW>>(31-col))&1; // Устанавливаем пиксель на экране if (prepare) { @@ -84,10 +83,54 @@ void draw_char(uint16_t x, uint16_t y, wchar_t c) { // Функция для вывода строки текста void draw_string(uint16_t x, uint16_t y, const wchar_t *str) { + uint8_t chwdh; while (*str) { - draw_char(x, y, *str); - x += char_width; // Сдвиг вправо на ширину символа + chwdh= get_char_width (*str); + draw_char(x, y, chwdh, *str); + x +=chwdh; // Сдвиг вправо на ширину символа str++; } } +uint8_t get_char_width(wchar_t c) { + uint32_t offset; // Смещение в битах + uint32_t font_linear_width = (total_chars * char_width + 7) / 8; // Линейная ширина в байтах + + // Определяем смещение символа в массиве + if (c >= 32 && c <= 127) { // ASCII символы + offset = (c - 32) * char_width; // Смещение в пикселях + } else if (c >= 0x0400 && c <= 0x04FF) { // Кириллица + offset = (c - 0x0400 + 96) * char_width; // Смещение в пикселях + } else { + return 0; // Символ не поддерживается + } + + // Сканируем столбцы символа, начиная с правого края + for (int8_t col = char_width - 1; col >= 0; col--) { + bool column_empty = true; + + for (uint8_t row = 0; row < char_height; row++) { + // Рассчитываем битовую позицию + uint32_t bit_pos = offset + col + row * font_linear_width * 8; + uint32_t byte_pos = bit_pos / 8; + uint8_t bit_in_byte = 7 - (bit_pos % 8); + + uint8_t current_byte = image_data[byte_pos]; + uint8_t bit = (current_byte >> bit_in_byte) & 1; + + if (bit) { + column_empty = false; + break; // Как только нашли не пустую колонку, выходим из цикла + } + } + + // Если нашли не пустую колонку, возвращаем её индекс + 1 (ширина) + if (!column_empty) { + return col + 1; + } + } + + // Если символ полностью пустой, возвращаем ширину 0 + return 12; +} + diff --git a/font_data.h b/font_data.h index 9cc6bf4..f917c17 100644 --- a/font_data.h +++ b/font_data.h @@ -8,5 +8,6 @@ extern const uint16_t font_height; extern const uint8_t font_data[]; void draw_string(uint16_t x, uint16_t y, const wchar_t *str); -void draw_char(uint16_t x, uint16_t y, wchar_t c); +void draw_char(uint16_t x, uint16_t y,uint8_t wdh, wchar_t c); +uint8_t get_char_width(wchar_t c); #endif // FONT_DATA_H diff --git a/main.c b/main.c index 905b1be..6347a8d 100644 --- a/main.c +++ b/main.c @@ -27,7 +27,8 @@ int main() { fillBufer(frame_buffer,reverse(0x4A69));// generate_sine_wave_points(num_points, 50, freq, 0, HEIGHT / 2,x); - draw_string(0,50,L"Проверка кириллицы"); + draw_string(20,110,L"Кириллица работает!!!"); // + draw_string(50,130,L"Does Latin work?"); //Does Latin work? multicore_fifo_push_blocking(0); //Экран 0 нарисован x+=0.03; if (minmax)