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