internal void RegisterImageFromData(string textureName, string key, byte[] data)
        {
            var name         = textureName.SanitizeForFileSystem();
            var originalHash = HashHelper.Compute(data);

            // allow hash and key to be the same; only store one of them then!
            string fileName;

            if (key == originalHash)
            {
                fileName = name + " [" + key + "].png";
            }
            else
            {
                fileName = name + " [" + key + "-" + originalHash + "].png";
            }

            var fullName = Path.Combine(Settings.TexturesPath, fileName);

            File.WriteAllBytes(fullName, data);
            XuaLogger.AutoTranslator.Info("Dumped texture file: " + fileName);

            _keyToFileName[key] = fullName;

            if (Settings.LoadUnmodifiedTextures)
            {
                var source = new FileSystemTranslatedImageSource(fullName);
                RegisterTranslatedImage(fullName, key, data, source);
            }
            else
            {
                RegisterUntranslatedImage(key);
            }
        }
        private void RegisterImageFromFile(string fullFileName)
        {
            var fileExists = File.Exists(fullFileName);

            if (fileExists)
            {
                // Perhaps use this instead???? https://github.com/icsharpcode/SharpZipLib/wiki/Unpack-a-zip-using-ZipInputStream
                if (fullFileName.EndsWith(".zip", StringComparison.OrdinalIgnoreCase))
                {
                    var zf = new ZipFile(fullFileName);
                    try
                    {
                        foreach (var entry in zf)
                        {
                            if (entry is ZipEntry zipEntry)
                            {
                                if (zipEntry.IsFile && zipEntry.Name.EndsWith(".png", StringComparison.OrdinalIgnoreCase))
                                {
                                    var source = new ZipFileTranslatedImageSource(zf, zipEntry);
                                    RegisterImageFromStream(fullFileName + '\\' + zipEntry.Name, source);
                                }
                            }
                        }
                    }
                    finally
                    {
                        if (Settings.CacheTexturesInMemory)
                        {
                            zf.Close();
                        }
                    }
                }
                else
                {
                    var source = new FileSystemTranslatedImageSource(fullFileName);
                    RegisterImageFromStream(fullFileName, source);
                }
            }
        }