sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject [sis] 01/03: Remove `transformOnNewImage`, which was not necessary. It simplifies the handling of transforms and seems to resolve a discontinuity sometime observed during pan events.
Date Thu, 11 Feb 2021 00:31:31 GMT
This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 3bba8ad3a103a7d1c8f0ece1374a80a32bada335
Author: Martin Desruisseaux <martin.desruisseaux@geomatys.com>
AuthorDate: Wed Feb 10 21:26:45 2021 +0100

    Remove `transformOnNewImage`, which was not necessary.
    It simplifies the handling of transforms and seems to resolve a discontinuity sometime
observed during pan events.
---
 .../java/org/apache/sis/gui/map/MapCanvas.java     | 37 ++++++++++------------
 1 file changed, 16 insertions(+), 21 deletions(-)

diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvas.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvas.java
index 8c4cf60..8a43477 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvas.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvas.java
@@ -249,17 +249,10 @@ public abstract class MapCanvas extends PlanarCanvas {
     /**
      * The {@link #transform} values at the time the {@link #repaint()} method has been invoked.
      * This is a change applied on {@link #objectiveToDisplay} but not yet visible in the
map.
-     * After the map has been updated, this transform is reset to identity.
      */
     private final Affine changeInProgress;
 
     /**
-     * The value to assign to {@link #transform} after the {@link #floatingPane} has been
updated
-     * with transformed content.
-     */
-    private final Affine transformOnNewImage;
-
-    /**
      * Cursor position at the time pan event started.
      * This is used for computing the {@linkplain #floatingPane} translation to apply during
drag events.
      *
@@ -308,9 +301,8 @@ public abstract class MapCanvas extends PlanarCanvas {
      */
     public MapCanvas(final Locale locale) {
         super(locale);
-        transform           = new Affine();
-        changeInProgress    = new Affine();
-        transformOnNewImage = new Affine();
+        transform        = new Affine();
+        changeInProgress = new Affine();
         final Pane view = new Pane() {
             @Override protected void layoutChildren() {
                 super.layoutChildren();
@@ -340,7 +332,7 @@ public abstract class MapCanvas extends PlanarCanvas {
         fixedPane = new StackPane(view);
         GUIUtilities.setClipToBounds(fixedPane);
         isRendering = new ReadOnlyBooleanWrapper(this, "isRendering");
-        error = new ReadOnlyObjectWrapper<>(this, "exception");
+        error = new ReadOnlyObjectWrapper<>(this, "error");
     }
 
     /**
@@ -407,10 +399,9 @@ public abstract class MapCanvas extends PlanarCanvas {
     private void applyTranslation(final double tx, final double ty, final boolean isFinal)
{
         if (tx != 0 || ty != 0) {
             transform.appendTranslation(tx, ty);
-            final Point2D p = changeInProgress.deltaTransform(tx, ty);
-            transformOnNewImage.appendTranslation(p.getX(), p.getY());
             if (!isFinal) {
                 requestRepaint();
+                return;
             }
         }
         if (isFinal && !transform.isIdentity()) {
@@ -472,14 +463,11 @@ public abstract class MapCanvas extends PlanarCanvas {
                     unexpectedException("onKeyTyped", e);
                 }
             }
-            final Point2D p = changeInProgress.transform(x, y);
             if (zoom != 1) {
                 transform.appendScale(zoom, zoom, x, y);
-                transformOnNewImage.appendScale(zoom, zoom, p.getX(), p.getY());
             }
             if (angle != 0) {
                 transform.appendRotation(angle, x, y);
-                transformOnNewImage.appendRotation(angle, p.getX(), p.getY());
             }
             requestRepaint();
         }
@@ -876,6 +864,7 @@ public abstract class MapCanvas extends PlanarCanvas {
     /**
      * Invoked when the map content needs to be rendered again.
      * It may be because the map has new content, or because the viewed region moved or has
been zoomed.
+     * This method starts the rendering process immediately, unless a rendering is already
in progress.
      *
      * @see #requestRepaint()
      */
@@ -969,9 +958,10 @@ public abstract class MapCanvas extends PlanarCanvas {
          * If a temporary zoom, rotation or translation has been applied using JavaFX transform
API,
          * replace that temporary transform by a "permanent" adjustment of the `objectiveToDisplay`
          * transform. It allows SIS to get new data for the new visible area and resolution.
+         * Do not reset `transform` to identity now; we need to continue accumulating gestures
+         * that may happen while the rendering is done in a background thread.
          */
         changeInProgress.setToTransform(transform);
-        transformOnNewImage.setToIdentity();
         if (!transform.isIdentity()) {
             transformDisplayCoordinates(new AffineTransform(
                     transform.getMxx(), transform.getMyx(),
@@ -1034,11 +1024,12 @@ public abstract class MapCanvas extends PlanarCanvas {
      * Invoked after the background thread created by {@link #repaint()} finished to update
map content.
      * The {@link #changeInProgress} is the JavaFX transform at the time the repaint event
was trigged and
      * which is now integrated in the map. That transform will be removed from {@link #floatingPane}
transforms.
-     * It may be identity if no zoom, rotation or pan gesture has been applied since last
rendering.
+     * The {@link #transform} result is identity if no zoom, rotation or pan gesture has
been applied since last
+     * rendering.
      */
     final void renderingCompleted(final Task<?> task) {
         assert Platform.isFxApplicationThread();
-        // Keep cursor unchanged if contents changed because caller will invoke `repaint()`.
+        // Keep cursor unchanged if contents changed, because caller will invoke `repaint()`
again.
         if (!contentsChanged() || task.getState() != Task.State.SUCCEEDED) {
             restoreCursorAfterPaint();
         }
@@ -1046,8 +1037,12 @@ public abstract class MapCanvas extends PlanarCanvas {
         final Point2D p = changeInProgress.transform(xPanStart, yPanStart);
         xPanStart = p.getX();
         yPanStart = p.getY();
-        changeInProgress.setToIdentity();
-        transform.setToTransform(transformOnNewImage);
+        try {
+            changeInProgress.invert();
+            transform.prepend(changeInProgress);
+        } catch (NonInvertibleTransformException e) {
+            unexpectedException("repaint", e);
+        }
         isRendering.set(false);
         final Throwable ex = task.getException();
         if (ex != null) {


Mime
View raw message