⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vnc-server.c

📁 eCos/RedBoot for勤研ARM AnywhereII(4510) 含全部源代码
💻 C
📖 第 1 页 / 共 4 页
字号:

void VncInit(vnc_colour_t colour)
{
    /* Initialise the frame buffer */
    int i, j;

    for (i = 0; i < CYGNUM_VNC_SERVER_FRAME_HEIGHT; i++)
    {
        for (j = 0; j < CYGNUM_VNC_SERVER_FRAME_WIDTH; j++)
        {
            frame_buffer[i][j] = colour;
        }
    }

    for (i = 0; i < CYGNUM_VNC_SERVER_FRAME_HEIGHT/TILE_SIZE; i++)
    {
        for (j = 0; j < CYGNUM_VNC_SERVER_FRAME_WIDTH/TILE_SIZE; j++)
        {
            tile_updated[i][j] = 1;
        }
    }
}


void VncDrawPixel(cyg_uint16 x, cyg_uint16 y, vnc_colour_t colour)
{
    /* Set that pixel to 'colour' */
    frame_buffer[y][x] = colour;

    /* Mark the tile for update */
    tile_updated[y/TILE_SIZE][x/TILE_SIZE] = 1;
}


vnc_colour_t VncReadPixel(cyg_uint16 x, cyg_uint16 y)
{
    return frame_buffer[y][x];
}


void VncDrawHorzLine(cyg_uint16 x1, cyg_uint16 x2, cyg_uint16 y, vnc_colour_t colour)
{
    int i;

    /* Draw the line */
    for (i = x1; i <= x2; i++)
    {

        frame_buffer[y][i] = colour;
    }

    /* Mark the tiles for update */
    for (i = x1/TILE_SIZE; i <= x2/TILE_SIZE; i++)
    {
        tile_updated[y/TILE_SIZE][i] = 1;
    }
}

void VncDrawVertLine(cyg_uint16 x, cyg_uint16 y1, cyg_uint16 y2, vnc_colour_t colour)
{
    int i;

    /* Draw the line */
    for (i = y1; i <= y2; i++)
    {
        frame_buffer[i][x] = colour;
    }

    /* Mark the tiles for update */
    for (i = y1/TILE_SIZE; i <= y2/TILE_SIZE; i++)
    {
        tile_updated[i][x/TILE_SIZE] = 1;
    }
}


void VncFillRect(cyg_uint16 x1, cyg_uint16 y1, cyg_uint16 x2, cyg_uint16 y2, vnc_colour_t colour)
{
    /* Draw a solid rectangle */
    int i, j;

    for (i = y1; i <= y2; i++)
    {
        for (j = x1; j <= x2; j++)
        {
            frame_buffer[i][j] = colour;
        }
    }

    for (i = y1/TILE_SIZE; i <= y2/TILE_SIZE; i++)
    {
        for (j = x1/TILE_SIZE; j <= x2/TILE_SIZE; j++)
        {
            tile_updated[i][j] = 1;
        }
    }
}


/* Copy rectangle of size widthxheight form (x1, y1) to (x2, y2) */
void VncCopyRect(cyg_uint16 x1, cyg_uint16 y1, cyg_uint16 width, cyg_uint16 height, cyg_uint16 x2, cyg_uint16 y2)
{
    int i, j;
    int xmove, ymove;

    /* Calulate how much to move the rectangle by */
    xmove = x2 - x1;
    ymove = y2 - y1;

    if ((xmove == 0) && (ymove == 0))
    {
        /* No move required */
        return;
    }

    if (ymove < 0)
    {
        /* Copy pixels from top to bottom */
        if (x1 >= x2)
        {
            /* Copy pixels from left to right */
            for (i = y1; i < y1 + height; i++)
            {
                for (j = x1; j < x1 + width; j++)
                {
                    frame_buffer[i + ymove][j + xmove] = frame_buffer[i][j];
                }
            }
        }
        else
        {
            /* Copy pixels from right to left */
            for (i = y1; i < y1 + height; i++)
            {
                for (j = x1 + width - 1; j >= x1 ; j--)
                {
                    frame_buffer[i + ymove][j + xmove] = frame_buffer[i][j];
                }
            }
        }
    }
    else
    {
        /* Copy pixels from bottom to top */
        if (xmove < 0)
        {
            /* Copy pixels from left to right */
            for (i = y1 + height - 1; i >= y1; i--)
            {
                for (j = x1; j < x1 + width; j++)
                {
                    frame_buffer[i + ymove][j + xmove] = frame_buffer[i][j];
                }
            }
        }
        else
        {
            /* Copy pixels from right to left */
            for (i = y1 + height - 1; i >= y1; i--)
            {
                for (j = x1 + width - 1; j >= x1 ; j--)
                {
                    frame_buffer[i + ymove][j + xmove] = frame_buffer[i][j];
                }
            }
        }

    }

    /* Mark the required tiles for update */
    for (i = y2/TILE_SIZE; i <= (y2 + height - 1) /TILE_SIZE; i++)
    {
        for (j = x2/TILE_SIZE; j <= (x2 + width - 1)/TILE_SIZE; j++)
        {
            tile_updated[i][j] = 1;
        }
    }
}


