Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/fb/fb.c

    rc43b89e8 radec5b45  
    3535
    3636#include <genarch/fb/font-8x16.h>
     37#include <genarch/fb/logo-196x66.h>
    3738#include <genarch/fb/fb.h>
    3839#include <console/chardev.h>
     
    5253#include <byteorder.h>
    5354
    54 #define BG_COLOR     0x001620
    55 #define FG_COLOR     0xf3cf65
     55#define BG_COLOR     0x000080
     56#define FG_COLOR     0xffff00
    5657#define INV_COLOR    0xaaaaaa
    5758
     
    9293        unsigned int yres;
    9394       
     95        unsigned int ylogo;
     96        unsigned int ytrim;
    9497        unsigned int rowtrim;
    9598       
     
    210213}
    211214
     215/** Hide logo and refresh screen
     216 *
     217 */
     218static void logo_hide(fb_instance_t *instance)
     219{
     220        instance->ylogo = 0;
     221        instance->ytrim = instance->yres;
     222        instance->rowtrim = instance->rows;
     223       
     224        if ((!instance->parea.mapped) || (console_override))
     225                fb_redraw_internal(instance);
     226}
     227
    212228/** Draw character at given position
    213229 *
     
    220236        unsigned int yd;
    221237       
     238        if (y >= instance->ytrim)
     239                logo_hide(instance);
     240       
    222241        if (!overlay)
    223242                instance->backbuf[BB_POS(instance, col, row)] = glyph;
     
    225244        if ((!instance->parea.mapped) || (console_override)) {
    226245                for (yd = 0; yd < FONT_SCANLINES; yd++)
    227                         memcpy(&instance->addr[FB_POS(instance, x, y + yd)],
     246                        memcpy(&instance->addr[FB_POS(instance, x, y + yd + instance->ylogo)],
    228247                            &instance->glyphs[GLYPH_POS(instance, glyph, yd)],
    229248                            instance->glyphscanline);
     
    237256static void screen_scroll(fb_instance_t *instance)
    238257{
     258        if (instance->ylogo > 0) {
     259                logo_hide(instance);
     260                return;
     261        }
     262       
    239263        if ((!instance->parea.mapped) || (console_override)) {
    240264                unsigned int row;
     
    366390                            instance->position / instance->cols, false);
    367391                        instance->position++;
    368                 } while (((instance->position % instance->cols) % 8 != 0) &&
    369                     (instance->position < instance->cols * instance->rows));
     392                } while ((instance->position % 8)
     393                    && (instance->position < instance->cols * instance->rows));
    370394                break;
    371395        default:
     
    388412static void fb_redraw_internal(fb_instance_t *instance)
    389413{
     414        if (instance->ylogo > 0) {
     415                unsigned int y;
     416               
     417                for (y = 0; y < LOGO_HEIGHT; y++) {
     418                        unsigned int x;
     419                       
     420                        for (x = 0; x < instance->xres; x++)
     421                                instance->rgb_conv(&instance->addr[FB_POS(instance, x, y)],
     422                                    (x < LOGO_WIDTH) ?
     423                                    fb_logo[y * LOGO_WIDTH + x] :
     424                                    LOGO_COLOR);
     425                }
     426        }
     427       
    390428        unsigned int row;
    391429       
    392430        for (row = 0; row < instance->rowtrim; row++) {
    393                 unsigned int y = ROW2Y(row);
     431                unsigned int y = instance->ylogo + ROW2Y(row);
    394432                unsigned int yd;
    395433               
     
    414452                    (instance->xres - COL2X(instance->cols)) * instance->pixelbytes;
    415453               
    416                 for (y = 0; y < instance->yres; y++)
     454                for (y = instance->ylogo; y < instance->yres; y++)
    417455                        memcpy(&instance->addr[FB_POS(instance, COL2X(instance->cols), y)],
    418456                            instance->bgscan, size);
    419457        }
    420458       
    421         if (ROW2Y(instance->rowtrim) < instance->yres) {
     459        if (ROW2Y(instance->rowtrim) + instance->ylogo < instance->yres) {
    422460                unsigned int y;
    423461               
    424                 for (y = ROW2Y(instance->rowtrim); y < instance->yres; y++)
     462                for (y = ROW2Y(instance->rowtrim) + instance->ylogo;
     463                    y < instance->yres; y++)
    425464                        memcpy(&instance->addr[FB_POS(instance, 0, y)],
    426465                            instance->bgscan, instance->bgscanbytes);
     
    528567        instance->rows = Y2ROW(instance->yres);
    529568       
    530         instance->rowtrim = instance->rows;
     569        if (instance->yres > LOGO_HEIGHT) {
     570                instance->ylogo = LOGO_HEIGHT;
     571                instance->rowtrim = instance->rows - Y2ROW(instance->ylogo);
     572                if (instance->ylogo % FONT_SCANLINES > 0)
     573                        instance->rowtrim--;
     574                instance->ytrim = ROW2Y(instance->rowtrim);
     575        } else {
     576                instance->ylogo = 0;
     577                instance->ytrim = instance->yres;
     578                instance->rowtrim = instance->rows;
     579        }
    531580       
    532581        instance->glyphscanline = FONT_WIDTH * instance->pixelbytes;
Note: See TracChangeset for help on using the changeset viewer.