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++; }
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); }
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()); } }
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); } } }
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); } } }
public static IEnumerator SetGithubEmoji(this EmojiTexture emojiTexture, string text) { yield return(GithubHelper.SetGithubEmoji(emojiTexture, text)); }
public static IEnumerator SetGithubEmoji(this EmojiTexture emojiTexture, int unicode) { yield return(GithubHelper.SetGithubEmoji(emojiTexture, unicode)); }
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; } }