示例#1
0
        // at Unity version 4.6 - 5.1, don't write [u] out of <color=...> (eg. [u]<color=#00507C>Falcon[/u]</color>),
        // because underline calculate include rich text(like "<color") vertex and char info.

        void fillUnderline(VertexHelper toFill)
        {
            if (null == mCharTextGenerator)
            {
                mCharTextGenerator = new TextGenerator(1);
            }


            m_DisableFontTextureRebuiltCallback = true;

            Vector2 extents = rectTransform.rect.size;
            TextGenerationSettings settings = GetGenerationSettings(extents);

            mCharTextGenerator.Populate("_", settings);

            IList <UIVertex> verts = mCharTextGenerator.verts;

            if (verts.Count < 4)
            {
                return;
            }
            Vector2 topUV    = (verts[0].uv0 + verts[1].uv0) / 2;
            Vector2 bottomUV = (verts[2].uv0 + verts[3].uv0) / 2;

            UIVertex[] temp = new UIVertex[4];
            for (int i = 0; i < 4; i++)
            {
                temp[i] = verts[i];
                if (i < 2)
                {
                    temp[i].uv0 = topUV;
                }
                else
                {
                    temp[i].uv0 = bottomUV;
                }
            }

            if (mCharTextGenerator.lineCount <= 0)
            {
                return;
            }

            float underLineTopY = mCharTextGenerator.lines[0].topY;

            float offsetTop    = verts[0].position.y - underLineTopY;
            float offsetBottom = verts[3].position.y - underLineTopY;

            IList <UILineInfo> lines = cachedTextGenerator.lines;
            TextSegmentFlag    segment;
            int  segmentIdx = 0, segmentStartIdx = -1, segmentEndIdx = -1, endIdx = lines.Count - 1;
            bool start = false;

            if (null == mUnderlineEdgeCfg)
            {
                mUnderlineEdgeCfg = new UnderlineEdgeConfig();
            }

            mUnderlineEdgeCfg.init(toFill, temp, cachedTextGenerator, offsetTop, offsetBottom);

            for (int i = 0, max = lines.Count; i < max; ++i)
            {
                if (segmentIdx == mUnderlineIndexList.Count)
                {
                    break;
                }

                segment = mUnderlineIndexList[segmentIdx];
                if (!start && (lines[i].startCharIdx > segment.start || i == endIdx))
                {
                    if (!mUnderlineEdgeCfg.setUnderLineStartPos(segment.start, ref segmentStartIdx, i))
                    {
                        break;
                    }

                    start = true;
                }

                if (start && (lines[i].startCharIdx > segment.end || i == endIdx))
                {
                    segmentEndIdx = i - (lines[i].startCharIdx > segment.end ? 1 : 0);

                    if (segmentStartIdx == segmentEndIdx)
                    {
                        if (!mUnderlineEdgeCfg.setUnderLineEndPos(segment.end))
                        {
                            break;
                        }

                        segmentIdx++;
                        start = false;
                        --i;
                        continue;
                    }

                    //start -> start line end
                    int startLineEndCharIdx = lines[segmentStartIdx + 1].startCharIdx - 1;
                    if ('\n' == text[startLineEndCharIdx])
                    {
                        --startLineEndCharIdx;
                    }

                    if (!mUnderlineEdgeCfg.setUnderLineEndPos(startLineEndCharIdx))
                    {
                        break;
                    }

                    //for(line start + 1 --> line end - 1)
                    for (int k = segmentStartIdx + 1; k < segmentEndIdx; ++k)
                    {
                        int lineStartCharIdx = lines[k].startCharIdx;

                        //ignore line feed
                        if ('\n' == text[lineStartCharIdx])
                        {
                            continue;
                        }

                        if (!mUnderlineEdgeCfg.setUnderLineStartPos(lineStartCharIdx, ref k, k))
                        {
                            break;
                        }

                        int lineEndCharIdx = lines[k + 1].startCharIdx - 1;
                        if ('\n' == text[lineEndCharIdx])
                        {
                            --lineEndCharIdx;
                        }

                        if (!mUnderlineEdgeCfg.setUnderLineEndPos(lineEndCharIdx))
                        {
                            break;
                        }
                    }

                    //end line start -> end
                    int endLineStartCharIdx = lines[segmentEndIdx].startCharIdx;

                    if (!mUnderlineEdgeCfg.setUnderLineStartPos(endLineStartCharIdx, ref segmentEndIdx, segmentEndIdx))
                    {
                        break;
                    }

                    if (!mUnderlineEdgeCfg.setUnderLineEndPos(segment.end))
                    {
                        break;
                    }

                    segmentIdx++;
                    start = false;
                    --i;
                    continue;
                }
            }


            m_DisableFontTextureRebuiltCallback = false;
        }
示例#2
0
        protected override void OnDestroy()
        {
            if (this.txtTool != null)
            {
                this.txtTool.ClearAll();
            }

            if (this.mOriginIndexList != null)
            {
                this.mOriginIndexList.Clear();
            }

            if (this.mVertexHelper != null)
            {
                this.mVertexHelper.Clear();
            }

            if (this._icons != null)
            {
                this._icons.Clear();
            }

            if (this._heights != null)
            {
                this._heights.Clear();
            }

            if (this._widths != null)
            {
                this._widths.Clear();
            }

            if (this._heightDeltas != null)
            {
                this._heightDeltas.Clear();
            }

            if (this._iconsPool != null)
            {
                this._iconsPool.Clear();
            }

            if (this._indexes != null)
            {
                this._indexes.Clear();
            }

            if (this._names != null)
            {
                this._names.Clear();
            }

            if (this._positions != null)
            {
                this._positions.Clear();
            }

            if (this.mUnderlineIndexList != null)
            {
                this.mUnderlineIndexList.Clear();
            }

            this.mGo    = null;
            this.mTrans = null;

            this._icons           = null;
            this._iconsPool       = null;
            this._heights         = null;
            this._widths          = null;
            this._indexes         = null;
            this._names           = null;
            this._positions       = null;
            this._heightDeltas    = null;
            this.root             = null;
            this.mOriginIndexList = null;

            this.txtTool = null;

            this.mVertexHelper      = null;
            this.mCharTextGenerator = null;
            this.mUnderlineEdgeCfg  = null;

            base.OnDestroy();
        }