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() {
