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

📄 font_hzk.c

📁 the embedded GUI for SamSung s3c2410 cpu based board.is microwindows0.90
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 2000, 2002, 2003 Greg Haerr <greg@censoft.com> * Portions Copyright (c) 2002 by Koninklijke Philips Electronics N.V. * * Supports dynamically loading HZK font files * Han Zi Ku routines contributed by Tanghao and Jauming */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "device.h"#include "devfont.h"/* * 12x12 and 16x16 ascii and chinese fonts * Big5 and GB2312 encodings supported */#define MAX_PATH	256typedef struct {	int	width;	int	height;	int	size;	unsigned long use_count;	char *	pFont;	char	file[MAX_PATH + 1];} HZKFONT;static int use_big5=1;static HZKFONT CFont[2];	/* font cache*/static HZKFONT AFont[2];	/* font cache*//* jmt: moved inside MWHZKFONT*/static int afont_width = 8;static int cfont_width = 16;static int font_height = 16;static char *afont_address;static char *cfont_address;typedef struct MWHZKFONT {	PMWFONTPROCS	fontprocs;	/* common hdr*/	MWCOORD		fontsize;	int		fontrotation;	int		fontattr;			HZKFONT 	CFont;		/* hzkfont stuff */	HZKFONT 	AFont;	int 		afont_width;	int 		cfont_width;	int 		font_height;	char 		*afont_address;	char 		*cfont_address;} MWHZKFONT;int  hzk_init(PSD psd);PMWHZKFONT hzk_createfont(const char *name, MWCOORD height,int fontattr);static MWBOOL hzk_getfontinfo(PMWFONT pfont, PMWFONTINFO pfontinfo);static void hzk_gettextsize(PMWFONT pfont, const void *text, int cc,		MWTEXTFLAGS flags, MWCOORD *pwidth, MWCOORD *pheight,		MWCOORD *pbase);#if 0static void hzk_gettextbits(PMWFONT pfont, int ch, const IMAGEBITS **retmap,		MWCOORD *pwidth, MWCOORD *pheight, MWCOORD *pbase);#endifstatic void hzk_destroyfont(PMWFONT pfont);static void hzk_drawtext(PMWFONT pfont, PSD psd, MWCOORD x, MWCOORD y,		const void *text, int cc, MWTEXTFLAGS flags);		/* handling routines for MWHZKFONT*/static MWFONTPROCS hzk_procs = {	MWTF_ASCII,			/* routines expect ASCII*/	hzk_getfontinfo,	hzk_gettextsize,	NULL,				/* hzk_gettextbits*/	hzk_destroyfont,	hzk_drawtext,	NULL,				/* setfontsize*/	NULL, 				/* setfontrotation*/	NULL,				/* setfontattr*/	NULL,				/* duplicate not yet implemented */};/* temp extern decls*/extern MWPIXELVAL gr_foreground;extern MWPIXELVAL gr_background;/* 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). */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"))) 	{   	  	 printf ("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) {	   	  printf ("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))	{		printf ("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)) ) 		{	 	       	printf ("Allocate memory for Chinese HZK font failure.\n");		        return FALSE;	 	} 			/* Open font file and read information to the system memory.*/ 		printf ("hzk_createfont: loading '%s'\n", pf->CFont.file);		if(!(fp = fopen(CFont[hzk_id(pf)].file, "rb"))) 		{   		  	printf ("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) 		{	      	  	printf ("Error in reading Chinese HZK font file!\n");	 	     	fclose(fp); 	       		return FALSE;		}		fclose(fp);		CFont[hzk_id(pf)].use_count=0;	}	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))	{	       printf ("Get ASCII HZK font info failure!\n");	       return FALSE;	}

⌨️ 快捷键说明

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