void RichText::handleTextRenderer(const char *text, const char *fontName, float fontSize, const Color3B &color, GLubyte opacity) { Label* textRenderer = Label::create(text, fontName, fontSize); float textRendererWidth = textRenderer->getContentSize().width; _leftSpaceWidth -= textRendererWidth; if (_leftSpaceWidth < 0.0f) { float overstepPercent = (-_leftSpaceWidth) / textRendererWidth; std::string curText = text; size_t stringLength = _calcCharCount(text); int leftLength = stringLength * (1.0f - overstepPercent); std::string leftWords = curText.substr(0, leftLength); std::string cutWords = curText.substr(leftLength, curText.length()-1); if (leftLength > 0) { Label* leftRenderer = Label::create(leftWords.substr(0, leftLength).c_str(), fontName, fontSize); leftRenderer->setColor(color); leftRenderer->setOpacity(opacity); pushToContainer(leftRenderer); } addNewLine(); handleTextRenderer(cutWords.c_str(), fontName, fontSize, color, opacity); } else { textRenderer->setColor(color); textRenderer->setOpacity(opacity); pushToContainer(textRenderer); } }
void RichText::handleTextRenderer(const std::string& text, const std::string& fontName, float fontSize, const Color3B &color, GLubyte opacity) { auto fileExist = FileUtils::getInstance()->isFileExist(fontName); Label* textRenderer = nullptr; if (fileExist) { textRenderer = Label::createWithTTF(text, fontName, fontSize); } else { textRenderer = Label::createWithSystemFont(text, fontName, fontSize); } float textRendererWidth = textRenderer->getContentSize().width; _leftSpaceWidth -= textRendererWidth; if (_leftSpaceWidth < 0.0f) { float overstepPercent = (-_leftSpaceWidth) / textRendererWidth; std::string curText = text; size_t stringLength = StringUtils::getCharacterCountInUTF8String(text); int leftLength = stringLength * (1.0f - overstepPercent); //The minimum cut length is 1, otherwise will cause the infinite loop. if (0 == leftLength) leftLength = 1; std::string leftWords = Helper::getSubStringOfUTF8String(curText,0,leftLength); std::string cutWords = Helper::getSubStringOfUTF8String(curText, leftLength, stringLength - leftLength); if (leftLength > 0) { Label* leftRenderer = nullptr; if (fileExist) { leftRenderer = Label::createWithTTF(Helper::getSubStringOfUTF8String(leftWords, 0, leftLength), fontName, fontSize); } else { leftRenderer = Label::createWithSystemFont(Helper::getSubStringOfUTF8String(leftWords, 0, leftLength), fontName, fontSize); } if (leftRenderer) { leftRenderer->setColor(color); leftRenderer->setOpacity(opacity); pushToContainer(leftRenderer); } } addNewLine(); handleTextRenderer(cutWords.c_str(), fontName, fontSize, color, opacity); } else { textRenderer->setColor(color); textRenderer->setOpacity(opacity); pushToContainer(textRenderer); } }
void RichText::handleTextRenderer(const std::string& text, const std::string& fontName, float fontSize, const Color3B &color, GLubyte opacity) { auto fileExist = FileUtils::getInstance()->isFileExist(fontName); Label* textRenderer = nullptr; if (fileExist) { textRenderer = Label::createWithTTF(text, fontName, fontSize); } else { textRenderer = Label::createWithSystemFont(text, fontName, fontSize); } float textRendererWidth = textRenderer->getContentSize().width; _leftSpaceWidth -= textRendererWidth; if (_leftSpaceWidth < 0.0f) { float overstepPercent = (-_leftSpaceWidth) / textRendererWidth; std::string curText = text; size_t stringLength = _calcCharCount(text.c_str()); int leftLength = stringLength * (1.0f - overstepPercent); std::string leftWords = curText.substr(0, leftLength); std::string cutWords = curText.substr(leftLength, curText.length()-1); if (leftLength > 0) { Label* leftRenderer = nullptr; if (fileExist) { leftRenderer = Label::createWithTTF(leftWords.substr(0, leftLength).c_str(), fontName, fontSize); } else { leftRenderer = Label::createWithSystemFont(leftWords.substr(0, leftLength).c_str(), fontName, fontSize); } if (leftRenderer) { leftRenderer->setColor(color); leftRenderer->setOpacity(opacity); pushToContainer(leftRenderer); } } addNewLine(); handleTextRenderer(cutWords.c_str(), fontName, fontSize, color, opacity); } else { textRenderer->setColor(color); textRenderer->setOpacity(opacity); pushToContainer(textRenderer); } }
void RichText::formatText() { if (_formatTextDirty) { _elementRenderersContainer->removeAllChildren(); _elementRenders.clear(); if (_ignoreSize) { addNewLine(); for (ssize_t i=0; i<_richElements.size(); i++) { RichElement* element = _richElements.at(i); Node* elementRenderer = nullptr; switch (element->_type) { case RichElement::Type::TEXT: { RichElementText* elmtText = static_cast<RichElementText*>(element); if (FileUtils::getInstance()->isFileExist(elmtText->_fontName)) { elementRenderer = Label::createWithTTF(elmtText->_text.c_str(), elmtText->_fontName, elmtText->_fontSize); } else { elementRenderer = Label::createWithSystemFont(elmtText->_text.c_str(), elmtText->_fontName, elmtText->_fontSize); } break; } case RichElement::Type::IMAGE: { RichElementImage* elmtImage = static_cast<RichElementImage*>(element); elementRenderer = Sprite::create(elmtImage->_filePath.c_str()); break; } case RichElement::Type::CUSTOM: { RichElementCustomNode* elmtCustom = static_cast<RichElementCustomNode*>(element); elementRenderer = elmtCustom->_customNode; break; } default: break; } elementRenderer->setColor(element->_color); elementRenderer->setOpacity(element->_opacity); pushToContainer(elementRenderer); } } else { addNewLine(); for (ssize_t i=0; i<_richElements.size(); i++) { RichElement* element = static_cast<RichElement*>(_richElements.at(i)); switch (element->_type) { case RichElement::Type::TEXT: { RichElementText* elmtText = static_cast<RichElementText*>(element); handleTextRenderer(elmtText->_text.c_str(), elmtText->_fontName.c_str(), elmtText->_fontSize, elmtText->_color, elmtText->_opacity); break; } case RichElement::Type::IMAGE: { RichElementImage* elmtImage = static_cast<RichElementImage*>(element); handleImageRenderer(elmtImage->_filePath.c_str(), elmtImage->_color, elmtImage->_opacity); break; } case RichElement::Type::CUSTOM: { RichElementCustomNode* elmtCustom = static_cast<RichElementCustomNode*>(element); handleCustomRenderer(elmtCustom->_customNode); break; } default: break; } } } formarRenderers(); _formatTextDirty = false; } }
void RTContent::handleTextRenderer(const std::string& text, const std::string& fontName, float fontSize, const Color3B &color, GLubyte opacity) { auto fileExist = FileUtils::getInstance()->isFileExist(fontName); Label* textRenderer = nullptr; if (fileExist) { textRenderer = Label::createWithTTF(text, fontName, fontSize); } else { textRenderer = Label::createWithSystemFont(text, fontName, fontSize); } float textRendererWidth = textRenderer->getContentSize().width; float tmpLeftSpaceWidth = _leftSpaceWidth; tmpLeftSpaceWidth -= textRendererWidth; if (tmpLeftSpaceWidth < 0.0f) { //percent cut words float overstepPercent = (-tmpLeftSpaceWidth) / textRendererWidth; std::string curText = text; size_t stringLength = StringUtils::getCharacterCountInUTF8String(text); int leftLength = stringLength * (1.0f - overstepPercent); std::string leftWords = Helper::getSubStringOfUTF8String(curText, 0, leftLength); std::string cutWords = Helper::getSubStringOfUTF8String(curText, leftLength, stringLength - leftLength); Label* leftRenderer = nullptr; if (leftWords.length() > 0) { if (fileExist) { leftRenderer = Label::createWithTTF(leftWords, fontName, fontSize); } else { leftRenderer = Label::createWithSystemFont(leftWords, fontName, fontSize); } } if (!leftRenderer) { return; } // 处理需截文本字宽度不均,前半部分超出的情况 例如 "测试文本测试文本12341234",取宽度10/16 前半部分宽度10则超出很多 while (true) { if (leftWords.length() > 0) { leftRenderer->setString(leftWords); float leftRendererWidth = leftRenderer->getContentSize().width; tmpLeftSpaceWidth = _leftSpaceWidth; tmpLeftSpaceWidth -= leftRendererWidth; if (tmpLeftSpaceWidth < 0.0f) { int leftWordsLen = (int)leftWords.length(); if (leftWordsLen <= 0) { break; } else { //cut char one by one to get the fit length while (true) { leftLength -= 1; leftWords = Helper::getSubStringOfUTF8String(curText, 0, leftLength); cutWords = Helper::getSubStringOfUTF8String(curText, leftLength, stringLength - leftLength); if (leftWords.length() == 0) { break; } if (leftWords.length() < leftWordsLen) { break; } } } } else { //if _leftSpaceWidth > 0 break break; } } else { //if leftWords is empty, break break; } } // 处理需截文本字宽度不均,后半部分超出的情况 例如 "12341234测试文本测试文本",取宽度10/16 前半部分宽度10则缺少很多 std::string lastLeftWords = leftWords; std::string lastCutWords = cutWords; float lastTmpLeftSpaceWidth = tmpLeftSpaceWidth; while (true) { if (cutWords.length() > 0) { int leftWordsLen = (int)leftWords.length(); while (true) { leftLength += 1; leftWords = Helper::getSubStringOfUTF8String(curText, 0, leftLength); cutWords = Helper::getSubStringOfUTF8String(curText, leftLength, stringLength - leftLength); if (cutWords.length() == 0) { break; } if (leftWords.length() > leftWordsLen) { break; } } leftRenderer->setString(leftWords); float leftRendererWidth = leftRenderer->getContentSize().width; tmpLeftSpaceWidth = _leftSpaceWidth; tmpLeftSpaceWidth -= leftRendererWidth; if (tmpLeftSpaceWidth < 0.0f) { leftWords = lastLeftWords; cutWords = lastCutWords; tmpLeftSpaceWidth = lastTmpLeftSpaceWidth; leftRenderer->setString(leftWords); break; } else { lastLeftWords = leftWords; lastCutWords = cutWords; lastTmpLeftSpaceWidth = tmpLeftSpaceWidth; } } else { //if cutWords is empty, break leftWords = lastLeftWords; cutWords = lastCutWords; tmpLeftSpaceWidth = lastTmpLeftSpaceWidth; leftRenderer->setString(leftWords); break; } } _leftSpaceWidth = tmpLeftSpaceWidth; leftRenderer->setColor(color); leftRenderer->setOpacity(opacity); pushToContainer(leftRenderer); _leftSpaceWidth = tmpLeftSpaceWidth; addNewLine(); handleTextRenderer(cutWords.c_str(), fontName, fontSize, color, opacity); } else { _leftSpaceWidth = tmpLeftSpaceWidth; textRenderer->setColor(color); textRenderer->setOpacity(opacity); pushToContainer(textRenderer); } }
void RichText::formatText() { if (_formatTextDirty) { _elementRenderersContainer->removeAllChildren(); _elementRenders.clear(); if (_ignoreSize) { addNewLine(); for (unsigned int i=0; i<_richElements->count(); i++) { RichElement* element = static_cast<RichElement*>(_richElements->objectAtIndex(i)); CCNode* elementRenderer = NULL; switch (element->_type) { case RICH_TEXT: { RichElementText* elmtText = static_cast<RichElementText*>(element); elementRenderer = CCLabelTTF::create(elmtText->_text.c_str(), elmtText->_fontName.c_str(), elmtText->_fontSize); break; } case RICH_IMAGE: { RichElementImage* elmtImage = static_cast<RichElementImage*>(element); elementRenderer = CCSprite::create(elmtImage->_filePath.c_str()); break; } case RICH_CUSTOM: { RichElementCustomNode* elmtCustom = static_cast<RichElementCustomNode*>(element); elementRenderer = elmtCustom->_customNode; break; } default: break; } CCRGBAProtocol* colorRenderer = dynamic_cast<CCRGBAProtocol*>(elementRenderer); colorRenderer->setColor(element->_color); colorRenderer->setOpacity(element->_opacity); pushToContainer(elementRenderer); } } else { addNewLine(); for (unsigned int i=0; i<_richElements->count(); i++) { RichElement* element = static_cast<RichElement*>(_richElements->objectAtIndex(i)); switch (element->_type) { case RICH_TEXT: { RichElementText* elmtText = static_cast<RichElementText*>(element); handleTextRenderer(elmtText->_text.c_str(), elmtText->_fontName.c_str(), elmtText->_fontSize, elmtText->_color, elmtText->_opacity); break; } case RICH_IMAGE: { RichElementImage* elmtImage = static_cast<RichElementImage*>(element); handleImageRenderer(elmtImage->_filePath.c_str(), elmtImage->_color, elmtImage->_opacity); break; } case RICH_CUSTOM: { RichElementCustomNode* elmtCustom = static_cast<RichElementCustomNode*>(element); handleCustomRenderer(elmtCustom->_customNode); break; } default: break; } } } formarRenderers(); _formatTextDirty = false; } }