From e087342e720a9d1715098d8c43b208fd87a5cc20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sun, 1 Sep 2013 15:03:57 +0200 Subject: [PATCH] Whole SWF preview --- .../decompiler/flash/gui/ImagePanel.java | 9 ++- .../jpexs/decompiler/flash/gui/MainFrame.java | 36 ++++++++-- .../decompiler/flash/gui/SWFPreviwPanel.java | 68 +++++++++++++++++-- 3 files changed, 103 insertions(+), 10 deletions(-) diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index 68d7ba773..7599b0393 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -153,6 +153,9 @@ public class ImagePanel extends JPanel implements ActionListener, FlashDisplay { } private void drawFrame() { + if(drawable == null){ + return; + } int nframe = percent * drawable.getNumFrames() / 100; if (nframe != frame) { ImageIcon icon = new ImageIcon(drawable.toImage(nframe, swf.tags, swf.displayRect, characters, new Stack())); @@ -197,7 +200,11 @@ public class ImagePanel extends JPanel implements ActionListener, FlashDisplay { @Override public void gotoFrame(int frame) { - percent = frame * 100 / drawable.getNumFrames(); + if(drawable==null){ + percent = 0; + }else{ + percent = frame * 100 / drawable.getNumFrames(); + } drawFrame(); } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java index e4091d97e..d24c8c72e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java @@ -2937,11 +2937,39 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel showDetail(DETAILCARDEMPTYPANEL); } swfPreviewPanel.stop(); - if ((tagObj instanceof SWFRoot) && miInternalViewer.isSelected()) { + if ((tagObj instanceof SWFRoot)) { stopFlashPlayer(); - showCard(CARDSWFPREVIEWPANEL); - swfPreviewPanel.load(swf); - swfPreviewPanel.play(); + if (miInternalViewer.isSelected()) { + showCard(CARDSWFPREVIEWPANEL); + swfPreviewPanel.load(swf); + swfPreviewPanel.play(); + } else { + showCard(CARDFLASHPANEL); + parametersPanel.setVisible(false); + if (flashPanel != null) { + Color backgroundColor=View.DEFAULT_BACKGROUND_COLOR; + for (Tag t : swf.tags) { + if (t instanceof SetBackgroundColorTag) { + backgroundColor = ((SetBackgroundColorTag) t).backgroundColor.toColor(); + break; + } + } + if (flashPanel instanceof FlashPlayerPanel) { + if (tempFile != null) { + tempFile.delete(); + } + try{ + tempFile = File.createTempFile("temp", ".swf"); + tempFile.deleteOnExit(); + swf.saveTo(new FileOutputStream(tempFile)); + flashPanel.displaySWF(tempFile.getAbsolutePath(), backgroundColor, swf.frameRate); + }catch(IOException iex){ + Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, "Cannot create tempfile", iex); + } + } + } + } + } /*else if (tagObj instanceof DefineVideoStreamTag) { showCard(CARDEMPTYPANEL); } else if ((tagObj instanceof DefineSoundTag) || (tagObj instanceof SoundStreamHeadTag) || (tagObj instanceof SoundStreamHead2Tag)) { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java index 6669cf7ab..3cb8d6116 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.decompiler.flash.SWF; import static com.jpexs.decompiler.flash.gui.AppStrings.translate; +import com.jpexs.decompiler.flash.gui.player.FlashDisplay; import com.jpexs.decompiler.flash.gui.player.PlayerControls; import java.awt.BorderLayout; import java.awt.Color; @@ -41,11 +42,11 @@ import javax.swing.SwingConstants; * * @author JPEXS */ -public class SWFPreviwPanel extends JPanel { +public class SWFPreviwPanel extends JPanel implements FlashDisplay { ImagePanel pan; Timer timer; - int frame = 0; + int frame = 1; List frameImages = new ArrayList<>(); JLabel buffering = new JLabel(translate("work.buffering") + "..."); @@ -61,7 +62,7 @@ public class SWFPreviwPanel extends JPanel { //prevLabel.setBorder(new BevelBorder(BevelBorder.RAISED)); add(prevLabel, BorderLayout.NORTH); //add(buffering, BorderLayout.SOUTH); - add(new PlayerControls(pan), BorderLayout.SOUTH); + add(new PlayerControls(this), BorderLayout.SOUTH); } private SWF swf; @@ -71,7 +72,7 @@ public class SWFPreviwPanel extends JPanel { @Override public void run() { buffering.setVisible(true); - SWF.framesToImage(0, frameImages, 1, swf.frameCount, swf.tags, swf.tags, swf.displayRect, swf.frameCount, new Stack()); + SWF.framesToImage(0, frameImages, 0, swf.frameCount-1, swf.tags, swf.tags, swf.displayRect, swf.frameCount, new Stack()); buffering.setVisible(false); } }.start(); @@ -86,6 +87,7 @@ public class SWFPreviwPanel extends JPanel { } } + @Override public void play() { if (swf == null) { return; @@ -100,11 +102,67 @@ public class SWFPreviwPanel extends JPanel { public void run() { int newframe = (frame == swf.frameCount ? 1 : frame + 1); if (frameImages.size() >= newframe) { - pan.setImage(frameImages.get(newframe - 1)); + //pan.setImage(frameImages.get(newframe - 1)); frame = newframe; + drawFrame(); pan.setBackground(View.swfBackgroundColor); } } }, 0, 1000 / swf.frameRate); } + + private void drawFrame(){ + pan.setImage(frameImages.get(frame - 1)); + } + + @Override + public int getCurrentFrame() { + return frame; + } + + @Override + public int getTotalFrames() { + if(swf==null){ + return 0; + } + return swf.frameCount; + } + + @Override + public void pause() { + if(timer!=null){ + timer.cancel(); + timer = null; + } + } + + @Override + public void rewind() { + frame = 1; + drawFrame(); + } + + @Override + public boolean isPlaying() { + return timer!=null; + } + + @Override + public void gotoFrame(int frame) { + this.frame = frame; + drawFrame(); + } + + @Override + public int getFrameRate() { + if(swf==null){ + return 1; + } + return swf.frameRate; + } + + @Override + public boolean isLoaded() { + return true; + } }