📄 scr_tc.c
字号:
/* * Copyright (c) 1999 Greg Haerr <greg@censoft.com> * * Copyright (c) 2000 Victor Larionov, Victor Rogachev <rogach@sut.ru> * Modified by mlkao * * Screen Driver using BGI for DOS TURBOC * * This driver requires the following BGI entry points: * initgraph, closegraph, * putpixel, getpixel * setcolor, line, setfillstyle, bar * * All graphics drawing primitives are based on top of these functions. * * This file also contains the generalized low-level font/text * drawing routines, which will be split out into another file. * Both fixed and proportional fonts are supported. */#include <stdio.h>#include <graphics.h>#include "device.h"#include "genfont.h"/* specific bgi driver entry points*/static PSD BGI_open(PSD psd);static void BGI_close(PSD psd);static void BGI_getscreeninfo(PSD psd,PMWSCREENINFO psi);static void BGI_setpalette(PSD psd,int first,int count,MWPALENTRY *pal);static void BGI_drawpixel(PSD psd,MWCOORD x, MWCOORD y, MWPIXELVAL c);static MWPIXELVAL BGI_readpixel(PSD psd,MWCOORD x, MWCOORD y);static void BGI_drawhline(PSD psd,MWCOORD x1, MWCOORD x2, MWCOORD y, MWPIXELVAL c);static void BGI_drawvline(PSD psd,MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL c);static void BGI_fillrect(PSD psd,MWCOORD x1,MWCOORD y1,MWCOORD x2,MWCOORD y2,MWPIXELVAL c);static void BGI_blit(PSD dstpsd,MWCOORD destx,MWCOORD desty,MWCOORD w,MWCOORD h, PSD srcpsd,MWCOORD srcx,MWCOORD srcy,long op);static PSD BGI_allocatememgc(PSD psd);SCREENDEVICE scrdev = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, BGI_open, BGI_close, BGI_getscreeninfo, BGI_setpalette, BGI_drawpixel, BGI_readpixel, BGI_drawhline, BGI_drawvline, BGI_fillrect, gen_fonts, BGI_blit, NULL, /* PreSelect*/ NULL, /* DrawArea subdriver*/ NULL, /* SetIOPermissions*/ BGI_allocatememgc, NULL, /* MapMemGC*/ NULL /* FreeMemGC*/};/* add by mlkao */extern int gr_mode; /* temp kluge*/static struct linesettingstype lineinfo;static struct palettetype bgi_pal;static PSDBGI_open(PSD psd){ int gd=VGA; int gm=VGAHI; registerbgidriver(EGAVGA_driver); initgraph(&gd,&gm,""); getlinesettings(&lineinfo); psd->xres = psd->xvirtres = getmaxx()+1; psd->yres = psd->yvirtres = getmaxy()+1; psd->linelen = lineinfo.thickness; psd->planes = 1; psd->bpp = 4; /* FIXME?? */ psd->ncolors = getmaxcolor() + 1; psd->flags = PSF_SCREEN; psd->addr = 0; /* FIXME */ /* note: must change psd->pixtype here for truecolor systems*/ psd->pixtype = MWPF_PALETTE; return psd;}static voidBGI_close(PSD psd){ closegraph();}static voidBGI_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; if(scrdev.yvirtres > 480) { /* SVGA 800x600*/ psi->xdpcm = 33; /* assumes screen width of 24 cm*/ psi->ydpcm = 33; /* assumes screen height of 18 cm*/ } else if(scrdev.yvirtres > 350) { /* VGA 640x480*/ psi->xdpcm = 27; /* assumes screen width of 24 cm*/ psi->ydpcm = 27; /* assumes screen height of 18 cm*/ } else { /* EGA 640x350*/ psi->xdpcm = 27; /* assumes screen width of 24 cm*/ psi->ydpcm = 19; /* assumes screen height of 18 cm*/ }}static voidBGI_setpalette(PSD psd,int first,int count,MWPALENTRY *pal){ /* std 16 color palette assumed*/}static voidBGI_drawpixel(PSD psd,MWCOORD x, MWCOORD y, MWPIXELVAL c){ switch(gr_mode) { case MWMODE_COPY: break; case MWMODE_XOR: c ^= getpixel(x, y); break; case MWMODE_OR: c |= getpixel(x, y); break; case MWMODE_AND: c &= getpixel(x, y); break; } putpixel(x, y, c);}static MWPIXELVALBGI_readpixel(PSD psd,MWCOORD x, MWCOORD y){ return getpixel(x, y);}static voidBGI_drawhline(PSD psd,MWCOORD x1, MWCOORD x2, MWCOORD y, MWPIXELVAL c){ MWCOORD x; if (x1 > x2) { x = x1; x1 = x2; x2 = x; } setcolor(c); switch(gr_mode) { case MWMODE_COPY: setwritemode(COPY_PUT); break; case MWMODE_XOR: setwritemode(XOR_PUT); break; case MWMODE_OR: for(x = x1; x <= x2; x++) putpixel(x, y, c | getpixel(x, y)); return; case MWMODE_AND: for(x = x1; x <= x2; x++) putpixel(x, y, c & getpixel(x, y)); return; } line(x1, y, x2, y);}static voidBGI_drawvline(PSD psd,MWCOORD x, MWCOORD y1, MWCOORD y2, MWPIXELVAL c){ MWCOORD y; if (y1 > y2) { y = y1; y1 = y2; y2 = y; } setcolor(c); switch(gr_mode) { case MWMODE_COPY: setwritemode(COPY_PUT); break; case MWMODE_XOR: setwritemode(XOR_PUT); break; case MWMODE_OR: for(y = y1; y <= y2; y++) putpixel(x, y, c | getpixel(x, y)); return; case MWMODE_AND: for(y = y1; y <= y2; y++) putpixel(x, y, c & getpixel(x, y)); return; } line(x, y1, x, y2);}static voidBGI_fillrect(PSD psd,MWCOORD x1, MWCOORD y1, MWCOORD x2, MWCOORD y2, MWPIXELVAL c){ MWCOORD x, y; if (x1 > x2) { x = x1; x1 = x2; x2 = x; } if (y1 > y2) { y = y1; y1 = y2; y2 = y; } switch(gr_mode) { case MWMODE_COPY: setfillstyle(1,c); bar(x1, y1, x2, y2); break; case MWMODE_XOR: for(x = x1; x <= x2; x++) for(y = y1; y <= y2; y++) putpixel(x, y, c ^ getpixel(x, y)); break; case MWMODE_OR: for(x = x1; x <= x2; x++) for(y = y1; y <= y2; y++) putpixel(x, y, c | getpixel(x, y)); break; case MWMODE_AND: for(x = x1; x <= x2; x++) for(y = y1; y <= y2; y++) putpixel(x, y, c & getpixel(x, y)); break; default: break; }}static voidBGI_blit(PSD dstpsd,MWCOORD destx,MWCOORD desty,MWCOORD w,MWCOORD h, PSD srcpsd,MWCOORD srcx,MWCOORD srcy,long op){ /* FIXME*/}/* allocate a memory screen device*/static PSD BGI_allocatememgc(PSD psd){ /* if driver doesn't have blit, fail*/ return NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -