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 + -
显示快捷键?