/// <summary> /// Get GIF texture list Coroutine (Avoid lock up but more slow) /// </summary> /// <param name="mb">MonoBehaviour to start the coroutine</param> /// <param name="bytes">GIF file byte data</param> /// <param name="cb">Callback method(param is GIF texture list, Animation loop count, GIF image width (px), GIF image height (px))</param> /// <param name="filterMode">Textures filter mode</param> /// <param name="wrapMode">Textures wrap mode</param> /// <param name="debugLog">Debug Log Flag</param> /// <returns>IEnumerator</returns> public static IEnumerator GetTextureListCoroutine(MonoBehaviour mb, byte[] bytes, Action <List <GifTexture>, int, int, int> cb, FilterMode filterMode = FilterMode.Bilinear, TextureWrapMode wrapMode = TextureWrapMode.Clamp, bool debugLog = false) { int loopCount = -1; int width = 0; int height = 0; // Set GIF data var gifData = new GifData(); if (SetGifData(bytes, ref gifData, debugLog) == false) { Debug.LogError("GIF file data set error."); if (cb != null) { cb(null, loopCount, width, height); } yield break; } // avoid lock up yield return(0); // Decode to textures from GIF data List <GifTexture> gifTexList = null; yield return(mb.StartCoroutine(UniGif.DecodeTextureCoroutine(gifData, gtList => { gifTexList = gtList; }, filterMode, wrapMode))); if (gifTexList == null) { Debug.LogError("GIF texture decode error."); if (cb != null) { cb(null, loopCount, width, height); } yield break; } loopCount = gifData.appEx.loopCount; width = gifData.logicalScreenWidth; height = gifData.logicalScreenHeight; if (cb != null) { cb(gifTexList, loopCount, width, height); } }
/// <summary> /// Get GIF texture list Coroutine (Avoid lock up but more slow) /// </summary> /// <param name="mb">MonoBehaviour to start the coroutine</param> /// <param name="bytes">GIF file byte data</param> /// <param name="cb">Callback method(param is GIF texture list, Animation loop count, GIF image width (px), GIF image height (px))</param> /// <param name="filterMode">Textures filter mode</param> /// <param name="wrapMode">Textures wrap mode</param> /// <param name="debugLog">Debug Log Flag</param> /// <returns>IEnumerator</returns> public static IEnumerator GetTextureListCoroutine(MonoBehaviour mb, byte[] bytes, int instanceId, List <GifTexture> gifTexList, Action <List <GifTexture>, int, int, int> cb, FilterMode filterMode = FilterMode.Bilinear, TextureWrapMode wrapMode = TextureWrapMode.Clamp, bool debugLog = false) { int loopCount = -1; int width = 0; int height = 0; if (gifTexList == null) { gifTexList = new List <GifTexture>(); } else { gifTexList = gifDict[instanceId].textureList; } if (!gifDict.ContainsKey(instanceId)) { // Set GIF data var gifData = new GifData(); if (SetGifData(bytes, ref gifData, debugLog) == false) { Debug.LogError("GIF file data set error."); if (cb != null) { cb(null, loopCount, width, height); } yield break; } loopCount = gifData.appEx.loopCount; width = gifData.logicalScreenWidth; height = gifData.logicalScreenHeight; Debug.Log("loopCount " + loopCount); gifDict.Add(instanceId, new GifAnimation { loopCount = loopCount, width = width, height = height, textureList = gifTexList, }); // avoid lock up yield return(0); // Decode to textures from GIF data yield return(mb.StartCoroutine(UniGif.DecodeTextureCoroutine(gifData, gifTexList, filterMode, wrapMode))); } if (cb != null) { //Debug.Log(gifDict[instanceId].textureList.Count + " " + gifDict[instanceId].loopCount); //if (gifDict[instanceId].textureList.Count == gifDict[instanceId].loopCount) //{ loopCount = gifDict[instanceId].loopCount; width = gifDict[instanceId].width; height = gifDict[instanceId].height; gifTexList = gifDict[instanceId].textureList; cb(gifTexList, loopCount, width, height); // yield break; //} //yield return new WaitForSeconds(0.1f); } }