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 59b16ae521857ce6eb279dd4ca211df72f56c406
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Tue Apr 5 11:39:14 2022 +0200

    Bug fix: wrong image sometime shown when a zoom causes a change of pyramid 
level.
---
 .../apache/sis/gui/coverage/CoverageCanvas.java    | 33 ++++++++++++++++------
 1 file changed, 25 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 bd652d541c..7ff5efed41 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
@@ -659,11 +659,19 @@ public class CoverageCanvas extends MapCanvasAWT {
         private final GridCoverageResource resource;
 
         /**
-         * If a coverage has been loaded from the {@linkplain #resource}, the 
coverage.
-         * Otherwise {@code null} for meaning "no change".
+         * The coverage specified by user or the coverage loaded from the 
{@linkplain #resource}.
+         * May be {@code null} if coverages are loaded from resource but did 
not changed since last rendering.
          */
         private GridCoverage coverage;
 
+        /**
+         * Whether the value of {@link #coverage} changed since the last 
rendering.
+         * It may happen if {@link #resource} is non-null, contains pyramided 
data
+         * and the pyramid level used by this rendering is different than the 
pyramid
+         * level used in previous rendering.
+         */
+        private boolean coverageChanged;
+
         @Deprecated private final GridExtent sliceExtent;
 
         /**
@@ -809,6 +817,7 @@ public class CoverageCanvas extends MapCanvasAWT {
                 if (resource != null) {
                     data.coverageLoader = 
MultiResolutionImageLoader.getInstance(resource, data.coverageLoader);
                     coverage = data.ensureCoverageLoaded(objectiveToDisplay, 
objectivePOI);
+                    coverageChanged = (coverage != null);
                 }
                 if (data.ensureImageLoaded(coverage, sliceExtent)) {
                     recoloredImage = null;
@@ -910,7 +919,7 @@ public class CoverageCanvas extends MapCanvasAWT {
     }
 
     /**
-     * Invoked after a paint event for caching rendering data.
+     * Invoked in JavaFX thread after a paint event for caching rendering data.
      * If the resampled image changed, all previously cached images are 
discarded.
      */
     private void cacheRenderingData(final Worker worker) {
@@ -918,6 +927,14 @@ public class CoverageCanvas extends MapCanvasAWT {
             trace("cacheRenderingData(…): new visual coverage:%n%s", 
worker.data);
         }
         data = worker.data;
+        /*
+         * Cache the recolored image. It does not consume lot of memory 
(mostly the memory used by the color model).
+         * The recolored image are based on the original data, so the cache 
does not vary with zoom level except if
+         * a change of zoom level caused a change of the image read from the 
data store.
+         */
+        if (worker.coverageChanged) {
+            derivedImages.clear();
+        }
         derivedImages.put(data.selectedDerivative, worker.recoloredImage);
         resampledImage = worker.resampledImage;
         if (TRACE) {
@@ -963,13 +980,13 @@ public class CoverageCanvas extends MapCanvasAWT {
             errorOccurred(report.getThrown());
         }
         /*
-         * If the coverage changed, notify user. Note that a null coverage 
means "no change".
+         * If the coverage changed, notify user. The coverage may have changed 
because of a change
+         * in the pyramid level when the underlying data store has pyramided 
data.
          */
-        if (!isCoverageAdjusting) {
-            final GridCoverage coverage = worker.coverage;
-            if (coverage != null) try {
+        if (worker.coverageChanged) {
+            if (!isCoverageAdjusting) try {
                 isCoverageAdjusting = true;
-                setCoverage(coverage);
+                setCoverage(worker.coverage);
             } finally {
                 isCoverageAdjusting = false;
             }

Reply via email to