fbconsole.c

来自「cpc-1631的BSP包for VxWorks操作系统」· C语言 代码 · 共 911 行 · 第 1/3 页

C
911
字号
void *video_fb_address;          /* frame buffer address */
static void *video_console_address;     /* console buffer start address */

static int console_col = 0; /* cursor col */
static int console_row = 0; /* cursor row */

static UINT32 eorx, fgx, bgx;  /* color pats */

static const int video_font_draw_table8[] = {
            0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff,
            0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff,
            0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff,
            0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff };

static const int video_font_draw_table15[] = {
            0x00000000, 0x00007fff, 0x7fff0000, 0x7fff7fff };

static const int video_font_draw_table16[] = {
            0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff };

static const int video_font_draw_table24[16][3] = {
            { 0x00000000, 0x00000000, 0x00000000 },
            { 0x00000000, 0x00000000, 0x00ffffff },
            { 0x00000000, 0x0000ffff, 0xff000000 },
            { 0x00000000, 0x0000ffff, 0xffffffff },
            { 0x000000ff, 0xffff0000, 0x00000000 },
            { 0x000000ff, 0xffff0000, 0x00ffffff },
            { 0x000000ff, 0xffffffff, 0xff000000 },
            { 0x000000ff, 0xffffffff, 0xffffffff },
            { 0xffffff00, 0x00000000, 0x00000000 },
            { 0xffffff00, 0x00000000, 0x00ffffff },
            { 0xffffff00, 0x0000ffff, 0xff000000 },
            { 0xffffff00, 0x0000ffff, 0xffffffff },
            { 0xffffffff, 0xffff0000, 0x00000000 },
            { 0xffffffff, 0xffff0000, 0x00ffffff },
            { 0xffffffff, 0xffffffff, 0xff000000 },
            { 0xffffffff, 0xffffffff, 0xffffffff } };

static const int video_font_draw_table32[16][4] = {
            { 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
            { 0x00000000, 0x00000000, 0x00000000, 0x00ffffff },
            { 0x00000000, 0x00000000, 0x00ffffff, 0x00000000 },
            { 0x00000000, 0x00000000, 0x00ffffff, 0x00ffffff },
            { 0x00000000, 0x00ffffff, 0x00000000, 0x00000000 },
            { 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff },
            { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00000000 },
            { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00ffffff },
            { 0x00ffffff, 0x00000000, 0x00000000, 0x00000000 },
            { 0x00ffffff, 0x00000000, 0x00000000, 0x00ffffff },
            { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000 },
            { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00ffffff },
            { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00000000 },
            { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00ffffff },
            { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00000000 },
            { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff } };


/******************************************************************************/


static void video_drawchars (int xx, int yy, unsigned char *s, int count)
{
    UINT8  *cdat, *dest, *dest0;
    int rows, offset, c;

    offset = yy * VIDEO_LINE_LEN + xx * VIDEO_PIXEL_SIZE;
    dest0 = video_fb_address + offset;

    switch (VIDEO_DATA_FORMAT)
    {
    case GDF__8BIT_INDEX:
    case GDF__8BIT_332RGB:
        while (count--)
        {
        c = *s ;
        cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
        for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
	     rows--; dest += VIDEO_LINE_LEN){
            UINT8 bits = *cdat++;
            ((UINT32 *)dest)[0] =
		(video_font_draw_table8[bits >> 4] & eorx) ^ bgx;
            ((UINT32 *)dest)[1] =
		(video_font_draw_table8[bits & 15] & eorx) ^ bgx;
        }	
        dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
        s++;
        }	
        break;

    case GDF_15BIT_555RGB:
        while (count--)
        {
        c = *s ;
        cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
        for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
	     rows--; dest += VIDEO_LINE_LEN) {
            UINT8 bits = *cdat++;
            ((UINT32 *)dest)[0] =
		SHORTSWAP32((video_font_draw_table15[bits >> 6] & eorx) ^ bgx);
            ((UINT32 *)dest)[1] =
	    SHORTSWAP32((video_font_draw_table15[bits >> 4 & 3] & eorx) ^ bgx);
            ((UINT32 *)dest)[2] =
	    SHORTSWAP32((video_font_draw_table15[bits >> 2 & 3] & eorx) ^ bgx);
            ((UINT32 *)dest)[3] =
		SHORTSWAP32((video_font_draw_table15[bits & 3] & eorx) ^ bgx);
            }
            dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
            s++ ;
        }
        break;

    case GDF_16BIT_565RGB:
        while (count--)
        {
        c = *s ;
        cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
        for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
	     rows--; dest += VIDEO_LINE_LEN) {
            UINT8 bits = *cdat++;
            ((UINT32 *)dest)[0] =
		SHORTSWAP32((video_font_draw_table16[bits >> 6] & eorx) ^ bgx);
            ((UINT32 *)dest)[1] =
	    SHORTSWAP32((video_font_draw_table16[bits >> 4 & 3] & eorx) ^ bgx);
            ((UINT32 *)dest)[2] =
	    SHORTSWAP32((video_font_draw_table16[bits >> 2 & 3] & eorx) ^ bgx);
            ((UINT32 *)dest)[3] =
		SHORTSWAP32((video_font_draw_table16[bits & 3] & eorx) ^ bgx);
        }
        dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
        s++ ;
        }
        break;

    case GDF_32BIT_X888RGB:
        while (count--)
        {
        c = *s ;
        cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
        for (rows = VIDEO_FONT_HEIGHT, dest = dest0; rows--;
	     dest += VIDEO_LINE_LEN) {
            UINT8 bits = *cdat++;
            ((UINT32 *)dest)[0] =
		SWAP32((video_font_draw_table32[bits >> 4][0] & eorx) ^ bgx);
            ((UINT32 *)dest)[1] =
		SWAP32((video_font_draw_table32[bits >> 4][1] & eorx) ^ bgx);
            ((UINT32 *)dest)[2] =
		SWAP32((video_font_draw_table32[bits >> 4][2] & eorx) ^ bgx);
            ((UINT32 *)dest)[3] =
		SWAP32((video_font_draw_table32[bits >> 4][3] & eorx) ^ bgx);
            ((UINT32 *)dest)[4] =
		SWAP32((video_font_draw_table32[bits & 15][0] & eorx) ^ bgx);
            ((UINT32 *)dest)[5] =
		SWAP32((video_font_draw_table32[bits & 15][1] & eorx) ^ bgx);
            ((UINT32 *)dest)[6] =
		SWAP32((video_font_draw_table32[bits & 15][2] & eorx) ^ bgx);
            ((UINT32 *)dest)[7] =
		SWAP32((video_font_draw_table32[bits & 15][3] & eorx) ^ bgx);
        }
        dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
        s++ ;
        }
        break;

    case GDF_24BIT_888RGB:
        while (count--)
        {
        c = *s ;
        cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
        for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
	     rows--; dest += VIDEO_LINE_LEN) {
            UINT8 bits = *cdat++;
            ((UINT32 *)dest)[0] =
		(video_font_draw_table24[bits >> 4][0] & eorx) ^ bgx;
            ((UINT32 *)dest)[1] =
		(video_font_draw_table24[bits >> 4][1] & eorx) ^ bgx;
            ((UINT32 *)dest)[2] =
		(video_font_draw_table24[bits >> 4][2] & eorx) ^ bgx;
            ((UINT32 *)dest)[3] =
		(video_font_draw_table24[bits & 15][0] & eorx) ^ bgx;
            ((UINT32 *)dest)[4] =
		(video_font_draw_table24[bits & 15][1] & eorx) ^ bgx;
            ((UINT32 *)dest)[5] =
		(video_font_draw_table24[bits & 15][2] & eorx) ^ bgx;
        }
        dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
        s++ ;
        }
        break;
    }
}

