首页 > 代码库 > Cocos2d-x项目移植到WP8系列之八:CCLabelTTF显示中文不换行

Cocos2d-x项目移植到WP8系列之八:CCLabelTTF显示中文不换行

 

在wp8平台上,CCLabeTTF显示中文不会自动换行,看了下源码,原来底层的实现是根据text的空格进行判断的,每遇到一个空格就判断是否超过label的宽度,超过就换行,但text如果是中文的话,哪来的空格给换行~~

以下实现全部参考 http://blog.csdn.net/hopingwhite/article/details/38414917 ,整理后的代码如下:

在CCFreeTypeFont.h里的CCFreeTypeFont类添加两个方法:

 FT_Error addLine(const std::string& line);
 void endLine_chinese();

实现如下:

  1 void CCFreeTypeFont::endLine_chinese()   2 {  3     if(m_currentLine)  4     {  5         m_lines.push_back(m_currentLine);  6         compute_bbox(m_currentLine->glyphs, &m_currentLine->bbox);  7         m_currentLine->width = m_currentLine->bbox.xMax - m_currentLine->bbox.xMin;  8         m_textWidth = max(m_textWidth,m_currentLine->bbox.xMax - m_currentLine->bbox.xMin);  9         m_textHeight += m_lineHeight; 10         m_currentLine = NULL; 11     } 12 } 13  14  15  16 FT_Error CCFreeTypeFont::addLine(const std::string& line) 17 { 18         wchar_t *       pwszBuffer = nullptr; 19  20         int num_chars = line.size(); 21         int nBufLen = num_chars + 1; 22         pwszBuffer = new wchar_t[nBufLen]; 23         if (!pwszBuffer) 24         { 25                 return -1; 26         } 27  28         memset(pwszBuffer, 0, nBufLen); 29         num_chars = MultiByteToWideChar(CP_UTF8, 0, line.c_str(), num_chars, pwszBuffer, nBufLen); 30         pwszBuffer[num_chars] = \0; 31  32         int maxWidth = m_inWidth ? m_inWidth : m_windowWidth; 33  34         newLine(); 35         FT_Vector pen = m_currentLine->pen; 36         FT_GlyphSlot    slot = m_face->glyph; 37         FT_UInt                 glyph_index; 38         FT_UInt                 previous = 0; 39         FT_Error                error = 0; 40         unsigned int    numGlyphs = 0; 41  42         FT_Bool useKerning = FT_HAS_KERNING(m_face); 43  44         int n = 0; 45         while (n < num_chars) 46         { 47                 TGlyph glyph; 48  49                 /* convert character code to glyph index */ 50                 FT_ULong c = pwszBuffer[n++]; 51                 glyph_index = FT_Get_Char_Index(m_face, c); 52  53                 if (useKerning && previous && glyph_index) 54                 { 55                         FT_Vector  delta; 56                         FT_Get_Kerning(m_face, previous, glyph_index, 57                                 FT_KERNING_DEFAULT, &delta); 58                         pen.x += delta.x >> 6; 59                 } 60  61                 /* store current pen position */ 62                 glyph.pos = pen; 63                 glyph.index = glyph_index; 64  65                 /* load glyph image into the slot without rendering */ 66                 error = FT_Load_Glyph(m_face, glyph_index, FT_LOAD_DEFAULT); 67                 if (error) 68                         continue;  /* ignore errors, jump to next glyph */ 69  70                 /* extract glyph image and store it in our table */ 71                 error = FT_Get_Glyph(m_face->glyph, &glyph.image); 72                 if (error) 73                         continue;  /* ignore errors, jump to next glyph */ 74  75                 /* translate the glyph image now */ 76                 FT_Glyph_Transform(glyph.image, 0, &glyph.pos); 77  78                 /* increment pen position */ 79                 pen.x += slot->advance.x >> 6; 80  81                 if (pen.x > maxWidth) 82                 { 83                         m_currentLine->pen = pen; 84                         85                         // endLine(); 86                         endLine_chinese(); 87  88                         newLine(); 89                         pen = m_currentLine->pen; 90                         previous = 0; 91                         n--; 92                 } 93                 else 94                 { 95                         m_currentLine->glyphs.push_back(glyph); 96                         /* record current glyph index */ 97                         previous = glyph_index; 98                 } 99         }100 101         if (m_currentLine)102         {103                 m_currentLine->pen = pen;104                 105                 //endLine();106                 endLine_chinese();107         }108 109         CC_SAFE_DELETE_ARRAY(pwszBuffer);110         return error;111 }

 

FT_Error CCFreeTypeFont::initGlyphs(const char* text)的实现改成如下:

 1 FT_Error CCFreeTypeFont::initGlyphs(const char* text)  2 { 3     FT_Error error = 0; 4     std::stringstream stringStream(text); 5     std::string line; 6     vector<std::string> lines; 7     vector<std::string> words; 8  9     m_textWidth = 0;10     m_textHeight = 0;11     // the height of a line of text based on the max height of a glyph in the font size12     m_lineHeight = ((m_face->size->metrics.ascender) >> 6) - ((m_face->size->metrics.descender) >> 6);13 14     m_lines.clear();15 16     while(std::getline(stringStream, line) && !error) 17     {18       /*  newLine();19 20         std::size_t prev = 0, pos;21         while ((pos = line.find_first_of(" ", prev)) != std::string::npos)22         {23             if (pos > prev)24             {25                 addWord(line.substr(prev, pos-prev));26             }27             prev = pos + 1;28         }29         if (prev < line.length())30         {31             addWord(line.substr(prev, std::string::npos));32         }33         endLine();34         */35         addLine(line);36     }37 38     return error;39 }


再次感谢: http://blog.csdn.net/hopingwhite/article/details/38414917

转载请注明出处: http://www.cnblogs.com/zouzf/p/3985330.html

 

Cocos2d-x项目移植到WP8系列之八:CCLabelTTF显示中文不换行