Вывод символа в виде пикселей
Начал изучение, пока что, голого C++. Всё что напишу ниже - это лишь глупая идея, которую хочется реализовать ради изучения языка. Сейчас тренируюсь на разборе/создании монохромного BMP-файла. Возник вопрос: можно ли как-то вывести символ в пиксельном представлении?
Т.е., условно, у нас есть картинка-сетка 32х32 пикселя. Символ, к примеру буква 'А', занимает 5х5 пикселей. Как мне сам символ можно перевести в сетку пикселей 5х5 без тупого условия
char ch = 'A';
if (ch == 'A')
{...}
else if (ch == 'B')
{...}
И это ещё ладно обычные строки, а если широкие строки? Там символов жеж куууууча. Гугл что-то толком мне ничего не сказал
Ответы (1 шт):
Обычно эта задача решается просто - отдельно хранится картинка с символами. По словам "font bitmap" можно найти много таких картинок с шрифтами (я не уверен в их лицензионной чистоте, поэтому, не копирую сюда явных ссылок).
Если присмотрится к таким картинкам, то там символы находятся в определенных позициях, которая очень легко может быть рассчитанная
char c = '?';// это нужный символ
int char_width = 8; // ширина символа, обычно 8 или 6 или кратное этому
int char_height = 8; // высота символа. обычно 8. бывает 12 или другое
int code = (int)c;
// нехитрой математикой расчитываем положение верхнего левого угла положения символа
// рассчитываем на то, что там все таки 16 символов в ряд. Но бывает по разному.
int left = (code % 16) * char_width;
int top = (code / 16) * char_height;
// а теперь копируем к нам. Да, попиксельно. Но нам для примера
// screen - массив "экрана"
// char_pos_x/char_pos_y - положение для вывода на экране
for (int x = 0; x < char_width; x++) {
for (int y = 0; y < char_height; y++) {
screen[x+char_pos_x][y+char_pos_y] = char_bitmap[x+left][y+top];
}
}
Этот код с минимальными модификациями и оптимизациями используется везде для отрисовки моноширинных шрифтов (то есть, шрифтов, где и Ш и . занимают одинаковую ширину).
И если нужно вывести слово, то это просто в цикле выводятся буквы, не забывая смещать после каждой.
Есть шрифты, где ширина символа разная. Но в этом случае нам нужен небольшой массив, где хранится информация о том, где находится каждый символ и его ширина/высота. А дальше код сводится к коду выше.
А ещё есть векторные шрифты. Это уже сложнее. Там прям и написано (очень грубо конечно), что бы нарисовать букву ю, нужно нарисовать две палочки и эллипс/овал. Такие шрифты легко масштабируются и выглядят хорошо на разных экранах. А ещё в некоторых шрифтах есть возможность выполнять код (в виндовых шрифтах была такая уязвимость, но вроде ее прикрыли).