#758 Zoom to fit should be dynamic

This commit is contained in:
2014-12-19 15:41:40 +01:00
parent a92d46505e
commit 4333972e31
8 changed files with 92 additions and 25 deletions
@@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.gui;
import com.jpexs.decompiler.flash.SWF;
import com.jpexs.decompiler.flash.exporters.commonshape.Matrix;
import com.jpexs.decompiler.flash.gui.player.MediaDisplay;
import com.jpexs.decompiler.flash.gui.player.Zoom;
import com.jpexs.decompiler.flash.tags.DefineButtonSoundTag;
import com.jpexs.decompiler.flash.tags.base.BoundedTag;
import com.jpexs.decompiler.flash.tags.base.ButtonTag;
@@ -85,7 +86,7 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
private final IconPanel iconPanel;
private int time = 0;
private int selectedDepth = -1;
private double zoom = 1.0;
private Zoom zoom = new Zoom();
private final Object delayObject = new Object();
private boolean drawReady;
private final int drawWaitLimit = 50; // ms
@@ -413,7 +414,7 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
}
@Override
public synchronized void zoom(double zoom) {
public synchronized void zoom(Zoom zoom) {
this.zoom = zoom;
shouldDraw.set(true);
}
@@ -446,6 +447,11 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
} else {
w = w2;
}
if (w1 <= Double.MIN_NORMAL) {
return 1.0;
}
return (double) w / (double) w1;
}
@@ -653,7 +659,7 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
DepthState stateUnderCursor;
int mouseButton;
int selectedDepth;
double zoom;
Zoom zoom;
SWF swf;
synchronized (ImagePanel.class) {
@@ -681,11 +687,12 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
return;
}
getOutlines(timelined, frame, time, zoom, stateUnderCursor, mouseButton, counter);
double zoomDouble = zoom.fit ? getZoomToFit() : zoom.value;
getOutlines(timelined, frame, time, zoomDouble, stateUnderCursor, mouseButton, counter);
Matrix mat = new Matrix();
mat.translateX = swf.displayRect.Xmin;
mat.translateY = swf.displayRect.Ymin;
SerializableImage img = getFrame(swf, frame, time, timelined, stateUnderCursor, mouseButton, selectedDepth, zoom);
SerializableImage img = getFrame(swf, frame, time, timelined, stateUnderCursor, mouseButton, selectedDepth, zoomDouble);
List<Integer> sounds = new ArrayList<>();
List<String> soundClasses = new ArrayList<>();
timeline.getSounds(frame, time, stateUnderCursor, mouseButton, sounds, soundClasses);
@@ -868,7 +875,7 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
}
@Override
public synchronized double getZoom() {
public synchronized Zoom getZoom() {
return zoom;
}
}
@@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.gui;
import com.jpexs.decompiler.flash.SWF;
import com.jpexs.decompiler.flash.SWFInputStream;
import com.jpexs.decompiler.flash.gui.player.MediaDisplay;
import com.jpexs.decompiler.flash.gui.player.Zoom;
import com.jpexs.decompiler.flash.tags.Tag;
import com.jpexs.decompiler.flash.tags.base.SoundTag;
import java.awt.Color;
@@ -193,8 +194,7 @@ public class SoundTagPlayer implements MediaDisplay {
}
@Override
public void zoom(double zoom) {
public void zoom(Zoom zoom) {
}
@Override
@@ -208,8 +208,8 @@ public class SoundTagPlayer implements MediaDisplay {
}
@Override
public double getZoom() {
return 0;
public Zoom getZoom() {
return null;
}
@Override
@@ -541,3 +541,4 @@ error.text.invalid.continue = Invalid text: %text% on line %line%. Do you want t
#after version 4.0.5
contextmenu.copyTag = Copy tag to
fit = fit
@@ -541,3 +541,4 @@ error.text.invalid.continue = Hib\u00e1s sz\u00f6veg: %text% a %line%. sorban. F
#after version 4.0.5
contextmenu.copyTag = M\u00e1sol\u00e1s ide
fit = kit\u00f6lt
@@ -65,15 +65,16 @@ public class FlashPlayerPanel extends Panel implements Closeable, MediaDisplay {
}
@Override
public double getZoom() {
return 0;
public Zoom getZoom() {
return null;
}
private double zoom = 1.0;
@Override
public synchronized void zoom(double zoom) {
int zoomint = (int) Math.round(100 / (zoom / this.zoom));
public synchronized void zoom(Zoom zoom) {
double zoomDouble = zoom.fit ? getZoomToFit() : zoom.value;
int zoomint = (int) Math.round(100 / (zoomDouble / this.zoom));
if (zoomint == 0) {
zoomint = 1;
}
@@ -29,7 +29,7 @@ public interface MediaDisplay {
public int getTotalFrames();
public void zoom(double zoom);
public void zoom(Zoom zoom);
public void pause();
@@ -55,5 +55,5 @@ public interface MediaDisplay {
public double getZoomToFit();
public double getZoom();
public Zoom getZoom();
}
@@ -95,6 +95,7 @@ public class PlayerControls extends JPanel implements ActionListener {
private final JPanel graphicControls;
private final JPanel playbackControls;
private final JPanel frameControls;
private boolean zoomToFit = false;
private double realZoom = 1.0;
private final JButton zoomFitButton;
@@ -324,9 +325,10 @@ public class PlayerControls extends JPanel implements ActionListener {
View.execInEventDispatch(new Runnable() {
@Override
public void run() {
double zoom = display.getZoom();
zoomFitButton.setVisible(zoom != 0.0);
percentLabel.setVisible(zoom != 0.0);
updateZoom();
Zoom zoom = display.getZoom();
zoomFitButton.setVisible(zoom != null);
percentLabel.setVisible(zoom != null);
zoomPanel.setVisible(display.zoomAvailable());
graphicControls.setVisible(display.screenAvailable());
totalFrameLabel.setVisible(display.screenAvailable());
@@ -385,14 +387,25 @@ public class PlayerControls extends JPanel implements ActionListener {
}
private void updateZoom() {
double pctzoom = roundZoom(realZoom * 100, 3);
double pctzoom = roundZoom(getRealZoom() * 100, 3);
String r = Double.toString(pctzoom);
double zoom = pctzoom / 100.0;
if (r.endsWith(".0")) {
r = r.substring(0, r.length() - 2);
}
percentLabel.setText(r + "%");
display.zoom(zoom);
r += "%";
if (zoomToFit) {
percentLabel.setText(AppStrings.translate("fit") + " (" + r + ")");
} else {
percentLabel.setText(r);
}
Zoom zoomObj = new Zoom();
zoomObj.value = zoom;
zoomObj.fit = zoomToFit;
display.zoom(zoomObj);
}
@Override
@@ -476,19 +489,23 @@ public class PlayerControls extends JPanel implements ActionListener {
});
break;
case ACTION_ZOOMIN:
realZoom *= ZOOM_MULTIPLIER;
realZoom = getRealZoom() * ZOOM_MULTIPLIER;
zoomToFit = false;
updateZoom();
break;
case ACTION_ZOOMOUT:
realZoom /= ZOOM_MULTIPLIER;
realZoom = getRealZoom() / ZOOM_MULTIPLIER;
zoomToFit = false;
updateZoom();
break;
case ACTION_ZOOMNONE:
realZoom = 1.0;
zoomToFit = false;
updateZoom();
break;
case ACTION_ZOOMFIT:
realZoom = display.getZoomToFit();
realZoom = 1.0;
zoomToFit = true;
updateZoom();
break;
case ACTION_SNAPSHOT:
@@ -497,6 +514,14 @@ public class PlayerControls extends JPanel implements ActionListener {
}
}
private double getRealZoom() {
if (zoomToFit) {
return display.getZoomToFit();
}
return realZoom;
}
private class TransferableImage implements Transferable {
Image img;
@@ -0,0 +1,32 @@
/*
* Copyright (C) 2010-2014 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 <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.gui.player;
/**
*
* @author JPEXS
*/
public class Zoom {
public double value = 1.0;
public boolean fit = false;
public Zoom() {
}
}