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

📄 romfont.c

📁 RMF-1.7.153.0-NODOLBY.tar.gz 神龙卡的驱动
💻 C
字号:
/* * Copyright (c) 1999, 2000 Greg Haerr <greg@censoft.com> * * Screen Driver Utilities *  * PC ROM Font Routine Header (PC ROM font format) * * This file contains the PC ROM format low-level font/text * drawing routines.  Only fixed pitch fonts are supported. * The ROM character matrix is used for the text bitmaps. * * The environment variable CHARHEIGHT if set will set the assumed rom * font character height, which defaults to 14. */#include <stdlib.h>#include "device.h"#include "vgaplan4.h"#include "romfont.h"/* local data*/int	ROM_CHAR_HEIGHT = 14;	/* number of scan lines in fonts in ROM */FARADDR rom_char_addr;/* handling routines for core rom fonts*/static MWFONTPROCS fontprocs = {	MWTF_ASCII,		/* routines expect ascii*/	pcrom_getfontinfo,	pcrom_gettextsize,	pcrom_gettextbits,	pcrom_unloadfont,	corefont_drawtext,	NULL,			/* setfontsize*/	NULL,			/* setfontrotation*/	NULL,			/* setfontattr*/};/* first font is default font if no match*/MWCOREFONT pcrom_fonts[NUMBER_FONTS] = {	{&fontprocs, 0, 0, 0, MWFONT_OEM_FIXED, NULL}};/* init PC ROM routines, must be called in graphics mode*/voidpcrom_init(PSD psd){	char *	p;	/* use INT 10h to get address of rom character table*/	rom_char_addr = int10(FNGETROMADDR, GETROM8x14);#if 0	/* check bios data area for actual character height,	 * as the returned font isn't always 14 high	 */	ROM_CHAR_HEIGHT = GETBYTE_FP(MK_FP(0x0040, 0x0085));	if(ROM_CHAR_HEIGHT > MAX_ROM_HEIGHT)		ROM_CHAR_HEIGHT = MAX_ROM_HEIGHT;#endif	p = getenv("CHARHEIGHT");	if(p)		ROM_CHAR_HEIGHT = atoi(p);}/* * PC ROM low level get font info routine.  This routine * returns info on a single bios ROM font. */MWBOOLpcrom_getfontinfo(PMWFONT pfont,PMWFONTINFO pfontinfo){	int	i;	pfontinfo->maxwidth = ROM_CHAR_WIDTH;	pfontinfo->height = ROM_CHAR_HEIGHT;	pfontinfo->baseline = ROM_CHAR_HEIGHT;	pfontinfo->firstchar = 0;	pfontinfo->lastchar = 255;	pfontinfo->fixed = TRUE;	for (i = 0; i < 256; i++)		pfontinfo->widths[i] = ROM_CHAR_WIDTH;	return TRUE;}/* * PC ROM low level routine to calc bounding box for text output. * Handles bios ROM font only. */voidpcrom_gettextsize(PMWFONT pfont, const void *str, int cc,	MWCOORD *pwidth, MWCOORD *pheight, MWCOORD *pbase){	*pwidth = ROM_CHAR_WIDTH * cc;	*pheight = ROM_CHAR_HEIGHT;	*pbase = ROM_CHAR_HEIGHT;}/* * PC ROM low level routine to get the bitmap associated * with a character.  Handles bios ROM font only. */voidpcrom_gettextbits(PMWFONT pfont, int ch, MWIMAGEBITS *retmap,	MWCOORD *pwidth, MWCOORD *pheight, MWCOORD *pbase){	FARADDR	bits;	int	n;	/* read character bits from rom*/	bits = rom_char_addr + ch * ROM_CHAR_HEIGHT;	for(n=0; n<ROM_CHAR_HEIGHT; ++n)		*retmap++ = GETBYTE_FP(bits++) << 8;	*pwidth = ROM_CHAR_WIDTH;	*pheight = ROM_CHAR_HEIGHT;	*pbase = ROM_CHAR_HEIGHT;}voidpcrom_unloadfont(PMWFONT pfont){	/* rom fonts can't be unloaded*/}#if NOTUSED/*  * Low level text draw routine, called only if no clipping * is required.  This routine draws ROM font characters only. */voidpcrom_drawtext(PMWFONT pfont, PSD psd, COORD x, COORD y,	const void *text, int n, PIXELVAL fg){	const unsigned char *	str = text;	COORD 			width;		/* width of character */	COORD 			height;		/* height of character */	IMAGEBITS 	bitmap[MAX_ROM_HEIGHT];	/* bitmap for character */ 	/* x,y is bottom left corner*/	y -= (ROM_CHAR_HEIGHT - 1);	while (n-- > 0) {		pfont->GetTextBits(pfont, *s++, bitmap, &width, &height);		gen_drawbitmap(psd, 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. */voidgen_drawbitmap(PSD psd,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))		psd->DrawPixel(psd, x, y, fgcolor);	bitvalue = IMAGE_SHIFTBIT(bitvalue);	--bitcount;	if (x++ == maxx) {		x = minx;		++y;		--height;		bitcount = 0;	}  }}#endif /* NOTUSED*/

⌨️ 快捷键说明

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