/* * 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 #include #include #include #include "image.h" #define BIT_TO_BYTE(i) ((i) / CHAR_BIT) #define BITS_TO_BYTES(i) BIT_TO_BYTE((i) + CHAR_BIT - 1) #define BIT_BYTE_SHIFT(i) (CHAR_BIT - 1 - ((i) % CHAR_BIT)) #define FONT_H(f) ((size_t) (f)->desc.height) #define FONT_W(f) ((size_t) (f)->desc.width) #define FONT_W_BYTES(f) BITS_TO_BYTES(FONT_W(f)) struct font { const struct font_desc desc; }; static const struct font_desc *fonts[] = { &font_vga_8x8, &font_vga_8x16, &font_vga_6x11, &font_7x14, &font_sun_8x16, &font_sun_12x22, &font_10x18, &font_acorn_8x8, &font_pearl_8x8, &font_mini_4x6, &font_6x10, &font_mplus_1mn_medium_10x14, &font_mplus_1mn_regular_12x17, &font_mplus_1mn_regular_14x19, &font_mplus_1mn_regular_16x22, }; void font_list(FILE *stream) { size_t i; assert(stream); for (i = 0; i < *(&fonts + 1) - fonts; ++i) { fprintf(stream, "%s\n", fonts[i]->name); } } struct font * font_default(void) { struct font *font; int pref; size_t i; font = NULL; pref = -10000; for (i = 0; i < *(&fonts + 1) - fonts; ++i) { if (fonts[i]->pref > pref) { font = (struct font *) fonts[i]; pref = fonts[i]->pref; } } return font; } struct font * font_find(const char *name) { size_t i; assert(name); if (!name) { return NULL; } for (i = 0; i < *(&fonts + 1) - fonts; ++i) { if (strcmp(fonts[i]->name, name) == 0) { return (struct font *) fonts[i]; } } return NULL; } int font_get_width(const struct font *font) { assert(font); return font->desc.width; } int font_get_height(const struct font *font) { assert(font); return font->desc.height; } void font_render(const struct font *font, png_const_colorp fg, png_const_colorp bg, unsigned char ch, png_byte **rows, int row, int col) { size_t y; size_t r; size_t x; size_t c; size_t byte; unsigned char font_ch; assert(font); assert(fg); assert(bg); assert(rows && *rows); 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){ byte = ((ch * FONT_H(font)) + y) * FONT_W_BYTES(font) + BIT_TO_BYTE(x); font_ch = font->desc.data[byte]; if ((font_ch >> (BIT_BYTE_SHIFT(x))) & 0x01) { rows[r][c * IMAGE_PIXEL_SIZE + 0] = fg->red; rows[r][c * IMAGE_PIXEL_SIZE + 1] = fg->green; rows[r][c * IMAGE_PIXEL_SIZE + 2] = fg->blue; } else { rows[r][c * IMAGE_PIXEL_SIZE + 0] = bg->red; rows[r][c * IMAGE_PIXEL_SIZE + 1] = bg->green; rows[r][c * IMAGE_PIXEL_SIZE + 2] = bg->blue; } } } }