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

📄 devfont.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		if ( c0 < 0x80 ) {			/* Plain ASCII character, simple translation :-) */			*unicode16++ = c0;			count++;			continue;		}		if ( (c0 & 0xc0) == 0x80 )			/* Illegal; starts with 10xxxxxx */			return -1;		/* c0 must be 11xxxxxx if we get here => at least 2 bytes */		scalar = c0;		if(--cc < 0)			return -1;		c1 = *utf8++;		/*DPRINTF("c1=%02x\n",c1);*/		if ( (c1 & 0xc0) != 0x80 )			/* Bad byte */			return -1;		scalar <<= 6;		scalar |= (c1 & 0x3f);		if ( !(c0 & 0x20) ) {			/* Two bytes UTF-8 */			if ( scalar < 0x80 )				return -1;	/* Overlong encoding */			*unicode16++ = scalar & 0x7ff;			count++;			continue;		}		/* c0 must be 111xxxxx if we get here => at least 3 bytes */		if(--cc < 0)			return -1;		c1 = *utf8++;		/*DPRINTF("c1=%02x\n",c1);*/		if ( (c1 & 0xc0) != 0x80 )			/* Bad byte */			return -1;		scalar <<= 6;		scalar |= (c1 & 0x3f);		if ( !(c0 & 0x10) ) {			/*DPRINTF("####\n");*/			/* Three bytes UTF-8 */			if ( scalar < 0x800 )				return -1;	/* Overlong encoding */			if ( scalar >= 0xd800 && scalar < 0xe000 )				return -1;	/* UTF-16 high/low halfs */			*unicode16++ = scalar & 0xffff;			count++;			continue;		}		/* c0 must be 1111xxxx if we get here => at least 4 bytes */		c1 = *utf8++;		if(--cc < 0)			return -1;		/*DPRINTF("c1=%02x\n",c1);*/		if ( (c1 & 0xc0) != 0x80 )			/* Bad byte */			return -1;		scalar <<= 6;		scalar |= (c1 & 0x3f);		if ( !(c0 & 0x08) ) {			/* Four bytes UTF-8, needs encoding as surrogates */			if ( scalar < 0x10000 )				return -1;	/* Overlong encoding */			scalar -= 0x10000;			*unicode16++ = ((scalar >> 10) & 0x3ff) + 0xd800;			*unicode16++ = (scalar & 0x3ff) + 0xdc00;			count += 2;			continue;		}		return -1;	/* No support for more than four byte UTF-8 */	}	return count;}#if HAVE_HZK_SUPPORT/* UniCode-16 (MWTF_UC16) to GB(MWTF_ASCII) Chinese Characters conversion. * a single 2-byte UC16 character is encoded into a surrogate pair. * return -1 ,if error; * The destination array must be able to hold as many * as there are Unicode-16 characters. * * Copyright (c) 2000 Tang Hao (TownHall)(tang_hao@263.net). */static intUC16_to_GB(const unsigned char *uc16, int cc, unsigned char *ascii){	FILE* fp;	char buffer[256];	unsigned char *uc16p;	int i=0,j=0, k;	unsigned char *filebuffer;	unsigned short *uc16pp,*table;	unsigned short uc16px;	int length=31504;	if (use_big5)		length=54840;    	uc16p=(unsigned char *) uc16;	uc16pp=(unsigned short *) uc16;	strcpy(buffer,HZK_FONT_DIR);	if (use_big5)    		strcat(buffer,"/BG2UBG.KU");	else    		strcat(buffer,"/UGB2GB.KU");	if(!(fp = fopen(buffer, "rb"))) 	{   	  	 fprintf (stderr, "Error.\nThe %s file can not be found!\n",buffer);   		 return -1;    	}	filebuffer= (unsigned char *)malloc ( length);	if(fread(filebuffer, sizeof(char),length, fp) < length) {	   	  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;#if 0	GdSetFontSize((PMWFONT)pf, height);#endif	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

⌨️ 快捷键说明

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