CalculatePrintedSize() public method

Get the printed size of the specified string. The returned value is in local coordinates. Multiply by transform's scale to get pixels.
public CalculatePrintedSize ( string text, bool encoding, SymbolStyle symbolStyle ) : Vector2
text string
encoding bool
symbolStyle SymbolStyle
return Vector2
コード例 #1
0
    void CalculateEmotionSpace(ref string text, out Vector2 LeftSideSpace, out int nNextLineNum, out bool needShow)
    {
        nNextLineNum  = 0;
        LeftSideSpace = Vector2.zero;
        needShow      = true;

        if (null == m_Font)
        {
            m_Font = m_ChatText.font;
            if (m_Font != null)
            {
                m_ChatTextHeight = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.None).y;
                SPACE_WIDTH      = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.Uncolored).x;
            }
        }

        string striptext = NGUITools.StripSymbols(text);

        int stripEmotionStart = striptext.IndexOf("[em=");

        LeftSideSpace = m_Font.CalculatePrintedSize(striptext.Substring(0, stripEmotionStart), true, UIFont.SymbolStyle.None);
//        float fEllipsisWidth = m_Font.CalculatePrintedSize("...", true, UIFont.SymbolStyle.None).x;
//         if (LeftSideSpace.x + EMOTIONITEM_WIDTH > labelChatText.GetComponent<UIWidget>().width * MaxLines - fEllipsisWidth)
//         {
//             needShow = false;
//             return;
//         }

        int nLineStart = 0;

        for (int i = nLineStart + 1; i <= stripEmotionStart; i++)
        {
            float fChatWidth = m_Font.CalculatePrintedSize(striptext.Substring(nLineStart, i - nLineStart), true, UIFont.SymbolStyle.None).x;
            if (i == stripEmotionStart)
            {
                if (fChatWidth > m_ChatText.width)
                {
                    nNextLineNum    += 1;
                    LeftSideSpace.x -= m_Font.CalculatePrintedSize(striptext.Substring(nLineStart, i - nLineStart - 1), true, UIFont.SymbolStyle.Uncolored).x;
                    nLineStart       = i - 1;
                }
                else if (fChatWidth + SPACE_WIDTH > m_ChatText.width)
                {
                    nNextLineNum   += 1;
                    LeftSideSpace.x = 0;
                }
            }
            else
            {
                if (fChatWidth > m_ChatText.width)
                {
                    nNextLineNum    += 1;
                    LeftSideSpace.x -= m_Font.CalculatePrintedSize(striptext.Substring(nLineStart, i - nLineStart - 1), true, UIFont.SymbolStyle.Uncolored).x;
                    nLineStart       = i - 1;
                }
            }
        }
    }
コード例 #2
0
ファイル: UILabel.cs プロジェクト: happylays/tbb2
    /// <summary>
    /// ADD BY XIONGHUI
    /// Processors the display model text.
    /// Log编号:	1
    /// 修改描述:	多行自动添加"..."逻辑
    /// 作者:		袁陈晨
    /// 修改日期;	2015-08-18
    /// </summary>
    void ProcessorPartialText(string str)
    {
        if (!mPartial)
        {
            return;
        }

        float reduceWidth = (mFont.CalculatePrintedSize("...", mEncoding, mSymbols).x) * cachedTransform.localScale.x;
        float screenWidth = mMaxLineWidth * mMaxLineCount - reduceWidth;

        mPartialText = "";

        float realLineWidth   = 0;              // 当前操作行实际已用长度
        float realRemainWidth = screenWidth;    // 操作字符串实际剩余可写长度

        for (int i = 0; i < str.Length; i++)
        {
            char  c         = str[i];
            float charWidth = mFont.CalculatePrintedSize(c.ToString(), mEncoding, mSymbols).x *cachedTransform.localScale.x;

            if (realRemainWidth < charWidth)
            {
                mPartialText += "...";
                break;
            }

            if (c == '[')
            {
                int retVal = NGUITools.ParseSymbol(str, i, null, false);

                if (retVal > 0)
                {
                    for (int j = i; j < i + retVal; j++)
                    {
                        c             = str[j];
                        mPartialText += c;
                    }
                    i += retVal - 1;
                    continue;
                }
            }

            realLineWidth += charWidth;

            // 当前操作行超长,进行换行处理
            if (realLineWidth > mMaxLineWidth)
            {
                realRemainWidth = realRemainWidth - (mMaxLineWidth + charWidth - realLineWidth);                        // 删除当前行多余空白长度
                realLineWidth   = charWidth;
            }

            realRemainWidth -= charWidth;

            mPartialText += c;
        }
    }
コード例 #3
0
 void Awake()
 {
     m_Font = m_ChatText.font;
     if (m_Font != null)
     {
         m_ChatTextHeight = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.None).y;
         SPACE_WIDTH      = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.Uncolored).x;
     }
     EmotionRootPos = m_EmotionRoot.transform.localPosition;
 }
コード例 #4
0
ファイル: NGUIFont.cs プロジェクト: stv1024/PopVille
        /// <summary>
        /// Ctor
        /// </summary>
        /// <param name="face">Font name</param>
        /// <param name="size">Font size</param>
        /// <param name="bold">Bold flag</param>
        /// <param name="italic">Italic flag</param>
        public NGUIFont(string face, int size, bool bold, bool italic)
            : base(face, size, bold, italic)
        {
            // load from resources
            var uiFontTemplate = Resources.Load("fonts/" + face, typeof(UIFont)) as UIFont;

            // showing error if font not found
            if (uiFontTemplate == null)
            {
                Debug.LogError("Could not load font: " + face);
                return;
            }

            uiFont = UnityEngine.GameObject.Instantiate(uiFontTemplate) as UIFont;
            Object.DontDestroyOnLoad(uiFont);
            var cachedHtmlFontsGo = GameObject.Find("/cachedHtmlFonts");

            if (cachedHtmlFontsGo == null)
            {
                cachedHtmlFontsGo = new GameObject("cachedHtmlFonts");
                UnityEngine.Object.DontDestroyOnLoad(cachedHtmlFontsGo);
            }
            uiFont.transform.parent = cachedHtmlFontsGo.transform;
            uiFont.name             = string.Format("{0}{1}{2}{3}", face, size, bold ? "b" : "", italic ? "i" : "");
            uiFont.dynamicFontSize  = size;
            if (uiFont.isDynamic)
            {
                if (bold && italic)
                {
                    uiFont.dynamicFontStyle = FontStyle.BoldAndItalic;
                }
                else if (bold)
                {
                    uiFont.dynamicFontStyle = FontStyle.Bold;
                }
                else if (italic)
                {
                    uiFont.dynamicFontStyle = FontStyle.Italic;
                }
                else
                {
                    uiFont.dynamicFontStyle = FontStyle.Normal;
                }
            }

            // calculating whitesize
            uiFont.Request(" .");
            whiteSize       = (int)(uiFont.CalculatePrintedSize(" .", true, UIFont.SymbolStyle.None).x);
            this.whiteSize -= (int)(uiFont.CalculatePrintedSize(".", true, UIFont.SymbolStyle.None).x);
        }
コード例 #5
0
ファイル: NGUIFont.cs プロジェクト: stv1024/PopVille
        /// <summary>
        /// Measuring text width and height
        /// </summary>
        /// <param name="text">text to measure</param>
        /// <returns>width and height of measured text</returns>
        public override HtSize Measure(string text)
        {
            uiFont.Request(text);
            var r = uiFont.CalculatePrintedSize(text, false, UIFont.SymbolStyle.None);

            return(new HtSize((int)r.x, (int)r.y));
        }
