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

📄 devfont.caching.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	   	  fprintf (stderr, "Error in reading ugb2gb.ku file!\n");	   	  fclose(fp); 	     	  return -1;	}    	fclose(fp);	if (use_big5)	{		table=(unsigned short *)filebuffer;		while(1)		{			if(j>=cc)			{				ascii[i]=0;				break;			}			uc16px=*uc16pp;			if((uc16px)<=0x00ff)			{				ascii[i]=(char)(*uc16pp);				i++;			}			else			{				ascii[i]=0xa1; ascii[i+1]=0x40;				for (k=0; k<13710; k++)				{					if (*(table+(k*2+1))==(uc16px))					{						ascii[i]=(char)((*(table+(k*2)) & 0xff00) >> 8);						ascii[i+1]=(char)(*(table+(k*2)) & 0x00ff);						break;					}				}				i+=2;			}			uc16pp++; j++;		}	}	else	{	while(1)	{		if(j>=cc)		{			ascii[i]=0;			break;		}		if((*((uc16p)+j)==0)&&(*((uc16p)+j+1)==0))		{			ascii[i]=0;			break;		}		else		{			if(*((uc16p)+j+1)==0)			{				ascii[i]=*((uc16p)+j);				i++;				j+=2;			}			else			{			/*	 to find the place of unicode charater .二分法匹配*/            		{				int p1=0,p2=length-4,p;				unsigned int c1,c2,c,d;				c1=((unsigned int )filebuffer[p1])*0x100+(filebuffer[p1+1]);                		c2=((unsigned int )filebuffer[p2])*0x100+(filebuffer[p2+1]);				d=((unsigned int )*((uc16p)+j))*0x100+*((uc16p)+j+1);                		if(c1==d)				{					ascii[i]=filebuffer[p1+2];					ascii[i+1]=filebuffer[p1+3];					goto findit; 	            		}                		if(c2==d)				{					ascii[i]=filebuffer[p2+2];					ascii[i+1]=filebuffer[p2+3];					goto findit;                		}				while(1)				{					p=(((p2-p1)/2+p1)>>2)<<2;					c=((unsigned int )filebuffer[p])*0x100+(filebuffer[p+1]);					if(d==c)	/*find it*/					{						ascii[i]=filebuffer[p+2];						ascii[i+1]=filebuffer[p+3];						break;          	   	   		}					else if(p2<=p1+4) /*can't find.*/					{						ascii[i]='.';/*((uc16p)+j);*/						ascii[i+1]='.';/*((uc16p)+j+1);*/						break;					}					else if(d<c)					{						p2=p;						c2=c;										                  			}					else					{						p1=p;						c1=c;																			}				}	            	}			findit:  			i+=2;			j+=2;			}		}	}	}	free(filebuffer);	return i;}/************************** functions definition ******************************/static int hzk_id( PMWHZKFONT pf ){	switch(pf->font_height)	{	case 12:		return 0;	case 16: default:		return 1;	}}/* This function get Chinese font info from etc file.*/static MWBOOL GetCFontInfo( PMWHZKFONT pf ){	int charset;	if (use_big5)		charset=(13094+408);	else		charset=8178;    	CFont[hzk_id(pf)].width = pf->cfont_width;    	pf->CFont.width = pf->cfont_width;    	CFont[hzk_id(pf)].height = pf->font_height;    	pf->CFont.height = pf->font_height;    	CFont[hzk_id(pf)].size = ((pf->CFont.width + 7) / 8) *		pf->CFont.height * charset;    	pf->CFont.size = ((pf->CFont.width + 7) / 8) * pf->CFont.height * charset;    	if(pf->CFont.size < charset * 8)        	return FALSE;	strcpy(CFont[hzk_id(pf)].file,HZK_FONT_DIR);	strcpy(pf->CFont.file,HZK_FONT_DIR);	if(pf->font_height==16)	{		strcat(CFont[hzk_id(pf)].file,"/hzk16");		strcat(pf->CFont.file,"/hzk16");	}	else	{		strcat(CFont[hzk_id(pf)].file,"/hzk12");		strcat(pf->CFont.file,"/hzk12");	}    	if (use_big5)    	{		CFont[hzk_id(pf)].file[strlen(pf->CFont.file)-3]+=use_big5;		pf->CFont.file[strlen(pf->CFont.file)-3]+=use_big5;    	}    	return TRUE;}/* This function get ASCII font info from etc file.*/static MWBOOL GetAFontInfo( PMWHZKFONT pf ){    	AFont[hzk_id(pf)].width = pf->afont_width;    	pf->AFont.width = pf->afont_width;    	AFont[hzk_id(pf)].height = pf->font_height;    	pf->AFont.height = pf->font_height;    	AFont[hzk_id(pf)].size = ((pf->AFont.width + 7) / 8) *		pf->AFont.height * 255;    	pf->AFont.size = ((pf->AFont.width + 7) / 8) * pf->AFont.height * 255;    	if(pf->AFont.size < 255 * 8)        	return FALSE;	strcpy(AFont[hzk_id(pf)].file,HZK_FONT_DIR);	strcpy(pf->AFont.file,HZK_FONT_DIR);		if(pf->font_height==16)	{	    	strcat(AFont[hzk_id(pf)].file,"/asc16");	    	strcat(pf->AFont.file,"/asc16");	}  	else	{	    	strcat(AFont[hzk_id(pf)].file,"/asc12");	    	strcat(pf->AFont.file,"/asc12");	}    	return TRUE;}/* This function load system font into memory.*/static MWBOOL LoadFont( PMWHZKFONT pf ){    	FILE* fp;	if(!GetCFontInfo(pf))	{		fprintf (stderr, "Get Chinese HZK font info failure!\n");		return FALSE;	}    	if(CFont[hzk_id(pf)].pFont == NULL)/*check font cache*/	{		 	   	/* Allocate system memory for Chinese font.*/ 		if( !(CFont[hzk_id(pf)].pFont = (char *)malloc(pf->CFont.size)) ) 		{	 	       	fprintf (stderr, "Allocate memory for Chinese HZK font failure.\n");		        return FALSE;	 	} 			/* Open font file and read information to the system memory.*/ 		fprintf (stderr, "Loading Chinese HZK font from file(%s)..." ,pf->CFont.file);		if(!(fp = fopen(CFont[hzk_id(pf)].file, "rb"))) 		{   		  	fprintf (stderr, "Error.\nThe Chinese HZK font file can not be found!\n");   	    	 	return FALSE;    		}	    	if(fread(CFont[hzk_id(pf)].pFont, sizeof(char), pf->CFont.size, fp) < pf->CFont.size) 		{	      	  	fprintf (stderr, "Error in reading Chinese HZK font file!\n");	 	     	fclose(fp); 	       		return FALSE;		}		fclose(fp);		CFont[hzk_id(pf)].use_count=0;		fprintf (stderr, "done.\n" );	}	cfont_address = CFont[hzk_id(pf)].pFont;	pf->cfont_address = CFont[hzk_id(pf)].pFont;	pf->CFont.pFont = CFont[hzk_id(pf)].pFont;	CFont[hzk_id(pf)].use_count++;	if(!GetAFontInfo(pf))	{	       fprintf (stderr, "Get ASCII HZK font info failure!\n");	       return FALSE;	}    	if(AFont[hzk_id(pf)].pFont == NULL)/*check font cache*/	{		 		 		/* Allocate system memory for ASCII font.*/ 		if( !(AFont[hzk_id(pf)].pFont = (char *)malloc(pf->AFont.size)) ) 		{ 		       	fprintf (stderr, "Allocate memory for ASCII HZK font failure.\n"); 		       	free(CFont[hzk_id(pf)].pFont); 		       	CFont[hzk_id(pf)].pFont = NULL;			return FALSE; 		} 		 	/* Load ASCII font information to the near memory.*/ 		fprintf (stderr, "Loading ASCII HZK font..." ); 		if(!(fp = fopen(AFont[hzk_id(pf)].file, "rb"))) 		{ 		       	fprintf (stderr, "Error.\nThe ASCII HZK font file can not be found!\n"); 		       	return FALSE; 		}	 	if(fread(AFont[hzk_id(pf)].pFont, sizeof(char), pf->AFont.size, fp) < pf->AFont.size) 		{ 		       	fprintf (stderr, "Error in reading ASCII HZK font file!\n"); 		       	fclose(fp); 		       	return FALSE;	 	} 	 		fclose(fp); 			AFont[hzk_id(pf)].use_count=0;		fprintf (stderr, "done.\n" );  	}	afont_address = AFont[hzk_id(pf)].pFont;	pf->afont_address = AFont[hzk_id(pf)].pFont;	pf->AFont.pFont = AFont[hzk_id(pf)].pFont;	AFont[hzk_id(pf)].use_count++;  	return TRUE;}/* This function unload system font from memory.*/static void UnloadFont( PMWHZKFONT pf ){	CFont[hzk_id(pf)].use_count--;	AFont[hzk_id(pf)].use_count--;	if (!CFont[hzk_id(pf)].use_count)	{		    	free(pf->CFont.pFont);	    	free(pf->AFont.pFont);	    	CFont[hzk_id(pf)].pFont = NULL;	    	AFont[hzk_id(pf)].pFont = NULL;	}}static inthzk_init(PSD psd){	/* FIXME: *.KU file should be opened and	 * read in here...*/	return 1;}static PMWHZKFONThzk_createfont(const char *name, MWCOORD height, int attr){	PMWHZKFONT	pf;	if(strcmp(name,"HZKFONT")!=0 && strcmp(name,"HZXFONT")!=0)		return FALSE;printf("hzk_createfont(%s,%d)\n",name,height);	use_big5=name[2]-'K';	/* allocate font structure*/	pf = (PMWHZKFONT)calloc(sizeof(MWHZKFONT), 1);	if (!pf)		return NULL;	pf->fontprocs = &hzk_procs;	pf->fontsize=height;	/*GdSetFontSize((PMWFONT)pf, height);*/	GdSetFontRotation((PMWFONT)pf, 0);	GdSetFontAttr((PMWFONT)pf, attr, 0);	if(height==12)	{				afont_width = 6;		cfont_width = 12;		font_height = 12;		pf->afont_width = 6;		pf->cfont_width = 12;		pf->font_height = 12;	}	else 		{				afont_width = 8;		cfont_width = 16;		font_height = 16;		pf->afont_width = 8;		pf->cfont_width = 16;		pf->font_height = 16;	}    	/* Load the font library to the system memory.*/	if(!LoadFont(pf))  	      	return FALSE;	return pf;}int IsBig5(int i){	if ((i>=0xa140 && i<=0xa3bf) || /* a140-a3bf(!a3e0) */	    (i>=0xa440 && i<=0xc67e) || /* a440-c67e        */	    (i>=0xc6a1 && i<=0xc8d3) || /* c6a1-c8d3(!c8fe) */	    (i>=0xc940 && i<=0xf9fe))   /* c940-f9fe        */		return 1;	else		return 0;}/* * following several function is used in hzk_drawtext */static int getnextchar(char* s, unsigned char* cc){    	if( s[0] == '\0') return 0;    	cc[0] = (unsigned char)(*s);    	cc[1] = (unsigned char)(*(s + 1));    	if (use_big5)    	{		if( IsBig5( (int) ( (cc[0] << 8) + cc[1]) ) )			return 1;    	}    	else	{    		if( ((unsigned char)cc[0] > 0xa0) &&		    ((unsigned char)cc[1] > 0xa0) )        		return 1;	}    	cc[1] = '\0';    	return 1;}static voidexpandcchar(PMWHZKFONT pf, int bg, int fg, unsigned char* c, MWPIXELVAL* bitmap){	int i=0;    	int c1, c2, seq;	int x,y;    	unsigned char *font;    	int b = 0;		/* keep gcc happy with b = 0 - MW */	int pixelsize;	pixelsize=sizeof(MWPIXELVAL);   	c1 = c[0];    	c2 = c[1];	if (use_big5)	{		seq=0;		/*ladd=loby-(if(loby<127)?64:98)*/		c2-=(c2<127?64:98);   		/*hadd=(hiby-164)*157*/		if (c1>=0xa4)/*standard font*/		{			seq=(((c1-164)*157)+c2);			if (seq>=5809) seq-=408;		}		/*hadd=(hiby-161)*157*/		if (c1<=0xa3)/*special font*/			seq=(((c1-161)*157)+c2)+13094;	}	else    		seq=((c1 - 161)*94 + c2 - 161); 	font = pf->cfont_address + ((seq) *		  (pf->font_height * ((pf->cfont_width + 7) / 8)));     	for (y = 0; y < pf->font_height; y++)        	for (x = 0; x < pf->cfont_width; x++) 		{            		if (x % 8 == 0)                		b = *font++;            		if (b & (128 >> (x % 8)))   /* pixel */			  	bitmap[i++]=fg;			else				bitmap[i++]=bg;		}		}static void expandchar(PMWHZKFONT pf, int bg, int fg, int c, MWPIXELVAL* bitmap){	int i=0;	int x,y;    	unsigned char *font;	int pixelsize;    	int b = 0;		/* keep gcc happy with b = 0 - MW */	pixelsize=sizeof(MWPIXELVAL);    	font = pf->afont_address + c * (pf->font_height *		((pf->afont_width + 7) / 8));  	for (y = 0; y < pf->font_height; y++)		for (x = 0; x < pf->afont_width; x++) 		{	    		if (x % 8 == 0)				b = *font++;	    		if (b & (128 >> (x % 8)))	/* pixel */				bitmap[i++]=fg;			else				bitmap[i++]=bg;  		}}/* * Draw ASCII text string using HZK type font */static voidhzk_drawtext(PMWFONT pfont, PSD psd, MWCOORD ax, MWCOORD ay,	const void *text, int cc, int flags){	PMWHZKFONT pf=(PMWHZKFONT)pfont;    	unsigned char c[2];	MWPIXELVAL *bitmap;    	unsigned char s1[3]; 	char *s,*sbegin;	s=(char *)text;	if(cc==1)	{		s1[0]=*((unsigned char*)text);		s1[1]=0x0;		s1[2]=0x0;		s=s1;    	}	sbegin=s;    	bitmap = (MWPIXELVAL *)ALLOCA(pf->cfont_width * pf->font_height *			sizeof(MWPIXELVAL));    	while( getnextchar(s, c) )	{              	if( c[1] != '\0') 		{                	expandcchar(pf, gr_background,gr_foreground,                            c, bitmap);			/* Now draw the bitmap ... */						if (flags&MWTF_TOP)				GdArea(psd,ax, ay, pf->cfont_width,					pf->font_height

⌨️ 快捷键说明

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