mirror of https://github.com/axmolengine/axmol.git
Fixed label may become white/black block after resume from background on android
This commit is contained in:
parent
72fb059aeb
commit
342c582124
|
@ -36,7 +36,8 @@ NS_CC_BEGIN
|
|||
|
||||
const int FontAtlas::CacheTextureWidth = 512;
|
||||
const int FontAtlas::CacheTextureHeight = 512;
|
||||
const char* FontAtlas::EVENT_PURGE_TEXTURES = "__cc_FontAtlasPurgeTextures";
|
||||
const char* FontAtlas::CMD_PURGE_FONTATLAS = "__cc_PURGE_FONTATLAS";
|
||||
const char* FontAtlas::CMD_RESET_FONTATLAS = "__cc_RESET_FONTATLAS";
|
||||
|
||||
FontAtlas::FontAtlas(Font &theFont)
|
||||
: _font(&theFont)
|
||||
|
@ -44,7 +45,6 @@ FontAtlas::FontAtlas(Font &theFont)
|
|||
, _fontAscender(0)
|
||||
, _rendererRecreatedListener(nullptr)
|
||||
, _antialiasEnabled(true)
|
||||
, _rendererRecreate(false)
|
||||
{
|
||||
_font->retain();
|
||||
|
||||
|
@ -122,25 +122,11 @@ void FontAtlas::purgeTexturesAtlas()
|
|||
FontFreeType* fontTTf = dynamic_cast<FontFreeType*>(_font);
|
||||
if (fontTTf && _atlasTextures.size() > 1)
|
||||
{
|
||||
for( auto &item: _atlasTextures)
|
||||
{
|
||||
if (item.first != 0)
|
||||
{
|
||||
item.second->release();
|
||||
}
|
||||
}
|
||||
auto temp = _atlasTextures[0];
|
||||
_atlasTextures.clear();
|
||||
_atlasTextures[0] = temp;
|
||||
|
||||
_fontLetterDefinitions.clear();
|
||||
memset(_currentPageData,0,_currentPageDataSize);
|
||||
_currentPage = 0;
|
||||
_currentPageOrigX = 0;
|
||||
_currentPageOrigY = 0;
|
||||
|
||||
_font->retain();
|
||||
auto eventDispatcher = Director::getInstance()->getEventDispatcher();
|
||||
eventDispatcher->dispatchCustomEvent(EVENT_PURGE_TEXTURES,this);
|
||||
eventDispatcher->dispatchCustomEvent(CMD_PURGE_FONTATLAS,this);
|
||||
eventDispatcher->dispatchCustomEvent(CMD_RESET_FONTATLAS,this);
|
||||
_font->release();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -149,27 +135,11 @@ void FontAtlas::listenRendererRecreated(EventCustom *event)
|
|||
FontFreeType* fontTTf = dynamic_cast<FontFreeType*>(_font);
|
||||
if (fontTTf)
|
||||
{
|
||||
for( auto &item: _atlasTextures)
|
||||
{
|
||||
if (item.first != 0)
|
||||
{
|
||||
item.second->release();
|
||||
}
|
||||
}
|
||||
auto temp = _atlasTextures[0];
|
||||
_atlasTextures.clear();
|
||||
_atlasTextures[0] = temp;
|
||||
|
||||
_fontLetterDefinitions.clear();
|
||||
memset(_currentPageData,0,_currentPageDataSize);
|
||||
_currentPage = 0;
|
||||
_currentPageOrigX = 0;
|
||||
_currentPageOrigY = 0;
|
||||
|
||||
_rendererRecreate = true;
|
||||
_font->retain();
|
||||
auto eventDispatcher = Director::getInstance()->getEventDispatcher();
|
||||
eventDispatcher->dispatchCustomEvent(EVENT_PURGE_TEXTURES,this);
|
||||
_rendererRecreate = false;
|
||||
eventDispatcher->dispatchCustomEvent(CMD_PURGE_FONTATLAS,this);
|
||||
eventDispatcher->dispatchCustomEvent(CMD_RESET_FONTATLAS,this);
|
||||
_font->release();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -309,25 +279,17 @@ bool FontAtlas::prepareLetterDefinitions(const std::u16string& utf16String)
|
|||
|
||||
if(existNewLetter)
|
||||
{
|
||||
if (_rendererRecreate)
|
||||
unsigned char *data = nullptr;
|
||||
if(pixelFormat == Texture2D::PixelFormat::AI88)
|
||||
{
|
||||
_atlasTextures[_currentPage]->initWithData(_currentPageData, _currentPageDataSize,
|
||||
pixelFormat, CacheTextureWidth, CacheTextureHeight, Size(CacheTextureWidth,CacheTextureHeight) );
|
||||
data = _currentPageData + CacheTextureWidth * (int)startY * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned char *data = nullptr;
|
||||
if(pixelFormat == Texture2D::PixelFormat::AI88)
|
||||
{
|
||||
data = _currentPageData + CacheTextureWidth * (int)startY * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
data = _currentPageData + CacheTextureWidth * (int)startY;
|
||||
}
|
||||
_atlasTextures[_currentPage]->updateWithData(data, 0, startY,
|
||||
CacheTextureWidth, _currentPageOrigY - startY + _commonLineHeight);
|
||||
data = _currentPageData + CacheTextureWidth * (int)startY;
|
||||
}
|
||||
_atlasTextures[_currentPage]->updateWithData(data, 0, startY,
|
||||
CacheTextureWidth, _currentPageOrigY - startY + _commonLineHeight);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -61,7 +61,8 @@ class CC_DLL FontAtlas : public Ref
|
|||
public:
|
||||
static const int CacheTextureWidth;
|
||||
static const int CacheTextureHeight;
|
||||
static const char* EVENT_PURGE_TEXTURES;
|
||||
static const char* CMD_PURGE_FONTATLAS;
|
||||
static const char* CMD_RESET_FONTATLAS;
|
||||
/**
|
||||
* @js ctor
|
||||
*/
|
||||
|
@ -125,7 +126,6 @@ protected:
|
|||
int _fontAscender;
|
||||
EventListenerCustom* _rendererRecreatedListener;
|
||||
bool _antialiasEnabled;
|
||||
bool _rendererRecreate;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
#include "base/CCEventListenerCustom.h"
|
||||
#include "base/CCEventDispatcher.h"
|
||||
#include "base/CCEventCustom.h"
|
||||
|
||||
#include "deprecated/CCString.h"
|
||||
|
||||
NS_CC_BEGIN
|
||||
|
@ -263,24 +262,29 @@ Label::Label(FontAtlas *atlas /* = nullptr */, TextHAlignment hAlignment /* = Te
|
|||
setAnchorPoint(Vec2::ANCHOR_MIDDLE);
|
||||
reset();
|
||||
|
||||
auto purgeTextureListener = EventListenerCustom::create(FontAtlas::EVENT_PURGE_TEXTURES, [this](EventCustom* event){
|
||||
auto purgeTextureListener = EventListenerCustom::create(FontAtlas::CMD_PURGE_FONTATLAS, [this](EventCustom* event){
|
||||
if (_fontAtlas && _currentLabelType == LabelType::TTF && event->getUserData() == _fontAtlas)
|
||||
{
|
||||
Node::removeAllChildrenWithCleanup(true);
|
||||
_batchNodes.clear();
|
||||
_batchNodes.push_back(this);
|
||||
|
||||
if (_contentDirty)
|
||||
if (_fontAtlas)
|
||||
{
|
||||
updateContent();
|
||||
}
|
||||
else
|
||||
{
|
||||
alignText();
|
||||
FontAtlasCache::releaseFontAtlas(_fontAtlas);
|
||||
}
|
||||
}
|
||||
});
|
||||
_eventDispatcher->addEventListenerWithSceneGraphPriority(purgeTextureListener, this);
|
||||
|
||||
auto resetTextureListener = EventListenerCustom::create(FontAtlas::CMD_RESET_FONTATLAS, [this](EventCustom* event){
|
||||
if (_fontAtlas && _currentLabelType == LabelType::TTF && event->getUserData() == _fontAtlas)
|
||||
{
|
||||
_fontAtlas = nullptr;
|
||||
this->setTTFConfig(_fontConfig);
|
||||
}
|
||||
});
|
||||
_eventDispatcher->addEventListenerWithSceneGraphPriority(resetTextureListener, this);
|
||||
}
|
||||
|
||||
Label::~Label()
|
||||
|
|
Loading…
Reference in New Issue