cocos2dx3.0的label字体去描边

[html]  view plain copy
  1. </pre></h4><p><pre name="code" class="cpp">  

    近日,一直被3.0的字体描边所困扰,在安卓手机下字体没问题,挺好看,但是在iphone手机上显示特别不清晰,一直很怪异的感觉,尤其是白色的label,后来我的同事兼师父将底层改了下(3.2之后的版本貌似就不存在这个问题了)。

       方法:找到项目/cocos2d/cocos/2d/platform目录下的       CCDevice.h文件   的静态gettexturedatafortext方法改成这个(即加一个参数)

[cpp]  view plain copy
  1. static Data getTextureDataForText(const char * text, const FontDefinition& textDefinition, TextAlign align, int &width, int &height, bool& hasPremultipliedAlpha);  
,然后把相应平台的这个函数分别增一个参数(因为只有ios好像有这个问题,所以其他的平台暂时不用改,但是需要在功能函数添加一个实参):

ios/CCDevice.mm

[cpp]  view plain copy
  1. Data Device::getTextureDataForText(const char * text, const FontDefinition& textDefinition, TextAlign align, int &width, int &height, bool& hasPremultipliedAlpha)  
  2. {  
  3.     Data ret;  
  4.       
  5.     do {  
  6.         tImageInfo info = {0};  
  7.         info.width                  = textDefinition._dimensions.width;  
  8.         info.height                 = textDefinition._dimensions.height;  
  9.         info.hasShadow              = textDefinition._shadow._shadowEnabled;  
  10.         info.shadowOffset.width     = textDefinition._shadow._shadowOffset.width;  
  11.         info.shadowOffset.height    = textDefinition._shadow._shadowOffset.height;  
  12.         info.shadowBlur             = textDefinition._shadow._shadowBlur;  
  13.         info.shadowOpacity          = textDefinition._shadow._shadowOpacity;  
  14.         info.hasStroke              = textDefinition._stroke._strokeEnabled;  
  15.         info.strokeColorR           = textDefinition._stroke._strokeColor.r / 255.0f;  
  16.         info.strokeColorG           = textDefinition._stroke._strokeColor.g / 255.0f;  
  17.         info.strokeColorB           = textDefinition._stroke._strokeColor.b / 255.0f;  
  18.         info.strokeSize             = textDefinition._stroke._strokeSize;  
  19.         info.tintColorR             = textDefinition._fontFillColor.r / 255.0f;  
  20.         info.tintColorG             = textDefinition._fontFillColor.g / 255.0f;  
  21.         info.tintColorB             = textDefinition._fontFillColor.b / 255.0f;  
  22.           
  23.         if (! _initWithString(text, align, textDefinition._fontName.c_str(), textDefinition._fontSize, &info))  
  24.         {  
  25.             break;  
  26.         }  
  27.         height = (short)info.height;  
  28.         width = (short)info.width;  
  29.         ret.fastSet(info.data,width * height * 4);  
  30.         hasPremultipliedAlpha = true;  
  31.     } while (0);  
  32.       
  33.     return ret;  
  34. }  

win32/CCDevice.cpp

[cpp]  view plain copy
  1. Data Device::getTextureDataForText(const char * text, const FontDefinition& textDefinition, TextAlign align, int &width, int &height, bool& hasPremultipliedAlpha)  
  2. {  
  3.     Data ret;  
  4.     do   
  5.     {  
  6.         BitmapDC& dc = sharedBitmapDC();  
  7.   
  8.         if (! dc.setFont(textDefinition._fontName.c_str(), textDefinition._fontSize))  
  9.         {  
  10.             log("Can't found font(%s), use system default", textDefinition._fontName.c_str());  
  11.         }  
  12.   
  13.         // draw text  
  14.         SIZE size = {textDefinition._dimensions.width, textDefinition._dimensions.height};  
  15.         CC_BREAK_IF(! dc.drawText(text, size, align));  
  16.   
  17.         int dataLen = size.cx * size.cy * 4;  
  18.         unsigned char* dataBuf = (unsigned char*)malloc(sizeof(unsigned char) * dataLen);  
  19.         CC_BREAK_IF(! dataBuf);  
  20.   
  21.         struct  
  22.         {  
  23.             BITMAPINFOHEADER bmiHeader;  
  24.             int mask[4];  
  25.         } bi = {0};  
  26.         bi.bmiHeader.biSize = sizeof(bi.bmiHeader);  
  27.         CC_BREAK_IF(! GetDIBits(dc.getDC(), dc.getBitmap(), 0, 0,   
  28.             NULL, (LPBITMAPINFO)&bi, DIB_RGB_COLORS));  
  29.   
  30.         width    = (short)size.cx;  
  31.         height   = (short)size.cy;  
  32.   
  33.         // copy pixed data  
  34.         bi.bmiHeader.biHeight = (bi.bmiHeader.biHeight > 0)  
  35.             ? - bi.bmiHeader.biHeight : bi.bmiHeader.biHeight;  
  36.         GetDIBits(dc.getDC(), dc.getBitmap(), 0, height, dataBuf,   
  37.             (LPBITMAPINFO)&bi, DIB_RGB_COLORS);  
  38.   
  39.         // change pixel's alpha value to 255, when it's RGB != 0  
  40.         COLORREF * pPixel = NULL;  
  41.         for (int y = 0; y < height; ++y)  
  42.         {  
  43.             pPixel = (COLORREF *)dataBuf + y * width;  
  44.             for (int x = 0; x < width; ++x)  
  45.             {  
  46.                 COLORREF& clr = *pPixel;  
  47.                 clr = (0xffffff | (GetRValue(clr) << 24));  
  48.                 ++pPixel;  
  49.             }  
  50.         }  
  51.   
  52.         ret.fastSet(dataBuf,dataLen);  
  53.     } while (0);  
  54.     return ret;  
  55. }  

