162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * `Soft' font definitions 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Created 1995 by Geert Uytterhoeven 562306a36Sopenharmony_ci * Rewritten 1998 by Martin Mares <mj@ucw.cz> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * 2001 - Documented with DocBook 862306a36Sopenharmony_ci * - Brad Douglas <brad@neruo.com> 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 1162306a36Sopenharmony_ci * License. See the file COPYING in the main directory of this archive 1262306a36Sopenharmony_ci * for more details. 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <linux/module.h> 1662306a36Sopenharmony_ci#include <linux/types.h> 1762306a36Sopenharmony_ci#include <linux/string.h> 1862306a36Sopenharmony_ci#if defined(__mc68000__) 1962306a36Sopenharmony_ci#include <asm/setup.h> 2062306a36Sopenharmony_ci#endif 2162306a36Sopenharmony_ci#include <linux/font.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistatic const struct font_desc *fonts[] = { 2462306a36Sopenharmony_ci#ifdef CONFIG_FONT_8x8 2562306a36Sopenharmony_ci &font_vga_8x8, 2662306a36Sopenharmony_ci#endif 2762306a36Sopenharmony_ci#ifdef CONFIG_FONT_8x16 2862306a36Sopenharmony_ci &font_vga_8x16, 2962306a36Sopenharmony_ci#endif 3062306a36Sopenharmony_ci#ifdef CONFIG_FONT_6x11 3162306a36Sopenharmony_ci &font_vga_6x11, 3262306a36Sopenharmony_ci#endif 3362306a36Sopenharmony_ci#ifdef CONFIG_FONT_7x14 3462306a36Sopenharmony_ci &font_7x14, 3562306a36Sopenharmony_ci#endif 3662306a36Sopenharmony_ci#ifdef CONFIG_FONT_SUN8x16 3762306a36Sopenharmony_ci &font_sun_8x16, 3862306a36Sopenharmony_ci#endif 3962306a36Sopenharmony_ci#ifdef CONFIG_FONT_SUN12x22 4062306a36Sopenharmony_ci &font_sun_12x22, 4162306a36Sopenharmony_ci#endif 4262306a36Sopenharmony_ci#ifdef CONFIG_FONT_10x18 4362306a36Sopenharmony_ci &font_10x18, 4462306a36Sopenharmony_ci#endif 4562306a36Sopenharmony_ci#ifdef CONFIG_FONT_ACORN_8x8 4662306a36Sopenharmony_ci &font_acorn_8x8, 4762306a36Sopenharmony_ci#endif 4862306a36Sopenharmony_ci#ifdef CONFIG_FONT_PEARL_8x8 4962306a36Sopenharmony_ci &font_pearl_8x8, 5062306a36Sopenharmony_ci#endif 5162306a36Sopenharmony_ci#ifdef CONFIG_FONT_MINI_4x6 5262306a36Sopenharmony_ci &font_mini_4x6, 5362306a36Sopenharmony_ci#endif 5462306a36Sopenharmony_ci#ifdef CONFIG_FONT_6x10 5562306a36Sopenharmony_ci &font_6x10, 5662306a36Sopenharmony_ci#endif 5762306a36Sopenharmony_ci#ifdef CONFIG_FONT_TER16x32 5862306a36Sopenharmony_ci &font_ter_16x32, 5962306a36Sopenharmony_ci#endif 6062306a36Sopenharmony_ci#ifdef CONFIG_FONT_6x8 6162306a36Sopenharmony_ci &font_6x8, 6262306a36Sopenharmony_ci#endif 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci#define num_fonts ARRAY_SIZE(fonts) 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#ifdef NO_FONTS 6862306a36Sopenharmony_ci#error No fonts configured. 6962306a36Sopenharmony_ci#endif 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/** 7362306a36Sopenharmony_ci * find_font - find a font 7462306a36Sopenharmony_ci * @name: string name of a font 7562306a36Sopenharmony_ci * 7662306a36Sopenharmony_ci * Find a specified font with string name @name. 7762306a36Sopenharmony_ci * 7862306a36Sopenharmony_ci * Returns %NULL if no font found, or a pointer to the 7962306a36Sopenharmony_ci * specified font. 8062306a36Sopenharmony_ci * 8162306a36Sopenharmony_ci */ 8262306a36Sopenharmony_ciconst struct font_desc *find_font(const char *name) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci unsigned int i; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci BUILD_BUG_ON(!num_fonts); 8762306a36Sopenharmony_ci for (i = 0; i < num_fonts; i++) 8862306a36Sopenharmony_ci if (!strcmp(fonts[i]->name, name)) 8962306a36Sopenharmony_ci return fonts[i]; 9062306a36Sopenharmony_ci return NULL; 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ciEXPORT_SYMBOL(find_font); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci/** 9662306a36Sopenharmony_ci * get_default_font - get default font 9762306a36Sopenharmony_ci * @xres: screen size of X 9862306a36Sopenharmony_ci * @yres: screen size of Y 9962306a36Sopenharmony_ci * @font_w: bit array of supported widths (1 - 32) 10062306a36Sopenharmony_ci * @font_h: bit array of supported heights (1 - 32) 10162306a36Sopenharmony_ci * 10262306a36Sopenharmony_ci * Get the default font for a specified screen size. 10362306a36Sopenharmony_ci * Dimensions are in pixels. 10462306a36Sopenharmony_ci * 10562306a36Sopenharmony_ci * Returns %NULL if no font is found, or a pointer to the 10662306a36Sopenharmony_ci * chosen font. 10762306a36Sopenharmony_ci * 10862306a36Sopenharmony_ci */ 10962306a36Sopenharmony_ciconst struct font_desc *get_default_font(int xres, int yres, u32 font_w, 11062306a36Sopenharmony_ci u32 font_h) 11162306a36Sopenharmony_ci{ 11262306a36Sopenharmony_ci int i, c, cc, res; 11362306a36Sopenharmony_ci const struct font_desc *f, *g; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci g = NULL; 11662306a36Sopenharmony_ci cc = -10000; 11762306a36Sopenharmony_ci for (i = 0; i < num_fonts; i++) { 11862306a36Sopenharmony_ci f = fonts[i]; 11962306a36Sopenharmony_ci c = f->pref; 12062306a36Sopenharmony_ci#if defined(__mc68000__) 12162306a36Sopenharmony_ci#ifdef CONFIG_FONT_PEARL_8x8 12262306a36Sopenharmony_ci if (MACH_IS_AMIGA && f->idx == PEARL8x8_IDX) 12362306a36Sopenharmony_ci c = 100; 12462306a36Sopenharmony_ci#endif 12562306a36Sopenharmony_ci#ifdef CONFIG_FONT_6x11 12662306a36Sopenharmony_ci if (MACH_IS_MAC && xres < 640 && f->idx == VGA6x11_IDX) 12762306a36Sopenharmony_ci c = 100; 12862306a36Sopenharmony_ci#endif 12962306a36Sopenharmony_ci#endif 13062306a36Sopenharmony_ci if ((yres < 400) == (f->height <= 8)) 13162306a36Sopenharmony_ci c += 1000; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci /* prefer a bigger font for high resolution */ 13462306a36Sopenharmony_ci res = (xres / f->width) * (yres / f->height) / 1000; 13562306a36Sopenharmony_ci if (res > 20) 13662306a36Sopenharmony_ci c += 20 - res; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci if ((font_w & (1U << (f->width - 1))) && 13962306a36Sopenharmony_ci (font_h & (1U << (f->height - 1)))) 14062306a36Sopenharmony_ci c += 1000; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci if (c > cc) { 14362306a36Sopenharmony_ci cc = c; 14462306a36Sopenharmony_ci g = f; 14562306a36Sopenharmony_ci } 14662306a36Sopenharmony_ci } 14762306a36Sopenharmony_ci return g; 14862306a36Sopenharmony_ci} 14962306a36Sopenharmony_ciEXPORT_SYMBOL(get_default_font); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ciMODULE_AUTHOR("James Simmons <jsimmons@users.sf.net>"); 15262306a36Sopenharmony_ciMODULE_DESCRIPTION("Console Fonts"); 15362306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 154