diff --git a/cocos2d_libs.xcodeproj/project.pbxproj.REMOVED.git-id b/cocos2d_libs.xcodeproj/project.pbxproj.REMOVED.git-id index 5cd8509e95..53fbd66a5e 100644 --- a/cocos2d_libs.xcodeproj/project.pbxproj.REMOVED.git-id +++ b/cocos2d_libs.xcodeproj/project.pbxproj.REMOVED.git-id @@ -1 +1 @@ -e4abb5d1cb9dde319461fc8f0b800afe6490b185 \ No newline at end of file +f1f3f9509d1a7df5298606d8c099c5d3d85d4ff5 \ No newline at end of file diff --git a/cocos2dx/include/cocos2d.h b/cocos2dx/include/cocos2d.h index 96a6c88f51..01e5739d96 100755 --- a/cocos2dx/include/cocos2d.h +++ b/cocos2dx/include/cocos2d.h @@ -99,7 +99,7 @@ THE SOFTWARE. #include "label_nodes/CCLabelAtlas.h" #include "label_nodes/CCLabelTTF.h" #include "label_nodes/CCLabelBMFont.h" -#include "label_nodes/CCStringTTF.h" +#include "label_nodes/CCLabel.h" // layers_scenes_transitions_nodes #include "layers_scenes_transitions_nodes/CCLayer.h" diff --git a/cocos2dx/label_nodes/CCFontAtlasFactory.h b/cocos2dx/label_nodes/CCFontAtlasFactory.h index 6c967103d5..bbf2027516 100644 --- a/cocos2dx/label_nodes/CCFontAtlasFactory.h +++ b/cocos2dx/label_nodes/CCFontAtlasFactory.h @@ -28,6 +28,7 @@ #include "cocos2d.h" #include "CCFontAtlas.h" + NS_CC_BEGIN class CC_DLL FontAtlasFactory diff --git a/cocos2dx/label_nodes/CCFontDefinition.cpp b/cocos2dx/label_nodes/CCFontDefinition.cpp index 10068666a0..800b5c3b83 100644 --- a/cocos2dx/label_nodes/CCFontDefinition.cpp +++ b/cocos2dx/label_nodes/CCFontDefinition.cpp @@ -23,6 +23,7 @@ ****************************************************************************/ #include "cocos2d.h" +#include "CCFontDefinition.h" NS_CC_BEGIN diff --git a/cocos2dx/label_nodes/CCFontFNT.cpp b/cocos2dx/label_nodes/CCFontFNT.cpp index 1700b30da0..f980656d2b 100644 --- a/cocos2dx/label_nodes/CCFontFNT.cpp +++ b/cocos2dx/label_nodes/CCFontFNT.cpp @@ -7,6 +7,7 @@ // #include "CCFontFNT.h" +#include "CCFontAtlas.h" NS_CC_BEGIN diff --git a/cocos2dx/label_nodes/CCFontFreeType.cpp b/cocos2dx/label_nodes/CCFontFreeType.cpp index 4b713b2eb5..4cfb78f295 100644 --- a/cocos2dx/label_nodes/CCFontFreeType.cpp +++ b/cocos2dx/label_nodes/CCFontFreeType.cpp @@ -28,6 +28,7 @@ #include "CCFontFreeType.h" #include "CCTextImage.h" #include "CCFont.h" +#include "CCFontDefinition.h" NS_CC_BEGIN diff --git a/cocos2dx/label_nodes/CCLabel.cpp b/cocos2dx/label_nodes/CCLabel.cpp index 02439be8d4..4bb84133cd 100644 --- a/cocos2dx/label_nodes/CCLabel.cpp +++ b/cocos2dx/label_nodes/CCLabel.cpp @@ -23,39 +23,43 @@ ****************************************************************************/ #include "CCLabel.h" -#include "CCStringTTF.h" #include "CCFontDefinition.h" #include "CCFontCache.h" #include "CCFontAtlasCache.h" +#include "CCLabelTextFormatter.h" NS_CC_BEGIN Label* Label::createWithTTF( const char* label, const char* tttFilePath, int fontSize, GlyphCollection glyphs, int lineSize, const char *customGlyphs ) { + FontAtlas *tempAtlas = FontAtlasCache::getFontAtlasTTF(tttFilePath, fontSize, glyphs, customGlyphs); if (!tempAtlas) return nullptr; - + // create the actual label - StringTTF* templabel = StringTTF::create(tempAtlas, TextHAlignment::CENTER, lineSize); + Label* templabel = Label::create(tempAtlas, TextHAlignment::CENTER, lineSize); if (templabel) { templabel->setText(label, lineSize, TextHAlignment::CENTER, false); return templabel; } - + return nullptr; + + return 0; } Label* Label::createWithBMFont( const char* label, const char* bmfontFilePath, int lineSize) { + FontAtlas *tempAtlas = FontAtlasCache::getFontAtlasFNT(bmfontFilePath); - + if (!tempAtlas) return 0; - StringTTF* templabel = StringTTF::create(tempAtlas, TextHAlignment::CENTER, lineSize); + Label* templabel = Label::create(tempAtlas, TextHAlignment::CENTER, lineSize); if (templabel) { @@ -66,14 +70,640 @@ Label* Label::createWithBMFont( const char* label, const char* bmfontFilePath, i { return 0; } + + return 0; } -Label::Label() +Label* Label::create(FontAtlas *pAtlas, TextHAlignment alignment, int lineSize) +{ + Label *ret = new Label(pAtlas, alignment); + + if (!ret) + return 0; + + if( ret->init() ) + { + ret->autorelease(); + return ret; + } + else + { + delete ret; + return 0; + } + + return ret; +} + +Label::Label(FontAtlas *pAtlas, TextHAlignment alignment): _currentUTF8String(0), +_originalUTF8String(0), +_fontAtlas(pAtlas), +_alignment(alignment), +_lineBreakWithoutSpaces(false), +_advances(0), +_displayedColor(Color3B::WHITE), +_realColor(Color3B::WHITE), +_cascadeColorEnabled(true) { } Label::~Label() { + if (_currentUTF8String) + delete [] _currentUTF8String; + + if (_advances) + delete [] _advances; + + if (_fontAtlas) + FontAtlasCache::releaseFontAtlas(_fontAtlas); } +bool Label::init() +{ + return true; +} + +void Label::setString(const char *stringToRender) +{ + setText(stringToRender, 0, TextHAlignment::CENTER, false); +} + +bool Label::setText(const char *stringToRender, float lineWidth, TextHAlignment alignment, bool lineBreakWithoutSpaces) +{ + if (!_fontAtlas) + return false; + + _width = lineWidth; + _alignment = alignment; + _lineBreakWithoutSpaces = lineBreakWithoutSpaces; + + // release all the sprites + moveAllSpritesToCache(); + + // store locally common line height + _commonLineHeight = _fontAtlas->getCommonLineHeight(); + if (_commonLineHeight <= 0) + return false; + + int numLetter = 0; + unsigned short* utf16String = cc_utf8_to_utf16(stringToRender); + if(!utf16String) + return false; + + numLetter = cc_wcslen(utf16String); + SpriteBatchNode::initWithTexture(&_fontAtlas->getTexture(0), numLetter); + _cascadeColorEnabled = true; + + // + setCurrentString(utf16String); + setOriginalString(utf16String); + + // align text + alignText(); + + // done here + return true; +} + +void Label::setAlignment(TextHAlignment alignment) +{ + // store the new alignment + if (alignment != _alignment) + { + // store + _alignment = alignment; + + // reset the string + resetCurrentString(); + + // need to align text again + alignText(); + } +} + +void Label::setWidth(float width) +{ + if (width != _width) + { + // store + _width = width; + + // need to align text again + alignText(); + } +} + +void Label::setLineBreakWithoutSpace(bool breakWithoutSpace) +{ + if (breakWithoutSpace != _lineBreakWithoutSpaces) + { + // store + _lineBreakWithoutSpaces = breakWithoutSpace; + + // need to align text again + alignText(); + } +} + +void Label::setScale(float scale) +{ + Node::setScale(scale); + alignText(); +} + +void Label::setScaleX(float scaleX) +{ + Node::setScaleX(scaleX); + alignText(); +} + +void Label::setScaleY(float scaleY) +{ + Node::setScaleY(scaleY); + alignText(); +} + +void Label::alignText() +{ + hideAllLetters(); + LabelTextFormatter::createStringSprites(this); + + if( LabelTextFormatter::multilineText(this) ) + { + hideAllLetters(); + LabelTextFormatter::createStringSprites(this); + } + + LabelTextFormatter::alignText(this); +} + +void Label::hideAllLetters() +{ + Object* Obj = NULL; + CCARRAY_FOREACH(&_spriteArray, Obj) + { + ((Sprite *)Obj)->setVisible(false); + } + + CCARRAY_FOREACH(&_spriteArrayCache, Obj) + { + ((Sprite *)Obj)->setVisible(false); + } +} + +bool Label::computeAdvancesForString(unsigned short int *stringToRender) +{ + if (_advances) + { + delete [] _advances; + _advances = 0; + } + + Font &theFont = _fontAtlas->getFont(); + + int letterCount = 0; + _advances = theFont.getAdvancesForTextUTF16(stringToRender, letterCount); + + if(!_advances) + return false; + else + return true; +} + +bool Label::setOriginalString(unsigned short *stringToSet) +{ + if (_originalUTF8String) + { + delete [] _originalUTF8String; + _originalUTF8String = 0; + } + + int newStringLenght = cc_wcslen(stringToSet); + _originalUTF8String = new unsigned short int [newStringLenght + 1]; + memset(_originalUTF8String, 0, (newStringLenght + 1) * 2); + memcpy(_originalUTF8String, stringToSet, (newStringLenght * 2)); + _originalUTF8String[newStringLenght] = 0; + + return true; +} + +bool Label::setCurrentString(unsigned short *stringToSet) +{ + // set the new string + if (_currentUTF8String) + { + delete [] _currentUTF8String; + _currentUTF8String = 0; + } + // + _currentUTF8String = stringToSet; + // compute the advances + return computeAdvancesForString(stringToSet); +} + +void Label::resetCurrentString() +{ + // set the new string + if (_currentUTF8String) + { + delete [] _currentUTF8String; + _currentUTF8String = 0; + } + + int stringLenght = cc_wcslen(_originalUTF8String); + _currentUTF8String = new unsigned short int [stringLenght + 1]; + memcpy(_currentUTF8String, _originalUTF8String, stringLenght * 2); + _currentUTF8String[stringLenght] = 0; + +} + +Sprite * Label::createNewSpriteFromLetterDefinition(FontLetterDefinition &theDefinition, Texture2D *theTexture) +{ + Rect uvRect; + uvRect.size.height = theDefinition.height; + uvRect.size.width = theDefinition.width; + uvRect.origin.x = theDefinition.U; + uvRect.origin.y = theDefinition.V; + + SpriteFrame *pFrame = SpriteFrame::createWithTexture(theTexture, uvRect); + Sprite *tempSprite = getSprite(); + + if (!tempSprite) + return 0; + + tempSprite->initWithSpriteFrame(pFrame); + tempSprite->setAnchorPoint(Point(theDefinition.anchorX, theDefinition.anchorY)); + tempSprite->setBatchNode(this); + + return tempSprite; +} + +Sprite * Label::updateSpriteWithLetterDefinition(Sprite *spriteToUpdate, FontLetterDefinition &theDefinition, Texture2D *theTexture) +{ + if (!spriteToUpdate) + { + return 0; + } + else + { + Rect uvRect; + uvRect.size.height = theDefinition.height; + uvRect.size.width = theDefinition.width; + uvRect.origin.x = theDefinition.U; + uvRect.origin.y = theDefinition.V; + + SpriteFrame *frame = SpriteFrame::createWithTexture(theTexture, uvRect); + if (frame) + { + spriteToUpdate->setTexture(theTexture); + spriteToUpdate->setDisplayFrame(frame); + spriteToUpdate->setAnchorPoint(Point(theDefinition.anchorX, theDefinition.anchorY)); + spriteToUpdate->setBatchNode(this); + } + + return spriteToUpdate; + } +} + +Sprite * Label::getSpriteForLetter(unsigned short int newLetter) +{ + if (!_fontAtlas) + return 0; + + FontLetterDefinition tempDefinition; + bool validDefinition = _fontAtlas->getLetterDefinitionForChar(newLetter, tempDefinition); + if (validDefinition) + { + Sprite *newSprite = createNewSpriteFromLetterDefinition(tempDefinition, &_fontAtlas->getTexture(tempDefinition.textureID) ); + this->addChild(newSprite); + return newSprite; + } + else + { + return 0; + } +} + +Sprite * Label::updateSpriteForLetter(Sprite *spriteToUpdate, unsigned short int newLetter) +{ + if (!spriteToUpdate || !_fontAtlas) + return 0; + else + { + FontLetterDefinition tempDefinition; + bool validDefinition = _fontAtlas->getLetterDefinitionForChar(newLetter, tempDefinition); + if (validDefinition) + { + Sprite *pNewSprite = updateSpriteWithLetterDefinition(spriteToUpdate, tempDefinition, &_fontAtlas->getTexture(tempDefinition.textureID) ); + return pNewSprite; + } + else + { + return 0; + } + } +} + +void Label::moveAllSpritesToCache() +{ + Object* pObj = NULL; + CCARRAY_FOREACH(&_spriteArray, pObj) + { + ((Sprite *)pObj)->removeFromParent(); + _spriteArrayCache.addObject(pObj); + } + + _spriteArray.removeAllObjects(); +} + +Sprite * Label::getSprite() +{ + if (_spriteArrayCache.count()) + { + Sprite *retSprite = (Sprite *) _spriteArrayCache.lastObject(); + _spriteArrayCache.removeLastObject(); + return retSprite; + } + else + { + Sprite *retSprite = new Sprite; + return retSprite; + } +} + +///// PROTOCOL STUFF + +Sprite * Label::getSpriteChild(int ID) +{ + Object* pObj = NULL; + CCARRAY_FOREACH(&_spriteArray, pObj) + { + Sprite *pSprite = (Sprite *)pObj; + if ( pSprite->getTag() == ID) + { + return pSprite; + } + } + return 0; +} + +Array * Label::getChildrenLetters() +{ + return &_spriteArray; +} + +Sprite * Label::getSpriteForChar(unsigned short int theChar, int spriteIndexHint) +{ + // ret sprite + Sprite *retSprite = 0; + + // look for already existing sprites + retSprite = getSpriteChild(spriteIndexHint); + + if (!retSprite) + { + retSprite = getSpriteForLetter(theChar); + if (!retSprite) + return 0; + + if (retSprite) + retSprite->setTag(spriteIndexHint); + + _spriteArray.addObject(retSprite); + } + + // the sprite is now visible + retSprite->setVisible(true); + + // set the right texture letter to the sprite + updateSpriteForLetter(retSprite, theChar); + + // we are done here + return retSprite; +} + +float Label::getLetterPosXLeft( Sprite* sp ) +{ + float scaleX = _scaleX; + return sp->getPosition().x * scaleX - (sp->getContentSize().width * scaleX * sp->getAnchorPoint().x); +} + +float Label::getLetterPosXRight( Sprite* sp ) +{ + float scaleX = _scaleX; + return sp->getPosition().x * scaleX + (sp->getContentSize().width * scaleX * sp->getAnchorPoint().x); +} + +int Label::getCommonLineHeight() +{ + return _commonLineHeight; +} + +int Label::getKerningForCharsPair(unsigned short first, unsigned short second) +{ + return 0; +} + +int Label::getXOffsetForChar(unsigned short c) +{ + FontLetterDefinition tempDefinition; + bool validDefinition = _fontAtlas->getLetterDefinitionForChar(c, tempDefinition); + if (!validDefinition) + return -1; + + return (tempDefinition.offsetX); +} + +int Label::getYOffsetForChar(unsigned short c) +{ + FontLetterDefinition tempDefinition; + bool validDefinition = _fontAtlas->getLetterDefinitionForChar(c, tempDefinition); + if (!validDefinition) + return -1; + + return (tempDefinition.offsetY); +} + +int Label::getAdvanceForChar(unsigned short c, int hintPositionInString) +{ + if (_advances) + { + // not that advance contains the X offset already + FontLetterDefinition tempDefinition; + bool validDefinition = _fontAtlas->getLetterDefinitionForChar(c, tempDefinition); + if (!validDefinition) + return -1; + + return (_advances[hintPositionInString].width - tempDefinition.offsetX); + } + else + { + return -1; + } +} + +Rect Label::getRectForChar(unsigned short c) +{ + return _fontAtlas->getFont().getRectForChar(c); +} + +// string related stuff +int Label::getStringNumLines() +{ + int quantityOfLines = 1; + + unsigned int stringLen = _currentUTF8String ? cc_wcslen(_currentUTF8String) : 0; + if (stringLen == 0) + return (-1); + + // count number of lines + for (unsigned int i = 0; i < stringLen - 1; ++i) + { + unsigned short c = _currentUTF8String[i]; + if (c == '\n') + { + quantityOfLines++; + } + } + + return quantityOfLines; +} + +int Label::getStringLenght() +{ + return _currentUTF8String ? cc_wcslen(_currentUTF8String) : 0; +} + +unsigned short Label::getCharAtStringPosition(int position) +{ + return _currentUTF8String[position]; +} + +unsigned short * Label::getUTF8String() +{ + return _currentUTF8String; +} + +void Label::assignNewUTF8String(unsigned short *newString) +{ + setCurrentString(newString); +} + +TextHAlignment Label::getTextAlignment() +{ + return _alignment; +} + +// label related stuff +float Label::getMaxLineWidth() +{ + return _width; +} + +bool Label::breakLineWithoutSpace() +{ + return _lineBreakWithoutSpaces; +} + +Size Label::getLabelContentSize() +{ + return getContentSize(); +} + +void Label::setLabelContentSize(const Size &newSize) +{ + setContentSize(newSize); +} + + +// RGBA protocol + + +bool Label::isOpacityModifyRGB() const +{ + return false; +} + +void Label::setOpacityModifyRGB(bool isOpacityModifyRGB) +{ +} + +unsigned char Label::getOpacity() const +{ + return 0; +} + +unsigned char Label::getDisplayedOpacity() const +{ + return 0; +} + +void Label::setOpacity(GLubyte opacity) +{ +} +void Label::updateDisplayedOpacity(GLubyte parentOpacity) +{ +} + +bool Label::isCascadeOpacityEnabled() const +{ + return false; +} + +void Label::setCascadeOpacityEnabled(bool cascadeOpacityEnabled) +{ +} + +const Color3B& Label::getColor(void) const +{ + return _realColor; +} + +const Color3B& Label::getDisplayedColor() const +{ + return _displayedColor; +} + +void Label::setColor(const Color3B& color) +{ + _displayedColor = _realColor = color; + + if( _cascadeColorEnabled ) + { + Color3B parentColor = Color3B::WHITE; + RGBAProtocol* pParent = dynamic_cast(_parent); + + if (pParent && pParent->isCascadeColorEnabled()) + parentColor = pParent->getDisplayedColor(); + + updateDisplayedColor(parentColor); + } +} + +void Label::updateDisplayedColor(const Color3B& parentColor) +{ + _displayedColor.r = _realColor.r * parentColor.r/255.0; + _displayedColor.g = _realColor.g * parentColor.g/255.0; + _displayedColor.b = _realColor.b * parentColor.b/255.0; + + Object* pObj; + CCARRAY_FOREACH(_children, pObj) + { + Sprite *item = static_cast( pObj ); + item->updateDisplayedColor(_displayedColor); + } +} + +bool Label::isCascadeColorEnabled() const +{ + return false; +} + +void Label::setCascadeColorEnabled(bool cascadeColorEnabled) +{ + _cascadeColorEnabled = cascadeColorEnabled; +} + + NS_CC_END \ No newline at end of file diff --git a/cocos2dx/label_nodes/CCLabel.h b/cocos2dx/label_nodes/CCLabel.h index c4dd99759a..91565024e9 100644 --- a/cocos2dx/label_nodes/CCLabel.h +++ b/cocos2dx/label_nodes/CCLabel.h @@ -27,6 +27,8 @@ #define _COCOS2D_CCLABEL_H_ #include "sprite_nodes/CCSpriteBatchNode.h" +#include "CCLabelTextFormatProtocol.h" +#include "ccTypes.h" NS_CC_BEGIN @@ -39,28 +41,120 @@ enum class GlyphCollection { }; -class CC_DLL Label : public SpriteBatchNode, public LabelProtocol, public RGBAProtocol +//fwd +class FontLetterDefinition; +class FontAtlas; + + + +class CC_DLL Label : public SpriteBatchNode, public LabelProtocol, public RGBAProtocol, public LabelTextFormatProtocol { public: static Label* createWithTTF( const char* label, const char* tttFilePath, int fontSize, GlyphCollection glyphs = GlyphCollection::NEHE, int lineSize = 0, const char *customGlyphs = 0 ); static Label* createWithBMFont( const char* label, const char* bmfontFilePath, int lineSize = 0 ); - virtual ~Label(); - Label(); + Label(FontAtlas *pAtlas, TextHAlignment alignment); + ~Label(); + + bool setText(const char *stringToRender, float lineWidth, TextHAlignment alignment = TextHAlignment::LEFT, bool lineBreakWithoutSpaces = false); + void setString(const char *stringToRender); + + virtual void setAlignment(TextHAlignment alignment); + virtual void setWidth(float width); + virtual void setLineBreakWithoutSpace(bool breakWithoutSpace); + virtual void setScale(float scale); + virtual void setScaleX(float scaleX); + virtual void setScaleY(float scaleY); + + // carloX + const char * getString() const { return "not implemented"; } + + // RGBAProtocol + virtual bool isOpacityModifyRGB() const; + virtual void setOpacityModifyRGB(bool isOpacityModifyRGB); + virtual void setOpacity(GLubyte opacity); + virtual void updateDisplayedOpacity(GLubyte parentOpacity); + virtual bool isCascadeOpacityEnabled() const; + virtual void setCascadeOpacityEnabled(bool cascadeOpacityEnabled); + virtual void setColor(const Color3B& color); + virtual void updateDisplayedColor(const Color3B& parentColor); + virtual bool isCascadeColorEnabled() const; + virtual void setCascadeColorEnabled(bool cascadeColorEnabled); + virtual const Color3B& getColor(void) const; + virtual const Color3B& getDisplayedColor() const; + virtual unsigned char getOpacity() const; + virtual unsigned char getDisplayedOpacity() const; + + // CCLabelTextFormat protocol implementation + virtual Sprite * getSpriteChild(int ID); + virtual Array * getChildrenLetters(); + virtual Sprite * getSpriteForChar(unsigned short int theChar, int spriteIndexHint); + virtual float getLetterPosXLeft( Sprite* sp ); + virtual float getLetterPosXRight( Sprite* sp ); + + // font related stuff + virtual int getCommonLineHeight(); + virtual int getKerningForCharsPair(unsigned short first, unsigned short second); + virtual int getXOffsetForChar(unsigned short c); + virtual int getYOffsetForChar(unsigned short c); + virtual int getAdvanceForChar(unsigned short c, int hintPositionInString); + virtual Rect getRectForChar(unsigned short c) ; + + // string related stuff + virtual int getStringNumLines(); + virtual int getStringLenght(); + virtual unsigned short getCharAtStringPosition(int position); + virtual unsigned short * getUTF8String(); + virtual void assignNewUTF8String(unsigned short *newString); + virtual TextHAlignment getTextAlignment(); + + // label related stuff + virtual float getMaxLineWidth() ; + virtual bool breakLineWithoutSpace(); + virtual Size getLabelContentSize(); + virtual void setLabelContentSize(const Size &newSize); - virtual void setAlignment(TextHAlignment alignment) = 0; - virtual void setWidth(float width) = 0; - virtual void setLineBreakWithoutSpace(bool breakWithoutSpace) = 0; - virtual void setScale(float scale) = 0; - virtual void setScaleX(float scaleX) = 0; - virtual void setScaleY(float scaleY) = 0; private: + static Label* create(FontAtlas *pAtlas, TextHAlignment alignment = TextHAlignment::LEFT, int lineSize = 0); + + bool init(); + + void alignText(); + void hideAllLetters(); + void moveAllSpritesToCache(); + + bool computeAdvancesForString(unsigned short int *stringToRender); + bool setCurrentString(unsigned short *stringToSet); + bool setOriginalString(unsigned short *stringToSet); + void resetCurrentString(); + + Sprite * getSprite(); + Sprite * createNewSpriteFromLetterDefinition(FontLetterDefinition &theDefinition, Texture2D *theTexture); + Sprite * updateSpriteWithLetterDefinition(Sprite *spriteToUpdate, FontLetterDefinition &theDefinition, Texture2D *theTexture); + Sprite * getSpriteForLetter(unsigned short int newLetter); + Sprite * updateSpriteForLetter(Sprite *spriteToUpdate, unsigned short int newLetter); + + Array _spriteArray; + Array _spriteArrayCache; + float _commonLineHeight; + bool _lineBreakWithoutSpaces; + float _width; + TextHAlignment _alignment; + unsigned short int * _currentUTF8String; + unsigned short int * _originalUTF8String; + Size * _advances; + FontAtlas * _fontAtlas; + Color3B _displayedColor; + Color3B _realColor; + bool _cascadeColorEnabled; + }; + NS_CC_END #endif /*__COCOS2D_CCLABEL_H */ diff --git a/cocos2dx/label_nodes/CCStringBMFont.cpp b/cocos2dx/label_nodes/CCStringBMFont.cpp deleted file mode 100644 index 3b549a3b57..0000000000 --- a/cocos2dx/label_nodes/CCStringBMFont.cpp +++ /dev/null @@ -1,733 +0,0 @@ -/**************************************************************************** -Copyright (c) 2010-2012 cocos2d-x.org -Copyright (c) 2008-2010 Ricardo Quesada -Copyright (c) 2011 Zynga Inc. - -http://www.cocos2d-x.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -Use any of these editors to generate BMFonts: -http://glyphdesigner.71squared.com/ (Commercial, Mac OS X) -http://www.n4te.com/hiero/hiero.jnlp (Free, Java) -http://slick.cokeandcode.com/demos/hiero.jnlp (Free, Java) -http://www.angelcode.com/products/bmfont/ (Free, Windows only) - -****************************************************************************/ -#include "CCStringBMFont.h" -#include "cocoa/CCString.h" -#include "cocoa/CCDictionary.h" -#include "CCConfiguration.h" -#include "CCLabelTextFormatter.h" -#include "draw_nodes/CCDrawingPrimitives.h" -#include "sprite_nodes/CCSprite.h" -//#include "support/CCPointExtension.h" -#include "platform/CCFileUtils.h" -#include "CCDirector.h" -#include "textures/CCTextureCache.h" -#include "support/ccUTF8.h" - -using namespace std; - -NS_CC_BEGIN - - -// The return value needs to be deleted by CC_SAFE_DELETE_ARRAY. -static unsigned short* copyUTF16StringNN(unsigned short* str) -{ - int length = str ? cc_wcslen(str) : 0; - unsigned short* ret = new unsigned short[length+1]; - for (int i = 0; i < length; ++i) { - ret[i] = str[i]; - } - ret[length] = 0; - return ret; -} - -// -//CCLabelBMFont -// - -//LabelBMFont - Purge Cache -void StringBMFont::purgeCachedData() -{ - FNTConfigRemoveCache(); -} - -StringBMFont * StringBMFont::create() -{ - StringBMFont * pRet = new StringBMFont(); - if (pRet && pRet->init()) - { - pRet->autorelease(); - return pRet; - } - CC_SAFE_DELETE(pRet); - return NULL; -} - -StringBMFont * StringBMFont::create(const char *str, const char *fntFile, float width, TextHAlignment alignment) -{ - return StringBMFont::create(str, fntFile, width, alignment, Point::ZERO); -} - -StringBMFont * StringBMFont::create(const char *str, const char *fntFile, float width) -{ - return StringBMFont::create(str, fntFile, width, TextHAlignment::LEFT, Point::ZERO); -} - -StringBMFont * StringBMFont::create(const char *str, const char *fntFile) -{ - return StringBMFont::create(str, fntFile, kLabelAutomaticWidth, TextHAlignment::LEFT, Point::ZERO); -} - -//LabelBMFont - Creation & Init -StringBMFont *StringBMFont::create(const char *str, const char *fntFile, float width/* = kLabelAutomaticWidth*/, TextHAlignment alignment/* = kTextAlignmentLeft*/, Point imageOffset/* = Point::ZERO*/) -{ - StringBMFont *pRet = new StringBMFont(); - if(pRet && pRet->initWithString(str, fntFile, width, alignment, imageOffset)) - { - pRet->autorelease(); - return pRet; - } - CC_SAFE_DELETE(pRet); - return NULL; -} - -bool StringBMFont::init() -{ - return initWithString(NULL, NULL, kLabelAutomaticWidth, TextHAlignment::LEFT, Point::ZERO); -} - -bool StringBMFont::initWithString(const char *theString, const char *fntFile, float width/* = kLabelAutomaticWidth*/, TextHAlignment alignment/* = kTextAlignmentLeft*/, Point imageOffset/* = Point::ZERO*/) -{ - CCAssert(!_configuration, "re-init is no longer supported"); - CCAssert( (theString && fntFile) || (theString==NULL && fntFile==NULL), "Invalid params for StringBMFont"); - - Texture2D *texture = NULL; - - if (fntFile) - { - CCBMFontConfiguration *newConf = FNTConfigLoadFile(fntFile); - if (!newConf) - { - CCLOG("cocos2d: WARNING. StringBMFont: Impossible to create font. Please check file: '%s'", fntFile); - release(); - return false; - } - - newConf->retain(); - CC_SAFE_RELEASE(_configuration); - _configuration = newConf; - - _fntFile = fntFile; - - texture = TextureCache::getInstance()->addImage(_configuration->getAtlasName()); - } - else - { - texture = new Texture2D(); - texture->autorelease(); - } - - if (theString == NULL) - { - theString = ""; - } - - if (SpriteBatchNode::initWithTexture(texture, strlen(theString))) - { - _width = width; - _alignment = alignment; - - _displayedOpacity = _realOpacity = 255; - _displayedColor = _realColor = Color3B::WHITE; - _cascadeOpacityEnabled = true; - _cascadeColorEnabled = true; - - _contentSize = Size::ZERO; - - _isOpacityModifyRGB = _textureAtlas->getTexture()->hasPremultipliedAlpha(); - _anchorPoint = Point(0.5f, 0.5f); - - _imageOffset = imageOffset; - - _reusedChar = new Sprite(); - _reusedChar->initWithTexture(_textureAtlas->getTexture(), Rect(0, 0, 0, 0), false); - _reusedChar->setBatchNode(this); - - this->setString(theString); - - return true; - } - return false; -} - -StringBMFont::StringBMFont() -: _string(NULL) -, _initialString(NULL) -, _alignment(TextHAlignment::CENTER) -, _width(-1.0f) -, _configuration(NULL) -, _lineBreakWithoutSpaces(false) -, _imageOffset(Point::ZERO) -, _reusedChar(NULL) -, _displayedOpacity(255) -, _realOpacity(255) -, _displayedColor(Color3B::WHITE) -, _realColor(Color3B::WHITE) -, _cascadeColorEnabled(true) -, _cascadeOpacityEnabled(true) -, _isOpacityModifyRGB(false) -{ - -} - -StringBMFont::~StringBMFont() -{ - CC_SAFE_RELEASE(_reusedChar); - CC_SAFE_DELETE_ARRAY(_string); - CC_SAFE_DELETE_ARRAY(_initialString); - CC_SAFE_RELEASE(_configuration); -} - -// StringBMFont - Atlas generation -int StringBMFont::kerningAmountForFirst(unsigned short first, unsigned short second) -{ - int ret = 0; - unsigned int key = (first<<16) | (second & 0xffff); - - if( _configuration->_kerningDictionary ) { - tKerningHashElement *element = NULL; - HASH_FIND_INT(_configuration->_kerningDictionary, &key, element); - if(element) - ret = element->amount; - } - return ret; -} - -const char* StringBMFont::getString(void) const -{ - return _initialStringUTF8.c_str(); -} - -//StringBMFont - RGBAProtocol protocol -const Color3B& StringBMFont::getColor() const -{ - return _realColor; -} - -const Color3B& StringBMFont::getDisplayedColor() const -{ - return _displayedColor; -} - -void StringBMFont::setColor(const Color3B& color) -{ - _displayedColor = _realColor = color; - - if( _cascadeColorEnabled ) { - Color3B parentColor = Color3B::WHITE; - RGBAProtocol* pParent = dynamic_cast(_parent); - if (pParent && pParent->isCascadeColorEnabled()) - { - parentColor = pParent->getDisplayedColor(); - } - this->updateDisplayedColor(parentColor); - } -} - -GLubyte StringBMFont::getOpacity(void) const -{ - return _realOpacity; -} - -GLubyte StringBMFont::getDisplayedOpacity(void) const -{ - return _displayedOpacity; -} - -/** Override synthesized setOpacity to recurse items */ -void StringBMFont::setOpacity(GLubyte opacity) -{ - _displayedOpacity = _realOpacity = opacity; - - if( _cascadeOpacityEnabled ) { - GLubyte parentOpacity = 255; - RGBAProtocol* pParent = dynamic_cast(_parent); - if (pParent && pParent->isCascadeOpacityEnabled()) - { - parentOpacity = pParent->getDisplayedOpacity(); - } - this->updateDisplayedOpacity(parentOpacity); - } -} - -void StringBMFont::setOpacityModifyRGB(bool var) -{ - _isOpacityModifyRGB = var; - if (_children && _children->count() != 0) - { - Object* child; - CCARRAY_FOREACH(_children, child) - { - Node* pNode = static_cast( child ); - if (pNode) - { - RGBAProtocol *pRGBAProtocol = dynamic_cast(pNode); - if (pRGBAProtocol) - { - pRGBAProtocol->setOpacityModifyRGB(_isOpacityModifyRGB); - } - } - } - } -} -bool StringBMFont::isOpacityModifyRGB() const -{ - return _isOpacityModifyRGB; -} - -void StringBMFont::updateDisplayedOpacity(GLubyte parentOpacity) -{ - _displayedOpacity = _realOpacity * parentOpacity/255.0; - - Object* pObj; - CCARRAY_FOREACH(_children, pObj) - { - Sprite *item = static_cast( pObj ); - item->updateDisplayedOpacity(_displayedOpacity); - } -} - -void StringBMFont::updateDisplayedColor(const Color3B& parentColor) -{ - _displayedColor.r = _realColor.r * parentColor.r/255.0; - _displayedColor.g = _realColor.g * parentColor.g/255.0; - _displayedColor.b = _realColor.b * parentColor.b/255.0; - - Object* pObj; - CCARRAY_FOREACH(_children, pObj) - { - Sprite *item = static_cast( pObj ); - item->updateDisplayedColor(_displayedColor); - } -} - -bool StringBMFont::isCascadeColorEnabled() const -{ - return false; -} - -void StringBMFont::setCascadeColorEnabled(bool cascadeColorEnabled) -{ - _cascadeColorEnabled = cascadeColorEnabled; -} - -bool StringBMFont::isCascadeOpacityEnabled() const -{ - return false; -} - -void StringBMFont::setCascadeOpacityEnabled(bool cascadeOpacityEnabled) -{ - _cascadeOpacityEnabled = cascadeOpacityEnabled; -} - -// StringBMFont - AnchorPoint -void StringBMFont::setAnchorPoint(const Point& point) -{ - if( ! point.equals(_anchorPoint)) - { - SpriteBatchNode::setAnchorPoint(point); - updateLabel(); - } -} - -// StringBMFont - Alignment -void StringBMFont::setAlignment(TextHAlignment alignment) -{ - this->_alignment = alignment; - updateLabel(); -} - -void StringBMFont::setWidth(float width) -{ - this->_width = width; - updateLabel(); -} - -void StringBMFont::setLineBreakWithoutSpace( bool breakWithoutSpace ) -{ - _lineBreakWithoutSpaces = breakWithoutSpace; - updateLabel(); -} - -void StringBMFont::setScale(float scale) -{ - SpriteBatchNode::setScale(scale); - updateLabel(); -} - -void StringBMFont::setScaleX(float scaleX) -{ - SpriteBatchNode::setScaleX(scaleX); - updateLabel(); -} - -void StringBMFont::setScaleY(float scaleY) -{ - SpriteBatchNode::setScaleY(scaleY); - updateLabel(); -} - -float StringBMFont::getLetterPosXLeft( Sprite* sp ) -{ - return sp->getPosition().x * _scaleX - (sp->getContentSize().width * _scaleX * sp->getAnchorPoint().x); -} - -float StringBMFont::getLetterPosXRight( Sprite* sp ) -{ - return sp->getPosition().x * _scaleX + (sp->getContentSize().width * _scaleX * sp->getAnchorPoint().x); -} - -// StringBMFont - FntFile -void StringBMFont::setFntFile(const char* fntFile) -{ - if (fntFile != NULL && strcmp(fntFile, _fntFile.c_str()) != 0 ) - { - CCBMFontConfiguration *newConf = FNTConfigLoadFile(fntFile); - - CCAssert( newConf, "CCStringBMFont: Impossible to create font. Please check file"); - - _fntFile = fntFile; - - CC_SAFE_RETAIN(newConf); - CC_SAFE_RELEASE(_configuration); - _configuration = newConf; - - this->setTexture(TextureCache::getInstance()->addImage(_configuration->getAtlasName())); - LabelTextFormatter::createStringSprites(this); - } -} - -const char* StringBMFont::getFntFile() -{ - return _fntFile.c_str(); -} - - -//StringBMFont - Debug draw -#if CC_LabelBMFontNew_DEBUG_DRAW -void StringBMFont::draw() -{ - SpriteBatchNode::draw(); - const Size& s = this->getContentSize(); - Point vertices[4]={ - ccp(0,0),ccp(s.width,0), - ccp(s.width,s.height),ccp(0,s.height), - }; - ccDrawPoly(vertices, 4, true); -} - -#endif // CC_LABELBMFONT_DEBUG_DRAW - - -int StringBMFont::getCommonLineHeight() -{ - if (_configuration) - { - return _configuration->_commonHeight; - } - else - { - return -1; - } -} - -int StringBMFont::getKerningForCharsPair(unsigned short first, unsigned short second) -{ - return this->kerningAmountForFirst(first, second); -} - -ccBMFontDef StringBMFont::getFontDefForChar(unsigned short int theChar) -{ - ccBMFontDef fontDef; - tFontDefHashElement *element = NULL; - unsigned int key = theChar; - - HASH_FIND_INT(_configuration->_fontDefDictionary, &key, element); - - if (element) - { - fontDef = element->fontDef; - } - - return fontDef; -} - -// return a sprite for rendering one letter -Sprite * StringBMFont::getSpriteForChar(unsigned short int theChar, int spriteIndexHint) -{ - Rect rect; - ccBMFontDef fontDef; - Sprite *pRetSprite = 0; - - // unichar is a short, and an int is needed on HASH_FIND_INT - tFontDefHashElement *element = NULL; - unsigned int key = theChar; - - HASH_FIND_INT(_configuration->_fontDefDictionary, &key, element); - - if (! element) - { - return 0; - } - - fontDef = element->fontDef; - - rect = fontDef.rect; - rect = CC_RECT_PIXELS_TO_POINTS(rect); - - rect.origin.x += _imageOffset.x; - rect.origin.y += _imageOffset.y; - - //bool hasSprite = true; - pRetSprite = (Sprite*)(this->getChildByTag(spriteIndexHint)); - - if(pRetSprite ) - { - // Reusing previous Sprite - pRetSprite->setVisible(true); - } - else - { - pRetSprite = new Sprite(); - pRetSprite->initWithTexture(_textureAtlas->getTexture(), rect); - addChild(pRetSprite, spriteIndexHint, spriteIndexHint); - pRetSprite->release(); - - // Apply label properties - pRetSprite->setOpacityModifyRGB(_isOpacityModifyRGB); - - // Color MUST be set before opacity, since opacity might change color if OpacityModifyRGB is on - pRetSprite->updateDisplayedColor(_displayedColor); - pRetSprite->updateDisplayedOpacity(_displayedOpacity); - } - - // updating previous sprite - pRetSprite->setTextureRect(rect, false, rect.size); - return pRetSprite; -} - -int StringBMFont::getStringNumLines() -{ - int quantityOfLines = 1; - - unsigned int stringLen = _string ? cc_wcslen(_string) : 0; - if (stringLen == 0) - return (-1); - - // count number of lines - for (unsigned int i = 0; i < stringLen - 1; ++i) - { - unsigned short c = _string[i]; - if (c == '\n') - { - quantityOfLines++; - } - } - - return quantityOfLines; -} - -// need cross implementation -int StringBMFont::getStringLenght() -{ - return _string ? cc_wcslen(_string) : 0; -} - -unsigned short StringBMFont::getCharAtStringPosition(int position) -{ - return _string[position]; -} - -int StringBMFont::getXOffsetForChar(unsigned short c) -{ - ccBMFontDef fontDef = getFontDefForChar(c); - return fontDef.xOffset; -} - -int StringBMFont::getYOffsetForChar(unsigned short c) -{ - ccBMFontDef fontDef = getFontDefForChar(c); - return fontDef.yOffset; -} - -Rect StringBMFont::getRectForChar(unsigned short c) -{ - ccBMFontDef fontDef = getFontDefForChar(c); - return fontDef.rect; -} - -int StringBMFont::getAdvanceForChar(unsigned short c, int hintPositionInString) -{ - ccBMFontDef fontDef = getFontDefForChar(c); - return fontDef.xAdvance; -} - -void StringBMFont::setLabelContentSize(const Size &newSize) -{ - setContentSize(newSize); -} - -void StringBMFont::createStringSprites() -{ - LabelTextFormatter::createStringSprites(this); -} - -void StringBMFont::setString(const char *newString) -{ - // store initial string in char8 format - _initialStringUTF8 = newString; - - // update the initial string if needed - unsigned short* utf16String = cc_utf8_to_utf16(newString); - unsigned short* tmp = _initialString; - _initialString = copyUTF16StringNN(utf16String); - - CC_SAFE_DELETE_ARRAY(tmp); - CC_SAFE_DELETE_ARRAY(utf16String); - - // do the rest of the josb - updateLabel(); -} - -void StringBMFont::setCString(const char *label) -{ - setString(label); -} - -void StringBMFont::updateLabel() -{ - if ( _initialString!=0 ) - { - // set the new string - CC_SAFE_DELETE_ARRAY(_string); - _string = copyUTF16StringNN(_initialString); - - // hide all the letters and create or recicle sprites for the new letters - updateLetterSprites(); - - // format the text on more than line - multilineText(); - - // align the text (left - center - right) - alignText(); - } -} - -void StringBMFont::updateLetterSprites() -{ - // hide all the letters - hideStringSprites(); - - // create new letters sprites - createStringSprites(); -} - -void StringBMFont::hideStringSprites() -{ - if (_children && _children->count() != 0) - { - Object* child; - CCARRAY_FOREACH(_children, child) - { - Node* pNode = (Node*) child; - if (pNode) - { - pNode->setVisible(false); - } - } - } -} - -void StringBMFont::multilineText() -{ - if (_width > 0) - { - // format on more than one line - LabelTextFormatter::multilineText(this); - - // hide all the letter sprites and create/reclaim letters sprite with new position - updateLetterSprites(); - } -} - -void StringBMFont::alignText() -{ - if (_alignment != TextHAlignment::LEFT) - { - LabelTextFormatter::alignText(this); - } -} - -unsigned short * StringBMFont::getUTF8String() -{ - return _string; -} - -Sprite * StringBMFont::getSpriteChild(int ID) -{ - return (Sprite*)this->getChildByTag(ID); -} - -float StringBMFont::getMaxLineWidth() -{ - return _width; -} - -TextHAlignment StringBMFont::getTextAlignment() -{ - return _alignment; -} - -Array* StringBMFont::getChildrenLetters() -{ - return _children; -} - -void StringBMFont::assignNewUTF8String(unsigned short *newString) -{ - CC_SAFE_DELETE_ARRAY(_string); - _string = newString; -} - -Size StringBMFont::getLabelContentSize() -{ - return getContentSize(); -} - -bool StringBMFont::breakLineWithoutSpace() -{ - return _lineBreakWithoutSpaces; -} - - -NS_CC_END diff --git a/cocos2dx/label_nodes/CCStringBMFont.h b/cocos2dx/label_nodes/CCStringBMFont.h deleted file mode 100644 index f709137c7f..0000000000 --- a/cocos2dx/label_nodes/CCStringBMFont.h +++ /dev/null @@ -1,204 +0,0 @@ -/**************************************************************************** -Copyright (c) 2010-2012 cocos2d-x.org -Copyright (c) 2008-2010 Ricardo Quesada -Copyright (c) 2011 Zynga Inc. - -http://www.cocos2d-x.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -Use any of these editors to generate BMFonts: - http://glyphdesigner.71squared.com/ (Commercial, Mac OS X) - http://www.n4te.com/hiero/hiero.jnlp (Free, Java) - http://slick.cokeandcode.com/demos/hiero.jnlp (Free, Java) - http://www.angelcode.com/products/bmfont/ (Free, Windows only) - -****************************************************************************/ -#ifndef __CCBITMAP_FONT_ATLAS_H__NEW_ -#define __CCBITMAP_FONT_ATLAS_H__NEW_ - -#include "sprite_nodes/CCSpriteBatchNode.h" -#include "support/data_support/uthash.h" -#include "CCLabelBMFont.h" -#include "CClabelTextFormatProtocol.h" -#include -#include -#include -#include -#include "CCLabel.h" - -NS_CC_BEGIN - -class CC_DLL StringBMFont: public Label, public LabelTextFormatProtocol -{ -public: - StringBMFont(); - - virtual ~StringBMFont(); - /** Purges the cached data. - Removes from memory the cached configurations and the atlas name dictionary. - @since v0.99.3 - */ - static void purgeCachedData(); - - /** creates a bitmap font atlas with an initial string and the FNT file */ - static StringBMFont * create(const char *str, const char *fntFile, float width, TextHAlignment alignment, Point imageOffset); - - static StringBMFont * create(const char *str, const char *fntFile, float width, TextHAlignment alignment); - - static StringBMFont * create(const char *str, const char *fntFile, float width); - - static StringBMFont * create(const char *str, const char *fntFile); - - /** Creates an label. - */ - static StringBMFont * create(); - - bool init(); - /** init a bitmap font atlas with an initial string and the FNT file */ - bool initWithString(const char *str, const char *fntFile, float width = kLabelAutomaticWidth, TextHAlignment alignment = TextHAlignment::LEFT, Point imageOffset = Point::ZERO); - - /** updates the font chars based on the string to render */ - // super method - virtual void setString(const char *newString); - - virtual const char* getString(void) const; - virtual void setCString(const char *label); - virtual void setAnchorPoint(const Point& var); - virtual void updateLabel(); - virtual void setAlignment(TextHAlignment alignment); - virtual void setWidth(float width); - virtual void setLineBreakWithoutSpace(bool breakWithoutSpace); - virtual void setScale(float scale); - virtual void setScaleX(float scaleX); - virtual void setScaleY(float scaleY); - - // RGBAProtocol - virtual bool isOpacityModifyRGB() const; - virtual void setOpacityModifyRGB(bool isOpacityModifyRGB); - virtual GLubyte getOpacity() const; - virtual GLubyte getDisplayedOpacity() const; - virtual void setOpacity(GLubyte opacity); - virtual void updateDisplayedOpacity(GLubyte parentOpacity); - virtual bool isCascadeOpacityEnabled() const; - virtual void setCascadeOpacityEnabled(bool cascadeOpacityEnabled); - virtual const Color3B& getColor(void) const; - virtual const Color3B& getDisplayedColor() const; - virtual void setColor(const Color3B& color); - virtual void updateDisplayedColor(const Color3B& parentColor); - virtual bool isCascadeColorEnabled() const; - virtual void setCascadeColorEnabled(bool cascadeColorEnabled); - - - // StringBMFont protocol stuff - virtual Sprite * getSpriteChild(int ID); - virtual Array * getChildrenLetters(); - virtual Sprite * getSpriteForChar(unsigned short int theChar, int spriteIndexHint); - virtual int getCommonLineHeight(); - virtual int getKerningForCharsPair(unsigned short first, unsigned short second); - virtual int getXOffsetForChar(unsigned short c); - virtual int getYOffsetForChar(unsigned short c); - virtual int getAdvanceForChar(unsigned short c, int hintPositionInString); - virtual Rect getRectForChar(unsigned short c); - float getLetterPosXLeft( Sprite* sp ); - float getLetterPosXRight( Sprite* sp ); - virtual int getStringNumLines(); - virtual int getStringLenght(); - virtual unsigned short getCharAtStringPosition(int position); - virtual unsigned short * getUTF8String(); - virtual void assignNewUTF8String(unsigned short *newString); - virtual float getMaxLineWidth(); - virtual bool breakLineWithoutSpace(); - virtual TextHAlignment getTextAlignment(); - virtual Size getLabelContentSize(); - virtual void setLabelContentSize(const Size &newSize); - - - void setFntFile(const char* fntFile); - const char* getFntFile(); - -#if CC_LABELBMFONT_DEBUG_DRAW - virtual void draw(); -#endif // CC_LABELBMFONT_DEBUG_DRAW - -private: - char * atlasNameFromFntFile(const char *fntFile); - int kerningAmountForFirst(unsigned short first, unsigned short second); - - // some more new stuff - void alignText(); - void multilineText(); - ccBMFontDef getFontDefForChar(unsigned short int theChar); - void createStringSprites(); - void hideStringSprites(); - void updateLetterSprites(); - - -protected: - - // string to render - unsigned short* _string; - - // name of fntFile - std::string _fntFile; - - // initial string without line breaks - unsigned short* _initialString; - std::string _initialStringUTF8; - - // alignment of all lines - TextHAlignment _alignment; - // max width until a line break is added - float _width; - - CCBMFontConfiguration *_configuration; - - bool _lineBreakWithoutSpaces; - // offset of the texture atlas - Point _imageOffset; - - // reused char - Sprite *_reusedChar; - - // texture RGBA - GLubyte _displayedOpacity; - GLubyte _realOpacity; - Color3B _displayedColor; - Color3B _realColor; - bool _cascadeColorEnabled; - bool _cascadeOpacityEnabled; - /** conforms to RGBAProtocol protocol */ - bool _isOpacityModifyRGB; - -}; - -/** Free function that parses a FNT file a place it on the cache -*/ -CC_DLL CCBMFontConfiguration * FNTConfigLoadFile( const char *file ); -/** Purges the FNT config cache -*/ -CC_DLL void FNTConfigRemoveCache( void ); - -// end of GUI group -/// @} -/// @} - -NS_CC_END - -#endif //__CCBITMAP_FONT_ATLAS_H__ diff --git a/cocos2dx/label_nodes/CCStringTTF.cpp b/cocos2dx/label_nodes/CCStringTTF.cpp deleted file mode 100644 index f249c8ce4f..0000000000 --- a/cocos2dx/label_nodes/CCStringTTF.cpp +++ /dev/null @@ -1,664 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 Zynga Inc. - - http://www.cocos2d-x.org - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - ****************************************************************************/ - -#include "cocos2d.h" -#include "CCStringTTF.h" -#include "CCFont.h" -#include "CCLabelTextFormatter.h" -#include "CCFontAtlasCache.h" - -NS_CC_BEGIN - -StringTTF::StringTTF(FontAtlas *pAtlas, TextHAlignment alignment): _currentUTF8String(0), - _originalUTF8String(0), - _fontAtlas(pAtlas), - _alignment(alignment), - _lineBreakWithoutSpaces(false), - _advances(0), - _displayedColor(Color3B::WHITE), - _realColor(Color3B::WHITE), - _cascadeColorEnabled(true) -{ -} - -StringTTF* StringTTF::create(FontAtlas *pAtlas, TextHAlignment alignment, int lineSize) -{ - StringTTF *ret = new StringTTF(pAtlas, alignment); - - if (!ret) - return 0; - - if( ret->init() ) - { - ret->autorelease(); - return ret; - } - else - { - delete ret; - return 0; - } - - return ret; -} - -StringTTF::~StringTTF() -{ - if (_currentUTF8String) - delete [] _currentUTF8String; - - if (_advances) - delete [] _advances; - - if (_fontAtlas) - FontAtlasCache::releaseFontAtlas(_fontAtlas); -} - -bool StringTTF::init() -{ - return true; -} - -void StringTTF::setString(const char *stringToRender) -{ - setText(stringToRender, 0, TextHAlignment::CENTER, false); -} - -bool StringTTF::setText(const char *stringToRender, float lineWidth, TextHAlignment alignment, bool lineBreakWithoutSpaces) -{ - if (!_fontAtlas) - return false; - - _width = lineWidth; - _alignment = alignment; - _lineBreakWithoutSpaces = lineBreakWithoutSpaces; - - // release all the sprites - moveAllSpritesToCache(); - - // store locally common line height - _commonLineHeight = _fontAtlas->getCommonLineHeight(); - if (_commonLineHeight <= 0) - return false; - - int numLetter = 0; - unsigned short* utf16String = cc_utf8_to_utf16(stringToRender); - if(!utf16String) - return false; - - numLetter = cc_wcslen(utf16String); - SpriteBatchNode::initWithTexture(&_fontAtlas->getTexture(0), numLetter); - _cascadeColorEnabled = true; - - // - setCurrentString(utf16String); - setOriginalString(utf16String); - - // align text - alignText(); - - // done here - return true; -} - -void StringTTF::setAlignment(TextHAlignment alignment) -{ - // store the new alignment - if (alignment != _alignment) - { - // store - _alignment = alignment; - - // reset the string - resetCurrentString(); - - // need to align text again - alignText(); - } -} - -void StringTTF::setWidth(float width) -{ - if (width != _width) - { - // store - _width = width; - - // need to align text again - alignText(); - } -} - -void StringTTF::setLineBreakWithoutSpace(bool breakWithoutSpace) -{ - if (breakWithoutSpace != _lineBreakWithoutSpaces) - { - // store - _lineBreakWithoutSpaces = breakWithoutSpace; - - // need to align text again - alignText(); - } -} - -void StringTTF::setScale(float scale) -{ - Node::setScale(scale); - alignText(); -} - -void StringTTF::setScaleX(float scaleX) -{ - Node::setScaleX(scaleX); - alignText(); -} - -void StringTTF::setScaleY(float scaleY) -{ - Node::setScaleY(scaleY); - alignText(); -} - -void StringTTF::alignText() -{ - hideAllLetters(); - LabelTextFormatter::createStringSprites(this); - - if( LabelTextFormatter::multilineText(this) ) - { - hideAllLetters(); - LabelTextFormatter::createStringSprites(this); - } - - LabelTextFormatter::alignText(this); -} - -void StringTTF::hideAllLetters() -{ - Object* Obj = NULL; - CCARRAY_FOREACH(&_spriteArray, Obj) - { - ((Sprite *)Obj)->setVisible(false); - } - - CCARRAY_FOREACH(&_spriteArrayCache, Obj) - { - ((Sprite *)Obj)->setVisible(false); - } -} - -bool StringTTF::computeAdvancesForString(unsigned short int *stringToRender) -{ - if (_advances) - { - delete [] _advances; - _advances = 0; - } - - Font &theFont = _fontAtlas->getFont(); - - int letterCount = 0; - _advances = theFont.getAdvancesForTextUTF16(stringToRender, letterCount); - - if(!_advances) - return false; - else - return true; -} - -bool StringTTF::setOriginalString(unsigned short *stringToSet) -{ - if (_originalUTF8String) - { - delete [] _originalUTF8String; - _originalUTF8String = 0; - } - - int newStringLenght = cc_wcslen(stringToSet); - _originalUTF8String = new unsigned short int [newStringLenght + 1]; - memset(_originalUTF8String, 0, (newStringLenght + 1) * 2); - memcpy(_originalUTF8String, stringToSet, (newStringLenght * 2)); - _originalUTF8String[newStringLenght] = 0; - - return true; -} - -bool StringTTF::setCurrentString(unsigned short *stringToSet) -{ - // set the new string - if (_currentUTF8String) - { - delete [] _currentUTF8String; - _currentUTF8String = 0; - } - // - _currentUTF8String = stringToSet; - // compute the advances - return computeAdvancesForString(stringToSet); -} - -void StringTTF::resetCurrentString() -{ - // set the new string - if (_currentUTF8String) - { - delete [] _currentUTF8String; - _currentUTF8String = 0; - } - - int stringLenght = cc_wcslen(_originalUTF8String); - _currentUTF8String = new unsigned short int [stringLenght + 1]; - memcpy(_currentUTF8String, _originalUTF8String, stringLenght * 2); - _currentUTF8String[stringLenght] = 0; - -} - -Sprite * StringTTF::createNewSpriteFromLetterDefinition(FontLetterDefinition &theDefinition, Texture2D *theTexture) -{ - Rect uvRect; - uvRect.size.height = theDefinition.height; - uvRect.size.width = theDefinition.width; - uvRect.origin.x = theDefinition.U; - uvRect.origin.y = theDefinition.V; - - SpriteFrame *pFrame = SpriteFrame::createWithTexture(theTexture, uvRect); - Sprite *tempSprite = getSprite(); - - if (!tempSprite) - return 0; - - tempSprite->initWithSpriteFrame(pFrame); - tempSprite->setAnchorPoint(Point(theDefinition.anchorX, theDefinition.anchorY)); - tempSprite->setBatchNode(this); - - return tempSprite; -} - -Sprite * StringTTF::updateSpriteWithLetterDefinition(Sprite *spriteToUpdate, FontLetterDefinition &theDefinition, Texture2D *theTexture) -{ - if (!spriteToUpdate) - { - return 0; - } - else - { - Rect uvRect; - uvRect.size.height = theDefinition.height; - uvRect.size.width = theDefinition.width; - uvRect.origin.x = theDefinition.U; - uvRect.origin.y = theDefinition.V; - - SpriteFrame *frame = SpriteFrame::createWithTexture(theTexture, uvRect); - if (frame) - { - spriteToUpdate->setTexture(theTexture); - spriteToUpdate->setDisplayFrame(frame); - spriteToUpdate->setAnchorPoint(Point(theDefinition.anchorX, theDefinition.anchorY)); - spriteToUpdate->setBatchNode(this); - } - - return spriteToUpdate; - } -} - -Sprite * StringTTF::getSpriteForLetter(unsigned short int newLetter) -{ - if (!_fontAtlas) - return 0; - - FontLetterDefinition tempDefinition; - bool validDefinition = _fontAtlas->getLetterDefinitionForChar(newLetter, tempDefinition); - if (validDefinition) - { - Sprite *newSprite = createNewSpriteFromLetterDefinition(tempDefinition, &_fontAtlas->getTexture(tempDefinition.textureID) ); - this->addChild(newSprite); - return newSprite; - } - else - { - return 0; - } -} - -Sprite * StringTTF::updateSpriteForLetter(Sprite *spriteToUpdate, unsigned short int newLetter) -{ - if (!spriteToUpdate || !_fontAtlas) - return 0; - else - { - FontLetterDefinition tempDefinition; - bool validDefinition = _fontAtlas->getLetterDefinitionForChar(newLetter, tempDefinition); - if (validDefinition) - { - Sprite *pNewSprite = updateSpriteWithLetterDefinition(spriteToUpdate, tempDefinition, &_fontAtlas->getTexture(tempDefinition.textureID) ); - return pNewSprite; - } - else - { - return 0; - } - } -} - -void StringTTF::moveAllSpritesToCache() -{ - Object* pObj = NULL; - CCARRAY_FOREACH(&_spriteArray, pObj) - { - ((Sprite *)pObj)->removeFromParent(); - _spriteArrayCache.addObject(pObj); - } - - _spriteArray.removeAllObjects(); -} - -Sprite * StringTTF::getSprite() -{ - if (_spriteArrayCache.count()) - { - Sprite *retSprite = (Sprite *) _spriteArrayCache.lastObject(); - _spriteArrayCache.removeLastObject(); - return retSprite; - } - else - { - Sprite *retSprite = new Sprite; - return retSprite; - } -} - -///// PROTOCOL STUFF - -Sprite * StringTTF::getSpriteChild(int ID) -{ - Object* pObj = NULL; - CCARRAY_FOREACH(&_spriteArray, pObj) - { - Sprite *pSprite = (Sprite *)pObj; - if ( pSprite->getTag() == ID) - { - return pSprite; - } - } - return 0; -} - -Array * StringTTF::getChildrenLetters() -{ - return &_spriteArray; -} - -Sprite * StringTTF::getSpriteForChar(unsigned short int theChar, int spriteIndexHint) -{ - // ret sprite - Sprite *retSprite = 0; - - // look for already existing sprites - retSprite = getSpriteChild(spriteIndexHint); - - if (!retSprite) - { - retSprite = getSpriteForLetter(theChar); - if (!retSprite) - return 0; - - if (retSprite) - retSprite->setTag(spriteIndexHint); - - _spriteArray.addObject(retSprite); - } - - // the sprite is now visible - retSprite->setVisible(true); - - // set the right texture letter to the sprite - updateSpriteForLetter(retSprite, theChar); - - // we are done here - return retSprite; -} - -float StringTTF::getLetterPosXLeft( Sprite* sp ) -{ - float scaleX = _scaleX; - return sp->getPosition().x * scaleX - (sp->getContentSize().width * scaleX * sp->getAnchorPoint().x); -} - -float StringTTF::getLetterPosXRight( Sprite* sp ) -{ - float scaleX = _scaleX; - return sp->getPosition().x * scaleX + (sp->getContentSize().width * scaleX * sp->getAnchorPoint().x); -} - -int StringTTF::getCommonLineHeight() -{ - return _commonLineHeight; -} - -int StringTTF::getKerningForCharsPair(unsigned short first, unsigned short second) -{ - return 0; -} - -int StringTTF::getXOffsetForChar(unsigned short c) -{ - FontLetterDefinition tempDefinition; - bool validDefinition = _fontAtlas->getLetterDefinitionForChar(c, tempDefinition); - if (!validDefinition) - return -1; - - return (tempDefinition.offsetX); -} - -int StringTTF::getYOffsetForChar(unsigned short c) -{ - FontLetterDefinition tempDefinition; - bool validDefinition = _fontAtlas->getLetterDefinitionForChar(c, tempDefinition); - if (!validDefinition) - return -1; - - return (tempDefinition.offsetY); -} - -int StringTTF::getAdvanceForChar(unsigned short c, int hintPositionInString) -{ - if (_advances) - { - // not that advance contains the X offset already - FontLetterDefinition tempDefinition; - bool validDefinition = _fontAtlas->getLetterDefinitionForChar(c, tempDefinition); - if (!validDefinition) - return -1; - - return (_advances[hintPositionInString].width - tempDefinition.offsetX); - } - else - { - return -1; - } -} - -Rect StringTTF::getRectForChar(unsigned short c) -{ - return _fontAtlas->getFont().getRectForChar(c); -} - -// string related stuff -int StringTTF::getStringNumLines() -{ - int quantityOfLines = 1; - - unsigned int stringLen = _currentUTF8String ? cc_wcslen(_currentUTF8String) : 0; - if (stringLen == 0) - return (-1); - - // count number of lines - for (unsigned int i = 0; i < stringLen - 1; ++i) - { - unsigned short c = _currentUTF8String[i]; - if (c == '\n') - { - quantityOfLines++; - } - } - - return quantityOfLines; -} - -int StringTTF::getStringLenght() -{ - return _currentUTF8String ? cc_wcslen(_currentUTF8String) : 0; -} - -unsigned short StringTTF::getCharAtStringPosition(int position) -{ - return _currentUTF8String[position]; -} - -unsigned short * StringTTF::getUTF8String() -{ - return _currentUTF8String; -} - -void StringTTF::assignNewUTF8String(unsigned short *newString) -{ - setCurrentString(newString); -} - -TextHAlignment StringTTF::getTextAlignment() -{ - return _alignment; -} - -// label related stuff -float StringTTF::getMaxLineWidth() -{ - return _width; -} - -bool StringTTF::breakLineWithoutSpace() -{ - return _lineBreakWithoutSpaces; -} - -Size StringTTF::getLabelContentSize() -{ - return getContentSize(); -} - -void StringTTF::setLabelContentSize(const Size &newSize) -{ - setContentSize(newSize); -} - - -// RGBA protocol - - -bool StringTTF::isOpacityModifyRGB() const -{ - return false; -} - -void StringTTF::setOpacityModifyRGB(bool isOpacityModifyRGB) -{ -} - -unsigned char StringTTF::getOpacity() const -{ - return 0; -} - -unsigned char StringTTF::getDisplayedOpacity() const -{ - return 0; -} - -void StringTTF::setOpacity(GLubyte opacity) -{ -} -void StringTTF::updateDisplayedOpacity(GLubyte parentOpacity) -{ -} - -bool StringTTF::isCascadeOpacityEnabled() const -{ - return false; -} - -void StringTTF::setCascadeOpacityEnabled(bool cascadeOpacityEnabled) -{ -} - -const Color3B& StringTTF::getColor(void) const -{ - return _realColor; -} - -const Color3B& StringTTF::getDisplayedColor() const -{ - return _displayedColor; -} - -void StringTTF::setColor(const Color3B& color) -{ - _displayedColor = _realColor = color; - - if( _cascadeColorEnabled ) - { - Color3B parentColor = Color3B::WHITE; - RGBAProtocol* pParent = dynamic_cast(_parent); - - if (pParent && pParent->isCascadeColorEnabled()) - parentColor = pParent->getDisplayedColor(); - - updateDisplayedColor(parentColor); - } -} - -void StringTTF::updateDisplayedColor(const Color3B& parentColor) -{ - _displayedColor.r = _realColor.r * parentColor.r/255.0; - _displayedColor.g = _realColor.g * parentColor.g/255.0; - _displayedColor.b = _realColor.b * parentColor.b/255.0; - - Object* pObj; - CCARRAY_FOREACH(_children, pObj) - { - Sprite *item = static_cast( pObj ); - item->updateDisplayedColor(_displayedColor); - } -} - -bool StringTTF::isCascadeColorEnabled() const -{ - return false; -} - -void StringTTF::setCascadeColorEnabled(bool cascadeColorEnabled) -{ - _cascadeColorEnabled = cascadeColorEnabled; -} - -NS_CC_END diff --git a/cocos2dx/label_nodes/CCStringTTF.h b/cocos2dx/label_nodes/CCStringTTF.h deleted file mode 100644 index 436c4924cf..0000000000 --- a/cocos2dx/label_nodes/CCStringTTF.h +++ /dev/null @@ -1,142 +0,0 @@ -/**************************************************************************** - Copyright (c) 2013 Zynga Inc. - - http://www.cocos2d-x.org - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - ****************************************************************************/ - -#ifndef _StringTTF_h -#define _StringTTF_h - -#include "CCFontDefinition.h" -#include "CCLabelTextFormatProtocol.h" -#include "CCLabel.h" -#include "CCFontAtlas.h" - -NS_CC_BEGIN - -class CC_DLL StringTTF : public Label, public LabelTextFormatProtocol -{ -public: - - static StringTTF* create(FontAtlas *pAtlas, TextHAlignment alignment = TextHAlignment::LEFT, int lineSize = 0); - - // main interface - bool setText(const char *stringToRender, float lineWidth, TextHAlignment alignment = TextHAlignment::LEFT, bool lineBreakWithoutSpaces = false); - void setString(const char *stringToRender); - virtual void setAlignment(TextHAlignment alignment); - virtual void setWidth(float width); - virtual void setLineBreakWithoutSpace(bool breakWithoutSpace); - virtual void setScale(float scale); - virtual void setScaleX(float scaleX); - virtual void setScaleY(float scaleY); - - // carloX - const char * getString() const { return "not implemented"; } - - // RGBAProtocol - virtual bool isOpacityModifyRGB() const; - virtual void setOpacityModifyRGB(bool isOpacityModifyRGB); - virtual void setOpacity(GLubyte opacity); - virtual void updateDisplayedOpacity(GLubyte parentOpacity); - virtual bool isCascadeOpacityEnabled() const; - virtual void setCascadeOpacityEnabled(bool cascadeOpacityEnabled); - virtual void setColor(const Color3B& color); - virtual void updateDisplayedColor(const Color3B& parentColor); - virtual bool isCascadeColorEnabled() const; - virtual void setCascadeColorEnabled(bool cascadeColorEnabled); - virtual const Color3B& getColor(void) const; - virtual const Color3B& getDisplayedColor() const; - virtual unsigned char getOpacity() const; - virtual unsigned char getDisplayedOpacity() const; - - // CCLabelTextFormat protocol implementation - virtual Sprite * getSpriteChild(int ID); - virtual Array * getChildrenLetters(); - virtual Sprite * getSpriteForChar(unsigned short int theChar, int spriteIndexHint); - virtual float getLetterPosXLeft( Sprite* sp ); - virtual float getLetterPosXRight( Sprite* sp ); - - // font related stuff - virtual int getCommonLineHeight(); - virtual int getKerningForCharsPair(unsigned short first, unsigned short second); - virtual int getXOffsetForChar(unsigned short c); - virtual int getYOffsetForChar(unsigned short c); - virtual int getAdvanceForChar(unsigned short c, int hintPositionInString); - virtual Rect getRectForChar(unsigned short c) ; - - // string related stuff - virtual int getStringNumLines(); - virtual int getStringLenght(); - virtual unsigned short getCharAtStringPosition(int position); - virtual unsigned short * getUTF8String(); - virtual void assignNewUTF8String(unsigned short *newString); - virtual TextHAlignment getTextAlignment(); - - // label related stuff - virtual float getMaxLineWidth() ; - virtual bool breakLineWithoutSpace(); - virtual Size getLabelContentSize(); - virtual void setLabelContentSize(const Size &newSize); - -private: - - // - StringTTF(FontAtlas *pAtlas, TextHAlignment alignment = TextHAlignment::LEFT); - ~StringTTF(); - - bool init(); - - void alignText(); - void hideAllLetters(); - void moveAllSpritesToCache(); - - bool computeAdvancesForString(unsigned short int *stringToRender); - bool setCurrentString(unsigned short *stringToSet); - bool setOriginalString(unsigned short *stringToSet); - void resetCurrentString(); - - Sprite * getSprite(); - Sprite * createNewSpriteFromLetterDefinition(FontLetterDefinition &theDefinition, Texture2D *theTexture); - Sprite * updateSpriteWithLetterDefinition(Sprite *spriteToUpdate, FontLetterDefinition &theDefinition, Texture2D *theTexture); - Sprite * getSpriteForLetter(unsigned short int newLetter); - Sprite * updateSpriteForLetter(Sprite *spriteToUpdate, unsigned short int newLetter); - - Array _spriteArray; - Array _spriteArrayCache; - float _commonLineHeight; - bool _lineBreakWithoutSpaces; - float _width; - TextHAlignment _alignment; - unsigned short int * _currentUTF8String; - unsigned short int * _originalUTF8String; - Size * _advances; - FontAtlas * _fontAtlas; - Color3B _displayedColor; - Color3B _realColor; - bool _cascadeColorEnabled; - -}; - -NS_CC_END - -#endif - -