コード例 #6
0
    void UpdateEmotionLinkPos(string strChatFull)
    {
        if (null == m_Font)
        {
            m_Font = m_ChatText.font;
            if (m_Font != null)
            {
                m_ChatTextHeight = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.None).y;
                SPACE_WIDTH      = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.Uncolored).x;
            }
        }

        float fChatWidth = m_Font.CalculatePrintedSize(strChatFull.Replace(Environment.NewLine, ""), true, UIFont.SymbolStyle.None).x;
        int   moveHeight = Mathf.CeilToInt(fChatWidth / m_ChatText.width) - 1;

        m_EmotionRoot.transform.localPosition += new Vector3(0, moveHeight * m_ChatTextHeight, 0);
        m_LinkRoot.transform.localPosition    += new Vector3(0, moveHeight * m_ChatTextHeight, 0);
    }
コード例 #7
0
 void Awake()
 {
     m_Instance = this;
     if (m_Font == null)
     {
         m_Font           = labelChatText2.font;
         m_ChatTextHeight = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.None).y;
         SPACE_WIDTH      = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.Uncolored).x;
         if (m_ChatTextHeight != 0)
         {
             MaxLines = (int)(labelChatText2.height / m_ChatTextHeight);
         }
         else
         {
             MaxLines = 1;
         }
     }
 }
コード例 #8
0
    /// <summary>
    /// Process the raw text, called when something changes.
    /// </summary>

    void ProcessText()
    {
        mChanged   = true;
        hasChanged = false;
        mLastText  = mText;

        mProcessedText = mText;
        if (TranslateReturn)
        {
            mProcessedText = mText.Replace("\\n", "\n");
        }

        if (mPassword)
        {
            string hidden = "";

            if (mShowLastChar)
            {
                for (int i = 0, imax = mProcessedText.Length - 1; i < imax; ++i)
                {
                    hidden += "*";
                }
                if (mProcessedText.Length > 0)
                {
                    hidden += mProcessedText[mProcessedText.Length - 1];
                }
            }
            else
            {
                for (int i = 0, imax = mProcessedText.Length; i < imax; ++i)
                {
                    hidden += "*";
                }
            }
            mProcessedText = mFont.WrapText(hidden, mMaxLineWidth / cachedTransform.localScale.x,
                                            mMaxLineCount, false, UIFont.SymbolStyle.None);
        }
        else if (mMaxLineWidth > 0)
        {
            mProcessedText = mFont.WrapText(mProcessedText, mMaxLineWidth / cachedTransform.localScale.x, mMaxLineCount, mEncoding, mSymbols, mSpacingX);
        }
        else if (mMaxLineCount > 0)
        {
            mProcessedText = mFont.WrapText(mProcessedText, 100000f, mMaxLineCount, mEncoding, mSymbols, mSpacingX);
        }

        mSize = !string.IsNullOrEmpty(mProcessedText) ? mFont.CalculatePrintedSize(mProcessedText, mEncoding, mSymbols, mSpacingX, mSpacingY, TranslateReturn) : Vector2.one;
        float scale = cachedTransform.localScale.x;

        mSize.x = Mathf.Max(mSize.x, (mFont != null && scale > 1f) ? lineWidth / scale : 1f);
        mSize.y = Mathf.Max(mSize.y, 1f);
    }
コード例 #9
0
    void Awake()
    {
        m_Instance = this;
        if (m_Font == null)
        {
            m_Font           = labelChatText2.font;
            m_ChatTextHeight = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.None).y;
            SPACE_WIDTH      = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.Uncolored).x;
            if (m_ChatTextHeight != 0)
            {
                MaxLines = (int)(labelChatText2.height / m_ChatTextHeight);
            }
            else
            {
                MaxLines = 1;
            }
        }

        m_curSelect = 0;
        InitTextPos();
        InitEmotionButtons();
        InitAnoymousTabBtn();
    }
コード例 #10
0
ファイル: UILabel.cs プロジェクト: yazici/FRONTIERS
    /// <summary>
    /// Process the raw text, called when something changes.
    /// </summary>

    void ProcessText()
    {
        mChanged       = true;
        hasChanged     = false;
        mLastText      = mText;
        mProcessedText = mText.Replace("\\n", "\n");

        if (mPassword)
        {
            mProcessedText = mFont.WrapText(mProcessedText, 100000f, false, false);

            string hidden = "";

            if (mShowLastChar)
            {
                for (int i = 1, imax = mProcessedText.Length; i < imax; ++i)
                {
                    hidden += "*";
                }
                if (mProcessedText.Length > 0)
                {
                    hidden += mProcessedText[mProcessedText.Length - 1];
                }
            }
            else
            {
                for (int i = 0, imax = mProcessedText.Length; i < imax; ++i)
                {
                    hidden += "*";
                }
            }
            mProcessedText = hidden;
        }
        else if (mMaxLineWidth > 0)
        {
            mProcessedText = mFont.WrapText(mProcessedText, mMaxLineWidth / cachedTransform.localScale.x, mMultiline, mEncoding);
        }
        else if (!mMultiline)
        {
            mProcessedText = mFont.WrapText(mProcessedText, 100000f, false, mEncoding);
        }

        mSize = !string.IsNullOrEmpty(mProcessedText) ? mFont.CalculatePrintedSize(mProcessedText, mEncoding) : Vector2.one;
        float scale = cachedTransform.localScale.x;

        mSize.x = Mathf.Max(mSize.x, (mFont != null && scale > 1f) ? lineWidth / scale : 1f);
        mSize.y = Mathf.Max(mSize.y, 1f);
    }
コード例 #11
0
    /// <summary>
    /// Process the raw text, called when something changes.
    /// </summary>

    void ProcessText()
    {
        mChanged       = true;
        hasChanged     = false;
        mLastText      = mText;
        mProcessedText = mText;

        if (mPassword)
        {
            string hidden = "";

            if (mShowLastChar)
            {
                for (int i = 0, imax = mProcessedText.Length - 1; i < imax; ++i)
                {
                    hidden += "*";
                }
                if (mProcessedText.Length > 0)
                {
                    hidden += mProcessedText[mProcessedText.Length - 1];
                }
            }
            else
            {
                for (int i = 0, imax = mProcessedText.Length; i < imax; ++i)
                {
                    hidden += "*";
                }
            }
            mProcessedText = mFont.WrapText(hidden, mMaxLineWidth / cachedTransform.localScale.x,
                                            mMaxLineCount, false, UIFont.SymbolStyle.None);
        }
        else if (!mShrinkToFit)
        {
            if (mMaxLineWidth > 0)
            {
                mProcessedText = mFont.WrapText(mProcessedText, mMaxLineWidth / cachedTransform.localScale.x, mMaxLineCount, mEncoding, mSymbols);
            }
            else if (mMaxLineCount > 0)
            {
                mProcessedText = mFont.WrapText(mProcessedText, 100000f, mMaxLineCount, mEncoding, mSymbols);
            }
        }

        float scale = Mathf.Abs(cachedTransform.localScale.x);

        mSize = !string.IsNullOrEmpty(mProcessedText) ? mFont.CalculatePrintedSize(mProcessedText, mEncoding, mSymbols) : Vector2.one;

        if (mShrinkToFit && mMaxLineWidth > 0)
        {
            // We want to shrink the label (when it doesn't fit)
            if (scale > 0f)
            {
                float maxSize = (float)mMaxLineWidth / mFont.size;
                scale = (mSize.x > maxSize) ? (maxSize / mSize.x) * mFont.size : mFont.size;
                cachedTransform.localScale = new Vector3(scale, scale, 1f);
            }
            else
            {
                mSize.x = 1f;
                cachedTransform.localScale = new Vector3(mFont.size, mFont.size, 1f);
            }
        }
        else
        {
            mSize.x = Mathf.Max(mSize.x, (scale > 0f) ? lineWidth / scale : 1f);
        }

        mSize.y = Mathf.Max(mSize.y, 1f);
    }
