Esempio n. 1
0
        private static void PushSprite(EmojiTexture emojiTex)
        {
            if (currentEmojiIndex >= SHEET_TILES * SHEET_TILES)
            {
                var newSheet = CreateTMP_SpriteAsset();
                rootEmojiAsset.fallbackSpriteAssets.Add(newSheet);
                currentEmojiAsset = newSheet;
                currentEmojiIndex = 0;
            }

            int row    = currentEmojiIndex % SHEET_TILES;
            int column = currentEmojiIndex / SHEET_TILES;

            if (EmojiTexture.CanCopyTextures)
            {
                Graphics.CopyTexture(emojiTex, 0, 0, 0, 0, EMOJI_SIZE, EMOJI_SIZE,
                                     currentEmojiAsset.spriteSheet, 0, 0, row * EMOJI_SIZE,
                                     (SHEET_SIZE)-((column + 1) * EMOJI_SIZE));
            }
            else
            {
                //If we can't copy on the GPU, we copy on the CPU
                var pixels = ((Texture2D)emojiTex).GetPixels32(0);
                ((Texture2D)currentEmojiAsset.spriteSheet).SetPixels32(
                    row * EMOJI_SIZE, (SHEET_SIZE)-((column + 1) * EMOJI_SIZE), EMOJI_SIZE, EMOJI_SIZE, pixels, 0);

                //Free CPU copy of the texture (mark as non readable) if it's full
                var makeNoLongerReadable = currentEmojiIndex == SHEET_TILES * SHEET_TILES - 1;
                if (makeNoLongerReadable)
                {
                    ((Texture2D)currentEmojiAsset.spriteSheet).Apply(false, makeNoLongerReadable);
                }
                textureNeedsApply = !makeNoLongerReadable;
            }

            TMP_Sprite tmp_Sprite = new TMP_Sprite();

            tmp_Sprite.hashCode = TMP_TextUtilities.GetSimpleHashCode(emojiTex.Text);
            tmp_Sprite.height   = EMOJI_SIZE;
            tmp_Sprite.id       = currentEmojiIndex;
            tmp_Sprite.name     = emojiTex.Text;
            tmp_Sprite.pivot    = Vector2.one * 0.5f;
            tmp_Sprite.scale    = 1;
            tmp_Sprite.unicode  = emojiTexture.Unicode;
            tmp_Sprite.width    = EMOJI_SIZE;
            tmp_Sprite.x        = row * EMOJI_SIZE;
            tmp_Sprite.xAdvance = EMOJI_SIZE;
            tmp_Sprite.xOffset  = 0;
            tmp_Sprite.y        = (SHEET_SIZE)-((column + 1) * EMOJI_SIZE);
            tmp_Sprite.yOffset  = EMOJI_SIZE * 0.9f;

            currentEmojiAsset.spriteInfoList.Add(tmp_Sprite);
            currentEmojiAsset.UpdateLookupTables();
            currentEmojiIndex++;
        }
Esempio n. 2
0
        public static bool Process(string text)
        {
            bool spriteSheetUpdated = false;

            if (rootEmojiAsset == null)
            {
                return(spriteSheetUpdated);
            }

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

            int index = -1;

            while ((index = EmojiTexture.IndexOfFirstEmoji(text)) != -1)
            {
                text = text.Substring(index);
                emojiTexture.Text = text;

                if (!string.IsNullOrEmpty(emojiTexture.Text))
                {
                    int             spriteIndex = -1;
                    TMP_SpriteAsset spriteAsset = TMP_SpriteAsset
                                                  .SearchForSpriteByUnicode(rootEmojiAsset, emojiTexture.Unicode, true, out spriteIndex);
                    if (spriteAsset == null)
                    {
                        PushSprite(emojiTexture);
                        spriteSheetUpdated = true;
                    }
                    text = text.Substring(emojiTexture.Text.Length);
                }
                else
                {
                    break;
                }
            }

            //If the texture has unsaved changes, we apply them here
            //And make it non readable if it is full
            if (textureNeedsApply)
            {
                var makeNoLongerReadable = currentEmojiIndex == SHEET_TILES * SHEET_TILES;
                ((Texture2D)currentEmojiAsset.spriteSheet).Apply(false, makeNoLongerReadable);
                textureNeedsApply = false;
            }

            return(spriteSheetUpdated);
        }
Esempio n. 3
0
        public static IEnumerator SetGithubEmoji(EmojiTexture emojiTexture, int unicode)
        {
            if (!IsInitialized)
            {
                yield return(Initialize());

                if (!IsInitialized)
                {
                    yield break;
                }
            }

            if (!mapUnicode.ContainsKey(unicode))
            {
                yield break;
            }

            string text = char.ConvertFromUtf32(unicode);

            string url = mapUnicode[unicode];

            string filename    = "";
            bool   isLocalFile = false;

            if (cacheEnabled)
            {
                string folder = Path.Combine(Application.persistentDataPath, CACHE_FOLDER);
                filename = Path.GetFileNameWithoutExtension(url) + ".png";
                filename = Path.Combine(folder, filename);
                if (File.Exists(filename))
                {
                    url         = "file://" + filename;
                    isLocalFile = true;
                }
            }
            yield return(emojiTexture.Download(url, text));

            if (!isLocalFile && cacheEnabled && emojiTexture.didDownloadTexture)
            {
                Texture2D texture = emojiTexture;
                File.WriteAllBytes(filename, texture.EncodeToPNG());
            }
        }
