📄 devfont.caching.c
字号:
*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 int
UC16_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 int
hzk_init(PSD psd)
{
/* FIXME: *.KU file should be opened and
* read in here...*/
return 1;
}
static PMWHZKFONT
hzk_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(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -