public int DoStep(ref TextCotext context, EmojiEvent uievent)
        {
            if (uievent == EmojiEvent.LateUpdate)
            {
                context.Settings = context.Owner.Settings;
                if (context.Settings.AnimationSpeed < 1)
                {
                    context.Settings.AnimationSpeed = 30;
                }

                if (_last.HasValue)
                {
                    if (_last.Value.Equals(context.Settings) == false)
                    {
                        for (int i = 0; i < context.AllTexts.Count; i++)
                        {
                            if (context.AllTexts[i] == null)
                            {
                                continue;
                            }
                            context.AllTexts[i].SetVerticesDirty();
                        }

                        _last = context.Settings;
                    }
                }
                else
                {
                    _last = context.Settings;
                }
            }

            return(0);
        }
        public int DoStep(ref TextCotext context, EmojiEvent uievent)
        {
            if (uievent == EmojiEvent.LateUpdate)
            {
                for (int i = context.AllTexts.Count - 1; i >= 0; i--)
                {
                    if (context.AllTexts[i] == null)
                    {
                        context.AllTexts.RemoveAt(i);
                        context.Results.RemoveAt(i);
                    }
                }

                for (int i = 0; i < context.FailedText.Count; i++)
                {
                    int idx = context.AllTexts.IndexOf(context.FailedText[i]);
                    if (idx != -1)
                    {
                        context.AllTexts.RemoveAt(idx);
                        context.Results.RemoveAt(idx);
                    }
                }
            }

            return(0);
        }
Ejemplo n.º 3
0
        public int DoStep(ref TextCotext context, EmojiEvent uievent)
        {
            if (uievent == EmojiEvent.PreRender)
            {
                for (int i = 0; i < context.Results.Count; i++)
                {
                    var result = context.Results[i];
                    var text   = context.AllTexts[i];
                    if (text == null)
                    {
                        continue;
                    }

                    var hrefmesh = result.MeshGroup.HrefMeshReult;
                    hrefmesh.Init();

                    for (int k = 0; k < result.MeshGroup.TextMeshResult.EmojiVerts.Count; k += 4)
                    {
                        int emojiindex = k / 4;
                        int arrayindex;
                        int emojitype = result.ParseGroup.GetIndexType(emojiindex, out arrayindex);

                        if (emojitype == 2 && arrayindex >= 0 && arrayindex < result.ParseGroup.HrefResult.Count)
                        {
                            var hrefcolor = result.ParseGroup.HrefResult.GetHrefCols()[arrayindex];

                            var p2    = result.MeshGroup.TextMeshResult.EmojiVerts[k + 2];
                            var p3    = result.MeshGroup.TextMeshResult.EmojiVerts[k + 3];
                            var width = p2.x - p3.x;
                            //
                            var botmid = (p3 + p2) / 2;

                            for (int m = 0; m < 4; m++)
                            {
                                var uivert = new EmojiUIVertex();
                                uivert.color   = hrefcolor;
                                uivert.normal  = Vector3.back;
                                uivert.tangent = new Vector4(1.0f, 0.0f, 0.0f, -1.0f);

                                float wc  = ((m & 2) >> 1) == (m & 1) ? -0.5f : 0.5f;
                                float hc  = (m & 2) == 0 ? -0.5f : 0.5f;
                                var   pos = botmid + new Vector3(wc * width, (hc * HrefLine * text.fontSize) / 10);//result.MeshGroup.TextMeshResult.EmojiVerts[k + m];

                                uivert.position = pos;
                                hrefmesh.HrefVerts.Add(uivert);
                            }
                        }
                    }

                    result.MeshGroup.HrefMeshReult = hrefmesh;
                    context.Results[i]             = result;
                }
            }
            return(0);
        }
Ejemplo n.º 4
0
        public int DoStep(ref TextCotext context, EmojiEvent uievent)
        {
            if (uievent == EmojiEvent.PreRender)
            {
                for (int i = 0; i < context.AllTexts.Count; i++)
                {
                    InlineText text = context.AllTexts[i];
                    if (text == null)
                    {
                        continue;
                    }

                    if (!context.RebuildTexts.Contains(text))
                    {
                        continue;
                    }

                    _cache.Clear();

                    TextElementResult result = context.Results[i];

                    //if (result.ParseGroup.emojitypeMap == null)
                    //    result.ParseGroup.emojitypeMap = new Dictionary<int, int>();
                    //else
                    //result.ParseGroup.emojitypeMap.Clear();

                    int val = 0;
                    for (int k = 0; k < result.ParseGroup.fillplacemap.Count; k++)
                    {
                        val      += result.ParseGroup.fillplacemap[k];
                        _cache[k] = val;
                    }
                    //emoji
                    FixPoints(result.ParseGroup.EmojiResult.GetEmojiPoints(), 1, ref result);

                    //href

                    FixPoints(result.ParseGroup.HrefResult.GetHrefPoints(), 2, ref result);

                    context.Results[i] = result;
                }
            }

            return(0);
        }
