diff --git a/src/arch/i386/interface/pcbios/vesafb.c b/src/arch/i386/interface/pcbios/vesafb.c index 4742f956b..6d2c1bcae 100644 --- a/src/arch/i386/interface/pcbios/vesafb.c +++ b/src/arch/i386/interface/pcbios/vesafb.c @@ -83,8 +83,6 @@ struct vesafb { physaddr_t start; /** Pixel geometry */ struct fbcon_geometry pixel; - /** Margin */ - struct fbcon_margin margin; /** Colour mapping */ struct fbcon_colour_map map; /** Font definition */ @@ -419,12 +417,6 @@ static void vesafb_restore ( void ) { static int vesafb_init ( struct console_configuration *config ) { uint32_t discard_b; uint16_t *mode_numbers; - unsigned int xgap; - unsigned int ygap; - unsigned int left; - unsigned int right; - unsigned int top; - unsigned int bottom; int mode_number; int rc; @@ -450,31 +442,13 @@ static int vesafb_init ( struct console_configuration *config ) { if ( ( rc = vesafb_set_mode ( mode_number ) ) != 0 ) goto err_set_mode; - /* Calculate margin. If the actual screen size is larger than - * the requested screen size, then update the margins so that - * the margin remains relative to the requested screen size. - * (As an exception, if a zero margin was specified then treat - * this as meaning "expand to edge of actual screen".) - */ - xgap = ( vesafb.pixel.width - config->width ); - ygap = ( vesafb.pixel.height - config->height ); - left = ( xgap / 2 ); - right = ( xgap - left ); - top = ( ygap / 2 ); - bottom = ( ygap - top ); - vesafb.margin.left = ( config->left + ( config->left ? left : 0 ) ); - vesafb.margin.right = ( config->right + ( config->right ? right : 0 ) ); - vesafb.margin.top = ( config->top + ( config->top ? top : 0 ) ); - vesafb.margin.bottom = - ( config->bottom + ( config->bottom ? bottom : 0 ) ); - /* Get font data */ vesafb_font(); /* Initialise frame buffer console */ if ( ( rc = fbcon_init ( &vesafb.fbcon, phys_to_user ( vesafb.start ), - &vesafb.pixel, &vesafb.margin, &vesafb.map, - &vesafb.font, config->pixbuf ) ) != 0 ) + &vesafb.pixel, &vesafb.map, &vesafb.font, + config ) ) != 0 ) goto err_fbcon_init; free ( mode_numbers ); diff --git a/src/core/fbcon.c b/src/core/fbcon.c index 90139c709..44a56e105 100644 --- a/src/core/fbcon.c +++ b/src/core/fbcon.c @@ -575,22 +575,24 @@ static int fbcon_picture_init ( struct fbcon *fbcon, * @v fbcon Frame buffer console * @v start Start address * @v pixel Pixel geometry - * @v margin Minimum margin * @v map Colour mapping * @v font Font definition - * @v pixbuf Background picture (if any) + * @v config Console configuration * @ret rc Return status code */ int fbcon_init ( struct fbcon *fbcon, userptr_t start, struct fbcon_geometry *pixel, - struct fbcon_margin *margin, struct fbcon_colour_map *map, struct fbcon_font *font, - struct pixel_buffer *pixbuf ) { + struct console_configuration *config ) { int width; int height; unsigned int xgap; unsigned int ygap; + unsigned int left; + unsigned int right; + unsigned int top; + unsigned int bottom; int rc; /* Initialise data structure */ @@ -609,24 +611,43 @@ int fbcon_init ( struct fbcon *fbcon, userptr_t start, user_to_phys ( fbcon->start, 0 ), user_to_phys ( fbcon->start, fbcon->len ) ); + /* Calculate margin. If the actual screen size is larger than + * the requested screen size, then update the margins so that + * the margin remains relative to the requested screen size. + * (As an exception, if a zero margin was specified then treat + * this as meaning "expand to edge of actual screen".) + */ + xgap = ( pixel->width - config->width ); + ygap = ( pixel->height - config->height ); + left = ( xgap / 2 ); + right = ( xgap - left ); + top = ( ygap / 2 ); + bottom = ( ygap - top ); + fbcon->margin.left = ( config->left + ( config->left ? left : 0 ) ); + fbcon->margin.right = ( config->right + ( config->right ? right : 0 ) ); + fbcon->margin.top = ( config->top + ( config->top ? top : 0 ) ); + fbcon->margin.bottom = + ( config->bottom + ( config->bottom ? bottom : 0 ) ); + /* Expand margin to accommodate whole characters */ - width = ( pixel->width - margin->left - margin->right ); - height = ( pixel->height - margin->top - margin->bottom ); + width = ( pixel->width - fbcon->margin.left - fbcon->margin.right ); + height = ( pixel->height - fbcon->margin.top - fbcon->margin.bottom ); if ( ( width < FBCON_CHAR_WIDTH ) || ( height < ( ( int ) font->height ) ) ) { DBGC ( fbcon, "FBCON %p has unusable character area " - "[%d-%d),[%d-%d)\n", fbcon, - margin->left, ( pixel->width - margin->right ), - margin->top, ( pixel->height - margin->bottom ) ); + "[%d-%d),[%d-%d)\n", fbcon, fbcon->margin.left, + ( pixel->width - fbcon->margin.right ), + fbcon->margin.top, + ( pixel->height - fbcon->margin.bottom ) ); rc = -EINVAL; goto err_margin; } xgap = ( width % FBCON_CHAR_WIDTH ); ygap = ( height % font->height ); - fbcon->margin.left = ( margin->left + ( xgap / 2 ) ); - fbcon->margin.top = ( margin->top + ( ygap / 2 ) ); - fbcon->margin.right = ( margin->right + ( xgap - ( xgap / 2 ) ) ); - fbcon->margin.bottom = ( margin->bottom + ( ygap - ( ygap / 2 ) ) ); + fbcon->margin.left += ( xgap / 2 ); + fbcon->margin.top += ( ygap / 2 ); + fbcon->margin.right += ( xgap - ( xgap / 2 ) ); + fbcon->margin.bottom += ( ygap - ( ygap / 2 ) ); fbcon->indent = ( ( fbcon->margin.top * pixel->stride ) + ( fbcon->margin.left * pixel->len ) ); @@ -661,7 +682,8 @@ int fbcon_init ( struct fbcon *fbcon, userptr_t start, memset_user ( fbcon->start, 0, 0, fbcon->len ); /* Generate pixel buffer from background image, if applicable */ - if ( pixbuf && ( ( rc = fbcon_picture_init ( fbcon, pixbuf ) ) != 0 ) ) + if ( config->pixbuf && + ( ( rc = fbcon_picture_init ( fbcon, config->pixbuf ) ) != 0 ) ) goto err_picture; /* Draw background picture (including margins), if applicable */ diff --git a/src/include/ipxe/fbcon.h b/src/include/ipxe/fbcon.h index 7837845ed..42ffca3d7 100644 --- a/src/include/ipxe/fbcon.h +++ b/src/include/ipxe/fbcon.h @@ -12,8 +12,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include - -struct pixel_buffer; +#include /** Character width, in pixels */ #define FBCON_CHAR_WIDTH 9 @@ -149,10 +148,9 @@ struct fbcon { extern int fbcon_init ( struct fbcon *fbcon, userptr_t start, struct fbcon_geometry *pixel, - struct fbcon_margin *margin, struct fbcon_colour_map *map, struct fbcon_font *font, - struct pixel_buffer *pixbuf ); + struct console_configuration *config ); extern void fbcon_fini ( struct fbcon *fbcon ); extern void fbcon_putchar ( struct fbcon *fbcon, int character );