//********************************************************************************************************************* //【 版 权 】Copyright (c) 2007-2008 http://gliethttp.cublog.cn // //【 文 件 版 本 】v1.x // //【 文 件 名 称 】GFontHZK.c // //【 创 建 日 期 】2007-09-03 于2007-09-11做过修改 // //【 功 能 描 述 】μC/GUI-v3.90a内核汉化--中英文混合显示 //********************************************************************************************************************* #include "GUI.h" #include "GUIType.h" #include "GUI_Protected.h" extern unsigned char FHZK12ASCII[]; #define GUI_FHZK12ASCII_BASE (void*)FHZK12ASCII #define GUI_FHZK12_BASE (void*)0x10070000 //--------------------------------------------------- //HZK12EN const GUI_FONT_MONO GUI_FHZK12_EN = { GUI_FHZK12ASCII_BASE, 0, 0, 0x20, /* FirstChar */ 0xff, /* LastChar */ 6, /* XSize */ 7, /* XDist */ 1 /* BytesPerLine */ }; /*static*/ GUI_FONT GUI_FHZK12E = { GUI_FONTTYPE_MONO ,12 /* height of font */ ,13 /* space of font y */ ,1 /* magnification x */ ,1 /* magnification y */ ,{&GUI_FHZK12_EN}/*pMono*/ }; //合成公式,将显示第3区的unicode字母gliethttp //sprintf(tmp,"%c",i+count); //tmp[0] = 0xa3; //tmp[1] = 0xa1+i+count; //tmp[2] = 0; //GUI_DispString(tmp); //--------------------------------------------------- //HZK12CH const GUI_FONT_MONO GUI_FHZK12_CH = { GUI_FHZK12_BASE, 0, 0, 0xa1a1, /* FirstChar */ 0xfefe, /* LastChar */ 12, /* XSize */ 13, /* XDist */ 2 /* BytesPerLine */ }; /*static*/ GUI_FONT GUI_FHZK12C = { GUI_FONTTYPE_MONO ,12 /* height of font */ ,13 /* space of font y */ ,1 /* magnification x */ ,1 /* magnification y */ ,{&GUI_FHZK12_CH}/*pMono*/ }; //+++++++++++++++++++++++++++++++++++++++++++++++++++ extern unsigned char FHZK16ASCII[]; #define GUI_FHZK16ASCII_BASE (void*)FHZK16ASCII #define GUI_FHZK16_BASE (void*)0x10070000 //--------------------------------------------------- //HZK16EN const GUI_FONT_MONO GUI_FHZK16_EN = { GUI_FHZK16ASCII_BASE, 0, 0, 0x20, /* FirstChar */ 0xff, /* LastChar */ 8, /* XSize */ 9, /* XDist */ 1 /* BytesPerLine */ }; /*static*/ GUI_FONT GUI_FHZK16E = { GUI_FONTTYPE_MONO ,16 /* height of font */ ,17 /* space of font y */ ,1 /* magnification x */ ,1 /* magnification y */ ,{&GUI_FHZK16_EN}/*pMono*/ }; //合成公式,将显示第3区的unicode字母gliethttp //sprintf(tmp,"%c",i+count); //tmp[0] = 0xa3; //tmp[1] = 0xa1+i+count; //tmp[2] = 0; //GUI_DispString(tmp); //--------------------------------------------------- //HZK16CH const GUI_FONT_MONO GUI_FHZK16_CH = { GUI_FHZK16_BASE, 0, 0, 0xa1a1, /* FirstChar */ 0xfefe, /* LastChar */ 16, /* XSize */ 17, /* XDist */ 2 /* BytesPerLine */ }; /*static*/ GUI_FONT GUI_FHZK16C = { GUI_FONTTYPE_MONO ,16 /* height of font */ ,17 /* space of font y */ ,1 /* magnification x */ ,1 /* magnification y */ ,{&GUI_FHZK16_CH}/*pMono*/ }; //将以下属性变量封装在该.c文件中,若需引用使用方法函数[gliethttp] GUI_FONT *FHZK_CH = &GUI_FHZK12C; GUI_FONT *FHZK_Ascii = &GUI_FHZK12E;//&GUI_Font6x8; static const GUI_FONT *FHZK_Pre; //--------------------------- void GUI_CHAscii(void)//(GUI_FONT *CHAscii) { if(FHZK_Ascii) { //GUI_LOCK();GUI_DispSring在最外层已经加了GUI_LOCK()保护 GUI_Context.pAFont = FHZK_Ascii; //GUI_UNLOCK(); //GUI_SetFont(FHZK_Ascii);//GUI_SetFont()函数只是用来登记ascii码 } } void GUI_CHSetAscii(GUI_FONT *CHAscii) { if(CHAscii)FHZK_Ascii = CHAscii; } //--------------------------- void GUI_CHS(void)//(GUI_FONT *CH) { if(FHZK_CH) { //GUI_LOCK();GUI_DispSring在最外层已经加了GUI_LOCK()保护 if(FHZK_Pre == 0)FHZK_Pre = GUI_Context.pAFont; GUI_Context.pAFont = FHZK_CH; //GUI_SetFont(FHZK_CH);//GUI_SetFont()函数只是用来登记ascii码 //GUI_UNLOCK(); } } //--------------------------- void GUI_CHO(void) { if(FHZK_Pre) { //GUI_LOCK();GUI_DispSring在最外层已经加了GUI_LOCK()保护 GUI_Context.pAFont = FHZK_Pre; //GUI_UNLOCK(); //GUI_SetFont(FHZK_Pre);//GUI_SetFont()函数只是用来登记ascii码 FHZK_Pre = 0; }; } void GUI_CH(GUI_FONT *CH) { if(CH)FHZK_CH = CH; } //--------------------------- int User_GUIMONO_GetCharDistX(U16P Char) {const GUI_FONT_MONO * pMono; int result; if((Char & 0x8080) == 0) { pMono = FHZK_Ascii->p.pMono; }else pMono = FHZK_CH->p.pMono; result = pMono->XDist*GUI_Context.pAFont->XMag; return result; } //--------------------------- U16P Set2FHZK(U16 Char) { if((Char & 0x8080) == 0) { GUI_CHAscii(); //将ascii码转换成HZK中对应的码值 //合成公式,将显示第3区的unicode字母gliethttp //tmp[0] = 0xa3; //tmp[1] = 0xa1+i+count; //tmp[2] = 0; return Char; }else {GUI_CHS();return Char;} } //--------------------------- void RetfFHZK(void) { /*if(GUI_GetFont() == FHZK_Ascii)*/GUI_CHS(); } /* //以下是对ucguiv3.90a系统文件的修改 //+++++++++++++++++++++++++++++++++++++++++++++++++++++ //修改GUI/Core/GUI_UC_EncodeNone.c->_GetCharCode() static U16 _GetCharCode(const char GUI_UNI_PTR * s) { //2007-09-06 gliethttp if((s[1] & 0x80) && (s[0] & 0x80))return ((s[1] << 8) | s[0]); else return s[0]; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ //修改GUI/Core/GUI_UC_EncodeNone.c->_GetCharSize static int _GetCharSize(const char GUI_UNI_PTR * s) { //汉字占用2个char字符 if((s[1] & 0x80) && (s[0] & 0x80))return 2; return 1; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ //修改GUI/Core/GUICharM.c->GUIMONO_GetCharDistX() int GUIMONO_GetCharDistX(U16P c) { //2007-09-06 gliethttp return User_GUIMONO_GetCharDistX(c); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ //修改GUI/Core/GUICharLine.c->_DispLine() static void _DispLine(const char GUI_UNI_PTR *s, int MaxNumChars, const GUI_RECT *pRect) { if (GUI_Context.pClipRect_HL) { if (GUI_RectsIntersect(GUI_Context.pClipRect_HL, pRect) == 0) return; } #if GUI_COMPILER_SUPPORTS_FP if (GUI_Context.pAFont->pafEncode) { GUI_Context.pAFont->pafEncode->pfDispLine(s, MaxNumChars); } else { #else { #endif U16 Char; while (--MaxNumChars >= 0) { Char = GUI_UC__GetCharCodeInc(&s); Char = Set2FHZK(Char);//2007-09-04 gliethttp添加 GUI_Context.pAFont->pfDispChar(Char); if (GUI_pfDispCharStyle) { GUI_pfDispCharStyle(Char); } } GUI_CHO();//恢复到之前设置的ascii字体 } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ //修改GUI/Core/GUICharM.c->GUIMONO_DispChar() void GUIMONO_DispChar(U16P c) { int c0, c1; const unsigned char GUI_UNI_PTR * pd; int x = GUI_Context.DispPosX; int y = GUI_Context.DispPosY; // do some checking if drawing is actually necessary ... const GUI_FONT_MONO GUI_UNI_PTR * pMono = GUI_Context.pAFont->p.pMono; unsigned int FirstChar = pMono->FirstChar; // translate character into 2 characters to display : c0,c1 // Check if regular character first. if ((c >= (U16P)FirstChar) &&(c <= (U16P)pMono->LastChar)) { pd = pMono->pData; if(c > 0xff) {U8 *s; //2007-09-06 gliethttp //汉字区位码索引计算 s = (U8*)&c; c0 = (*s-0xa1)*94 + *(s+1)-0xa1;//小端存储模式 }else c0 = ((int)c) - FirstChar; c1 = -1; } else { // Check if character is in translation table GUI_FONT_TRANSINFO const GUI_UNI_PTR * pti = pMono->pTrans; pd = pMono->pTransData; if (pti) { FirstChar = pti->FirstChar; if ((c >= (U16P)FirstChar) && (c <= (U16P)pti->LastChar)) { GUI_FONT_TRANSLIST const GUI_UNI_PTR * ptl; c -= pti->FirstChar; ptl = pti->pList; ptl += c; c0 = ptl->c0; c1 = ptl->c1; } else { c0 = c1 = -1; } } else { c0 = c1 = -1; } } // Draw first character if it is valid if (c0!=-1) { int BytesPerChar = GUI_Context.pAFont->YSize*pMono->BytesPerLine; GUI_DRAWMODE DrawMode; int XSize = pMono->XSize; int YSize = GUI_Context.pAFont->YSize; // Select the right drawing mode DrawMode = GUI_Context.TextMode; // call drawing routine { U8 OldMode = LCD_SetDrawMode(DrawMode); LCD_DrawBitmap( x, y, XSize, YSize, GUI_Context.pAFont->XMag, GUI_Context.pAFont->YMag, 1, // Bits per Pixel pMono->BytesPerLine, pd + c0* BytesPerChar, &LCD_BKCOLORINDEX ); if (c1 != -1) { LCD_SetDrawMode(DrawMode | LCD_DRAWMODE_TRANS); LCD_DrawBitmap( x, y, XSize, YSize, GUI_Context.pAFont->XMag, GUI_Context.pAFont->YMag, 1, //Bits per Pixel pMono->BytesPerLine, pd + c1* BytesPerChar, &LCD_BKCOLORINDEX ); } // Fill empty pixel lines if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize) { if (DrawMode != LCD_DRAWMODE_TRANS) { LCD_SetDrawMode(DrawMode ^ LCD_DRAWMODE_REV); //Reverse so we can fill with BkColor LCD_FillRect(x, y + GUI_Context.pAFont->YSize * GUI_Context.pAFont->YDist, x + XSize * GUI_Context.pAFont->XMag, y + GUI_Context.pAFont->YDist); } } LCD_SetDrawMode(OldMode); } } //2007-09-06 gliethttp GUI_Context.DispPosX+=pMono->XDist * GUI_Context.pAFont->XMag; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ //修改GUI/Core/GUI_DispString.c->GUI_DispString()函数的回车换行问题\r\n void GUI_DispString(const char GUI_UNI_PTR *s) { int xAdjust, yAdjust, xOrg; int FontSizeY; if (!s) return; GUI_LOCK(); FontSizeY = GUI_GetFontDistY(); xOrg = GUI_Context.DispPosX; // Adjust vertical position yAdjust = GUI_GetYAdjust(); GUI_Context.DispPosY -= yAdjust; for (; *s; s++) { GUI_RECT r; int LineNumChars = GUI__GetLineNumChars(s, 0x7fff); int xLineSize = GUI__GetLineDistX(s, LineNumChars); // Check if x-position needs to be changed due to h-alignment switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) { case GUI_TA_CENTER: xAdjust = xLineSize / 2; break; case GUI_TA_RIGHT: xAdjust = xLineSize; break; default: xAdjust = 0; } r.x0 = GUI_Context.DispPosX -= xAdjust; r.x1 = r.x0 + xLineSize - 1; r.y0 = GUI_Context.DispPosY; r.y1 = r.y0 + FontSizeY - 1; GUI__DispLine(s, LineNumChars, &r); GUI_Context.DispPosY = r.y0; s += GUI_UC__NumChars2NumBytes(s, LineNumChars); //if ((*s == '\n') || (*s == '\r')) { //2007-09-07 gliethttp //回车 if((s[0] == '\r') || (s[1] == '\r')) { switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) { case GUI_TA_CENTER: case GUI_TA_RIGHT: GUI_Context.DispPosX = xOrg; break; default: GUI_Context.DispPosX = GUI_Context.LBorder; break; } // if (*s == '\n') //2007-09-07 gliethttp //换行 if((s[0] == '\n') || (s[1] == '\n'))//只出现一个换行 GUI_Context.DispPosY += FontSizeY; if((s[1] == '\r') || (s[1] == '\n'))s += 1;//跳过\r\n组合 } else { GUI_Context.DispPosX = r.x0 + xLineSize; } if (*s == 0) // end of string (last line) reached break; } GUI_Context.DispPosY += yAdjust; GUI_Context.TextAlign &= ~GUI_TA_HORIZONTAL; GUI_UNLOCK(); } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ //修改GUI/Core/GUICharLine.c->GUI__GetLineNumChars()函数的回车换行问题\r\n int GUI__GetLineNumChars(const char GUI_UNI_PTR *s, int MaxNumChars) { int NumChars = 0; if (s) { #if GUI_COMPILER_SUPPORTS_FP if (GUI_Context.pAFont->pafEncode) { return GUI_Context.pAFont->pafEncode->pfGetLineLen(s, MaxNumChars); } #endif for (; NumChars < MaxNumChars; NumChars++) { U16 Data = GUI_UC__GetCharCodeInc(&s); // if ((Data == 0) || (Data == '\n')) { // break; // } //2007-09-07 gliethttp if(Data == 0)break; if( (Data == '\n') || (Data == '\r') ) {U16 TData = GUI_UC__GetCharCodeInc(&s); if( (TData == '\n') || (TData == '\r') ) {//正常的\r\n //if(TData != Data)break; break; } } } } return NumChars; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ 修改GUI/Core/GUI__DispStringInRect.c->GUI__DispStringInRect()函数的回车换行问题\r\n void GUI__DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT* pRect, int TextAlign, int MaxNumChars) { GUI_RECT r; GUI_RECT rLine; int y = 0; const char GUI_UNI_PTR *sOrg =s; int FontYSize; int xLine = 0; int LineLen; int NumCharsRem; // Number of remaining characters FontYSize = GUI_GetFontSizeY(); if (pRect) { r = *pRect; } else { GUI_GetClientRect(&r); } // handle vertical alignment if ((TextAlign & GUI_TA_VERTICAL) == GUI_TA_TOP) { y = r.y0; } else { int NumLines; // Count the number of lines for (NumCharsRem = MaxNumChars, NumLines = 1; NumCharsRem ;NumLines++) { LineLen = GUI__GetLineNumChars(s, NumCharsRem); NumCharsRem -= LineLen; //2007-09-07 gliethttp if( (LineLen == 0) && (NumCharsRem == 1) ) {//说明\r\n错行了,即\r为当前行所能显示的最后一个字符,这时LineLen = 0; LineLen = 1; } s += GUI_UC__NumChars2NumBytes(s, LineLen); if (GUI__HandleEOLine(&s)) break; } // Do the vertical alignment switch (TextAlign & GUI_TA_VERTICAL) { case GUI_TA_BASELINE: case GUI_TA_BOTTOM: y = r.y1 -NumLines * FontYSize+1; break; case GUI_TA_VCENTER: y = r.y0+(r.y1-r.y0+1 -NumLines * FontYSize) /2; break; } } // Output string for (NumCharsRem = MaxNumChars, s = sOrg; NumCharsRem;) { int xLineSize; LineLen = GUI__GetLineNumChars(s, NumCharsRem); NumCharsRem -= LineLen; xLineSize = GUI__GetLineDistX(s, LineLen); switch (TextAlign & GUI_TA_HORIZONTAL) { case GUI_TA_HCENTER: xLine = r.x0+(r.x1-r.x0-xLineSize)/2; break; case GUI_TA_LEFT: xLine = r.x0; break; case GUI_TA_RIGHT: xLine = r.x1 -xLineSize + 1; } rLine.x0 = GUI_Context.DispPosX = xLine; rLine.x1 = rLine.x0 + xLineSize-1; rLine.y0 = GUI_Context.DispPosY = y; rLine.y1 = y + FontYSize-1; GUI__DispLine(s, LineLen, &rLine); s += GUI_UC__NumChars2NumBytes(s, LineLen); y += GUI_GetFontDistY(); if (GUI__HandleEOLine(&s)) break; } } //+++++++++++++++++++++++++++++++++++++++++++++++++++++ 修改GUI/Core/GUI_SetFont.c->GUI_SetFont() const GUI_FONT GUI_UNI_PTR* GUI_SetFont(const GUI_FONT GUI_UNI_PTR * pNewFont) { const GUI_FONT GUI_UNI_PTR* pOldFont = GUI_Context.pAFont; GUI_LOCK(); if (pNewFont) { //2007-09-11 gliethttp //GUI_SetFont()函数只是用来登记ascii码 GUI_CHSetAscii(pNewFont);//临时存储ascii显示字体集 //GUI_Context.pAFont = pNewFont; } GUI_UNLOCK(); return pOldFont; } //2007-09-11 修改 至此uCGUIv3.90a内核汉化工作全部完成,我们熟悉的中英文混合文本可以正常显示了[gliethttp] 显示中英文混合文本的代码模型: 1.指定中英文混合显示时字体 GUI_SetFont(&GUI_FHZK12E);//选择中英文混合显示时--英文字体 GUI_CH(&GUI_FHZK16C);//选择中英文显示时--中文字体 GUI_DispString("uCGUIv3.90a不错的图形引擎!\r\nGood\r\n让我们共同努力!"); 2.使用默认的中文字体 GUI_SetFont(&GUI_Font8_1);//选择中英文混合显示时--英文字体 GUI_DispString("uCGUIv3.90a不错的图形引擎!\r\nGood\r\n让我们共同努力!"); */
|