www.pudn.com > emGUI.rar > devfont.c


/* 
 *  Font Device Driver 
 * 
 * 
 *  COPYRIGHT (c) 2001 - 2010. 
 *  emTech System Corporation. 
 * 
 *  The license and distribution terms for this file may be 
 *  found in found in the file LICENSE. 
 */ 
 
/*	Huangf emcore@263.net 
 */ 
 
/*	Stolen from Microwindows & optimize for Chinese 
 */ 
  
/* 
 * Copyright (c) 2000 Greg Haerr  
 * T1lib Adobe type1 routines contributed by Vidar Hokstad 
 * Freetype TrueType routines contributed by Martin Jolicoeur 
 * Han Zi Ku routines contributed by Tanghao and Jauming 
 * 
 * Device-independent font and text drawing routines 
 * 
 * These routines do the necessary range checking, clipping, and cursor 
 * overwriting checks, and then call the lower level device dependent 
 * routines to actually do the drawing.  The lower level routines are 
 * only called when it is known that all the pixels to be drawn are 
 * within the device area and are visible. 
 */ 
/*#define NDEBUG*/ 
#include  
#include  
#include  
#include  
#include  
 
#include "emGUI.h" 
 
#if (UNIX | DOS_DJGPP) 
#define strcmpi	strcasecmp 
#endif 
 
/* 
 * Set the font for future calls. 
 */ 
PMWFONT GrGCSetFont( 
	GID		gc, 
	PMWFONT pfont 
) 
{ 
	PMWFONT	oldfont; 
 
	oldfont 		= gc->gr_font; 
	gc->gr_font		= pfont; 
	 
	return oldfont; 
} 
 
/* 
 * Select a font, based on various parameters. 
 * If plogfont is specified, name and height parms are ignored 
 * and instead used from MWLOGFONT. 
 *  
 * If height is 0, return builtin font from passed name. 
 * Otherwise find builtin font best match based on height. 
 */ 
PMWFONT 
GrCreateFont( 
	const char *name 
) 
{ 
	if (strcasecmp(name, MWFONT_SYSTEM_VAR) == 0){ 
		return (PMWFONT)&gen_fonts[0]; 
	} 
	if (strcasecmp(name, MWFONT_GUI_VAR) == 0){ 
		return (PMWFONT)&gen_fonts[1]; 
	} 
	if (strcasecmp(name, MWFONT_OEM_FIXED) == 0){ 
		return (PMWFONT)&gen_fonts[2]; 
	} 
	if (strcasecmp(name, MWFONT_SYSTEM_FIXED) == 0){ 
		return (PMWFONT)&gen_fonts[3]; 
	} 
	return NULL; 
} 
 
/* Set the font size for the passed font*/ 
int 
GrSetFontSize( 
	PMWFONT pfont,  
	int fontsize 
) 
{ 
	int	oldfontsize = pfont->fontsize; 
 
	pfont->fontsize = fontsize; 
 
	if (pfont->fontprocs->SetFontSize) 
	    pfont->fontprocs->SetFontSize(pfont, fontsize); 
 
	return oldfontsize; 
} 
 
/* Set the font rotation angle in tenths of degrees for the passed font*/ 
int 
GrSetFontRotation( 
	PMWFONT pfont,  
	int 	tenthdegrees 
) 
{ 
	int	oldrotation = pfont->fontrotation; 
 
	pfont->fontrotation = tenthdegrees; 
 
	if (pfont->fontprocs->SetFontRotation) 
	    pfont->fontprocs->SetFontRotation(pfont, tenthdegrees); 
	 
	return oldrotation; 
} 
 
/* 
 * Set/reset font attributes (MWTF_KERNING, MWTF_ANTIALIAS) 
 * for the passed font. 
 */ 