/* Function to copy a rectangle from the frame buffer to a supplied buffer */
void VncCopyRect2Buffer(cyg_uint16 x, cyg_uint16 y, cyg_uint16 width, cyg_uint16 height,
                        void *buffer, cyg_uint16 buff_w, cyg_uint16 buff_h, cyg_uint16 x_off, cyg_uint16 y_off)
{
    int i, j;
    cyg_uint16 eol_padding = buff_w - width - x_off;

#if (BITS_PER_PIXEL == 8)
    cyg_uint8 *dst_buffer;
    dst_buffer = (cyg_uint8 *)buffer;
#else
    cyg_uint16 *dst_buffer;
    dst_buffer = (cyg_uint16 *)buffer;
#endif

    dst_buffer += ((x_off + width) * y_off);  /* Allow for a y offset into supplied buffer */
    for (i = y; i < y + height; i++)
    {
        dst_buffer += x_off;  /* Allow for an x offset into supplied buffer */
        for (j = x; j < x + width; j++)
        {
            /* Copy each pixel in the rectangle to the supplied buffer */
            *dst_buffer = frame_buffer[i][j];
            dst_buffer++;
        }

        dst_buffer += eol_padding;  /* Allow for unused space at the end of each line */
    }
}


/* Function to copy data from a supplied buffer to a rectangle in the frame buffer */
void VncCopyBuffer2Rect( void *buffer, cyg_uint16 buff_w, cyg_uint16 buff_h ,cyg_uint16 x_off, cyg_uint16 y_off,
                         cyg_uint16 x, cyg_uint16 y, cyg_uint16 width, cyg_uint16 height)
{
    int i, j;
    cyg_uint16 eol_padding = buff_w - width - x_off;

#if (BITS_PER_PIXEL == 8)
    cyg_uint8 *src_buffer = (cyg_uint8 *)buffer;
#else
    cyg_uint16 *src_buffer = (cyg_uint16 *)buffer;
#endif

    src_buffer += ((x_off + width) * y_off);  /* Allow for a y offset into supplied buffer */
    for (i = y; i < y + height; i++)
    {
        src_buffer += x_off;  /* Allow for an x offset into supplied buffer */
        for (j = x; j < x + width; j++)
        {
            /* Copy each pixel in the supplied buffer to the frame buffer */
            frame_buffer[i][j] = *src_buffer;
            src_buffer++;
        }

        src_buffer += eol_padding;  /* Allow for unused space at the end of each line */
    }

    /* Mark the required tiles for update */
    for (i = y/TILE_SIZE; i <= (y + height - 1) /TILE_SIZE; i++)
    {
        for (j = x/TILE_SIZE; j <= (x + width - 1)/TILE_SIZE; j++)
        {
            tile_updated[i][j] = 1;
        }
    }
}


/* Function to copy data from a supplied buffer to a rectangle in the frame buffer with mask */
void VncCopyBuffer2RectMask( void *buffer, cyg_uint16 buff_w, cyg_uint16 buff_h ,cyg_uint16 x_off, cyg_uint16 y_off,
                             cyg_uint16 x, cyg_uint16 y, cyg_uint16 width, cyg_uint16 height, vnc_colour_t col)
{
    int i, j;
    cyg_uint16 eol_padding = buff_w - width - x_off;

#if (BITS_PER_PIXEL == 8)
    cyg_uint8 *src_buffer = (cyg_uint8 *)buffer;
#else
    cyg_uint16 *src_buffer = (cyg_uint16 *)buffer;
#endif

    src_buffer += ((x_off + width) * y_off);  /* Allow for a y offset into supplied buffer */
    for (i = y; i < y + height; i++)
    {
        src_buffer += x_off;  /* Allow for an x offset into supplied buffer */
        for (j = x; j < x + width; j++)
        {
            /* Copy each non-mask pixel in the supplied buffer to the frame buffer */
            if (*src_buffer != col)
            {
                frame_buffer[i][j] = *src_buffer;
            }

            src_buffer++;
        }

        src_buffer += eol_padding;  /* Allow for unused space at the end of each line */
    }

    /* Mark the required tiles for update */
    for (i = y/TILE_SIZE; i <= (y + height - 1) /TILE_SIZE; i++)
    {
        for (j = x/TILE_SIZE; j <= (x + width - 1)/TILE_SIZE; j++)
        {
            tile_updated[i][j] = 1;
        }
    }
}


