void RSimpleHTMLParser::textHandler(void *ctx, const char *s, int len)
{
	//CCLog("[Parser Text]%s", s);

	CCAssert(m_rCurrentElement, "[CCRich]: must specify a parent element!");

	unsigned short* utf16str = cc_utf8_to_utf16(s);
	size_t utf16size = cc_wcslen(utf16str);

	if ( utf16size == 0 )
		return;

	for ( size_t i = 0; i < utf16size; i++ )
	{
		REleGlyph* ele = new REleGlyph(utf16str[i]);
		if ( ele->parse(this) )
		{
			m_rCurrentElement->addChildren(ele);
		}
		else
		{
			CC_SAFE_DELETE(ele);
		}
	}

	CC_SAFE_DELETE_ARRAY(utf16str);
}
Esempio n. 2
0
void Label::updateContent()
{
    auto utf16String = cc_utf8_to_utf16(_originalUTF8String.c_str());
    setCurrentString(utf16String);
    setOriginalString(utf16String);
    if (_textSprite)
    {
        Node::removeChild(_textSprite,true);
        _textSprite = nullptr;
        if (_shadowNode)
        {
            Node::removeChild(_shadowNode,true);
            _shadowNode = nullptr;
        }
    }
    if (_fontAtlas)
    {
        alignText();
    }
    else
    {
        _fontDefinition._fontFillColor.r = _textColor.r;
        _fontDefinition._fontFillColor.g = _textColor.g;
        _fontDefinition._fontFillColor.b = _textColor.b;

        createSpriteWithFontDefinition();
    }
    _contentDirty = false;
}
Esempio n. 3
0
unsigned short int  * Font::getUTF16Text(const char *text, int &outNumLetters) const
{
    unsigned short* utf16String = cc_utf8_to_utf16(text);
    
    if(!utf16String)
        return 0;
    
    outNumLetters = cc_wcslen(utf16String);
    return utf16String;
}
Esempio n. 4
0
void Label::setString(const std::string& text)
{
    if (!_fontAtlas || _commonLineHeight <= 0)
        return ;
    
    unsigned short* utf16String = cc_utf8_to_utf16(text.c_str());
    if(!utf16String)
        return ;
    _originalUTF8String = text;
    setCurrentString(utf16String);
    setOriginalString(utf16String);
    
    // align text
    alignText();
}
jsval c_string_to_jsval(JSContext* cx, const char* v, size_t length /* = -1 */) {
    if (v == NULL) {
        return JSVAL_NULL;
    }
    jsval ret = JSVAL_NULL;
    int utf16_size = 0;
    jschar* strUTF16 = (jschar*)cc_utf8_to_utf16(v, length, &utf16_size);

    if (strUTF16 && utf16_size > 0) {
        JSString* str = JS_NewUCStringCopyN(cx, strUTF16, utf16_size);
        if (str) {
            ret = STRING_TO_JSVAL(str);
        }
        delete[] strUTF16;
    }
    return ret;
}
    bool c_string_to_jsval(JSContext* cx, const char* v, JS::MutableHandleValue ret, size_t length) {
        if (v == NULL) {
            return false;
        }
        if (length == -1) {
            length = strlen(v);
        }

        JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET

        if (0 == length) {
            auto emptyStr = JS_NewStringCopyZ(cx, "");
            ret.set(JS::StringValue(emptyStr));
            return true;
        }

#if defined(_MSC_VER) && (_MSC_VER <= 1800)
        // NOTE: Visual Studio 2013 (Platform Toolset v120) is not fully C++11 compatible.
        // It also doesn't provide support for char16_t and std::u16string.
        // For more information, please see this article
        // https://blogs.msdn.microsoft.com/vcblog/2014/11/17/c111417-features-in-vs-2015-preview/
        int utf16_size = 0;
        const jschar* strUTF16 = (jschar*)cc_utf8_to_utf16(v, (int)length, &utf16_size);

        if (strUTF16 && utf16_size > 0) {
            JSString* str = JS_NewUCStringCopyN(cx, strUTF16, (size_t)utf16_size);
            if (str) {
                ret.set(JS::StringValue(str));
            }
            delete[] strUTF16;
        }
#else
        std::u16string strUTF16;
        bool ok = cocos2d::StringUtils::UTF8ToUTF16(std::string(v, length), strUTF16);

        if (ok && !strUTF16.empty()) {
            JSString* str = JS_NewUCStringCopyN(cx, reinterpret_cast<const char16_t*>(strUTF16.data()), strUTF16.size());
            if (str) {
                ret.set(JS::StringValue(str));
            }
        }
#endif

        return true;
    }
