mirror of https://github.com/axmolengine/axmol.git
some more clean up and removed CCStringTTF
This commit is contained in:
parent
ef919aea91
commit
83b2377a76
|
@ -1 +1 @@
|
||||||
e4abb5d1cb9dde319461fc8f0b800afe6490b185
|
f1f3f9509d1a7df5298606d8c099c5d3d85d4ff5
|
|
@ -99,7 +99,7 @@ THE SOFTWARE.
|
||||||
#include "label_nodes/CCLabelAtlas.h"
|
#include "label_nodes/CCLabelAtlas.h"
|
||||||
#include "label_nodes/CCLabelTTF.h"
|
#include "label_nodes/CCLabelTTF.h"
|
||||||
#include "label_nodes/CCLabelBMFont.h"
|
#include "label_nodes/CCLabelBMFont.h"
|
||||||
#include "label_nodes/CCStringTTF.h"
|
#include "label_nodes/CCLabel.h"
|
||||||
|
|
||||||
// layers_scenes_transitions_nodes
|
// layers_scenes_transitions_nodes
|
||||||
#include "layers_scenes_transitions_nodes/CCLayer.h"
|
#include "layers_scenes_transitions_nodes/CCLayer.h"
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "cocos2d.h"
|
#include "cocos2d.h"
|
||||||
#include "CCFontAtlas.h"
|
#include "CCFontAtlas.h"
|
||||||
|
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
class CC_DLL FontAtlasFactory
|
class CC_DLL FontAtlasFactory
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "cocos2d.h"
|
#include "cocos2d.h"
|
||||||
|
#include "CCFontDefinition.h"
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "CCFontFNT.h"
|
#include "CCFontFNT.h"
|
||||||
|
#include "CCFontAtlas.h"
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "CCFontFreeType.h"
|
#include "CCFontFreeType.h"
|
||||||
#include "CCTextImage.h"
|
#include "CCTextImage.h"
|
||||||
#include "CCFont.h"
|
#include "CCFont.h"
|
||||||
|
#include "CCFontDefinition.h"
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
|
|
|
@ -23,39 +23,43 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "CCLabel.h"
|
#include "CCLabel.h"
|
||||||
#include "CCStringTTF.h"
|
|
||||||
#include "CCFontDefinition.h"
|
#include "CCFontDefinition.h"
|
||||||
#include "CCFontCache.h"
|
#include "CCFontCache.h"
|
||||||
#include "CCFontAtlasCache.h"
|
#include "CCFontAtlasCache.h"
|
||||||
|
#include "CCLabelTextFormatter.h"
|
||||||
|
|
||||||
NS_CC_BEGIN
|
NS_CC_BEGIN
|
||||||
|
|
||||||
Label* Label::createWithTTF( const char* label, const char* tttFilePath, int fontSize, GlyphCollection glyphs, int lineSize, const char *customGlyphs )
|
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);
|
FontAtlas *tempAtlas = FontAtlasCache::getFontAtlasTTF(tttFilePath, fontSize, glyphs, customGlyphs);
|
||||||
if (!tempAtlas)
|
if (!tempAtlas)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// create the actual label
|
// create the actual label
|
||||||
StringTTF* templabel = StringTTF::create(tempAtlas, TextHAlignment::CENTER, lineSize);
|
Label* templabel = Label::create(tempAtlas, TextHAlignment::CENTER, lineSize);
|
||||||
|
|
||||||
if (templabel)
|
if (templabel)
|
||||||
{
|
{
|
||||||
templabel->setText(label, lineSize, TextHAlignment::CENTER, false);
|
templabel->setText(label, lineSize, TextHAlignment::CENTER, false);
|
||||||
return templabel;
|
return templabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Label* Label::createWithBMFont( const char* label, const char* bmfontFilePath, int lineSize)
|
Label* Label::createWithBMFont( const char* label, const char* bmfontFilePath, int lineSize)
|
||||||
{
|
{
|
||||||
|
|
||||||
FontAtlas *tempAtlas = FontAtlasCache::getFontAtlasFNT(bmfontFilePath);
|
FontAtlas *tempAtlas = FontAtlasCache::getFontAtlasFNT(bmfontFilePath);
|
||||||
|
|
||||||
if (!tempAtlas)
|
if (!tempAtlas)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
StringTTF* templabel = StringTTF::create(tempAtlas, TextHAlignment::CENTER, lineSize);
|
Label* templabel = Label::create(tempAtlas, TextHAlignment::CENTER, lineSize);
|
||||||
|
|
||||||
if (templabel)
|
if (templabel)
|
||||||
{
|
{
|
||||||
|
@ -66,14 +70,640 @@ Label* Label::createWithBMFont( const char* label, const char* bmfontFilePath, i
|
||||||
{
|
{
|
||||||
return 0;
|
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()
|
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<RGBAProtocol*>(_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<Sprite*>( pObj );
|
||||||
|
item->updateDisplayedColor(_displayedColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Label::isCascadeColorEnabled() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Label::setCascadeColorEnabled(bool cascadeColorEnabled)
|
||||||
|
{
|
||||||
|
_cascadeColorEnabled = cascadeColorEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
|
@ -27,6 +27,8 @@
|
||||||
#define _COCOS2D_CCLABEL_H_
|
#define _COCOS2D_CCLABEL_H_
|
||||||
|
|
||||||
#include "sprite_nodes/CCSpriteBatchNode.h"
|
#include "sprite_nodes/CCSpriteBatchNode.h"
|
||||||
|
#include "CCLabelTextFormatProtocol.h"
|
||||||
|
#include "ccTypes.h"
|
||||||
|
|
||||||
NS_CC_BEGIN
|
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:
|
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* 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 );
|
static Label* createWithBMFont( const char* label, const char* bmfontFilePath, int lineSize = 0 );
|
||||||
|
|
||||||
virtual ~Label();
|
Label(FontAtlas *pAtlas, TextHAlignment alignment);
|
||||||
Label();
|
~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:
|
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
|
NS_CC_END
|
||||||
|
|
||||||
#endif /*__COCOS2D_CCLABEL_H */
|
#endif /*__COCOS2D_CCLABEL_H */
|
||||||
|
|
|
@ -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<RGBAProtocol*>(_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<RGBAProtocol*>(_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<Node*>( child );
|
|
||||||
if (pNode)
|
|
||||||
{
|
|
||||||
RGBAProtocol *pRGBAProtocol = dynamic_cast<RGBAProtocol*>(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<Sprite*>( 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<Sprite*>( 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
|
|
|
@ -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 <map>
|
|
||||||
#include <sstream>
|
|
||||||
#include <iostream>
|
|
||||||
#include <vector>
|
|
||||||
#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__
|
|
|
@ -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<RGBAProtocol*>(_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<Sprite*>( pObj );
|
|
||||||
item->updateDisplayedColor(_displayedColor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool StringTTF::isCascadeColorEnabled() const
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StringTTF::setCascadeColorEnabled(bool cascadeColorEnabled)
|
|
||||||
{
|
|
||||||
_cascadeColorEnabled = cascadeColorEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_CC_END
|
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue