Fix Label may display incomplete for multiline text with outline feature enabled.

This commit is contained in:
Dhilan007 2014-11-12 17:24:35 +08:00
parent 706f49cb59
commit e071e5c896
3 changed files with 44 additions and 17 deletions

View File

@ -269,18 +269,16 @@ bool LabelTextFormatter::alignText(Label *theLabel)
bool LabelTextFormatter::createStringSprites(Label *theLabel)
{
// check for string
unsigned int stringLen = theLabel->getStringLength();
theLabel->_limitShowCount = 0;
// no string
if (stringLen == 0)
// check for string
int stringLen = theLabel->getStringLength();
if (stringLen <= 0)
return false;
int longestLine = 0;
unsigned int totalHeight = theLabel->_commonLineHeight * theLabel->_currNumLines;
int nextFontPositionX = 0;
int nextFontPositionY = totalHeight;
auto totalHeight = theLabel->_commonLineHeight * theLabel->_currNumLines;
auto longestLine = 0.0f;
auto nextFontPositionX = 0.0f;
auto nextFontPositionY = totalHeight;
auto contentScaleFactor = CC_CONTENT_SCALE_FACTOR();
if (theLabel->_labelHeight > 0)
@ -307,7 +305,6 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel)
}
}
Rect charRect;
int charXOffset = 0;
int charYOffset = 0;
int charAdvance = 0;
@ -322,13 +319,13 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel)
float clipBottom = 0;
int lineIndex = 0;
bool lineStart = true;
bool clip = false;
bool clipBlank = false;
if (theLabel->_currentLabelType == Label::LabelType::TTF && theLabel->_clipEnabled)
{
clip = true;
clipBlank = true;
}
for (unsigned int i = 0; i < stringLen; i++)
for (int i = 0; i < stringLen; i++)
{
char16_t c = strWhole[i];
if (fontAtlas->getLetterDefinitionForChar(c, tempDefinition))
@ -357,7 +354,7 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel)
lineStart = true;
continue;
}
else if (clip && tempDefinition.height > 0.0f)
else if (clipBlank && tempDefinition.height > 0.0f)
{
if (lineStart)
{
@ -382,7 +379,7 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel)
letterPosition.x = (nextFontPositionX + charXOffset + kernings[i]) / contentScaleFactor;
letterPosition.y = (nextFontPositionY - charYOffset) / contentScaleFactor;
if( theLabel->recordLetterInfo(letterPosition,tempDefinition,i) == false)
if( theLabel->recordLetterInfo(letterPosition, tempDefinition, i) == false)
{
log("WARNING: can't find letter definition in font file for letter: %c", c);
continue;
@ -420,7 +417,7 @@ bool LabelTextFormatter::createStringSprites(Label *theLabel)
tmpSize.height = theLabel->_labelHeight * contentScaleFactor;
}
if (clip)
if (clipBlank)
{
int clipTotal = (clipTop + clipBottom) / contentScaleFactor;
tmpSize.height -= clipTotal * contentScaleFactor;

View File

@ -81,7 +81,8 @@ static std::function<Layer*()> createFunctions[] =
CL(LabelIssue4999Test),
CL(LabelLineHeightTest),
CL(LabelAdditionalKerningTest),
CL(LabelIssue8492Test)
CL(LabelIssue8492Test),
CL(LabelMultilineWithOutline)
};
#define MAX_LAYER (sizeof(createFunctions) / sizeof(createFunctions[0]))
@ -1833,3 +1834,21 @@ std::string LabelIssue8492Test::subtitle() const
{
return "Work fine when dimensions are not enough to fit one character";
}
LabelMultilineWithOutline::LabelMultilineWithOutline()
{
auto label = Label::createWithTTF("Multiline txet\nwith\noutline feature", "fonts/arial.ttf", 24);
label->enableOutline(Color4B::ORANGE,1);
label->setPosition(VisibleRect::center());
addChild(label);
}
std::string LabelMultilineWithOutline::title() const
{
return "Reorder issue #9095";
}
std::string LabelMultilineWithOutline::subtitle() const
{
return "end in string 'outline feature'";
}

View File

@ -520,6 +520,17 @@ public:
virtual std::string subtitle() const override;
};
class LabelMultilineWithOutline : public AtlasDemoNew
{
public:
CREATE_FUNC(LabelMultilineWithOutline);
LabelMultilineWithOutline();
virtual std::string title() const override;
virtual std::string subtitle() const override;
};
// we don't support linebreak mode
#endif