diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java index 896de9b6b..65d330252 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java @@ -483,6 +483,11 @@ public class PlaceObject2Tag extends PlaceObjectTypeTag implements ASMSourceCont this.placeFlagMove = placeFlagMove; } + @Override + public void setPlaceFlagMove(boolean placeFlagMove) { + this.placeFlagMove = placeFlagMove; + } + @Override public boolean hasImage() { return false; diff --git a/src/com/jpexs/decompiler/flash/gui/CollectDepthAsSpritesDialogue.java b/src/com/jpexs/decompiler/flash/gui/CollectDepthAsSpritesDialogue.java index 91972e90f..eb0bd50e8 100644 --- a/src/com/jpexs/decompiler/flash/gui/CollectDepthAsSpritesDialogue.java +++ b/src/com/jpexs/decompiler/flash/gui/CollectDepthAsSpritesDialogue.java @@ -50,6 +50,8 @@ public class CollectDepthAsSpritesDialogue extends AppDialog { private final JCheckBox replaceCheckBox; private final JCheckBox offsetCheckBox; + + private final JCheckBox firstMatrixCheckBox; private int result = ERROR_OPTION; @@ -74,6 +76,9 @@ public class CollectDepthAsSpritesDialogue extends AppDialog { offsetCheckBox = new JCheckBox(translate("collect.offset")); cnt.add(offsetCheckBox); + + firstMatrixCheckBox = new JCheckBox(translate("collect.matrix")); + cnt.add(firstMatrixCheckBox); JPanel panButtons = new JPanel(new FlowLayout()); okButton.addActionListener(this::okButtonActionPerformed); @@ -116,6 +121,10 @@ public class CollectDepthAsSpritesDialogue extends AppDialog { public boolean getOffset() { return offsetCheckBox.isSelected(); } + + public boolean getEnsureFirstMatrix() { + return firstMatrixCheckBox.isSelected(); + } public int showDialog(Collection depths) { depthsList.setListData(depths.toArray(new Integer[depths.size()])); diff --git a/src/com/jpexs/decompiler/flash/gui/locales/CollectDepthAsSpritesDialogue.properties b/src/com/jpexs/decompiler/flash/gui/locales/CollectDepthAsSpritesDialogue.properties index e8397776b..2d6339f6d 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/CollectDepthAsSpritesDialogue.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/CollectDepthAsSpritesDialogue.properties @@ -17,6 +17,7 @@ dialog.title = Collect options collect.depths = Depths to collect: collect.replace = Replace original tags with sprite collect.offset = Offset top left corner to (0,0) +collect.matrix = Use the previous frames matrix as the first PlaceObject matrix button.ok = OK button.cancel = Cancel diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index b01439a98..b2b16fe64 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -643,6 +643,7 @@ public class TagTreeContextMenu extends JPopupMenu { add(pasteInsideMenuItem); collectDepthAsSpritesItem = new JMenuItem(mainPanel.translate("contextmenu.collectDepthAsSprites")); + collectDepthAsSpritesItem.setIcon(View.getIcon("sprite16")); collectDepthAsSpritesItem.addActionListener(this::collectDepthAsSprites); add(collectDepthAsSpritesItem); @@ -4130,6 +4131,7 @@ public class TagTreeContextMenu extends JPopupMenu { List depths = dialog.getDepths(); boolean replace = dialog.getReplace(); boolean offset = dialog.getOffset(); + boolean firstMatrix = dialog.getEnsureFirstMatrix(); Map sprites = new HashMap<>(); for (int d : depths) { @@ -4149,19 +4151,56 @@ public class TagTreeContextMenu extends JPopupMenu { try { for (int i = frames.size() - 1; i > -1; i--) { Frame f = (Frame) frames.get(i); + Map prevMatrixAtDepth = new HashMap<>(); + int pf = f.frame - 1; + for (int j = 0; j < f.innerTags.size(); j++) { Tag t = f.innerTags.get(j); - + int depth = -1; if (t instanceof RemoveTag) { depth = ((RemoveTag) t).getDepth(); } else if (t instanceof PlaceObjectTypeTag) { - depth = ((PlaceObjectTypeTag) t).getDepth(); + PlaceObjectTypeTag place = (PlaceObjectTypeTag) t; + depth = place.getDepth(); + + if (firstMatrix && i == 0) { + if (place.getMatrix() == null) { + for (; pf > -1; pf--) { + if (prevMatrixAtDepth.containsKey(depth)) { + break; + } + + Frame prev = f.timeline.getFrame(pf); + for (Tag pt : prev.innerTags) { + if (pt instanceof PlaceObjectTypeTag) { + PlaceObjectTypeTag pplace = (PlaceObjectTypeTag) pt; + prevMatrixAtDepth.putIfAbsent(pplace.getDepth(), pplace); + } + } + } + } + } } if (depth != -1) { DefineSpriteTag sprite = sprites.get(depth); Tag clone = t.cloneTag(); + if (firstMatrix && i == 0 && clone instanceof PlaceObjectTypeTag) { + PlaceObjectTypeTag place = (PlaceObjectTypeTag) clone; + if (place.getMatrix() == null) { + PlaceObjectTypeTag previous = prevMatrixAtDepth.get(place.getDepth()); + if (previous != null) { + MATRIX m = previous.getMatrix(); + if (m != null) { + place.setPlaceFlagHasMatrix(true); + place.setPlaceFlagMove(true); + place.setMatrix(new MATRIX(m)); + } + } + } + } + clone.setTimelined(sprite); sprite.addTag(i, clone); @@ -4235,7 +4274,7 @@ public class TagTreeContextMenu extends JPopupMenu { } swf.updateCharacters(); - if(replace) { + if (replace) { swf.computeDependentCharacters(); swf.computeDependentFrames(); }