detect duplicated bitmaps

This commit is contained in:
2016-09-06 11:02:26 +07:00
parent 77a1308ab9
commit f86e8d3813
3 changed files with 34 additions and 19 deletions

View File

@@ -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<int, SwfLibraryBitmapDefine>(
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<SwfBitmapData>(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<int, Texture2D>(
p.Key, LoadTextureFromBitmapDefine(p.Value)))
.ToList();
var rects = PackAndSaveBitmapsAtlas(asset, textures.Select(p => p.Value).ToArray());
var bitmaps = new List<SwfBitmapData>(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;

View File

@@ -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; }

View File

@@ -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<SwfLibrarySpriteDefine>(sprite.Id);
if ( sprite_def != null && sprite.CurrentTag < sprite_def.ControlTags.Tags.Count ) {