Ejemplo n.º 5
0
        public int DoStep(ref TextCotext context, EmojiEvent uievent)
        {
            if (uievent == EmojiEvent.PreRender)
            {
                int errcode = 0;
                for (int i = 0; i < context.AllTexts.Count; i++)
                {
                    InlineText text = context.AllTexts[i];
                    if (text == null)
                    {
                        continue;
                    }

                    if (!context.RebuildTexts.Contains(text))
                    {
                        continue;
                    }

                    TextElementResult result = context.Results[i];

                    result.MeshGroup.TextMeshResult.Init();
                    result.GizmosResult.Clear();

                    //text
                    string currenttext = null;
                    if (result.ParseGroup.TextResult.FormatElements != null && result.ParseGroup.TextResult.FormatElements.Count > 0)
                    {
                        currenttext = result.ParseGroup.TextResult.FormatString;
                    }
                    else
                    {
                        currenttext = text.text;
                    }
                    errcode = FillText(text, currenttext, ref context, ref result);

                    context.Results[i] = result;
                }

                return(errcode);
            }

            return(0);
        }
Ejemplo n.º 6
0
        public void DoUpdate(EmojiEvent uievent)
        {
            if (_systems != null)
            {
                for (int i = 0; i < _systems.Count; i++)
                {
                    var sy = _systems[i];
                    if (sy is IEmojiStructSystem <TextCotext> )
                    {
                        IEmojiStructSystem <TextCotext> essystem = sy as IEmojiStructSystem <TextCotext>;
                        int code = essystem.DoStep(ref Context, uievent);
                        if (code != 0)
                        {
#if UNITY_EDITOR
                            Debug.LogErrorFormat("DoStep Code {0} in {1}", (EmojiErrorCode)code, essystem);
#endif
                        }
                    }
                }
            }
        }
Ejemplo n.º 7
0
        public int DoStep(ref TextCotext context, EmojiEvent uievent)
        {
            if (uievent == EmojiEvent.DrawGizmos)
            {
#if UNITY_EDITOR
                if (context.AllTexts.Count > 0 && context.Results.Count > 0)
                {
                    for (int i = 0; i < context.Results.Count; i++)
                    {
                        var gdata = context.Results[i].GizmosResult;
                        if (i < context.AllTexts.Count)
                        {
                            context.AllTexts[i].DrawGizmos(ref gdata);
                        }
                    }
                }
#endif
            }

            return(0);
        }
        public int DoStep(ref TextCotext context, EmojiEvent uievent)
        {
            if (uievent == EmojiEvent.PreRender)
            {
                for (int i = 0; i < context.AllTexts.Count; i++)
                {
                    var text = context.AllTexts[i];
                    if (text == null)
                    {
                        continue;
                    }

                    var result = context.Results[i];

                    var task = result.EmojiImgeTasks;
                    task.NeedUpdate       = context.RebuildTexts.Contains(text);
                    result.EmojiImgeTasks = task;

                    context.Results[i] = result;
                }

                //clear
                context.RebuildTexts.Clear();
            }
            else if (uievent == EmojiEvent.LateUpdate)
            {
                for (int i = 0; i < context.AllTexts.Count; i++)
                {
                    var text = context.AllTexts[i];
                    if (text == null)
                    {
                        continue;
                    }

                    var  result    = context.Results[i];
                    var  task      = result.EmojiImgeTasks;
                    bool canrender = result.MeshGroup.CanRender();

                    if (canrender)
                    {
                        if (task.Images == null)
                        {
                            task.Images = new EmojiList <EmojiImage>();
                        }

                        if (text.isActiveAndEnabled && task.NeedUpdate)
                        {
                            var list = ListPool <int> .Get();

                            for (int j = 0; j < task.Images.Count; j++)
                            {
                                if (j < list.Count)
                                {
                                    list[j] = 1;
                                }
                                else
                                {
                                    list.Add(1);
                                }
                            }

                            for (int j = 0; j < result.MeshGroup.EmojiMeshResult.EmojiVerts.Count; j += 4)
                            {
                                var vert    = result.MeshGroup.EmojiMeshResult.EmojiVerts[j];
                                var texture = vert.texture;

                                if (texture != null)
                                {
                                    int idx = GetRenderIndex(texture, ref task);
                                    if (idx >= 0)
                                    {
                                        EmojiImage emojimg = task.Images[idx];
                                        emojimg.RenderEmoji(text, texture, ref result.MeshGroup);

                                        list[idx] = 0;
                                    }
                                    else
                                    {
                                        int freeidx = GetNullRenderIndex(texture, ref task);
                                        if (freeidx >= 0)
                                        {
                                            list[freeidx] = 0;
                                            EmojiImage emojimg = task.Images[freeidx];
                                            emojimg.RenderEmoji(text, texture, ref result.MeshGroup);
                                        }
                                        else
                                        {
                                            EmojiImage emojimg = TextCotext.Pool.AddChild2Target(text.transform);
                                            emojimg.RenderEmoji(text, texture, ref result.MeshGroup);
                                            task.Images.Add(emojimg);
                                        }
                                    }
                                }
                            }

                            for (int j = 0; j < list.Count; j++)
                            {
                                if (list[j] == 1)
                                {
                                    task.Images[j].UnRenderEmoji();
                                }
                            }

                            ListPool <int> .Release(list);
                        }
                        else if (!text.isActiveAndEnabled)
                        {
                            for (int j = 0; j < task.Images.Count; j++)
                            {
                                task.Images[j].UnRenderEmoji();
                            }
                        }

                        task.NeedUpdate = false;
                    }
                    else if (task.Images != null && !canrender)
                    {
                        for (int j = task.Images.Count - 1; j >= 0; j--)
                        {
                            TextCotext.Pool.RemoveChildFromTarget(task.Images[j]);
                            task.Images.RemoveAt(j);
                        }
                    }

                    result.EmojiImgeTasks = task;
                    context.Results[i]    = result;
                }
            }
            return(0);
        }
