Commit 2d2699d984924890f6dac8cf51c3b6311f56816c
Committed by
Linus Torvalds
1 parent
bf26ad72a6
Exists in
master
and in
39 other branches
fbcon: font setting should check limitation of driver
fbcon_set_font() will now check if the new font dimensions can be drawn by the driver (by checking pixmap.blit_x and blit_y). Similarly, add 2 new parameters to get_default_font(), font_w and font_h, to further aid in the font selection process. Signed-off-by: Antonino Daplas <adaplas@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 4 changed files with 26 additions and 6 deletions Side-by-side Diff
drivers/video/console/fbcon.c
... | ... | @@ -988,7 +988,9 @@ |
988 | 988 | if (!p->fontdata) { |
989 | 989 | if (!fontname[0] || !(font = find_font(fontname))) |
990 | 990 | font = get_default_font(info->var.xres, |
991 | - info->var.yres); | |
991 | + info->var.yres, | |
992 | + info->pixmap.blit_x, | |
993 | + info->pixmap.blit_y); | |
992 | 994 | vc->vc_font.width = font->width; |
993 | 995 | vc->vc_font.height = font->height; |
994 | 996 | vc->vc_font.data = (void *)(p->fontdata = font->data); |
... | ... | @@ -1108,7 +1110,9 @@ |
1108 | 1110 | |
1109 | 1111 | if (!fontname[0] || !(font = find_font(fontname))) |
1110 | 1112 | font = get_default_font(info->var.xres, |
1111 | - info->var.yres); | |
1113 | + info->var.yres, | |
1114 | + info->pixmap.blit_x, | |
1115 | + info->pixmap.blit_y); | |
1112 | 1116 | vc->vc_font.width = font->width; |
1113 | 1117 | vc->vc_font.height = font->height; |
1114 | 1118 | vc->vc_font.data = (void *)(p->fontdata = font->data); |
... | ... | @@ -2495,6 +2499,7 @@ |
2495 | 2499 | |
2496 | 2500 | static int fbcon_set_font(struct vc_data *vc, struct console_font *font, unsigned flags) |
2497 | 2501 | { |
2502 | + struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; | |
2498 | 2503 | unsigned charcount = font->charcount; |
2499 | 2504 | int w = font->width; |
2500 | 2505 | int h = font->height; |
... | ... | @@ -2508,6 +2513,11 @@ |
2508 | 2513 | if (charcount != 256 && charcount != 512) |
2509 | 2514 | return -EINVAL; |
2510 | 2515 | |
2516 | + /* Make sure drawing engine can handle the font */ | |
2517 | + if (!(info->pixmap.blit_x & (1 << (font->width - 1))) || | |
2518 | + !(info->pixmap.blit_y & (1 << (font->height - 1)))) | |
2519 | + return -EINVAL; | |
2520 | + | |
2511 | 2521 | size = h * pitch * charcount; |
2512 | 2522 | |
2513 | 2523 | new_data = kmalloc(FONT_EXTRA_WORDS * sizeof(int) + size, GFP_USER); |
... | ... | @@ -2552,7 +2562,8 @@ |
2552 | 2562 | const struct font_desc *f; |
2553 | 2563 | |
2554 | 2564 | if (!name) |
2555 | - f = get_default_font(info->var.xres, info->var.yres); | |
2565 | + f = get_default_font(info->var.xres, info->var.yres, | |
2566 | + info->pixmap.blit_x, info->pixmap.blit_y); | |
2556 | 2567 | else if (!(f = find_font(name))) |
2557 | 2568 | return -ENOENT; |
2558 | 2569 |
drivers/video/console/fonts.c
... | ... | @@ -98,6 +98,8 @@ |
98 | 98 | * get_default_font - get default font |
99 | 99 | * @xres: screen size of X |
100 | 100 | * @yres: screen size of Y |
101 | + * @font_w: bit array of supported widths (1 - 32) | |
102 | + * @font_h: bit array of supported heights (1 - 32) | |
101 | 103 | * |
102 | 104 | * Get the default font for a specified screen size. |
103 | 105 | * Dimensions are in pixels. |
... | ... | @@ -107,7 +109,8 @@ |
107 | 109 | * |
108 | 110 | */ |
109 | 111 | |
110 | -const struct font_desc *get_default_font(int xres, int yres) | |
112 | +const struct font_desc *get_default_font(int xres, int yres, u32 font_w, | |
113 | + u32 font_h) | |
111 | 114 | { |
112 | 115 | int i, c, cc; |
113 | 116 | const struct font_desc *f, *g; |
... | ... | @@ -129,6 +132,11 @@ |
129 | 132 | #endif |
130 | 133 | if ((yres < 400) == (f->height <= 8)) |
131 | 134 | c += 1000; |
135 | + | |
136 | + if (!(font_w & (1 << (f->width - 1))) || | |
137 | + !(font_w & (1 << (f->height - 1)))) | |
138 | + c += 1000; | |
139 | + | |
132 | 140 | if (c > cc) { |
133 | 141 | cc = c; |
134 | 142 | g = f; |
drivers/video/console/sticore.c
include/linux/font.h
... | ... | @@ -49,7 +49,8 @@ |
49 | 49 | |
50 | 50 | /* Get the default font for a specific screen size */ |
51 | 51 | |
52 | -extern const struct font_desc *get_default_font(int xres, int yres); | |
52 | +extern const struct font_desc *get_default_font(int xres, int yres, | |
53 | + u32 font_w, u32 font_h); | |
53 | 54 | |
54 | 55 | /* Max. length for the name of a predefined font */ |
55 | 56 | #define MAX_FONT_NAME 32 |