mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-09-25 06:21:16 +00:00
#1333 Exporting sprites as swf files
This commit is contained in:
@@ -218,6 +218,7 @@ public class CommandLineArgumentParser {
|
||||
private static String stdErr = null;
|
||||
|
||||
private static final String METADATA_FORMAT_JSLIKE = "jslike";
|
||||
|
||||
private static final String METADATA_FORMAT_RAW = "raw";
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -1238,7 +1239,6 @@ public class CommandLineArgumentParser {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
});
|
||||
System.exit(0);
|
||||
}
|
||||
@@ -1449,7 +1449,6 @@ public class CommandLineArgumentParser {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
});
|
||||
System.exit(0);
|
||||
}
|
||||
@@ -1579,7 +1578,6 @@ public class CommandLineArgumentParser {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
});
|
||||
System.exit(0);
|
||||
|
||||
@@ -2221,7 +2219,7 @@ public class CommandLineArgumentParser {
|
||||
SpriteExportSettings ses = new SpriteExportSettings(enumFromStr(formats.get("sprite"), SpriteExportMode.class), zoom);
|
||||
for (CharacterTag c : swf.getCharacters().values()) {
|
||||
if (c instanceof DefineSpriteTag) {
|
||||
frameExporter.exportFrames(handler, outDir + (multipleExportTypes ? File.separator + SpriteExportSettings.EXPORT_FOLDER_NAME : ""), swf, c.getCharacterId(), null, ses, evl);
|
||||
frameExporter.exportSpriteFrames(handler, outDir + (multipleExportTypes ? File.separator + SpriteExportSettings.EXPORT_FOLDER_NAME : ""), swf, c.getCharacterId(), null, ses, evl);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2231,9 +2229,7 @@ public class CommandLineArgumentParser {
|
||||
ButtonExportSettings bes = new ButtonExportSettings(enumFromStr(formats.get("button"), ButtonExportMode.class), zoom);
|
||||
for (CharacterTag c : swf.getCharacters().values()) {
|
||||
if (c instanceof ButtonTag) {
|
||||
List<Integer> 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);
|
||||
frameExporter.exportButtonFrames(handler, outDir + (multipleExportTypes ? File.separator + ButtonExportSettings.EXPORT_FOLDER_NAME : ""), swf, c.getCharacterId(), null, bes, evl);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2660,7 +2656,6 @@ public class CommandLineArgumentParser {
|
||||
|
||||
try {
|
||||
new SearchInMemory(new SearchInMemoryListener() {
|
||||
|
||||
@Override
|
||||
public void publish(Object... chunks) {
|
||||
for (Object s : chunks) {
|
||||
@@ -2872,7 +2867,6 @@ public class CommandLineArgumentParser {
|
||||
} else if (characterTag instanceof TextTag) {
|
||||
TextTag textTag = (TextTag) characterTag;
|
||||
new TextImporter(new MissingCharacterHandler(), new TextImportErrorHandler() {
|
||||
|
||||
@Override
|
||||
public boolean handle(TextTag textTag) {
|
||||
String msg = "Error during text import.";
|
||||
@@ -3540,7 +3534,6 @@ public class CommandLineArgumentParser {
|
||||
public boolean missingFloat4(Float4 value) {
|
||||
return true;
|
||||
}
|
||||
|
||||
}, abc.bodies.get(bodyIndex), abc.method_info.get(abc.bodies.get(bodyIndex).method_info));
|
||||
//acode.getBytes(abc.bodies.get(bodyIndex).getCodeBytes());
|
||||
abc.bodies.get(bodyIndex).setCode(acode);
|
||||
@@ -4033,5 +4026,4 @@ public class CommandLineArgumentParser {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ import com.jpexs.decompiler.flash.exporters.FrameExporter;
|
||||
import com.jpexs.decompiler.flash.exporters.ImageExporter;
|
||||
import com.jpexs.decompiler.flash.exporters.MorphShapeExporter;
|
||||
import com.jpexs.decompiler.flash.exporters.MovieExporter;
|
||||
import com.jpexs.decompiler.flash.exporters.PreviewExporter;
|
||||
import com.jpexs.decompiler.flash.exporters.ShapeExporter;
|
||||
import com.jpexs.decompiler.flash.exporters.SoundExporter;
|
||||
import com.jpexs.decompiler.flash.exporters.SymbolClassExporter;
|
||||
@@ -328,11 +329,6 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
|
||||
public TreeItem oldItem;
|
||||
|
||||
// play morph shape in 2 second(s)
|
||||
public static final int MORPH_SHAPE_ANIMATION_LENGTH = 2;
|
||||
|
||||
public static final int MORPH_SHAPE_ANIMATION_FRAME_RATE = 30;
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MainPanel.class.getName());
|
||||
|
||||
public void setPercent(int percent) {
|
||||
@@ -1121,7 +1117,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
public List<File> exportSelection(AbortRetryIgnoreHandler handler, String selFile, ExportDialog export) throws IOException, InterruptedException {
|
||||
|
||||
List<File> ret = new ArrayList<>();
|
||||
List<TreeItem> sel = folderPreviewPanel.selectedItems.isEmpty() ? tagTree.getAllSelected() : new ArrayList<>(folderPreviewPanel.selectedItems.values());
|
||||
List<TreeItem> sel = tagTree.getSelection(getCurrentSwf());
|
||||
|
||||
Set<SWF> usedSwfs = new HashSet<>();
|
||||
for (TreeItem d : sel) {
|
||||
@@ -1137,6 +1133,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
List<Tag> images = new ArrayList<>();
|
||||
List<Tag> shapes = new ArrayList<>();
|
||||
List<Tag> morphshapes = new ArrayList<>();
|
||||
List<Tag> sprites = new ArrayList<>();
|
||||
List<Tag> buttons = new ArrayList<>();
|
||||
List<Tag> movies = new ArrayList<>();
|
||||
List<Tag> sounds = new ArrayList<>();
|
||||
@@ -1175,6 +1172,9 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
if (nodeType == TreeNodeType.MORPH_SHAPE) {
|
||||
morphshapes.add((Tag) d);
|
||||
}
|
||||
if (nodeType == TreeNodeType.SPRITE) {
|
||||
sprites.add((Tag) d);
|
||||
}
|
||||
if (nodeType == TreeNodeType.AS) {
|
||||
as12scripts.add(d);
|
||||
}
|
||||
@@ -1211,13 +1211,19 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
if (!frames.containsKey(parentId)) {
|
||||
frames.put(parentId, new ArrayList<>());
|
||||
}
|
||||
|
||||
frames.get(parentId).add(frame);
|
||||
}
|
||||
|
||||
if (d instanceof ScriptPack) {
|
||||
as3scripts.add((ScriptPack) d);
|
||||
}
|
||||
}
|
||||
|
||||
for (Tag sprite : sprites) {
|
||||
frames.put(((DefineSpriteTag) sprite).getCharacterId(), null);
|
||||
}
|
||||
|
||||
String selFile2;
|
||||
if (usedSwfs.size() > 1) {
|
||||
selFile2 = selFile + File.separator + Helper.getNextId(swf.getShortFileName(), usedSwfsIds);
|
||||
@@ -1275,12 +1281,9 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
|
||||
if (export.isOptionEnabled(FrameExportMode.class)) {
|
||||
FrameExportSettings fes = new FrameExportSettings(export.getValue(FrameExportMode.class), export.getZoom());
|
||||
for (Entry<Integer, List<Integer>> entry : frames.entrySet()) {
|
||||
int containerId = entry.getKey();
|
||||
if (containerId == 0) {
|
||||
String subFolder = FrameExportSettings.EXPORT_FOLDER_NAME;
|
||||
ret.addAll(frameExporter.exportFrames(handler, selFile2 + File.separator + subFolder, swf, containerId, entry.getValue(), fes, evl));
|
||||
}
|
||||
if (frames.containsKey(0)) {
|
||||
String subFolder = FrameExportSettings.EXPORT_FOLDER_NAME;
|
||||
ret.addAll(frameExporter.exportFrames(handler, selFile2 + File.separator + subFolder, swf, 0, frames.get(0), fes, evl));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1290,7 +1293,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
int containerId = entry.getKey();
|
||||
if (containerId != 0) {
|
||||
String subFolder = SpriteExportSettings.EXPORT_FOLDER_NAME;
|
||||
ret.addAll(frameExporter.exportFrames(handler, selFile2 + File.separator + subFolder, swf, containerId, entry.getValue(), ses, evl));
|
||||
ret.addAll(frameExporter.exportSpriteFrames(handler, selFile2 + File.separator + subFolder, swf, containerId, entry.getValue(), ses, evl));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1300,9 +1303,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
for (Tag tag : buttons) {
|
||||
ButtonTag button = (ButtonTag) tag;
|
||||
String subFolder = ButtonExportSettings.EXPORT_FOLDER_NAME;
|
||||
List<Integer> frameNums = new ArrayList<>();
|
||||
frameNums.add(0); // todo: export all frames
|
||||
ret.addAll(frameExporter.exportFrames(handler, selFile2 + File.separator + subFolder, swf, button.getCharacterId(), frameNums, bes, evl));
|
||||
ret.addAll(frameExporter.exportButtonFrames(handler, selFile2 + File.separator + subFolder, swf, button.getCharacterId(), null, bes, evl));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1399,7 +1400,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
SpriteExportSettings ses = new SpriteExportSettings(export.getValue(SpriteExportMode.class), export.getZoom());
|
||||
for (CharacterTag c : swf.getCharacters().values()) {
|
||||
if (c instanceof DefineSpriteTag) {
|
||||
frameExporter.exportFrames(handler, Path.combine(selFile, SpriteExportSettings.EXPORT_FOLDER_NAME), swf, c.getCharacterId(), null, ses, evl);
|
||||
frameExporter.exportSpriteFrames(handler, Path.combine(selFile, SpriteExportSettings.EXPORT_FOLDER_NAME), swf, c.getCharacterId(), null, ses, evl);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1408,9 +1409,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
ButtonExportSettings bes = new ButtonExportSettings(export.getValue(ButtonExportMode.class), export.getZoom());
|
||||
for (CharacterTag c : swf.getCharacters().values()) {
|
||||
if (c instanceof ButtonTag) {
|
||||
List<Integer> frameNums = new ArrayList<>();
|
||||
frameNums.add(0); // todo: export all frames
|
||||
frameExporter.exportFrames(handler, Path.combine(selFile, ButtonExportSettings.EXPORT_FOLDER_NAME), swf, c.getCharacterId(), frameNums, bes, evl);
|
||||
frameExporter.exportButtonFrames(handler, Path.combine(selFile, ButtonExportSettings.EXPORT_FOLDER_NAME), swf, c.getCharacterId(), null, bes, evl);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1513,7 +1512,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
SpriteExportSettings ses = new SpriteExportSettings(exportMode, export.getZoom());
|
||||
for (CharacterTag c : swf.getCharacters().values()) {
|
||||
if (c instanceof DefineSpriteTag) {
|
||||
frameExporter.exportFrames(handler, Path.combine(selFile, SpriteExportSettings.EXPORT_FOLDER_NAME, exportMode.name()), swf, c.getCharacterId(), null, ses, evl);
|
||||
frameExporter.exportSpriteFrames(handler, Path.combine(selFile, SpriteExportSettings.EXPORT_FOLDER_NAME, exportMode.name()), swf, c.getCharacterId(), null, ses, evl);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1524,9 +1523,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
ButtonExportSettings bes = new ButtonExportSettings(exportMode, export.getZoom());
|
||||
for (CharacterTag c : swf.getCharacters().values()) {
|
||||
if (c instanceof ButtonTag) {
|
||||
List<Integer> frameNums = new ArrayList<>();
|
||||
frameNums.add(0); // todo: export all frames
|
||||
frameExporter.exportFrames(handler, Path.combine(selFile, ButtonExportSettings.EXPORT_FOLDER_NAME, exportMode.name()), swf, c.getCharacterId(), frameNums, bes, evl);
|
||||
frameExporter.exportButtonFrames(handler, Path.combine(selFile, ButtonExportSettings.EXPORT_FOLDER_NAME, exportMode.name()), swf, c.getCharacterId(), null, bes, evl);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3618,8 +3615,8 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
|
||||
|
||||
private void initTimeline(Timeline timeline) {
|
||||
if (tag instanceof MorphShapeTag) {
|
||||
timeline.frameRate = MORPH_SHAPE_ANIMATION_FRAME_RATE;
|
||||
int framesCnt = (int) (timeline.frameRate * MORPH_SHAPE_ANIMATION_LENGTH);
|
||||
timeline.frameRate = PreviewExporter.MORPH_SHAPE_ANIMATION_FRAME_RATE;
|
||||
int framesCnt = (int) (timeline.frameRate * PreviewExporter.MORPH_SHAPE_ANIMATION_LENGTH);
|
||||
for (int i = 0; i < framesCnt; i++) {
|
||||
Frame f = new Frame(timeline, i);
|
||||
DepthState ds = new DepthState(tag.getSwf(), f);
|
||||
|
||||
@@ -17,12 +17,10 @@
|
||||
package com.jpexs.decompiler.flash.gui;
|
||||
|
||||
import com.jpexs.decompiler.flash.SWF;
|
||||
import com.jpexs.decompiler.flash.SWFOutputStream;
|
||||
import com.jpexs.decompiler.flash.action.Action;
|
||||
import com.jpexs.decompiler.flash.SWFHeader;
|
||||
import com.jpexs.decompiler.flash.action.parser.ActionParseException;
|
||||
import com.jpexs.decompiler.flash.action.parser.pcode.ASMParser;
|
||||
import com.jpexs.decompiler.flash.configuration.Configuration;
|
||||
import com.jpexs.decompiler.flash.exporters.commonshape.Matrix;
|
||||
import com.jpexs.decompiler.flash.exporters.PreviewExporter;
|
||||
import com.jpexs.decompiler.flash.gui.controls.JPersistentSplitPane;
|
||||
import com.jpexs.decompiler.flash.gui.debugger.DebuggerTools;
|
||||
import com.jpexs.decompiler.flash.gui.editor.LineMarkedEditorPane;
|
||||
@@ -30,47 +28,15 @@ import com.jpexs.decompiler.flash.gui.player.FlashPlayerPanel;
|
||||
import com.jpexs.decompiler.flash.gui.player.MediaDisplay;
|
||||
import com.jpexs.decompiler.flash.gui.player.PlayerControls;
|
||||
import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag;
|
||||
import com.jpexs.decompiler.flash.tags.DefineBitsTag;
|
||||
import com.jpexs.decompiler.flash.tags.DefineMorphShape2Tag;
|
||||
import com.jpexs.decompiler.flash.tags.DefineMorphShapeTag;
|
||||
import com.jpexs.decompiler.flash.tags.DefineSoundTag;
|
||||
import com.jpexs.decompiler.flash.tags.DefineSpriteTag;
|
||||
import com.jpexs.decompiler.flash.tags.DefineTextTag;
|
||||
import com.jpexs.decompiler.flash.tags.DefineVideoStreamTag;
|
||||
import com.jpexs.decompiler.flash.tags.DoActionTag;
|
||||
import com.jpexs.decompiler.flash.tags.DoInitActionTag;
|
||||
import com.jpexs.decompiler.flash.tags.EndTag;
|
||||
import com.jpexs.decompiler.flash.tags.ExportAssetsTag;
|
||||
import com.jpexs.decompiler.flash.tags.FileAttributesTag;
|
||||
import com.jpexs.decompiler.flash.tags.JPEGTablesTag;
|
||||
import com.jpexs.decompiler.flash.tags.MetadataTag;
|
||||
import com.jpexs.decompiler.flash.tags.PlaceObject2Tag;
|
||||
import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag;
|
||||
import com.jpexs.decompiler.flash.tags.ShowFrameTag;
|
||||
import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag;
|
||||
import com.jpexs.decompiler.flash.tags.Tag;
|
||||
import com.jpexs.decompiler.flash.tags.VideoFrameTag;
|
||||
import com.jpexs.decompiler.flash.tags.base.AloneTag;
|
||||
import com.jpexs.decompiler.flash.tags.base.BoundedTag;
|
||||
import com.jpexs.decompiler.flash.tags.base.CharacterIdTag;
|
||||
import com.jpexs.decompiler.flash.tags.base.CharacterTag;
|
||||
import com.jpexs.decompiler.flash.tags.base.FontTag;
|
||||
import com.jpexs.decompiler.flash.tags.base.PlaceObjectTypeTag;
|
||||
import com.jpexs.decompiler.flash.tags.base.RemoveTag;
|
||||
import com.jpexs.decompiler.flash.tags.base.SoundStreamHeadTypeTag;
|
||||
import com.jpexs.decompiler.flash.tags.base.TextTag;
|
||||
import com.jpexs.decompiler.flash.tags.gfx.DefineCompactedFont;
|
||||
import com.jpexs.decompiler.flash.timeline.DepthState;
|
||||
import com.jpexs.decompiler.flash.timeline.Frame;
|
||||
import com.jpexs.decompiler.flash.timeline.TagScript;
|
||||
import com.jpexs.decompiler.flash.timeline.Timelined;
|
||||
import com.jpexs.decompiler.flash.treeitems.TreeItem;
|
||||
import com.jpexs.decompiler.flash.types.GLYPHENTRY;
|
||||
import com.jpexs.decompiler.flash.types.MATRIX;
|
||||
import com.jpexs.decompiler.flash.types.RECT;
|
||||
import com.jpexs.decompiler.flash.types.RGB;
|
||||
import com.jpexs.decompiler.flash.types.SHAPE;
|
||||
import com.jpexs.decompiler.flash.types.TEXTRECORD;
|
||||
import com.jpexs.decompiler.flash.types.shaperecords.SHAPERECORD;
|
||||
import com.jpexs.helpers.SerializableImage;
|
||||
import java.awt.BorderLayout;
|
||||
@@ -81,7 +47,6 @@ import java.awt.Insets;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
@@ -90,14 +55,6 @@ import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.StringReader;
|
||||
import java.io.StringWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.swing.JButton;
|
||||
@@ -620,31 +577,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
|
||||
nextFontsButton.setVisible(false);
|
||||
}
|
||||
|
||||
private static Tag classicTag(Tag t) {
|
||||
if (t instanceof DefineCompactedFont) {
|
||||
return ((DefineCompactedFont) t).toClassicFont();
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
private static void writeTag(Tag t, SWFOutputStream sos) throws IOException {
|
||||
t = classicTag(t);
|
||||
|
||||
t.writeTag(sos);
|
||||
if (t instanceof CharacterIdTag) {
|
||||
List<CharacterIdTag> chIdTags = t.getSwf().getCharacterIdTags(((CharacterIdTag) t).getCharacterId());
|
||||
if (chIdTags != null) {
|
||||
for (CharacterIdTag chIdTag : chIdTags) {
|
||||
if (!(chIdTag instanceof PlaceObjectTypeTag || chIdTag instanceof RemoveTag)) {
|
||||
((Tag) chIdTag).writeTag(sos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void createAndShowTempSwf(TreeItem treeItem) {
|
||||
SWF swf = null;
|
||||
try {
|
||||
if (tempFile != null) {
|
||||
tempFile.delete();
|
||||
@@ -657,465 +590,29 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
|
||||
|
||||
if (treeItem instanceof Tag) {
|
||||
Tag tag = (Tag) treeItem;
|
||||
swf = tag.getSwf();
|
||||
if (tag instanceof FontTag) { //Fonts are always black on white
|
||||
backgroundColor = View.getDefaultBackgroundColor();
|
||||
}
|
||||
} else if (treeItem instanceof Frame) {
|
||||
Frame fn = (Frame) treeItem;
|
||||
swf = fn.getSwf();
|
||||
if (fn.timeline.timelined == swf) {
|
||||
SetBackgroundColorTag setBgColorTag = swf.getBackgroundColor();
|
||||
SWF sourceSwf = fn.getSwf();
|
||||
if (fn.timeline.timelined == sourceSwf) {
|
||||
SetBackgroundColorTag setBgColorTag = sourceSwf.getBackgroundColor();
|
||||
if (setBgColorTag != null) {
|
||||
backgroundColor = setBgColorTag.backgroundColor.toColor();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int frameCount = 1;
|
||||
float frameRate = swf.frameRate;
|
||||
HashMap<Integer, VideoFrameTag> videoFrames = new HashMap<>();
|
||||
if (treeItem instanceof DefineVideoStreamTag) {
|
||||
DefineVideoStreamTag vs = (DefineVideoStreamTag) treeItem;
|
||||
SWF.populateVideoFrames(vs.getCharacterId(), swf.getTags(), videoFrames);
|
||||
frameCount = videoFrames.size();
|
||||
}
|
||||
|
||||
List<SoundStreamBlockTag> soundFrames = new ArrayList<>();
|
||||
if (treeItem instanceof SoundStreamHeadTypeTag) {
|
||||
soundFrames = ((SoundStreamHeadTypeTag) treeItem).getBlocks();
|
||||
frameCount = soundFrames.size();
|
||||
}
|
||||
|
||||
if ((treeItem instanceof DefineMorphShapeTag) || (treeItem instanceof DefineMorphShape2Tag)) {
|
||||
frameRate = MainPanel.MORPH_SHAPE_ANIMATION_FRAME_RATE;
|
||||
frameCount = (int) (MainPanel.MORPH_SHAPE_ANIMATION_LENGTH * frameRate);
|
||||
}
|
||||
|
||||
if (treeItem instanceof DefineSoundTag) {
|
||||
frameCount = 1;
|
||||
}
|
||||
|
||||
if (treeItem instanceof DefineSpriteTag) {
|
||||
frameCount = ((DefineSpriteTag) treeItem).frameCount;
|
||||
}
|
||||
|
||||
byte[] data;
|
||||
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
|
||||
SWFOutputStream sos2 = new SWFOutputStream(baos, SWF.DEFAULT_VERSION);
|
||||
RECT outrect = new RECT(swf.displayRect);
|
||||
|
||||
RECT treeItemBounds = null;
|
||||
if (treeItem instanceof FontTag) {
|
||||
outrect.Xmin = 0;
|
||||
outrect.Ymin = 0;
|
||||
outrect.Xmax = FontTag.PREVIEWSIZE * 20;
|
||||
outrect.Ymax = FontTag.PREVIEWSIZE * 20;
|
||||
} else if (treeItem instanceof BoundedTag) {
|
||||
treeItemBounds = ((BoundedTag) treeItem).getRect();
|
||||
} else if (treeItem instanceof Frame) {
|
||||
treeItemBounds = ((Frame) treeItem).timeline.timelined.getRect();
|
||||
}
|
||||
|
||||
if (treeItemBounds != null) {
|
||||
if (outrect.getWidth() < treeItemBounds.getWidth()) {
|
||||
outrect.Xmax += treeItemBounds.getWidth() - outrect.getWidth();
|
||||
}
|
||||
|
||||
if (outrect.getHeight() < treeItemBounds.getHeight()) {
|
||||
outrect.Ymax += treeItemBounds.getHeight() - outrect.getHeight();
|
||||
}
|
||||
}
|
||||
|
||||
int width = outrect.getWidth();
|
||||
int height = outrect.getHeight();
|
||||
|
||||
sos2.writeRECT(outrect);
|
||||
sos2.writeFIXED8(frameRate);
|
||||
sos2.writeUI16(frameCount); //framecnt
|
||||
|
||||
FileAttributesTag fa = swf.getFileAttributes();
|
||||
if (fa != null) {
|
||||
fa.writeTag(sos2);
|
||||
}
|
||||
|
||||
SetBackgroundColorTag setBgColorTag = swf.getBackgroundColor();
|
||||
if (setBgColorTag == null) {
|
||||
setBgColorTag = new SetBackgroundColorTag(swf, new RGB(backgroundColor));
|
||||
}
|
||||
|
||||
setBgColorTag.writeTag(sos2);
|
||||
|
||||
if (treeItem instanceof Frame) {
|
||||
Frame fn = (Frame) treeItem;
|
||||
Timelined parent = fn.timeline.timelined;
|
||||
|
||||
Set<Integer> doneCharacters = new HashSet<>();
|
||||
for (Tag t : parent.getTags()) {
|
||||
if (t instanceof FileAttributesTag || t instanceof SetBackgroundColorTag) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (t instanceof DoActionTag || t instanceof DoInitActionTag) {
|
||||
// todo: Maybe DoABC tags should be removed, too
|
||||
continue;
|
||||
}
|
||||
|
||||
Set<Integer> needed = new HashSet<>();
|
||||
t.getNeededCharactersDeep(needed);
|
||||
for (int n : needed) {
|
||||
if (!doneCharacters.contains(n)) {
|
||||
writeTag(swf.getCharacter(n), sos2);
|
||||
doneCharacters.add(n);
|
||||
}
|
||||
}
|
||||
|
||||
//if (t instanceof ShowFrameTag || t instanceof PlaceObjectTypeTag || t instanceof RemoveTag) {
|
||||
// continue;
|
||||
//}
|
||||
if (t instanceof CharacterTag) {
|
||||
int characterId = ((CharacterTag) t).getCharacterId();
|
||||
doneCharacters.add(characterId);
|
||||
writeTag(t, sos2);
|
||||
}
|
||||
}
|
||||
|
||||
RECT r = parent.getRect();
|
||||
for (Map.Entry<Integer, DepthState> value : fn.layers.entrySet()) {
|
||||
PlaceObjectTypeTag pot = value.getValue().toPlaceObjectTag(value.getKey());
|
||||
MATRIX mat = new MATRIX(pot.getMatrix());
|
||||
mat.translateX += width / 2 - r.getWidth() / 2;
|
||||
mat.translateY += height / 2 - r.getHeight() / 2;
|
||||
pot.setMatrix(mat);
|
||||
pot.writeTag(sos2);
|
||||
}
|
||||
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
} else {
|
||||
boolean isSprite = false;
|
||||
if (treeItem instanceof DefineSpriteTag) {
|
||||
isSprite = true;
|
||||
}
|
||||
int chtId = -1;
|
||||
if (treeItem instanceof CharacterTag) {
|
||||
chtId = ((CharacterTag) treeItem).getCharacterId();
|
||||
}
|
||||
|
||||
if (treeItem instanceof DefineBitsTag) {
|
||||
JPEGTablesTag jtt = swf.getJtt();
|
||||
if (jtt != null) {
|
||||
jtt.writeTag(sos2);
|
||||
}
|
||||
} else if (treeItem instanceof AloneTag) {
|
||||
} else {
|
||||
Set<Integer> needed = new HashSet<>();
|
||||
((Tag) treeItem).getNeededCharactersDeep(needed);
|
||||
for (int n : needed) {
|
||||
if (isSprite && chtId == n) {
|
||||
continue;
|
||||
}
|
||||
|
||||
CharacterTag characterTag = swf.getCharacter(n);
|
||||
if (characterTag instanceof DefineBitsTag) {
|
||||
JPEGTablesTag jtt = swf.getJtt();
|
||||
if (jtt != null) {
|
||||
jtt.writeTag(sos2);
|
||||
}
|
||||
}
|
||||
|
||||
writeTag(characterTag, sos2);
|
||||
}
|
||||
}
|
||||
|
||||
writeTag((Tag) treeItem, sos2);
|
||||
|
||||
MATRIX mat = new MATRIX();
|
||||
mat.hasRotate = false;
|
||||
mat.hasScale = false;
|
||||
mat.translateX = 0;
|
||||
mat.translateY = 0;
|
||||
if (treeItem instanceof BoundedTag) {
|
||||
RECT r = ((BoundedTag) treeItem).getRect();
|
||||
mat.translateX = -r.Xmin;
|
||||
mat.translateY = -r.Ymin;
|
||||
mat.translateX = mat.translateX + width / 2 - r.getWidth() / 2;
|
||||
mat.translateY = mat.translateY + height / 2 - r.getHeight() / 2;
|
||||
} else {
|
||||
mat.translateX = width / 4;
|
||||
mat.translateY = height / 4;
|
||||
}
|
||||
if (treeItem instanceof FontTag) {
|
||||
FontTag ft = (FontTag) classicTag((Tag) treeItem);
|
||||
|
||||
int countGlyphsTotal = ft.getGlyphShapeTable().size();
|
||||
int countGlyphs = Math.min(SHAPERECORD.MAX_CHARACTERS_IN_FONT_PREVIEW, countGlyphsTotal);
|
||||
int fontId = ft.getFontId();
|
||||
int cols = (int) Math.ceil(Math.sqrt(countGlyphs));
|
||||
int rows = (int) Math.ceil(((float) countGlyphs) / ((float) cols));
|
||||
if (rows == 0) {
|
||||
rows = 1;
|
||||
cols = 1;
|
||||
}
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
int firstGlyphIndex = fontPageNum * SHAPERECORD.MAX_CHARACTERS_IN_FONT_PREVIEW;
|
||||
countGlyphs = Math.min(SHAPERECORD.MAX_CHARACTERS_IN_FONT_PREVIEW, countGlyphsTotal - firstGlyphIndex);
|
||||
List<SHAPE> shapes = ft.getGlyphShapeTable();
|
||||
int maxw = 0;
|
||||
for (int f = firstGlyphIndex; f < firstGlyphIndex + countGlyphs; f++) {
|
||||
RECT b = shapes.get(f).getBounds();
|
||||
if (b.Xmin == Integer.MAX_VALUE) {
|
||||
continue;
|
||||
}
|
||||
if (b.Ymin == Integer.MAX_VALUE) {
|
||||
continue;
|
||||
}
|
||||
int w = (int) (b.getWidth() / ft.getDivider());
|
||||
if (w > maxw) {
|
||||
maxw = w;
|
||||
}
|
||||
x++;
|
||||
}
|
||||
|
||||
x = 0;
|
||||
|
||||
int BORDER = 3 * 20;
|
||||
|
||||
int textHeight = height / rows;
|
||||
|
||||
while (maxw * textHeight / 1024.0 > width / cols - 2 * BORDER) {
|
||||
textHeight--;
|
||||
}
|
||||
|
||||
MATRIX tmat = new MATRIX();
|
||||
for (int f = firstGlyphIndex; f < firstGlyphIndex + countGlyphs; f++) {
|
||||
if (x >= cols) {
|
||||
x = 0;
|
||||
y++;
|
||||
}
|
||||
List<TEXTRECORD> rec = new ArrayList<>();
|
||||
TEXTRECORD tr = new TEXTRECORD();
|
||||
|
||||
RECT b = shapes.get(f).getBounds();
|
||||
int xmin = b.Xmin == Integer.MAX_VALUE ? 0 : (int) (b.Xmin / ft.getDivider());
|
||||
xmin *= textHeight / 1024.0;
|
||||
int ymin = b.Ymin == Integer.MAX_VALUE ? 0 : (int) (b.Ymin / ft.getDivider());
|
||||
ymin *= textHeight / 1024.0;
|
||||
int w = (int) (b.getWidth() / ft.getDivider());
|
||||
w *= textHeight / 1024.0;
|
||||
int h = (int) (b.getHeight() / ft.getDivider());
|
||||
h *= textHeight / 1024.0;
|
||||
|
||||
tr.fontId = fontId;
|
||||
tr.styleFlagsHasFont = true;
|
||||
tr.textHeight = textHeight;
|
||||
tr.xOffset = -xmin;
|
||||
tr.yOffset = 0;
|
||||
tr.styleFlagsHasXOffset = true;
|
||||
tr.styleFlagsHasYOffset = true;
|
||||
tr.glyphEntries = new ArrayList<>(1);
|
||||
tr.styleFlagsHasColor = true;
|
||||
tr.textColor = new RGB(0, 0, 0);
|
||||
GLYPHENTRY ge = new GLYPHENTRY();
|
||||
|
||||
double ga = ft.getGlyphAdvance(f);
|
||||
int cw = ga == -1 ? w : (int) (ga / ft.getDivider() * textHeight / 1024.0);
|
||||
|
||||
ge.glyphAdvance = 0;
|
||||
ge.glyphIndex = f;
|
||||
tr.glyphEntries.add(ge);
|
||||
rec.add(tr);
|
||||
|
||||
tmat.translateX = x * width / cols + width / cols / 2 - w / 2;
|
||||
tmat.translateY = y * height / rows + height / rows / 2;
|
||||
new DefineTextTag(swf, 999 + f, new RECT(0, cw, ymin, ymin + h), new MATRIX(), rec).writeTag(sos2);
|
||||
new PlaceObject2Tag(swf, false, 1 + f, 999 + f, tmat, null, 0, null, -1, null).writeTag(sos2);
|
||||
x++;
|
||||
}
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
} else if ((treeItem instanceof DefineMorphShapeTag) || (treeItem instanceof DefineMorphShape2Tag)) {
|
||||
new PlaceObject2Tag(swf, false, 1, chtId, mat, null, 0, null, -1, null).writeTag(sos2);
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
for (int ratio = 0; ratio < 65536; ratio += 65536 / frameCount) {
|
||||
new PlaceObject2Tag(swf, true, 1, chtId, mat, null, ratio, null, -1, null).writeTag(sos2);
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
}
|
||||
} else if (treeItem instanceof SoundStreamHeadTypeTag) {
|
||||
for (SoundStreamBlockTag blk : soundFrames) {
|
||||
blk.writeTag(sos2);
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
}
|
||||
} else if (treeItem instanceof DefineSoundTag) {
|
||||
ExportAssetsTag ea = new ExportAssetsTag(swf);
|
||||
DefineSoundTag ds = (DefineSoundTag) treeItem;
|
||||
ea.tags.add(ds.soundId);
|
||||
ea.names.add("my_define_sound");
|
||||
ea.writeTag(sos2);
|
||||
List<Action> actions;
|
||||
DoActionTag doa;
|
||||
|
||||
doa = new DoActionTag(swf, null);
|
||||
actions = ASMParser.parse(0, false,
|
||||
"ConstantPool \"_root\" \"my_sound\" \"Sound\" \"my_define_sound\" \"attachSound\"\n"
|
||||
+ "Push \"_root\"\n"
|
||||
+ "GetVariable\n"
|
||||
+ "Push \"my_sound\" 0.0 \"Sound\"\n"
|
||||
+ "NewObject\n"
|
||||
+ "SetMember\n"
|
||||
+ "Push \"my_define_sound\" 1 \"_root\"\n"
|
||||
+ "GetVariable\n"
|
||||
+ "Push \"my_sound\"\n"
|
||||
+ "GetMember\n"
|
||||
+ "Push \"attachSound\"\n"
|
||||
+ "CallMethod\n"
|
||||
+ "Pop\n"
|
||||
+ "Stop", swf.version, false);
|
||||
doa.setActions(actions);
|
||||
doa.writeTag(sos2);
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
|
||||
actions = ASMParser.parse(0, false,
|
||||
"ConstantPool \"_root\" \"my_sound\" \"Sound\" \"my_define_sound\" \"attachSound\" \"start\"\n"
|
||||
+ "StopSounds\n"
|
||||
+ "Push \"_root\"\n"
|
||||
+ "GetVariable\n"
|
||||
+ "Push \"my_sound\" 0.0 \"Sound\"\n"
|
||||
+ "NewObject\n"
|
||||
+ "SetMember\n"
|
||||
+ "Push \"my_define_sound\" 1 \"_root\"\n"
|
||||
+ "GetVariable\n"
|
||||
+ "Push \"my_sound\"\n"
|
||||
+ "GetMember\n"
|
||||
+ "Push \"attachSound\"\n"
|
||||
+ "CallMethod\n"
|
||||
+ "Pop\n"
|
||||
+ "Push 9999 0.0 2 \"_root\"\n"
|
||||
+ "GetVariable\n"
|
||||
+ "Push \"my_sound\"\n"
|
||||
+ "GetMember\n"
|
||||
+ "Push \"start\"\n"
|
||||
+ "CallMethod\n"
|
||||
+ "Pop\n"
|
||||
+ "Stop", swf.version, false);
|
||||
doa.setActions(actions);
|
||||
doa.writeTag(sos2);
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
|
||||
actions = ASMParser.parse(0, false,
|
||||
"ConstantPool \"_root\" \"my_sound\" \"Sound\" \"my_define_sound\" \"attachSound\" \"onSoundComplete\" \"start\" \"execParam\"\n"
|
||||
+ "StopSounds\n"
|
||||
+ "Push \"_root\"\n"
|
||||
+ "GetVariable\n"
|
||||
+ "Push \"my_sound\" 0.0 \"Sound\"\n"
|
||||
+ "NewObject\n"
|
||||
+ "SetMember\n"
|
||||
+ "Push \"my_define_sound\" 1 \"_root\"\n"
|
||||
+ "GetVariable\n"
|
||||
+ "Push \"my_sound\"\n"
|
||||
+ "GetMember\n"
|
||||
+ "Push \"attachSound\"\n"
|
||||
+ "CallMethod\n"
|
||||
+ "Pop\n"
|
||||
+ "Push \"_root\"\n"
|
||||
+ "GetVariable\n"
|
||||
+ "Push \"my_sound\"\n"
|
||||
+ "GetMember\n"
|
||||
+ "Push \"onSoundComplete\"\n"
|
||||
+ "DefineFunction2 \"\" 0 2 false true true false true false true false false {\n"
|
||||
+ "Push 0.0 register1 \"my_sound\"\n"
|
||||
+ "GetMember\n"
|
||||
+ "Push \"start\"\n"
|
||||
+ "CallMethod\n"
|
||||
+ "Pop\n"
|
||||
+ "}\n"
|
||||
+ "SetMember\n"
|
||||
+ "Push \"_root\"\n"
|
||||
+ "GetVariable\n"
|
||||
+ "Push \"execParam\"\n"
|
||||
+ "GetMember\n"
|
||||
+ "Push 1 \"_root\"\n"
|
||||
+ "GetVariable\n"
|
||||
+ "Push \"my_sound\"\n"
|
||||
+ "GetMember\n"
|
||||
+ "Push \"start\"\n"
|
||||
+ "CallMethod\n"
|
||||
+ "Pop\n"
|
||||
+ "Stop", swf.version, false);
|
||||
doa.setActions(actions);
|
||||
doa.writeTag(sos2);
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
|
||||
actions = ASMParser.parse(0, false,
|
||||
"StopSounds\n"
|
||||
+ "Stop", swf.version, false);
|
||||
doa.setActions(actions);
|
||||
doa.writeTag(sos2);
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
} else if (treeItem instanceof DefineVideoStreamTag) {
|
||||
|
||||
new PlaceObject2Tag(swf, false, 1, chtId, mat, null, -1, null, -1, null).writeTag(sos2);
|
||||
List<VideoFrameTag> frs = new ArrayList<>(videoFrames.values());
|
||||
Collections.sort(frs, new Comparator<VideoFrameTag>() {
|
||||
@Override
|
||||
public int compare(VideoFrameTag o1, VideoFrameTag o2) {
|
||||
return o1.frameNum - o2.frameNum;
|
||||
}
|
||||
});
|
||||
boolean first = true;
|
||||
int ratio = 0;
|
||||
for (VideoFrameTag f : frs) {
|
||||
if (!first) {
|
||||
ratio++;
|
||||
new PlaceObject2Tag(swf, true, 1, -1, null, null, ratio, null, -1, null).writeTag(sos2);
|
||||
}
|
||||
f.writeTag(sos2);
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
first = false;
|
||||
}
|
||||
} else if (treeItem instanceof DefineSpriteTag) {
|
||||
DefineSpriteTag s = (DefineSpriteTag) treeItem;
|
||||
Tag lastTag = null;
|
||||
for (Tag t : s.getTags()) {
|
||||
if (t instanceof EndTag) {
|
||||
break;
|
||||
} else if (t instanceof PlaceObjectTypeTag) {
|
||||
PlaceObjectTypeTag pt = (PlaceObjectTypeTag) t;
|
||||
MATRIX m = pt.getMatrix();
|
||||
MATRIX m2 = new Matrix(m).preConcatenate(new Matrix(mat)).toMATRIX();
|
||||
pt.writeTagWithMatrix(sos2, m2);
|
||||
lastTag = t;
|
||||
} else {
|
||||
t.writeTag(sos2);
|
||||
lastTag = t;
|
||||
}
|
||||
}
|
||||
if (!s.getTags().isEmpty() && (lastTag != null) && (!(lastTag instanceof ShowFrameTag))) {
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
}
|
||||
} else {
|
||||
new PlaceObject2Tag(swf, false, 1, chtId, mat, null, 0, null, -1, null).writeTag(sos2);
|
||||
new ShowFrameTag(swf).writeTag(sos2);
|
||||
}
|
||||
|
||||
} // not showframe
|
||||
|
||||
new EndTag(swf).writeTag(sos2);
|
||||
data = baos.toByteArray();
|
||||
}
|
||||
|
||||
SWFHeader header;
|
||||
try (OutputStream fos = new BufferedOutputStream(new FileOutputStream(tempFile))) {
|
||||
SWFOutputStream sos = new SWFOutputStream(fos, Math.max(10, swf.version));
|
||||
sos.write("FWS".getBytes());
|
||||
sos.write(swf.version);
|
||||
sos.writeUI32(sos.getPos() + data.length + 4);
|
||||
sos.write(data);
|
||||
fos.flush();
|
||||
header = new PreviewExporter().exportSwf(fos, treeItem, backgroundColor, fontPageNum);
|
||||
}
|
||||
|
||||
if (flashPanel != null) {
|
||||
flashPanel.displaySWF(tempFile.getAbsolutePath(), backgroundColor, frameRate);
|
||||
flashPanel.displaySWF(tempFile.getAbsolutePath(), backgroundColor, header.frameRate);
|
||||
}
|
||||
|
||||
showFlashViewerPanel();
|
||||
} catch (IOException | ActionParseException ex) {
|
||||
Logger.getLogger(PreviewPanel.class.getName()).log(Level.SEVERE, null, ex);
|
||||
|
||||
@@ -429,7 +429,7 @@ public class ASMSourceEditorPane extends DebuggableEditorPane implements CaretLi
|
||||
int caretPos = getCaretPosition();
|
||||
Flasm3Lexer lexer = new Flasm3Lexer(new StringReader(getText().replace("\r\n", "\n")));
|
||||
ParsedSymbol symb;
|
||||
String lastLevel = null;
|
||||
String lastLevel;
|
||||
final Integer singleUse[] = new Integer[]{
|
||||
ParsedSymbol.TYPE_KEYWORD_FINAL,
|
||||
ParsedSymbol.TYPE_KEYWORD_OVERRIDE,
|
||||
|
||||
@@ -17,6 +17,7 @@ shapes.svg = SVG
|
||||
shapes.png = PNG
|
||||
shapes.bmp = BMP
|
||||
shapes.canvas = HTML5 Canvas
|
||||
shapes.swf = SWF
|
||||
|
||||
texts = Texts
|
||||
texts.plain = Plain text
|
||||
@@ -58,6 +59,7 @@ morphshapes = Morphshapes
|
||||
morphshapes.gif = GIF
|
||||
morphshapes.svg = SVG
|
||||
morphshapes.canvas = HTML5 Canvas
|
||||
morphshapes.swf = SWF
|
||||
|
||||
frames = Frames
|
||||
frames.png = PNG
|
||||
@@ -67,6 +69,7 @@ frames.svg = SVG
|
||||
frames.canvas = HTML5 Canvas
|
||||
frames.pdf = PDF
|
||||
frames.bmp = BMP
|
||||
frames.swf = SWF
|
||||
|
||||
sprites = Sprites
|
||||
sprites.png = PNG
|
||||
@@ -76,11 +79,13 @@ sprites.svg = SVG
|
||||
sprites.canvas = HTML5 Canvas
|
||||
sprites.pdf = PDF
|
||||
sprites.bmp = BMP
|
||||
sprites.swf = SWF
|
||||
|
||||
buttons = Buttons
|
||||
buttons.png = PNG
|
||||
buttons.svg = SVG
|
||||
buttons.bmp = BMP
|
||||
buttons.swf = SWF
|
||||
|
||||
fonts = Fonts
|
||||
fonts.ttf = TTF
|
||||
|
||||
@@ -537,7 +537,12 @@ public class TagTree extends JTree {
|
||||
if (mainPanel.folderPreviewPanel.selectedItems.isEmpty()) {
|
||||
sel = getAllSelected();
|
||||
} else {
|
||||
sel = new ArrayList<>(mainPanel.folderPreviewPanel.selectedItems.values());
|
||||
sel = new ArrayList<>();
|
||||
|
||||
for (TreeItem treeItem : mainPanel.folderPreviewPanel.selectedItems.values()) {
|
||||
sel.add(treeItem);
|
||||
getAllSubs(treeItem, sel);
|
||||
}
|
||||
}
|
||||
return getSelection(swf, sel);
|
||||
}
|
||||
@@ -570,6 +575,9 @@ public class TagTree extends JTree {
|
||||
if (nodeType == TreeNodeType.MORPH_SHAPE) {
|
||||
ret.add(d);
|
||||
}
|
||||
if (nodeType == TreeNodeType.SPRITE) {
|
||||
ret.add(d);
|
||||
}
|
||||
if (nodeType == TreeNodeType.BUTTON) {
|
||||
ret.add(d);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user