コード例 #1
0
ファイル: Program.cs プロジェクト: SoapyWet/Breckfest
        private static string processFile(string path)
        {
            BMAP   bmap       = new BMAP();
            string extension  = Path.GetExtension(path).Substring(1);
            string outputName = "";

            if (settings.Raw)
            {
                if (Raw.IsValid(path))
                {
                    Console.WriteLine("Loading  : {0}", Path.GetFileName(path));
                    Raw.Load(path, true);

                    return(path);
                }
            }
            else if (settings.Compress)
            {
                WreckfestExtensions we;

                if (Enum.TryParse <WreckfestExtensions>(extension, out we))
                {
                    using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path)))
                        using (BinaryReader br = new BinaryReader(ms))
                        {
                            if (
                                br.ReadInt32() != 4 ||
                                br.ReadByte() != extension[3] ||
                                br.ReadByte() != extension[2] ||
                                br.ReadByte() != extension[1] ||
                                br.ReadByte() != extension[0])
                            {
                                br.BaseStream.Position = 0;
                                var input = br.ReadBytes((int)ms.Length);

                                File.Move(path, path + ".bak");

                                using (BinaryWriter bw = new BinaryWriter(new FileStream(path, FileMode.Create)))
                                {
                                    bw.Write(4);
                                    bw.Write(extension[3]);
                                    bw.Write(extension[2]);
                                    bw.Write(extension[1]);
                                    bw.Write(extension[0]);
                                    bw.Write((int)we);

                                    var hashTable = new int[1 << (14 - 2)];
                                    var output    = new byte[LZ4Compress.CalculateChunkSize(input.Length)];
                                    int i         = 0;

                                    while (i < input.Length)
                                    {
                                        byte[] chunk = new byte[Math.Min(input.Length - i, output.Length)];

                                        Array.Copy(input, i, chunk, 0, chunk.Length);
                                        Array.Clear(hashTable, 0, hashTable.Length);

                                        int size = LZ4Compress.Compress(hashTable, chunk, output, chunk.Length, chunk.Length + 4);

                                        bw.Write(size);
                                        bw.Write(output, 0, size);

                                        i += chunk.Length;
                                    }
                                }
                            }
                            else
                            {
                                Console.WriteLine("Skipping : {0} is already compressed", Path.GetFileName(path));
                            }
                        }
                }
                else
                {
                    Console.WriteLine("Error    : unsupported extension '{0}'.", extension);
                }
            }
            else if (extension == "bmap")
            {
                if (BMAP.IsBMAP(path))
                {
                    Console.WriteLine("Loading  : {0}", Path.GetFileName(path));
                    bmap = BMAP.Load(path, false);

                    outputName = string.Format("{0}.{1}.png", Path.GetFileNameWithoutExtension(path), (bmap.Mode == 1 ? "clutter" : (bmap.DDS.Format == D3DFormat.A8R8G8B8 ? "raw" : bmap.DDS.Format.ToString().ToLower())));

                    Console.WriteLine("Saving   : {0}", outputName);
                    if (!Overwrite(string.Format(@"{0}\{1}", Path.GetDirectoryName(path), outputName)))
                    {
                        return(null);
                    }
                    bmap.SaveAsPNG(outputName);

                    return(path);
                }
            }
            else if (extension == "dds")
            {
                Console.WriteLine("Loading  : {0}", Path.GetFileName(path));
                bmap.Path = Path.GetFileName(path);
                bmap.DDS  = DDS.Load(path);
                Console.WriteLine("Saving   : {0}", Path.GetFileName(path.Replace(".dds", ".bmap")));
                bmap.Save(path.Replace(".dds", ".x.bmap"));

                return(path);
            }
            else if (Array.IndexOf(new string[] { "png", "tga", "tif" }, extension) > -1)
            {
                Texture texture = null;
                Console.WriteLine("Loading   : {0}", Path.GetFileName(path));

                switch (extension)
                {
                case "png":
                    texture = PNG.Load(path);
                    break;

                case "tga":
                    texture = TGA.Load(path);
                    break;

                case "tif":
                    texture = TIF.Load(path);
                    break;
                }

                BreckfestSettings original = settings.Clone();

                if (Path.GetFileNameWithoutExtension(path).EndsWith(".clutter", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Clutter = true;
                    path             = path.Replace(".clutter", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".raw", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.A8R8G8B8;
                    path            = path.Replace(".raw", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".dxt1", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.DXT1;
                    path            = path.Replace(".dxt1", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".dxt5", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.DXT5;
                    path            = path.Replace(".dxt5", "");
                }

                bmap.Path = Path.GetFileName(path);

                if (settings.Clutter)
                {
                    Console.WriteLine("Cluttering: {0}x{1}", texture.Bitmap.Width, texture.Bitmap.Height);

                    bmap.Mode = 1;
                    bmap.Raw  = texture.Bitmap;
                }
                else
                {
                    if (settings.Format == D3DFormat.A8R8G8B8)
                    {
                        Console.WriteLine("Formatting: {0}x{1} (this might take awhile)", texture.Bitmap.Width, texture.Bitmap.Height);
                    }
                    else
                    {
                        Console.WriteLine("Squishing : {0}x{1} (this might take awhile)", texture.Bitmap.Width, texture.Bitmap.Height);
                    }

                    bmap.DDS = new DDS(settings.Format, texture.Bitmap);
                }

                Console.WriteLine("Saving    : {0}", Path.GetFileName(path.Replace(string.Format(".{0}", extension), ".bmap")));
                bmap.Save(path.Replace(string.Format(".{0}", extension), ".x.bmap"), true);

                settings = original.Clone();

                return(path);
            }

            return(null);
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: talberti/Breckfest
        private static string processFile(string path)
        {
            BMAP bmap = new BMAP();
            string extension = Path.GetExtension(path).Substring(1);
            string outputName = "";

            if (settings.Raw)
            {
                if (Raw.IsValid(path))
                {
                    Console.WriteLine("Loading  : {0}", Path.GetFileName(path));
                    Raw.Load(path, true);

                    return path;
                }
            }
            else if (settings.Compress)
            {
                WreckfestExtensions we;

                if (Enum.TryParse<WreckfestExtensions>(extension, out we))
                {
                    using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path)))
                    using (BinaryReader br = new BinaryReader(ms))
                    {
                        if (
                            br.ReadInt32() != 4 ||
                            br.ReadByte() != extension[3] ||
                            br.ReadByte() != extension[2] ||
                            br.ReadByte() != extension[1] ||
                            br.ReadByte() != extension[0])
                        {
                            br.BaseStream.Position = 0;
                            var input = br.ReadBytes((int)ms.Length);

                            File.Move(path, path + ".bak");

                            using (BinaryWriter bw = new BinaryWriter(new FileStream(path, FileMode.Create)))
                            {
                                bw.Write(4);
                                bw.Write(extension[3]);
                                bw.Write(extension[2]);
                                bw.Write(extension[1]);
                                bw.Write(extension[0]);
                                bw.Write((int)we);

                                var hashTable = new int[1 << (14 - 2)];
                                var output = new byte[LZ4Compress.CalculateChunkSize(input.Length)];
                                int i = 0;

                                while (i < input.Length)
                                {
                                    byte[] chunk = new byte[Math.Min(input.Length - i, output.Length)];

                                    Array.Copy(input, i, chunk, 0, chunk.Length);
                                    Array.Clear(hashTable, 0, hashTable.Length);

                                    int size = LZ4Compress.Compress(hashTable, chunk, output, chunk.Length, chunk.Length + 4);

                                    bw.Write(size);
                                    bw.Write(output, 0, size);

                                    i += chunk.Length;
                                }
                            }
                        }
                        else
                        {
                            Console.WriteLine("Skipping : {0} is already compressed", Path.GetFileName(path));
                        }
                    }
                }
                else
                {
                    Console.WriteLine("Error    : unsupported extension '{0}'.", extension);
                }
            }
            else if (extension == "bmap")
            {
                if (BMAP.IsBMAP(path))
                {
                    Console.WriteLine("Loading  : {0}", Path.GetFileName(path));
                    bmap = BMAP.Load(path, false);

                    outputName = string.Format("{0}.{1}.png", Path.GetFileNameWithoutExtension(path), (bmap.Mode == 1 ? "clutter" : (bmap.DDS.Format == D3DFormat.A8R8G8B8 ? "raw" : bmap.DDS.Format.ToString().ToLower())));

                    Console.WriteLine("Saving   : {0}", outputName);
                    if (!Overwrite(Path.GetFullPath(path.Replace(Path.GetFileName(path), outputName)))) { return null; }
                    bmap.SaveAsPNG(outputName);

                    return path;
                }
            }
            else if (extension == "dds")
            {
                Console.WriteLine("Loading  : {0}", Path.GetFileName(path));
                bmap.Path = Path.GetFileName(path);
                bmap.DDS = DDS.Load(path);

                if (!settings.NoRename)
                {

                    if (!Overwrite(Path.GetFullPath(path.Replace(".dds", ".x.bmap")))) { return null; }
                    Console.WriteLine("Saving   : {0}", Path.GetFileName(path.Replace(".dds", ".x.bmap")));
                    bmap.Save(path.Replace(".dds", ".x.bmap"));
                }
                else
                {
                    if (!Overwrite(Path.GetFullPath(path.Replace(".dds", ".bmap")))) { return null; }
                    Console.WriteLine("Saving   : {0}", Path.GetFileName(path.Replace(".dds", ".bmap")));
                    bmap.Save(path.Replace(".dds", ".bmap"));
                }

                return path;
            }
            else if (Array.IndexOf(new string[] { "png", "tga", "tif" }, extension) > -1)
            {
                Texture texture = null;
                Console.WriteLine("Loading   : {0}", Path.GetFileName(path));

                switch (extension)
                {
                    case "png":
                        texture = PNG.Load(path);
                        break;

                    case "tga":
                        texture = TGA.Load(path);
                        break;

                    case "tif":
                        texture = TIF.Load(path);
                        break;
                }

                BreckfestSettings original = settings.Clone();

                if (Path.GetFileNameWithoutExtension(path).EndsWith(".clutter", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Clutter = true;
                    path = path.Replace(".clutter", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".raw", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.A8R8G8B8;
                    path = path.Replace(".raw", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".dxt1", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.DXT1;
                    path = path.Replace(".dxt1", "");
                }
                else if (Path.GetFileNameWithoutExtension(path).EndsWith(".dxt5", StringComparison.OrdinalIgnoreCase))
                {
                    settings.Format = D3DFormat.DXT5;
                    path = path.Replace(".dxt5", "");
                }

                bmap.Path = Path.GetFileName(path);

                if (settings.Clutter)
                {
                    Console.WriteLine("Cluttering: {0}x{1}", texture.Bitmap.Width, texture.Bitmap.Height);

                    bmap.Mode = 1;
                    bmap.Raw = texture.Bitmap;
                }
                else
                {
                    if (settings.Format == D3DFormat.A8R8G8B8)
                    {
                        Console.WriteLine("Formatting: {0}x{1} (this might take awhile)", texture.Bitmap.Width, texture.Bitmap.Height);
                    }
                    else
                    {
                        Console.WriteLine("Squishing : {0}x{1} (this might take awhile)", texture.Bitmap.Width, texture.Bitmap.Height);
                    }

                    bmap.DDS = new DDS(settings.Format, texture.Bitmap);
                }

                if (!settings.NoRename)
                {

                    if (!Overwrite(Path.GetFullPath(path.Replace(string.Format(".{0}", extension), ".x.bmap")))) { return null; }
                    Console.WriteLine("Saving    : {0}", Path.GetFileName(path.Replace(string.Format(".{0}", extension), ".x.bmap")));

                    bmap.Save(path.Replace(string.Format(".{0}", extension), ".x.bmap"), true);
                }
                else
                {
                    if (!Overwrite(Path.GetFullPath(path.Replace(string.Format(".{0}", extension), ".bmap")))) { return null; }
                    Console.WriteLine("Saving    : {0}", Path.GetFileName(path.Replace(string.Format(".{0}", extension), ".bmap")));
                    bmap.Save(path.Replace(string.Format(".{0}", extension), ".bmap"), true);
                }
                settings = original.Clone();

                return path;
            }

            return null;
        }