コード例 #12
0
    /// <summary>
    /// Process the raw text, called when something changes.
    /// </summary>

    void ProcessText(bool legacyMode)
    {
        if (mFont == null)
        {
            return;
        }

        mChanged   = true;
        hasChanged = false;

        float invSize   = 1f / mFont.pixelSize;
        float printSize = Mathf.Abs(legacyMode ? cachedTransform.localScale.x : mFont.size);
        float lw        = legacyMode ? (mMaxLineWidth != 0 ? mMaxLineWidth * invSize : 1000000) : width * invSize;
        float lh        = legacyMode ? (mMaxLineHeight != 0 ? mMaxLineHeight * invSize : 1000000) : height * invSize;

        if (printSize > 0f)
        {
            for (;;)
            {
                mScale = printSize / mFont.size;

                bool fits = true;

                int pw = (mOverflow == Overflow.ResizeFreely) ? 100000 : Mathf.RoundToInt(lw / mScale);
                int ph = (mOverflow == Overflow.ResizeFreely || mOverflow == Overflow.ResizeHeight) ?
                         100000 : Mathf.RoundToInt(lh / mScale);

                if (mPassword)
                {
                    mProcessedText = "";

                    if (mShowLastChar)
                    {
                        for (int i = 0, imax = mText.Length - 1; i < imax; ++i)
                        {
                            mProcessedText += "*";
                        }
                        if (mText.Length > 0)
                        {
                            mProcessedText += mText[mText.Length - 1];
                        }
                    }
                    else
                    {
                        for (int i = 0, imax = mText.Length; i < imax; ++i)
                        {
                            mProcessedText += "*";
                        }
                    }

                    fits = mFont.WrapText(mProcessedText, out mProcessedText, pw, ph, mMaxLineCount, false, UIFont.SymbolStyle.None);
                }
                else if (lw > 0f || lh > 0f)
                {
                    fits = mFont.WrapText(mText, out mProcessedText, pw, ph, mMaxLineCount, mEncoding, mSymbols);
                }
                else
                {
                    mProcessedText = mText;
                }

                // Remember the final printed size
                mSize = !string.IsNullOrEmpty(mProcessedText) ? mFont.CalculatePrintedSize(mProcessedText, mEncoding, mSymbols) : Vector2.zero;

                if (mOverflow == Overflow.ResizeFreely)
                {
                    mWidth  = Mathf.RoundToInt(mSize.x * mFont.pixelSize);
                    mHeight = Mathf.RoundToInt(mSize.y * mFont.pixelSize);
                }
                else if (mOverflow == Overflow.ResizeHeight)
                {
                    mHeight = Mathf.RoundToInt(mSize.y * mFont.pixelSize);
                }
                else if (mOverflow == Overflow.ShrinkContent && !fits)
                {
                    printSize = Mathf.Round(printSize - 1f);
                    if (printSize > 1f)
                    {
                        continue;
                    }
                }

                // Upgrade to the new system
                if (legacyMode)
                {
                    width  = Mathf.RoundToInt(mSize.x * mFont.pixelSize);
                    height = Mathf.RoundToInt(mSize.y * mFont.pixelSize);
                    cachedTransform.localScale = Vector3.one;
                }
                break;
            }
        }
        else
        {
            cachedTransform.localScale = Vector3.one;
            mProcessedText             = "";
            mScale = 1f;
        }
    }
コード例 #13
0
    // Use this for initialization
    void Start()
    {
        m_FirstChild.SetActive(true);
        //InvokeRepeating("CheckNotifyData", 1, 1);

        m_ChatTextHeight = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.None).y;
        SPACE_WIDTH      = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.Uncolored).x;
        if (m_ChatTextHeight != 0)
        {
            MaxLines = (int)(labelChatText2.height / m_ChatTextHeight);
        }
        else
        {
            MaxLines = 2;
        }
        InitTextPos();

        labelChatText = labelChatText2;
        m_LinkRoot    = m_LinkRoot2;
        m_EmotionRoot = m_EmotionRoot2;

        //         if (null != ClipPanel)
        //         {
        //             m_ClipPanelTransform = ClipPanel.transform;
        //         }

        m_LocalPos = m_OffsetTrans.localPosition;
        clearItemList.Add(m_LinkRoot1);
        clearItemList.Add(m_EmotionRoot1);
        clearItemList.Add(m_LinkRoot2);
        clearItemList.Add(m_EmotionRoot2);

        //  InitPlayVoiceBtn();
    }
コード例 #14
0
    /// <summary>
    /// Get the printed size of the specified string. The returned value is in local coordinates. Multiply by transform's scale to get pixels.
    /// </summary>

    public Vector2 CalculatePrintedSize(string text, bool encoding, SymbolStyle symbolStyle)
    {
        if (mReplacement != null)
        {
            return(mReplacement.CalculatePrintedSize(text, encoding, symbolStyle));
        }

        Vector2 v = Vector2.zero;

        if (mFont != null && mFont.isValid && !string.IsNullOrEmpty(text))
        {
            if (encoding)
            {
                text = NGUITools.StripSymbols(text);
            }

            int length     = text.Length;
            int maxX       = 0;
            int x          = 0;
            int y          = 0;
            int prev       = 0;
            int lineHeight = (mFont.charSize + mSpacingY);

            for (int i = 0; i < length; ++i)
            {
                char c = text[i];

                // Start a new line
                if (c == '\n')
                {
                    if (x > maxX)
                    {
                        maxX = x;
                    }
                    x    = 0;
                    y   += lineHeight;
                    prev = 0;
                    continue;
                }

                // Skip invalid characters
                if (c < ' ')
                {
                    prev = 0; continue;
                }

                // See if there is a symbol matching this text
                BMSymbol symbol = (encoding && symbolStyle != SymbolStyle.None) ? mFont.MatchSymbol(text, i, length) : null;

                if (symbol == null)
                {
                    // Get the glyph for this character
                    BMGlyph glyph = mFont.GetGlyph(c);

                    if (glyph != null)
                    {
                        x   += mSpacingX + ((prev != 0) ? glyph.advance + glyph.GetKerning(prev) : glyph.advance);
                        prev = c;
                    }
                }
                else
                {
                    // Symbol found -- use it
                    x   += mSpacingX + symbol.width;
                    i   += symbol.length - 1;
                    prev = 0;
                }
            }

            // Convert from pixel coordinates to local coordinates
            float scale = (mFont.charSize > 0) ? 1f / mFont.charSize : 1f;
            v.x = scale * ((x > maxX) ? x : maxX);
            v.y = scale * (y + lineHeight);
        }
        return(v);
    }