/*****************************************************************************/

void video_drawstring(int xx, int yy, unsigned char *s)
{
    video_drawchars (xx, yy, s, strlen(s));
}

/*****************************************************************************/

static void video_putchar(int xx, int yy, unsigned char c)
{
    video_drawchars (xx, yy + VIDEO_LOGO_HEIGHT, &c, 1);
}

/*****************************************************************************/
#if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR)
static void video_set_cursor(void)
{
    /* swap drawing colors */
    eorx = fgx;
    fgx  = bgx;
    bgx  = eorx;
    eorx = fgx ^ bgx;
    /* draw cursor */
    video_putchar (console_col * VIDEO_FONT_WIDTH,
                   console_row * VIDEO_FONT_HEIGHT, ' ');
    /* restore drawing colors */
    eorx = fgx;
    fgx  = bgx;
    bgx  = eorx;
    eorx = fgx ^ bgx;
}
#endif
/*****************************************************************************/
#ifdef CONFIG_CONSOLE_CURSOR
void console_cursor (int state)
{
    static int last_state = 0;

    if (state && (last_state != state))
    {
        video_set_cursor();
    }

    if (!state && (last_state != state))
    {
        /* clear cursor */
        video_putchar (console_col * VIDEO_FONT_WIDTH,
                       console_row * VIDEO_FONT_HEIGHT, ' ');
    }

    last_state = state;
}
#endif

/*****************************************************************************/

#ifndef VIDEO_HW_RECTFILL
static void memsetl (int *p, int c, int v)
{
    while (c--)
        *(p++) = v;
}
#endif

/*****************************************************************************/

#ifndef VIDEO_HW_BITBLT
static void memcpyl (int *d, int *s, int c)
{
    while (c--)
        *(d++) = *(s++);
}
#endif

/*****************************************************************************/

static void console_scrollup (void)
{
    /* copy up rows ignoring the first one */

#ifdef VIDEO_HW_BITBLT
    video_hw_bitblt (
    VIDEO_PIXEL_SIZE,     /* bytes per pixel */
    0,                    /* source pos x */
    VIDEO_LOGO_HEIGHT + VIDEO_FONT_HEIGHT, /* source pos y */
    0,                    /* dest pos x */
    VIDEO_LOGO_HEIGHT,    /* dest pos y */
    VIDEO_VISIBLE_COLS,   /* frame width */
    VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT /* frame height */
    );
#else
    memcpyl (CONSOLE_ROW_FIRST, CONSOLE_ROW_SECOND, CONSOLE_SCROLL_SIZE >> 2);
#endif

    /* clear the last one */
#ifdef VIDEO_HW_RECTFILL
    video_hw_rectfill (
    VIDEO_PIXEL_SIZE,     /* bytes per pixel */
    0,                    /* dest pos x */
    VIDEO_VISIBLE_ROWS - VIDEO_FONT_HEIGHT,  /* dest pos y */
    VIDEO_VISIBLE_COLS,   /* frame width */
    VIDEO_FONT_HEIGHT,    /* frame height */
    CONSOLE_BG_COL          /* fill color */
    );
#else
    memsetl (CONSOLE_ROW_LAST, CONSOLE_ROW_SIZE >> 2, CONSOLE_BG_COL);
#endif
}

/*****************************************************************************/

static void console_back (void)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?