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
|
||||
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
|
||||
bool "Allow input from a PC keyboard"
|
||||
default y if ARCH_X86 # uses IO
|
||||
|
|
|
@ -238,7 +238,7 @@ static int corebootfb_init(void)
|
|||
if (fbaddr == 0)
|
||||
return -1;
|
||||
|
||||
font_init();
|
||||
font_init(FI->x_resolution);
|
||||
|
||||
coreboot_video_console.columns = FI->x_resolution / font_width;
|
||||
coreboot_video_console.rows = FI->y_resolution / font_height;
|
||||
|
|
|
@ -27,14 +27,22 @@
|
|||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <libpayload.h>
|
||||
#include "font8x16.h"
|
||||
#include "font.h"
|
||||
|
||||
#define COLS_MIN 130
|
||||
|
||||
int font_width;
|
||||
int font_height;
|
||||
int font_scale;
|
||||
|
||||
void font_init(void)
|
||||
void font_init(int width)
|
||||
{
|
||||
font_width = FONT_WIDTH;
|
||||
font_height = FONT_HEIGHT;
|
||||
font_scale = CONFIG_LP_FONT_SCALE_FACTOR;
|
||||
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_height;
|
||||
extern int font_scale;
|
||||
|
||||
inline int font_glyph_filled(unsigned int ch, int x, int y)
|
||||
{
|
||||
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
|
||||
|
|
|
@ -268,7 +268,7 @@ static int geodelx_init(void)
|
|||
dcaddr = pci_read_resource(dev, 2);
|
||||
vgaddr = pci_read_resource(dev, 3);
|
||||
|
||||
font_init();
|
||||
font_init(vga_mode.hactive);
|
||||
|
||||
init_video_mode();
|
||||
|
||||
|
|
Loading…
Reference in New Issue