From ef3dccb922b3a3aa63f11e1abc0f8f9b6a27f4f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 17 Dec 2022 12:30:20 +0100 Subject: [PATCH] Button vs cursor pos fix --- .../flash/tags/DefineScalingGridTag.java | 6 ++--- .../flash/tags/DefineSpriteTag.java | 4 +-- .../flash/tags/DefineVideoStreamTag.java | 2 +- .../decompiler/flash/tags/base/ButtonTag.java | 4 +-- .../flash/tags/base/DrawableTag.java | 2 +- .../decompiler/flash/tags/base/FontTag.java | 2 +- .../decompiler/flash/tags/base/ImageTag.java | 2 +- .../flash/tags/base/MorphShapeTag.java | 2 +- .../decompiler/flash/tags/base/ShapeTag.java | 2 +- .../decompiler/flash/tags/base/TextTag.java | 2 +- .../decompiler/flash/timeline/Timeline.java | 25 +++++++++++-------- .../decompiler/flash/gui/ImagePanel.java | 12 ++++++--- 12 files changed, 36 insertions(+), 29 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineScalingGridTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineScalingGridTag.java index 5176573c3..943fc826e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineScalingGridTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineScalingGridTag.java @@ -116,7 +116,7 @@ public class DefineScalingGridTag extends Tag implements CharacterIdTag { } public RECT getRect() { - Shape s = getOutline(0, 0, 0, new RenderContext(), new Matrix(), new Matrix(), true); + Shape s = getOutline(0, 0, 0, new RenderContext(), new Matrix(), new Matrix(), true, new ExportRectangle(0, 0, 1, 1)/*?*/, 1); if (s == null) { return null; } @@ -124,7 +124,7 @@ public class DefineScalingGridTag extends Tag implements CharacterIdTag { return new RECT(r.x, r.x + r.width, r.y, r.y + r.height); } - public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, Matrix prevTransform, boolean stroked) { + public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, Matrix prevTransform, boolean stroked, ExportRectangle viewRect, double unzoom) { CharacterTag ct = swf.getCharacter(characterId); if (ct == null) { return null; @@ -135,7 +135,7 @@ public class DefineScalingGridTag extends Tag implements CharacterIdTag { double[] coords = new double[6]; DrawableTag dt = (DrawableTag) ct; - Shape path = dt.getOutline(frame, time, ratio, renderContext, transformation, stroked); + Shape path = dt.getOutline(frame, time, ratio, renderContext, transformation, stroked, viewRect, unzoom); PathIterator iterator = path.getPathIterator(new AffineTransform()); GeneralPath gp = new GeneralPath(GeneralPath.WIND_EVEN_ODD); ExportRectangle boundsRect = new ExportRectangle(dt.getRect()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java index 599f32ef6..b30212670 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java @@ -377,8 +377,8 @@ public class DefineSpriteTag extends DrawableTag implements Timelined { } @Override - public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked) { - return getTimeline().getOutline(frame, time, renderContext, transformation, stroked); + public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked, ExportRectangle viewRect, double unzoom) { + return getTimeline().getOutline(frame, time, renderContext, transformation, stroked, viewRect, unzoom); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java index 0933be505..e5725ff43 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineVideoStreamTag.java @@ -295,7 +295,7 @@ public class DefineVideoStreamTag extends DrawableTag implements BoundedTag, Tim } @Override - public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked) { + public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked, ExportRectangle viewRect, double unzoom) { return transformation.toTransform().createTransformedShape(new Rectangle2D.Double(0, 0, width * SWF.unitDivisor, height * SWF.unitDivisor)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java index 8c0711a4e..0fb1c1589 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java @@ -88,8 +88,8 @@ public abstract class ButtonTag extends DrawableTag implements Timelined { } @Override - public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked) { - return getTimeline().getOutline(frame, time, renderContext, transformation, stroked); + public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked, ExportRectangle viewRect, double unzoom) { + return getTimeline().getOutline(frame, time, renderContext, transformation, stroked, viewRect, unzoom); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/DrawableTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/DrawableTag.java index c1546247f..567c3352e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/DrawableTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/DrawableTag.java @@ -44,7 +44,7 @@ public abstract class DrawableTag extends CharacterTag implements BoundedTag { public abstract int getUsedParameters(); - public abstract Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked); + public abstract Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked, ExportRectangle viewRect, double unzoom); public abstract void toImage(int frame, int time, int ratio, RenderContext renderContext, SerializableImage image, SerializableImage fullImage, boolean isClip, Matrix transformation, Matrix prevTransformation, Matrix absoluteTransformation, Matrix fullTransformation, ColorTransform colorTransform, double unzoom, boolean sameImage, ExportRectangle viewRect, boolean scaleStrokes, int drawMode, int blendMode); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java index 401640ee2..b7bb48b45 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java @@ -427,7 +427,7 @@ public abstract class FontTag extends DrawableTag implements AloneTag { } @Override - public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked) { + public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked, ExportRectangle viewRect, double unzoom) { RECT r = getRect(); return new Area(new Rectangle(r.Xmin, r.Ymin, r.getWidth(), r.getHeight())); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java index 495fc90bf..f2fee2bdb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ImageTag.java @@ -229,7 +229,7 @@ public abstract class ImageTag extends DrawableTag { } @Override - public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked) { + public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked, ExportRectangle viewRect, double unzoom) { return transformation.toTransform().createTransformedShape(getShape(1).getOutline(1, swf, stroked)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java index 86765b2a1..3d25ed971 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MorphShapeTag.java @@ -349,7 +349,7 @@ public abstract class MorphShapeTag extends DrawableTag { } @Override - public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked) { + public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked, ExportRectangle viewRect, double unzoom) { return transformation.toTransform().createTransformedShape(getShapeAtRatio(ratio).getOutline(getShapeNum() == 2 ? 4 : 1, swf, stroked)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java index 5da4ce310..ab9c7b442 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ShapeTag.java @@ -183,7 +183,7 @@ public abstract class ShapeTag extends DrawableTag implements LazyObject { } @Override - public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked) { + public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked, ExportRectangle viewRect, double unzoom) { return transformation.toTransform().createTransformedShape(getShapes().getOutline(getShapeNum(), swf, stroked)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java index 59cda344f..2d3de8866 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java @@ -783,7 +783,7 @@ public abstract class TextTag extends DrawableTag { } @Override - public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked) { + public Shape getOutline(int frame, int time, int ratio, RenderContext renderContext, Matrix transformation, boolean stroked, ExportRectangle viewRect, double unzoom) { RECT r = getBounds(); Shape shp = new Rectangle.Double(r.Xmin, r.Ymin, r.getWidth(), r.getHeight()); return transformation.toTransform().createTransformedShape(shp); //TODO: match character shapes (?) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java index ecff4bf4a..04aa1f05e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timeline.java @@ -795,9 +795,9 @@ public class Timeline { if (renderContext.cursorPosition != null) { int dx = (int) (viewRect.xMin * unzoom); int dy = (int) (viewRect.yMin * unzoom); - Point cursorPositionInView = new Point(renderContext.cursorPosition.x - dx, renderContext.cursorPosition.y - dy); + Point cursorPositionInView = new Point((int)Math.round(renderContext.cursorPosition.x * unzoom) - dx, (int)Math.round(renderContext.cursorPosition.y * unzoom) - dy); - Shape buttonShape = drawable.getOutline(ButtonTag.FRAME_HITTEST, time, ratio, renderContext, absMat, true); + Shape buttonShape = drawable.getOutline(ButtonTag.FRAME_HITTEST, time, ratio, renderContext, absMat, true, viewRect, unzoom); if (buttonShape.contains(cursorPositionInView)) { renderContext.mouseOverButton = (ButtonTag) drawable; if (renderContext.mouseButton > 0) { @@ -950,15 +950,15 @@ public class Timeline { clips.add(clip); } else { if (renderContext.cursorPosition != null) { - int dx = (int) (viewRect.xMin * unzoom); - int dy = (int) (viewRect.yMin * unzoom); - Point cursorPositionInView = new Point(renderContext.cursorPosition.x - dx, renderContext.cursorPosition.y - dy); + int dx = (int) Math.round(viewRect.xMin * unzoom); + int dy = (int) Math.round(viewRect.yMin * unzoom); + Point cursorPositionInView = new Point((int) Math.round(renderContext.cursorPosition.x * unzoom) - dx, (int) Math.round(renderContext.cursorPosition.y * unzoom) - dy); if (drawable instanceof DefineSpriteTag) { if (renderContext.stateUnderCursor.size() > stateCount) { renderContext.stateUnderCursor.add(layer); } } else if (absMat.transform(new ExportRectangle(boundRect)).contains(cursorPositionInView)) { - Shape shape = drawable.getOutline(dframe, time, layer.ratio, renderContext, absMat, true); + Shape shape = drawable.getOutline(dframe, time, layer.ratio, renderContext, absMat, true, viewRect, unzoom); if (shape.contains(cursorPositionInView)) { renderContext.stateUnderCursor.add(layer); } @@ -969,7 +969,7 @@ public class Timeline { Graphics2D g2 = (Graphics2D) renderContext.borderImage.getGraphics(); g2.setPaint(Color.red); g2.setStroke(new BasicStroke(2)); - Shape shape = drawable.getOutline(dframe, time, layer.ratio, renderContext, absMat.preConcatenate(Matrix.getScaleInstance(1 / SWF.unitDivisor)), true); + Shape shape = drawable.getOutline(dframe, time, layer.ratio, renderContext, absMat.preConcatenate(Matrix.getScaleInstance(1 / SWF.unitDivisor)), true, viewRect, unzoom); g2.draw(shape); } if (!(sameImage && canUseSameImage)) { @@ -1319,7 +1319,7 @@ public class Timeline { } } - public Shape getOutline(int frame, int time, RenderContext renderContext, Matrix transformation, boolean stroked) { + public Shape getOutline(int frame, int time, RenderContext renderContext, Matrix transformation, boolean stroked, ExportRectangle viewRect, double unzoom) { Frame fr = getFrame(frame); Area area = new Area(); Stack clips = new Stack<>(); @@ -1356,8 +1356,11 @@ public class Timeline { dframe = ButtonTag.FRAME_UP; if (renderContext.cursorPosition != null) { ButtonTag buttonTag = (ButtonTag) character; - Shape buttonShape = buttonTag.getOutline(ButtonTag.FRAME_HITTEST, time, layer.ratio, renderContext, m, stroked); - if (buttonShape.contains(renderContext.cursorPosition)) { + Shape buttonShape = buttonTag.getOutline(ButtonTag.FRAME_HITTEST, time, layer.ratio, renderContext, m, stroked, viewRect, unzoom); + int dx = (int) Math.round(viewRect.xMin * unzoom); + int dy = (int) Math.round(viewRect.yMin * unzoom); + Point cursorPositionInView = new Point((int) Math.round(renderContext.cursorPosition.x * unzoom) - dx, (int) Math.round(renderContext.cursorPosition.y * unzoom) - dy); + if (buttonShape.contains(cursorPositionInView)) { if (renderContext.mouseButton > 0) { dframe = ButtonTag.FRAME_DOWN; } else { @@ -1367,7 +1370,7 @@ public class Timeline { } } - Shape cshape = ((DrawableTag) character).getOutline(dframe, time, layer.ratio, renderContext, m, stroked); + Shape cshape = ((DrawableTag) character).getOutline(dframe, time, layer.ratio, renderContext, m, stroked, viewRect, unzoom); Area addArea = new Area(cshape); if (currentClip != null) { Area a = new Area(new Rectangle(displayRect.Xmin, displayRect.Ymin, displayRect.getWidth(), displayRect.getHeight())); diff --git a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index df23789d1..e50791de6 100644 --- a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -2135,7 +2135,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay { } int dframe = time % drawableFrameCount; - Shape outline = dt.getOutline(dframe, time, ds.ratio, renderContext, Matrix.getScaleInstance(1 / SWF.unitDivisor).concatenate(m.concatenate(new Matrix(ds.matrix))), true); + Shape outline = dt.getOutline(dframe, time, ds.ratio, renderContext, Matrix.getScaleInstance(1 / SWF.unitDivisor).concatenate(m.concatenate(new Matrix(ds.matrix))), true, viewRect, zoom); Rectangle bounds = outline.getBounds(); gg.setStroke(new BasicStroke(2.0f, BasicStroke.CAP_BUTT, @@ -2164,10 +2164,10 @@ public final class ImagePanel extends JPanel implements MediaDisplay { int dframe = time % drawableFrameCount; //Matrix finalMatrix = Matrix.getScaleInstance(1 / SWF.unitDivisor).concatenate(m).concatenate(new Matrix(ds.matrix)); - Shape outline = dt.getOutline(dframe, time, ds.ratio, renderContext, transform, true); + Shape outline = dt.getOutline(dframe, time, ds.ratio, renderContext, transform, true, viewRect, zoom); if (temporaryMatrix != null) { - Shape tempOutline = dt.getOutline(dframe, time, ds.ratio, renderContext, temporaryMatrix, true); + Shape tempOutline = dt.getOutline(dframe, time, ds.ratio, renderContext, temporaryMatrix, true, viewRect, zoom); gg.setStroke(new BasicStroke(1)); gg.setPaint(Color.black); gg.draw(tempOutline); @@ -3122,7 +3122,11 @@ public final class ImagePanel extends JPanel implements MediaDisplay { Matrix b = getNewMatrix().concatenate(new Matrix(ds.matrix).inverse()); int dframe = time % drawableFrameCount; - Shape outline = dt.getOutline(dframe, time, ds.ratio, renderContext, b.concatenate(new Matrix(ds.matrix)), true); + double zoomDouble = zoom.fit ? getZoomToFit() : zoom.value; + if (lowQuality) { + zoomDouble /= LQ_FACTOR; + } + Shape outline = dt.getOutline(dframe, time, ds.ratio, renderContext, b.concatenate(new Matrix(ds.matrix)), true, _viewRect, zoomDouble); return outline.getBounds2D(); } }