コード例 #15
0
    public Vector2 CalculatePrintedSize(string text, bool encoding, SymbolStyle symbolStyle)
    {
        if (mReplacement != null)
        {
            return(mReplacement.CalculatePrintedSize(text, encoding, symbolStyle));
        }
        Vector2 zero      = Vector2.zero;
        bool    isDynamic = this.isDynamic;

        if (isDynamic || (mFont != null && mFont.isValid && !string.IsNullOrEmpty(text)))
        {
            if (encoding)
            {
                text = NGUITools.StripSymbols(text);
            }
            if (isDynamic)
            {
                Font.textureRebuilt += OnFontChanged;
                // mDynamicFont.textureRebuildCallback = OnFontChanged;
                mDynamicFont.RequestCharactersInTexture(text, mDynamicFontSize, mDynamicFontStyle);
                // mDynamicFont.textureRebuildCallback = null;
                Font.textureRebuilt -= OnFontChanged;
            }
            int  length = text.Length;
            int  num    = 0;
            int  num2   = 0;
            int  num3   = 0;
            int  num4   = 0;
            int  size   = this.size;
            int  num5   = size + mSpacingY;
            bool flag   = encoding && symbolStyle != 0 && hasSymbols;
            for (int i = 0; i < length; i++)
            {
                char c = text[i];
                if (c == '\n')
                {
                    if (num2 > num)
                    {
                        num = num2;
                    }
                    num2  = 0;
                    num3 += num5;
                    num4  = 0;
                }
                else if (c < ' ')
                {
                    num4 = 0;
                }
                else if (!isDynamic)
                {
                    BMSymbol bMSymbol = (!flag) ? null : MatchSymbol(text, i, length);
                    if (bMSymbol == null)
                    {
                        BMGlyph glyph = mFont.GetGlyph(c);
                        if (glyph != null)
                        {
                            num2 += mSpacingX + ((num4 == 0) ? glyph.advance : (glyph.advance + glyph.GetKerning(num4)));
                            num4  = c;
                        }
                    }
                    else
                    {
                        num2 += mSpacingX + bMSymbol.width;
                        i    += bMSymbol.length - 1;
                        num4  = 0;
                    }
                }
                else if (mDynamicFont.GetCharacterInfo(c, out mChar, mDynamicFontSize, mDynamicFontStyle))
                {
                    num2 += (int)((float)mSpacingX + mChar.width);
                }
            }
            float num6 = (size <= 0) ? 1f : (1f / (float)size);
            zero.x = num6 * (float)((num2 <= num) ? num : num2);
            zero.y = num6 * (float)(num3 + num5);
        }
        return(zero);
    }
コード例 #16
0
 string MakeNameLinkEnabled(string fulltext, ChatHistoryItem history)
 {
     if (history.SenderGuid != GlobeVar.INVALID_GUID && history.SenderName != "")
     {
         GameObject link = null;
         link = ResourceManager.LoadChatLink(m_LinkRoot);
         if (link != null)
         {
             UInt64  linkguid       = history.SenderGuid;
             string  linkname       = history.SenderName;
             string  stripText      = NGUITools.StripSymbols(fulltext);
             int     linkstart      = stripText.IndexOf(linkname) - 1;
             int     linkend        = stripText.IndexOf(linkname) + linkname.Length;
             Vector2 LeftSideSpace  = m_Font.CalculatePrintedSize(stripText.Substring(0, linkstart), true, UIFont.SymbolStyle.Uncolored);
             Vector2 RightSideSpace = m_Font.CalculatePrintedSize(stripText.Substring(0, linkend + 1), true, UIFont.SymbolStyle.Uncolored);
             link.transform.localPosition           = new Vector3((LeftSideSpace.x + RightSideSpace.x) / 2, m_ChatTextHeight / 2, 0);
             link.GetComponent <BoxCollider>().size = new Vector3(RightSideSpace.x - LeftSideSpace.x, m_ChatTextHeight, 0);
             link.GetComponent <ChatLinkLogic>().Init_NameLink(linkguid, linkname);
             fulltext = fulltext.Substring(0, linkstart) + "[FFFF10]" + fulltext.Substring(linkstart, linkname.Length + 2) + TEXT_COLOR + fulltext.Substring(linkend + 1);
         }
     }
     return(fulltext);
 }
コード例 #17
0
 void OnEnable()
 {
     m_Space_Height = m_Font.CalculatePrintedSize("  ", true, UIFont.SymbolStyle.None).y;
 }
コード例 #18
0
    /// <summary>
    /// Get the printed size of the specified string. The returned value is in pixels.
    /// </summary>
    ///change by chenzhiwei return value v.z is line count
    public Vector3 CalculatePrintedSize(string text, int size, bool encoding, SymbolStyle symbolStyle)
    {
        if (mReplacement != null)
        {
            return(mReplacement.CalculatePrintedSize(text, size, encoding, symbolStyle));
        }

#if DYNAMIC_FONT
        if (isDynamic)
        {
            return(NGUIText.CalculatePrintedSize(text, mDynamicFont, size, mDynamicFontStyle, encoding));
        }
#endif
        Vector3 v = Vector3.zero;

        if (mFont != null && mFont.isValid && !string.IsNullOrEmpty(text))
        {
            if (encoding)
            {
                text = NGUIText.StripSymbols(text);
            }

            int  length     = text.Length;
            int  maxX       = 0;
            int  x          = 0;
            int  y          = 0;
            int  prev       = 0;
            int  fs         = size;
            int  lineHeight = (fs + mSpacingY);
            bool useSymbols = encoding && symbolStyle != SymbolStyle.None && hasSymbols;

            for (int i = 0; i < length; ++i)
            {
                char c = text[i];

                // Start a new line
                if (c == '\n')
                {
                    if (x > maxX)
                    {
                        maxX = x;
                    }
                    x  = 0;
                    y += lineHeight;
                    v.z++;
                    prev = 0;
                    continue;
                }

                // Skip invalid characters
                if (c < ' ')
                {
                    prev = 0; continue;
                }

                // See if there is a symbol matching this text
                BMSymbol symbol = useSymbols ? MatchSymbol(text, i, length) : null;

                if (symbol == null)
                {
                    // Get the glyph for this character
                    BMGlyph glyph = mFont.GetGlyph(c);

                    if (glyph != null)
                    {
                        x   += mSpacingX + ((prev != 0) ? glyph.advance + glyph.GetKerning(prev) : glyph.advance);
                        prev = c;
                    }
                }
                else
                {
                    // Symbol found -- use it
                    x   += mSpacingX + symbol.width;
                    i   += symbol.length - 1;
                    prev = 0;
                }
            }

            // Convert from pixel coordinates to local coordinates
            v.x = ((x > maxX) ? x : maxX);
            v.y = (y + lineHeight);
            v.z++;
        }
        return(v);
    }