Esempio n. 7
0
bool Label::setText(const char *stringToRender, float lineWidth, TextHAlignment alignment, bool lineBreakWithoutSpaces)
{
    if (!_fontAtlas)
        return false;
    
    // carloX
    // reset the string
    resetCurrentString();
    
    
    _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;
}
GlyphDef * FontFreeType::getGlyphDefintionsForText(const char *pText, int &outNumGlyphs, bool UTF16text)
{
    unsigned short* utf16String = 0;
    
    if (UTF16text)
    {
        utf16String = (unsigned short*) pText;
    }
    else
    {
        utf16String = cc_utf8_to_utf16(pText);
    }
    
    //
    if  (!utf16String)
        return 0;
    
    int numChar = cc_wcslen(utf16String);
    if (!numChar)
        return 0;

    // allocate the needed Glyphs
    GlyphDef *pGlyphs = new GlyphDef[numChar];
    assert( pGlyphs != NULL );
    if (!pGlyphs)
        return 0;
    
    // sore result as CCRect
    for (int c=0; c<numChar; ++c)
    {
        Rect tempRect;
        
        if( !getBBOXFotChar(utf16String[c], tempRect) )
        {
            log("Warning: Cannot find definition for glyph: %c in font:%s", utf16String[c], _fontName.c_str());
            
            tempRect.origin.x       = 0;
            tempRect.origin.y       = 0;
            tempRect.size.width     = 0;
            tempRect.size.height    = 0;
            
            pGlyphs[c].setRect(tempRect);
            pGlyphs[c].setUTF16Letter(utf16String[c]);
            pGlyphs[c].setValid(false);
            pGlyphs[c].setPadding(_letterPadding);
            
        }
        else
        {
            
            pGlyphs[c].setRect(tempRect);
            pGlyphs[c].setUTF16Letter(utf16String[c]);
            pGlyphs[c].setPadding(_letterPadding);
            pGlyphs[c].setValid(true);
            
        }
    }
    
    outNumGlyphs = numChar;
    
    // free memory
    if (!UTF16text)
        delete [] utf16String;
    
    // done
    return pGlyphs;
}
Esempio n. 9
0
void Label::updateContent()
{
    auto utf16String = cc_utf8_to_utf16(_originalUTF8String.c_str());
    setCurrentString(utf16String);
    setOriginalString(utf16String);

    if (_textSprite)
    {
        Node::removeChild(_textSprite,true);
        _textSprite = nullptr;
        if (_shadowNode)
        {
            Node::removeChild(_shadowNode,true);
            _shadowNode = nullptr;
        }
    }

    if (_fontAtlas)
    {
        alignText();
    }
    else
    {
        _fontDefinition._fontName = _systemFont;
        _fontDefinition._fontSize = _systemFontSize;

        _fontDefinition._alignment = _hAlignment;
        _fontDefinition._vertAlignment = _vAlignment;

        _fontDefinition._dimensions.width = _labelWidth;
        _fontDefinition._dimensions.height = _labelHeight;

        _fontDefinition._fontFillColor.r = _textColor.r;
        _fontDefinition._fontFillColor.g = _textColor.g;
        _fontDefinition._fontFillColor.b = _textColor.b;

        _fontDefinition._shadow._shadowEnabled = false;

        if (_currLabelEffect == LabelEffect::OUTLINE && _outlineSize > 0)
        {
            _fontDefinition._stroke._strokeEnabled = true;
            _fontDefinition._stroke._strokeSize = _outlineSize;
            _fontDefinition._stroke._strokeColor.r = _effectColor.r;
            _fontDefinition._stroke._strokeColor.g = _effectColor.g;
            _fontDefinition._stroke._strokeColor.b = _effectColor.b;
        }
        else
        {
            _fontDefinition._stroke._strokeEnabled = false;
        }

#if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) && (CC_TARGET_PLATFORM != CC_PLATFORM_IOS)
        if (_fontDefinition._stroke._strokeEnabled)
        {
            CCLOGERROR("Currently only supported on iOS and Android!");
        }
        _fontDefinition._stroke._strokeEnabled = false;
#endif

        createSpriteWithFontDefinition();
    }
    _contentDirty = false;
}