📄 scr_vnc_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 + -