/* UniGif Copyright (c) 2015 WestHillApps (Hironari Nishioka) This software is released under the MIT License. http://opensource.org/licenses/mit-license.php */ using System; using System.Collections.Generic; using System.Text; using UnityEngine; public static partial class UniGif { /// /// Gif Texture /// public class GifTexture { // Texture public Texture2D m_texture2d; // Delay time until the next texture. public float m_delaySec; public GifTexture(Texture2D texture2d, float delaySec) { m_texture2d = texture2d; m_delaySec = delaySec; } } /// /// GIF Data Format /// private struct GifData { // Signature public byte m_sig0, m_sig1, m_sig2; // Version public byte m_ver0, m_ver1, m_ver2; // Logical Screen Width public ushort m_logicalScreenWidth; // Logical Screen Height public ushort m_logicalScreenHeight; // Global Color Table Flag public bool m_globalColorTableFlag; // Color Resolution public int m_colorResolution; // Sort Flag public bool m_sortFlag; // Size of Global Color Table public int m_sizeOfGlobalColorTable; // Background Color Index public byte m_bgColorIndex; // Pixel Aspect Ratio public byte m_pixelAspectRatio; // Global Color Table public List m_globalColorTable; // ImageBlock public List m_imageBlockList; // GraphicControlExtension public List m_graphicCtrlExList; // Comment Extension public List m_commentExList; // Plain Text Extension public List m_plainTextExList; // Application Extension public ApplicationExtension m_appEx; // Trailer public byte m_trailer; public string signature { get { char[] c = { (char)m_sig0, (char)m_sig1, (char)m_sig2 }; return new string(c); } } public string version { get { char[] c = { (char)m_ver0, (char)m_ver1, (char)m_ver2 }; return new string(c); } } public void Dump() { Debug.Log("GIF Type: " + signature + "-" + version); Debug.Log("Image Size: " + m_logicalScreenWidth + "x" + m_logicalScreenHeight); Debug.Log("Animation Image Count: " + m_imageBlockList.Count); Debug.Log("Animation Loop Count (0 is infinite): " + m_appEx.loopCount); if (m_graphicCtrlExList != null && m_graphicCtrlExList.Count > 0) { var sb = new StringBuilder("Animation Delay Time (1/100sec)"); for (int i = 0; i < m_graphicCtrlExList.Count; i++) { sb.Append(", "); sb.Append(m_graphicCtrlExList[i].m_delayTime); } Debug.Log(sb.ToString()); } Debug.Log("Application Identifier: " + m_appEx.applicationIdentifier); Debug.Log("Application Authentication Code: " + m_appEx.applicationAuthenticationCode); } } /// /// Image Block /// private struct ImageBlock { // Image Separator public byte m_imageSeparator; // Image Left Position public ushort m_imageLeftPosition; // Image Top Position public ushort m_imageTopPosition; // Image Width public ushort m_imageWidth; // Image Height public ushort m_imageHeight; // Local Color Table Flag public bool m_localColorTableFlag; // Interlace Flag public bool m_interlaceFlag; // Sort Flag public bool m_sortFlag; // Size of Local Color Table public int m_sizeOfLocalColorTable; // Local Color Table public List m_localColorTable; // LZW Minimum Code Size public byte m_lzwMinimumCodeSize; // Block Size & Image Data List public List m_imageDataList; public struct ImageDataBlock { // Block Size public byte m_blockSize; // Image Data public byte[] m_imageData; } } /// /// Graphic Control Extension /// private struct GraphicControlExtension { // Extension Introducer public byte m_extensionIntroducer; // Graphic Control Label public byte m_graphicControlLabel; // Block Size public byte m_blockSize; // Disposal Mothod public ushort m_disposalMethod; // Transparent Color Flag public bool m_transparentColorFlag; // Delay Time public ushort m_delayTime; // Transparent Color Index public byte m_transparentColorIndex; // Block Terminator public byte m_blockTerminator; } /// /// Comment Extension /// private struct CommentExtension { // Extension Introducer public byte m_extensionIntroducer; // Comment Label public byte m_commentLabel; // Block Size & Comment Data List public List m_commentDataList; public struct CommentDataBlock { // Block Size public byte m_blockSize; // Image Data public byte[] m_commentData; } } /// /// Plain Text Extension /// private struct PlainTextExtension { // Extension Introducer public byte m_extensionIntroducer; // Plain Text Label public byte m_plainTextLabel; // Block Size public byte m_blockSize; // Block Size & Plain Text Data List public List m_plainTextDataList; public struct PlainTextDataBlock { // Block Size public byte m_blockSize; // Plain Text Data public byte[] m_plainTextData; } } /// /// Application Extension /// private struct ApplicationExtension { // Extension Introducer public byte m_extensionIntroducer; // Extension Label public byte m_extensionLabel; // Block Size public byte m_blockSize; // Application Identifier public byte m_appId1, m_appId2, m_appId3, m_appId4, m_appId5, m_appId6, m_appId7, m_appId8; // Application Authentication Code public byte m_appAuthCode1, m_appAuthCode2, m_appAuthCode3; // Block Size & Application Data List public List m_appDataList; public struct ApplicationDataBlock { // Block Size public byte m_blockSize; // Application Data public byte[] m_applicationData; } public string applicationIdentifier { get { char[] c = { (char)m_appId1, (char)m_appId2, (char)m_appId3, (char)m_appId4, (char)m_appId5, (char)m_appId6, (char)m_appId7, (char)m_appId8 }; return new string(c); } } public string applicationAuthenticationCode { get { char[] c = { (char)m_appAuthCode1, (char)m_appAuthCode2, (char)m_appAuthCode3 }; return new string(c); } } public int loopCount { get { if (m_appDataList == null || m_appDataList.Count < 1 || m_appDataList[0].m_applicationData.Length < 3 || m_appDataList[0].m_applicationData[0] != 0x01) { return 0; } return BitConverter.ToUInt16(m_appDataList[0].m_applicationData, 1); } } } }