中级会员
- 积分
- 241
- 金钱
- 241
- 注册时间
- 2016-9-21
- 在线时间
- 59 小时
|
我在学习实验23时,开始对GUICharPEx.c、GUI_FontHZ12.c、GUI_FontHZ16.c、GUI_FontHZ24.c和GUI_UC_EncodeNone.c五个文件分析。
有几个事项共享,请大拿确认验证:
1)字体结构体,以GUI_FontHZ12.c为例(另外2个同理修改)。源码中的 0xA1A1 我理解是GB2312,而字库是GBK936。为了全面支持GBK936字库应该修改(第1个汉字丂是0x8140,原版软件是无法显示的)
//GB2312编码范围是 0xA1A1 - 0xFEFE
//GBK 采用双字节表示,总体编码范围为 8140-FEFE
//所以这里面的参数应该是8140-FEFE
//GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropHZ = {
// 0xA1A1,
// 0xFFFF,
// &GUI_FontHZ12_CharInfo[1],
// (void *)0,
//};
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropHZ = {
0x8140,
0xFEFE,
&GUI_FontHZ12_CharInfo[1],
(void *)0,
};
//结构体GUI_FONT_PROP定义了字体多个编码区域的地址和信息,因为一个字体可能存在多个编码区域,每个区域都有各自的信息,字体高度宽区可能都不一样。
//区域第一个字符的编码
//区域最后一个字符的编码
//属于该区域字符的字体信息
//指向字体下一个编码区域
//0x0000, //ASCII12字库第一个字符的编码
//0x007F, //ASCII12字库最后一个字符的编码
//GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropASC = {
// 0x0000,
// 0x007F,
// &GUI_FontHZ12_CharInfo[0],
// (void GUI_CONST_STORAGE *)&GUI_FontHZ12_PropHZ,
//};
//改成0x7F00,是因为GUIPROP_X_GetCharDistX中,我将高字节和低字节对调了。为何对调,见GUIPROP_X_GetCharDistX
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ12_PropASC = {
0x0000,
0x7F00,
&GUI_FontHZ12_CharInfo[0],
(void GUI_CONST_STORAGE *)&GUI_FontHZ12_PropHZ,
};
2)修改GUI_UC_EncodeNone.c,之前也是只支持GB2312;4处修改
static U16 _GetCharCode(const char GUI_UNI_PTR * s)
{
if((*s) >= 0X81)
//if((*s) > 0XA0)
static int _GetCharSize(const char GUI_UNI_PTR * s)
{
GUI_USE_PARA(s);
if((*s) >= 0X81)
//if((*s) > 0XA0)
static int _CalcSizeOfChar(U16 Char)
{
GUI_USE_PARA(Char);
if(Char >=0X8140)
//if(Char >0XA0A0)
static int _Encode(char *s, U16 Char)
{
if(Char >=0X8140)
//if(Char >0XA0A0)
3)修改GUICharPEx.c
//比如何字,编译成GBK码16Bit数据是0xCEBA,而字库和字体配置是0xBACE(高低字节反过来了)
int GUIPROP_X_GetCharDistX(U16P c)
{
const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUI_pContext->pAFont->p.pProp;
c=(((c%256)<<8)+(c/256));//何 0xBACE,但是C=0xCEBA 要转换!这样C和 pProp->First、pProp->Last相匹配
void GUIPROP_X_DispChar(U16P c)
{
int BytesPerLine;
GUI_DRAWMODE DrawMode = GUI_pContext->TextMode;
const GUI_FONT_PROP GUI_UNI_PTR *pProp = GUI_pContext->pAFont->p.pProp;
c=(((c%256)<<8)+(c/256));//何 0xBACE,但是C=0xCEBA 要转换!这样C和 pProp->First、pProp->Last相匹配
//搜索定位字库数据信息
for (; pProp; pProp = pProp->pNext)
{
if ((c >= pProp->First) && (c <= pProp->Last)) break;
}
//GUI_GetDataFromMemory中会转换,所以这里要还原。GUI_GetDataFromMemory代码优化,下面这行代码就可以删除
c=(((c%256)<<8)+(c/256));
最终,之前无法显示丂(GBK936 第一个汉字),现在可以了
//EMWINDEMO任务
void emwindemo_task(void *pdata)
{
GUI_CURSOR_Show();
GUI_SetBkColor(GUI_BLUE);
GUI_Clear();
GUI_SetColor(GUI_RED);
GUI_SetFont(&GUI_FontHZ12);
GUI_DispStringAt("12号字体:丂广州星翼电子 ALIENTEK! ",10,10);
GUI_SetFont(&GUI_FontHZ16);
GUI_DispStringAt("16号字体:丂广州星翼电子 ALIENTEK!",10,30);
GUI_SetFont(&GUI_FontHZ24);
GUI_DispStringAt("24号字体:丂广州星翼电子 ALIENTEK!",10,50);
|
|