static Rect[] PackAndSaveBitmapsAtlas(
            string atlas_path, Texture2D[] textures, SwfSettingsData settings)
        {
            _progressBar.UpdateProgress("pack bitmaps", 0.25f);
            var atlas_info = PackBitmapsAtlas(textures, settings);

            RevertTexturePremultipliedAlpha(atlas_info.Atlas);
            _progressBar.UpdateProgress("save atlas", 0.5f);
            File.WriteAllBytes(atlas_path, atlas_info.Atlas.EncodeToPNG());
            GameObject.DestroyImmediate(atlas_info.Atlas, true);
            _progressBar.UpdateProgress("import atlas", 0.75f);
            AssetDatabase.ImportAsset(atlas_path);
            return(atlas_info.Rects);
        }
        static Texture2D LoadTextureFromData(SwfBitmapData bitmap, SwfSettingsData settings)
        {
            var argb32 = settings.BitmapTrimming
                                ? TrimBitmapByRect(bitmap, bitmap.TrimmedRect)
                                : bitmap.ARGB32;
            var widht = settings.BitmapTrimming
                                ? bitmap.TrimmedRect.width
                                : bitmap.RealWidth;
            var height = settings.BitmapTrimming
                                ? bitmap.TrimmedRect.height
                                : bitmap.RealHeight;
            var texture = new Texture2D(
                widht, height,
                TextureFormat.ARGB32, false);

            texture.LoadRawTextureData(argb32);
            return(texture);
        }
        static BitmapsAtlasInfo PackBitmapsAtlas(
            Texture2D[] textures, SwfSettingsData settings)
        {
            var atlas_padding  = Mathf.Max(0, settings.AtlasPadding);
            var max_atlas_size = Mathf.Max(32, settings.AtlasPowerOfTwo
                                ? Mathf.ClosestPowerOfTwo(settings.MaxAtlasSize)
                                : settings.MaxAtlasSize);
            var atlas = new Texture2D(0, 0);
            var rects = atlas.PackTextures(textures, atlas_padding, max_atlas_size);

            while (rects == null)
            {
                max_atlas_size = Mathf.NextPowerOfTwo(max_atlas_size + 1);
                rects          = atlas.PackTextures(textures, atlas_padding, max_atlas_size);
            }
            return(settings.AtlasForceSquare && atlas.width != atlas.height
                                ? BitmapsAtlasToSquare(atlas, rects)
                                : new BitmapsAtlasInfo {
                Atlas = atlas, Rects = rects
            });
        }