Fixed Computing dependent characters inside DefineSprite

This commit is contained in:
Jindra Petřík
2022-11-06 20:41:13 +01:00
parent bece4e1e77
commit e33ea7f2eb
3 changed files with 28 additions and 11 deletions

View File

@@ -500,9 +500,9 @@ public final class SWF implements SWFContainerItem, Timelined {
return null;
}
public void computeDependentCharacters() {
Map<Integer, Set<Integer>> dep = new HashMap<>();
for (Tag tag : getTags()) {
private void computeDependentCharacters(Timelined timelined, Map<Integer, Set<Integer>> dep) {
for (Tag tag : timelined.getTags()) {
if (tag instanceof CharacterTag) {
int characterId = ((CharacterTag) tag).getCharacterId();
Set<Integer> 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<Integer, Set<Integer>> 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<Integer, Integer> stage = new HashMap<>();
Set<Integer> dependingChars = new HashSet<>();
Timelined timelined = timeline.timelined;
ReadOnlyTagList tags = timelined.getTags();
Set<Integer> 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<Integer> dependingChars) {
Map<Integer, Integer> 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);
}
}
}

View File

@@ -661,8 +661,8 @@ public abstract class Tag implements NeedsCharacters, Exportable, Serializable {
}
}
public void getDependentCharacters(Set<Integer> dependent) {
for (Tag tag : swf.getTags()) {
private void getDependentCharactersOnTimelined(Timelined timelined, Set<Integer> dependent) {
for (Tag tag : timelined.getTags()) {
if (tag instanceof CharacterTag) {
Set<Integer> 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<Integer> dependent) {
getDependentCharactersOnTimelined(swf, dependent);
}
public void getTagInfo(TagInfo tagInfo) {