最后,将CCTexture2D.cpp的initWithString(const char *text, const FontDefinition& textDefinition)方法改成:

[cpp]  view plain copy
  1. bool Texture2D::initWithString(const char *text, const FontDefinition& textDefinition)  
  2. {  
  3.     if(!text || 0 == strlen(text))  
  4.     {  
  5.         return false;  
  6.     }  
  7.       
  8. #if CC_ENABLE_CACHE_TEXTURE_DATA  
  9.     // cache the texture data  
  10.     VolatileTextureMgr::addStringTexture(this, text, textDefinition);  
  11. #endif  
  12.       
  13.     bool ret = false;  
  14.     Device::TextAlign align;  
  15.       
  16.     if (TextVAlignment::TOP == textDefinition._vertAlignment)  
  17.     {  
  18.         align = (TextHAlignment::CENTER == textDefinition._alignment) ? Device::TextAlign::TOP  
  19.         : (TextHAlignment::LEFT == textDefinition._alignment) ? Device::TextAlign::TOP_LEFT : Device::TextAlign::TOP_RIGHT;  
  20.     }  
  21.     else if (TextVAlignment::CENTER == textDefinition._vertAlignment)  
  22.     {  
  23.         align = (TextHAlignment::CENTER == textDefinition._alignment) ? Device::TextAlign::CENTER  
  24.         : (TextHAlignment::LEFT == textDefinition._alignment) ? Device::TextAlign::LEFT : Device::TextAlign::RIGHT;  
  25.     }  
  26.     else if (TextVAlignment::BOTTOM == textDefinition._vertAlignment)  
  27.     {  
  28.         align = (TextHAlignment::CENTER == textDefinition._alignment) ? Device::TextAlign::BOTTOM  
  29.         : (TextHAlignment::LEFT == textDefinition._alignment) ? Device::TextAlign::BOTTOM_LEFT : Device::TextAlign::BOTTOM_RIGHT;  
  30.     }  
  31.     else  
  32.     {  
  33.         CCASSERT(false"Not supported alignment format!");  
  34.         return false;  
  35.     }  
  36.       
  37. #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) && (CC_TARGET_PLATFORM != CC_PLATFORM_IOS)  
  38.     CCASSERT(textDefinition._stroke._strokeEnabled == false"Currently stroke only supported on iOS and Android!");  
  39. #endif  
  40.       
  41.     PixelFormat      pixelFormat = g_defaultAlphaPixelFormat;  
  42.     unsigned char* outTempData = nullptr;  
  43.     ssize_t outTempDataLen = 0;  
  44.       
  45.     int imageWidth;  
  46.     int imageHeight;  
  47.     auto textDef = textDefinition;  
  48.     auto contentScaleFactor = CC_CONTENT_SCALE_FACTOR();  
  49.     textDef._fontSize *= contentScaleFactor;  
  50.     textDef._dimensions.width *= contentScaleFactor;  
  51.     textDef._dimensions.height *= contentScaleFactor;  
  52.     textDef._stroke._strokeSize *= contentScaleFactor;  
  53.     textDef._shadow._shadowEnabled = false;  
  54.       
  55.     bool hasPremultipliedAlpha;  
  56.     Data outData = Device::getTextureDataForText(text, textDef, align, imageWidth, imageHeight, hasPremultipliedAlpha);  
  57.     if(outData.isNull())  
  58.     {  
  59.         return false;  
  60.     }  
  61.       
  62.     Size  imageSize = Size((float)imageWidth, (float)imageHeight);  
  63.     pixelFormat = convertDataToFormat(outData.getBytes(), imageWidth*imageHeight*4, PixelFormat::RGBA8888, pixelFormat, &outTempData, &outTempDataLen);  
  64.       
  65.     ret = initWithData(outTempData, outTempDataLen, pixelFormat, imageWidth, imageHeight, imageSize);  
  66.       
  67.     if (outTempData != nullptr && outTempData != outData.getBytes())  
  68.     {  
  69.         free(outTempData);  
  70.     }  
  71.     _hasPremultipliedAlpha = hasPremultipliedAlpha;  
  72.       
  73.     return ret;  
  74. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值