private static bool GetChunkSHA1(Superbundle.BundleInfo bundleInfo,
                                         List <TableOfContentsFile> commonBundles,
                                         Guid chunkId,
                                         out SHA1 chunkSHA1)
        {
            if (bundleInfo.Chunks != null)
            {
                var chunkInfo = bundleInfo.Chunks.FirstOrDefault(ci => ci.Id == chunkId);
                if (chunkInfo != null)
                {
                    chunkSHA1 = chunkInfo.SHA1;
                    return(true);
                }
            }

            var commonChunkInfo = commonBundles.SelectMany(cb => cb.Chunks)
                                  .FirstOrDefault(ci => ci.Id == chunkId);

            if (commonChunkInfo != null)
            {
                chunkSHA1 = commonChunkInfo.SHA1;
                return(true);
            }

            chunkSHA1 = default(SHA1);
            return(false);
        }
        private static bool ConvertTexture(Superbundle.BundleInfo bundleInfo,
                                           Superbundle.ResourceInfo resourceInfo,
                                           ICatalogEntryInfo entry,
                                           string outputPath,
                                           CatalogLookup catalogLookup,
                                           List <TableOfContentsFile> commonBundles)
        {
            TextureHeader textureHeader;

            using (var temp = new MemoryStream())
            {
                Extraction.Extract(resourceInfo, entry, temp);
                temp.Position = 0;
                textureHeader = TextureHeader.Read(temp);
                if (temp.Position != temp.Length)
                {
                    throw new FormatException();
                }
            }

            if (textureHeader.Type != TextureType._2d)
            {
                return(false);
            }

            if (textureHeader.Unknown00 != 0 ||
                textureHeader.Unknown04 != 0 ||
                textureHeader.Unknown10 != 0 ||
                textureHeader.Unknown14 != 0 ||
                textureHeader.Unknown1C != 1)
            {
                throw new FormatException();
            }

            SHA1 chunkSHA1;

            if (GetChunkSHA1(bundleInfo, commonBundles, textureHeader.DataChunkId, out chunkSHA1) == false)
            {
                throw new InvalidOperationException();
            }

            var dataEntry = catalogLookup.GetEntry(chunkSHA1, textureHeader.TotalSize);

            byte[] dataBytes;
            using (var temp = new MemoryStream())
            {
                Extraction.Extract(dataEntry, textureHeader.TotalSize, temp);
                temp.Position = 0;
                dataBytes     = temp.GetBuffer();
            }

            DDSUtils.WriteFile(textureHeader, dataBytes, outputPath + ".dds");
            return(true);
        }