]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[fbcon] Allow for an arbitrary margin around the text area
authorMichael Brown <mcb30@ipxe.org>
Wed, 22 Jan 2014 13:57:07 +0000 (13:57 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 22 Jan 2014 14:26:31 +0000 (14:26 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/interface/pcbios/vesafb.c
src/core/fbcon.c
src/include/ipxe/console.h
src/include/ipxe/fbcon.h

index 480c9acf76ed448327180022472565708bad22f9..bc2301cc6298cdfa9a16c5556cc97ee882d8e90e 100644 (file)
@@ -76,6 +76,8 @@ 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 */
@@ -428,8 +430,8 @@ static int vesafb_init ( unsigned int min_width, unsigned int min_height,
 
        /* Initialise frame buffer console */
        if ( ( rc = fbcon_init ( &vesafb.fbcon, phys_to_user ( vesafb.start ),
-                                &vesafb.pixel, &vesafb.map, &vesafb.font,
-                                pixbuf ) ) != 0 )
+                                &vesafb.pixel, &vesafb.margin, &vesafb.map,
+                                &vesafb.font, pixbuf ) ) != 0 )
                goto err_fbcon_init;
 
        free ( mode_numbers );
index 72bfae2a8088898ea65031059856389f40008fd0..32ae43bee6528507f52477cb5927441cf3538b68 100644 (file)
@@ -573,6 +573,7 @@ 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)
@@ -580,9 +581,12 @@ static int fbcon_picture_init ( struct fbcon *fbcon,
  */
 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 ) {
+       int width;
+       int height;
        unsigned int xgap;
        unsigned int ygap;
        int rc;
@@ -603,21 +607,31 @@ int fbcon_init ( struct fbcon *fbcon, userptr_t start,
               user_to_phys ( fbcon->start, 0 ),
               user_to_phys ( fbcon->start, fbcon->len ) );
 
+       /* Expand margin to accommodate whole characters */
+       width = ( pixel->width - margin->left - margin->right );
+       height = ( pixel->height - margin->top - margin->bottom );
+       if ( ( width < FBCON_CHAR_WIDTH ) || ( height < FBCON_CHAR_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 ) );
+               rc = -EINVAL;
+               goto err_margin;
+       }
+       xgap = ( width % FBCON_CHAR_WIDTH );
+       ygap = ( height % FBCON_CHAR_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->indent = ( ( fbcon->margin.top * pixel->stride ) +
+                         ( fbcon->margin.left * pixel->len ) );
+
        /* Derive character geometry from pixel geometry */
-       fbcon->character.width = ( pixel->width / FBCON_CHAR_WIDTH );
-       fbcon->character.height = ( pixel->height / FBCON_CHAR_HEIGHT );
+       fbcon->character.width = ( width / FBCON_CHAR_WIDTH );
+       fbcon->character.height = ( height / FBCON_CHAR_HEIGHT );
        fbcon->character.len = ( pixel->len * FBCON_CHAR_WIDTH );
        fbcon->character.stride = ( pixel->stride * FBCON_CHAR_HEIGHT );
-
-       /* Calculate margin */
-       xgap = ( pixel->width % FBCON_CHAR_WIDTH );
-       ygap = ( pixel->height % FBCON_CHAR_HEIGHT );
-       fbcon->margin.left = ( xgap / 2 );
-       fbcon->margin.top = ( ygap / 2 );
-       fbcon->margin.right = ( xgap - fbcon->margin.left );
-       fbcon->margin.bottom = ( ygap - fbcon->margin.top );
-       fbcon->indent = ( ( fbcon->margin.top * pixel->stride ) +
-                         ( fbcon->margin.left * pixel->len ) );
        DBGC ( fbcon, "FBCON %p is pixel %dx%d, char %dx%d at "
               "[%d-%d),[%d-%d)\n", fbcon, fbcon->pixel->width,
               fbcon->pixel->height, fbcon->character.width,
@@ -662,6 +676,7 @@ int fbcon_init ( struct fbcon *fbcon, userptr_t start,
  err_picture:
        ufree ( fbcon->text.start );
  err_text:
+ err_margin:
        return rc;
 }
 
index ab39cbfc1b15b74163b959a413b29dc5b48bd846..6696a5b8d098885f9ec2cdd51fd80721adb73a08 100644 (file)
@@ -28,6 +28,14 @@ struct console_configuration {
        unsigned int height;
        /** Colour depth */
        unsigned int bpp;
+       /** Left margin */
+       unsigned int left;
+       /** Right margin */
+       unsigned int right;
+       /** Top margin */
+       unsigned int top;
+       /** Bottom margin */
+       unsigned int bottom;
        /** Background picture, if any */
        struct pixel_buffer *pixbuf;
 };
index 007e7e7261933200d935ea65504c89403f989c84..0538449ac56788241d4bcd902a2e0a5c1c1081c1 100644 (file)
@@ -145,6 +145,7 @@ 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 );