コード例 #19
0
ファイル: UILabel.cs プロジェクト: Jagerente/GucciGangMod
    private void ProcessText()
    {
        mChanged   = true;
        hasChanged = false;
        mLastText  = mText;
        var   b    = Mathf.Abs(cachedTransform.localScale.x);
        float num2 = mFont.size * mMaxLineCount;

        if (b <= 0f)
        {
            mSize.x = 1f;
            b       = mFont.size;
            cachedTransform.localScale = new Vector3(0.01f, 0.01f, 1f);
            mProcessedText             = string.Empty;
            goto Label_037C;
        }

Label_0057:
        if (mPassword)
        {
            mProcessedText = string.Empty;
            if (mShowLastChar)
            {
                var num3 = 0;
                var num4 = mText.Length - 1;
                while (num3 < num4)
                {
                    mProcessedText = mProcessedText + "*";
                    num3++;
                }

                if (mText.Length > 0)
                {
                    mProcessedText = mProcessedText + mText[mText.Length - 1];
                }
            }
            else
            {
                var num5   = 0;
                var length = mText.Length;
                while (num5 < length)
                {
                    mProcessedText = mProcessedText + "*";
                    num5++;
                }
            }

            mProcessedText = mFont.WrapText(mProcessedText, mMaxLineWidth / b, mMaxLineCount, false, UIFont.SymbolStyle.None);
        }
        else if (mMaxLineWidth > 0)
        {
            mProcessedText = mFont.WrapText(mText, mMaxLineWidth / b, !mShrinkToFit ? mMaxLineCount : 0, mEncoding, mSymbols);
        }
        else if (!mShrinkToFit && mMaxLineCount > 0)
        {
            mProcessedText = mFont.WrapText(mText, 100000f, mMaxLineCount, mEncoding, mSymbols);
        }
        else
        {
            mProcessedText = mText;
        }

        mSize = string.IsNullOrEmpty(mProcessedText) ? Vector2.one : mFont.CalculatePrintedSize(mProcessedText, mEncoding, mSymbols);
        if (mShrinkToFit)
        {
            if (mMaxLineCount > 0 && mSize.y * b > num2)
            {
                b = Mathf.Round(b - 1f);
                if (b > 1f)
                {
                    goto Label_0057;
                }
            }

            if (mMaxLineWidth > 0)
            {
                var num7 = mMaxLineWidth / b;
                var a    = mSize.x * b <= num7 ? b : num7 / mSize.x * b;
                b = Mathf.Min(a, b);
            }

            b = Mathf.Round(b);
            cachedTransform.localScale = new Vector3(b, b, 1f);
        }

        mSize.x = Mathf.Max(mSize.x, b <= 0f ? 1f : lineWidth / b);
Label_037C:
        mSize.y = Mathf.Max(mSize.y, 1f);
    }
コード例 #20
0
    private void ProcessText()
    {
        mChanged   = true;
        hasChanged = false;
        mLastText  = mText;
        Vector3 localScale = base.cachedTransform.localScale;
        float   num        = Mathf.Abs(localScale.x);
        float   num2       = mFont.size * mMaxLineCount;

        if (num > 0f)
        {
            while (true)
            {
                if (mPassword)
                {
                    mProcessedText = string.Empty;
                    if (mShowLastChar)
                    {
                        int i = 0;
                        for (int num3 = mText.Length - 1; i < num3; i++)
                        {
                            mProcessedText += "*";
                        }
                        if (mText.Length > 0)
                        {
                            mProcessedText += mText[mText.Length - 1];
                        }
                    }
                    else
                    {
                        int j = 0;
                        for (int length = mText.Length; j < length; j++)
                        {
                            mProcessedText += "*";
                        }
                    }
                    mProcessedText = mFont.WrapText(mProcessedText, (float)mMaxLineWidth / num, mMaxLineCount, encoding: false, UIFont.SymbolStyle.None);
                }
                else if (mMaxLineWidth > 0)
                {
                    mProcessedText = mFont.WrapText(mText, (float)mMaxLineWidth / num, (!mShrinkToFit) ? mMaxLineCount : 0, mEncoding, mSymbols);
                }
                else if (!mShrinkToFit && mMaxLineCount > 0)
                {
                    mProcessedText = mFont.WrapText(mText, 100000f, mMaxLineCount, mEncoding, mSymbols);
                }
                else
                {
                    mProcessedText = mText;
                }
                mSize = (string.IsNullOrEmpty(mProcessedText) ? Vector2.one : mFont.CalculatePrintedSize(mProcessedText, mEncoding, mSymbols));
                if (!mShrinkToFit)
                {
                    break;
                }
                if (mMaxLineCount > 0 && mSize.y * num > num2)
                {
                    num = Mathf.Round(num - 1f);
                    if (num > 1f)
                    {
                        continue;
                    }
                }
                if (mMaxLineWidth > 0)
                {
                    float num4 = (float)mMaxLineWidth / num;
                    float a    = (!(mSize.x * num > num4)) ? num : (num4 / mSize.x * num);
                    num = Mathf.Min(a, num);
                }
                num = Mathf.Round(num);
                base.cachedTransform.localScale = new Vector3(num, num, 1f);
                break;
            }
            mSize.x = Mathf.Max(mSize.x, (!(num > 0f)) ? 1f : ((float)lineWidth / num));
        }
        else
        {
            mSize.x = 1f;
            num     = mFont.size;
            base.cachedTransform.localScale = new Vector3(0.01f, 0.01f, 1f);
            mProcessedText = string.Empty;
        }
        mSize.y = Mathf.Max(mSize.y, 1f);
    }
コード例 #21
0
    /// <summary>
    /// 显示MessageBox
    /// </summary>
    /// <param name="strInfo">提示信息</param>
    /// <param name="eType">MessageBox类型</param>
    /// <param name="funcOKClicked">确定按钮响应函数</param>
    /// <param name="funcCancelClicked">取消按钮响应函数</param>
    public void ShowMessageBox(string title, string text, Games.GlobeDefine.GameDefine_Globe.MESSAGEBOX_TYPE eType)
    {
        if (TextHeight < 0)
        {
            TextHeight = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.None).y;
        }
        labelTitle.text = title;

        SetTextAnalyseSymbol(text);
        m_Type = (int)eType;
        switch (eType)
        {
        case Games.GlobeDefine.GameDefine_Globe.MESSAGEBOX_TYPE.TYPE_OK:
        {
            m_MessageBoxOKButton.SetActive(true);
            m_MessageBoxCancelButton.SetActive(false);
            //m_MessageBoxOKButton.transform.localPosition = btnCenterPos;
            m_TypeCost.SetActive(false);
            m_MessageInfo.SetActive(true);
        }
        break;

        case Games.GlobeDefine.GameDefine_Globe.MESSAGEBOX_TYPE.TYPE_OKCANCEL:
        {
            m_MessageBoxOKButton.SetActive(true);
            m_MessageBoxCancelButton.SetActive(true);
            //m_MessageBoxOKButton.transform.localPosition = btnLelfPos;
            //m_MessageBoxCancelButton.transform.localPosition = btnRightPos;
            m_TypeCost.SetActive(false);
            m_MessageInfo.SetActive(true);
        }
        break;

        case Games.GlobeDefine.GameDefine_Globe.MESSAGEBOX_TYPE.TYPE_WAIT:
        {
            m_MessageBoxOKButton.SetActive(false);
            m_MessageBoxCancelButton.SetActive(false);
            m_TypeCost.SetActive(false);
            m_MessageInfo.SetActive(true);
        }
        break;

        case Games.GlobeDefine.GameDefine_Globe.MESSAGEBOX_TYPE.TYPE_CANCEL:
        {
            m_MessageBoxOKButton.SetActive(false);
            m_MessageBoxCancelButton.SetActive(true);
            m_TypeCost.SetActive(false);
            m_MessageInfo.SetActive(true);
        }
        break;

        case Games.GlobeDefine.GameDefine_Globe.MESSAGEBOX_TYPE.TYPE_COST:
        {
            m_MessageBoxOKButton.SetActive(true);
            m_MessageBoxCancelButton.SetActive(true);
            m_TypeCost.SetActive(true);
            m_MessageInfo.SetActive(false);
            m_TypeCostLabel.text           = text;
            m_TypeCostSupplementLabel.text = m_costInfo._textSupplement;
            m_TypeCostDesc.text            = m_costInfo._costDesc;
            m_TypeCostCount.text           = m_costInfo._costCount;
            m_TypeCostIcon.spriteName      = m_costInfo._costIcon;
            //m_TypeCostIcon.MakePixelPerfect();
        }
        break;

        case Games.GlobeDefine.GameDefine_Globe.MESSAGEBOX_TYPE.TYPE_INVALID:
        default:
            break;
        }
        gameObject.SetActive(true);
    }
