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 3ad66ff00612d37a11cfad38a215cd67302a81ce
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Sat Jun 18 11:46:54 2022 +0200

    Attempt to reduce flickering effect sometime visible at the moment when 
image data are replaced.
---
 .../apache/sis/gui/coverage/CoverageCanvas.java    |  5 +--
 .../java/org/apache/sis/gui/map/MapCanvas.java     | 38 +++++++++++++++++++---
 .../java/org/apache/sis/gui/map/MapCanvasAWT.java  |  5 +--
 3 files changed, 40 insertions(+), 8 deletions(-)

diff --git 
a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageCanvas.java
 
b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageCanvas.java
index 1b741939d2..21e4bc55ba 100644
--- 
a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageCanvas.java
+++ 
b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageCanvas.java
@@ -1218,7 +1218,7 @@ public class CoverageCanvas extends MapCanvasAWT {
             final Rectangle2D aoi = getAreaOfInterest();
             final DirectPosition poi = getPointOfInterest(true);
             if (aoi != null && poi != null) {
-                table.append(String.format("A/P of interest in objective CRS 
(x,y):%n"
+                table.append(String.format("Area of interest in objective CRS 
(x,y):%n"
                              + "Max: %, 16.4f  %, 16.4f%n"
                              + "POI: %, 16.4f  %, 16.4f%n"
                              + "Min: %, 16.4f  %, 16.4f%n",
@@ -1231,8 +1231,9 @@ public class CoverageCanvas extends MapCanvasAWT {
             if (source != null) {
                 table.append("Extent in source 
coverage:").append(lineSeparator)
                      .append(String.valueOf(new 
GridExtent(source))).append(lineSeparator)
-                     .nextLine();
+                     .appendHorizontalSeparator();
             }
+            table.append(super.toString()).nextLine();
             table.nextLine('═');
             table.flush();
         } catch (RenderException | TransformException | IOException e) {
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 ad04ffa89a..1f0cf49dc1 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
@@ -19,6 +19,7 @@ package org.apache.sis.gui.map;
 import java.util.Locale;
 import java.util.Arrays;
 import java.util.Objects;
+import java.util.Formatter;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.NoninvertibleTransformException;
 import java.beans.PropertyChangeEvent;
@@ -154,10 +155,13 @@ public abstract class MapCanvas extends PlanarCanvas {
      * It does not apply to the immediate feedback that the user gets from 
JavaFX affine transforms
      * (an image with lower quality used until the higher quality image become 
ready).
      *
+     * <p>This value should not be too small for reducing flickering effects 
that are sometime visible
+     * at the moment when image data are replaced.</p>
+     *
      * @see #requestRepaint()
      * @see Delayed
      */
-    private static final long REPAINT_DELAY = 100;
+    private static final long REPAINT_DELAY = 500;
 
     /**
      * Number of nanoseconds to wait before to set mouse cursor shape to 
{@link Cursor#WAIT} during rendering.
@@ -165,7 +169,7 @@ public abstract class MapCanvas extends PlanarCanvas {
      *
      * @see #renderingStartTime
      */
-    private static final long WAIT_CURSOR_DELAY = (500 - REPAINT_DELAY) * 
NANOS_PER_MILLISECOND;
+    private static final long WAIT_CURSOR_DELAY = (1000 - REPAINT_DELAY) * 
NANOS_PER_MILLISECOND;
 
     /**
      * The pane showing the map and any other JavaFX nodes to scale and 
translate together with the map.
@@ -1124,7 +1128,7 @@ public abstract class MapCanvas extends PlanarCanvas {
                  * use it as-is. Otherwise we will compute it from the bounds 
of data.
                  */
                 CoordinateReferenceSystem objectiveCRS;
-                LinearTransform crsToDisplay = null;
+                LinearTransform crsToDisplay;
                 final GridGeometry init = initialState;
                 initialState = null;                                    // For 
using `objectiveBounds` next times.
                 if (init != null && init.isDefined(GridGeometry.GRID_TO_CRS)) {
@@ -1200,7 +1204,7 @@ public abstract class MapCanvas extends PlanarCanvas {
         final Renderer context = createRenderer();
         if (context != null && context.initialize(floatingPane)) {
             final Task<?> worker = createWorker(context);
-            assert renderingInProgress == null;
+            assert renderingInProgress == null : renderingInProgress;
             BackgroundThreads.execute(worker);
             renderingInProgress = worker;       // Set after we know that the 
task has been scheduled.
             if (!isCursorChangeScheduled) {
@@ -1257,6 +1261,7 @@ public abstract class MapCanvas extends PlanarCanvas {
      */
     final void renderingCompleted(final Task<?> task) {
         assert Platform.isFxApplicationThread();
+        assert renderingInProgress == task : "Expected " + renderingInProgress 
+ " but was " + task;
         // Keep cursor unchanged if contents changed, because caller will 
invoke `repaint()` again.
         if (!contentsChanged() || task.getState() != Task.State.SUCCEEDED) {
             restoreCursorAfterPaint();
@@ -1513,4 +1518,29 @@ public abstract class MapCanvas extends PlanarCanvas {
         isRendering.set(false);
         requestRepaint();
     }
+
+    /**
+     * Returns a string representation of this canvas for debugging purposes.
+     * This string spans multiple lines.
+     *
+     * @return debug string (may change in any future version).
+     *
+     * @since 1.3
+     */
+    @Override
+    public String toString() {
+        final Formatter buffer = new Formatter();
+        final double tx = transform.getTx();
+        final double ty = transform.getTy();
+        try {
+            final AffineTransform displayToObjective = 
objectiveToDisplay.createInverse();
+            java.awt.geom.Point2D p = new java.awt.geom.Point2D.Double(-tx, 
-ty);
+            p = displayToObjective.transform(p, p);
+            buffer.format("Upper-left corner:   %+7.2f %+7.2f%n", p.getX(), 
p.getY());
+        } catch (NoninvertibleTransformException e) {
+            buffer.format("%s%n", e);
+        }
+        buffer.format("Pending translation: %+7.2f %+7.2f px%n", tx, ty);
+        return buffer.toString();
+    }
 }
diff --git 
a/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvasAWT.java 
b/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvasAWT.java
index 5f81b6047e..5ad205d46c 100644
--- 
a/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvasAWT.java
+++ 
b/application/sis-javafx/src/main/java/org/apache/sis/gui/map/MapCanvasAWT.java
@@ -527,7 +527,7 @@ public abstract class MapCanvasAWT extends MapCanvas {
                 } while (invalid && !isCancelled());
             } finally {
                 if (invalid) {
-                    drawTo.flush();         // Release native resources.
+                    drawTo.flush();         // Release native resources on 
cancellation or exception thrown.
                 }
             }
             return drawTo;
@@ -578,11 +578,12 @@ public abstract class MapCanvasAWT extends MapCanvas {
             }
         }
 
-        /** Clears the image in the same way than failure. */
+        /** Clears the image in the same way than failure. Defined for safety 
but should not happen. */
         @Override protected void cancelled() {failed();}
 
         /**
          * Invoked in JavaFX thread on failure. No result is available. The 
JavaFX image is set to an empty image.
+         * {@link VolatileImage#flush()} has already been invoked by the 
finally block in {@link #call()}.
          */
         @Override
         protected void failed() {

Reply via email to