From b7e40c6152e66ed8e8a08baa4cabd8f55a1649eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 29 Mar 2021 19:53:08 +0200 Subject: [PATCH] zoom to center even if center moved maximum zoom level --- .../decompiler/flash/gui/ImagePanel.java | 21 ++++++++++++------- .../flash/gui/player/PlayerControls.java | 8 ++++++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index 3adb85361..417afb0f4 100644 --- a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -1096,7 +1096,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay { } private synchronized void calcRect() { - if (_img != null) { + if (timelined != null) { //int w1 = (int) (_img.getWidth() * (lowQuality ? LQ_FACTOR : 1)); //int h1 = (int) (_img.getHeight() * (lowQuality ? LQ_FACTOR : 1)); double zoomDouble = zoom.fit ? getZoomToFit() : zoom.value; @@ -1130,8 +1130,6 @@ public final class ImagePanel extends JPanel implements MediaDisplay { setAllowMove(h > h2 || w > w2); Rectangle r2 = new Rectangle(getWidth() / 2 - w / 2 + offsetPoint.x, getHeight() / 2 - h / 2 + offsetPoint.y, w, h); _rect = r2; - } else { - _rect = null; } } @@ -1325,19 +1323,23 @@ public final class ImagePanel extends JPanel implements MediaDisplay { @Override public synchronized void zoom(Zoom zoom) { + double zoomDoubleBefore = this.zoom.fit ? getZoomToFit() : this.zoom.value; + boolean modified = this.zoom.value != zoom.value || this.zoom.fit != zoom.fit; if (modified) { this.zoom = zoom; displayObjectCache.clear(); + if (_rect != null) { + double zoomDouble = zoom.fit ? getZoomToFit() : zoom.value; + offsetPoint.x = (int) (offsetPoint.x * zoomDouble / zoomDoubleBefore); + offsetPoint.y = (int) (offsetPoint.y * zoomDouble / zoomDoubleBefore); + } redraw(); if (textTag != null) { setText(textTag, newTextTag); } fireMediaDisplayStateChanged(); - iconPanel.calcRect(); - iconPanel.render(); - iconPanel.repaint(); } } @@ -1896,6 +1898,8 @@ public final class ImagePanel extends JPanel implements MediaDisplay { return; } + iconPanel.calcRect(); + RenderContext renderContext = new RenderContext(); renderContext.displayObjectCache = displayObjectCache; if (cursorPosition != null && freeTransformDepth == -1) { @@ -2033,6 +2037,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay { } } catch (Throwable ex) { // swf was closed during the rendering probably + ex.printStackTrace(); return; } if (display) { @@ -2240,12 +2245,12 @@ public final class ImagePanel extends JPanel implements MediaDisplay { long delay = getMsPerFrame(); if (isSingleFrame) { drawFrame(thisTimer, true); - synchronized (ImagePanel.class) { + /*synchronized (ImagePanel.class) { thisTimer.cancel(); if (timer == thisTimer) { timer = null; } - } + }*/ fireMediaDisplayStateChanged(); } else { diff --git a/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java b/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java index 73d3fdc6d..9dac211a5 100644 --- a/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java +++ b/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java @@ -123,6 +123,8 @@ public class PlayerControls extends JPanel implements MediaDisplayListener { private final int zeroCharacterWidth; + private final double MAX_ZOOM = 1.0e6; //in larger zooms, flash viewer stops working + static { Font font = new JLabel().getFont(); notUnderlinedFont = font; @@ -498,7 +500,11 @@ public class PlayerControls extends JPanel implements MediaDisplayListener { } private void zoomInButtonActionPerformed(ActionEvent evt) { - realZoom = getRealZoom() * ZOOM_MULTIPLIER; + double currentRealZoom = getRealZoom(); + if (currentRealZoom >= MAX_ZOOM) { + return; + } + realZoom = currentRealZoom * ZOOM_MULTIPLIER; zoomToFit = false; updateZoom(); }