コード例 #22
0
    /// <summary>
    /// Process the raw text, called when something changes.
    /// </summary>

    void ProcessText(bool legacyMode)
    {
        if (!isValid)
        {
            return;
        }

        mChanged   = true;
        hasChanged = false;

        int   fs      = fontSize;
        float invFS   = 1f / fs;
        float ps      = pixelSize;
        float invSize = 1f / ps;
        float lw      = legacyMode ? (mMaxLineWidth != 0 ? mMaxLineWidth * invSize : 1000000) : width * invSize;
        float lh      = legacyMode ? (mMaxLineHeight != 0 ? mMaxLineHeight * invSize : 1000000) : height * invSize;

        mScale       = 1f;
        mPrintedSize = Mathf.Abs(legacyMode ? Mathf.RoundToInt(cachedTransform.localScale.x) : fs);

        NGUIText.current.size = fs;
        UpdateNGUIText();

        if (mPrintedSize > 0)
        {
            for (;;)
            {
                mScale = mPrintedSize * invFS;

                bool fits = true;

                NGUIText.current.lineWidth  = (mOverflow == Overflow.ResizeFreely) ? 1000000 : Mathf.RoundToInt(lw / mScale);
                NGUIText.current.lineHeight = (mOverflow == Overflow.ResizeFreely || mOverflow == Overflow.ResizeHeight) ?
                                              1000000 : Mathf.RoundToInt(lh / mScale);

                if (lw > 0f || lh > 0f)
                {
                    if (mFont != null)
                    {
                        fits = mFont.WrapText(mText, out mProcessedText);
                    }
#if DYNAMIC_FONT
                    else
                    {
                        fits = NGUIText.WrapText(mTrueTypeFont, mText, out mProcessedText);
                    }
#endif
                }
                else
                {
                    mProcessedText = mText;
                }

                // Remember the final printed size
                if (!string.IsNullOrEmpty(mProcessedText))
                {
                    if (mFont != null)
                    {
                        mCalculatedSize = mFont.CalculatePrintedSize(mProcessedText);
                    }
#if DYNAMIC_FONT
                    else
                    {
                        mCalculatedSize = NGUIText.CalculatePrintedSize(mTrueTypeFont, mProcessedText);
                    }
#endif
                }
                else
                {
                    mCalculatedSize = Vector2.zero;
                }

                if (mOverflow == Overflow.ResizeFreely)
                {
                    mWidth  = Mathf.RoundToInt(mCalculatedSize.x * ps);
                    mHeight = Mathf.RoundToInt(mCalculatedSize.y * ps);
                }
                else if (mOverflow == Overflow.ResizeHeight)
                {
                    mHeight = Mathf.RoundToInt(mCalculatedSize.y * ps);
                }
                else if (mOverflow == Overflow.ShrinkContent && !fits)
                {
                    if (--mPrintedSize > 1)
                    {
                        continue;
                    }
                }

                // Upgrade to the new system
                if (legacyMode)
                {
                    width  = Mathf.RoundToInt(mCalculatedSize.x * ps);
                    height = Mathf.RoundToInt(mCalculatedSize.y * ps);
                    cachedTransform.localScale = Vector3.one;
                }
                break;
            }
        }
        else
        {
            cachedTransform.localScale = Vector3.one;
            mProcessedText             = "";
            mScale = 1f;
        }
    }
コード例 #23
0
ファイル: UIFont.cs プロジェクト: Jagerente/GucciGangMod
    public Vector2 CalculatePrintedSize(string text, bool encoding, SymbolStyle symbolStyle)
    {
        if (mReplacement != null)
        {
            return(mReplacement.CalculatePrintedSize(text, encoding, symbolStyle));
        }

        var zero      = Vector2.zero;
        var isDynamic = this.isDynamic;

        if (isDynamic || mFont != null && mFont.isValid && !string.IsNullOrEmpty(text))
        {
            if (encoding)
            {
                text = NGUITools.StripSymbols(text);
            }

            if (isDynamic)
            {
                mDynamicFont.textureRebuildCallback = OnFontChanged;
                mDynamicFont.RequestCharactersInTexture(text, mDynamicFontSize, mDynamicFontStyle);
                mDynamicFont.textureRebuildCallback = null;
            }

            var length       = text.Length;
            var num2         = 0;
            var num3         = 0;
            var num4         = 0;
            var previousChar = 0;
            var size         = this.size;
            var num7         = size + mSpacingY;
            var flag2        = encoding && symbolStyle != SymbolStyle.None && hasSymbols;
            for (var i = 0; i < length; i++)
            {
                var index = text[i];
                if (index == '\n')
                {
                    if (num3 > num2)
                    {
                        num2 = num3;
                    }

                    num3         = 0;
                    num4        += num7;
                    previousChar = 0;
                }
                else if (index < ' ')
                {
                    previousChar = 0;
                }
                else if (!isDynamic)
                {
                    var symbol = !flag2 ? null : MatchSymbol(text, i, length);
                    if (symbol == null)
                    {
                        var glyph = mFont.GetGlyph(index);
                        if (glyph != null)
                        {
                            num3        += mSpacingX + (previousChar == 0 ? glyph.advance : glyph.advance + glyph.GetKerning(previousChar));
                            previousChar = index;
                        }
                    }
                    else
                    {
                        num3        += mSpacingX + symbol.width;
                        i           += symbol.length - 1;
                        previousChar = 0;
                    }
                }
                else if (mDynamicFont.GetCharacterInfo(index, out mChar, mDynamicFontSize, mDynamicFontStyle))
                {
                    num3 += mSpacingX + (int)mChar.width;
                }
            }

            var num9 = size <= 0 ? 1f : 1f / size;
            zero.x = num9 * (num3 <= num2 ? num2 : num3);
            zero.y = num9 * (num4 + num7);
        }

        return(zero);
    }
コード例 #24
0
ファイル: UIFont.cs プロジェクト: jack-lang/dotB_GJ_Sea
    /// <summary>
    /// Get the printed size of the specified string. The returned value is in local coordinates. Multiply by transform's scale to get pixels.
    /// </summary>

    public Vector2 CalculatePrintedSize(string text, bool encoding)
    {
        if (mReplacement != null)
        {
            return(mReplacement.CalculatePrintedSize(text, encoding));
        }

        Vector2 v = Vector2.zero;

        if (mFont != null && mFont.isValid && !string.IsNullOrEmpty(text))
        {
            if (encoding)
            {
                text = NGUITools.StripSymbols(text);
            }

            int maxX       = 0;
            int x          = 0;
            int y          = 0;
            int prev       = 0;
            int lineHeight = (mFont.charSize + mSpacingY);

            for (int i = 0, imax = text.Length; i < imax; ++i)
            {
                char c = text[i];

                // Start a new line
                if (c == '\n')
                {
                    if (x > maxX)
                    {
                        maxX = x;
                    }
                    x    = 0;
                    y   += lineHeight;
                    prev = 0;
                    continue;
                }

                // Skip invalid characters
                if (c < ' ')
                {
                    prev = 0; continue;
                }

                BMGlyph glyph = mFont.GetGlyph(c);

                if (glyph != null)
                {
                    x   += mSpacingX + ((prev != 0) ? glyph.advance + glyph.GetKerning(prev) : glyph.advance);
                    prev = c;
                }
            }

            // Convert from pixel coordinates to local coordinates
            float scale = (mFont.charSize > 0) ? 1f / mFont.charSize : 1f;
            v.x = scale * ((x > maxX) ? x : maxX);
            v.y = scale * (y + lineHeight);
        }
        return(v);
    }
