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

📄 selfont.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	for ( t=0; t < 20; t++ ) {		/* Only follow 20 aliases deep, assume failure if more ... */		/* Find foundry for the current font */		foundry = NULL;		if ( (tmp = index(fontname,',')) != NULL ) {			/*			 * We have a font name like T1,c0934345 or			 * Adobe,Times (e.g. it includes foundry or			 * rendering method).  Separate them here.			 */			comma = tmp - fontname;			tmp++;			strncpy(fndry,fontname,comma);			fndry[comma] = '\0';			foundry = fndry;			fontname = tmp;		}		fontclass = decode_font_class(foundry);		if ( plogfont == NULL && fontclass == 0 )			fontclass = MWLF_CLASS_BUILTIN;		if ( fontclass ) {			/* The font is a "physical" font, use it directly */			strcpy(physname,fontname);			return fontclass;		}		if ( found_font ) {			/* Oops, should not get here, unless a font definition			 * resulted in a non-existent font, e.g. the fontclass			 * is unknown.			 */			goto default_font;		}		font = find_suitable_font(foundry,fontname,plogfont);		if ( font == NULL ) {			goto default_font;		}		if ( !font->alias )			found_font = 1;		fontname = font->lf.lfFaceName;	} default_font:	strcpy(physname, MWFONT_SYSTEM_VAR);	return MWLF_CLASS_BUILTIN;}/* This function can be used to clear the existing, possibly default list * of fonts on the system.  This is typically done before reading a * configuration file that defines the available fonts. */voidGdClearFontList(void){	struct available_font *font, *next_font;	font = all_fonts;	while ( font != 0 ) {		next_font = font->next;		if ( font->foundry != 0 )			free(font->foundry);		if ( font->family != 0 )			free(font->family);		free(font->fontname);		free(font);		font = next_font;	}	all_fonts = 0;}/* This function will add a font to the list of available fonts. * The physical name is the name as used by the underlying font * rendering engine. */intGdAddFont(char *fndry, char *fmly, char *fontname, PMWLOGFONT lf,	unsigned int flags){	struct available_font *font, *walk;	int fontclass = 0;	char *physname = lf->lfFaceName;	if ( !strncmp(physname,"T1,",3) ) {#ifdef HAVE_T1LIB_SUPPORT		/* Can handle Type 1 fonts */		physname += 3;		fontclass = MWLF_CLASS_T1LIB;		goto do_font;#else		/* Can't handle Type 1 fonts */		return -1;#endif	}	if ( !strncmp(physname,"FT,",3) ) {#if HAVE_FREETYPE_SUPPORT		/* Can handle FreeType fonts */		physname += 3;		fontclass = MWLF_CLASS_FREETYPE;		goto do_font;#else		/* Can't handle Type 1 fonts */		return -1;#endif	}	if ( !strncmp(physname,"MWF,",4) ) {		/* This is a Microwindows built in font */		physname += 4;		fontclass = MWLF_CLASS_BUILTIN;		goto do_font;	}	/* Only aliases does not need to use T1, FT or MWF description */	if ( !(flags & MWLF_FLAGS_ALIAS) )		return -1; do_font:	font = malloc(sizeof(*font));	if ( font == 0 )		return -1;	font->foundry = 0;	if ( strcmp("-",fndry) ) {		font->foundry = strdup(fndry);		if ( font->foundry == 0 ) {			free(font);			return -1;		}	}	font->family = 0;	if ( strcmp("-",fmly) ) {		font->family = strdup(fmly);		if ( font->family == 0 ) {			free(font->foundry);			free(font);			return -1;		}	}	font->fontname = strdup(fontname);	if ( font->fontname == 0 ) {		free(font->foundry);		free(font->family);		free(font);		return -1;	}	memcpy(&font->lf,lf,sizeof(*lf));	printf("Adding font: '%s' '%s' '%s' '%s'\n",font->foundry,	       font->family,font->fontname,font->lf.lfFaceName);	font->next = 0;	font->alias = (flags & MWLF_FLAGS_ALIAS) ? 1 : 0;	font->fontclass = fontclass;	/* Stupid append at end of list code */	if ( all_fonts == 0 ) {		all_fonts = font;	} else {		for ( walk = all_fonts; walk->next != 0; walk = walk->next )			;		walk->next = font;	}	return 0;}/* * These functions are used to set attributes in a logical font * structure, called through a table of function pointers. */static void font_set_light(PMWLOGFONT lf)	{ lf->lfWeight = MWLF_WEIGHT_LIGHT; }static void font_set_regular(PMWLOGFONT lf)	{ lf->lfWeight = MWLF_WEIGHT_REGULAR; }static void font_set_medium(PMWLOGFONT lf)	{ lf->lfWeight = MWLF_WEIGHT_MEDIUM; }static void font_set_demibold(PMWLOGFONT lf)	{ lf->lfWeight = MWLF_WEIGHT_DEMIBOLD; }static void font_set_bold(PMWLOGFONT lf)	{ lf->lfWeight = MWLF_WEIGHT_BOLD; }static void font_set_black(PMWLOGFONT lf)	{ lf->lfWeight = MWLF_WEIGHT_BLACK; }static void font_set_italic(PMWLOGFONT lf) { lf->lfItalic = 1; }static void font_set_roman(PMWLOGFONT lf) { lf->lfRoman = 1; }static void font_set_oblique(PMWLOGFONT lf) { lf->lfOblique = 1; }static void font_set_normal(PMWLOGFONT lf)	{ lf->lfPitch = MWLF_PITCH_NORMAL; }static void font_set_semicondensed(PMWLOGFONT lf)	{ lf->lfPitch = MWLF_PITCH_SEMICONDENSED; }static void font_set_condensed(PMWLOGFONT lf)	{ lf->lfPitch = MWLF_PITCH_CONDENSED; }static void font_set_serif(PMWLOGFONT lf) { lf->lfSerif = 1; }static void font_set_sansserif(PMWLOGFONT lf) { lf->lfSansSerif = 1; }static void font_set_monospace(PMWLOGFONT lf) { lf->lfMonospace = 1; }static void font_set_proportional(PMWLOGFONT lf) { lf->lfProportional = 1; }int config_font(char *file, int line, int argc, char *argv[]){	unsigned int flags = 0;	MWLOGFONT lf;	char tmp[512];	char *p, *q, *fndry, *family, *fontname;	int size, t;	static struct {		char *name;		void (*function)(PMWLOGFONT lf);	} attrs[] = {		/* Weight */		{ "Light",		font_set_light },		{ "Regular",		font_set_regular },		{ "Medium",		font_set_medium },		{ "DemiBold",		font_set_demibold },		{ "Demibold",		font_set_demibold },		{ "Bold",		font_set_bold },		{ "Black",		font_set_black },		/* Slant */		{ "Italic",		font_set_italic },		{ "Italics",		font_set_italic },		{ "Roman",		font_set_roman },		{ "Oblique",		font_set_oblique },		/* Width */		{ "Normal",		font_set_normal },		{ "Semicondensed",	font_set_semicondensed },		{ "Condensed",		font_set_condensed },		/* Class */		{ "Serif",		font_set_serif },		{ "Sans-serif",		font_set_sansserif },		{ "Monospace",		font_set_monospace },		{ "Proportional",	font_set_proportional },		{ 0, 0 }	};	MWLF_Clear(&lf);	if ( argc != 6 ) {		fprintf(stderr,"Bad font description %s:%d\n",file,line);		return 1;	}	if ( !strcmp("alias",argv[1]) ) {		flags |= MWLF_FLAGS_ALIAS;		fndry = "-";	} else {		fndry = argv[1];	}	family = argv[2];	fontname = argv[3];	strcpy(lf.lfFaceName,argv[5]);	p = argv[4];	while ( *p != '\0' ) {		/* Parse attributes */		q = strchr(p,',');		if ( q != 0 ) {			size = q - p;			strncpy(tmp,p,size);			tmp[size] = '\0';			p = q + 1;		} else {			strcpy(tmp,p);			p += strlen(tmp);		}		for ( t = 0; attrs[t].name != 0; t++ ) {			if ( !strcmp(attrs[t].name,tmp) ) {				attrs[t].function(&lf);				goto next;			}		}		fprintf(stderr,"No such font attribute '%s' in %s:%d\n",			tmp,file,line);		return 1;	next: ;	}	GdAddFont(fndry,family,fontname,&lf,flags);	return 0;}/* * Handle a single configuration line entery.  Arguments as for * function 'main(int argc, char **argv)' -- argv[0] is name of * original configuration file.  Return negative value for error, * zero for OK. */int config_line(char *file, int line, int argc, char *argv[]){	if ( !argc )		return 0;	/* Empty line */	if ( argv[0][0] == '#' )		return 0;	/* Comment line */	if ( !strcmp("font", argv[0]) )		return config_font(file,line,argc,argv);	if ( !strcmp("clear-fonts", argv[0]) ) {		GdClearFontList();		return 0;	}	return -1;}/* * Read (one of) the configuration files. */#define MAXCONFIGLINESIZE	1024#define MAXCONFIGELEMENTS	  64int read_configfile(char *file){	FILE *cf;	char buffer[MAXCONFIGLINESIZE+1];	char *args[MAXCONFIGELEMENTS+1];	unsigned char *p;	int argc, s, rc, t, line;	if ( (cf = fopen(file,"r")) == 0 ) {		fprintf(stderr,"Unable to read config file '%s'\n",file);		return -1;	}	line = 0;	while ( !feof(cf) ) {		if ( fgets(buffer,1000,cf) == 0 )			break;		line++;		s = strlen(buffer) - 1;		while ( s >= 0 && buffer[s] == '\n' )			buffer[s--] = '\0';		p = (unsigned char *)buffer;		argc = 0;		for ( t=0; t < MAXCONFIGELEMENTS; t++ ) {			while ( *p != '\0' && isspace(*p) )				p++;			if ( *p == '\"' ) {				/* Quoted string */				p++;				args[t] = p;				argc++;				while ( *p != '\0' && *p != '\"' )					p++;				if ( *p == '\0' ) {					fprintf(stderr,"Unbalanced quotes in %s:%d\n",						file,line);					break;				}				*p++ = '\0';			} else {				if ( *p == '\0' )					break;				args[t] = p;				argc++;				while ( *p != '\0' && !isspace(*p) )					p++;				*p++ = '\0';			}		}#if 0		{			int t;			for ( t=0; t < argc; t++ )				printf("#%d: '%s'\n",t,args[t]);		}#endif		rc = config_line(file, line, argc, args);		if ( rc < 0 )			return rc;	}	fclose(cf);	return 0;}#endif /* FONTMAPPER*/

⌨️ 快捷键说明

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