Ejemplo n.º 9
0
        public int DoStep(ref TextCotext context, EmojiEvent uievent)
        {
            if (uievent == EmojiEvent.PreRender)
            {
                int errcode = 0;
                for (int i = 0; i < context.RebuildTexts.Count; i++)
                {
                    var text = context.RebuildTexts[i];
                    if (text == null)
                    {
                        continue;
                    }

                    int index = context.AllTexts.IndexOf(text);
                    if (index == -1)
                    {
                        continue;
                    }


                    var result = context.Results[index];

                    if (result.ParseGroup.TextResult.FormatElements == null)
                    {
                        continue;
                    }

                    result.ParseGroup.HrefResult.Clear();

                    for (int m = 0; m < result.ParseGroup.TextResult.FormatElements.Count; m++)
                    {
                        string info  = result.ParseGroup.TextResult.FormatElements[m];
                        int    point = result.ParseGroup.TextResult.GetPoints()[m];

                        int    len    = 0;
                        string tagKey = null;
                        if (!ParseElement(text, info, ref context, out len, out tagKey))
                        {
                            errcode = (int)EmojiErrorCode.ParseFailed;
                            break;
                        }

                        if (len >= 0)
                        {
                            continue;
                        }

                        Color col;
                        if (!ColorUtility.TryParseHtmlString(tagKey, out col))
                        {
                            errcode = (int)EmojiErrorCode.ParseColFailed;
                            break;
                        }

                        len = Mathf.Abs(len);
                        //int left = result.ParseGroup.TextResult.FormatString.Length -1 -(point+ len);
                        //if (left < len)
                        //{
                        //    len = Mathf.Max(0, left);
                        //}

                        result.ParseGroup.HrefResult.GetHrefCols().Add(col);
                        result.ParseGroup.HrefResult.GetHrefPoints().Add(new EmojiIndex(m, point, len));
                    }

                    context.Results[index] = result;
                }

                return(errcode);
            }

            return(0);
        }
