libpayload: video: Add support for font scaling with a factor
This introduces support for font scaling with a factor provided via Kconfig. In practice, the font itself is not scaled at any point in memory and only the logic to determine whether a pixel should be filled or not is changed. Thus, it should not significantly impact either the access time or memory use. Change-Id: Idff210617c9ec08c6034aef107cfdb34c7cdf029 Signed-off-by: Paul Kocialkowski <contact@paulk.fr> Reviewed-on: https://review.coreboot.org/20709 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
parent
1c0b603673
commit
d85e485c58
|
@ -321,6 +321,14 @@ config COREBOOT_VIDEO_CONSOLE
|
||||||
Say Y here if coreboot switched to a graphics mode and
|
Say Y here if coreboot switched to a graphics mode and
|
||||||
your payload wants to use it.
|
your payload wants to use it.
|
||||||
|
|
||||||
|
config FONT_SCALE_FACTOR
|
||||||
|
int "Scale factor for the included font"
|
||||||
|
depends on GEODELX_VIDEO_CONSOLE || COREBOOT_VIDEO_CONSOLE
|
||||||
|
default 0
|
||||||
|
help
|
||||||
|
By default (value of 0), the scale factor is automatically
|
||||||
|
calculated to ensure at least 130 columns (when possible).
|
||||||
|
|
||||||
config PC_KEYBOARD
|
config PC_KEYBOARD
|
||||||
bool "Allow input from a PC keyboard"
|
bool "Allow input from a PC keyboard"
|
||||||
default y if ARCH_X86 # uses IO
|
default y if ARCH_X86 # uses IO
|
||||||
|
|
|
@ -238,7 +238,7 @@ static int corebootfb_init(void)
|
||||||
if (fbaddr == 0)
|
if (fbaddr == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
font_init();
|
font_init(FI->x_resolution);
|
||||||
|
|
||||||
coreboot_video_console.columns = FI->x_resolution / font_width;
|
coreboot_video_console.columns = FI->x_resolution / font_width;
|
||||||
coreboot_video_console.rows = FI->y_resolution / font_height;
|
coreboot_video_console.rows = FI->y_resolution / font_height;
|
||||||
|
|
|
@ -27,14 +27,22 @@
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <libpayload.h>
|
||||||
#include "font8x16.h"
|
#include "font8x16.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
|
||||||
|
#define COLS_MIN 130
|
||||||
|
|
||||||
int font_width;
|
int font_width;
|
||||||
int font_height;
|
int font_height;
|
||||||
|
int font_scale;
|
||||||
|
|
||||||
void font_init(void)
|
void font_init(int width)
|
||||||
{
|
{
|
||||||
font_width = FONT_WIDTH;
|
font_scale = CONFIG_LP_FONT_SCALE_FACTOR;
|
||||||
font_height = FONT_HEIGHT;
|
if (!font_scale)
|
||||||
|
font_scale = MAX(width / (FONT_WIDTH * COLS_MIN), 1);
|
||||||
|
|
||||||
|
font_width = FONT_WIDTH * font_scale;
|
||||||
|
font_height = FONT_HEIGHT * font_scale;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,13 +34,14 @@
|
||||||
|
|
||||||
extern int font_width;
|
extern int font_width;
|
||||||
extern int font_height;
|
extern int font_height;
|
||||||
|
extern int font_scale;
|
||||||
|
|
||||||
inline int font_glyph_filled(unsigned int ch, int x, int y)
|
inline int font_glyph_filled(unsigned int ch, int x, int y)
|
||||||
{
|
{
|
||||||
unsigned char *glyph = font8x16 + ((ch & 0xFF) * FONT_HEIGHT);
|
unsigned char *glyph = font8x16 + ((ch & 0xFF) * FONT_HEIGHT);
|
||||||
return glyph[y] & (1 << x);
|
return glyph[y/font_scale] & (1 << x/font_scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
void font_init(void);
|
void font_init(int width);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -268,7 +268,7 @@ static int geodelx_init(void)
|
||||||
dcaddr = pci_read_resource(dev, 2);
|
dcaddr = pci_read_resource(dev, 2);
|
||||||
vgaddr = pci_read_resource(dev, 3);
|
vgaddr = pci_read_resource(dev, 3);
|
||||||
|
|
||||||
font_init();
|
font_init(vga_mode.hactive);
|
||||||
|
|
||||||
init_video_mode();
|
init_video_mode();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue