mirror of
https://github.com/BlackMATov/unity-flash-tools.git
synced 2026-03-22 12:55:32 +07:00
detect duplicated bitmaps
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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 ) {
|
||||
|
||||
Reference in New Issue
Block a user