/* * Copyright (C) 2013 JPEXS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.jpexs.decompiler.flash.gui; import com.jpexs.decompiler.flash.SWF; import static com.jpexs.decompiler.flash.gui.AppStrings.translate; import java.awt.BorderLayout; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import java.util.Stack; import java.util.Timer; import java.util.TimerTask; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.border.BevelBorder; /** * * @author JPEXS */ public class SWFPreviwPanel extends JPanel { ImagePanel pan; Timer timer; int frame = 0; List frameImages = new ArrayList<>(); JLabel buffering = new JLabel(translate("work.buffering") + "..."); public SWFPreviwPanel() { pan = new ImagePanel(); setLayout(new BorderLayout()); add(pan, BorderLayout.CENTER); add(buffering, BorderLayout.SOUTH); buffering.setHorizontalAlignment(JLabel.CENTER); buffering.setVisible(false); JLabel prevLabel = new JLabel("SWF preview (Internal viewer)"); prevLabel.setHorizontalAlignment(SwingConstants.CENTER); prevLabel.setBorder(new BevelBorder(BevelBorder.RAISED)); add(prevLabel, BorderLayout.NORTH); } private SWF swf; public void load(final SWF swf) { this.swf = swf; new Thread() { @Override public void run() { buffering.setVisible(true); SWF.framesToImage(0, frameImages, 1, swf.frameCount, swf.tags, swf.tags, swf.displayRect, swf.frameCount, new Stack()); buffering.setVisible(false); } }.start(); } public void stop() { if (timer != null) { timer.cancel(); timer = null; } } public void play() { if (swf == null) { return; } stop(); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { int newframe = (frame == swf.frameCount ? 1 : frame + 1); if (frameImages.size() >= newframe) { pan.setImage(frameImages.get(newframe - 1)); frame = newframe; } } }, 0, 1000 / swf.frameRate); } }