From eb32cf9fe2eec1e1f3f6361f2db474b7d14a5c87 Mon Sep 17 00:00:00 2001 From: dumganhar Date: Tue, 20 Sep 2011 02:19:26 +0800 Subject: [PATCH] modify some files of bada project --- HelloWorld/AppDelegate.cpp | 1 + HelloWorld/bada/.cproject | 8 +- cocos2dx/platform/CCImage.cpp | 22 +- cocos2dx/platform/bada/CCApplication_bada.cpp | 8 +- cocos2dx/platform/bada/CCApplication_bada.h | 5 +- cocos2dx/platform/bada/CCImage_bada.cpp | 1 + cocos2dx/platform/bada/CCPlatformFunc_bada.c | 65 ++- cocos2dx/platform/bada/Gbk_Unicode.c | 540 ++++++++++++++++++ cocos2dx/platform/bada/Gbk_Unicode.cpp | 164 ------ cocos2dx/platform/bada/Gbk_Unicode.h | 58 +- .../platform/bada/gbk_table.h.REMOVED.git-id | 1 + .../bada/unicode_table.h.REMOVED.git-id | 1 + 12 files changed, 673 insertions(+), 201 deletions(-) create mode 100644 cocos2dx/platform/bada/Gbk_Unicode.c delete mode 100644 cocos2dx/platform/bada/Gbk_Unicode.cpp create mode 100644 cocos2dx/platform/bada/gbk_table.h.REMOVED.git-id create mode 100644 cocos2dx/platform/bada/unicode_table.h.REMOVED.git-id diff --git a/HelloWorld/AppDelegate.cpp b/HelloWorld/AppDelegate.cpp index 1545151a17..e676bfe14a 100644 --- a/HelloWorld/AppDelegate.cpp +++ b/HelloWorld/AppDelegate.cpp @@ -68,6 +68,7 @@ bool AppDelegate::initInstance() #if (CC_TARGET_PLATFORM == CC_PLATFORM_BADA) CCEGLView * pMainWnd = new CCEGLView(); CC_BREAK_IF(! pMainWnd|| ! pMainWnd->Create(this)); + cocos2d::CCFileUtils::setResourcePath("/Res/"); #endif bRet = true; } while (0); diff --git a/HelloWorld/bada/.cproject b/HelloWorld/bada/.cproject index aa6b2f75a5..6192bbab7a 100644 --- a/HelloWorld/bada/.cproject +++ b/HelloWorld/bada/.cproject @@ -45,10 +45,11 @@ diff --git a/cocos2dx/platform/CCImage.cpp b/cocos2dx/platform/CCImage.cpp index 6f37d7d0b1..cfb042b06a 100644 --- a/cocos2dx/platform/CCImage.cpp +++ b/cocos2dx/platform/CCImage.cpp @@ -146,7 +146,7 @@ bool CCImage::_initWithJpgData(void * data, int nSize) jpeg_create_decompress( &cinfo ); /* this makes the library read from infile */ - //cjh_must jpeg_mem_src( &cinfo, (unsigned char *) data, nSize ); + jpeg_mem_src( &cinfo, (unsigned char *) data, nSize ); /* reading the image header which contains image information */ jpeg_read_header( &cinfo, true ); @@ -221,8 +221,10 @@ bool CCImage::_initWithPngData(void * pData, int nDatalen) // init png_info info_ptr = png_create_info_struct(png_ptr); - //cjh_must CC_BREAK_IF(!info_ptr || setjmp(png_jmpbuf(png_ptr))); - + CC_BREAK_IF(!info_ptr); +#if CC_TARGET_PLATFORM != CC_PLATFORM_BADA + CC_BREAK_IF(setjmp(png_jmpbuf(png_ptr))); +#endif // set the read call back function tImageSource imageSource; imageSource.data = (unsigned char*)pData; @@ -246,7 +248,7 @@ bool CCImage::_initWithPngData(void * pData, int nDatalen) // init image info m_bPreMulti = true; - //cjh_must m_bHasAlpha = ( info_ptr->color_type & PNG_COLOR_MASK_ALPHA ) ? true : false; + m_bHasAlpha = ( info_ptr->color_type & PNG_COLOR_MASK_ALPHA ) ? true : false; // allocate memory and read data int bytesPerComponent = 3; @@ -390,12 +392,12 @@ bool CCImage::_saveImageToPNG(const char * pszFilePath, bool bIsToRGB) break; } - //cjh_must if (setjmp(png_jmpbuf(png_ptr))) - { - fclose(fp); - png_destroy_write_struct(&png_ptr, &info_ptr); - break; - } + //cjh if (setjmp(png_jmpbuf(png_ptr))) +// { +// fclose(fp); +// png_destroy_write_struct(&png_ptr, &info_ptr); +// break; +// } png_init_io(png_ptr, fp); diff --git a/cocos2dx/platform/bada/CCApplication_bada.cpp b/cocos2dx/platform/bada/CCApplication_bada.cpp index 4c5667beed..3510ca659f 100644 --- a/cocos2dx/platform/bada/CCApplication_bada.cpp +++ b/cocos2dx/platform/bada/CCApplication_bada.cpp @@ -60,16 +60,14 @@ void CCApplication::setAnimationInterval(double interval) bool CCApplication::OnAppInitializing(AppRegistry& appRegistry) { - InitGbkUnicodeTable("/Res/gbk_uni_tb.dat"); - if (applicationDidFinishLaunching()) - return true; - return false; + if (! initInstance() || !applicationDidFinishLaunching()) + return false; + return true; } bool CCApplication::OnAppTerminating(AppRegistry& appRegistry, bool forcedTermination) { - ReleaseGbkUnicodeTable(); return true; } diff --git a/cocos2dx/platform/bada/CCApplication_bada.h b/cocos2dx/platform/bada/CCApplication_bada.h index bfe020b32f..5e7141978a 100644 --- a/cocos2dx/platform/bada/CCApplication_bada.h +++ b/cocos2dx/platform/bada/CCApplication_bada.h @@ -42,7 +42,10 @@ class CC_DLL CCApplication : public: CCApplication(); virtual ~CCApplication(); - + /** + @brief Implement for initialize OpenGL instance, set source path, etc... + */ + virtual bool initInstance() = 0; /** @brief Implement Window create, CCDirector and CCScene init code here. @return true Initialize success, app continue. diff --git a/cocos2dx/platform/bada/CCImage_bada.cpp b/cocos2dx/platform/bada/CCImage_bada.cpp index 059d9d5199..076e40938f 100644 --- a/cocos2dx/platform/bada/CCImage_bada.cpp +++ b/cocos2dx/platform/bada/CCImage_bada.cpp @@ -38,6 +38,7 @@ bool CCImage::initWithString( result r = E_FAILURE; do { + CC_BREAK_IF(nWidth <= 0 || nHeight <= 0); Canvas * pCanvas = new Canvas(); CC_BREAK_IF(! pCanvas); diff --git a/cocos2dx/platform/bada/CCPlatformFunc_bada.c b/cocos2dx/platform/bada/CCPlatformFunc_bada.c index 74e66f7ede..329f46e92c 100644 --- a/cocos2dx/platform/bada/CCPlatformFunc_bada.c +++ b/cocos2dx/platform/bada/CCPlatformFunc_bada.c @@ -4,9 +4,66 @@ #include #include #include -#include #include #include +#undef errno + +static int errno = 0; + +#define _U 01 +#define _L 02 +#define _N 04 +#define _S 010 +#define _P 020 +#define _C 040 +#define _X 0100 +#define _B 0200 + +#define _CTYPE_DATA_0_127 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C|_S, _C|_S, _C|_S, _C|_S, _C|_S, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _N, _N, _N, _N, _N, _N, _N, _N, \ + _N, _N, _P, _P, _P, _P, _P, _P, \ + _P, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _P, _P, _P, _P, _P, \ + _P, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _P, _P, _P, _P, _C + +#define _CTYPE_DATA_128_255 \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0 + +char _ctype_b[128 + 256] = { + _CTYPE_DATA_128_255, + _CTYPE_DATA_0_127, + _CTYPE_DATA_128_255 +}; + + +char *__ctype_ptr__ = (char *) _ctype_b + 127; + int sprintf(char* buf, const char *format, ...) { @@ -1285,3 +1342,9 @@ int sscanf (const char *s,const char *format, ...) return done; } + +void __assert_func(const char *file, int line, const char *a, const char *b) +{ + +} + diff --git a/cocos2dx/platform/bada/Gbk_Unicode.c b/cocos2dx/platform/bada/Gbk_Unicode.c new file mode 100644 index 0000000000..49ceea8f46 --- /dev/null +++ b/cocos2dx/platform/bada/Gbk_Unicode.c @@ -0,0 +1,540 @@ +/* + * Gbk_Unicode.h + * + * Created on: 2011-9-12 + * Author: dumganhar + */ + +#include +#include +#include +#include "Gbk_Unicode.h" + +#define LOGI //printf + +#define USE_MEMORY + +#ifdef USE_MEMORY +#include "gbk_table.h" +#include "unicode_table.h" +#endif + +#undef SAFE_FREE +#define SAFE_FREE(p) do \ + {\ + if ((p) != NULL) \ + { \ + free((p)); \ + (p) = NULL; \ + } \ + }while(0) + +#define UNICODE1_BEGIN (0x3000) +#define UNICODE1_END (0x9FA5) +#define UNICODE1_TOTAL (UNICODE1_END-UNICODE1_BEGIN+1) + +#define UNICODE2_BEGIN (0xFF00) +#define UNICODE2_END (0xFFEF) +#define UNICODE2_TOTAL (UNICODE2_END-UNICODE2_BEGIN+1) + +#define UNICODE3_BEGIN (0x2000) +#define UNICODE3_END (0x206F) +#define UNICODE3_TOTAL (UNICODE3_END-UNICODE3_BEGIN+1) + +#define FONT_ROW_BEGIN 129 +#define FONT_ROW_END 254 +#define FONT_COL_BEGIN 64 +#define FONT_COL_END 254 +#define FONT_TOTAL (((FONT_ROW_END)-(FONT_ROW_BEGIN)+1)*((FONT_COL_END)-(FONT_COL_BEGIN)+1)) + +static unsigned short* g_uni_table = NULL; +static unsigned short* g_gbk_table1 = NULL; +static unsigned short* g_gbk_table2 = NULL; +static unsigned short* g_gbk_table3 = NULL; +static int s_bInit = 0; + +static int myWcslen(const unsigned short* str) +{ + int i=0; + while(*str++) i++; + return i; +} + +int InitGbkUnicodeTable(const char* szTablePath) +{ +#ifndef USE_MEMORY + int ret = 0; + FILE* fp = NULL; + if (s_bInit) + return 0; + fp = fopen(szTablePath, "rb"); + if (fp == NULL) + { + return 0; + } + g_uni_table = (unsigned short*)malloc(FONT_TOTAL*2); + memset((void*)g_uni_table, 0, FONT_TOTAL*2); + + g_gbk_table1 = (unsigned short*)malloc(UNICODE1_TOTAL*2); + memset((void*)g_gbk_table1, 0, UNICODE1_TOTAL*2); + g_gbk_table2 = (unsigned short*)malloc(UNICODE2_TOTAL*2); + memset((void*)g_gbk_table2, 0, UNICODE2_TOTAL*2); + g_gbk_table3 = (unsigned short*)malloc(UNICODE3_TOTAL*2); + memset((void*)g_gbk_table3, 0, UNICODE3_TOTAL*2); + + + ret = fread((void*)g_uni_table, FONT_TOTAL*2, 1, fp); + + ret = fread((void*)g_gbk_table1, UNICODE1_TOTAL*2, 1, fp); + ret = fread((void*)g_gbk_table2, UNICODE2_TOTAL*2, 1, fp); + ret = fread((void*)g_gbk_table3, UNICODE3_TOTAL*2, 1, fp); + fclose(fp); + + s_bInit = 1; +#else + g_uni_table = g_uni_table_array; + g_gbk_table1 = g_gbk_table1_array; + g_gbk_table2 = g_gbk_table2_array; + g_gbk_table3 = g_gbk_table3_array; + s_bInit = 1; +#endif + return 1; +} + +void ReleaseGbkUnicodeTable(void) +{ +#ifndef USE_MEMORY + if (s_bInit) { + if (g_uni_table != NULL) + { + free((void*)g_uni_table); + g_uni_table = NULL; + } + + if (g_gbk_table1 != NULL) + { + free((void*)g_gbk_table1); + g_gbk_table1 = NULL; + } + + if (g_gbk_table2 != NULL) + { + free((void*)g_gbk_table2); + g_gbk_table2 = NULL; + } + + if (g_gbk_table3 != NULL) + { + free((void*)g_gbk_table3); + g_gbk_table3 = NULL; + } + + s_bInit = 0; + } +#endif +} + +#define GET_GBK_WORD(table, s, e) \ + if (pUnicodeIn[i] >= s && pUnicodeIn[i] <= e) \ + { \ + iIndex = pUnicodeIn[i]-s; \ + oneGbk = table[iIndex]; \ + pGbk = (unsigned char*)&oneGbk; \ + pGBKOut[j++] = *(pGbk+1); \ + pGBKOut[j++] = *pGbk; \ + continue; \ + } + + +int MyUnicodeToGBK(char* pGBKOut, int iGbkBufSize, const unsigned short* pUnicodeIn) +{ + unsigned char* pOneUnicode = NULL; + int len = 0; + int iIndex = 0; + int i = 0, j = 0; + + if (!s_bInit) + return 0; + + if (pUnicodeIn == NULL || pGBKOut == NULL || iGbkBufSize <= 2) + { + LOGI("pUnicodeIn == NULL || pGBKOut == NULL || iGbkBufSize <= 2"); + return 0; + } + + memset(pGBKOut, 0, iGbkBufSize); + + len = myWcslen(pUnicodeIn); + for (i = 0, j = 0; i < len; i++) + { + unsigned char* pGbk = NULL; + unsigned short oneGbk = 0; + pOneUnicode = (unsigned char*)&pUnicodeIn[i]; + if (j >= iGbkBufSize-1) + { + break; + } + + if (pOneUnicode[1] == 0) + {// 半角字母符号 + if (pOneUnicode[0] == 0xb7) + { + pGBKOut[j++] = 0xa1; + pGBKOut[j++] = 0xa4; + } + else if (pOneUnicode[0] == 0xB0) + { + pGBKOut[j++] = 0xA1; + pGBKOut[j++] = 0xE3; + } + else + { + pGBKOut[j++] = pOneUnicode[0]; + } + } + else + { + GET_GBK_WORD(g_gbk_table1, UNICODE1_BEGIN, UNICODE1_END);// 汉字 + GET_GBK_WORD(g_gbk_table2, UNICODE2_BEGIN, UNICODE2_END);// 全角字母符号 + GET_GBK_WORD(g_gbk_table3, UNICODE3_BEGIN, UNICODE3_END);// 常用标点符号 + } + } + + j = j > iGbkBufSize-1 ? iGbkBufSize-1 : j; + + pGBKOut[j] = '\0'; + return 1; +} + +int MyGBKToUnicode(unsigned short* pUnicodeOut, int iUniBufSize, const char* pGBKIn) +{ + int i = 0; + int j = 0; + int len = 0; + int iIndex = 0; + unsigned char* pUnicode = NULL; + unsigned short oneGbkHanzi = 0; + unsigned char* pOneGbkHanzi = (unsigned char*)&oneGbkHanzi; + const unsigned char* pGBKInU = (const unsigned char*)pGBKIn; + + if (!s_bInit) + return 0; + + if (pUnicodeOut == NULL || pGBKIn == NULL || iUniBufSize <= 3) + { + LOGI("pUnicodeOut == NULL || pGBKIn == NULL || iUniBufSize <= 3"); + return 0; + } + + memset(pUnicodeOut, 0, iUniBufSize); + + len = strlen(pGBKIn); + for (i = 0; i < len; i++) + { + if (j >= iUniBufSize/2-1) + { + break; + } + + pUnicode = (unsigned char*)&pUnicodeOut[j]; + if (pGBKInU[i] >= 0x00 && pGBKInU[i] <= 0x80) + {// 半角字母符号 + *(pUnicode++) = pGBKInU[i]; + *pUnicode = 0x00; + ++j; + } + else if ((pGBKInU[i] >= 0x81 && pGBKInU[i] <= 0xFE) + &&(pGBKInU[i+1] >= 0x40 && pGBKInU[i+1] <= 0xFE) + && (pGBKInU[i+1] != 0x7F) + ) + {// 中文 + pOneGbkHanzi[1] = pGBKInU[i]; + pOneGbkHanzi[0] = pGBKInU[i+1]; + iIndex = (pOneGbkHanzi[1]-0x81)*191+(pOneGbkHanzi[0]-0x40); + pUnicodeOut[j] = g_uni_table[iIndex]; + ++i; + ++j; + } + } +// LOGI("unicode len = %d", j); + + j = j > iUniBufSize/2-1 ? iUniBufSize/2-1 : j; + + pUnicodeOut[j] = L'\0'; + return 1; +} + +static int GetUtf8Len(unsigned short* pUniStr) +{ + int wideLen = 0; + int len = 0; + int i = 0; + + if (pUniStr == NULL || (wideLen = myWcslen(pUniStr)) <= 0) + return 0; + + for (i = 0; i < wideLen; i++) + { + unsigned short c = pUniStr[i]; + if (c < 0x80) + { + len += 1; + } + else if (c < 0x800) + { + len += 2; + } + else if (c < 0x10000) + { + len += 3; + } + else if (c < 0x200000) + { + len += 4; + } + else if (c < 0x4000000) + { + len += 5; + } + else + { + len += 6; + } + } + return len; +} + +static int unichar_to_utf8 (unsigned short c, char* outbuf) +{ + /* If this gets modified, also update the copy in g_string_insert_unichar() */ + size_t len = 0; + int first; + int i; + + if (c < 0x80) + { + first = 0; + len = 1; + } + else if (c < 0x800) + { + first = 0xc0; + len = 2; + } + else if (c < 0x10000) + { + first = 0xe0; + len = 3; + } + else if (c < 0x200000) + { + first = 0xf0; + len = 4; + } + else if (c < 0x4000000) + { + first = 0xf8; + len = 5; + } + else + { + first = 0xfc; + len = 6; + } + + if (outbuf) + { + for (i = len - 1; i > 0; --i) + { + outbuf[i] = (c & 0x3f) | 0x80; + c >>= 6; + } + outbuf[0] = c | first; + } + + return len; +} + +int MyGBKToUTF8_M(char** ppszOutUtf8, char* pszGbk) +{ + int i = 0; + int iRet = 0; + int wideLenGuess = 0; + int wideLen = 0; + int utfLen = 0; + unsigned short* pUnicode = NULL; + if (ppszOutUtf8 == NULL || pszGbk == NULL || strlen(pszGbk) <= 0) + return 0; + wideLenGuess = (strlen(pszGbk)+1)*2; + pUnicode = (unsigned short*)malloc(wideLenGuess); + if (pUnicode == NULL) + { + LOGI("int MyGBKToUTF8_M malloc unicode buf fails!"); + return 0; + } + + memset(pUnicode, 0, wideLenGuess); + + do { + if (0 == MyGBKToUnicode(pUnicode, wideLenGuess, pszGbk)) + { + LOGI("MyGBKToUnicode fails in MyGBKToUTF8_M"); + break; + } + wideLen = myWcslen(pUnicode); + utfLen = GetUtf8Len(pUnicode); + *ppszOutUtf8 = (char*)malloc(utfLen+1); + if (*ppszOutUtf8 == NULL) + { + break; + } + + memset(*ppszOutUtf8, 0, utfLen+1); + for (i = 0; i < wideLen; i++) + { + char szTmpUtf8[7] = {0}; + unichar_to_utf8(pUnicode[i], szTmpUtf8); + strcat(*ppszOutUtf8, szTmpUtf8); + } + + iRet = 1; + }while (0); + + SAFE_FREE(pUnicode); + + return iRet; +} + +/************************************************************************************************* + + * 将UTF8编码转换成Unicode(UCS-2)编码 + + * 参数: + + * char* pInput 指向输入字符串(以'\0'结尾)的指针 + + * char** ppOutput 指向输出字符串指针的指针 + + * 返回值: + + * 返回转换后的Unicode字符串的字节数,如果出错则返回-1 + + * 注意: + + * 1. UTF8没有字节序问题,但是Unicode字符有字节序, + + * 字节序分为大端(Big Endian)和小端(Little Endian)两种, + + * 在Intel处理器中采用小端法表示,因此本例中采用小端法表示。(低地址存低位) + + * 2. 在调用本函数后需要手动释放 *ppOutput 指向的内存,否则将会造成内存泄漏。 + + **************************************************************************************************/ + +static int utf8_to_unicode(char* pInput, char** ppOutput) +{ + int outputSize = 0; //记录转换后的Unicode字符串的字节数 + char *tmp = NULL; + if (pInput == NULL || strlen(pInput) <= 0) + return -1; + + *ppOutput = (char *)malloc(strlen(pInput) * 2); //为输出字符串分配足够大的内存空间 + memset(*ppOutput, 0, strlen(pInput) * 2); + tmp = *ppOutput; //临时变量,用于遍历输出字符串 + + while (*pInput) + { + if (*pInput > 0x00 && *pInput <= 0x7F) //处理单字节UTF8字符(英文字母、数字) + { + *tmp = *pInput; + tmp++; + *tmp = 0; //小端法表示,在高地址填补0 + } + else if (((*pInput) & 0xE0) == 0xC0) //处理双字节UTF8字符 + { + char high = *pInput; + char low = 0; + pInput++; + low = *pInput; + + if ((low & 0xC0) != 0x80) //检查是否为合法的UTF8字符表示 + { + return -1; //如果不是则报错 + } + + *tmp = (high << 6) + (low & 0x3F); + tmp++; + *tmp = (high >> 2) & 0x07; + } + else if (((*pInput) & 0xF0) == 0xE0) //处理三字节UTF8字符 + { + char high = *pInput; + char middle = 0; + char low = 0; + + pInput++; + middle = *pInput; + pInput++; + low = *pInput; + + if (((middle & 0xC0) != 0x80) || ((low & 0xC0) != 0x80)) + { + return -1; + } + + *tmp = (middle << 6) + (low & 0x7F); + tmp++; + *tmp = (high << 4) + ((middle >> 2) & 0x0F); + } + else //对于其他字节数的UTF8字符不进行处理 + { + return -1; + } + + pInput ++; + tmp ++; + outputSize += 2; + } + + *tmp = 0; + tmp++; + *tmp = 0; + + return outputSize; +} + +int MyUTF8ToGBK_M(char** ppszOutGbk, char* pszUtf8) +{ + int iRet = 0; + int unicodeBytes = 0; + unsigned short* pUnicodeStrChar = NULL; + + if (ppszOutGbk == NULL || pszUtf8 == NULL || strlen(pszUtf8) <= 0) + return 0; + + do { + unicodeBytes = utf8_to_unicode(pszUtf8, (char**)&pUnicodeStrChar); + if (unicodeBytes <= 0) + { + break; + } + + *ppszOutGbk = (char*)malloc(unicodeBytes+1); + if (*ppszOutGbk == NULL) + { + break; + } + memset(*ppszOutGbk, 0, unicodeBytes+1); + if (0 == MyUnicodeToGBK(*ppszOutGbk, unicodeBytes+1, pUnicodeStrChar)) + { + LOGI("MyUnicodeToGBK fails in MyUTF8ToGBK_M"); + SAFE_FREE(*ppszOutGbk); + break; + } + iRet = 1; + } while(0); + + SAFE_FREE(pUnicodeStrChar); + + return iRet; +} diff --git a/cocos2dx/platform/bada/Gbk_Unicode.cpp b/cocos2dx/platform/bada/Gbk_Unicode.cpp deleted file mode 100644 index 87e852a82a..0000000000 --- a/cocos2dx/platform/bada/Gbk_Unicode.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Gbk_Unicode.cpp - * - * Created on: 2010-7-7 - * Author: Administrator - */ - -#include -#include -#include -#include -#include "Gbk_Unicode.h" - -#define UNICODE_BEGIN (0x3001) -#define UNICODE_END (0x9FA5) -#define UNICODE_TOTAL (UNICODE_END-UNICODE_BEGIN+1) -#define UNICODE2_BEGIN (0xFF00) -#define UNICODE2_END (0xFFEF) -#define UNICODE2_TOTAL (UNICODE2_END-UNICODE2_BEGIN+1) - - -#define FONT_ROW_BEGIN 129 -#define FONT_ROW_END 254 -#define FONT_COL_BEGIN 64 -#define FONT_COL_END 254 -#define FONT_TOTAL (((FONT_ROW_END)-(FONT_ROW_BEGIN)+1)*((FONT_COL_END)-(FONT_COL_BEGIN)+1)) - -const unsigned short* gbk_table = NULL; -const unsigned short* gbk_table2 = NULL; -const unsigned short* uni_table = NULL; - -int InitGbkUnicodeTable(char* szTablePath) -{ - int ret = 0; - FILE* fp = NULL; - fp = fopen(szTablePath, "rb"); - if (fp == NULL) - { - return 0; - } - gbk_table = (unsigned short*)malloc(UNICODE_TOTAL*2); - memset((void*)gbk_table, 0, UNICODE_TOTAL*2); - gbk_table2 = (unsigned short*)malloc(UNICODE2_TOTAL*2); - memset((void*)gbk_table2, 0, UNICODE2_TOTAL*2); - uni_table = (unsigned short*)malloc(FONT_TOTAL*2); - memset((void*)uni_table, 0, FONT_TOTAL*2); - - ret = fread((void*)uni_table, FONT_TOTAL*2, 1, fp); - ret = fread((void*)gbk_table, UNICODE_TOTAL*2, 1, fp); - ret = fread((void*)gbk_table2, UNICODE2_TOTAL*2, 1, fp); - - - - - fclose(fp); - - return 1; -} - -void ReleaseGbkUnicodeTable(void) -{ - if (gbk_table != NULL) - { - free((void*)gbk_table); - gbk_table = NULL; - } - - if (gbk_table2 != NULL) - { - free((void*)gbk_table2); - gbk_table2 = NULL; - } - - if (uni_table != NULL) - { - free((void*)uni_table); - uni_table = NULL; - } -} - -void MyUnicodeToGBK(char* pGBKOut, wchar_t* pUnicodeIn) -{ - char* pOneUnicode = NULL; - int len = wcslen(pUnicodeIn); - int iIndex = 0; - int i = 0, j = 0; - if (pUnicodeIn == NULL|| pGBKOut == NULL) - { - return; - } - - for (i = 0, j = 0; i < len; i++) - { - unsigned char* pGbk = NULL; - unsigned short oneGbk = 0; - pOneUnicode = (char*)&pUnicodeIn[i]; - if (pOneUnicode[1] == 0) - {// 鍗婅瀛楁瘝绗﹀彿 - pGBKOut[j++] = pOneUnicode[0]; - } - else - { - if (pUnicodeIn[i] >= UNICODE_BEGIN && pUnicodeIn[i] <= UNICODE_END) - {// 姹夊瓧 - iIndex = pUnicodeIn[i]-UNICODE_BEGIN; - oneGbk = gbk_table[iIndex]; - pGbk = (unsigned char*)&oneGbk; - pGBKOut[j++] = *(pGbk+1); - pGBKOut[j++] = *pGbk; - } - else if (pUnicodeIn[i] >=UNICODE2_BEGIN && pUnicodeIn[i] <= UNICODE2_END) - {// 鍏ㄨ瀛楁瘝绗﹀彿 - iIndex = pUnicodeIn[i]-UNICODE2_BEGIN; - oneGbk = gbk_table2[iIndex]; - pGbk = (unsigned char*)&oneGbk; - pGBKOut[j++] = *(pGbk+1); - pGBKOut[j++] = *pGbk; - } - - } - } - pGBKOut[j] = '\0'; -} - -void MyGBKToUnicode(wchar_t* pUnicodeOut, char* pGBKIn) -{ - int i = 0; - int j = 0; - int len = 0; - int iIndex = 0; - unsigned char* pUnicode = NULL; - unsigned short oneGbkHanzi = 0; - unsigned char* pOneGbkHanzi = (unsigned char*)&oneGbkHanzi; - unsigned char* pGBKInU = (unsigned char*)pGBKIn; - - if (pUnicodeOut == NULL || pGBKIn == NULL) - { - return; - } - len = strlen(pGBKIn); - for (i = 0; i < len; i++) - { - pUnicode = (unsigned char*)&pUnicodeOut[j]; - if (pGBKInU[i] >= 0x00 && pGBKInU[i] <= 0x80) - {// 鍗婅瀛楁瘝绗﹀彿 - *(pUnicode++) = pGBKInU[i]; - *pUnicode = 0x00;; - ++j; - } - else if ((pGBKInU[i] >= 0x81 && pGBKInU[i] <= 0xFE) - &&(pGBKInU[i+1] >= 0x40 && pGBKInU[i+1] <= 0xFE) - && (pGBKInU[i+1] != 0x7F) - ) - {// 涓枃 - pOneGbkHanzi[1] = pGBKInU[i]; - pOneGbkHanzi[0] = pGBKInU[i+1]; - iIndex = (pOneGbkHanzi[1]-0x81)*191+(pOneGbkHanzi[0]-0x40); - pUnicodeOut[j] = uni_table[iIndex]; - ++i; - ++j; - } - } - pUnicodeOut[j] = L'\0'; -} diff --git a/cocos2dx/platform/bada/Gbk_Unicode.h b/cocos2dx/platform/bada/Gbk_Unicode.h index a232d3f763..1e5c664e9a 100644 --- a/cocos2dx/platform/bada/Gbk_Unicode.h +++ b/cocos2dx/platform/bada/Gbk_Unicode.h @@ -1,16 +1,42 @@ -/* - * Gbk_Unicode.h - * - * Created on: 2010-7-7 - * Author: Administrator - */ - -#ifndef GBK_UNICODE_H_ -#define GBK_UNICODE_H_ - -int InitGbkUnicodeTable(char* szTablePath); -void ReleaseGbkUnicodeTable(void); -void MyUnicodeToGBK(char* pGBKOut, wchar_t* pUnicodeIn); -void MyGBKToUnicode(wchar_t* pUnicodeOut, char* pGBKIn); - -#endif /* GBK_UNICODE_H_ */ +/* + * Gbk_Unicode.h + * + * Created on: 2011-9-12 + * Author: dumganhar + */ + +#ifndef GBK_UNICODE_H_ +#define GBK_UNICODE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * param: + * pGbkOut[out]:用于存放输出Gbk的缓冲 + * iGbkBufSize[in]:用于存放输出Gbk的缓冲的大小,单位为字节, 若pGbkOut为数组, 可使用sizeof()计算数组长度 + * pUnicodeIn[in]:需要转换的unicode缓冲 + * return: 0:失败, 1: 成功 +*/ +int MyUnicodeToGBK(char* pGBKOut, int iGbkBufSize, const unsigned short* pUnicodeIn); + +/* + * param: + * pUnicodeOut[out]:用于存放输出unicode的缓冲 + * iUniBufSize[in]:用于存放输出unicode的缓冲的大小,单位为字节, 若pUnicodeOut为数组, 可使用sizeof()计算数组长度 + * pGBKIn[in]:需要转换的gbk缓冲 + * return: 0:失败, 1: 成功 +*/ +int MyGBKToUnicode(unsigned short* pUnicodeOut, int iUniBufSize, const char* pGBKIn); +// ppszOutUtf8为空指针的地址传入,函数内部对其赋值,_M结束的函数需要用free释放 +int MyGBKToUTF8_M(char** ppszOutUtf8, char* pszGbk); +// ppszOutGbk为空指针的地址传入,函数内部对其赋值,_M结束的函数需要用free释放 +int MyUTF8ToGBK_M(char** ppszOutGbk, char* pszUtf8); + +#ifdef __cplusplus +} +#endif + + +#endif /* GBK_UNICODE_H_ */ diff --git a/cocos2dx/platform/bada/gbk_table.h.REMOVED.git-id b/cocos2dx/platform/bada/gbk_table.h.REMOVED.git-id new file mode 100644 index 0000000000..6db4f9aad7 --- /dev/null +++ b/cocos2dx/platform/bada/gbk_table.h.REMOVED.git-id @@ -0,0 +1 @@ +91648ccc87a82401632a6369a47382bb438d3160 \ No newline at end of file diff --git a/cocos2dx/platform/bada/unicode_table.h.REMOVED.git-id b/cocos2dx/platform/bada/unicode_table.h.REMOVED.git-id new file mode 100644 index 0000000000..89f85cc840 --- /dev/null +++ b/cocos2dx/platform/bada/unicode_table.h.REMOVED.git-id @@ -0,0 +1 @@ +9260a2c16edf31510bf8a9205b1058140666ef81 \ No newline at end of file