Ejemplo n.º 10
0
        public int DoStep(ref TextCotext context, EmojiEvent uievent)
        {
            if (uievent == EmojiEvent.PreRender)
            {
                for (int i = 0; i < context.Results.Count; i++)
                {
                    var result = context.Results[i];

                    var emojimesh = result.MeshGroup.EmojiMeshResult;
                    emojimesh.Init();


                    for (int k = 0; k < result.MeshGroup.TextMeshResult.EmojiVerts.Count; k += 4)
                    {
                        int emojiindex = k / 4;
                        int arrayindex;
                        int emojitype = result.ParseGroup.GetIndexType(emojiindex, out arrayindex);

                        if (emojitype == 1 && arrayindex >= 0 && arrayindex < result.ParseGroup.EmojiResult.Count)
                        {
                            var group = result.ParseGroup.EmojiResult.GetGroups()[arrayindex];
                            emojimesh.FrameIndex.Add(0);
                            emojimesh.RenderGroup.Add(group);

                            var center = (result.MeshGroup.TextMeshResult.EmojiVerts[k] + result.MeshGroup.TextMeshResult.EmojiVerts[k + 1]
                                          + result.MeshGroup.TextMeshResult.EmojiVerts[k + 2] + result.MeshGroup.TextMeshResult.EmojiVerts[k + 3]) / 4;


                            for (int m = 0; m < 4; m++)
                            {
                                var uivert = new EmojiUIVertex();

                                var sprite = group.spritegroups[0];
                                uivert.uv0     = sprite.uv[3 - m];
                                uivert.uv1     = sprite.uv[3 - m];
                                uivert.uv2     = sprite.uv[3 - m];
                                uivert.uv3     = sprite.uv[3 - m];
                                uivert.color   = Color.white;
                                uivert.normal  = Vector3.back;
                                uivert.tangent = new Vector4(1.0f, 0.0f, 0.0f, -1.0f);
                                uivert.texture = sprite.sprite.texture;


                                float wc = ((m & 2) >> 1) == (m & 1) ? -0.5f : 0.5f;
                                float hc = (m & 2) == 0 ? -0.5f : 0.5f;

                                float emojisize = result.ParseGroup.EmojiResult.GetEmojiSize()[arrayindex];

                                var position = center + new Vector3(wc * emojisize, hc * emojisize, 0);
                                uivert.position = position;
                                emojimesh.EmojiVerts.Add(uivert);
                            }
                        }
                    }

                    result.MeshGroup.EmojiMeshResult = emojimesh;
                    context.Results[i] = result;
                }
            }

            return(0);
        }
 public int DoStep(ref TextCotext context, EmojiEvent uievent)
 {
     return(0);
 }
Ejemplo n.º 12
0
        public int DoStep(ref TextCotext context, EmojiEvent uievent)
        {
            if (uievent == EmojiEvent.PreRender)
            {
                int errcode = 0;
                foreach (var target in context.RebuildTexts)
                {
                    if (target == null)
                    {
                        continue;
                    }

                    string text = target.text;

                    if (text.Length > 16381) //65535/4-1
                    {
                        errcode = (int)EmojiErrorCode.TooMuchChars;
                        continue;
                    }

                    ParseTextResult result = new ParseTextResult();
                    int             index  = context.AllTexts.IndexOf(target);
                    if (index != -1)
                    {
                        result = context.Results[index].ParseGroup.TextResult;
                        result.Clear();
                    }

                    if (_sb == null)
                    {
                        _sb = new StringBuilder();
                    }

                    _sb.Capacity = text.Length;

                    int textstart = -1;
                    int start     = 0;
                    int flag      = 0;
                    for (int i = 0; i < text.Length; i++)
                    {
                        char subchar = text[i];
                        if (subchar == ParsetLeft)
                        {
                            if (flag == 0)
                            {
                                start = i;
                                result.GetPoints().Add(_sb.Length);
                            }

                            flag++;
                        }
                        else if (subchar == ParsetRight)
                        {
                            flag--;
                            if (flag == 0)
                            {
                                string substr = text.Substring(start, i - start + 1);

                                result.GetElements().Add(substr);
                                //
                                textstart = -1;
                            }
                        }
                        else if (flag == 0)//正常显示内容
                        {
                            if (textstart < 0)
                            {
                                textstart = i;
                            }
                            _sb.Append(subchar);
                        }
                    }

                    if (flag > 0)
                    {
                        string substr = text.Substring(start);
                        _sb.Append(substr);
                    }

                    result.FormatString = _sb.ToString();

                    FillPart(target, result.FormatString, 0, result.FormatString.Length - 1, ref result);

                    _sb.Length = 0;

                    //assign
                    if (index == -1)
                    {
                        TextElementResult elementresult = new TextElementResult();
                        elementresult.RenderId = target.GetHashCode();
                        elementresult.ParseGroup.TextResult   = result;
                        elementresult.ParseGroup.fillplacemap = new EmojiList <int>(64);
                        context.AllTexts.Add(target);
                        context.Results.Add(elementresult);
                    }
                    else
                    {
                        TextElementResult elementresult = context.Results[index];
                        elementresult.ParseGroup.TextResult = result;
                        elementresult.ParseGroup.fillplacemap.Clear();

                        context.Results[index] = elementresult;
                    }
                }

                return(errcode);
            }

            return(0);
        }
