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


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new 8c9c31766b Fix: calculation of contributions in `ImageOverlay` was too 
large. Edit documentation by saying that each image is fully opaque.
8c9c31766b is described below

commit 8c9c31766bcde90d64a7372137b59c6e1a66c78d
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Sat Dec 21 21:54:54 2024 +0100

    Fix: calculation of contributions in `ImageOverlay` was too large.
    Edit documentation by saying that each image is fully opaque.
---
 .../main/org/apache/sis/image/ImageOverlay.java          | 16 ++++++++--------
 .../main/org/apache/sis/image/ImageProcessor.java        | 14 +++++++++-----
 2 files changed, 17 insertions(+), 13 deletions(-)

diff --git 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/ImageOverlay.java
 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/ImageOverlay.java
index c7f13c83fe..4bb06de124 100644
--- 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/ImageOverlay.java
+++ 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/ImageOverlay.java
@@ -48,7 +48,9 @@ import org.apache.sis.coverage.privy.ImageUtilities;
  * An overlay of an arbitrary number of images. All images have the same pixel 
coordinate system,
  * but potentially different bounding boxes, tile sizes and tile indices. 
Source images are drawn
  * in reverse order: the last source image is drawn first, and the first 
source image is drawn last
- * on top of all other images. The requirements are:
+ * on top of all other images. All images are considered fully opaque, 
including the alpha channel
+ * which is handled as an ordinary band.
+ * The requirements are:
  *
  * <ul>
  *   <li>All source images shall have the same pixel coordinate systems (but 
not necessarily the same tile matrix).</li>
@@ -120,12 +122,11 @@ final class ImageOverlay extends MultiSourceImage {
             final Area area = new Area(ImageUtilities.getValidArea(source));
             if (aoi != null) area.intersect(aoi);
             if (area.isEmpty()) continue;         // Source does not intersect 
the specified bounds.
+            final Area contrib = new Area(area);
+            contrib.subtract(validArea);
+            if (contrib.isEmpty()) continue;      // The new source is fully 
masked by previous sources.
             validArea.add(area);
-            if (count != 0) {
-                area.subtract(contributions[count - 1]);
-                if (area.isEmpty()) continue;     // The new source is fully 
masked by previous sources.
-            }
-            contributions[count] = area;
+            contributions[count] = contrib;
             sources[count++] = source;
             /*
              * The default sample model is selected after filtering because 
the choice of a sample model
@@ -160,8 +161,7 @@ final class ImageOverlay extends MultiSourceImage {
         sources = ArraysExt.resize(sources, count);
         contributions = ArraysExt.resize(contributions, count);
         /*
-         * Last area is now the union of the Area Of iInterest (AOI) of all 
source images.
-         * The size of the destination image is this valid area, unless 
specified otherwise.
+         * The valid area defines the size of the combined image, unless 
specified otherwise.
          * If the tile size is not a divisor of the image size, try to find a 
better tile size.
          */
         if (bounds == null) {
diff --git 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/ImageProcessor.java
 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/ImageProcessor.java
index db2faaefa2..59e1ea80dd 100644
--- 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/ImageProcessor.java
+++ 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/ImageProcessor.java
@@ -969,13 +969,17 @@ public class ImageProcessor implements Cloneable {
      * Creates a new image overlay or returns one of the given sources if 
equivalent.
      * All source images shall have the same pixel coordinate system, but they 
may have different bounding boxes,
      * tile sizes and tile indices. Images are drawn in reverse order: the 
last source image is drawn first, and
-     * the first source image is drawn last on top of all other images. The 
returned image may have less sources
-     * than the specified ones if this method determines that some sources 
will never be drawn.
-     * This method may return {@code sources[0]} directly.
+     * the first source image is drawn last on top of all other images. All 
images are considered fully opaque,
+     * including the alpha channel which is handled as an ordinary band.
      *
-     * <p>All source images shall have the same number of bands (but not 
necessarily the same sample model).
+     * <p>The returned image may have less sources than the ones given in 
argument if this method determines
+     * that some sources will never be drawn (i.e., are fully hidden behind 
the first images).
+     * If only one source appears to be effectively used, this method returns 
that image directly.</p>
+     *
+     * <h4>Preconditions</h4>
+     * All source images shall have the same number of bands (but not 
necessarily the same sample model).
      * All source images should have equivalent color model, otherwise color 
consistency is not guaranteed.
-     * At least one image shall intersect the given bounds.</p>
+     * At least one image shall intersect the given bounds.
      *
      * <h4>Properties used</h4>
      * This operation uses the following properties in addition to method 
parameters:

Reply via email to