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 5aa048815..afb31feb7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -956,7 +956,8 @@ public final class SWF implements SWFContainerItem, Timelined { * Constructs an empty SWF */ public SWF() { - + version = SWF.DEFAULT_VERSION; + displayRect = new RECT(0, 1, 0, 1); } /** @@ -1099,7 +1100,7 @@ public final class SWF implements SWFContainerItem, Timelined { } } - getASMs(true); // Add scriptNames to ASMs + getASMs(true); // Add scriptNames to ASMs } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/BinaryDataExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/BinaryDataExporter.java index 9ddc99388..b76785474 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/BinaryDataExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/BinaryDataExporter.java @@ -60,16 +60,18 @@ public class BinaryDataExporter { int currentIndex = 1; for (final Tag t : tags) { if (t instanceof DefineBinaryDataTag) { + DefineBinaryDataTag bdt = (DefineBinaryDataTag) t; if (evl != null) { evl.handleExportingEvent("binarydata", currentIndex, count, t.getName()); } - int characterID = ((DefineBinaryDataTag) t).getCharacterId(); + int characterID = bdt.getCharacterId(); - final File file = new File(outdir + File.separator + characterID + ".bin"); + String ext = bdt.innerSwf == null ? ".bin" : ".swf"; + final File file = new File(outdir + File.separator + characterID + ext); new RetryTask(() -> { try (OutputStream fos = new BufferedOutputStream(new FileOutputStream(file))) { - fos.write(((DefineBinaryDataTag) t).binaryData.getRangeData()); + fos.write(bdt.binaryData.getRangeData()); } }, handler).run(); 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 5b32d26be..3d86d4ca4 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 @@ -400,7 +400,7 @@ public abstract class Tag implements NeedsCharacters, Exportable, Serializable { * @throws IOException */ public void writeTag(SWFOutputStream sos) throws IOException { - if (isModified()) { + if (Configuration.debugCopy.get() || isModified()) { byte[] newData = getData(); byte[] newHeaderData = getHeader(newData.length); sos.write(newHeaderData); @@ -463,16 +463,9 @@ public abstract class Tag implements NeedsCharacters, Exportable, Serializable { ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStream os = baos; if (Configuration.debugCopy.get()) { - // todo: honfika: why only the following tags? - if (this instanceof DefineSpriteTag - || this instanceof DefineButtonTag || this instanceof DefineButton2Tag - || this instanceof DefineFont3Tag - || this instanceof DoABCTag || this instanceof DoABC2Tag - || this instanceof PlaceObject2Tag || this instanceof PlaceObject3Tag || this instanceof PlaceObject4Tag) { - byte[] originalData = getOriginalData(); - if (originalData != null) { - os = new CopyOutputStream(os, new ByteArrayInputStream(getOriginalData())); - } + byte[] originalData = getOriginalData(); + if (originalData != null) { + os = new CopyOutputStream(os, new ByteArrayInputStream(getOriginalData())); } } diff --git a/src/com/jpexs/decompiler/flash/gui/Main.java b/src/com/jpexs/decompiler/flash/gui/Main.java index ed71890b2..0ae931550 100644 --- a/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/src/com/jpexs/decompiler/flash/gui/Main.java @@ -16,28 +16,15 @@ */ package com.jpexs.decompiler.flash.gui; -import com.jpexs.debugger.flash.DebugConnectionListener; -import com.jpexs.debugger.flash.DebugMessageListener; import com.jpexs.debugger.flash.Debugger; -import com.jpexs.debugger.flash.DebuggerCommands; -import com.jpexs.debugger.flash.DebuggerConnection; -import com.jpexs.debugger.flash.SWD; -import com.jpexs.debugger.flash.messages.in.InAskBreakpoints; -import com.jpexs.debugger.flash.messages.in.InBreakAt; -import com.jpexs.debugger.flash.messages.in.InNumScript; -import com.jpexs.debugger.flash.messages.in.InScript; -import com.jpexs.debugger.flash.messages.in.InSwfInfo; import com.jpexs.decompiler.flash.ApplicationInfo; import com.jpexs.decompiler.flash.EventListener; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFBundle; -import com.jpexs.decompiler.flash.SWFCompression; import com.jpexs.decompiler.flash.SWFSourceInfo; import com.jpexs.decompiler.flash.SearchMode; import com.jpexs.decompiler.flash.SwfOpenException; import com.jpexs.decompiler.flash.Version; -import com.jpexs.decompiler.flash.abc.ClassPath; -import com.jpexs.decompiler.flash.abc.ScriptPack; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.configuration.SwfSpecificConfiguration; @@ -94,15 +81,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.TreeSet; -import java.util.WeakHashMap; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.logging.ConsoleHandler; @@ -165,6 +148,7 @@ public class Main { //private static int ip = 0; //private static String ipClass = null; private static Process runProcess; + private static boolean runProcessDebug; private static boolean inited = false; @@ -426,7 +410,7 @@ public class Main { } /* public static void debuggerNotSuspended() { - + }*/ public static boolean isDebugging() { return isDebugRunning(); diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java index ea287bcc2..64853e871 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java @@ -997,6 +997,17 @@ public abstract class MainFrameMenu implements MenuBuilder { sourceInfos[1] = new SWFSourceInfo(null, path, null); Main.openFile(sourceInfos); }, PRIORITY_MEDIUM, null, true, null, false); + addMenuItem("/debug/createNewSwf", "Create new SWF", "update16", e -> { + SWF swf = new SWF(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + swf.saveTo(baos); + } catch (IOException ex) { + Logger.getLogger(MainFrameMenu.class.getName()).log(Level.SEVERE, null, ex); + } + + Main.openFile(new SWFSourceInfo(new ByteArrayInputStream(baos.toByteArray()), "New SWF", "New SWF")); + }, PRIORITY_MEDIUM, null, true, null, false); finishMenu("/debug"); } diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 2c7fefdc0..1d072b982 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -1063,7 +1063,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public List exportSelection(AbortRetryIgnoreHandler handler, String selFile, ExportDialog export) throws IOException, InterruptedException { List ret = new ArrayList<>(); - List sel = folderPreviewPanel.selectedItems.isEmpty() ? tagTree.getAllSelected(tagTree) : new ArrayList<>(folderPreviewPanel.selectedItems.values()); + List sel = folderPreviewPanel.selectedItems.isEmpty() ? tagTree.getAllSelected() : new ArrayList<>(folderPreviewPanel.selectedItems.values()); Set usedSwfs = new HashSet<>(); for (TreeItem d : sel) { @@ -2148,7 +2148,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public void export(final boolean onlySel) { final SWF swf = getCurrentSwf(); - List sel = tagTree.getSelection(swf); + List sel = tagTree.getAllSelected(); if (!onlySel) { sel = null; } else { @@ -2201,7 +2201,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public void exportJavaSource() { - List sel = tagTree.getSelected(tagTree); + List sel = tagTree.getSelected(); for (TreeItem item : sel) { if (item instanceof SWF) { SWF swf = (SWF) item; @@ -2221,7 +2221,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public void exportSwfXml() { - List sel = tagTree.getSelected(tagTree); + List sel = tagTree.getSelected(); Set swfs = new HashSet<>(); for (TreeItem item : sel) { @@ -2245,7 +2245,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public void importSwfXml() { - List sel = tagTree.getSelected(tagTree); + List sel = tagTree.getSelected(); Set swfs = new HashSet<>(); for (TreeItem item : sel) { swfs.add(item.getSwf()); diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index 1ae410f1a..3ffe85c36 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -1076,16 +1076,15 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel } //Inject Loader if (swf.isAS3() && Configuration.autoOpenLoadedSWFs.get() && !Configuration.internalFlashViewer.get() && !DebuggerTools.hasDebugger(swf)) { - SWF instrSWF = null; + SWF instrSWF; try (FileInputStream fis = new FileInputStream(tempFile)) { instrSWF = new SWF(fis, false, false); } - if (instrSWF != null) { - DebuggerTools.switchDebugger(instrSWF); - DebuggerTools.injectDebugLoader(instrSWF); - try (OutputStream fos = new BufferedOutputStream(new FileOutputStream(tempFile))) { - instrSWF.saveTo(fos); - } + + DebuggerTools.switchDebugger(instrSWF); + DebuggerTools.injectDebugLoader(instrSWF); + try (OutputStream fos = new BufferedOutputStream(new FileOutputStream(tempFile))) { + instrSWF.saveTo(fos); } } flashPanel.displaySWF(tempFile.getAbsolutePath(), backgroundColor, swf.frameRate); diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java index 4a0dcc7c5..a871e7ef4 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java @@ -408,7 +408,12 @@ public class TagTree extends JTree { ret = Arrays.asList(DefineBinaryDataTag.ID); break; case TagTreeModel.FOLDER_FRAMES: - ret = new ArrayList<>(); + // same as nested tags of DefineSpriteTag? + ret = Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, + RemoveObjectTag.ID, RemoveObject2Tag.ID, ShowFrameTag.ID, FrameLabelTag.ID, + StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, + SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID, + DefineScalingGridTag.ID); break; case TagTreeModel.FOLDER_OTHERS: ret = Arrays.asList( @@ -428,6 +433,14 @@ public class TagTree extends JTree { return ret; } + public List getFrameNestedTagIds() { + return Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, + RemoveObjectTag.ID, RemoveObject2Tag.ID, FrameLabelTag.ID, + StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, + SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID, + DefineScalingGridTag.ID); + } + public List getNestedTagIds(Tag obj) { if (obj instanceof DefineSpriteTag) { return Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, @@ -455,16 +468,16 @@ public class TagTree extends JTree { return !getSelection(mainPanel.getCurrentSwf()).isEmpty(); } - public void getAllSubs(JTree tree, TreeItem o, List ret) { - TagTreeModel tm = (TagTreeModel) tree.getModel(); + public void getAllSubs(TreeItem o, List ret) { + TagTreeModel tm = getModel(); for (TreeItem c : tm.getAllChildren(o)) { ret.add(c); - getAllSubs(tree, c, ret); + getAllSubs(c, ret); } } - public List getAllSelected(TagTree tree) { - TreeSelectionModel tsm = tree.getSelectionModel(); + public List getAllSelected() { + TreeSelectionModel tsm = getSelectionModel(); TreePath[] tps = tsm.getSelectionPaths(); List ret = new ArrayList<>(); if (tps == null) { @@ -474,16 +487,16 @@ public class TagTree extends JTree { for (TreePath tp : tps) { TreeItem treeNode = (TreeItem) tp.getLastPathComponent(); ret.add(treeNode); - getAllSubs(tree, treeNode, ret); + getAllSubs(treeNode, ret); } return ret; } - public List getSelected(JTree tree) { + public List getSelected() { if (!mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { return new ArrayList<>(mainPanel.folderPreviewPanel.selectedItems.values()); } - TreeSelectionModel tsm = tree.getSelectionModel(); + TreeSelectionModel tsm = getSelectionModel(); TreePath[] tps = tsm.getSelectionPaths(); List ret = new ArrayList<>(); if (tps == null) { @@ -500,7 +513,7 @@ public class TagTree extends JTree { public List getSelection(SWF swf) { List sel; if (mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { - sel = getAllSelected(this); + sel = getAllSelected(); } else { sel = new ArrayList<>(mainPanel.folderPreviewPanel.selectedItems.values()); } diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index 46d87a7cb..07280a4ed 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -357,6 +357,10 @@ public class TagTreeContextMenu extends JPopupMenu { } else if (firstItem instanceof Tag) { List allowedTagTypes = tagTree.getNestedTagIds((Tag) firstItem); addAddTagMenuItems(allowedTagTypes, addTagMenu, firstItem); + } else if (firstItem instanceof Frame) { + // todo: honfika: add to the selected frame + //List allowedTagTypes = tagTree.getFrameNestedTagIds(); + //addAddTagMenuItems(allowedTagTypes, addTagMenu, firstItem); } addTagMenu.setVisible(addTagMenu.getItemCount() > 0); @@ -623,7 +627,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void openSwfInsideActionPerformed(ActionEvent evt) { - List sel = tagTree.getSelected(tagTree); + List sel = tagTree.getSelected(); List binaryDatas = new ArrayList<>(); for (TreeItem item : sel) { DefineBinaryDataTag binaryData = (DefineBinaryDataTag) item; @@ -680,7 +684,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void removeItemActionPerformed(ActionEvent evt, boolean removeDependencies) { - List sel = tagTree.getSelected(tagTree); + List sel = tagTree.getSelected(); List tagsToRemove = new ArrayList<>(); for (TreeItem item : sel) { @@ -730,7 +734,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void undoTagActionPerformed(ActionEvent evt) { - List sel = tagTree.getSelected(tagTree); + List sel = tagTree.getSelected(); for (TreeItem item : sel) { if (item instanceof Tag) { @@ -749,7 +753,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void closeSwfActionPerformed(ActionEvent evt) { - List sel = tagTree.getSelected(tagTree); + List sel = tagTree.getSelected(); for (TreeItem item : sel) { if (item instanceof SWF) { SWF swf = (SWF) item;