/* * Font lookup and rendering functions * * Copyright (C) 2019 Patrick McDermott * * This file is part of fbcon2png. * * fbcon2png is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * fbcon2png is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fbcon2png. If not, see . */ #include "font.h" #include #include #include #define FONT_H(f) ((size_t) (f)->desc.height) #define FONT_W(f) ((size_t) (f)->desc.width) #define CHAR_PIXEL(f, c, x, y) (((((c) * FONT_H(f)) + (y)) * FONT_W(f)) + (x)) struct font { const struct font_desc desc; }; static const struct font_desc *fonts[] = { &font_mplus_1mn_medium_10x14, &font_mplus_1mn_regular_12x17, &font_mplus_1mn_regular_14x19, &font_mplus_1mn_regular_16x22, }; struct font * font_find(const char *name) { size_t i; if (!name) { return (struct font *) fonts[0]; } for (i = 0; i < *(&fonts + 1) - fonts; ++i) { if (strcmp(fonts[i]->name, name) == 0) { return (struct font *) fonts[i]; } } return (struct font *) fonts[0]; } int font_get_width(struct font *font) { return font->desc.width; } int font_get_height(struct font *font) { return font->desc.height; } void font_render(struct font *font, png_const_colorp fg, png_const_colorp bg, char ch, png_bytepp rows, int row, int col) { size_t y; size_t r; size_t x; size_t c; for (y = 0, r = row * FONT_H(font); y < FONT_H(font); ++y, ++r) { for (x = 0, c = col * FONT_W(font); x < FONT_W(font); ++x, ++c){ if (CHAR_PIXEL(font, ch, x, y)) { *(&rows[r][c] + 0) = fg->red; *(&rows[r][c] + 1) = fg->green; *(&rows[r][c] + 2) = fg->blue; } else { *(&rows[r][c] + 0) = bg->red; *(&rows[r][c] + 1) = bg->green; *(&rows[r][c] + 2) = bg->blue; } } } }