int 
GrSetFontAttr( 
	PMWFONT pfont,  
	int 	setflags,  
	int 	clrflags 
) 
{ 
	int	oldattr = pfont->fontattr; 
 
	pfont->fontattr &= ~clrflags; 
	pfont->fontattr |= setflags; 
 
	if (pfont->fontprocs->SetFontAttr) 
	    pfont->fontprocs->SetFontAttr(pfont, setflags, clrflags); 
	 
	return oldattr; 
} 
 
/* Unload and deallocate font*/ 
void 
GrDestroyFont( 
	PMWFONT pfont 
) 
{ 
	if (pfont->fontprocs->DestroyFont) 
		pfont->fontprocs->DestroyFont(pfont); 
} 
 
/* Return information about a specified font*/ 
boolean 
GrGetFontInfo( 
	PMWFONT 	pfont,  
	PMWFONTINFO pfontinfo 
) 
{ 
	if(!pfont || !pfont->fontprocs->GetFontInfo) 
		return FALSE; 
 
	return pfont->fontprocs->GetFontInfo(pfont, pfontinfo); 
} 
 
/* Get the width and height of passed text string in the passed font*/ 
void 
GrGetTextSize( 
	PMWFONT 	pfont,  
	const void 	*str,  
	int 		cc,  
	int 		*pwidth, 
	int 		*pheight,  
	int 		*pbase,  
	int 		flags 
) 
{ 
	const void *text; 
 
	text = str; 
 
	if(cc <= 0 || !pfont->fontprocs->GetTextSize) { 
		*pwidth = *pheight = *pbase = 0; 
		return; 
	} 
 
	/* calc height and width of string*/ 
	pfont->fontprocs->GetTextSize(pfont, text, cc, pwidth, pheight, pbase); 
} 
 
/* Draw a text string at a specifed coordinates in the foreground color 
 * (and possibly the background color), applying clipping if necessary. 
 * The background color is only drawn if the gr_usebg flag is set. 
 * Use the current font. 
 */ 
void 
GrText( 
	WndID		win,  
	GID			gc, 
	int 		x,  
	int 		y,  
	const void 	*str,  
	int 		cc,  
	int 		flags 
) 
{ 
	const void *text; 
	text = str; 
 
	if(cc <= 0 || !gc->gr_font->fontprocs->DrawText) 
		return; 
 
	x += win->left; 
	y += win->top; 
	 
	/* draw text string*/ 
	gc->gr_font->fontprocs->DrawText(win, gc, x, y, text, cc, flags); 
} 
 
/* 
 * Draw ascii text using COREFONT type font. 
 */ 
void 
corefont_drawtext( 
	WndID		win, 
	GID			gc, 
	int 		x,  
	int 		y, 
	const void *text,  
	int 		cc,  
	int 		flags 
) 
{ 
	const unsigned short *str = text; 
	int		width;			/* width of text area */ 
	int 	height;			/* height of text area */ 
	int		base;			/* baseline of text*/ 
	int		startx, starty; 
	 
	MWIMAGEBITS bitmap[24 * 24 / MWIMAGE_BITSPERIMAGE]; 
	PMWFONT pfont = gc->gr_font; 
	 
	pfont->fontprocs->GetTextSize(pfont, str, cc, &width, &height, &base); 
	 
	if(flags & MWTF_BASELINE) 
		y -= base; 
	else if(flags & MWTF_BOTTOM) 
		y -= (height - 1); 
 
	startx = x; 
	starty = y + base; 
 
	/* Get the bitmap for each character individually, and then display 
	 * them using clipping for each one. 
	 */ 
	while (--cc >= 0) { 
		unsigned int ch = *str++; 
 
		pfont->fontprocs->GetTextBits( 
			pfont,  
			ch,  
			bitmap,  
			&width, 
			&height,  
			&base 
		); 
 
		/* note: change to bitmap*/ 
		GrBitmap(win, gc, x, y, width, height, bitmap); 
		x += width; 
	} 
 
	if (pfont->fontattr & MWTF_UNDERLINE){ 
		GrLine(win, gc, startx, starty, x, starty, FALSE); 
	} 
}