コード例 #25
0
ファイル: UIFont.cs プロジェクト: krseong/unity3d-EMproject
    /// <summary>
    /// Get the printed size of the specified string. The returned value is in pixels.
    /// </summary>

    public Vector2 CalculatePrintedSize(string text)
    {
        if (mReplacement != null)
        {
            return(mReplacement.CalculatePrintedSize(text));
        }

#if DYNAMIC_FONT
        if (isDynamic)
        {
            NGUIText.current.size  = mDynamicFontSize;
            NGUIText.current.style = mDynamicFontStyle;
            return(NGUIText.CalculatePrintedSize(mDynamicFont, text));
        }
#endif
        Vector2 v = Vector2.zero;

        if (mFont != null && mFont.isValid && !string.IsNullOrEmpty(text))
        {
            if (NGUIText.current.encoding)
            {
                text = NGUIText.StripSymbols(text);
            }

            int  x          = 0;
            int  y          = 0;
            int  prev       = 0;
            int  maxX       = 0;
            int  length     = text.Length;
            int  lineHeight = NGUIText.current.size + NGUIText.current.spacingY;
            bool useSymbols = NGUIText.current.encoding && NGUIText.current.symbolStyle != NGUIText.SymbolStyle.None && hasSymbols;

            for (int i = 0; i < length; ++i)
            {
                char c = text[i];

                // Start a new line
                if (c == '\n')
                {
                    if (x > maxX)
                    {
                        maxX = x;
                    }
                    x    = 0;
                    y   += lineHeight;
                    prev = 0;
                    continue;
                }

                // Skip invalid characters
                if (c < ' ')
                {
                    prev = 0; continue;
                }

                // See if there is a symbol matching this text
                BMSymbol symbol = useSymbols ? MatchSymbol(text, i, length) : null;

                if (symbol == null)
                {
                    // Get the glyph for this character
                    BMGlyph glyph = mFont.GetGlyph(c);

                    if (glyph != null)
                    {
                        x   += NGUIText.current.spacingX + ((prev != 0) ? glyph.advance + glyph.GetKerning(prev) : glyph.advance);
                        prev = c;
                    }
                }
                else
                {
                    // Symbol found -- use it
                    x   += NGUIText.current.spacingX + symbol.width;
                    i   += symbol.length - 1;
                    prev = 0;
                }
            }

            // Padding is always between characters, so it's one less than the number of characters
            v.x = ((x > maxX) ? x : maxX);
            v.y = (y + NGUIText.current.size);
        }
        return(v);
    }
コード例 #26
0
    /// <summary>
    /// Get the printed size of the specified string. The returned value is in local coordinates. Multiply by transform's scale to get pixels.
    /// </summary>

    public Vector2 CalculatePrintedSize(string text, bool encoding, SymbolStyle symbolStyle)
    {
        if (mReplacement != null)
        {
            return(mReplacement.CalculatePrintedSize(text, encoding, symbolStyle));
        }

        Vector2 v       = Vector2.zero;
        bool    dynamic = isDynamic;

#if DYNAMIC_FONT
        if (dynamic || (mFont != null && mFont.isValid && !string.IsNullOrEmpty(text)))
#else
        if (mFont != null && mFont.isValid && !string.IsNullOrEmpty(text))
#endif
        {
            if (encoding)
            {
                text = NGUITools.StripSymbols(text);
            }
#if DYNAMIC_FONT
            if (mDynamicFont != null)
            {
                mDynamicFont.RequestCharactersInTexture(text, mDynamicFontSize);
            }
#endif
            int  length     = text.Length;
            int  maxX       = 0;
            int  x          = 0;
            int  y          = 0;
            int  prev       = 0;
            int  fs         = size;
            int  lineHeight = (fs + mSpacingY);
            bool useSymbols = encoding && symbolStyle != SymbolStyle.None && hasSymbols;

            for (int i = 0; i < length; ++i)
            {
                char c = text[i];

                // Start a new line
                if (c == '\n')
                {
                    if (x > maxX)
                    {
                        maxX = x;
                    }
                    x    = 0;
                    y   += lineHeight;
                    prev = 0;
                    continue;
                }

                // Skip invalid characters
                if (c < ' ')
                {
                    prev = 0; continue;
                }

                if (!dynamic)
                {
                    // See if there is a symbol matching this text
                    BMSymbol symbol = useSymbols ? MatchSymbol(text, i, length) : null;

                    if (symbol == null)
                    {
                        // Get the glyph for this character
                        BMGlyph glyph = mFont.GetGlyph(c);

                        if (glyph != null)
                        {
                            x   += mSpacingX + ((prev != 0) ? glyph.advance + glyph.GetKerning(prev) : glyph.advance);
                            prev = c;
                        }
                    }
                    else
                    {
                        // Symbol found -- use it
                        x   += mSpacingX + symbol.width;
                        i   += symbol.length - 1;
                        prev = 0;
                    }
                }
#if DYNAMIC_FONT
                else
                {
                    if (mDynamicFont.GetCharacterInfo(c, out mChar, mDynamicFontSize, mDynamicFontStyle))
                    {
                        x += (int)(mSpacingX + mChar.width);
                    }
                }
#endif
            }

            // Convert from pixel coordinates to local coordinates
            float scale = (fs > 0) ? 1f / fs : 1f;
            v.x = scale * ((x > maxX) ? x : maxX);
            v.y = scale * (y + lineHeight);
        }
        return(v);
    }
コード例 #27
0
    void CalculateLinkSpace(ref string text, int linkstart_whole, int linkstart, int linkend, out Vector2 LeftSideSpace, out Vector2 RightSideSpace, out int nNextLineNum, out bool needShow)
    {
        nNextLineNum   = 0;
        LeftSideSpace  = Vector2.zero;
        RightSideSpace = Vector2.zero;
        needShow       = true;

        if (null == m_Font)
        {
            m_Font = m_ChatText.font;
            if (m_Font != null)
            {
                m_ChatTextHeight = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.None).y;
                SPACE_WIDTH      = m_Font.CalculatePrintedSize(" ", true, UIFont.SymbolStyle.Uncolored).x;
            }
        }

        string striptext = NGUITools.StripSymbols(text);

        LeftSideSpace  = m_Font.CalculatePrintedSize(striptext.Substring(0, linkstart), true, UIFont.SymbolStyle.None);
        RightSideSpace = m_Font.CalculatePrintedSize(striptext.Substring(0, linkend), true, UIFont.SymbolStyle.None);
        float fLinkLength = RightSideSpace.x - LeftSideSpace.x;
