From 137a8779571df90e5892b8a6c69f2e5f44bbc5a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sun, 3 Mar 2013 17:30:46 +0100 Subject: [PATCH] frame display fix --- .../src/com/jpexs/decompiler/flash/Main.java | 2 +- .../jpexs/decompiler/flash/gui/MainFrame.java | 84 ++++++++++++------- .../flash/tags/DefineSpriteTag.java | 29 ++++--- .../flash/tags/PlaceObject2Tag.java | 26 +++++- .../flash/tags/PlaceObject3Tag.java | 23 ++++- .../decompiler/flash/tags/PlaceObjectTag.java | 19 ++++- .../flash/tags/PlaceObjectTypeTag.java | 13 +++ .../com/jpexs/decompiler/flash/tags/Tag.java | 12 +++ .../jpexs/decompiler/flash/types/MATRIX.java | 3 +- 9 files changed, 159 insertions(+), 52 deletions(-) create mode 100644 trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTypeTag.java diff --git a/trunk/src/com/jpexs/decompiler/flash/Main.java b/trunk/src/com/jpexs/decompiler/flash/Main.java index 706e0d053..6fabbd935 100644 --- a/trunk/src/com/jpexs/decompiler/flash/Main.java +++ b/trunk/src/com/jpexs/decompiler/flash/Main.java @@ -81,7 +81,7 @@ public class Main { return commandLineMode; } - public static final boolean DISPLAY_FILENAME=true; + public static final boolean DISPLAY_FILENAME=false; public static boolean DEBUG_COPY = false; /** * Debug mode = throwing an error when comparing original file and recompiled diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java index 0e616e4bb..61585328b 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java @@ -58,6 +58,9 @@ import com.jpexs.decompiler.flash.tags.EndTag; import com.jpexs.decompiler.flash.tags.ExportAssetsTag; import com.jpexs.decompiler.flash.tags.JPEGTablesTag; import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; +import com.jpexs.decompiler.flash.tags.PlaceObject3Tag; +import com.jpexs.decompiler.flash.tags.PlaceObjectTag; +import com.jpexs.decompiler.flash.tags.PlaceObjectTypeTag; import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag; import com.jpexs.decompiler.flash.tags.ShowFrameTag; import com.jpexs.decompiler.flash.tags.Tag; @@ -217,7 +220,7 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi Main.exit(); } }); - setTitle(Main.applicationName +(Main.DISPLAY_FILENAME?" - " + Main.getFileTitle():"")); + setTitle(Main.applicationName + (Main.DISPLAY_FILENAME ? " - " + Main.getFileTitle() : "")); JMenuBar menuBar = new JMenuBar(); JMenu menuFile = new JMenu("File"); @@ -335,7 +338,7 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi miDonate.setActionCommand("DONATE"); miDonate.setIcon(View.getIcon("donate16")); miDonate.addActionListener(this); - + JMenuItem miHomepage = new JMenuItem("Visit homepage"); miHomepage.setActionCommand("HOMEPAGE"); miHomepage.setIcon(View.getIcon("homepage16")); @@ -366,7 +369,7 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi CardLayout cl2 = (CardLayout) (detailPanel.getLayout()); cl2.show(detailPanel, DETAILCARDEMPTYPANEL); - + abcList = new ArrayList(); getActionScript3(objs, abcList); if (!abcList.isEmpty()) { @@ -468,16 +471,14 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi searchPanel.setLayout(new BorderLayout()); searchPanel.add(filterField, BorderLayout.CENTER); searchPanel.add(new JLabel(View.getIcon("search16")), BorderLayout.WEST); - JLabel closeSearchButton=new JLabel(View.getIcon("cancel16")); + JLabel closeSearchButton = new JLabel(View.getIcon("cancel16")); closeSearchButton.addMouseListener(new MouseAdapter() { - @Override public void mouseClicked(MouseEvent e) { filterField.setText(""); doFilter(); searchPanel.setVisible(false); } - }); searchPanel.add(closeSearchButton, BorderLayout.EAST); JPanel pan1 = new JPanel(new BorderLayout()); @@ -517,15 +518,13 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi splitPane1.setDividerLocation(0.5); View.centerScreen(this); tagTree.addKeyListener(new KeyAdapter() { - @Override public void keyPressed(KeyEvent e) { - if((e.getKeyCode()=='F')&&(e.isControlDown())){ + if ((e.getKeyCode() == 'F') && (e.isControlDown())) { searchPanel.setVisible(true); filterField.requestFocusInWindow(); } } - }); detailPanel.setVisible(false); @@ -551,9 +550,9 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi if (actionPanel != null) { actionPanel.initSplits(); } - splitPane1.setDividerLocation(getWidth() / 3); + splitPane1.setDividerLocation(getWidth() / 3); splitPane2.setDividerLocation(splitPane2.getHeight() * 3 / 5); - splitPos=splitPane2.getDividerLocation(); + splitPos = splitPane2.getDividerLocation(); } } @@ -1024,7 +1023,7 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi } if (e.getActionCommand().equals("SAVEAS")) { if (Main.saveFileDialog()) { - setTitle(Main.applicationName + (Main.DISPLAY_FILENAME?" - " + Main.getFileTitle():"")); + setTitle(Main.applicationName + (Main.DISPLAY_FILENAME ? " - " + Main.getFileTitle() : "")); } } if (e.getActionCommand().equals("OPEN")) { @@ -1156,7 +1155,7 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi JOptionPane.showMessageDialog(null, "Please visit\r\n" + donateURL + "\r\nfor details."); } } - + if (e.getActionCommand().equals("HOMEPAGE")) { String homePageURL = Main.projectPage; if (java.awt.Desktop.isDesktopSupported()) { @@ -1322,23 +1321,23 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi } } } + private int splitPos = 0; - private int splitPos=0; public void showDetail(String card) { CardLayout cl = (CardLayout) (detailPanel.getLayout()); cl.show(detailPanel, card); - if(card.equals(DETAILCARDEMPTYPANEL)){ - if(detailPanel.isVisible()){ - splitPos=splitPane2.getDividerLocation(); + if (card.equals(DETAILCARDEMPTYPANEL)) { + if (detailPanel.isVisible()) { + splitPos = splitPane2.getDividerLocation(); detailPanel.setVisible(false); } - }else{ - if(!detailPanel.isVisible()){ + } else { + if (!detailPanel.isVisible()) { detailPanel.setVisible(true); splitPane2.setDividerLocation(splitPos); } } - + } public void showCard(String card) { @@ -1427,7 +1426,7 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi } tempFile = File.createTempFile("temp", ".swf"); tempFile.deleteOnExit(); - + FileOutputStream fos = new FileOutputStream(tempFile); SWFOutputStream sos = new SWFOutputStream(fos, 10); sos.write("FWS".getBytes()); @@ -1465,19 +1464,40 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi break; } Tag t = (Tag) o; - if (frameCnt == fn.getFrame()) { - Set needed = t.getNeededCharacters(); - for (int n : needed) { - if (!doneCharacters.contains(n)) { - sos2.writeTag(characters.get(n)); - doneCharacters.add(n); - } - } - if (t instanceof CharacterTag) { - doneCharacters.add(((CharacterTag) t).getCharacterID()); + Set needed = t.getDeepNeededCharacters(characters); + for (int n : needed) { + if (!doneCharacters.contains(n)) { + sos2.writeTag(characters.get(n)); + doneCharacters.add(n); } } + if (t instanceof CharacterTag) { + doneCharacters.add(((CharacterTag) t).getCharacterID()); + } sos2.writeTag(t); + + if (parent != null) { + if (t instanceof PlaceObjectTypeTag) { + PlaceObjectTypeTag pot = (PlaceObjectTypeTag) t; + int chid = pot.getCharacterId(); + int depth = pot.getDepth(); + MATRIX mat = pot.getMatrix(); + if (mat == null) { + mat = new MATRIX(); + } + mat=(MATRIX)Helper.deepCopy(mat); + if(parent instanceof BoundedTag){ + RECT r=((BoundedTag)parent).getRect(characters); + mat.translateX = mat.translateX +width / 2 - r.getWidth()/2; + mat.translateY = mat.translateY + height/2 - r.getHeight()/2; + }else{ + mat.translateX = mat.translateX + width / 2; + mat.translateY = mat.translateY + height / 2; + } + sos2.writeTag(new PlaceObject2Tag(false, false, false, false, false, true, false, true, depth, chid, mat, null, 0, null, 0, null)); + + } + } } sos2.writeTag(new ShowFrameTag()); } else { @@ -1488,7 +1508,7 @@ public class MainFrame extends JFrame implements ActionListener, TreeSelectionLi } } else if (tagObj instanceof AloneTag) { } else { - Set needed = ((Tag) tagObj).getNeededCharacters(); + Set needed = ((Tag) tagObj).getDeepNeededCharacters(characters); for (int n : needed) { sos2.writeTag(characters.get(n)); } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java index c3f001677..b7ec54f26 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java @@ -80,26 +80,25 @@ public class DefineSpriteTag extends CharacterTag implements Container, BoundedT public RECT getRect(HashMap characters) { RECT ret = new RECT(Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE); + HashMap depthMap=new HashMap(); for (Tag t : subTags) { - Set needed = t.getNeededCharacters(); + Set needed = t.getNeededCharacters(); + MATRIX m = null; + if (t instanceof PlaceObjectTypeTag) { + PlaceObjectTypeTag pot=(PlaceObjectTypeTag) t; + m = pot.getMatrix(); + int charId=pot.getCharacterId(); + if(charId>-1){ + depthMap.put(pot.getDepth(), charId); + }else{ + needed.add(depthMap.get(pot.getDepth())); + } + } if (needed.isEmpty()) { continue; } RECT r = getCharacterBounds(characters, needed); - MATRIX m = null; - if (t instanceof PlaceObjectTag) { - m = ((PlaceObjectTag) t).matrix; - } - if (t instanceof PlaceObject2Tag) { - if (((PlaceObject2Tag) t).placeFlagHasMatrix) { - m = ((PlaceObject2Tag) t).matrix; - } - } - if (t instanceof PlaceObject3Tag) { - if (((PlaceObject3Tag) t).placeFlagHasMatrix) { - m = ((PlaceObject3Tag) t).matrix; - } - } + if (m != null) { Point topleft = m.apply(new Point(r.Xmin, r.Ymin)); Point bottomright = m.apply(new Point(r.Xmax, r.Ymax)); diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java index 08469d697..b49a2598c 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java @@ -38,7 +38,7 @@ import java.util.Set; * * @author JPEXS */ -public class PlaceObject2Tag extends Tag implements Container { +public class PlaceObject2Tag extends Tag implements Container, PlaceObjectTypeTag { /** * @since SWF 5 Has clip actions (sprite characters only) @@ -254,4 +254,28 @@ public class PlaceObject2Tag extends Tag implements Container { } return ret; } + + public int getCharacterId() { + if(placeFlagHasCharacter){ + return characterId; + }else{ + return -1; + } + } + + public int getDepth() { + return depth; + } + + public MATRIX getMatrix() { + if(placeFlagHasMatrix){ + return matrix; + }else{ + return null; + } + } + + + + } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java index fa0bf5969..3096c6ef0 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java @@ -39,7 +39,7 @@ import java.util.Set; * * @author JPEXS */ -public class PlaceObject3Tag extends Tag implements Container { +public class PlaceObject3Tag extends Tag implements Container, PlaceObjectTypeTag { /** * @since SWF 5 has clip actions (sprite characters only) @@ -322,4 +322,25 @@ public class PlaceObject3Tag extends Tag implements Container { } return ret; } + + public int getCharacterId() { + if (placeFlagHasCharacter) { + return characterId; + } else { + return -1; + } + } + + public int getDepth() { + return depth; + } + + public MATRIX getMatrix() { + if(placeFlagHasMatrix){ + return matrix; + }else{ + return null; + } + } + } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java index 92aa6d0fd..ab0eaa21f 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTag.java @@ -32,7 +32,7 @@ import java.util.Set; * * @author JPEXS */ -public class PlaceObjectTag extends Tag { +public class PlaceObjectTag extends Tag implements PlaceObjectTypeTag{ /** * ID of character to place @@ -106,4 +106,21 @@ public class PlaceObjectTag extends Tag { ret.add(characterId); return ret; } + + @Override + public int getCharacterId() { + return characterId; + } + + public int getDepth() { + return depth; + } + + public MATRIX getMatrix() { + return matrix; + } + + + + } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTypeTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTypeTag.java new file mode 100644 index 000000000..ee2029ea3 --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObjectTypeTag.java @@ -0,0 +1,13 @@ +package com.jpexs.decompiler.flash.tags; + +import com.jpexs.decompiler.flash.types.MATRIX; + +/** + * + * @author JPEXS + */ +public interface PlaceObjectTypeTag { + public int getCharacterId(); + public int getDepth(); + public MATRIX getMatrix(); +} diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java index 31d3fb74f..f8eff5a38 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java @@ -16,6 +16,8 @@ */ package com.jpexs.decompiler.flash.tags; +import com.jpexs.decompiler.flash.tags.base.CharacterTag; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -120,4 +122,14 @@ public class Tag { public Set getNeededCharacters() { return new HashSet(); } + + public Set getDeepNeededCharacters(HashMap characters){ + Set ret=new HashSet(); + Set needed=getNeededCharacters(); + ret.addAll(needed); + for(int ch:needed){ + ret.addAll(characters.get(ch).getDeepNeededCharacters(characters)); + } + return ret; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/MATRIX.java b/trunk/src/com/jpexs/decompiler/flash/types/MATRIX.java index a4915e242..383489201 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/MATRIX.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/MATRIX.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.types; import java.awt.Point; +import java.io.Serializable; /** * Represents a standard 2x3 transformation matrix of the sort commonly used in @@ -24,7 +25,7 @@ import java.awt.Point; * * @author JPEXS */ -public class MATRIX { +public class MATRIX implements Serializable { /** * Has scale values