diff --git a/CHANGELOG.md b/CHANGELOG.md index 188473224..f55a6709f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ All notable changes to this project will be documented in this file. - Preview of PlaceObject and ShowFrame in the Dump view - FileAttributes tag exception in the Dump view - Adding new frames did not set correct timelined to ShowFrame +- Computing dependent characters inside DefineSprite ### Changed - [#1455] All tag types are now allowed inside DefineSprite diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index 94bbb23b5..c7e66cdb4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -500,9 +500,9 @@ public final class SWF implements SWFContainerItem, Timelined { return null; } - public void computeDependentCharacters() { - Map> dep = new HashMap<>(); - for (Tag tag : getTags()) { + + private void computeDependentCharacters(Timelined timelined, Map> dep) { + for (Tag tag : timelined.getTags()) { if (tag instanceof CharacterTag) { int characterId = ((CharacterTag) tag).getCharacterId(); Set needed = new HashSet<>(); @@ -517,7 +517,14 @@ public final class SWF implements SWFContainerItem, Timelined { s.add(characterId); } } + if (tag instanceof DefineSpriteTag) { + computeDependentCharacters((DefineSpriteTag) tag, dep); + } } + } + public void computeDependentCharacters() { + Map> dep = new HashMap<>(); + computeDependentCharacters(this, dep); dependentCharacters = dep; } @@ -2953,16 +2960,18 @@ public final class SWF implements SWFContainerItem, Timelined { } private void removeTagWithDependenciesFromTimeline(Tag toRemove, Timeline timeline) { - Map stage = new HashMap<>(); - Set dependingChars = new HashSet<>(); - Timelined timelined = timeline.timelined; - ReadOnlyTagList tags = timelined.getTags(); + Set dependingChars = new HashSet<>(); if (toRemove instanceof CharacterTag) { int characterId = ((CharacterTag) toRemove).getCharacterId(); dependingChars = getDependentCharacters(characterId); dependingChars.add(characterId); } - + removeTagWithDependenciesFromTimeline(toRemove, timeline, dependingChars); + } + private void removeTagWithDependenciesFromTimeline(Tag toRemove, Timeline timeline, Set dependingChars) { + Map stage = new HashMap<>(); + Timelined timelined = timeline.timelined; + ReadOnlyTagList tags = timelined.getTags(); for (int i = 0; i < tags.size(); i++) { Tag t = tags.get(i); if (t instanceof RemoveTag) { @@ -3012,7 +3021,7 @@ public final class SWF implements SWFContainerItem, Timelined { } if (t instanceof Timelined) { - removeTagWithDependenciesFromTimeline(toRemove, ((Timelined) t).getTimeline()); + removeTagWithDependenciesFromTimeline(toRemove, ((Timelined) t).getTimeline(), dependingChars); } } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java index 58a45d2c9..5ea6f5c95 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java @@ -661,8 +661,8 @@ public abstract class Tag implements NeedsCharacters, Exportable, Serializable { } } - public void getDependentCharacters(Set dependent) { - for (Tag tag : swf.getTags()) { + private void getDependentCharactersOnTimelined(Timelined timelined, Set dependent) { + for (Tag tag : timelined.getTags()) { if (tag instanceof CharacterTag) { Set needed = new HashSet<>(); tag.getNeededCharactersDeep(needed); @@ -673,8 +673,15 @@ public abstract class Tag implements NeedsCharacters, Exportable, Serializable { } } } + if (tag instanceof DefineSpriteTag) { + getDependentCharactersOnTimelined((DefineSpriteTag) tag, dependent); + } } } + + public void getDependentCharacters(Set dependent) { + getDependentCharactersOnTimelined(swf, dependent); + } public void getTagInfo(TagInfo tagInfo) {