//        float fEllipsisWidth = m_Font.CalculatePrintedSize("...", true, UIFont.SymbolStyle.None).x;

        int nLeftNextLineNum  = 0;
        int nRightNextLineNum = 0;

        int nLineStart = 0;

        for (int i = nLineStart + 1; i <= linkstart; i++)
        {
            float fChatWidth = m_Font.CalculatePrintedSize(striptext.Substring(nLineStart, i - nLineStart), true, UIFont.SymbolStyle.None).x;
            if (fChatWidth > m_ChatText.width)
            {
                nLeftNextLineNum += 1;
                LeftSideSpace.x  -= m_Font.CalculatePrintedSize(striptext.Substring(nLineStart, i - nLineStart - 1), true, UIFont.SymbolStyle.None).x;
                nLineStart        = i - 1;
            }
        }

        nLineStart = 0;
        for (int i = nLineStart + 1; i <= linkend; i++)
        {
            float fChatWidth = m_Font.CalculatePrintedSize(striptext.Substring(nLineStart, i - nLineStart), true, UIFont.SymbolStyle.None).x;
            if (fChatWidth > m_ChatText.width)
            {
                nRightNextLineNum += 1;
                RightSideSpace.x  -= m_Font.CalculatePrintedSize(striptext.Substring(nLineStart, i - nLineStart - 1), true, UIFont.SymbolStyle.None).x;
                nLineStart         = i - 1;
            }
        }

        nNextLineNum = nRightNextLineNum;

        // 是否超出范围 需要让链接另起一行
        if (nLeftNextLineNum < nRightNextLineNum)
        {
            text = text.Substring(0, linkstart_whole) + Environment.NewLine + text.Substring(linkstart_whole);
            //RightSideSpace.x = RightSideSpace.x - LeftSideSpace.x;
            LeftSideSpace.x  = 0;
            RightSideSpace.x = fLinkLength;
        }
    }
コード例 #28
0
    /// <summary>
    /// Process the raw text, called when something changes.
    /// </summary>

    void ProcessText()
    {
        mChanged   = true;
        hasChanged = false;
        mLastText  = mText;
        mText      = mText.Replace("\\n", "\n");

        float scale = Mathf.Abs(cachedTransform.localScale.x);
        float maxY  = mFont.size * mMaxLineCount;

        if (scale > 0f)
        {
            for (;;)
            {
                if (mPassword)
                {
                    mProcessedText = "";

                    if (mShowLastChar)
                    {
                        for (int i = 0, imax = mText.Length - 1; i < imax; ++i)
                        {
                            mProcessedText += "*";
                        }
                        if (mText.Length > 0)
                        {
                            mProcessedText += mText[mText.Length - 1];
                        }
                    }
                    else
                    {
                        for (int i = 0, imax = mText.Length; i < imax; ++i)
                        {
                            mProcessedText += "*";
                        }
                    }
                    mProcessedText = mFont.WrapText(mProcessedText, mMaxLineWidth / scale, mMaxLineCount, false, UIFont.SymbolStyle.None);
                }
                else if (mMaxLineWidth > 0)
                {
                    mProcessedText = mFont.WrapText(mText, mMaxLineWidth / scale, mShrinkToFit ? 0 : mMaxLineCount, mEncoding, mSymbols);
                }
                else if (!mShrinkToFit && mMaxLineCount > 0)
                {
                    mProcessedText = mFont.WrapText(mText, 100000f, mMaxLineCount, mEncoding, mSymbols);
                }
                else
                {
                    mProcessedText = mText;
                }

                mSize = !string.IsNullOrEmpty(mProcessedText) ? mFont.CalculatePrintedSize(mProcessedText, mEncoding, mSymbols) : Vector2.one;

                if (mShrinkToFit)
                {
                    // We want to shrink the label (when it doesn't fit)
                    if (mMaxLineCount > 0 && mSize.y * scale > maxY)
                    {
                        scale = Mathf.Round(scale - 1f);
                        if (scale > 1f)
                        {
                            continue;
                        }
                    }

                    if (mMaxLineWidth > 0)
                    {
                        float maxX = (float)mMaxLineWidth / scale;
                        float x    = (mSize.x * scale > maxX) ? (maxX / mSize.x) * scale : scale;
                        scale = Mathf.Min(x, scale);
                    }

                    scale = Mathf.Round(scale);
                    cachedTransform.localScale = new Vector3(scale, scale, 1f);
                }
                break;
            }
            mSize.x = Mathf.Max(mSize.x, (scale > 0f) ? lineWidth / scale : 1f);
        }
        else
        {
            // This should never happen (label should never have a scale of 0) -- but just in case.
            mSize.x = 1f;
            scale   = mFont.size;
            cachedTransform.localScale = new Vector3(0.01f, 0.01f, 1f);
            mProcessedText             = "";
        }
        mSize.y = Mathf.Max(mSize.y, 1f);
    }
コード例 #29
0
    public void RefreshText()
    {
        if (Font == null)
        {
            return;
        }

        mMesh.Clear();
        var text = Text.Replace("\\n", "\n");

        if (string.IsNullOrEmpty(text))
        {
            return;
        }

        s_verts.Clear();
        s_uvs.Clear();
        s_cols.Clear();
        Vector3 offsetVec = Font.CalculatePrintedSize(text, true, UIFont.SymbolStyle.Uncolored) * -0.5f;

        Font.Print(text, TextColor1, TextColor2, UIWidget.E_Direction.Vertical, s_verts, s_uvs, s_cols, false, UIFont.SymbolStyle.Uncolored, UIFont.Alignment.Center, LineWidth, false);

        int drawCnt = 1;

        if (EffectStyle == Effect.Outline)
        {
            drawCnt = 5;
        }
        else if (EffectStyle == Effect.Shadow)
        {
            drawCnt = 2;
        }

        var uvs  = new Vector2[s_uvs.size * drawCnt];
        var cols = new Color32[s_cols.size * drawCnt];

        Array.Copy(s_uvs.buffer, uvs, s_uvs.size);
        Array.Copy(s_cols.buffer, cols, s_cols.size);

        var verts = new Vector3[s_verts.size * drawCnt];

        for (int i = 0; i < s_verts.size; ++i)
        {
            verts[i] = s_verts[i] + offsetVec;
        }
        if (EffectStyle != Effect.None)
        {
            float pixel = 1f / Font.size;

            float fx = pixel * EffectDistance.x;
            float fy = pixel * EffectDistance.y;
            if (EffectStyle == Effect.Outline)
            {
                ApplyShadow(verts, uvs, cols, s_verts.size * 0, s_verts.size, new Vector3(fx, fy));
                ApplyShadow(verts, uvs, cols, s_verts.size * 1, s_verts.size, new Vector3(fx, -fy));
                ApplyShadow(verts, uvs, cols, s_verts.size * 2, s_verts.size, new Vector3(-fx, fy));
                ApplyShadow(verts, uvs, cols, s_verts.size * 3, s_verts.size, new Vector3(-fx, -fy));
            }
            else if (EffectStyle == Effect.Shadow)
            {
                ApplyShadow(verts, uvs, cols, 0, s_verts.size, new Vector3(fx, fy));
            }
        }

        int rcCount   = verts.Length / 4;
        var triangles = new int[rcCount * 6];

        for (int i = 0; i < rcCount; ++i)
        {
            triangles[i * 6 + 0] = i * 4 + 0;
            triangles[i * 6 + 1] = i * 4 + 1;
            triangles[i * 6 + 2] = i * 4 + 2;

            triangles[i * 6 + 3] = i * 4 + 2;
            triangles[i * 6 + 4] = i * 4 + 3;
            triangles[i * 6 + 5] = i * 4 + 0;
        }


        mMesh.vertices  = verts;
        mMesh.triangles = triangles;
        mMesh.uv        = uvs;
        mMesh.colors32  = cols;
    }