예제 #1
0
        /// <summary>
        /// Returns a text that is cropped to fit a maximum width using this Font.
        /// </summary>
        /// <param name="text">The original text.</param>
        /// <param name="maxWidth">The maximum width it may occupy.</param>
        /// <param name="fitMode">The mode by which the text fitting algorithm operates.</param>
        /// <returns></returns>
        public string FitText(string text, float maxWidth, FitTextMode fitMode = FitTextMode.ByChar)
        {
            if (this.texture == null)
            {
                return(text);
            }

            Vector2   textSize  = Vector2.Zero;
            float     curOffset = 0.0f;
            GlyphData glyphData;
            Rect      uvRect;
            float     glyphXOff;
            float     glyphYOff;
            float     glyphXAdv;
            int       lastValidLength = 0;

            for (int i = 0; i < text.Length; i++)
            {
                this.ProcessTextAdv(text, i, out glyphData, out uvRect, out glyphXAdv, out glyphXOff, out glyphYOff);

                textSize.X = Math.Max(textSize.X, curOffset + glyphXAdv);
                textSize.Y = Math.Max(textSize.Y, glyphData.Height);

                if (textSize.X > maxWidth)
                {
                    return(lastValidLength > 0 ? text.Substring(0, lastValidLength) : "");
                }

                if (fitMode == FitTextMode.ByChar)
                {
                    lastValidLength = i;
                }
                else if (text[i] == ' ')
                {
                    lastValidLength = fitMode == FitTextMode.ByWordLeadingSpace ? i : i + 1;
                }

                curOffset += glyphXAdv;
            }

            return(text);
        }
예제 #2
0
파일: Font.cs 프로젝트: KSLcom/duality
        /// <summary>
        /// Returns a text that is cropped to fit a maximum width using this Font.
        /// </summary>
        /// <param name="text">The original text.</param>
        /// <param name="maxWidth">The maximum width it may occupy.</param>
        /// <param name="fitMode">The mode by which the text fitting algorithm operates.</param>
        /// <returns></returns>
        public string FitText(string text, float maxWidth, FitTextMode fitMode = FitTextMode.ByChar)
        {
            Vector2 textSize = Vector2.Zero;

            float curOffset = 0.0f;
            GlyphData glyphData;
            Rect uvRect;
            float glyphXOff;
            float glyphXAdv;
            int lastValidLength = 0;
            for (int i = 0; i < text.Length; i++)
            {
                this.ProcessTextAdv(text, i, out glyphData, out uvRect, out glyphXAdv, out glyphXOff);

                textSize.X = Math.Max(textSize.X, curOffset + glyphXAdv);
                textSize.Y = Math.Max(textSize.Y, glyphData.height);

                if (textSize.X > maxWidth) return lastValidLength > 0 ? text.Substring(0, lastValidLength) : "";

                if (fitMode == FitTextMode.ByChar)
                    lastValidLength = i;
                else if (text[i] == ' ')
                    lastValidLength = fitMode == FitTextMode.ByWordLeadingSpace ? i : i + 1;

                curOffset += glyphXAdv;
            }

            return text;
        }