summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorMichael Brown2015-10-14 23:01:29 +0200
committerMichael Brown2015-10-14 23:16:45 +0200
commit79afe60b0931f56ea2ee596aaae61f5ff0194de6 (patch)
tree9494a7ff02bd217818ba87a7d6fbcbbc71869dcc /src/core
parent[fbcon] Allow character height to be selected at runtime (diff)
downloadipxe-79afe60b0931f56ea2ee596aaae61f5ff0194de6.tar.gz
ipxe-79afe60b0931f56ea2ee596aaae61f5ff0194de6.tar.xz
ipxe-79afe60b0931f56ea2ee596aaae61f5ff0194de6.zip
[fbcon] Move margin calculations to fbcon.c
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/fbcon.c50
1 files changed, 36 insertions, 14 deletions
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 */