Example #1
0
        internal static byte[] LoadImageBytes(string path, ResourceMetadata metadata, FreeMountContext context)
        {
            byte[] data;
            Bitmap image = null;
            var    ext   = Path.GetExtension(path)?.ToLowerInvariant();

            if (metadata.Compress == PsbCompressType.ByName && ext != null && metadata.Name != null &&
                metadata.Name.EndsWith(ext, true, null))
            {
                return(File.ReadAllBytes(path));
            }

            switch (ext)
            {
            //tlg
            case ".tlg" when metadata.Compress == PsbCompressType.Tlg:
                return(File.ReadAllBytes(path));

            case ".tlg":
                image = context.ResourceToBitmap(".tlg", File.ReadAllBytes(path));
                break;

            //rl
            case ".rl" when metadata.Compress == PsbCompressType.RL:
                return(File.ReadAllBytes(path));

            case ".rl" when metadata.Compress == PsbCompressType.None:
                return(RL.Decompress(File.ReadAllBytes(path)));

            case ".rl":
                image = RL.DecompressToImage(File.ReadAllBytes(path), metadata.Height, metadata.Width,
                                             metadata.PixelFormat);
                break;

            //raw
            case ".raw" when metadata.Compress == PsbCompressType.None:
                return(File.ReadAllBytes(path));

            case ".raw" when metadata.Compress == PsbCompressType.RL:
                return(RL.Compress(File.ReadAllBytes(path)));

            case ".raw":
                image = RL.ConvertToImage(File.ReadAllBytes(path), metadata.Height, metadata.Width,
                                          metadata.PixelFormat);
                break;

            //bin
            case ".bin":
                return(File.ReadAllBytes(path));

            //image
            default:
                if (SupportedImageExt.Contains(ext))
                {
                    image = new Bitmap(path);
                }
                else if (context.SupportImageExt(ext))
                {
                    image = context.ResourceToBitmap(ext, File.ReadAllBytes(path));
                }
                else
                {
                    //MARK: No longer try to read files we don't know
                    //return File.ReadAllBytes(path);
                    return(null);
                }

                break;
            }

            switch (metadata.Compress)
            {
            case PsbCompressType.RL:
                data = RL.CompressImage(image, metadata.PixelFormat);
                break;

            case PsbCompressType.Tlg:
                data = context.BitmapToResource(".tlg", image);
                if (data == null)
                {
                    var tlgPath = Path.ChangeExtension(path, ".tlg");
                    if (File.Exists(tlgPath))
                    {
                        Console.WriteLine($"[WARN] Can not encode TLG, using {tlgPath}");
                        data = File.ReadAllBytes(tlgPath);
                    }
                    else
                    {
                        Console.WriteLine($"[WARN] Can not convert image to TLG: {path}");
                        data = File.ReadAllBytes(path);
                    }
                }

                break;

            case PsbCompressType.ByName:
                var imgExt = Path.GetExtension(metadata.Name);
                if (context.SupportImageExt(imgExt))
                {
                    data = context.BitmapToResource(imgExt, image);
                }
                else
                {
                    Console.WriteLine($"[WARN] Unsupported image: {path}");
                    data = File.ReadAllBytes(path);
                }

                break;

            case PsbCompressType.None:
            default:
                data = RL.GetPixelBytesFromImage(image, metadata.PixelFormat);
                break;
            }

            return(data);
        }