Merge pull request #5768 from Dhilan007/develop_label2

Refactor setter of label's font name and font size.
This commit is contained in:
James Chen 2014-03-13 21:14:36 +08:00
commit 8743b00d9f
3 changed files with 148 additions and 140 deletions

View File

@ -46,7 +46,7 @@ FontAtlas * FontAtlasCache::getFontAtlasTTF(const TTFConfig & config)
int fontSize = config.fontSize;
if (useDistanceField)
{
fontSize = Label::DefultFontSize;
fontSize = Label::DistanceFieldFontSize;
}
std::string atlasName = generateFontName(config.fontFilePath, fontSize, GlyphCollection::DYNAMIC, useDistanceField);

View File

@ -36,7 +36,7 @@
NS_CC_BEGIN
const int Label::DefultFontSize = 50;
const int Label::DistanceFieldFontSize = 50;
Label* Label::create()
{
@ -208,15 +208,15 @@ bool Label::setCharMap(const std::string& plistFile)
FontAtlas *newAtlas = FontAtlasCache::getFontAtlasCharMap(plistFile);
if (!newAtlas)
return false;
if (initWithFontAtlas(newAtlas))
{
_currentLabelType = LabelType::CHARMAP;
return true;
reset();
return false;
}
return false;
setFontAtlas(newAtlas);
_currentLabelType = LabelType::CHARMAP;
return true;
}
bool Label::setCharMap(Texture2D* texture, int itemWidth, int itemHeight, int startCharMap)
@ -224,15 +224,15 @@ bool Label::setCharMap(Texture2D* texture, int itemWidth, int itemHeight, int st
FontAtlas *newAtlas = FontAtlasCache::getFontAtlasCharMap(texture,itemWidth,itemHeight,startCharMap);
if (!newAtlas)
return false;
if (initWithFontAtlas(newAtlas))
{
_currentLabelType = LabelType::CHARMAP;
return true;
reset();
return false;
}
return false;
setFontAtlas(newAtlas);
_currentLabelType = LabelType::CHARMAP;
return true;
}
bool Label::setCharMap(const std::string& charMapFile, int itemWidth, int itemHeight, int startCharMap)
@ -240,15 +240,15 @@ bool Label::setCharMap(const std::string& charMapFile, int itemWidth, int itemHe
FontAtlas *newAtlas = FontAtlasCache::getFontAtlasCharMap(charMapFile,itemWidth,itemHeight,startCharMap);
if (!newAtlas)
return false;
if (initWithFontAtlas(newAtlas))
{
_currentLabelType = LabelType::CHARMAP;
return true;
reset();
return false;
}
return false;
setFontAtlas(newAtlas);
_currentLabelType = LabelType::CHARMAP;
return true;
}
Label::Label(FontAtlas *atlas /* = nullptr */, TextHAlignment hAlignment /* = TextHAlignment::LEFT */,
@ -274,17 +274,10 @@ Label::Label(FontAtlas *atlas /* = nullptr */, TextHAlignment hAlignment /* = Te
, _currNumLines(-1)
, _textSprite(nullptr)
, _contentDirty(false)
, _currentLabelType(LabelType::STRING_TEXTURE)
, _currLabelEffect(LabelEffect::NORMAL)
, _shadowBlurRadius(0)
{
_cascadeColorEnabled = true;
_batchNodes.push_back(this);
_fontDefinition._fontName = "Helvetica";
_fontDefinition._fontSize = 12;
_fontDefinition._alignment = TextHAlignment::LEFT;
_fontDefinition._vertAlignment = TextVAlignment::TOP;
reset();
}
Label::~Label()
@ -301,28 +294,40 @@ Label::~Label()
CC_SAFE_RELEASE_NULL(_reusedLetter);
}
bool Label::init()
void Label::reset()
{
bool ret = true;
if(_fontAtlas)
{
ret = SpriteBatchNode::initWithTexture(_fontAtlas->getTexture(0), 30);
if (_reusedLetter == nullptr)
{
_reusedLetter = Sprite::createWithTexture(_fontAtlas->getTexture(0));
_reusedLetter->setOpacityModifyRGB(_isOpacityModifyRGB);
_reusedLetter->retain();
_reusedLetter->setAnchorPoint(Point::ANCHOR_TOP_LEFT);
_reusedLetter->setBatchNode(this);
}
}
_currLabelEffect = LabelEffect::NORMAL;
initProgram();
TTFConfig temp;
_fontConfig = temp;
return ret;
_fontDefinition._fontName = "Helvetica";
_fontDefinition._fontSize = 12;
_fontDefinition._alignment = _hAlignment;
_fontDefinition._vertAlignment = _vAlignment;
_fontDirty = false;
_fontName = "Helvetica";
_fontSize = 12;
_batchNodes.clear();
_batchNodes.push_back(this);
if (_fontAtlas)
{
FontAtlasCache::releaseFontAtlas(_fontAtlas);
_fontAtlas = nullptr;
}
_currentLabelType = LabelType::STRING_TEXTURE;
_currLabelEffect = LabelEffect::NORMAL;
_shadowBlurRadius = 0;
Node::removeAllChildrenWithCleanup(true);
_textSprite = nullptr;
CC_SAFE_RELEASE_NULL(_reusedLetter);
}
void Label::initProgram()
void Label::updateShaderProgram()
{
switch (_currLabelEffect)
{
@ -349,32 +354,33 @@ void Label::initProgram()
_uniformEffectColor = glGetUniformLocation(_shaderProgram->getProgram(), "v_effectColor");
}
bool Label::initWithFontAtlas(FontAtlas* atlas,bool distanceFieldEnabled /* = false */, bool useA8Shader /* = false */)
void Label::setFontAtlas(FontAtlas* atlas,bool distanceFieldEnabled /* = false */, bool useA8Shader /* = false */)
{
FontAtlas *oldAtlas = _fontAtlas;
bool oldDistanceFieldEnable = _useDistanceField;
bool oldA8ShaderEnabel = _useA8Shader;
if (atlas == _fontAtlas)
{
FontAtlasCache::releaseFontAtlas(atlas);
return;
}
if (_fontAtlas)
{
FontAtlasCache::releaseFontAtlas(_fontAtlas);
_fontAtlas = nullptr;
}
_fontAtlas = atlas;
_useDistanceField = distanceFieldEnabled;
_useA8Shader = useA8Shader;
bool ret = Label::init();
if (oldAtlas)
SpriteBatchNode::initWithTexture(_fontAtlas->getTexture(0), 30);
if (_reusedLetter == nullptr)
{
if (ret)
{
FontAtlasCache::releaseFontAtlas(oldAtlas);
}
else
{
_fontAtlas = oldAtlas;
_useDistanceField = oldDistanceFieldEnable;
_useA8Shader = oldA8ShaderEnabel;
Label::init();
FontAtlasCache::releaseFontAtlas(atlas);
}
_reusedLetter = Sprite::createWithTexture(_fontAtlas->getTexture(0));
_reusedLetter->setOpacityModifyRGB(_isOpacityModifyRGB);
_reusedLetter->retain();
_reusedLetter->setAnchorPoint(Point::ANCHOR_TOP_LEFT);
_reusedLetter->setBatchNode(this);
}
else
{
_reusedLetter->setTexture(_fontAtlas->getTexture(0));
}
if (_fontAtlas)
@ -382,8 +388,10 @@ bool Label::initWithFontAtlas(FontAtlas* atlas,bool distanceFieldEnabled /* = fa
_commonLineHeight = _fontAtlas->getCommonLineHeight();
_contentDirty = true;
}
return ret;
_useDistanceField = distanceFieldEnabled;
_useA8Shader = useA8Shader;
_currLabelEffect = LabelEffect::NORMAL;
updateShaderProgram();
}
bool Label::setTTFConfig(const TTFConfig& ttfConfig)
@ -391,30 +399,30 @@ bool Label::setTTFConfig(const TTFConfig& ttfConfig)
FontAtlas *newAtlas = FontAtlasCache::getFontAtlasTTF(ttfConfig);
if (!newAtlas)
{
reset();
return false;
}
if (initWithFontAtlas(newAtlas,ttfConfig.distanceFieldEnabled,true))
_fontConfig = ttfConfig;
if (_fontConfig.outlineSize > 0)
{
_fontConfig = ttfConfig;
if (ttfConfig.outlineSize > 0)
{
_fontConfig.distanceFieldEnabled = false;
_useDistanceField = false;
_useA8Shader = false;
_currLabelEffect = LabelEffect::OUTLINE;
initProgram();
}
else if(ttfConfig.distanceFieldEnabled)
{
this->setFontScale(1.0f * ttfConfig.fontSize / DefultFontSize);
}
_currentLabelType = LabelType::TTF;
return true;
_fontConfig.distanceFieldEnabled = false;
_useDistanceField = false;
_useA8Shader = false;
_currLabelEffect = LabelEffect::OUTLINE;
updateShaderProgram();
}
else
else if(ttfConfig.distanceFieldEnabled)
{
return false;
this->setFontScale(1.0f * ttfConfig.fontSize / DistanceFieldFontSize);
}
setFontAtlas(newAtlas,ttfConfig.distanceFieldEnabled,true);
_currentLabelType = LabelType::TTF;
return true;
}
bool Label::setBMFontFilePath(const std::string& bmfontFilePath, const Point& imageOffset /* = Point::ZERO */)
@ -422,21 +430,23 @@ bool Label::setBMFontFilePath(const std::string& bmfontFilePath, const Point& im
FontAtlas *newAtlas = FontAtlasCache::getFontAtlasFNT(bmfontFilePath,imageOffset);
if (!newAtlas)
return false;
if (initWithFontAtlas(newAtlas))
{
_currentLabelType = LabelType::BMFONT;
return true;
reset();
return false;
}
return false;
setFontAtlas(newAtlas);
_currentLabelType = LabelType::BMFONT;
return true;
}
void Label::setFontDefinition(const FontDefinition& textDefinition)
{
reset();
_fontDefinition = textDefinition;
_currentLabelType = LabelType::STRING_TEXTURE;
_fontName = textDefinition._fontName;
_fontSize = textDefinition._fontSize;
_contentDirty = true;
}
@ -744,7 +754,7 @@ void Label::enableGlow(const Color3B& glowColor)
return;
_currLabelEffect = LabelEffect::GLOW;
_effectColor = glowColor;
initProgram();
updateShaderProgram();
}
void Label::enableOutline(const Color4B& outlineColor,int outlineSize /* = 1 */)
@ -760,7 +770,7 @@ void Label::enableOutline(const Color4B& outlineColor,int outlineSize /* = 1 */)
auto config = _fontConfig;
config.outlineSize = outlineSize;
setTTFConfig(config);
initProgram();
updateShaderProgram();
}
}
_fontDefinition._stroke._strokeEnabled = true;
@ -797,7 +807,7 @@ void Label::disableEffect()
setTTFConfig(_fontConfig);
}
_currLabelEffect = LabelEffect::NORMAL;
initProgram();
updateShaderProgram();
_contentDirty = true;
}
@ -940,12 +950,30 @@ void Label::updateContent()
_contentDirty = false;
}
void Label::updateFont()
{
if (_fontName.find('.') != _fontName.npos)
{
_fontConfig.fontFilePath = _fontName;
_fontConfig.fontSize = _fontSize;
setTTFConfig(_fontConfig);
}
_fontDefinition._fontName = _fontName;
_fontDefinition._fontSize = _fontSize;
_contentDirty = true;
_fontDirty = false;
}
void Label::visit(Renderer *renderer, const kmMat4 &parentTransform, bool parentTransformUpdated)
{
if (! _visible || _originalUTF8String.empty())
{
return;
}
if (_fontDirty)
{
updateFont();
}
if (_contentDirty)
{
updateContent();
@ -987,19 +1015,10 @@ void Label::visit(Renderer *renderer, const kmMat4 &parentTransform, bool parent
void Label::setFontName(const std::string& fontName)
{
if (fontName.find('.') != fontName.npos)
if (fontName != _fontName)
{
auto config = _fontConfig;
config.fontFilePath = fontName;
if (setTTFConfig(config))
{
return;
}
}
if (_fontDefinition._fontName != fontName)
{
_fontDefinition._fontName = fontName;
_contentDirty = true;
_fontName = fontName;
_fontDirty = true;
}
}
@ -1016,29 +1035,10 @@ const std::string& Label::getFontName() const
void Label::setFontSize(int fontSize)
{
if (_currentLabelType == LabelType::TTF)
if (_fontSize != fontSize)
{
if (_fontConfig.fontSize == fontSize)
{
return;
}
if (_fontConfig.distanceFieldEnabled)
{
_fontConfig.fontSize = fontSize;
this->setFontScale(1.0f * fontSize / DefultFontSize);
}
else
{
auto fontConfig = _fontConfig;
fontConfig.fontSize = fontSize;
setTTFConfig(fontConfig);
}
}
else if(_fontDefinition._fontSize != fontSize)
{
_fontDefinition._fontSize = fontSize;
_fontConfig.fontSize = fontSize;
_contentDirty = true;
_fontSize = fontSize;
_fontDirty = true;
}
}
@ -1204,6 +1204,10 @@ std::string Label::getDescription() const
const Size& Label::getContentSize() const
{
if (_fontDirty)
{
const_cast<Label*>(this)->updateFont();
}
if (_contentDirty)
{
const_cast<Label*>(this)->updateContent();

View File

@ -59,7 +59,7 @@ typedef struct _ttfConfig
bool distanceFieldEnabled;
int outlineSize;
_ttfConfig(const char* filePath = "",int size = 36, const GlyphCollection& glyphCollection = GlyphCollection::DYNAMIC,
_ttfConfig(const char* filePath = "",int size = 12, const GlyphCollection& glyphCollection = GlyphCollection::DYNAMIC,
const char *customGlyphCollection = nullptr,bool useDistanceField = false,int outline = 0)
:fontFilePath(filePath)
,fontSize(size)
@ -78,7 +78,7 @@ typedef struct _ttfConfig
class CC_DLL Label : public SpriteBatchNode, public LabelProtocol
{
public:
static const int DefultFontSize;
static const int DistanceFieldFontSize;
static Label* create();
@ -259,15 +259,13 @@ protected:
*/
virtual ~Label();
virtual bool initWithFontAtlas(FontAtlas* atlas,bool distanceFieldEnabled = false, bool useA8Shader = false);
virtual void setFontAtlas(FontAtlas* atlas,bool distanceFieldEnabled = false, bool useA8Shader = false);
bool recordLetterInfo(const cocos2d::Point& point,const FontLetterDefinition& letterDef, int spriteIndex);
bool recordPlaceholderInfo(int spriteIndex);
void setFontScale(float fontScale);
virtual bool init();
virtual void alignText();
bool computeHorizontalKernings(unsigned short int *stringToRender);
@ -279,14 +277,20 @@ protected:
virtual void updateColor() override;
virtual void initProgram();
virtual void updateShaderProgram();
void drawShadowWithoutBlur();
void createSpriteWithFontDefinition();
void updateFont();
void reset();
bool _isOpacityModifyRGB;
bool _contentDirty;
bool _fontDirty;
std::string _fontName;
int _fontSize;
LabelType _currentLabelType;
std::vector<SpriteBatchNode*> _batchNodes;