diff --git a/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs b/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs index f41960a..9d9cefb 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/Postprocessors/SwfPostprocessor.cs @@ -207,21 +207,23 @@ namespace FlashTools.Internal { SwfLibrary library, SwfAsset asset) { var bitmap_defines = library.Defines - .Where (p => p.Value.Type == SwfLibraryDefineType.Bitmap) - .Select (p => new KeyValuePair( - p.Key, p.Value as SwfLibraryBitmapDefine)) - .ToArray(); + .Where (p => p.Value.Type == SwfLibraryDefineType.Bitmap) + .ToDictionary(p => p.Key, p => p.Value as SwfLibraryBitmapDefine); var textures = bitmap_defines - .Select (p => LoadTextureFromBitmapDefine(p.Value)) - .ToArray(); - var rects = PackAndSaveBitmapsAtlas(asset, textures); - var bitmaps = new List(bitmap_defines.Length); - for ( var i = 0; i < bitmap_defines.Length; ++i ) { - var bitmap_define = bitmap_defines[i]; + .Where (p => p.Value.Redirect == 0) + .Select (p => new KeyValuePair( + p.Key, LoadTextureFromBitmapDefine(p.Value))) + .ToList(); + var rects = PackAndSaveBitmapsAtlas(asset, textures.Select(p => p.Value).ToArray()); + var bitmaps = new List(bitmap_defines.Count); + foreach ( var bitmap_define in bitmap_defines ) { + var texture_key = bitmap_define.Value.Redirect > 0 + ? bitmap_define.Value.Redirect + : bitmap_define.Key; var bitmap_data = new SwfBitmapData{ Id = bitmap_define.Key, RealSize = new Vector2(bitmap_define.Value.Width, bitmap_define.Value.Height), - SourceRect = rects[i]}; + SourceRect = rects[textures.FindIndex(p => p.Key == texture_key)]}; bitmaps.Add(bitmap_data); } return bitmaps; diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContext.cs b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContext.cs index 6c34031..eca2488 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContext.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContext.cs @@ -31,9 +31,10 @@ namespace FlashTools.Internal.SwfTools { } public class SwfLibraryBitmapDefine : SwfLibraryDefine { - public int Width = 0; - public int Height = 0; - public byte[] ARGB32 = new byte[0]; + public int Width = 0; + public int Height = 0; + public byte[] ARGB32 = new byte[0]; + public ushort Redirect = 0; public override SwfLibraryDefineType Type { get { return SwfLibraryDefineType.Bitmap; } diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs index 7c4028a..456aea8 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs @@ -276,7 +276,6 @@ namespace FlashTools.Internal.SwfTools { } public SwfDisplayList Visit(DefineBinaryDataTag tag, SwfDisplayList dl) { - //TODO: IMPLME return dl; } @@ -302,11 +301,12 @@ namespace FlashTools.Internal.SwfTools { } void AddBitmapToLibrary(ushort define_id, int width, int height, byte[] argb32) { + var duplicated = FindDuplicatedBitmap(argb32); var define = new SwfLibraryBitmapDefine{ - Width = width, - Height = height, - ARGB32 = argb32 - }; + Width = width, + Height = height, + ARGB32 = duplicated > 0 ? new byte[0] : argb32, + Redirect = duplicated}; Library.Defines.Add(define_id, define); } @@ -317,6 +317,18 @@ namespace FlashTools.Internal.SwfTools { Library.Defines.Add(define_id, define); } + ushort FindDuplicatedBitmap(byte[] argb32) { + foreach ( var define in Library.Defines ) { + var bitmap = define.Value as SwfLibraryBitmapDefine; + if ( bitmap != null && bitmap.ARGB32.Length == argb32.Length ) { + if ( bitmap.ARGB32.SequenceEqual(argb32) ) { + return define.Key; + } + } + } + return 0; + } + bool IsSpriteTimelineEnd(SwfDisplaySpriteInstance sprite) { var sprite_def = Library.FindDefine(sprite.Id); if ( sprite_def != null && sprite.CurrentTag < sprite_def.ControlTags.Tags.Count ) {