void VncSoundBell(void)
{
    cyg_mutex_lock(&SoundBell_lock);
    SoundBellCount++;
    cyg_mutex_unlock(&SoundBell_lock);
}


#ifdef CYGNUM_VNC_SERVER_INCLUDE_VNC_PRINTF

vnc_printf_return_t VncPrintf(MWCFONT* font, int do_print, vnc_colour_t colour, int x, int y, const char *fmt, ... )
{
    va_list args;
    static char buf[200];
    int x_pos, x_max, y_pos, y_max, char_pos;
    int char_offset, char_width;
    int ret, i, j;
    MWCFONT* sel_font;
    vnc_printf_return_t ret_vals;

    cyg_scheduler_lock();  /* Prevent other threads from running */

    va_start(args, fmt);
    ret = diag_vsprintf(buf, fmt, args);
    va_end(args);

    if (ret <= 0)
    {
        /* sprintf failed */
        ret_vals.width = 0;
        ret_vals.height = 0;
        return ret_vals;
    }

    x_pos = x;  /* Initial print positions */
    x_max = x_pos;
    y_pos = y;
    y_max = y_pos;
    char_pos = 0;

    if (font == NULL)
    {
        /* No font specified - use default font */
        sel_font = &font_winFreeSystem14x16;
    }
    else
    {
        /* Font has been specified */
        sel_font = font;
    }

    while (buf[char_pos] != 0)
    {
        /* Check for '\n' character */
        if (buf[char_pos] == '\n')
        {
            x_pos = x;
            y_pos += sel_font->height;
            char_pos++;
            continue;
        }

        /* Check for characters not if the font - set to first char */
        if (buf[char_pos] < sel_font->firstchar)
        {
            buf[char_pos] = sel_font->firstchar;
        }


        char_offset = ((cyg_uint8) buf[char_pos]) - sel_font->firstchar;

        /* Get the character width */
        if (sel_font->width != 0)
        {
            char_width = sel_font->width[char_offset];
        }
        else
        {
            char_width = sel_font->maxwidth;
        }

        if (sel_font->offset != 0)
        {
            char_offset = sel_font->offset[char_offset];
        }
        else
        {
            char_offset *= sel_font->height;
        }

        y_max = y_pos;

        if (do_print)
        {
        /* Draw the character in the frame buffer */
        for (i = char_offset; i < (char_offset + sel_font->height); i++)
        {
            if ((y_pos + i - char_offset) < CYGNUM_VNC_SERVER_FRAME_HEIGHT)
            {
                    /* This has not gone off the bottom of the frame */
                    for (j = 0; j < char_width; j++)
                    {
                        if ((x_pos + j) < CYGNUM_VNC_SERVER_FRAME_WIDTH)
                        {
                            /* This has not gone off the right edge of the frame */
                            if (sel_font->bits[i] & (0x8000 >> j))
                            {
                                /* This pixel should be drawn */
                                frame_buffer[y_pos + i - char_offset][x_pos + j] = colour;
                            }
                        }
                    }
                }
            }
        }

        x_pos += char_width;
        if (x_pos > x_max)
        {
            x_max = x_pos;
        }

        char_pos++;
    }

    /* Mark the required tiles for update */
    if (do_print)
    {
    for (i = y/TILE_SIZE; i <= (y_max + sel_font->height)/TILE_SIZE; i++)
    {
        for (j = x/TILE_SIZE; j <= x_max/TILE_SIZE; j++)
        {
            tile_updated[i][j] = 1;
            }
        }
    }

    ret_vals.width = x_max - x;
    ret_vals.height = y_max + sel_font->height - y;

    cyg_scheduler_unlock();  /* Allow other threads to run */

    return ret_vals;
}
#endif

⌨️ 快捷键说明

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