diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java index 802b3342c..5db58dbd6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java @@ -150,7 +150,15 @@ public class ActionDeobfuscator extends ActionDeobfuscatorSimple { } newIstructionCount += 2 * result.variables.size(); - if (newIstructionCount * 2 < result.instructionsProcessed) { + boolean allValueValid = true; + for (Object value : result.variables.values()) { + if (!ActionPush.isValidValue(value)) { + allValueValid = false; + break; + } + } + + if (allValueValid && newIstructionCount * 2 < result.instructionsProcessed) { Action target = actions.get(result.idx); Action prevAction = actions.get(i); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java index ab88fd0e1..8ac8e795e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java @@ -186,6 +186,23 @@ public class ActionPush extends Action { return surroundWithAction(baos.toByteArray(), version); } + public static boolean isValidValue(Object value) { + if (value instanceof String) { + for (char ch : ((String) value).toCharArray()) { + if (ch == 0) { + return false; + } + } + } + if (value instanceof Long) { + long l = (Long) value; + if (l < 0x8000000 || l > 0x7ffffff) { + return false; + } + } + return true; + } + public ActionPush(Object value) { super(0x96, 0); this.values = new ArrayList<>(); diff --git a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java index 35033add3..c9b616ac1 100644 --- a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java +++ b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java @@ -48,6 +48,7 @@ import com.jpexs.decompiler.flash.exporters.SoundExporter; import com.jpexs.decompiler.flash.exporters.TextExporter; import com.jpexs.decompiler.flash.exporters.commonshape.Matrix; import com.jpexs.decompiler.flash.exporters.modes.BinaryDataExportMode; +import com.jpexs.decompiler.flash.exporters.modes.ButtonExportMode; import com.jpexs.decompiler.flash.exporters.modes.FontExportMode; import com.jpexs.decompiler.flash.exporters.modes.FrameExportMode; import com.jpexs.decompiler.flash.exporters.modes.ImageExportMode; @@ -58,6 +59,7 @@ import com.jpexs.decompiler.flash.exporters.modes.ShapeExportMode; import com.jpexs.decompiler.flash.exporters.modes.SoundExportMode; import com.jpexs.decompiler.flash.exporters.modes.TextExportMode; import com.jpexs.decompiler.flash.exporters.settings.BinaryDataExportSettings; +import com.jpexs.decompiler.flash.exporters.settings.ButtonExportSettings; import com.jpexs.decompiler.flash.exporters.settings.FontExportSettings; import com.jpexs.decompiler.flash.exporters.settings.FrameExportSettings; import com.jpexs.decompiler.flash.exporters.settings.ImageExportSettings; @@ -78,6 +80,7 @@ import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; import com.jpexs.decompiler.flash.tags.DefineSpriteTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.tags.base.ASMSource; +import com.jpexs.decompiler.flash.tags.base.ButtonTag; import com.jpexs.decompiler.flash.tags.base.CharacterIdTag; import com.jpexs.decompiler.flash.tags.base.CharacterTag; import com.jpexs.decompiler.flash.tags.base.ImageTag; @@ -202,9 +205,13 @@ public class CommandLineArgumentParser { out.println(" frame:png - PNG format for Frames"); out.println(" frame:gif - GIF format for Frames"); out.println(" frame:avi - AVI format for Frames"); + out.println(" frame:svg - SVG format for Frames"); out.println(" frame:canvas - HTML5 Canvas format for Frames"); out.println(" frame:pdf - PDF format for Frames"); out.println(" frame:bmp - BMP format for Frames"); + out.println(" button:png - PNG format for Buttons"); + out.println(" button:svg - SVG format for Buttons"); + out.println(" button:bmp - BMP format for Buttons"); out.println(" image:png_gif_jpeg - PNG/GIF/JPEG format for Images"); out.println(" image:png - PNG format for Images"); out.println(" image:jpeg - JPEG format for Images"); @@ -1085,6 +1092,8 @@ public class CommandLineArgumentParser { new TextExporter().exportTexts(handler, outDir + (multipleExportTypes ? File.separator + TextExportSettings.EXPORT_FOLDER_NAME : ""), extags, new TextExportSettings(enumFromStr(formats.get("text"), TextExportMode.class), singleTextFile, zoom), evl); } + FrameExporter frameExporter = new FrameExporter(); + if (exportAll || exportFormats.contains("frame")) { System.out.println("Exporting frames..."); List frames = new ArrayList<>(); @@ -1093,7 +1102,25 @@ public class CommandLineArgumentParser { frames.add(i); } } - new FrameExporter().exportFrames(handler, outDir + (multipleExportTypes ? File.separator + FrameExportSettings.EXPORT_FOLDER_NAME : ""), swf, 0, frames, new FrameExportSettings(enumFromStr(formats.get("frame"), FrameExportMode.class), zoom), evl); + FrameExportSettings fes = new FrameExportSettings(enumFromStr(formats.get("frame"), FrameExportMode.class), zoom); + frameExporter.exportFrames(handler, outDir + (multipleExportTypes ? File.separator + FrameExportSettings.EXPORT_FOLDER_NAME : ""), swf, 0, frames, fes, evl); + for (CharacterTag c : swf.getCharacters().values()) { + if (c instanceof DefineSpriteTag) { + frameExporter.exportFrames(handler, outDir + (multipleExportTypes ? File.separator + FrameExportSettings.EXPORT_FOLDER_NAME_SPRITE : ""), swf, c.getCharacterId(), null, fes, evl); + } + } + } + + if (exportAll || exportFormats.contains("button")) { + System.out.println("Exporting buttons..."); + ButtonExportSettings bes = new ButtonExportSettings(enumFromStr(formats.get("button"), ButtonExportMode.class), zoom); + for (CharacterTag c : swf.getCharacters().values()) { + if (c instanceof ButtonTag) { + List frameNums = new ArrayList<>(); + frameNums.add(0); // todo: export all frames + frameExporter.exportFrames(handler, outDir + (multipleExportTypes ? File.separator + ButtonExportSettings.EXPORT_FOLDER_NAME : ""), swf, c.getCharacterId(), frameNums, bes, evl); + } + } } boolean parallel = Configuration.parallelSpeedUp.get(); diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index e274eaa7d..17b89e616 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -1293,7 +1293,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (export.isOptionEnabled(FrameExportMode.class)) { FrameExportSettings fes = new FrameExportSettings(export.getValue(FrameExportMode.class), export.getZoom()); - frameExporter.exportFrames(handler, selFile + File.separator + FrameExportSettings.EXPORT_FOLDER_NAME, swf, 0, null, fes, evl); + frameExporter.exportFrames(handler, Path.combine(selFile, FrameExportSettings.EXPORT_FOLDER_NAME), swf, 0, null, fes, evl); for (CharacterTag c : swf.getCharacters().values()) { if (c instanceof DefineSpriteTag) { frameExporter.exportFrames(handler, Path.combine(selFile, FrameExportSettings.EXPORT_FOLDER_NAME_SPRITE), swf, c.getCharacterId(), null, fes, evl);