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

📄 font_hzk.c

📁 the embedded GUI for SamSung s3c2410 cpu based board.is microwindows0.90
💻 C
📖 第 1 页 / 共 2 页
字号:
    	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)) ) 		{ 		       	printf ("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.*/ 		printf ("hzk_createfont: loading '%s'\n", pf->AFont.file ); 		if(!(fp = fopen(AFont[hzk_id(pf)].file, "rb"))) 		{ 		       	printf ("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) 		{ 		       	printf ("Error in reading ASCII HZK font file!\n"); 		       	fclose(fp); 		       	return FALSE;	 	} 	 		fclose(fp); 			AFont[hzk_id(pf)].use_count=0;  	}	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;	}}inthzk_init(PSD psd){	/* FIXME: *.KU file should be opened and	 * read in here...*/	return 1;}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;	pf->fontrotation = 0;	pf->fontattr = attr;	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, MWTEXTFLAGS 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, bitmap, MWPF_PIXELVAL);			else				GdArea(psd,ax, ay-pf->font_height+2,					pf->cfont_width, pf->font_height,					bitmap, MWPF_PIXELVAL);                	s += 2;                	ax += pf->cfont_width;            	}            	else 		{                	expandchar(pf, gr_background,gr_foreground,                           c[0], bitmap);			/* Now draw the bitmap ... */			if (flags&MWTF_TOP) 				GdArea(psd,ax, ay, pf->afont_width,					pf->font_height, bitmap, MWPF_PIXELVAL);			else				GdArea(psd,ax, ay-pf->font_height+2,					pf->afont_width, pf->font_height,					bitmap, MWPF_PIXELVAL);                	s += 1;                	ax += pf->afont_width;            	}								if(s>=sbegin+cc)break;    	}	FREEA(bitmap);}/* * Return information about a specified font. */static MWBOOLhzk_getfontinfo(PMWFONT pfont, PMWFONTINFO pfontinfo){	PMWHZKFONT pf=(PMWHZKFONT)pfont;	int i;	pfontinfo->height = pf->font_height;	pfontinfo->maxwidth = pf->cfont_width;	pfontinfo->baseline = pf->font_height - 2;	/* FIXME: calculate these properly: */	pfontinfo->linespacing = pfontinfo->height;	pfontinfo->descent = pfontinfo->height - pfontinfo->baseline;	pfontinfo->maxascent = pfontinfo->baseline;	pfontinfo->maxdescent = pfontinfo->descent;	pfontinfo->firstchar = 0;	pfontinfo->lastchar = 0;	pfontinfo->fixed = TRUE;			for(i=0; i<=256; i++)		pfontinfo->widths[i] = pf->afont_width;	return TRUE;}static voidhzk_gettextsize(PMWFONT pfont, const void *text, int cc, MWTEXTFLAGS flags,	MWCOORD *pwidth, MWCOORD *pheight, MWCOORD *pbase){	PMWHZKFONT pf=(PMWHZKFONT)pfont;   	unsigned char c[2]; 	char *s,*sbegin;    	unsigned char s1[3];	int ax=0;	s=(char *)text;	if(cc==0)	{		*pwidth = 0;		*pheight = pf->font_height;		*pbase = pf->font_height-2;	}	if(cc==1)	{		s1[0]=*((unsigned char*)text);		s1[1]=0x0;		s1[2]=0x0;		s=s1;    	}	sbegin=s;    	while( getnextchar(s, c) )	{		if( c[1] != '\0') 		{           		s += 2;           		ax += pf->cfont_width;        	}        	else 		{           		s += 1;           		ax += pf->afont_width;        	}		if(s>=sbegin+cc) {			/*printf("s=%x,sbegin=%x,cc=%x\n",s,sbegin,cc);*/			break;		}    	}	/*printf("ax=%d,\n",ax);*/	*pwidth = ax;	*pheight = pf->font_height;	*pbase = pf->font_height-2;}static voidhzk_destroyfont(PMWFONT pfont){	PMWHZKFONT pf=(PMWHZKFONT)pfont;	UnloadFont(pf);	free(pf);}

⌨️ 快捷键说明

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