Ejemplo n.º 13
0
        public int DoStep(ref TextCotext context, EmojiEvent uievent)
        {
            if (uievent == EmojiEvent.PreRender)
            {
                int errcode = 0;
                for (int i = 0; i < context.RebuildTexts.Count; i++)
                {
                    var text = context.RebuildTexts[i];
                    if (text == null)
                    {
                        continue;
                    }

                    int index = context.AllTexts.IndexOf(text);
                    if (index == -1)
                    {
                        continue;
                    }

                    var result = context.Results[index];
                    result.ParseGroup.EmojiResult.Clear();

                    if (result.ParseGroup.TextResult.FormatElements != null && result.ParseGroup.TextResult.FormatElements.Count > 0)
                    {
                        if (_sb == null)
                        {
                            _sb = new StringBuilder(result.ParseGroup.TextResult.FormatString);
                        }
                        else
                        {
                            _sb.Length = 0;
                            _sb.Append(result.ParseGroup.TextResult.FormatString);
                        }

                        int   addedcnt   = 0;
                        float linesize   = 0;
                        int   emojistart = -1;
                        int   emojiidx   = 0;
                        if (emojiidx < result.ParseGroup.TextResult.GetPoints().Count)
                        {
                            emojistart = result.ParseGroup.TextResult.GetPoints()[emojiidx];
                            //不相等 刷新缓存
                            if (_lasttext != text)
                            {
                                Vector2 extents = text.rectTransform.rect.size;
                                TextGenerationSettings settings = text.GetGenerationSettings(extents);
                                text.cachedTextGenerator.Populate(DoublePlaceholder, settings);

                                if (text.cachedTextGenerator.vertexCount < 8)
                                {
                                    errcode = (int)EmojiErrorCode.VertTooLarge;
                                    break;
                                }

                                IList <UIVertex> spaceverts  = text.cachedTextGenerator.verts;
                                float            spacewid    = spaceverts[1].position.x - spaceverts[0].position.x;
                                float            spaceheight = spaceverts[0].position.y - spaceverts[3].position.y;

                                _space     = spaceverts[4].position.x - spaceverts[1].position.x;
                                _placesize = new Vector2(spacewid, spaceheight);
                                _lasttext  = text;
                            }
                        }

                        float textsize = text.rectTransform.rect.width;

                        for (int charindex = 0; charindex < result.ParseGroup.TextResult.GetPartSize().Count; charindex++)
                        {
                            while (emojistart == charindex &&
                                   InsertEmoji(text, ref result, ref emojiidx, ref context, ref linesize, ref emojistart, ref addedcnt))
                            {
                                //fix line
                                if (text.horizontalOverflow != HorizontalWrapMode.Overflow && linesize > textsize - _space - _placesize.x)//这个字符自动跳到下一行
                                {
                                    linesize = 0;
                                }
                            }

                            if (emojistart < 0)
                            {
                                break;
                            }

                            float w = result.ParseGroup.TextResult.GetPartSize()[charindex];
                            linesize += w;

                            //fix line
                            if (text.horizontalOverflow != HorizontalWrapMode.Overflow && linesize > textsize - _space - _placesize.x)//这个字符自动跳到下一行
                            {
                                linesize = 0;
                            }
                        }

                        //fill last
                        if (emojistart >= 0)
                        {
                            while (emojistart == result.ParseGroup.TextResult.GetPartSize().Count &&
                                   InsertEmoji(text, ref result, ref emojiidx, ref context, ref linesize, ref emojistart, ref addedcnt))
                            {
                                //fix line
                                if (text.horizontalOverflow != HorizontalWrapMode.Overflow && linesize > textsize - _space - _placesize.x)//这个字符自动跳到下一行
                                {
                                    linesize = 0;
                                }
                            }
                        }

                        result.ParseGroup.TextResult.FormatString = _sb.ToString();
                    }

                    //assign
                    context.Results[index] = result;
                }

                _lasttext = null;
                return(errcode);
            }

            return(0);
        }