axmol/cocos2dx/label_nodes/CCFontFNT.cpp

198 lines
4.6 KiB
C++
Raw Normal View History

//
// CCFontFNT.cpp
// cocos2d_libs
//
// Created by Carlo Morgantini on 7/24/13.
//
//
#include "CCFontFNT.h"
#include "CCFontAtlas.h"
NS_CC_BEGIN
2013-08-07 04:43:29 +08:00
FontFNT * FontFNT::create(const char* fntFilePath)
2013-08-06 06:56:18 +08:00
{
2013-08-07 04:43:29 +08:00
CCBMFontConfiguration *newConf = FNTConfigLoadFile(fntFilePath);
if (!newConf)
return nullptr;
// add the texture
Texture2D *tempTexture = TextureCache::getInstance()->addImage(newConf->getAtlasName());
2013-09-13 11:46:46 +08:00
if (!tempTexture)
2013-08-07 04:43:29 +08:00
{
delete newConf;
return nullptr;
}
FontFNT *tempFont = new FontFNT(newConf);
if (!tempFont)
{
delete newConf;
return nullptr;
}
return tempFont;
2013-08-06 06:56:18 +08:00
}
FontFNT::~FontFNT()
{
if (_configuration)
_configuration->release();
}
2013-09-13 11:46:46 +08:00
Size * FontFNT::getAdvancesForTextUTF16(unsigned short *text, int &outNumLetters) const
{
2013-09-13 11:46:46 +08:00
if (!text)
return 0;
2013-09-13 11:46:46 +08:00
outNumLetters = cc_wcslen(text);
if (!outNumLetters)
return 0;
2013-09-13 11:46:46 +08:00
Size *sizes = new Size[outNumLetters];
if (!sizes)
return 0;
2013-09-13 11:46:46 +08:00
for (int c = 0; c < outNumLetters; ++c)
{
int advance = 0;
int kerning = 0;
2013-09-13 11:46:46 +08:00
advance = getAdvanceForChar(text[c]);
2013-09-13 11:46:46 +08:00
if (c < (outNumLetters-1))
kerning = getHorizontalKerningForChars(text[c], text[c+1]);
2013-09-13 11:46:46 +08:00
sizes[c].width = (advance + kerning);
}
2013-09-13 11:46:46 +08:00
return sizes;
}
2013-09-13 11:46:46 +08:00
int FontFNT::getAdvanceForChar(unsigned short theChar) const
{
2013-09-13 11:46:46 +08:00
tFontDefHashElement *element = nullptr;
// unichar is a short, and an int is needed on HASH_FIND_INT
unsigned int key = theChar;
HASH_FIND_INT(_configuration->_fontDefDictionary, &key, element);
if (! element)
return -1;
return element->fontDef.xAdvance;
}
2013-09-13 11:46:46 +08:00
int FontFNT::getHorizontalKerningForChars(unsigned short firstChar, unsigned short secondChar) const
{
int ret = 0;
2013-09-13 11:46:46 +08:00
unsigned int key = (firstChar << 16) | (secondChar & 0xffff);
2013-09-13 11:46:46 +08:00
if (_configuration->_kerningDictionary)
{
2013-09-13 11:46:46 +08:00
tKerningHashElement *element = nullptr;
HASH_FIND_INT(_configuration->_kerningDictionary, &key, element);
2013-09-13 11:46:46 +08:00
if (element)
ret = element->amount;
}
return ret;
}
2013-09-13 11:46:46 +08:00
Rect FontFNT::getRectForCharInternal(unsigned short theChar) const
{
Rect retRect;
ccBMFontDef fontDef;
2013-09-13 11:46:46 +08:00
tFontDefHashElement *element = nullptr;
unsigned int key = theChar;
HASH_FIND_INT(_configuration->_fontDefDictionary, &key, element);
if (element)
{
retRect = element->fontDef.rect;
}
return retRect;
}
2013-09-13 11:46:46 +08:00
Rect FontFNT::getRectForChar(unsigned short theChar) const
{
return getRectForCharInternal(theChar);
}
2013-08-02 05:36:34 +08:00
FontAtlas * FontFNT::createFontAtlas()
{
2013-08-06 08:49:20 +08:00
FontAtlas *tempAtlas = new FontAtlas(*this);
2013-08-02 05:36:34 +08:00
if (!tempAtlas)
return nullptr;
// check that everything is fine with the BMFontCofniguration
if (!_configuration->_fontDefDictionary)
return nullptr;
int numGlyphs = _configuration->_characterSet->size();
if (!numGlyphs)
return nullptr;
if (_configuration->_commonHeight == 0)
return nullptr;
// commone height
tempAtlas->setCommonLineHeight(_configuration->_commonHeight);
ccBMFontDef fontDef;
2013-09-13 11:46:46 +08:00
tFontDefHashElement *currentElement, *tmp;
2013-08-02 05:36:34 +08:00
// Purge uniform hash
2013-09-13 11:46:46 +08:00
HASH_ITER(hh, _configuration->_fontDefDictionary, currentElement, tmp)
2013-08-02 05:36:34 +08:00
{
FontLetterDefinition tempDefinition;
2013-09-13 11:46:46 +08:00
fontDef = currentElement->fontDef;
2013-08-02 05:36:34 +08:00
Rect tempRect;
tempRect = fontDef.rect;
tempRect = CC_RECT_PIXELS_TO_POINTS(tempRect);
tempDefinition.letteCharUTF16 = fontDef.charID;
tempDefinition.offsetX = fontDef.xOffset;
tempDefinition.offsetY = fontDef.yOffset;
tempDefinition.U = tempRect.origin.x;
tempDefinition.V = tempRect.origin.y;
tempDefinition.width = tempRect.size.width;
tempDefinition.height = tempRect.size.height;
//carloX: only one texture supported FOR NOW
tempDefinition.textureID = 0;
tempDefinition.anchorX = 0.5f;
tempDefinition.anchorY = 0.5f;
// add the new definition
tempAtlas->addLetterDefinition(tempDefinition);
}
// add the texture (only one texture for now)
Texture2D *tempTexture = TextureCache::getInstance()->addImage(_configuration->getAtlasName());
if (!tempTexture)
return 0;
// add the texture
2013-08-06 08:49:20 +08:00
tempAtlas->addTexture(*tempTexture, 0);
2013-08-02 05:36:34 +08:00
// done
return tempAtlas;
}
NS_CC_END