]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[fbcon] Move margin calculations to fbcon.c
authorMichael Brown <mcb30@ipxe.org>
Wed, 14 Oct 2015 21:01:29 +0000 (22:01 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 14 Oct 2015 21:16:45 +0000 (22:16 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/interface/pcbios/vesafb.c
src/core/fbcon.c
src/include/ipxe/fbcon.h

index 4742f956b27940360e114f041a0e2e4636b30aba..6d2c1bcae405de64a4109e389761183e91101166 100644 (file)
@@ -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 );
index 90139c709a8c73118a3ea8d1937c774371e44103..44a56e10535796582a4d4973ddf30fae8504033a 100644 (file)
@@ -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 */
index 7837845ed99093824f6da3bc6ec7025a8181b832..42ffca3d7dd452f0ba03494be5e8829096a8afcc 100644 (file)
@@ -12,8 +12,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #include <stdint.h>
 #include <ipxe/ansiesc.h>
 #include <ipxe/uaccess.h>
-
-struct pixel_buffer;
+#include <ipxe/console.h>
 
 /** 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 );