using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Text; using Unity.Collections; using UnityEngine; namespace UnityEditor.U2D.PSD { class UniqueNameGenerator { List m_NameHash = new List(); public bool ContainHash(int i) { return m_NameHash.Contains(i); } public void AddHash(int i) { m_NameHash.Add(i); } public void AddHash(string name) { m_NameHash.Add(GetStringHash(name)); } public string GetUniqueName(string name, bool logNewNameGenerated = false, UnityEngine.Object context = null) { return GetUniqueName(name, m_NameHash); } static string GetUniqueName(string name, List stringHash, bool logNewNameGenerated = false, UnityEngine.Object context = null) { var sanitizedName = string.Copy(SanitizeName(name)); string uniqueName = sanitizedName; int index = 1; while (true) { var hash = GetStringHash(uniqueName); if (!stringHash.Contains(hash)) { stringHash.Add(hash); if (logNewNameGenerated && sanitizedName != uniqueName) Debug.Log(string.Format("Asset name {0} is changed to {1} to ensure uniqueness", name, uniqueName), context); return uniqueName; } uniqueName = string.Format("{0}_{1}", sanitizedName, index); ++index; } } static string SanitizeName(string name) { name = name.Replace('\0', ' '); string newName = null; // We can't create asset name with these name. if ((name.Length == 2 && name[0] == '.' && name[1] == '.') || (name.Length == 1 && name[0] == '.') || (name.Length == 1 && name[0] == '/')) newName += name + "_"; if (!string.IsNullOrEmpty(newName)) { Debug.LogWarning(string.Format("File contains layer with invalid name for generating asset. {0} is renamed to {1}", name, newName)); return newName; } return name; } static int GetStringHash(string str) { MD5 md5Hasher = MD5.Create(); var hashed = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(str)); return BitConverter.ToInt32(hashed, 0); } } class GameObjectCreationFactory : UniqueNameGenerator { public GameObject CreateGameObject(string name, params System.Type[] components) { var newName = GetUniqueName(name); return new GameObject(newName, components); } } internal static class ImportUtilities { public static string SaveToPng(NativeArray buffer, int width, int height) { if (!buffer.IsCreated || buffer.Length == 0 || width == 0 || height == 0) return "No .png generated."; var texture2D = new Texture2D(width, height); texture2D.SetPixels32(buffer.ToArray()); var png = texture2D.EncodeToPNG(); var path = Application.dataPath + $"/tex_{System.Guid.NewGuid().ToString()}.png"; var fileStream = System.IO.File.Create(path); fileStream.Write(png); fileStream.Close(); UnityEngine.Object.DestroyImmediate(texture2D); return path; } } }