📄 uifontex.c
字号:
#include <pr2k.h>
#include <uiwnd.h>
//#include <sys/syscall.h>
#include <filesys.h>
//#include <FatSys.h>
#include <uiFontEx.h>
#define _FONTEX_DEBUG 1
//global variable
static char const * const szName_FontEx="FontEx";
static int gFontEx_WordNum=0;
static unsigned short gFontEx_Data[FONTEX_SIZE/2];
DLL_EXP(STATUS) guiFontEx_SaveBitmap(const char *code1,const unsigned short *bitmap,int len)
{
int i,no,offset,fHandle;
unsigned char * code;
int len1;
guiEnterWCS();
code=(unsigned char *)code1;
if(len>FONTEX_BITMAP_SIZE/2-1)
{
guiExitWCS();
return STATUS_ERR;
}
fHandle=fs_open((char *)szName_FontEx,O_RDWR/*O_RDONLY*/);
if(fHandle<0)
{
guiExitWCS();
return STATUS_ERR;
}
if(code!=NULL)
{
no=(code[0]-0xf8)*94+(code[1]-0xa1);
}
else
{
for(no=0;no<FONTEX_SIZE/FONTEX_BITMAP_SIZE;no++)
{
if(*((unsigned char *)&gFontEx_Data[no*(FONTEX_BITMAP_SIZE/2)]+FONTEX_BITMAP_SIZE-1)!=FONTEX_VALID)
{
break;
}
}
}
offset=no*(FONTEX_BITMAP_SIZE/2);
/*
if(no<0||no>gFontEx_WordNum||no>=(FONTEX_SIZE/FONTEX_BITMAP_SIZE))
{
fs_close(fHandle);
guiExitWCS();
if(no>gFontEx_WordNum)
{
return -2;
}
else
{
return STATUS_ERR;
}
}
*/ // by zhangxp
if(no<0||no>=(FONTEX_SIZE/FONTEX_BITMAP_SIZE))
{
fs_close(fHandle);
guiExitWCS();
return STATUS_ERR;
}
memcpy(&gFontEx_Data[offset],bitmap,len*2);
*((unsigned char *)&gFontEx_Data[offset]+FONTEX_BITMAP_SIZE-1)=FONTEX_VALID;
//fs_lseek(fHandle,offset*2,SEEK_SET);
//if(fs_write(fHandle,(unsigned char *)&gFontEx_Data[offset],FONTEX_BITMAP_SIZE)!=FONTEX_BITMAP_SIZE)
fs_lseek(fHandle, 0, SEEK_SET); // by zhangxp
len1 = sizeof(gFontEx_Data);
if(fs_write(fHandle,(unsigned char *)gFontEx_Data, len1)!=FONTEX_BITMAP_SIZE)
{
fs_close(fHandle);
guiExitWCS();
return STATUS_ERR;
}
fs_close(fHandle);
/*
if(no==gFontEx_WordNum)
{
gFontEx_WordNum++;
}
*/ // by zhangxp
guiExitWCS();
return STATUS_OK;
}
DLL_EXP(unsigned short *) guiFontEx_GetBitmap(const char *code1)
{
unsigned char * code;
int no,offset;
char langType;
langType = guiQueryLanguageType();
if(langType>2)
langType = LANGUAGE_CHS;
guiEnterWCS();
code=(unsigned char *)code1;
if(langType==LANGUAGE_CHT)
{
no=(code[0]-0xc6)*94+(code[1]-0xa1);
offset=no*(FONTEX_BITMAP_SIZE/2);
}
else
{
no=(code[0]-0xf8)*94+(code[1]-0xa1);
offset=no*(FONTEX_BITMAP_SIZE/2);
}
//if(no<0||no>=gFontEx_WordNum) // by zhangxp
if(no<0||no>=(FONTEX_SIZE/FONTEX_BITMAP_SIZE))
{
guiExitWCS();
return NULL;
}
if(*((unsigned char *)&gFontEx_Data[offset]+FONTEX_BITMAP_SIZE-1)!=FONTEX_VALID)
{
guiExitWCS();
return NULL;
}
guiExitWCS();
return &gFontEx_Data[offset];
}
DLL_EXP(STATUS) guiFontEx_DeleteWord(const char *code1)
{
unsigned char * code;
int no,offset,fHandle;
int len;
guiEnterWCS();
code=(unsigned char *)code1;
no=(code[0]-0xf8)*94+(code[1]-0xa1);
offset=no*(FONTEX_BITMAP_SIZE/2);
//if(no<0||no>=gFontEx_WordNum)
if(no<0||no>=(FONTEX_SIZE/FONTEX_BITMAP_SIZE)) // by zhang
{
guiExitWCS();
return NULL;
}
fHandle=fs_open((char *)szName_FontEx,O_RDWR);
if(fHandle<0)
{
guiExitWCS();
return STATUS_ERR;
}
if(*((unsigned char *)&gFontEx_Data[offset]+FONTEX_BITMAP_SIZE-1)!=FONTEX_VALID)
{
fs_close(fHandle);
guiExitWCS();
return STATUS_ERR;
}
*((unsigned char *)&gFontEx_Data[offset]+FONTEX_BITMAP_SIZE-1)=FONTEX_DELETE;
//fs_lseek(fHandle,offset*2,SEEK_SET);
//if(fs_write(fHandle,(unsigned char *)&gFontEx_Data[offset],FONTEX_BITMAP_SIZE)!=FONTEX_BITMAP_SIZE)
fs_lseek(fHandle, 0, SEEK_SET);
len = sizeof(gFontEx_Data);
if(fs_write(fHandle,(unsigned char *)&gFontEx_Data, len)!=FONTEX_BITMAP_SIZE)
{
fs_close(fHandle);
guiExitWCS();
return STATUS_ERR;
}
fs_close(fHandle);
guiExitWCS();
return STATUS_OK;
}
////////////////////////// internal function ////////////////////////
STATUS guiFontEx_Init(void)
{
int fHandle,len;
memset(gFontEx_Data, 0x00, FONTEX_SIZE);
guiEnterWCS();
fHandle=fs_open((char *)szName_FontEx,O_CREATE);
if(fHandle<0)
{
guiExitWCS();
return STATUS_ERR;
}
len=fs_filelength(fHandle);
if(len<0)
{
fs_close(fHandle);
guiExitWCS();
return STATUS_ERR;
}
if(len>FONTEX_SIZE)
{
len=FONTEX_SIZE;
}
if(fs_read(fHandle,(unsigned char *)gFontEx_Data,len)!=len)
{
fs_close(fHandle);
guiExitWCS();
return STATUS_ERR;
}
// gFontEx_WordNum=len/FONTEX_BITMAP_SIZE;
fs_close(fHandle);
guiExitWCS();
return STATUS_OK;
}
#if _DEBUG&&_FONTEX_DEBUG
STATUS FontEx_Test(void)
{
char code[2]={0xf8,0xa2};
unsigned short bitmap[15];
memset(bitmap,-4,sizeof(bitmap));
// guiFontEx_Init();
guiFontEx_SaveBitmap(NULL,bitmap,15);
memset(bitmap,0,sizeof(bitmap));
guiFontEx_GetBitmap(code);
guiFontEx_DeleteWord(code);
guiFontEx_GetBitmap(code);
return STATUS_OK;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -