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

📄 scr_vnc_ecos.c

📁 eCos操作系统源码
💻 C
字号:
//==========================================================================////      scr_vnc_ecos.c////////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):    Chris Garry <cgarry@sweeneydesign.co.uk>// Contributors:// Date:         2003-08-22// Purpose:// Description:  Microwindows screen driver for VNC server on eCos////####DESCRIPTIONEND####////========================================================================*/#define _GNU_SOURCE 1#include <pkgconf/system.h>#include <assert.h>#include <fcntl.h>#include <limits.h>#include <cyg/hal/drv_api.h>#include <cyg/infra/diag.h>#include <cyg/io/io.h>#include <stdarg.h>#include <stdio.h>#include <stdlib.h>#include <sys/stat.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>#include "device.h"#include "genfont.h"#include "genmem.h"#include <vnc-server.h>/* In genmem.c*/MWBOOL  set_subdriver(PSD psd, PSUBDRIVER subdriver, MWBOOL init);/* Prototypes for driver functions */static int vnc_init(PSD psd);static PSD  vnc_open(PSD psd);static void vnc_close(PSD psd);static void vnc_getscreeninfo(PSD psd,PMWSCREENINFO psi);static void vnc_drawpixel(PSD psd,MWCOORD x, MWCOORD y, MWPIXELVAL c);static MWPIXELVAL vnc_readpixel(PSD psd,MWCOORD x, MWCOORD y);static void vnc_drawhorizline(PSD psd,MWCOORD x1, MWCOORD x2, MWCOORD y, MWPIXELVAL c);static void vnc_drawvertline(PSD psd,MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL c);static void vnc_fillrect(PSD psd,MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, MWPIXELVAL c);static void vnc_blit(PSD , MWCOORD, MWCOORD, MWCOORD, MWCOORD, PSD, MWCOORD, MWCOORD, long);static void vnc_stretchblit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD dstw,                            MWCOORD dsth, PSD srcpsd, MWCOORD srcx, MWCOORD srcy,                            MWCOORD srcw, MWCOORD srch, long op);static void vnc_drawarea(PSD psd, driver_gc_t *gc, int op);MWBOOL vnc_mapmemgc(PSD, MWCOORD, MWCOORD, int, int, int, int, void *);SCREENDEVICE	scrdev = {	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL,    vnc_open,    vnc_close,    vnc_getscreeninfo,	NULL,    vnc_drawpixel,     /* DrawPixel subdriver*/    vnc_readpixel,     /* ReadPixel subdriver*/    vnc_drawhorizline, /* DrawHorzLine subdriver*/    vnc_drawvertline,  /* DrawVertLine subdriver*/    vnc_fillrect,      /* FillRect subdriver*/	gen_fonts,    vnc_blit,          /* Blit subdriver*/	NULL,			   /* PreSelect*/    NULL,              /* DrawArea subdriver*/	NULL,			   /* SetIOPermissions*/	gen_allocatememgc,    vnc_mapmemgc,    gen_freememgc,    vnc_stretchblit,   /* StretchBlit subdriver*/	NULL	           /* SetPortrait*/};SUBDRIVER vnc_subdriver = {    vnc_init,    vnc_drawpixel,    vnc_readpixel,    vnc_drawhorizline,    vnc_drawvertline,    vnc_fillrect,    vnc_blit,    vnc_drawarea,    vnc_stretchblit};/* Static variables*/static int status;		/* 0=never inited, 1=once inited, 2=inited. */static vnc_frame_format_t *frame_format;/* Calc linelen and mmap size, return 0 on fail*/static int vnc_init(PSD psd){    if (!psd->size)    {        psd->size = psd->yres * psd->xres * psd->bpp / 8;        /* convert linelen from byte to pixel len for bpp 16, 24, 32*/        psd->linelen = psd->xres;    }    return 1;}/* Initialise the VNC framebuffer */static PSD vnc_open(PSD psd){    /* Get frame format details */    frame_format = VncGetInfo();    psd->xres = psd->xvirtres = frame_format->frame_width;    psd->yres = psd->yvirtres = frame_format->frame_height;    psd->portrait = MWPORTRAIT_NONE;    psd->planes = 1;  /* Should probably find out what this means */    if (frame_format->rgb332)    {        psd->bpp = 8;        psd->ncolors = 0xFF + 1;        psd->pixtype = MWPF_TRUECOLOR332;    }    else if (frame_format->rgb555)    {        psd->bpp = 16;        psd->ncolors = 0x7FFF + 1;        psd->pixtype = MWPF_TRUECOLOR555;    }    else if (frame_format->rgb565)    {        psd->bpp = 16;        psd->ncolors = 0xFFFF + 1;        psd->pixtype = MWPF_TRUECOLOR565;    }    else if (frame_format->bgr233)    {        psd->bpp = 8;        psd->ncolors = 0xFF + 1;        psd->pixtype = MWPF_TRUECOLOR233;    }    else if (frame_format->truecolor0888)    {        psd->bpp = 32;        psd->ncolors = 0xFFFFFF + 1;        psd->pixtype = MWPF_TRUECOLOR0888;    }    else    {        EPRINTF("Unsupported display type\n");        goto fail;    }    psd->linelen = frame_format->frame_width * psd->bpp / 8;;  /* What is linelen?  - linelen in bytes for now...*/    psd->size = psd->xres * psd->yres * psd->bpp / 8;    psd->flags = PSF_SCREEN | PSF_HAVEBLIT;    psd->addr = frame_format->frame_buffer;  /* Test *///    psd->addr = NULL;  /* We do not want MW to access the frame buffer directly */    /* Initialise the frame buffer (white) */    VncInit(VNC_WHITE);    /* We always use our own subdriver */    psd->orgsubdriver = &vnc_subdriver;    status = 2;    return psd;	/* success*/ fail:    return NULL;}/* Close framebuffer*/static void vnc_close(PSD psd){    printf("%s - NOT IMPLEMENTED\n", __FUNCTION__);}static void vnc_getscreeninfo(PSD psd,PMWSCREENINFO psi){    psi->rows = psd->yvirtres;    psi->cols = psd->xvirtres;    psi->planes = psd->planes;    psi->bpp = psd->bpp;    psi->ncolors = psd->ncolors;    psi->pixtype = psd->pixtype;    psi->fonts = NUMBER_FONTS;    psi->portrait = psd->portrait;    psi->fbdriver = true;    switch (psd->pixtype) {    case MWPF_TRUECOLOR332:        psi->rmask = 0xE0;        psi->gmask = 0x1C;        psi->bmask = 0x03;        break;    case MWPF_TRUECOLOR233:        psi->rmask = 0x07;        psi->gmask = 0x38;        psi->bmask = 0xC0;        break;    case MWPF_TRUECOLOR555:        psi->rmask = 0x7c00;        psi->gmask = 0x03e0;        psi->bmask = 0x001f;        break;    case MWPF_TRUECOLOR565:        psi->rmask = 0xf800;        psi->gmask = 0x07e0;        psi->bmask = 0x001f;        break;    case MWPF_TRUECOLOR0888:        psi->rmask = 0xFF0000;        psi->gmask = 0x00FF00;        psi->bmask = 0x0000FF;        break;    default:        printf("%s - unsupported pixtype\n", __FUNCTION__);        psi->rmask = 0xff;        psi->gmask = 0xff;        psi->bmask = 0xff;        break;    }    /* Need to figure out better values possibly */    psi->xdpcm = 27;    /* assumes screen width of 24 cm */    psi->ydpcm = 27;    /* assumes screen height of 18 cm */}static void vnc_drawpixel(PSD psd, MWCOORD x, MWCOORD y, MWPIXELVAL c){    VncDrawPixel(x, y, (vnc_colour_t)c);}static MWPIXELVAL vnc_readpixel(PSD psd, MWCOORD x, MWCOORD y){    return VncReadPixel(x, y);}static void vnc_drawhorizline(PSD psd, MWCOORD x1, MWCOORD x2, MWCOORD y, MWPIXELVAL c){    VncDrawHorzLine(x1, x2, y, (vnc_colour_t)c);}static void vnc_drawvertline(PSD psd, MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL c){    VncDrawVertLine(x, y1, y2, (vnc_colour_t)c);}static void vnc_fillrect(PSD psd,MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, MWPIXELVAL c){    VncFillRect(x1, y1, x2, y2, (vnc_colour_t)c);}static void vnc_blit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD w, MWCOORD h,                     PSD srcpsd, MWCOORD srcx, MWCOORD srcy, long op){    if (op != 0)    {        diag_printf("vnc_blit(): op = 0x%x not supported\n", op);    }    if (srcpsd->addr == frame_format->frame_buffer && dstpsd->addr != frame_format->frame_buffer)    {        /* Copying rectangle from VNC frame buffer to supplied buffer */        VncCopyRect2Buffer(srcx, srcy, w, h, dstpsd->addr, dstpsd->xres, dstpsd->yres, dstx, dsty);    }    else if (srcpsd->addr != frame_format->frame_buffer && dstpsd->addr == frame_format->frame_buffer)    {        /* Copying rectangle from a supplied buffer to the VNC frame buffer */        VncCopyBuffer2Rect(srcpsd->addr, srcpsd->xres, srcpsd->yres, srcx, srcy, dstx, dsty, w, h);    }    else if (srcpsd->addr == frame_format->frame_buffer && dstpsd->addr == frame_format->frame_buffer)    {        /* Copying rectangle from VNC frame buffer to VNC frame buffer */        VncCopyRect(srcx, srcy, w, h, dstx, dsty);    }    else    {        diag_printf("vnc_blit(): Error unsupported operation\n");    }}static void vnc_stretchblit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD dstw,                            MWCOORD dsth, PSD srcpsd, MWCOORD srcx, MWCOORD srcy,                            MWCOORD srcw, MWCOORD srch, long op){    diag_printf("vnc_stretch_blit() not implemented\n");}static void vnc_drawarea(PSD psd, driver_gc_t *gc, int op){    diag_printf("vnc_drawarea() not implemented\n");}/* * Initialize memory device with passed parms, * select suitable framebuffer subdriver, * and set subdriver in memory device. */MWBOOL vnc_mapmemgc(PSD mempsd,MWCOORD w,MWCOORD h,int planes,int bpp,int linelen,    int size,void *addr){    PSUBDRIVER subdriver;    /* initialize mem screen driver*/    initmemgc(mempsd, w, h, planes, bpp, linelen, size, addr);    subdriver = &vnc_subdriver;    /* set and initialize subdriver into mem screen driver*/    if(!set_subdriver(mempsd, subdriver, TRUE))    {        diag_printf("set_subdriver() failed\n");        return 0;    }    return 1;}

⌨️ 快捷键说明

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