Esempio n. 4
0
        public static IEnumerator SetGithubEmoji(EmojiTexture emojiTexture, string text)
        {
            if (string.IsNullOrEmpty(text))
            {
                yield break;
            }

            if (!IsInitialized)
            {
                yield return(Initialize());

                if (!IsInitialized)
                {
                    yield break;
                }
            }

            int unicode;

            if (text.StartsWith(":", StringComparison.Ordinal) && text.EndsWith(":", StringComparison.Ordinal) &&
                mapKeyword.ContainsKey(text.Trim(':')))
            {
                text = Path.GetFileNameWithoutExtension((string)mapKeyword[text.Trim(':')]);
            }

            if (text.Length == 1)
            {
                unicode = text[0];
            }
            else if (char.IsSurrogatePair(text, 0))
            {
                unicode = char.ConvertToUtf32(text, 0);
            }
            else if (!int.TryParse(text, System.Globalization.NumberStyles.HexNumber, null, out unicode))
            {
                yield break;
            }

            yield return(SetGithubEmoji(emojiTexture, unicode));
        }
        public static void HookTMP(TMP_Text tmp_Text)
        {
            if (tmp_Text == null)
            {
                return;
            }

            if (rootEmojiAsset == null)
            {
                canCopyTextures = SystemInfo.copyTextureSupport != UnityEngine.Rendering.CopyTextureSupport.None;

                rootEmojiAsset    = CreateTMP_SpriteAsset();
                currentEmojiAsset = rootEmojiAsset;
                currentEmojiIndex = 0;
            }

            if (emojiTexture == null)
            {
                emojiTexture = new EmojiTexture(EMOJI_SIZE);
            }

            if (tmp_Text.spriteAsset == null)
            {
                tmp_Text.spriteAsset = rootEmojiAsset;
            }
            else if (tmp_Text.spriteAsset != rootEmojiAsset)
            {
                if (tmp_Text.spriteAsset.fallbackSpriteAssets == null)
                {
                    tmp_Text.spriteAsset.fallbackSpriteAssets = new List <TMP_SpriteAsset>();
                }

                if (!tmp_Text.spriteAsset.fallbackSpriteAssets.Contains(rootEmojiAsset))
                {
                    tmp_Text.spriteAsset.fallbackSpriteAssets.Add(rootEmojiAsset);
                }
            }
        }
Esempio n. 6
0
        public static void HookTMP(TMP_Text tmp_Text)
        {
            if (tmp_Text == null)
            {
                return;
            }

            if (rootEmojiAsset == null)
            {
                rootEmojiAsset    = CreateTMP_SpriteAsset();
                currentEmojiAsset = rootEmojiAsset;
                currentEmojiIndex = 0;
            }

            if (emojiTexture == null)
            {
                emojiTexture = new EmojiTexture(EMOJI_SIZE);
            }

            if (tmp_Text.spriteAsset == null)
            {
                tmp_Text.spriteAsset = rootEmojiAsset;
            }
            else if (tmp_Text.spriteAsset != rootEmojiAsset)
            {
                if (tmp_Text.spriteAsset.fallbackSpriteAssets == null)
                {
                    tmp_Text.spriteAsset.fallbackSpriteAssets = new List <TMP_SpriteAsset>();
                }

                if (!tmp_Text.spriteAsset.fallbackSpriteAssets.Contains(rootEmojiAsset))
                {
                    tmp_Text.spriteAsset.fallbackSpriteAssets.Add(rootEmojiAsset);
                }
            }
        }
Esempio n. 7
0
 public static IEnumerator SetGithubEmoji(this EmojiTexture emojiTexture, string text)
 {
     yield return(GithubHelper.SetGithubEmoji(emojiTexture, text));
 }
Esempio n. 8
0
 public static IEnumerator SetGithubEmoji(this EmojiTexture emojiTexture, int unicode)
 {
     yield return(GithubHelper.SetGithubEmoji(emojiTexture, unicode));
 }
Esempio n. 9
0
        public static IEnumerator ProcessAsync(string text)
        {
            didProcessAsync = false;
            if (rootEmojiAsset == null)
            {
                yield break;
            }

            if (string.IsNullOrEmpty(text))
            {
                yield break;
            }

            List <string> detectedEmojis = new List <string>();

            string emojiText = null;

            while ((emojiText = EmojiTexture.GetFirstEmoji(text)) != null)
            {
                text = text.Substring(text.IndexOf(emojiText, System.StringComparison.Ordinal));

                if (!string.IsNullOrEmpty(emojiText))
                {
                    int             spriteIndex = -1;
                    TMP_SpriteAsset spriteAsset = TMP_SpriteAsset
                                                  .SearchForSpriteByUnicode(rootEmojiAsset, char.ConvertToUtf32(emojiText, 0), true, out spriteIndex);
                    if (spriteAsset == null)
                    {
                        detectedEmojis.Add(emojiText);
                    }
                    text = text.Substring(emojiText.Length);
                }
                else
                {
                    break;
                }
            }

            if (detectedEmojis.Count > 0)
            {
                yield return(GithubHelper.Initialize());
            }

            foreach (var detectedEmoji in detectedEmojis)
            {
                string hex = char.ConvertToUtf32(detectedEmoji, 0).ToString("X");

                if (GithubHelper.IsValid(hex))
                {
                    yield return(emojiTexture.SetGithubEmoji(hex));

                    if (emojiTexture.didDownloadTexture)
                    {
                        PushSprite(emojiTexture);
                        didProcessAsync = true;
                    }
                }
            }

            //If the texture has unsaved changes, we apply them here
            //And make it non readable if it is full
            if (textureNeedsApply)
            {
                var makeNoLongerReadable = currentEmojiIndex == SHEET_TILES * SHEET_TILES;
                ((Texture2D)currentEmojiAsset.spriteSheet).Apply(false, makeNoLongerReadable);
                textureNeedsApply = false;
            }
        }