Esempio n. 1
0
        void layoutWord(float offset, int layoutOffset,
                        TextBuff buff, int start, int wordCount, TextStyle style)
        {
            float wordSpacing =
                wordCount == 1 && LayoutUtils.isWordSpace(buff.charAt(start)) ? style.wordSpacing : 0;

            var font = FontManager.instance.getOrCreate(style.fontFamily, style.fontWeight, style.fontStyle).font;

            font.RequestCharactersInTextureSafe(buff.subBuff(start, wordCount).getString(),
                                                style.UnityFontSize,
                                                style.UnityFontStyle);
            float x                    = this._advance;
            float letterSpace          = style.letterSpacing;
            float letterSpaceHalfLeft  = letterSpace * 0.5f;
            float letterSpaceHalfRight = letterSpace - letterSpaceHalfLeft;

            for (int i = 0; i < wordCount; i++)
            {
                var ch = buff.charAt(start + i);
                if (i == 0)
                {
                    x += letterSpaceHalfLeft + wordSpacing;
                    this._advances[i + layoutOffset] += letterSpaceHalfLeft + wordSpacing;
                }
                else
                {
                    this._advances[i - 1 + layoutOffset] += letterSpaceHalfRight;
                    this._advances[i + layoutOffset]     += letterSpaceHalfLeft;
                    x += letterSpace;
                }

                var glyphInfo = font.getGlyphInfo(ch, style.UnityFontSize, style.UnityFontStyle);
                var rect      = glyphInfo.rect;
                rect = rect.translate(x, 0);
                if (this._bounds == null || this._bounds.isEmpty)
                {
                    this._bounds = rect;
                }
                else
                {
                    this._bounds = this._bounds.expandToInclude(rect);
                }

                this._positions[i + layoutOffset] = x;
                float advance = glyphInfo.advance;
                if (ch == '\t')
                {
                    advance = this._tabStops.nextTab((this._advance + offset)) - this._advance;
                }
                x += advance;
                this._advances[i + layoutOffset] += advance;
                if (i + 1 == wordCount)
                {
                    this._advances[i + layoutOffset] += letterSpaceHalfRight;
                    x += letterSpaceHalfRight;
                }
            }

            this._advance = x;
        }
Esempio n. 2
0
        void layoutWord(float offset, int layoutOffset,
                        TextBuff buff, int start, int wordCount, TextStyle style, Font font)
        {
            float wordSpacing =
                wordCount == 1 && LayoutUtils.isWordSpace(buff.charAt(start)) ? style.wordSpacing : 0;

            float x                    = this._advance;
            float letterSpace          = style.letterSpacing;
            float letterSpaceHalfLeft  = letterSpace * 0.5f;
            float letterSpaceHalfRight = letterSpace - letterSpaceHalfLeft;

            for (int i = 0; i < wordCount; i++)
            {
                var ch = buff.charAt(start + i);
                if (i == 0)
                {
                    x += letterSpaceHalfLeft + wordSpacing;
                    this._advances[i + layoutOffset] += letterSpaceHalfLeft + wordSpacing;
                }
                else
                {
                    this._advances[i - 1 + layoutOffset] += letterSpaceHalfRight;
                    this._advances[i + layoutOffset]     += letterSpaceHalfLeft;
                    x += letterSpace;
                }

                if (font.getGlyphInfo(ch, out var glyphInfo, style.UnityFontSize, style.UnityFontStyle))
                {
                    var minX = glyphInfo.minX + x;
                    var maxX = glyphInfo.maxX + x;
                    var minY = -glyphInfo.maxY;
                    var maxY = -glyphInfo.minY;

                    if (this._bounds.width <= 0 || this._bounds.height <= 0)
                    {
                        this._bounds = UnityEngine.Rect.MinMaxRect(
                            minX, minY, maxX, maxY);
                    }
                    else
                    {
                        if (minX < this._bounds.x)
                        {
                            this._bounds.x = minX;
                        }
                        if (minY < this._bounds.y)
                        {
                            this._bounds.y = minY;
                        }
                        if (maxX > this._bounds.xMax)
                        {
                            this._bounds.xMax = maxX;
                        }
                        if (maxY > this._bounds.yMax)
                        {
                            this._bounds.yMax = maxY;
                        }
                    }
                }

                this._positions[i + layoutOffset] = x;
                float advance = glyphInfo.advance;
                if (ch == '\t')
                {
                    advance = this._tabStops.nextTab((this._advance + offset)) - this._advance;
                }
                x += advance;
                this._advances[i + layoutOffset] += advance;
                if (i + 1 == wordCount)
                {
                    this._advances[i + layoutOffset] += letterSpaceHalfRight;
                    x += letterSpaceHalfRight;
                }
            }

            this._advance = x;
        }