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

📄 scr_bogl.x

📁 神龙卡开发原代码
💻 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 + -