📄 scr_bogl.x
字号:
/* * Copyright (c) 1999 Greg Haerr <greg@censoft.com> * * Screen Driver using BOGL Library * * This driver now requires only the following BOGL entry points: * bogl_init, bogl_done, * bogl_pixel, bogl_readpixel, * bogl_vline, bogl_hline * * 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, with fixed * pitch structure allowing much smaller font files. */#include <stdio.h>#include "../device.h"#include "bogl/bogl.h"/* specific bogl driver entry points*/static int BOGL_open(SCREENDEVICE *psd);static void BOGL_close(void);static void BOGL_getscreeninfo(PSCREENINFO psi);static void BOGL_setpalette(int first,int count,RGBENTRY *pal);static void BOGL_drawpixel(COORD x, COORD y, PIXELVAL c);static PIXELVAL BOGL_readpixel(COORD x, COORD y);static void BOGL_drawhline(COORD x1, COORD x2, COORD y, PIXELVAL c);static void BOGL_drawvline(COORD x, COORD y1, COORD y2, PIXELVAL c);static void BOGL_fillrect(COORD x1, COORD y1, COORD x2, COORD y2, PIXELVAL c);/* generalized text/font routines*/static BOOL gen_getfontinfo(FONTID fontid,PFONTINFO pfontinfo);static void gen_gettextsize(const UCHAR *str,int cc,COORD *retwd, COORD *retht,FONTID fontid);static void gen_gettextbits(UCHAR ch,IMAGEBITS *retmap,COORD *retwd, COORD *retht,FONTID fontid);/*static void gen_drawtext(COORD x, COORD y, const UCHAR *s, int n, PIXELVAL fg, FONTID fontid);static void gen_drawbitmap(COORD x, COORD y, COORD width, COORD height, IMAGEBITS *table, PIXELVAL fgcolor);*/SCREENDEVICE scrdev = { BOGL_open, BOGL_close, BOGL_getscreeninfo, BOGL_setpalette, BOGL_drawpixel, BOGL_readpixel, BOGL_drawhline, BOGL_drawvline, BOGL_fillrect, gen_getfontinfo, gen_gettextsize, gen_gettextbits, 640, 480, 256, PF_PALETTE};/* compiled in fonts*/#define NUMBER_FONTS 3extern FONT font_rom8x16, font_rom8x8;extern FONT font_winFreeSansSerif11x13;extern FONT font_winFreeSystem14x16;extern FONT font_winSystem14x16;extern FONT font_winMSSansSerif11x13;extern FONT font_winTerminal8x12;extern FONT font_helvB10, font_helvB12, font_helvR10;/* first font is default font*/PFONT fonts[NUMBER_FONTS] = {#if HAVEMSFONTS &font_winSystem14x16, /* FONT_SYSTEM_VAR*/ &font_winMSSansSerif11x13, /* FONT_GUI_VAR*/ &font_winTerminal8x12 /* FONT_OEM_FIXED*/#else &font_winFreeSystem14x16, /* FONT_SYSTEM_VAR*/ &font_winFreeSansSerif11x13, /* FONT_GUI_VAR*/ &font_rom8x16 /* FONT_OEM_FIXED*/#endif};static intBOGL_open(SCREENDEVICE *psd){ if(bogl_init() == 0) return -1; psd->xres = bogl_xres; psd->yres = bogl_yres; psd->ncolors = bogl_ncols; /* set pixel format*/ if(bogl_ncols > 256) psd->pixtype = PF_TRUECOLOR24; else if(bogl_ncols == 256 && bogl_truecolor) psd->pixtype = PF_TRUECOLOR332; else psd->pixtype = PF_PALETTE; return 1;}static voidBOGL_close(void){ bogl_done();}static voidBOGL_getscreeninfo(PSCREENINFO psi){ psi->rows = scrdev.yres; psi->cols = scrdev.xres; psi->ncolors = scrdev.ncolors; psi->pixtype = scrdev.pixtype; psi->black = 0; psi->white = 15; psi->fonts = NUMBER_FONTS; if(scrdev.yres > 480) { /* SVGA 800x600*/ psi->xdpcm = 33; /* assumes screen width of 24 cm*/ psi->ydpcm = 33; /* assumes screen height of 18 cm*/ } else if(scrdev.yres > 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*/ }}/* * Set count palette entries starting from first */static voidBOGL_setpalette(int first,int count,RGBENTRY *pal){ bogl_set_palette(first, count, (void*)pal);}static voidBOGL_drawpixel(COORD x, COORD y, PIXELVAL c){ bogl_pixel(x, y, c);}static PIXELVALBOGL_readpixel(COORD x, COORD y){ return bogl_readpixel(x, y);}static voidBOGL_drawhline(COORD x1, COORD x2, COORD y, PIXELVAL c){ /* * bogl uses type 2 line drawing, the last point is not drawn */ bogl_hline(x1, x2+1, y, c); /* * Uncomment the following if driver doesn't support hline while(x1 <= x2) bogl_pixel(x1++, y, c); */}static voidBOGL_drawvline(COORD x, COORD y1, COORD y2, PIXELVAL c){ /* * bogl uses type 2 line drawing, the last point is not drawn */ bogl_vline(x, y1, y2+1, c); /* * Uncomment the following if driver doesn't support vline while(y1 <= y2) bogl_pixel(x, y1++, c); */}static voidBOGL_fillrect(COORD x1, COORD y1, COORD x2, COORD y2, PIXELVAL c){ /* * Call bogl hline (type 2) to save size */ ++x2; /* fix bogl last point not drawn*/ while(y1 <= y2) bogl_hline(x1, x2, y1++, c); /* * Uncomment the following if driver doesn't support fillrect while(y1 <= y2) BOGL_drawhline(x1, x2, y1++, c); */}#if 0000/* * Generalized low level text draw routine, called only * if no clipping is required */static voidgen_drawtext(COORD x,COORD y,const UCHAR *s,int n,PIXELVAL fg,FONTID fontid){ COORD width; /* width of character */ COORD height; /* height of character */ PFONT pf; IMAGEBITS bitmap[MAX_CHAR_HEIGHT];/* bitmap for character */ if(fontid >= NUMBER_FONTS) return; pf = fonts[fontid]; /* x, y is bottom left corner*/ y -= pf->height - 1; while (n-- > 0) { gen_gettextbits(*s++, bitmap, &width, &height, pf); gen_drawbitmap(x, y, width, height, bitmap, fg); x += width; }}/* * Generalized low level bitmap output routine, called * only if no clipping is required. Only the set bits * in the bitmap are drawn, in the foreground color. */static voidgen_drawbitmap(COORD x, COORD y, COORD width, COORD height, IMAGEBITS *table, PIXELVAL fgcolor){ COORD minx; COORD maxx; IMAGEBITS bitvalue; /* bitmap word value */ int bitcount; /* number of bits left in bitmap word */ minx = x; maxx = x + width - 1; bitcount = 0; while (height > 0) { if (bitcount <= 0) { bitcount = IMAGE_BITSPERIMAGE; bitvalue = *table++; } if (IMAGE_TESTBIT(bitvalue)) BOGL_drawpixel(x, y, fgcolor); bitvalue = IMAGE_SHIFTBIT(bitvalue); --bitcount; if (x++ == maxx) { x = minx; ++y; --height; bitcount = 0; } }}#endif/* * Generalized low level get font info routine. This * routine works with fixed and proportional fonts. */static BOOLgen_getfontinfo(FONTID fontid,PFONTINFO pfontinfo){ PFONT pf; int i; if(fontid >= NUMBER_FONTS) return FALSE; pf = fonts[fontid]; pfontinfo->font = fontid; pfontinfo->height = pf->height; pfontinfo->maxwidth = pf->maxwidth; pfontinfo->baseline = 0; pfontinfo->fixed = pf->width == NULL? TRUE: FALSE; for(i=0; i<256; ++i) { if(pf->width == NULL) pfontinfo->widths[i] = pf->maxwidth; else { if(i<pf->firstchar || i >= pf->firstchar+pf->size) pfontinfo->widths[i] = 0; else pfontinfo->widths[i] = pf->width[i-pf->firstchar]; } } return TRUE;}/* * Generalized low level routine to calc bounding box for text output. * Handles both fixed and proportional fonts. */static voidgen_gettextsize(const UCHAR *str,int cc,COORD *retwd,COORD *retht, FONTID fontid){ PFONT pf; int c; int width; if(fontid >= NUMBER_FONTS) { *retht = 0; *retwd = 0; return; } pf = fonts[fontid]; if(pf->width == NULL) width = cc * pf->maxwidth; else { width = 0; while(--cc >= 0) { if( (c = *str++) >= pf->firstchar && c < pf->firstchar+pf->size) width += pf->width[c - pf->firstchar]; } } *retwd = width; *retht = pf->height;}/* * Generalized low level routine to get the bitmap associated * with a character. Handles fixed and proportional fonts. */static voidgen_gettextbits(UCHAR ch,IMAGEBITS *retmap,COORD *retwd, COORD *retht, FONTID fontid){ int n; PFONT pf = NULL; IMAGEBITS * bits; if(fontid < NUMBER_FONTS) pf = fonts[fontid]; if(!pf || ch < pf->firstchar || ch >= pf->firstchar+pf->size) { *retht = 0; *retwd = 0; return; } ch -= pf->firstchar; /* get font bitmap depending on fixed pitch or not*/ bits = pf->bits + (pf->offset? pf->offset[ch]: (pf->height * ch)); for(n=0; n<pf->height; ++n) *retmap++ = *bits++; /* return width depending on fixed pitch or not*/ *retwd = pf->width? pf->width[ch]: pf->maxwidth; *retht = pf->height;}#if 0static unsigned char palette[16+16][3] = { /* Linux 16 color palette*/ { 0x00,0x00,0x00 }, { 0x00,0x00,0xaa }, { 0x00,0xaa,0x00 }, { 0x00,0xaa,0xaa }, { 0xaa,0x00,0x00 }, { 0xaa,0x00,0xaa }, { 0xaa,0x55,0x00 }, /* adjust to brown*/ //{ 0xaa,0xaa,0x00 }, { 0xaa,0xaa,0xaa }, { 0x55,0x55,0x55 }, { 0x55,0x55,0xff }, { 0x55,0xff,0x55 }, { 0x55,0xff,0xff }, { 0xff,0x55,0x55 }, { 0xff,0x55,0xff }, { 0xff,0xff,0x55 }, { 0xff,0xff,0xff }, /* 16 entry std palette*/ {0x00, 0x00, 0x00}, {0x00, 0x00, 0xbf}, {0x00, 0xbf, 0x00}, {0x00, 0xbf, 0xbf}, {0xbf, 0x00, 0x00}, {0xbf, 0x00, 0xbf}, {0xbf, 0x60, 0x00}, /* adjust to brown*/ //{0xbf, 0xbf, 0x00}, {0xc0, 0xc0, 0xc0}, {0x80, 0x80, 0x80}, {0x00, 0x00, 0xff}, {0x00, 0xff, 0x00}, {0x00, 0xff, 0xff}, {0xff, 0x00, 0x00}, {0xff, 0x00, 0xff}, {0xff, 0xff, 0x00}, {0xff, 0xff, 0xff},};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -