总共修改了GUI中的两个源文件:GUI_UC_EncodeNone.c、GUIEncSJ.C
/*
*********************************************************************************************************
* uC/GUI
* Universal graphic software for embedded applications
*
* (c) Copyright 2002, Micrium Inc., Weston, FL
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
* µC/GUI is protected by international copyright laws. Knowledge of the
* source code may not be used to write a similar product. This file may
* only be used in accordance with a license and should not be redistributed
* in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File : GUI_UC_EncodeNone.c
Purpose : Encoding routines for non unicode systems (default)
---------------------------END-OF-HEADER------------------------------
*/
#include "GUI_Protected.h"
/**************************************************************************************************
*
* 2014.09.21 修复文本显示和自动换行的BUG changed by szp
*
* 说明: 中文字符的机内码大于0xAOAO,英文字符的机内码为0x0020-0x007F
*
* 并且在获取中文字符编码时,先得到的是高八位。
*
* 若直接使用U16*,得到的数据高低位机内码是相反的,所以需要在函数中翻位。
*
* 相应的还修改了文件GUIEncJS.c中的内容
*
***************************************************************************************************/
/*********************************************************************
*
* Static code
*
**********************************************************************
*/
/*********************************************************************
*
* _GetCharCode
*
* Purpose:
* Return the UNICODE character code of the current character.
*/
static U16 _GetCharCode(const char GUI_UNI_PTR * s) {
if((*s)>0xA0){ //changed by szp
U16 ss = *(const U16 GUI_UNI_PTR *)s; //
return ((ss&0xff00)>>8)|((ss&0xff)<<8); //
} //
//return *(const U16 GUI_UNI_PTR *)s;
return *(const U8 GUI_UNI_PTR *)s;
}
/*********************************************************************
*
* _GetCharSize
*
* Purpose:
* Return the number of bytes of the current character.
*/
static int _GetCharSize(const char GUI_UNI_PTR * s) {
GUI_USE_PARA(s);
if((*s)>0xA0) return 2; //changed by szp
return 1;
}
/*********************************************************************
*
* _CalcSizeOfChar
*
* Purpose:
* Return the number of bytes needed for the given character.
*/
static int _CalcSizeOfChar(U16 Char) {
GUI_USE_PARA(Char);
if(Char > 0xA0A0) return 2; //changed by szp
return 1;
}
/*********************************************************************
*
* _Encode
*
* Purpose:
* Encode character into 1/2/3 bytes.
*/
static int _Encode(char *s, U16 Char) {
if(Char > 0xA0A0){ //changed by szp
*((U16*)s) = (U16)(Char); //
return 2; //
} //
*s = (U8)(Char);
return 1;
}
/*********************************************************************
*
* Static data
*
**********************************************************************
*/
/*********************************************************************
*
* _API_Table
*/
const GUI_UC_ENC_APILIST GUI__API_TableNone = {
_GetCharCode, /* return character code as U16 */
_GetCharSize, /* return size of character: 1 */
_CalcSizeOfChar, /* return size of character: 1 */
_Encode /* Encode character */
};
/*********************************************************************
*
* Exported code
*
**********************************************************************
*/
/*********************************************************************
*
* GUI_UC_SetEncodeNone
*/
void GUI_UC_SetEncodeNone(void) {
GUI_LOCK();
GUI_Context.pUC_API = &GUI__API_TableNone;
GUI_UNLOCK();
}
/*************************** End of file ****************************/
/*
*********************************************************************************************************
* uC/GUI
* Universal graphic software for embedded applications
*
* (c) Copyright 2002, Micrium Inc., Weston, FL
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
* µC/GUI is protected by international copyright laws. Knowledge of the
* source code may not be used to write a similar product. This file may
* only be used in accordance with a license and should not be redistributed
* in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File : GUIEncSJ.C
Purpose : Implementation of Shift JIS decoding
----------------------------------------------------------------------
Version-Date---Author-Explanation
---------------------------END-OF-HEADER------------------------------
*/
#include <stddef.h> /* needed for definition of NULL */
#include "GUI_Protected.h"
/**************************************************************************************************
*
* 2014.09.21 修复文本显示和自动换行的BUG changed by szp
*
* 说明: 函数中形参Len应该代表的是字符的个数,而不是字节数
*
* 因此,与双字节字符相关的计算中,Len只需加/减一次。
*
* 相应的还修改了文件GUI_UC_EncodeNone.c中的内容。
*
***************************************************************************************************/
/*********************************************************************
*
* Static code
*
**********************************************************************
*/
/*********************************************************************
*
* DB2SJIS
*/
static U16 DB2SJIS(U8 Byte0, U8 Byte1) {
return Byte1 | (((U16)Byte0)<<8);
}
/*********************************************************************
*
* _GetLineDistX_SJIS
*/
static int _GetLineDistX_SJIS(const char GUI_UNI_PTR *s, int Len) {
int Dist =0;
if (s) {
U8 c0;
while (((c0=*(const U8*)s) !=0) && Len >=0) {
s++; Len--;
if (c0 > 127) { // 0x7F ¶ÔÓ¦ 127
U8 c1 = *(const U8*)s++;
//Len--; //2014.09.21 changed by szp
Dist += GUI_GetCharDistX(DB2SJIS(c0, c1));
} else {
Dist += GUI_GetCharDistX(c0);
}
}
}
return Dist;
}
/*********************************************************************
*
* _GetLineLen_SJIS
* Purpose:
* Returns the number of characters in a string.
*
* NOTE:
* The return value can be used as offset into the
* string, which means that double characters count double
*/
static int _GetLineLen_SJIS(const char GUI_UNI_PTR *s, int MaxLen) {
int Len =0;
U8 c0;
while (((c0=*(const U8*)s) !=0) && Len < MaxLen) {
s++;
if (c0 > 127) {
//Len++; //2014.09.21 changed by szp
s++;
} else {
switch (c0) {
case '\n': return Len;
}
}
Len++;
}
return Len;
}
/*********************************************************************
*
* _DispLine_SJIS
*/
static void _DispLine_SJIS(const char GUI_UNI_PTR *s, int Len) {
U8 c0;
while (--Len >=0) {
c0=*(const U8*)s++;
if (c0 > 127) {
U8 c1 = *(const U8*)s++;
//Len--; //2014.09.21 changed by szp
GL_DispChar (DB2SJIS(c0, c1));
} else {
GL_DispChar(c0);
}
}
}
/*********************************************************************
*
* GUI_ENC_APIList_SJIS, API list
*/
const tGUI_ENC_APIList GUI_ENC_APIList_SJIS = {
_GetLineDistX_SJIS,
_GetLineLen_SJIS,
_DispLine_SJIS
};
/*************************** End of file ****************************/