You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2023/04/18 18:28:09 UTC

[sis] branch geoapi-4.0 updated (f444cac9c0 -> 6161022503)

This is an automated email from the ASF dual-hosted git repository.

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


    from f444cac9c0 Keep a reference to the `GridCoverageProcessor` to use for selecting bands in a `MemoryGridResource`. The coverage processor determines the color model to use when a band subset is requested.
     new 54302eaec1 Add a convenience method for building a `GridGeometry` from only an envelope.
     new 2c9e4aa654 Reduce the use of <div class="note"> sections, replaced by headings. This commit replaces only a small fraction of them. More will be done progressively in other commits.
     new 5283b04479 Typo fix: expansive → expensive
     new 6161022503 Fix some references in GeoTIFF documentation.

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../java/org/apache/sis/gui/coverage/GridView.java | 25 +++++++-------
 .../sis/gui/coverage/ImagePropertyExplorer.java    |  8 ++---
 .../org/apache/sis/gui/dataset/ExpandableList.java |  5 +--
 .../org/apache/sis/gui/map/GestureFollower.java    |  4 +--
 .../java/org/apache/sis/gui/map/StatusBar.java     | 12 +++----
 .../gui/referencing/RecentReferenceSystems.java    | 19 ++++++-----
 .../org/apache/sis/internal/setup/Inflater.java    |  6 ++--
 .../apache/sis/coverage/grid/DomainLinearizer.java |  6 ++--
 .../apache/sis/coverage/grid/GridCoverage2D.java   |  5 ++-
 .../sis/coverage/grid/GridCoverageBuilder.java     | 14 ++++----
 .../apache/sis/coverage/grid/GridDerivation.java   | 33 +++++++++---------
 .../org/apache/sis/coverage/grid/GridExtent.java   | 14 ++++----
 .../org/apache/sis/coverage/grid/GridGeometry.java | 39 +++++++++++++++++-----
 .../apache/sis/coverage/grid/GridRoundingMode.java |  8 ++---
 .../apache/sis/coverage/grid/PixelTranslation.java | 24 ++++++-------
 .../sis/coverage/grid/ResampledGridCoverage.java   |  6 ++--
 .../java/org/apache/sis/image/Visualization.java   |  2 +-
 .../sis/internal/feature/GeometryWithCRS.java      |  2 +-
 .../sis/internal/feature/j2d/PointWrapper.java     |  4 +--
 .../sis/internal/feature/j2d/ShapeWrapper.java     | 12 +++----
 .../apache/sis/internal/feature/j2d/Wrapper.java   |  6 ++--
 .../sis/internal/feature/jts/FilteringContext.java |  2 +-
 .../org/apache/sis/internal/feature/jts/JTS.java   |  4 +--
 .../sis/coverage/grid/GridDerivationTest.java      |  6 ++--
 .../apache/sis/coverage/grid/GridGeometryTest.java |  5 +++
 .../org/apache/sis/internal/metadata/Merger.java   |  6 ++--
 .../apache/sis/metadata/iso/extent/Extents.java    |  2 +-
 .../main/java/org/apache/sis/portrayal/Canvas.java | 13 ++++----
 .../apache/sis/portrayal/TransformChangeEvent.java |  2 +-
 .../sis/referencing/cs/CoordinateSystems.java      |  2 +-
 .../transform/SpecializableTransform.java          |  2 +-
 .../main/java/org/apache/sis/math/Fraction.java    | 16 ++++-----
 .../internal/storage/inflater/CopyFromBytes.java   | 12 +++----
 .../apache/sis/internal/storage/inflater/LZW.java  | 12 +++----
 .../apache/sis/storage/geotiff/GeoTiffStore.java   | 14 ++++----
 .../sis/storage/geotiff/GridGeometryBuilder.java   | 14 ++++----
 .../sis/storage/geotiff/ImageFileDirectory.java    |  4 +--
 .../sis/storage/geotiff/ImageMetadataBuilder.java  |  6 ++--
 .../java/org/apache/sis/storage/geotiff/Tags.java  |  2 +-
 .../org/apache/sis/internal/netcdf/Convention.java | 32 +++++++++---------
 .../org/apache/sis/internal/netcdf/Decoder.java    |  6 ++--
 .../apache/sis/internal/netcdf/GridMapping.java    |  5 +--
 .../org/apache/sis/internal/netcdf/Linearizer.java |  6 ++--
 .../org/apache/sis/internal/netcdf/Variable.java   | 24 ++++++-------
 .../apache/sis/storage/netcdf/AttributeNames.java  | 24 ++++++-------
 .../apache/sis/storage/netcdf/MetadataReader.java  |  3 +-
 .../sis/internal/sql/feature/TableAnalyzer.java    |  5 +--
 .../apache/sis/internal/stream/DeferredStream.java |  6 ++--
 .../sis/internal/storage/MetadataBuilder.java      | 18 +++++-----
 .../sis/internal/storage/ResourceOnFileSystem.java | 14 ++++----
 .../apache/sis/internal/storage/StoreMetadata.java | 18 +++++-----
 .../sis/internal/storage/TiledGridCoverage.java    |  6 ++--
 .../apache/sis/internal/storage/io/Markable.java   | 10 +++---
 .../org/apache/sis/internal/storage/io/Region.java | 12 +++----
 .../internal/storage/io/RewindableLineReader.java  |  5 +--
 .../org/apache/sis/internal/storage/wkt/Store.java |  4 +--
 .../java/org/apache/sis/storage/CoverageQuery.java |  3 +-
 .../main/java/org/apache/sis/storage/DataSet.java  |  6 ++--
 .../sis/storage/DataStoreContentException.java     |  4 +--
 .../org/apache/sis/storage/DataStoreProvider.java  | 21 +++++-------
 .../org/apache/sis/storage/DataStoreRegistry.java  |  6 ++--
 .../main/java/org/apache/sis/storage/Resource.java |  5 ++-
 .../org/apache/sis/storage/StorageConnector.java   |  4 +--
 .../org/apache/sis/storage/WritableAggregate.java  |  5 ++-
 .../org/apache/sis/storage/WritableFeatureSet.java |  6 ++--
 .../storage/aggregate/AggregatedFeatureSet.java    |  9 ++---
 .../storage/gpx/GroupAsPolylineOperation.java      |  3 +-
 .../storage/xml/stream/FormattedWriter.java        |  6 ++--
 .../storage/xml/stream/StaxStreamReader.java       | 12 +++----
 69 files changed, 345 insertions(+), 321 deletions(-)


[sis] 04/04: Fix some references in GeoTIFF documentation.

Posted by de...@apache.org.
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 6161022503c28d6440e99a0af2af340ae3df9228
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Tue Apr 18 20:25:33 2023 +0200

    Fix some references in GeoTIFF documentation.
---
 .../apache/sis/storage/geotiff/GridGeometryBuilder.java    | 14 +++++++-------
 .../org/apache/sis/storage/geotiff/ImageFileDirectory.java |  4 ++--
 .../src/main/java/org/apache/sis/storage/geotiff/Tags.java |  2 +-
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GridGeometryBuilder.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GridGeometryBuilder.java
index 362b05333a..348afdfb27 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GridGeometryBuilder.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GridGeometryBuilder.java
@@ -105,8 +105,8 @@ final class GridGeometryBuilder extends GeoKeysLoader {
      *
      * <ul>
      *   <li>By a combination of a single {@link #modelTiePoints} with the 3 values given in
-     *       {@link Tags#ModelPixelScaleTag} as documented in the Javadoc of that tag.</li>
-     *   <li>By a {@link Tags#ModelTransformation} giving all coefficients of the 4×4 matrix}.
+     *       {@code ModelPixelScaleTag} as documented in the Javadoc of that tag.</li>
+     *   <li>By a {@code ModelTransformationTag} giving all coefficients of the 4×4 matrix}.
      *       Note that the third row and the third column have all their value set to 0 if the
      *       space model (or the coordinate reference system) should be two-dimensional.</li>
      *   <li>By building a non-linear transformation from all {@link #modelTiePoints}.
@@ -118,8 +118,8 @@ final class GridGeometryBuilder extends GeoKeysLoader {
     private MatrixSIS affine;
 
     /**
-     * {@code true} if {@link #affine} has been specified by a complete matrix ({@link Tags#ModelTransformation}),
-     * or {@code false} if it has been specified by the scale factors only ({@link Tags#ModelPixelScaleTag}).
+     * {@code true} if {@link #affine} has been specified by a complete matrix ({@code ModelTransformationTag}),
+     * or {@code false} if it has been specified by the scale factors only ({@code ModelPixelScaleTag}).
      */
     private boolean completeMatrixSpecified;
 
@@ -186,11 +186,11 @@ final class GridGeometryBuilder extends GeoKeysLoader {
     /**
      * If {@link #affine} has been specified with only the scale factor, computes the translation terms now.
      * If needed, this method computes the translation terms from the (usually singleton) tie point.
-     * This happen when the GeoTIFF file has a {@link Tags#ModelPixelScaleTag} and {@link Tags#ModelTiePoints}.
+     * This happen when the GeoTIFF file has a {@code ModelPixelScaleTag} and {@code ModelTiePointTag}.
      * The latter should have a single record.
      *
-     * @return {@code true} on success (including nothing to compute), or {@code false} if the computation attempt
-     *         failed because of missing {@link Tags#ModelTiePoints}.
+     * @return {@code true} on success (including nothing to compute), or
+     *         {@code false} if the computation attempt failed because of missing {@code ModelTiePointTag}.
      *
      * @see ImageFileDirectory#validateMandatoryTags()
      */
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java
index ae69f06723..be107010df 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java
@@ -872,7 +872,7 @@ final class ImageFileDirectory extends DataCube {
              * The last matrix row (i.e. the last 4 values) should be [0 0 0 1].
              * The row before should be [0 0 0 0] if the conversion is two-dimensional.
              * This block does not reduce the number of dimensions from 3 to 2.
-             * Only one of `ModelPixelScaleTag` and `ModelTransformation` should be used.
+             * Only one of `ModelPixelScaleTag` and `ModelTransformationTag` should be used.
              */
             case (short) TAG_MODEL_TRANSFORMATION: {
                 final Vector m = type.readVector(input(), count);
@@ -899,7 +899,7 @@ final class ImageFileDirectory extends DataCube {
              * └                       ┘
              *
              * This block sets the translation column to NaN, meaning that it will need to be computed from
-             * the tie point. Only one of `ModelPixelScaleTag` and `ModelTransformation` should be used.
+             * the tie point. Only one of `ModelPixelScaleTag` and `ModelTransformationTag` should be used.
              */
             case (short) TAG_MODEL_PIXEL_SCALE: {
                 final Vector m = type.readVector(input(), count);
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/Tags.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/Tags.java
index 20a488f102..e354958278 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/Tags.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/Tags.java
@@ -77,7 +77,7 @@ final class Tags {
      * The sets that are most likely to be used (for the kind of data handled by SIS) should be first.
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
-    private static Supplier<TIFFTagSet>[] TAG_SETS = new Supplier[] {
+    private static final Supplier<TIFFTagSet>[] TAG_SETS = new Supplier[] {
         javax.imageio.plugins.tiff.BaselineTIFFTagSet::getInstance,
         javax.imageio.plugins.tiff.GeoTIFFTagSet::getInstance,
         javax.imageio.plugins.tiff.ExifGPSTagSet::getInstance,


[sis] 03/04: Typo fix: expansive → expensive

Posted by de...@apache.org.
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 5283b04479ef78eff70c08ba96e85817f0c0e0c0
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Tue Apr 18 20:24:33 2023 +0200

    Typo fix: expansive → expensive
---
 .../java/org/apache/sis/internal/setup/Inflater.java     |  6 +++---
 .../main/java/org/apache/sis/image/Visualization.java    |  2 +-
 .../org/apache/sis/internal/feature/GeometryWithCRS.java |  2 +-
 .../apache/sis/internal/feature/j2d/PointWrapper.java    |  4 ++--
 .../apache/sis/internal/feature/j2d/ShapeWrapper.java    | 12 ++++++------
 .../org/apache/sis/internal/feature/j2d/Wrapper.java     |  6 +++---
 .../sis/internal/feature/jts/FilteringContext.java       |  2 +-
 .../java/org/apache/sis/internal/feature/jts/JTS.java    |  4 ++--
 .../java/org/apache/sis/internal/metadata/Merger.java    |  6 ++++--
 .../java/org/apache/sis/metadata/iso/extent/Extents.java |  2 +-
 .../org/apache/sis/portrayal/TransformChangeEvent.java   |  2 +-
 .../org/apache/sis/referencing/cs/CoordinateSystems.java |  2 +-
 .../operation/transform/SpecializableTransform.java      |  2 +-
 .../src/main/java/org/apache/sis/math/Fraction.java      | 16 ++++++++--------
 14 files changed, 35 insertions(+), 33 deletions(-)

diff --git a/application/sis-javafx/src/main/java/org/apache/sis/internal/setup/Inflater.java b/application/sis-javafx/src/main/java/org/apache/sis/internal/setup/Inflater.java
index 042451f766..88e74a9ba9 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/internal/setup/Inflater.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/internal/setup/Inflater.java
@@ -31,9 +31,9 @@ import javax.swing.JProgressBar;
 /**
  * Decompress the ZIP file for JavaFX in a background thread.
  *
- * <p><b>Design note:</b> we do not use {@link javax.swing.SwingWorker} because that classes
- * is more expansive than what we need. For example, it creates a pool of 10 threads while we
- * need only one.</p>
+ * <h2>Design note</h2>
+ * We do not use {@link javax.swing.SwingWorker} because that classes is more expensive
+ * than what we need. For example, it creates a pool of 10 threads while we need only one.
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 1.1
diff --git a/core/sis-feature/src/main/java/org/apache/sis/image/Visualization.java b/core/sis-feature/src/main/java/org/apache/sis/image/Visualization.java
index 7305d66d7e..aedb0fcdfb 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/image/Visualization.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/image/Visualization.java
@@ -526,7 +526,7 @@ final class Visualization extends ResampledImage {
     @Override
     protected Raster computeTile(final int tileX, final int tileY, WritableRaster tile) throws TransformException {
         if (converters == null) try {
-            // Most expansive operation (resampling + conversion).
+            // Most expensive operation (resampling + conversion).
             return super.computeTile(tileX, tileY, tile);
         } catch (BackingStoreException e) {
             throw e.unwrapOrRethrow(TransformException.class);
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/GeometryWithCRS.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/GeometryWithCRS.java
index 4216eae572..157c5e1c1e 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/GeometryWithCRS.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/GeometryWithCRS.java
@@ -78,7 +78,7 @@ public abstract class GeometryWithCRS<G> extends GeometryWrapper<G> {
     public final boolean isSameCRS(final GeometryWrapper<G> other) {
         /*
          * Identity comparison is often sufficient since all geometries typically share the same CRS.
-         * If they are not the same instance, a more expansive `equalsIgnoreMetadata(…)` method here
+         * If they are not the same instance, a more expensive `equalsIgnoreMetadata(…)` method here
          * would probably duplicate the work done later by the `transform(Geometry, …)` method.
          */
         return crs == ((GeometryWithCRS<G>) other).crs;
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/PointWrapper.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/PointWrapper.java
index 37a8fd710c..7a8369092d 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/PointWrapper.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/PointWrapper.java
@@ -221,7 +221,7 @@ final class PointWrapper extends GeometryWithCRS<Shape> {
     /**
      * Estimates whether the wrapped geometry is contained by the geometry of the given wrapper.
      * This method may conservatively returns {@code false} if an accurate computation would be
-     * too expansive.
+     * too expensive.
      *
      * @param  wrapper  instance of {@link Wrapper}.
      */
@@ -232,7 +232,7 @@ final class PointWrapper extends GeometryWithCRS<Shape> {
     /**
      * Estimates whether the wrapped geometry intersects the geometry of the given wrapper.
      * This method may conservatively returns {@code true} if an accurate computation would
-     * be too expansive.
+     * be too expensive.
      *
      * @param  wrapper  instance of {@link Wrapper} or {@link PointWrapper}.
      * @throws ClassCastException if the given object is not a recognized wrapper.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/ShapeWrapper.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/ShapeWrapper.java
index e08a665eef..57a0ca32fb 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/ShapeWrapper.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/ShapeWrapper.java
@@ -66,7 +66,7 @@ abstract class ShapeWrapper extends AbstractShape implements Serializable {
     /**
      * Returns a rectangle that completely encloses this {@code Shape}.
      * This is not necessarily the smallest bounding box if an accurate
-     * computation would be too expansive.
+     * computation would be too expensive.
      *
      * @return a rectangle that completely encloses this {@code Shape}.
      */
@@ -78,7 +78,7 @@ abstract class ShapeWrapper extends AbstractShape implements Serializable {
     /**
      * Returns a rectangle that completely encloses this {@code Shape}.
      * This is not necessarily the smallest bounding box if an accurate
-     * computation would be too expansive.
+     * computation would be too expensive.
      *
      * @return a rectangle that completely encloses this {@code Shape}.
      */
@@ -112,7 +112,7 @@ abstract class ShapeWrapper extends AbstractShape implements Serializable {
 
     /**
      * Tests if the interior of this {@code Shape} intersects the interior of a specified rectangular area.
-     * This method may conservatively return {@code true} if an accurate computation would be too expansive.
+     * This method may conservatively return {@code true} if an accurate computation would be too expensive.
      *
      * @param  x  minimal <var>x</var> coordinate of the rectangle.
      * @param  y  minimal <var>y</var> coordinate of the rectangle.
@@ -127,7 +127,7 @@ abstract class ShapeWrapper extends AbstractShape implements Serializable {
 
     /**
      * Tests if the interior of this {@code Shape} intersects the interior of a specified rectangular area.
-     * This method may conservatively return {@code true} if an accurate computation would be too expansive.
+     * This method may conservatively return {@code true} if an accurate computation would be too expensive.
      *
      * @param  r  the rectangular area to test.
      * @return whether the specified rectangle intersects the interior of this shape.
@@ -139,7 +139,7 @@ abstract class ShapeWrapper extends AbstractShape implements Serializable {
 
     /**
      * Tests if the interior of this {@code Shape} entirely contains the interior of a specified rectangular area.
-     * This method may conservatively return {@code false} if an accurate computation would be too expansive.
+     * This method may conservatively return {@code false} if an accurate computation would be too expensive.
      *
      * @param  x  minimal <var>x</var> coordinate of the rectangle.
      * @param  y  minimal <var>y</var> coordinate of the rectangle.
@@ -154,7 +154,7 @@ abstract class ShapeWrapper extends AbstractShape implements Serializable {
 
     /**
      * Tests if the interior of this {@code Shape} entirely contains the interior of a specified rectangular area.
-     * This method may conservatively return {@code false} if an accurate computation would be too expansive.
+     * This method may conservatively return {@code false} if an accurate computation would be too expensive.
      *
      * @param  r  the rectangular area to test.
      * @return whether the specified rectangle entirely contains the interior of this shape.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Wrapper.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Wrapper.java
index 42014eb964..8b545d752e 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Wrapper.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/j2d/Wrapper.java
@@ -340,7 +340,7 @@ add:    for (;;) {
     /**
      * Estimates whether the wrapped geometry is contained by the geometry of the given wrapper.
      * This method may conservatively returns {@code false} if an accurate computation would be
-     * too expansive.
+     * too expensive.
      *
      * @param  wrapper  instance of {@link Wrapper}.
      */
@@ -355,7 +355,7 @@ add:    for (;;) {
     /**
      * Estimates whether the wrapped geometry contains the geometry of the given wrapper.
      * This method may conservatively returns {@code false} if an accurate computation would
-     * be too expansive.
+     * be too expensive.
      *
      * @param  wrapper  instance of {@link Wrapper} or {@link PointWrapper}.
      * @throws ClassCastException if the given object is not a recognized wrapper.
@@ -371,7 +371,7 @@ add:    for (;;) {
     /**
      * Estimates whether the wrapped geometry intersects the geometry of the given wrapper.
      * This method may conservatively returns {@code true} if an accurate computation would
-     * be too expansive.
+     * be too expensive.
      *
      * @param  wrapper  instance of {@link Wrapper} or {@link PointWrapper}.
      * @throws ClassCastException if the given object is not a recognized wrapper.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/FilteringContext.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/FilteringContext.java
index 831396e8f5..8588980441 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/FilteringContext.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/FilteringContext.java
@@ -72,7 +72,7 @@ final class FilteringContext {
         /*
          * Unconditionally dispose all writers after 2 minutes, no matter if some threads
          * still need writers or not. The intent is to avoid retention of large buffers.
-         * WKB writer are not so expansive to creates, so recreating them every 2 minutes
+         * WKB writer are not so expensive to creates, so recreating them every 2 minutes
          * should not have a visible impact on performance.
          */
         if (WRITERS.add(writer) && CLEANER_REGISTERED.compareAndSet(false, true)) {
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/JTS.java b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/JTS.java
index 392e087ef6..75a8083777 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/JTS.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/feature/jts/JTS.java
@@ -71,7 +71,7 @@ public final class JTS extends Static {
     /**
      * Returns {@code true} if the two geometries use the same CRS, based on very cheap comparison.
      * A value of {@code false} does not necessarily means that the CRS are different, but it means
-     * that a more expansive comparison is required. If CRS are specified by SRID codes, then this
+     * that a more expensive comparison is required. If CRS are specified by SRID codes, then this
      * method assumes that the two SRID codes are defined by the same authority (e.g. EPSG).
      *
      * <p>If both CRS are undefined (null), then they are considered the same.</p>
@@ -88,7 +88,7 @@ public final class JTS extends Static {
         }
         /*
          * Identity comparison is often sufficient since all geometries typically share the same CRS.
-         * If they are not the same instance, a more expansive `equalsIgnoreMetadata(…)` method here
+         * If they are not the same instance, a more expensive `equalsIgnoreMetadata(…)` method here
          * would probably duplicate the work done later by the `transform(Geometry, …)` method.
          */
         Object c1 = first.getUserData();
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java
index 772a53b9d9..a15630c809 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java
@@ -248,8 +248,10 @@ distribute:                 while (it.hasNext()) {
                         if (old instanceof Collection<?>) {
                             final Collection<?> oldList = (Collection<?>) old;
                             if (oldList.size() <= targetList.size()) {
-                                // Above was only a cheap check based on collection size only.
-                                // Below is a more expansive check if assertions are enabled.
+                                /*
+                                 * Above was only a cheap check based on collection size only.
+                                 * Below is a more expensive check if assertions are enabled.
+                                 */
                                 assert targetList.containsAll(oldList) : propertyName;
                                 continue;
                             }
diff --git a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
index 764e3c6fe0..12bf524a87 100644
--- a/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
+++ b/core/sis-metadata/src/main/java/org/apache/sis/metadata/iso/extent/Extents.java
@@ -208,7 +208,7 @@ public final class Extents extends Static {
     /**
      * Returns a single geographic bounding box from the specified extent.
      * This method tries to find the bounding box in the cheapest way
-     * before to fallback on more expansive computations:
+     * before to fallback on more expensive computations:
      *
      * <ol>
      *   <li>First, this method searches geographic elements that are instance of {@link GeographicBoundingBox}.<ul>
diff --git a/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/TransformChangeEvent.java b/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/TransformChangeEvent.java
index e71e2e5429..a69ff3591b 100644
--- a/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/TransformChangeEvent.java
+++ b/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/TransformChangeEvent.java
@@ -104,7 +104,7 @@ public class TransformChangeEvent extends PropertyChangeEvent {
          * A relative interim change has been applied but is not yet reflected in the "objective to display" transform.
          * This kind of change is not fired by {@link PlanarCanvas} but may be fired by subclasses such as
          * {@link org.apache.sis.gui.map.MapCanvas}. That class provides immediate feedback to users
-         * with a temporary visual change before to perform more expansive rendering in background.
+         * with a temporary visual change before to perform more expensive rendering in background.
          */
         INTERIM;
 
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java
index 871745bda0..f734272ca4 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java
@@ -366,7 +366,7 @@ next:   for (final CoordinateSystem cs : targets) {
         ArgumentChecks.ensureNonNull("sourceCS", sourceCS);
         ArgumentChecks.ensureNonNull("targetCS", targetCS);
         if (!Classes.implementSameInterfaces(sourceCS.getClass(), targetCS.getClass(), CoordinateSystem.class)) {
-            // Above line was a relatively cheap test. Try the more expansive test below only if necessary.
+            // Above line was a relatively cheap test. Try the more expensive test below only if necessary.
             if (!hasAllTargetTypes(sourceCS, targetCS)) {
                 throw new IllegalArgumentException(Resources.format(Resources.Keys.IncompatibleCoordinateSystemTypes));
             }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/SpecializableTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/SpecializableTransform.java
index b15a47c206..818d59c19a 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/SpecializableTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/SpecializableTransform.java
@@ -336,7 +336,7 @@ class SpecializableTransform extends AbstractMathTransform implements Serializab
                 do {                                        // Count how many points will use that transform.
                     src.offset += srcInc;
                     if (--numPts <= 0) break;
-                    domain = locate(src);                   // More expansive check than the case where domain is non-null.
+                    domain = locate(src);                   // More expensive check than the case where domain is non-null.
                 } while (domain == null);
             } else {
                 RTreeNode next = domain;
diff --git a/core/sis-utility/src/main/java/org/apache/sis/math/Fraction.java b/core/sis-utility/src/main/java/org/apache/sis/math/Fraction.java
index 5805c1ac5d..3b1ded1fb7 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/math/Fraction.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/math/Fraction.java
@@ -93,17 +93,17 @@ public final class Fraction extends Number implements Comparable<Fraction>, Seri
      * such as {@link #doubleValue()} is equal to the given value in the sense of {@link Double#equals(Object)}:
      * infinities, positive and negative zeros are preserved, but various NaN values are collapsed to a single NaN value.
      *
-     * <div class="note"><b>Design note:</b>
-     * this method does not return approximated values because it is difficult to choose which fraction is best.
+     * <p>This method accepts only values between {@value Integer#MIN_VALUE} and {@value Integer#MAX_VALUE} inclusive,
+     * i.e. values in the range of 32-bits integers. If the given value has fraction digits, then the validity range
+     * will be smaller depending on the {@linkplain #denominator} required for representing that value.</p>
+     *
+     * <h4>Design note</h4>
+     * This method does not return approximated values because it is difficult to choose which fraction is best.
      * For example, choosing an approximated fraction for π value is quite arbitrary, and searching the fraction
-     * closer than any other fraction representable by this class is computationally expansive.
+     * closer than any other fraction representable by this class is computationally expensive.
      * Even with common fractions, the algorithm currently implemented in this class can detect that 1.6666666666666667
      * {@linkplain Double#equals(Object) is equal to} 5⁄3 but cannot detect easily that 1.66666666666666 (same number
-     * with two decimal digits dropped) is close to 5⁄3.</div>
-     *
-     * This method accepts only values between {@value Integer#MIN_VALUE} and {@value Integer#MAX_VALUE} inclusive,
-     * i.e. values in the range of 32-bits integers. If the given value has fraction digits, then the validity range
-     * will be smaller depending on the {@linkplain #denominator} required for representing that value.
+     * with two decimal digits dropped) is close to 5⁄3.
      *
      * @param  value  the double-precision value to convert to a fraction.
      * @return a fraction such as {@link #doubleValue()} is equal to the given value.


[sis] 01/04: Add a convenience method for building a `GridGeometry` from only an envelope.

Posted by de...@apache.org.
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 54302eaec10eb83224417ff1d037f47b33b7f406
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Tue Apr 18 17:17:58 2023 +0200

    Add a convenience method for building a `GridGeometry` from only an envelope.
---
 .../sis/coverage/grid/GridCoverageBuilder.java      |  2 +-
 .../org/apache/sis/coverage/grid/GridGeometry.java  | 21 +++++++++++++++++++++
 .../sis/coverage/grid/GridDerivationTest.java       |  6 +++---
 .../apache/sis/coverage/grid/GridGeometryTest.java  |  5 +++++
 .../java/org/apache/sis/storage/CoverageQuery.java  |  3 +--
 5 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageBuilder.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageBuilder.java
index 4119687eac..c495a84f89 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageBuilder.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageBuilder.java
@@ -238,7 +238,7 @@ public class GridCoverageBuilder {
      * @see GridGeometry#GridGeometry(GridExtent, Envelope, GridOrientation)
      */
     public GridCoverageBuilder setDomain(final Envelope domain) {
-        return setDomain(domain == null ? null : new GridGeometry(null, domain, GridOrientation.HOMOTHETY));
+        return setDomain(domain == null ? null : new GridGeometry(domain));
     }
 
     /**
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java
index d2c22a6718..1f3f6207b8 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java
@@ -708,6 +708,27 @@ public class GridGeometry implements LenientComparable, Serializable {
         resolution  = null;
     }
 
+    /**
+     * Creates a grid geometry with only an envelope.
+     *
+     * @param  envelope  the envelope together with CRS of the "real world" coordinates.
+     * @throws IllegalArgumentException if the envelope has no CRS and only NaN coordinate values.
+     *
+     * @since 1.4
+     */
+    public GridGeometry(final Envelope envelope) {
+        ArgumentChecks.ensureNonNull("envelope", envelope);
+        this.envelope = ImmutableEnvelope.castOrCopy(envelope);
+        if (this.envelope.isAllNaN() && this.envelope.getCoordinateReferenceSystem() == null) {
+            throw new IllegalArgumentException(Errors.format(Errors.Keys.EmptyArgument_1, "envelope"));
+        }
+        extent      = null;
+        gridToCRS   = null;
+        cornerToCRS = null;
+        resolution  = null;
+        nonLinears  = 0;
+    }
+
     /**
      * Creates a new grid geometry from the given components.
      * This constructor performs no verification (unless assertions are enabled).
diff --git a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java
index 9d1f538e96..407836eca7 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java
@@ -873,8 +873,8 @@ public final class GridDerivationTest extends TestCase {
         Envelope2D   domain   = new Envelope2D(HardCodedCRS.WGS84, 10, 20, 110, 70);
         Envelope2D   request  = new Envelope2D(HardCodedCRS.WGS84, -5, 25, 100, 90);
         Envelope2D   expected = new Envelope2D(HardCodedCRS.WGS84, 10, 25,  85, 65);
-        GridGeometry grid1    = new GridGeometry(null, domain,  GridOrientation.HOMOTHETY);
-        GridGeometry grid2    = new GridGeometry(null, request, GridOrientation.HOMOTHETY);
+        GridGeometry grid1    = new GridGeometry(domain);
+        GridGeometry grid2    = new GridGeometry(request);
         GridGeometry subgrid  = grid1.derive().subgrid(grid2).build();
         assertTrue(subgrid.isEnvelopeOnly());
         assertEnvelopeEquals(expected, subgrid.getEnvelope(), STRICT);
@@ -884,7 +884,7 @@ public final class GridDerivationTest extends TestCase {
          */
         request.setCoordinateReferenceSystem(HardCodedCRS.WGS84_LATITUDE_FIRST);
         request.setRect(25, -5, 90, 100);
-        grid2   = new GridGeometry(null, request, GridOrientation.HOMOTHETY);
+        grid2   = new GridGeometry(request);
         subgrid = grid1.derive().subgrid(grid2).build();
         assertSame(HardCodedCRS.WGS84, subgrid.getCoordinateReferenceSystem());
         assertTrue(subgrid.isEnvelopeOnly());
diff --git a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridGeometryTest.java b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridGeometryTest.java
index a4149ed31f..ea7759a1f0 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridGeometryTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridGeometryTest.java
@@ -381,6 +381,11 @@ public final class GridGeometryTest extends TestCase {
          * The use of `DISPLAY` mode in this particular case should be equivalent ro `REFLECTION_Y`.
          */
         assertEquals(grid, new GridGeometry(extent, aoi, GridOrientation.DISPLAY));
+        /*
+         * Test when only an envelope is specified.
+         * The grid orientation should have no effect.
+         */
+        assertEnvelopeEquals(aoi, new GridGeometry(null, aoi, GridOrientation.DISPLAY).getEnvelope());
     }
 
     /**
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/CoverageQuery.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/CoverageQuery.java
index 190d2a2b8d..efa20e0e15 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/CoverageQuery.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/CoverageQuery.java
@@ -33,7 +33,6 @@ import org.apache.sis.measure.AngleFormat;
 import org.apache.sis.coverage.SampleDimension;
 import org.apache.sis.coverage.grid.GridCoverage;
 import org.apache.sis.coverage.grid.GridGeometry;
-import org.apache.sis.coverage.grid.GridRoundingMode;
 import org.apache.sis.coverage.grid.GridCoverageProcessor;
 import org.apache.sis.coverage.grid.DimensionalityReduction;
 import org.apache.sis.coverage.grid.IllegalGridGeometryException;
@@ -124,7 +123,7 @@ public class CoverageQuery extends Query implements Cloneable, Serializable {
     public void setSelection(final Envelope domain) {
         GridGeometry g = null;
         if (domain != null) {
-            g = new GridGeometry(null, null, domain, GridRoundingMode.NEAREST);
+            g = new GridGeometry(domain);
         }
         setSelection(g);
     }


[sis] 02/04: Reduce the use of
sections, replaced by headings. This commit replaces only a small fraction of them. More will be done progressively in other commits.

Posted by de...@apache.org.
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 2c9e4aa65442f443e326a980325b3d580c67ff95
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Tue Apr 18 20:18:21 2023 +0200

    Reduce the use of <div class="note"> sections, replaced by headings.
    This commit replaces only a small fraction of them.
    More will be done progressively in other commits.
---
 .../java/org/apache/sis/gui/coverage/GridView.java | 25 ++++++++--------
 .../sis/gui/coverage/ImagePropertyExplorer.java    |  8 +++---
 .../org/apache/sis/gui/dataset/ExpandableList.java |  5 ++--
 .../org/apache/sis/gui/map/GestureFollower.java    |  4 +--
 .../java/org/apache/sis/gui/map/StatusBar.java     | 12 ++++----
 .../gui/referencing/RecentReferenceSystems.java    | 19 +++++++------
 .../apache/sis/coverage/grid/DomainLinearizer.java |  6 ++--
 .../apache/sis/coverage/grid/GridCoverage2D.java   |  5 ++--
 .../sis/coverage/grid/GridCoverageBuilder.java     | 12 ++++----
 .../apache/sis/coverage/grid/GridDerivation.java   | 33 +++++++++++-----------
 .../org/apache/sis/coverage/grid/GridExtent.java   | 14 ++++-----
 .../org/apache/sis/coverage/grid/GridGeometry.java | 18 ++++++------
 .../apache/sis/coverage/grid/GridRoundingMode.java |  8 +++---
 .../apache/sis/coverage/grid/PixelTranslation.java | 24 ++++++++--------
 .../sis/coverage/grid/ResampledGridCoverage.java   |  6 ++--
 .../main/java/org/apache/sis/portrayal/Canvas.java | 13 +++++----
 .../internal/storage/inflater/CopyFromBytes.java   | 12 ++++----
 .../apache/sis/internal/storage/inflater/LZW.java  | 12 ++++----
 .../apache/sis/storage/geotiff/GeoTiffStore.java   | 14 ++++-----
 .../sis/storage/geotiff/ImageMetadataBuilder.java  |  6 ++--
 .../org/apache/sis/internal/netcdf/Convention.java | 32 ++++++++++-----------
 .../org/apache/sis/internal/netcdf/Decoder.java    |  6 ++--
 .../apache/sis/internal/netcdf/GridMapping.java    |  5 ++--
 .../org/apache/sis/internal/netcdf/Linearizer.java |  6 ++--
 .../org/apache/sis/internal/netcdf/Variable.java   | 24 ++++++++--------
 .../apache/sis/storage/netcdf/AttributeNames.java  | 24 ++++++++--------
 .../apache/sis/storage/netcdf/MetadataReader.java  |  3 +-
 .../sis/internal/sql/feature/TableAnalyzer.java    |  5 ++--
 .../apache/sis/internal/stream/DeferredStream.java |  6 ++--
 .../sis/internal/storage/MetadataBuilder.java      | 18 ++++++------
 .../sis/internal/storage/ResourceOnFileSystem.java | 14 ++++-----
 .../apache/sis/internal/storage/StoreMetadata.java | 18 ++++++------
 .../sis/internal/storage/TiledGridCoverage.java    |  6 ++--
 .../apache/sis/internal/storage/io/Markable.java   | 10 +++----
 .../org/apache/sis/internal/storage/io/Region.java | 12 ++++----
 .../internal/storage/io/RewindableLineReader.java  |  5 ++--
 .../org/apache/sis/internal/storage/wkt/Store.java |  4 +--
 .../main/java/org/apache/sis/storage/DataSet.java  |  6 ++--
 .../sis/storage/DataStoreContentException.java     |  4 +--
 .../org/apache/sis/storage/DataStoreProvider.java  | 21 ++++++--------
 .../org/apache/sis/storage/DataStoreRegistry.java  |  6 ++--
 .../main/java/org/apache/sis/storage/Resource.java |  5 ++--
 .../org/apache/sis/storage/StorageConnector.java   |  4 +--
 .../org/apache/sis/storage/WritableAggregate.java  |  5 ++--
 .../org/apache/sis/storage/WritableFeatureSet.java |  6 ++--
 .../storage/aggregate/AggregatedFeatureSet.java    |  9 +++---
 .../storage/gpx/GroupAsPolylineOperation.java      |  3 +-
 .../storage/xml/stream/FormattedWriter.java        |  6 ++--
 .../storage/xml/stream/StaxStreamReader.java       | 12 ++++----
 49 files changed, 269 insertions(+), 272 deletions(-)

diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/GridView.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/GridView.java
index a08938a9a2..4e870e46ea 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/GridView.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/GridView.java
@@ -141,9 +141,9 @@ public class GridView extends Control {
      * This size includes the {@linkplain #cellSpacing cell spacing}.
      * It shall be a number strictly greater than zero.
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter/setter for this property; use {@link DoubleProperty#set(double)}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      */
     public final DoubleProperty headerWidth;
 
@@ -152,9 +152,9 @@ public class GridView extends Control {
      * This size includes the {@linkplain #cellSpacing cell spacing}.
      * It shall be a number strictly greater than zero.
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter/setter for this property; use {@link DoubleProperty#set(double)}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      */
     public final DoubleProperty cellWidth;
 
@@ -162,9 +162,9 @@ public class GridView extends Control {
      * Height of all rows in the grid.
      * It shall be a number strictly greater than zero.
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter/setter for this property; use {@link DoubleProperty#set(double)}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      */
     public final DoubleProperty cellHeight;
 
@@ -173,18 +173,18 @@ public class GridView extends Control {
      * There is no property for vertical cell spacing because increasing the
      * {@linkplain #cellHeight cell height} should be sufficient.
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter/setter for this property; use {@link DoubleProperty#set(double)}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      */
     public final DoubleProperty cellSpacing;
 
     /**
      * The background color of row and column headers.
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter/setter for this property; use {@link ObjectProperty#set(Object)}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      */
     public final ObjectProperty<Paint> headerBackground;
 
@@ -550,8 +550,9 @@ public class GridView extends Control {
      * if an error occurred during {@link RenderedImage#getTile(int, int)} invocation.
      * The returned bounds are zero-based (may not be the bounds in image coordinates).
      *
-     * <div class="note"><b>Note:</b> we use AWT rectangle instead of JavaFX rectangle
-     * because generally we use AWT for everything related to {@link RenderedImage}.</div>
+     * <h4>Design note</h4>
+     * We use AWT rectangle instead of JavaFX rectangle
+     * because generally we use AWT for everything related to {@link RenderedImage}.
      *
      * @param  tileX  <var>x</var> coordinates of the tile for which to get the bounds.
      * @param  tileY  <var>y</var> coordinates of the tile for which to get the bounds.
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/ImagePropertyExplorer.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/ImagePropertyExplorer.java
index 0a5b24b8ab..6320fb3d8d 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/ImagePropertyExplorer.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/ImagePropertyExplorer.java
@@ -81,9 +81,9 @@ public class ImagePropertyExplorer extends Widget {
      * The root image to describe. This image will be the root of a tree;
      * children will be image {@linkplain RenderedImage#getSources() sources}.
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter/setter for this property; use {@link ObjectProperty#set(Object)}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      */
     public final ObjectProperty<RenderedImage> image;
 
@@ -138,9 +138,9 @@ public class ImagePropertyExplorer extends Widget {
      * when the {@link #image} change. This is done for allowing the garbage collector to reclaim memory.
      * The content is reset to {@link #image} properties when {@code updateOnChange} become {@code true} again.
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter/setter for this property; use {@link BooleanProperty#set(boolean)}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      */
     public final BooleanProperty updateOnChange;
 
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ExpandableList.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ExpandableList.java
index 0537ba6636..ba3bd19aba 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ExpandableList.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/dataset/ExpandableList.java
@@ -124,11 +124,12 @@ final class ExpandableList extends TransformationList<Feature,Feature>
      * Removes the expanded rows. This method does not fire change event;
      * it is caller's responsibility to perform those tasks.
      *
-     * <div class="note"><b>Note:</b> we return {@code null} instead of an empty list if
+     * <h4>Design note</h4>
+     * We return {@code null} instead of an empty list if
      * there are no removed elements because we want to force callers to perform a null check.
      * The reason is that if there was no expansion rows, then {@link #indexOfExpanded} has an
      * invalid value and using that value in {@link #nextRemove(int, List)} may be dangerous.
-     * A {@link NullPointerException} would intercept that error sooner.</div>
+     * A {@link NullPointerException} would intercept that error sooner.
      *
      * @return the removed rows, or {@code null} if none.
      */
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/map/GestureFollower.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/map/GestureFollower.java
index 275a84f0d0..7e418f8218 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/map/GestureFollower.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/map/GestureFollower.java
@@ -251,12 +251,12 @@ public class GestureFollower extends CanvasFollower implements EventHandler<Mous
      * Invoked after the source "objective to display" transform has been updated.
      * This implementation adjusts the cursor position for compensating the relative change in mouse position.
      *
-     * <div class="note"><b>Details:</b>
+     * <h4>Details</h4>
      * If the map moved in the {@linkplain #source source} canvas without a change of mouse cursor position
      * (for example if the user navigates using the keyboard), then the mouse position changed relatively to
      * the map, so the cursor position on the {@linkplain #target target} canvas needs to be updated accordingly.
      * This is a temporary change applied until the next {@link MouseEvent} gives us new mouse coordinates relative
-     * to the map.</div>
+     * to the map.
      */
     @Override
     protected void transformedSource(final TransformChangeEvent event) {
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/map/StatusBar.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/map/StatusBar.java
index 27c3df7629..234a81d9ba 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/map/StatusBar.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/map/StatusBar.java
@@ -245,9 +245,9 @@ public class StatusBar extends Widget implements EventHandler<MouseEvent> {
      * when this {@code StatusBar} is <em>not</em> associated to a {@link MapCanvas}
      * (for example it may be used with a {@link org.apache.sis.gui.coverage.GridView} instead).</p>
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter/setter for this property; use {@link ObjectProperty#set(Object)}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      *
      * @see MapCanvas#getObjectiveCRS()
      * @see MapCanvas#getObjectiveToDisplay()
@@ -259,9 +259,9 @@ public class StatusBar extends Widget implements EventHandler<MouseEvent> {
      * This is initially the <cite>objective CRS</cite>, but may become different
      * if the user selects another reference system through contextual menu.
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter method for this property; use {@link ReadOnlyObjectProperty#get()}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      *
      * @see #position
      */
@@ -430,9 +430,9 @@ public class StatusBar extends Widget implements EventHandler<MouseEvent> {
      * The property value may be {@code null} if there are no sample values to format.
      * If non-null, the text provided by this object will appear at the right of the coordinates.
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter/setter for this property; use {@link ObjectProperty#set(Object)}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      */
     public final ObjectProperty<ValuesUnderCursor> sampleValuesProvider;
 
diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/RecentReferenceSystems.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/RecentReferenceSystems.java
index 319bac2f60..be35de2eea 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/RecentReferenceSystems.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/referencing/RecentReferenceSystems.java
@@ -114,8 +114,9 @@ public class RecentReferenceSystems {
      * A pseudo-reference system for the "Other…" choice. We use a null value because {@link ChoiceBox}
      * seems to insist for inserting a null value in the items list when we remove the selected item.
      *
-     * <div class="note"><b>Maintenance note:</b> if this field is changed to a non-null value,
-     * search also for usages of {@code Object::nonNull} predicate.</div>
+     * <h4>Maintenance note</h4>
+     * If this field is changed to a non-null value,
+     * search also for usages of {@code Object::nonNull} predicate.
      */
     static final ReferenceSystem OTHER = null;
 
@@ -129,9 +130,9 @@ public class RecentReferenceSystems {
      * The area of interest, or {@code null} if none. This is used for filtering the reference systems added by
      * {@code addAlternatives(…)} and for providing some guidance to user when {@link CRSChooser} is shown.
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter/setter for this property; use {@link ObjectProperty#set(Object)}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      */
     public final ObjectProperty<Envelope> areaOfInterest;
 
@@ -144,9 +145,9 @@ public class RecentReferenceSystems {
      * The comparison criterion for considering two reference systems as a duplication.
      * The default value is {@link ComparisonMode#ALLOW_VARIANT}, i.e. axis orders are ignored.
      *
-     * <div class="note"><b>API note:</b>
+     * <h4>API note</h4>
      * We do not provide getter/setter for this property; use {@link ObjectProperty#set(Object)}
-     * directly instead. We omit the "Property" suffix for making this operation more natural.</div>
+     * directly instead. We omit the "Property" suffix for making this operation more natural.
      */
     public final ObjectProperty<ComparisonMode> duplicationCriterion;
 
@@ -237,11 +238,11 @@ public class RecentReferenceSystems {
      * A filtered view of {@link #referenceSystems} without the {@link #OTHER} item.
      * This is the list returned to users by public API, but otherwise it is not used by this class.
      *
-     * <div class="note"><b>Design note:</b>
-     * the {@link #OTHER} item needs to exist in the list used internally by this class because those lists
+     * <h4>Design notes</h4>
+     * The {@link #OTHER} item needs to exist in the list used internally by this class because those lists
      * are used directly by controls like {@code ChoiceBox<ReferenceSystem>}, with the {@link #OTHER} value
      * handled in a special way by {@link ObjectStringConverter} for making the "Other…" item present in the
-     * list of choices. But since {@link #OTHER} is not a real CRS, we want to hide that trick to users.</div>
+     * list of choices. But since {@link #OTHER} is not a real CRS, we want to hide that trick to users.
      *
      * <p>This list is lazily created when first needed,
      * because it depends on {@link #referenceSystems} which is itself lazily created.</p>
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/DomainLinearizer.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/DomainLinearizer.java
index c60e25efd8..a9fb085af1 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/DomainLinearizer.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/DomainLinearizer.java
@@ -206,10 +206,10 @@ public class DomainLinearizer {
      * after a linear "grid to CRS" approximation has been computed by the <cite>Least Mean Squares</cite> method.
      * Subclasses can override this method for example in order to scale the conversion by some arbitrary factor.
      *
-     * <div class="note"><b>Tip:</b>
-     * scales (if desired) should be applied <em>before</em> {@code gridToCRS}, i.e. on grid coordinates.
+     * <h4>Tip</h4>
+     * Scales (if desired) should be applied <em>before</em> {@code gridToCRS}, i.e. on grid coordinates.
      * Scales applied after the transform (i.e. on "real world" coordinates) may give unexpected results
-     * if the conversion contains a rotation.</div>
+     * if the conversion contains a rotation.
      *
      * @param  gridToCRS  an approximation of the "grid to CRS" conversion computed by {@code DomainLinearizer}.
      * @return the approximation to use for creating a new {@link GridGeometry}. Should be linear.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java
index 7bbcd934b1..9dd2045456 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java
@@ -69,8 +69,8 @@ import org.opengis.coverage.PointOutsideCoverageException;
  * The only restriction is that the {@linkplain GridGeometry#getExtent() grid extent} has a
  * {@linkplain GridExtent#getSize(int) size} equals to 1 in all dimensions except two of them.
  *
- * <div class="note"><b>Example:</b>
- * a remote sensing image may be valid only over some time range
+ * <h2>Example</h2>
+ * A remote sensing image may be valid only over some time range
  * (the temporal period of the satellite passing over observed area).
  * Envelopes for such grid coverage can have three dimensions:
  * the two usual ones (horizontal extent along <var>x</var> and <var>y</var>),
@@ -78,7 +78,6 @@ import org.opengis.coverage.PointOutsideCoverageException;
  * This "two-dimensional" grid coverage can have any number of columns along <var>x</var> axis
  * and any number of rows along <var>y</var> axis, but only one plan along <var>t</var> axis.
  * This single plan can have a lower bound (the start time) and an upper bound (the end time).
- * </div>
  *
  * <h2>Image size and location</h2>
  * The {@linkplain RenderedImage#getWidth() image width} and {@linkplain RenderedImage#getHeight() height}
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageBuilder.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageBuilder.java
index c495a84f89..f0fd0b1218 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageBuilder.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageBuilder.java
@@ -214,16 +214,16 @@ public class GridCoverageBuilder {
      * use row indices increasing in the opposite direction (toward down).
      * This effect can be compensated by invoking <code>{@linkplain #flipGridAxis(int) flipGridAxis}(1)</code>.
      *
-     * <div class="note"><b>Design note:</b>
+     * <p>{@code GridCoverageBuilder} provides method only for flipping axes.
+     * If more sophisticated operations is desired (for example a rotation),
+     * then {@link #setDomain(GridGeometry)} should be used instead of this method.</p>
+     *
+     * <h5>Design note</h5>
      * {@code GridCoverageBuilder} does not flip the <var>y</var> axis by default because not all
      * file formats have row indices increasing toward down. A counter-example is the netCDF format.
      * Even if we consider that the majority of images have <var>y</var> axis flipped, things become
      * less obvious when considering data in more than two dimensions. Having the same default policy
-     * (no flipping) for all dimensions make problem analysis easier.</div>
-     *
-     * {@code GridCoverageBuilder} provides method only for flipping axes.
-     * If more sophisticated operations is desired (for example a rotation),
-     * then {@link #setDomain(GridGeometry)} should be used instead of this method.
+     * (no flipping) for all dimensions make problem analysis easier.
      *
      * <h4>Default implementation</h4>
      * The default implementation creates a new {@link GridGeometry} from the given envelope
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java
index 006247c392..3e15f4cbb8 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java
@@ -296,10 +296,11 @@ public class GridDerivation {
      * For example if subsampling is 2, then a margin of 6 cells specified with this method will result
      * in a margin of 3 cells in the grid extent computed by the {@link #build()} method.
      *
-     * <div class="note"><b>Use case:</b>
-     * if the caller wants to apply bilinear interpolations in an image, (s)he will need 1 more pixel on each image border.
-     * If the caller wants to apply bi-cubic interpolations, (s)he will need 2 more pixels on each image border.</div>
+     * <h4>Use case</h4>
+     * If the caller wants to apply bilinear interpolations in an image, (s)he will need 1 more pixel on each image border.
+     * If the caller wants to apply bi-cubic interpolations, (s)he will need 2 more pixels on each image border.
      *
+     * <h4>Default values</h4>
      * If this method is never invoked, the default value is zero for all dimensions.
      * If this method is invoked too late, an {@link IllegalStateException} is thrown.
      * If the {@code cellCounts} array length is shorter than the grid dimension,
@@ -956,8 +957,8 @@ public class GridDerivation {
      * to a single point. Dimensions can be left unspecified either by assigning to {@code slicePoint} a CRS
      * without those dimensions, or by assigning the NaN value to some coordinates.
      *
-     * <div class="note"><b>Example:</b>
-     * if the {@linkplain GridGeometry#getCoordinateReferenceSystem() coordinate reference system} of base grid geometry has
+     * <h4>Example</h4>
+     * If the {@linkplain GridGeometry#getCoordinateReferenceSystem() coordinate reference system} of base grid geometry has
      * (<var>longitude</var>, <var>latitude</var>, <var>time</var>) axes, then a (<var>longitude</var>, <var>latitude</var>)
      * slice at time <var>t</var> can be created with one of the following two positions:
      * <ul>
@@ -965,9 +966,9 @@ public class GridDerivation {
      *   <li>A one-dimensional position with (<var>t</var>) coordinate and the coordinate reference system set to
      *       {@linkplain org.apache.sis.referencing.CRS#getTemporalComponent(CoordinateReferenceSystem) the temporal component}
      *       of the grid geometry CRS.</li>
-     * </ul></div>
+     * </ul>
      *
-     * <p>Notes:</p>
+     * <h4>Usage notes</h4>
      * <ul>
      *   <li>This method can be invoked after {@link #subgrid(Envelope, double...)}, but not before.</li>
      *   <li>If a non-default rounding mode is desired, it should be {@linkplain #rounding(GridRoundingMode) specified}
@@ -1216,14 +1217,14 @@ public class GridDerivation {
      * This method returns the {s₀, s₁, s₂} values while {@link #getSubsamplingOffsets()}
      * returns the {t₀, t₁, t₂} values. All subsampling values are strictly positive integers.
      *
-     * <div class="note"><b>Application to iterations</b><br>
+     * <p>This method can be invoked after {@link #build()} for getting additional information.
+     * If {@link #subgrid(GridExtent, int...)} has been invoked, then this method returns the
+     * values that were given in the {@code subsampling} argument.</p>
+     *
+     * <h4>Application to iterations</h4>
      * Iteration over {@code areaOfInterest} grid coordinates with a stride Δ<var>x</var>=1
      * corresponds to an iteration in {@link #base} grid coordinates with a stride of Δ<var>x′</var>=s₀,
-     * a stride Δ<var>y</var>=1 corresponds to a stride Δ<var>y′</var>=s₁, <i>etc.</i></div>
-     *
-     * This method can be invoked after {@link #build()} for getting additional information.
-     * If {@link #subgrid(GridExtent, int...)} has been invoked, then this method returns the
-     * values that were given in the {@code subsampling} argument.
+     * a stride Δ<var>y</var>=1 corresponds to a stride Δ<var>y′</var>=s₁, <i>etc.</i>
      *
      * @return an <em>estimation</em> of the strides for accessing cells along each axis of {@link #base} grid.
      * @throws IllegalStateException if the subsampling factors are not integers. It may happen if the derived
@@ -1259,8 +1260,8 @@ public class GridDerivation {
      * If a {@link #chunkSize} has been specified, then the subsampling will be a divisor of that size.
      * This is necessary for avoiding a drift of subsampled pixel coordinates computed from tile coordinates.
      *
-     * <div class="note"><b>Drift example:</b>
-     * if the tile size is 16 pixels and the subsampling is 3, then the subsampled tile size is ⌊16/3⌋ = 5 pixels.
+     * <h4>Drift example</h4>
+     * If the tile size is 16 pixels and the subsampling is 3, then the subsampled tile size is ⌊16/3⌋ = 5 pixels.
      * Pixel coordinates for each tile is as below:
      *
      * <table class="sis">
@@ -1276,7 +1277,7 @@ public class GridDerivation {
      * for a regular progression of those pixel coordinates. For {@code GridCoverageResource} implementations,
      * it would require to read the last row of tile #2 and insert those data as the first row of tile #3.
      * It does not only make implementations much more difficult, but also hurts performance because fetching
-     * a single tile would actually require the "physical" reading of 2 or more tiles.</div>
+     * a single tile would actually require the "physical" reading of 2 or more tiles.
      *
      * @param  scale      the scale factor to round.
      * @param  dimension  the dimension of the scale factor to round.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtent.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtent.java
index 99da3df96e..e5098872c7 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtent.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtent.java
@@ -1506,17 +1506,17 @@ public class GridExtent implements GridEnvelope, LenientComparable, Serializable
      * accordingly (this is often equivalent to dividing high coordinates by the periods too, but a difference
      * of one cell may exist).
      *
-     * <div class="note"><b>Note:</b>
+     * <h4>Usage note</h4>
      * If the "real world" envelope computed from grid extent needs to stay approximately the same, then the
      * {@linkplain GridGeometry#getGridToCRS grid to CRS} transform needs to compensate the subsampling with
      * a pre-multiplication of each grid coordinates by {@code periods}.
      * However, the envelope computed that way may become <em>larger</em> after subsampling, not smaller.
      * This effect can be understood intuitively if we consider that cells become larger after subsampling,
      * which implies that accurate representation of the same envelope may require fractional cells on some
-     * grid borders.</div>
+     * grid borders.
      *
-     * This method does not reduce the number of dimensions of the grid extent.
-     * For dimensionality reduction, see {@link #selectDimensions(int[])}.
+     * <p>This method does not reduce the number of dimensions of the grid extent.
+     * For dimensionality reduction, see {@link #selectDimensions(int[])}.</p>
      *
      * <h4>Number of arguments</h4>
      * The {@code periods} array length should be equal to the {@linkplain #getDimension() number of dimensions}.
@@ -1701,9 +1701,9 @@ public class GridExtent implements GridEnvelope, LenientComparable, Serializable
      * The returned extent has the same {@linkplain #getSize(int) size} than this extent,
      * i.e. both low and high grid coordinates are displaced by the same amount of cells.
      *
-     * <div class="note"><b>Example:</b>
-     * for an extent (x: [0…10], y: [2…4], z: [0…1]) and a translation {-2, 2},
-     * the resulting extent would be (x: [-2…8], y: [4…6], z: [0…1]).</div>
+     * <h4>Example</h4>
+     * For an extent (x: [0…10], y: [2…4], z: [0…1]) and a translation {-2, 2},
+     * the resulting extent would be (x: [-2…8], y: [4…6], z: [0…1]).
      *
      * <h4>Number of arguments</h4>
      * The {@code translation} array length should be equal to the {@linkplain #getDimension() number of dimensions}.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java
index 1f3f6207b8..6258fd011c 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java
@@ -416,10 +416,10 @@ public class GridGeometry implements LenientComparable, Serializable {
      *       smallest values (closest to negative infinity).</li>
      * </ul>
      *
-     * <div class="note"><b>API note:</b>
-     * there is no default value for {@code anchor} because experience shows that images shifted by ½ pixel
+     * <h4>API note</h4>
+     * There is no default value for {@code anchor} because experience shows that images shifted by ½ pixel
      * (with pixels that may be tens of kilometres large) is a recurrent problem. We want to encourage developers
-     * to always think about wether their <cite>grid to CRS</cite> transform is mapping pixel corner or center.</div>
+     * to always think about wether their <cite>grid to CRS</cite> transform is mapping pixel corner or center.
      *
      * <div class="warning"><b>Upcoming API generalization:</b>
      * the {@code extent} type of this method may be changed to {@code GridEnvelope} interface in a future Apache SIS version.
@@ -849,10 +849,10 @@ public class GridGeometry implements LenientComparable, Serializable {
      *       with inclusive lower coordinates and <strong>exclusive</strong> upper coordinates.</li>
      * </ul>
      *
-     * <div class="note"><b>API note:</b>
-     * there is no default value for {@code anchor} because experience shows that images shifted by ½ pixel
+     * <h4>API note</h4>
+     * There is no default value for {@code anchor} because experience shows that images shifted by ½ pixel
      * (with pixels that may be tens of kilometres large) is a recurrent problem. We want to encourage developers
-     * to always think about wether the desired <cite>grid to CRS</cite> transform shall map pixel corner or center.</div>
+     * to always think about wether the desired <cite>grid to CRS</cite> transform shall map pixel corner or center.
      *
      * @param  anchor  the cell part to map (center or corner).
      * @return the conversion from grid coordinates to "real world" coordinates (never {@code null}).
@@ -1013,10 +1013,10 @@ public class GridGeometry implements LenientComparable, Serializable {
      * This is computed from the {@linkplain #getEnvelope() envelope} if the coordinate reference system
      * contains an horizontal component such as a geographic or projected CRS.
      *
-     * <div class="note"><b>API note:</b>
-     * this method does not throw {@link IncompleteGridGeometryException} because the geographic extent
+     * <h4>API note</h4>
+     * This method does not throw {@link IncompleteGridGeometryException} because the geographic extent
      * may be absent even with a complete grid geometry. Grid geometries are not required to have a
-     * spatial component on Earth surface; a raster could be a vertical profile for example.</div>
+     * spatial component on Earth surface; a raster could be a vertical profile for example.
      *
      * @return the geographic bounding box in "real world" coordinates.
      */
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridRoundingMode.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridRoundingMode.java
index 4816855682..53996d5e82 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridRoundingMode.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridRoundingMode.java
@@ -39,14 +39,14 @@ public enum GridRoundingMode {
      *       farthest from an integer value in order to keep unchanged the two values that are closer to integers.</li>
      * </ol>
      *
-     * <div class="note"><b>Example:</b>
-     * the [<var>low</var> … <var>high</var>] range may be slightly larger than desired in some rounding error situations.
+     * <h4>Example</h4>
+     * The [<var>low</var> … <var>high</var>] range may be slightly larger than desired in some rounding error situations.
      * For example if <var>low</var> before rounding was 1.49999 and <var>high</var> before rounding was 2.50001, then the
      * range after rounding will be [1…3] while the expected size is actually only 2 pixels. This {@code NEAREST} rounding
      * mode detects those rounding issues by comparing the <var>size</var> before and after rounding. In this example, the
      * size is 2.00002 pixels, which is closer to an integer value than the <var>low</var> and <var>high</var> values.
-     * Consequently, this {@code NEAREST} mode will rather adjust <var>low</var> or <var>high</var> (depending which one is
-     * farthest from integer values) in order to keep <var>size</var> at its closest integer value, which is 2.</div>
+     * Consequently, this {@code NEAREST} mode will rather adjust <var>low</var> or <var>high</var> (depending which
+     * one is farthest from integer values) in order to keep <var>size</var> at its closest integer value, which is 2.
      */
     NEAREST,
 
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/PixelTranslation.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/PixelTranslation.java
index 37738d40be..25c7447fb3 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/PixelTranslation.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/PixelTranslation.java
@@ -220,17 +220,17 @@ public final class PixelTranslation extends Static implements Serializable {
      * This method concatenates −½, 0 or +½ translations on <em>all</em> dimensions before the given transform.
      * If the two given conventions are the same, then this method returns the given transform unchanged.
      *
-     * <div class="note"><b>Example:</b>
-     * if a given {@code gridToCRS} transform was mapping the <em>cell corner</em> to "real world" coordinates, then a call to
+     * <p>If the given {@code gridToCRS} is null, then this method ignores all other arguments and returns {@code null}.
+     * Otherwise {@code current} and {@code desired} arguments must be non-null.</p>
+     *
+     * <h4>Example</h4>
+     * If a given {@code gridToCRS} transform was mapping the <em>cell corner</em> to "real world" coordinates, then a call to
      * <code>translate(gridToCRS, {@link PixelInCell#CELL_CORNER CELL_CORNER}, {@link PixelInCell#CELL_CENTER CELL_CENTER})</code>
      * will return a new transform performing the following steps: first convert grid coordinates from <var>cell center</var>
      * convention ({@code desired}) to <var>cell corner</var> convention ({@code current}), then concatenate the given
      * {@code gridToCRS} transform which was designed for the <em>cell corner</em> convention.
      * The above-cited <var>cell center</var> → <var>cell corner</var> conversion is done by translating the grid coordinates
-     * by +½, because the grid coordinates (0,0) relative to cell center is (½,½) relative to cell corner.</div>
-     *
-     * If the given {@code gridToCRS} is null, then this method ignores all other arguments and returns {@code null}.
-     * Otherwise {@code current} and {@code desired} arguments must be non-null.
+     * by +½, because the grid coordinates (0,0) relative to cell center is (½,½) relative to cell corner.
      *
      * @param  gridToCRS  a math transform from <cite>pixel</cite> coordinates to any CRS, or {@code null}.
      * @param  current    the pixel orientation of the given {@code gridToCRS} transform.
@@ -270,14 +270,14 @@ public final class PixelTranslation extends Static implements Serializable {
      * This method concatenates −½, 0 or +½ translations on <em>two</em> dimensions before the given transform.
      * The given transform can have any number of input and output dimensions, but only two of them will be converted.
      *
-     * <div class="note"><b>Example:</b>
-     * if a given {@code gridToCRS} transform was mapping the upper-left corner to "real world" coordinates, then a call to
+     * <p>If the given {@code gridToCRS} is null, then this method ignores all other arguments and returns {@code null}.
+     * Otherwise {@code current} and {@code desired} arguments must be non-null.</p>
+     *
+     * <h4>Example</h4>
+     * If a given {@code gridToCRS} transform was mapping the upper-left corner to "real world" coordinates, then a call to
      * <code>translate(gridToCRS, {@link PixelOrientation#UPPER_LEFT UPPER_LEFT}, {@link PixelOrientation#CENTER CENTER}, 0, 1)</code>
      * will return a new transform translating grid coordinates by +0.5 before to apply the given {@code gridToCRS} transform.
-     * See example in above {@link #translate(MathTransform, PixelInCell, PixelInCell) translate} method for more details.</div>
-     *
-     * If the given {@code gridToCRS} is null, then this method ignores all other arguments and returns {@code null}.
-     * Otherwise {@code current} and {@code desired} arguments must be non-null.
+     * See example in above {@link #translate(MathTransform, PixelInCell, PixelInCell) translate} method for more details.
      *
      * @param  gridToCRS   a math transform from <cite>pixel</cite> coordinates to any CRS, or {@code null}.
      * @param  current     the pixel orientation of the given {@code gridToCRS} transform.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ResampledGridCoverage.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ResampledGridCoverage.java
index 997b357e3b..977db7019e 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ResampledGridCoverage.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ResampledGridCoverage.java
@@ -484,13 +484,13 @@ final class ResampledGridCoverage extends DerivedGridCoverage {
     /**
      * Computes a target grid extent by transforming the source grid extent.
      *
-     * <div class="note"><b>Note on rounding mode:</b>
-     * calculation of source envelope should use {@link GridRoundingMode#ENCLOSING} for making sure that we include
+     * <h4>Note on rounding mode</h4>
+     * Calculation of source envelope should use {@link GridRoundingMode#ENCLOSING} for making sure that we include
      * all needed data. On the opposite, calculation of target envelope should use {@link GridRoundingMode#CONTAINED}
      * for making sure that we interpolate only values where data are available. However, such "fully contained" mode
      * is often overly strict because a very small rounding error can cause the lost of an image row or column,
      * while using extrapolations for those values produce no perceptible errors. Consequently, this method uses
-     * {@link GridRoundingMode#NEAREST} as a compromise.</div>
+     * {@link GridRoundingMode#NEAREST} as a compromise.
      *
      * @param  source       the source grid extent to transform.
      * @param  cornerToCRS  transform from source grid corners to target CRS.
diff --git a/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/Canvas.java b/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/Canvas.java
index 1c0eb58c8e..5826f0b8f1 100644
--- a/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/Canvas.java
+++ b/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/Canvas.java
@@ -449,16 +449,17 @@ public class Canvas extends Observable implements Localized {
      * spherical coordinate systems. The coordinate system may have a wraparound axis for
      * some "exotic" display devices (e.g. planetarium dome).
      *
-     * <div class="note"><b>Usage note:</b> invoking this method is rarely needed. It is sufficient
-     * to said that a display CRS exists at least conceptually, and that we define a conversion from
-     * the objective CRS to that display CRS. This method may be useful when the subclasses may be
-     * something else than {@link PlanarCanvas}, in which case the caller may want more information
-     * about the geometry of the display device.</div>
-     *
      * <p>Note that the {@link CRS#findOperation CRS.findOperation(…)} static method can generally
      * not handle this display CRS. To apply coordinate operations on display coordinates,
      * {@link #getObjectiveToDisplay()} transform must be inverted and used.</p>
      *
+     * <h4>Usage note</h4>
+     * Invoking this method is rarely needed.
+     * It is sufficient to said that a display CRS exists at least conceptually,
+     * and that we define a conversion from the objective CRS to that display CRS.
+     * This method may be useful when the subclasses may be something else than {@link PlanarCanvas},
+     * in which case the caller may want more information about the geometry of the display device.
+     *
      * @return the Coordinate Reference System of the display device.
      *
      * @see #getObjectiveCRS()
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CopyFromBytes.java b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CopyFromBytes.java
index 833b2fa1d3..6b5a854019 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CopyFromBytes.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/CopyFromBytes.java
@@ -62,11 +62,11 @@ abstract class CopyFromBytes extends Inflater {
      * Number of pixels per primitive element.
      * Always 1 except for multi-pixels packed images.
      *
-     * <div class="note"><b>Note:</b>
-     * this is "pixels per element", not "samples per element", because the value of this field shall be 1
+     * <h4>Design note</h4>
+     * This is "pixels per element", not "samples per element", because the value of this field shall be 1
      * in the {@link java.awt.image.SinglePixelPackedSampleModel} case (by contrast a "samples per element"
      * would have a value greater than 1). But this field can nevertheless be understood as a "samples per
-     * element" value where only one band is considered at a time.</div>
+     * element" value where only one band is considered at a time.
      */
     private final int pixelsPerElement;
 
@@ -186,12 +186,12 @@ abstract class CopyFromBytes extends Inflater {
      * Skips the number of chunks specified by the {@link #skipAfterChunks} array at the given index.
      * This method tries to move by incrementing the buffer position.
      *
-     * <div class="note"><b>Design note:</b>
-     * we do not use {@link ChannelDataInput#seek(long)} because the displacement is usually small.
+     * <h4>Design note</h4>
+     * We do not use {@link ChannelDataInput#seek(long)} because the displacement is usually small.
      * Changing the buffer position is sufficient in the majority of cases. If not, then it should
      * be okay to fill the buffer with next data (instead of doing a seek operation) because there
      * is usually few remaining values to skip. Performance of this method is important, so we try
-     * to avoid overhead.</div>
+     * to avoid overhead.
      *
      * @param  skipIndex  index in {@code skipAfterChunks} array.
      * @return new {@code skipIndex} value.
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/LZW.java b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/LZW.java
index dc397bf37b..465fa7323b 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/LZW.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/internal/storage/inflater/LZW.java
@@ -85,10 +85,10 @@ final class LZW extends CompressionChannel {
      * The position is chosen for leaving {@value #MAX_CODE_SIZE} bits for storing the length before
      * the offset value.
      *
-     * <div class="note"><b>Rational:</b>
-     * even in the worst case scenario where the same byte is always appended to the sequence,
+     * <h4>Rational</h4>
+     * Even in the worst case scenario where the same byte is always appended to the sequence,
      * the maximal length cannot exceeded the dictionary size because a {@link #CLEAR_CODE}
-     * will be emitted when the dictionary is full.</div>
+     * will be emitted when the dictionary is full.
      */
     private static final int LOWEST_OFFSET_BIT = MAX_CODE_SIZE;
 
@@ -104,10 +104,10 @@ final class LZW extends CompressionChannel {
      * It makes possible to use the extra size for growing a string up to that amount of bytes
      * without copying it.
      *
-     * <div class="note"><b>Note:</b>
-     * doing allocations only by blocks of 2² = 4 bytes may seem a waste of memory, but actually
+     * <h4>Performance note</h4>
+     * Doing allocations only by blocks of 2² = 4 bytes may seem a waste of memory, but actually
      * it reduces memory usage a lot (almost a factor 4) because of the copies avoided.
-     * We tried with alignment values 1, 2, 3 and found that 2 seems optimal.</div>
+     * We tried with alignment values 1, 2, 3 and found that 2 seems optimal.
      */
     private static final int STRING_ALIGNMENT = 2;
 
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
index 218f2bb4f1..4858494bfa 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
@@ -107,8 +107,9 @@ public class GeoTiffStore extends DataStore implements Aggregate {
      * Defined as a namespace for use as the scope of children resources (the images).
      * This is created when first needed.
      *
-     * <div class="note"><b>Design note:</b> we do not create this field in the constructor because
-     * its creation invokes the user-overrideable {@link #customize(int, GenericName)} method.</div>
+     * <h4>Design note</h4>
+     * We do not create this field in the constructor because its creation invokes
+     * the user-overrideable {@link #customize(int, GenericName)} method.
      *
      * @see #namespace()
      */
@@ -169,16 +170,15 @@ public class GeoTiffStore extends DataStore implements Aggregate {
 
     /**
      * Creates a new GeoTIFF store as a component of a larger data store.
+     * If the {@code hidden} parameter is {@code true}, some metadata that would normally be
+     * provided in this {@code GeoTiffStore} will be provided by individual components instead.
      *
-     * <div class="note"><b>Example:</b>
+     * <h4>Example</h4>
      * A Landsat data set is a collection of files in a directory or ZIP file,
      * which includes more than 10 GeoTIFF files (one image per band or product for a scene).
      * {@link org.apache.sis.storage.landsat.LandsatStore} is a data store opening the Landsat
      * metadata file as the main file, then opening each band/product using a GeoTIFF data store.
-     * Those bands/products are components of the Landsat data store.</div>
-     *
-     * If the {@code hidden} parameter is {@code true}, some metadata that would normally be provided
-     * in this {@code GeoTiffStore} will be provided by individual components instead.
+     * Those bands/products are components of the Landsat data store.
      *
      * @param  parent     the parent that contains this new GeoTIFF store component, or {@code null} if none.
      * @param  provider   the factory that created this {@code DataStore} instance, or {@code null} if unspecified.
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageMetadataBuilder.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageMetadataBuilder.java
index 4e697a90e0..5ec77cc3c6 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageMetadataBuilder.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageMetadataBuilder.java
@@ -35,10 +35,10 @@ import static javax.imageio.plugins.tiff.BaselineTIFFTagSet.*;
  * Fields in the class are used only for information purposes; they do not
  * have incidence on the way Apache SIS will handle the GeoTIFF image.
  *
- * <div class="note"><b>Note:</b>
- * if those fields become useful to {@link ImageFileDirectory} in a future version,
+ * <h4>API note</h4>
+ * If those fields become useful to {@link ImageFileDirectory} in a future version,
  * we can move them into that class. Otherwise keeping those fields here allow to
- * discard them (which save a little bit of space) when no longer needed.</div>
+ * discard them (which save a little bit of space) when no longer needed.
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 1.4
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Convention.java b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Convention.java
index e3cf89b6e3..72cdc7cd69 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Convention.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Convention.java
@@ -293,8 +293,10 @@ public class Convention {
      * not the same than the dimensions of the localization grid. In such case, the names returned by this method
      * are used for mapping the raster dimensions to the localization grid dimensions.
      *
-     * <div class="note"><b>Example:</b>
-     * consider the following netCDF file (simplified):
+     * <p>This feature is an extension to CF-conventions.</p>
+     *
+     * <h4>Example</h4>
+     * Consider the following netCDF file (simplified):
      *
      * <pre class="text">
      *   dimensions:
@@ -324,9 +326,7 @@ public class Convention {
      * <cite>"Name of dimension 1"</cite> respectively, then we can associate the same dimension <strong>names</strong>
      * to all those variables: namely {@code "Line grids"} and {@code "Pixel grids"}. Using those names, we deduce that
      * the {@code (data_y, data_x)} dimensions in the {@code SST} variable are mapped to the {@code (grid_y, grid_x)}
-     * dimensions in the localization grid.</div>
-     *
-     * This feature is an extension to CF-conventions.
+     * dimensions in the localization grid.
      *
      * @param  dataOrAxis  the variable for which to get the attribute-specified name of the dimension.
      * @param  index       zero-based index of the dimension for which to get the name.
@@ -381,12 +381,12 @@ public class Convention {
      * For each string in the set, {@link Decoder#findNode(String)} is invoked and the return value
      * (if non-null) is given to {@link #projection(Node)} until a non-null map is obtained.
      *
-     * <div class="note"><b>API note:</b>
-     * this method name is singular because even if a set is returned, in the end only one value is used.</div>
-     *
-     * The default implementation returns the value of {@link CF#GRID_MAPPING} attribute, or an empty set
+     * <p>The default implementation returns the value of {@link CF#GRID_MAPPING} attribute, or an empty set
      * if the given variable does not contain that attribute. Subclasses may override for example if grid
-     * mapping information are hard-coded in a particular node for a specific product.
+     * mapping information are hard-coded in a particular node for a specific product.</p>
+     *
+     * <h4>API note</h4>
+     * This method name is singular because even if a set is returned, in the end only one value is used.
      *
      * @param  data  the variable for which to get the grid mapping node.
      * @return name of nodes that may contain the grid mapping, or an empty set if none.
@@ -545,13 +545,13 @@ public class Convention {
      * pseudo-projection, the "projected" CRS is actually a {@link GeographicCRS} instance.
      * The returned transform, if non-null, shall map cell corners.
      *
-     * <div class="note"><b>API notes:</b>
+     * <p>The default implementation returns {@code null}.</p>
+     *
+     * <h4>API notes</h4>
      * <ul>
      *   <li>We do not provide a {@link ProjectedCRS} argument because of the {@code "latitude_longitude"} special case.</li>
      *   <li>Base CRS axis order is (latitude, longitude) for increasing the chances to have a CRS identified by EPSG.</li>
-     * </ul></div>
-     *
-     * The default implementation returns {@code null}.
+     * </ul>
      *
      * @param  node       the same node than the one given to {@link #projection(Node)}.
      * @param  baseToCRS  conversion from (latitude, longitude) in degrees to the projected CRS.
@@ -567,8 +567,8 @@ public class Convention {
      * netCDF file. The default implementation returns <cite>"Unknown datum based upon the GRS 1980 ellipsoid"</cite>.
      * Note that the GRS 1980 ellipsoid is close to WGS 84 ellipsoid.
      *
-     * <div class="note"><b>Maintenance note:</b>
-     * if this default is changed, search also for "GRS 1980" strings in {@link CRSBuilder} class.</div>
+     * <h4>Maintenance note</h4>
+     * If this default is changed, search also for "GRS 1980" strings in {@link CRSBuilder} class.
      *
      * @param  spherical  whether to restrict the ellipsoid to a sphere.
      * @return information about geodetic objects to use if no explicit information is found in the file.
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Decoder.java b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Decoder.java
index a07c219491..4eced70bd9 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Decoder.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Decoder.java
@@ -137,10 +137,10 @@ public abstract class Decoder extends ReferencingFactoryContainer {
      * grids only between variables using the exact same list of dimensions.
      * This {@code localizationGrids} cache allows to cover other cases.
      *
-     * <div class="note"><b>Example:</b>
-     * a netCDF file may have a variable with (<var>longitude</var>, <var>latitude</var>) dimensions and another
+     * <h4>Example</h4>
+     * A netCDF file may have a variable with (<var>longitude</var>, <var>latitude</var>) dimensions and another
      * variable with (<var>longitude</var>, <var>latitude</var>, <var>depth</var>) dimensions, with both variables
-     * using the same localization grid for the (<var>longitude</var>, <var>latitude</var>) part.</div>
+     * using the same localization grid for the (<var>longitude</var>, <var>latitude</var>) part.
      *
      * @see GridCacheKey#cached(Decoder)
      */
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/GridMapping.java b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/GridMapping.java
index e8d2634f4e..2e4beb2b7d 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/GridMapping.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/GridMapping.java
@@ -96,8 +96,9 @@ final class GridMapping {
      * This CRS may have been constructed from Well Known Text or EPSG codes declared in {@code "spatial_ref"},
      * {@code "ESRI_pe_string"} or {@code "EPSG_code"} attributes.
      *
-     * <div class="note"><b>Note:</b> this come from different information than the one used by {@link CRSBuilder},
-     * which creates CRS by inspection of coordinate system axes.</div>
+     * <h4>Usage note</h4>
+     * This come from different information than the one used by {@link CRSBuilder},
+     * which creates CRS by inspection of coordinate system axes.
      */
     final CoordinateReferenceSystem crs;
 
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Linearizer.java b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Linearizer.java
index 14a7dbfae8..62ab908285 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Linearizer.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Linearizer.java
@@ -98,10 +98,10 @@ public final class Linearizer {
          *   <li>Otherwise the point is in the middle of the image.</li>
          * </ul>
          *
-         * <div class="note"><b>Rational:</b>
-         * the intent is to increase the chances to get the Polar Stereographic projection for images close to pole.
+         * <h4>Rational</h4>
+         * The intent is to increase the chances to get the Polar Stereographic projection for images close to pole.
          * This is necessary because longitude values may become far from central meridian at latitudes such as 88°,
-         * causing the Transverse Mercator projection to produce NaN numbers.</div>
+         * causing the Transverse Mercator projection to produce NaN numbers.
          */
         UNIVERSAL;
 
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java
index c02d4b896a..6d9055cd91 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java
@@ -478,10 +478,10 @@ public abstract class Variable extends Node {
     /**
      * Returns {@code true} if this variable should be considered as a list of strings.
      *
-     * <div class="note"><b>Maintenance note:</b>
-     * the implementation of this method is inlined in some places, when the code already
+     * <h4>Maintenance note</h4>
+     * The implementation of this method is inlined in some places, when the code already
      * has the {@link DataType} value at hand. If this implementation is modified, search
-     * for {@link #STRING_DIMENSION} usages.</div>
+     * for {@link #STRING_DIMENSION} usages.
      *
      * @see #STRING_DIMENSION
      */
@@ -819,19 +819,19 @@ public abstract class Variable extends Node {
      * In ISO 19123 terminology, {@link Dimension#length()} on each dimension give the upper corner
      * of the grid envelope plus one. The lower corner is always (0, 0, …, 0).
      *
-     * <div class="note"><b>Usage:</b>
-     * this information is used for completing ISO 19115 metadata, providing a default implementation of
-     * {@link Convention#roleOf(Variable)} method or for building string representation of this variable
-     * among others. Those tasks are mostly for information purpose, except if {@code Variable} subclass
-     * failed to create a grid and we must rely on {@link #findGrid(GridAdjustment)} default implementation.
-     * For actual georeferencing, use {@link #getGridGeometry()} instead.</div>
-     *
-     * If {@link #findGrid(GridAdjustment)} returns a non-null value, then the list returned by this method should
+     * <p>If {@link #findGrid(GridAdjustment)} returns a non-null value, then the list returned by this method should
      * contain all dimensions returned by {@link Grid#getDimensions()}. It may contain more dimension however.
      * Those additional dimensions can be considered as bands. Furthermore, the dimensions of the {@code Grid}
      * may have a different {@linkplain Dimension#length() length} than the dimensions returned by this method.
      * If such length mismatch exists, then {@link #getGridGeometry()} will concatenate a scale factor to
-     * the "grid to CRS" transform.
+     * the "grid to CRS" transform.</p>
+     *
+     * <h4>Usage</h4>
+     * This information is used for completing ISO 19115 metadata, providing a default implementation of
+     * {@link Convention#roleOf(Variable)} method or for building string representation of this variable
+     * among others. Those tasks are mostly for information purpose, except if {@code Variable} subclass
+     * failed to create a grid and we must rely on {@link #findGrid(GridAdjustment)} default implementation.
+     * For actual georeferencing, use {@link #getGridGeometry()} instead.
      *
      * @return all dimensions of this variable, in netCDF order (reverse of "natural" order).
      *
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/AttributeNames.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/AttributeNames.java
index b84fc1cb77..34a9e1dfad 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/AttributeNames.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/AttributeNames.java
@@ -188,12 +188,12 @@ public class AttributeNames {
      * <tr><td>{@link AttributeNames#INSTRUMENT    INSTRUMENT}</td>    <td>{@code "instrument"}</td>    <td>{@code "instrument_vocabulary"}</td></tr>
      * </table>
      *
-     * <div class="note"><b>Note:</b>
+     * <h2>Departure from conventions</h2>
      * The member names in this class are upper-cases because they should be considered as constants.
      * For example, {@code AttributeNames.KEYWORD.TEXT} maps exactly to the {@code "keywords"} string
      * and nothing else. A lower-case {@code text} member name could be misleading since it would
      * suggest that the field contains the actual text value rather than the key by which the value
-     * is identified in a netCDF file.</div>
+     * is identified in a netCDF file.
      *
      * @author  Martin Desruisseaux (Geomatys)
      * @version 0.8
@@ -352,11 +352,11 @@ public class AttributeNames {
      * {@link Metadata#getResourceLineages() resourceLineage} /
      * {@link Lineage#getStatement() statement}</li></ul>
      *
-     * <div class="note"><b>Note:</b>
-     * located in "{@link Metadata#getDataQualityInfo() dataQualityInfo} /
+     * <h4>Departure from convention</h4>
+     * Located in "{@link Metadata#getDataQualityInfo() dataQualityInfo} /
      * {@link org.opengis.metadata.quality.DataQuality#getLineage() lineage}" instead of "{@code resourceLineage}"
      * in {@code UnidataDD2MI.xsl} file (retrieved in 2017).
-     * See <a href="https://issues.apache.org/jira/browse/SIS-361">SIS-361</a>.</div>
+     * See <a href="https://issues.apache.org/jira/browse/SIS-361">SIS-361</a>.
      *
      * @see <a href="http://wiki.esipfed.org/index.php/Attribute_Convention_for_Data_Discovery#history">ESIP reference</a>
      */
@@ -370,11 +370,11 @@ public class AttributeNames {
      * {@link Lineage#getSources() source} /
      * {@link Source#getDescription() description}</li></ul>
      *
-     * <div class="note"><b>Note:</b>
-     * located in "{@link Metadata#getDataQualityInfo() dataQualityInfo} /
+     * <h4>Departure from convention</h4>
+     * Located in "{@link Metadata#getDataQualityInfo() dataQualityInfo} /
      * {@link org.opengis.metadata.quality.DataQuality#getLineage() lineage}" instead of "{@code resourceLineage}"
      * in {@code UnidataDD2MI.xsl} file (retrieved in 2017).
-     * See <a href="https://issues.apache.org/jira/browse/SIS-361">SIS-361</a>.</div>
+     * See <a href="https://issues.apache.org/jira/browse/SIS-361">SIS-361</a>.
      *
      * @see <a href="http://wiki.esipfed.org/index.php/Attribute_Convention_for_Data_Discovery#source">ESIP reference</a>
      *
@@ -582,12 +582,12 @@ public class AttributeNames {
      *   <td>           {@link Role#PUBLISHER}</td>
      * </tr></table>
      *
-     * <div class="note"><b>Note:</b>
+     * <h2>Departure from conventions</h2>
      * The member names in this class are upper-cases because they should be considered as constants.
      * For example, {@code AttributeNames.CREATOR.EMAIL} maps exactly to the {@code "creator_email"} string
      * and nothing else. A lower-case {@code email} member name could be misleading since it would suggest
      * that the field contains the actual name value rather than the key by which the value is identified
-     * in a netCDF file.</div>
+     * in a netCDF file.
      *
      * @author  Martin Desruisseaux (Geomatys)
      * @version 0.8
@@ -912,12 +912,12 @@ public class AttributeNames {
      *   <td            >{@link DimensionNameType#TIME}</td>
      * </tr></table>
      *
-     * <div class="note"><b>Note:</b>
+     * <h2>Departure from conventions</h2>
      * The member names in this class are upper-cases because they should be considered as constants.
      * For example, {@code AttributeNames.LATITUDE.MINIMUM} maps exactly to the {@code "geospatial_lat_min"}
      * string and nothing else. A lower-case {@code minimum} member name could be misleading since it would
      * suggest that the field contains the actual latitude value rather than the key by which the value is
-     * identified in a netCDF file.</div>
+     * identified in a netCDF file.
      *
      * @author  Martin Desruisseaux (Geomatys)
      * @version 0.3
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
index 690a381421..a87e24607b 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java
@@ -137,9 +137,8 @@ final class MetadataReader extends MetadataBuilder {
     /**
      * The character to use for quoting strings in a comma-separated list. Quoted strings may contain comma.
      *
-     * <div class="note"><b>Example:</b>
+     * <h4>Example</h4>
      * John Doe, Jane Lee, "L J Smith, Jr."
-     * </div>
      */
     private static final char QUOTE = '"';
 
diff --git a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/TableAnalyzer.java b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/TableAnalyzer.java
index 6cea2807b3..6790559af6 100644
--- a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/TableAnalyzer.java
+++ b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/sql/feature/TableAnalyzer.java
@@ -85,9 +85,10 @@ final class TableAnalyzer extends FeatureAnalyzer {
      * method arguments with a name ending by {@code "Pattern"}. Note that not all arguments are pattern; please
      * checks carefully {@link DatabaseMetaData} javadoc for each method.
      *
-     * <div class="note"><b>Example:</b> if a method expects an argument named {@code tableNamePattern},
+     * <h4>Example</h4>
+     * If a method expects an argument named {@code tableNamePattern},
      * then that argument value should be escaped. But if the argument name is only {@code tableName},
-     * then the value should not be escaped.</div>
+     * then the value should not be escaped.
      */
     private String escape(final String pattern) {
         return SQLUtilities.escape(pattern, analyzer.escape);
diff --git a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/stream/DeferredStream.java b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/stream/DeferredStream.java
index fe05095cbb..e805c5e731 100644
--- a/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/stream/DeferredStream.java
+++ b/storage/sis-sqlstore/src/main/java/org/apache/sis/internal/stream/DeferredStream.java
@@ -29,14 +29,14 @@ import org.apache.sis.util.collection.BackingStoreException;
  * The source stream is implemented by a {@link Spliterator} created by {@link #createSourceIterator()}.
  * The call to that method is deferred until a terminal operation is invoked.
  *
- * <div class="note"><b>Example:</b>
- * if a stream can count its elements efficiently (e.g. using a {@code COUNT} query on SQL databases),
+ * <h2>Example</h2>
+ * If a stream can count its elements efficiently (e.g. using a {@code COUNT} query on SQL databases),
  * a {@code DeferredStream} subclass can override the {@link #count()} method for running the count query
  * instead of counting elements of the stream manually.
  *
  * <p>Deferred streams are also useful with intermediate operations. For example, a subclass can override
  * the {@link #skip(long)} and {@link #limit(long)} methods for modifying the SQL query with addition of
- * {@code OFFSET} and {@code FETCH NEXT} clauses before the worker stream is created.</p></div>
+ * {@code OFFSET} and {@code FETCH NEXT} clauses before the worker stream is created.</p>
  *
  * @author  Alexis Manin (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java
index 8e2ca357be..d9e5ec14a3 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/MetadataBuilder.java
@@ -2498,16 +2498,14 @@ parse:      for (int i = 0; i < length;) {
 
     /**
      * Adds a description of a particular sample value.
+     * ISO 19115 range elements are approximately equivalent to
+     * {@code org.apache.sis.coverage.Category} in the {@code sis-coverage} module.
      * Storage location is:
      *
      * <ul>
      *   <li>{@code metadata/contentInfo/rangeElementDescription}</li>
      * </ul>
      *
-     * <div class="note"><b>Note:</b>
-     * ISO 19115 range elements are approximately equivalent to
-     * {@code org.apache.sis.coverage.Category} in the {@code sis-coverage} module.</div>
-     *
      * @param  name        designation associated with a set of range elements, or {@code null} if none.
      * @param  definition  description of a set of specific range elements, or {@code null} if none.
      */
@@ -2928,9 +2926,9 @@ parse:      for (int i = 0; i < length;) {
      *   <li>{@code metadata/resourceLineage/source/scope/levelDescription/features}</li>
      * </ul>
      *
-     * <div class="note"><b>Example:</b>
-     * if a Landsat image uses the "GTOPO30" digital elevation model, then it can declare the source
-     * with "GTOPO30" description, {@link ScopeCode#MODEL} and feature "Digital Elevation Model".</div>
+     * <h4>Example</h4>
+     * If a Landsat image uses the "GTOPO30" digital elevation model, then it can declare the source
+     * with "GTOPO30" description, {@link ScopeCode#MODEL} and feature "Digital Elevation Model".
      *
      * @param  description  a detailed description of the level of the source data, or {@code null} if none.
      * @param  level        hierarchical level of the source (e.g. model), or {@code null} if unspecified.
@@ -2969,10 +2967,10 @@ parse:      for (int i = 0; i < length;) {
      *   <li>{@code metadata/resourceLineage/source/sourceSpatialResolution}</li>
      * </ul>
      *
-     * <div class="note"><b>Example:</b>
-     * if a {@code FeatureSet} is the aggregation of two other {@code FeatureSet} resources,
+     * <h4>Example</h4>
+     * If a {@code FeatureSet} is the aggregation of two other {@code FeatureSet} resources,
      * then this method can be invoked twice with the metadata of each source {@code FeatureSet}.
-     * If the aggregated data are features, then {@code level} should be {@link ScopeCode#FEATURE}.</div>
+     * If the aggregated data are features, then {@code level} should be {@link ScopeCode#FEATURE}.
      *
      * @param  metadata  the metadata of the source, or {@code null} if none.
      * @param  level     hierarchical level of the source (e.g. feature). Should not be null.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceOnFileSystem.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceOnFileSystem.java
index 419ab377ec..8b0e699d45 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceOnFileSystem.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/ResourceOnFileSystem.java
@@ -47,8 +47,13 @@ public interface ResourceOnFileSystem extends Resource {
      * There is no guarantee that all files are in the same directory or that each file is used exclusively
      * by this data source (e.g. no guarantee that modifying or deleting a file will not impact other resources).
      *
-     * <div class="note"><b>Example:</b>
-     * a resources created for a GRIB file may use the following component files:
+     * <p>This method should return paths to files only.
+     * It should not return paths to directories.
+     * The caller should verify that all paths are regular files;
+     * non-existent paths should be omitted.</p>
+     *
+     * <h4>Example</h4>
+     * A resources created for a GRIB file may use the following component files:
      * <ul>
      *   <li>The main GRIB file.</li>
      *   <li>If managed by the UCAR library, two auxiliary files next to the main GRIB file:
@@ -57,11 +62,6 @@ public interface ResourceOnFileSystem extends Resource {
      *   <li>Eventually a GRIB table file. This table may be located in a path unrelated to
      *       to the path of the main file and may be shared by many resources.</li>
      * </ul>
-     * </div>
-     *
-     * This method should return paths to files only. It should not return paths to directories.
-     * The caller should verify that all paths are regular files;
-     * non-existent paths should be omitted.
      *
      * @return files used by this resource. Should never be {@code null}.
      * @throws DataStoreException if an error on the file system prevent the creation of the list.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/StoreMetadata.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/StoreMetadata.java
index aa01a0c70b..9d4688bbaa 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/StoreMetadata.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/StoreMetadata.java
@@ -63,20 +63,20 @@ public @interface StoreMetadata {
      * The "main" file is the file that users specify when opening the dataset.
      * The returned array should <em>not</em> include the suffixes of auxiliary files.
      *
-     * <div class="note"><b>Example:</b>
-     * GeoTIFF data are contained in files with the {@code ".tif"} or {@code ".tiff"} suffix,
-     * sometimes accompanied by auxiliary files with {@code ".prj"} and {@code ".tfw"} suffixes.
-     * This method should return an array containing only {@code "tif"} or {@code "tiff"} strings,
-     * without the leading dot.</div>
-     *
-     * The suffixes are case-insensitive (no need to declare both lower-case and upper-case variants)
-     * and shall not contain the leading dot. The first element in the list is the preferred suffix
-     * to use for new files.
+     * <p>The suffixes are case-insensitive (no need to declare both lower-case and upper-case variants)
+     * and shall not contain the leading dot.
+     * The first element in the list is the preferred suffix to use for new files.</p>
      *
      * <p>The same suffixes may be used by many different formats. For example, the {@code ".xml"} suffix
      * is used for files in many mutually incompatible formats. Consequently, the file suffixes shall not
      * be used as format identifiers.</p>
      *
+     * <h4>Example</h4>
+     * GeoTIFF data are contained in files with the {@code ".tif"} or {@code ".tiff"} suffix,
+     * sometimes accompanied by auxiliary files with {@code ".prj"} and {@code ".tfw"} suffixes.
+     * This method should return an array containing only {@code "tif"} or {@code "tiff"} strings,
+     * without the leading dot.
+     *
      * @return the filename suffixes, case insensitive. Never null but can be empty.
      */
     String[] fileSuffixes() default {};
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridCoverage.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridCoverage.java
index 9416d47465..5ce747eafb 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridCoverage.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridCoverage.java
@@ -334,12 +334,12 @@ public abstract class TiledGridCoverage extends GridCoverage {
      * {@link MultiPixelPackedSampleModel} which packs many pixels in a single bank element.
      * This value is a power of 2 according {@code MultiPixelPackedSampleModel} specification.
      *
-     * <div class="note"><b>Note:</b>
-     * this is "pixels per element", not "samples per element". It makes a difference in the
+     * <h4>Design note</h4>
+     * This is "pixels per element", not "samples per element". It makes a difference in the
      * {@link java.awt.image.SinglePixelPackedSampleModel} case, for which this method returns 1
      * (by contrast a "samples per element" would give a value greater than 1).
      * But this value can nevertheless be understood as a "samples per element" value
-     * where only one band is considered at a time.</div>
+     * where only one band is considered at a time.
      *
      * @return number of pixels in a single bank element. Usually 1.
      *
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/Markable.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/Markable.java
index 01b1abaa15..c1170e8aaa 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/Markable.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/Markable.java
@@ -23,16 +23,14 @@ import java.io.IOException;
  * Stream reader or writer capable to mark its current position and reset to that position later.
  * The stream shall support nested marks.
  *
- * <div class="note"><b>Use case:</b>
- * this interface can be used when we need to move to a previously marked position, but we do not know how many nested
+ * <h2>Use case</h2>
+ * This interface can be used when we need to move to a previously marked position, but we do not know how many nested
  * {@code mark()} method calls may have been performed (typically because the stream has been used by arbitrary code).
  * We can compare {@link #getStreamPosition()} value after {@link #reset()} method calls with the expected position.
- * </div>
  *
- * <div class="note"><b>Design note:</b>
- * an alternative could be to support the {@code seek(long)} method. But using marks instead allows the stream
+ * <h2>Design note</h2>
+ * An alternative could be to support the {@code seek(long)} method. But using marks instead allows the stream
  * to invalidate the marks if needed (for example when {@link ChannelData#setStreamPosition(long)} is invoked).
- * </div>
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 1.2
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/Region.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/Region.java
index a8723adbdc..05785987b8 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/Region.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/Region.java
@@ -137,15 +137,15 @@ public final class Region {
      * The strides are computed automatically at construction time, but this method can be invoked in some rare cases
      * where those values need to be modified (example: for adapting to the layout of netCDF "unlimited" variable).
      *
-     * <div class="note"><b>Example:</b>
-     * in a cube of dimension 10×10×10, the number of values between indices (0,0,1) and (0,0,2) is 100.
+     * <p>This method is the only one in this {@link Region} class to use a count of bytes
+     * instead of a count of sample values.</p>
+     *
+     * <h4>Example</h4>
+     * In a cube of dimension 10×10×10, the number of values between indices (0,0,1) and (0,0,2) is 100.
      * If the values type is {@code float}, invoking {@code setAdditionalByteOffset(1, 12)} will increase
      * this value to 103 (computed as 100 + 12/{@value Float#BYTES}).
      * {@link HyperRectangleReader} will still read only the requested 100 values,
-     * but will skip 3 more values when moving from plane 1 to plane 2.</div>
-     *
-     * This method is the only one in this {@link Region} class to use a count of bytes instead of a count
-     * of sample values.
+     * but will skip 3 more values when moving from plane 1 to plane 2.
      *
      * @param  dimension  dimension for which to increase the stride.
      * @param  skip       additional number of <strong>bytes</strong> to skip after we finished reading
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/RewindableLineReader.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/RewindableLineReader.java
index d9d1d633ea..d916c07cf1 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/RewindableLineReader.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/io/RewindableLineReader.java
@@ -52,8 +52,9 @@ public final class RewindableLineReader extends LineNumberReader {
     /**
      * The input stream, or {@code null} if this reader cannot rewind anymore.
      *
-     * <div class="note"><b>Note:</b> we do not use the more generic {@link java.io.InputStream} class
-     * because this whole {@code RewindableLineReader} class is useless if we cannot seek in this stream.</div>
+     * <h4>Design note</h4>
+     * We do not use the more generic {@link java.io.InputStream} class
+     * because this whole {@code RewindableLineReader} class is useless if we cannot seek in this stream.
      */
     private InputStreamAdapter input;
 
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java
index 9baaaf1774..31a77fef26 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/wkt/Store.java
@@ -42,9 +42,9 @@ import org.apache.sis.util.CharSequences;
 /**
  * A data store which creates data objects from a WKT definition.
  *
- * <div class="note"><b>Note:</b>
+ * <h4>Design note</h4>
  * this class differs from {@link org.apache.sis.internal.storage.PRJDataStore} in that
- * the file containing WKT definition is the main file, not an auxiliary file.</div>
+ * the file containing WKT definition is the main file, not an auxiliary file.
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 1.4
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataSet.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataSet.java
index 8e7b76e84a..231f6ac17f 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataSet.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataSet.java
@@ -27,11 +27,11 @@ import org.opengis.geometry.Envelope;
  * grid geometries or sample dimensions, depending on the {@code DataSet} subtype.
  * The actual values are provided by methods defined in {@code DataSet} subtypes.
  *
- * <div class="note"><b>Example:</b>
- * the features contained in a {@code DataSet} could be all bridges in a city. A {@code DataSet} can be associated to
+ * <h2>Example</h2>
+ * The features contained in a {@code DataSet} could be all bridges in a city. A {@code DataSet} can be associated to
  * one {@code FeatureType} which specifies that all bridges shall have {@code "construction date"} and {@code "height"}
  * attributes, and an arbitrary number of {@code Feature} instances which contains the actual values for all bridges in
- * the dataset.</div>
+ * the dataset.
  *
  * <h2>Metadata</h2>
  * Datasets should have {@link #getMetadata() metadata} /
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreContentException.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreContentException.java
index ef52d8b6f2..0411bd62c3 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreContentException.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreContentException.java
@@ -24,11 +24,11 @@ import java.util.Locale;
  * It may be for example a logical inconsistency, or a reference not found,
  * or an unsupported file format version, <i>etc.</i>
  *
- * <div class="note"><b>Note:</b>
+ * <h2>Usage note</h2>
  * exceptions that are caused by {@link java.io.IOException} or {@link java.sql.SQLException}
  * should generally be wrapped by another type of {@link DataStoreException}, unless the data
  * store can determine that the error was caused by a problem with the stream content rather
- * than some I/O problems.</div>
+ * than some I/O problems.
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 0.8
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java
index 56ad65df44..05e485bafc 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreProvider.java
@@ -99,15 +99,15 @@ public abstract class DataStoreProvider {
      * set to {@code true}, then the {@code open(…)} method may create files, a directory or a database at the given
      * location.</p>
      *
-     * <div class="note"><b>Relationship with standard file open options</b>
-     * <p>For data stores on file systems, a <code>{@value} = true</code> parameter value is equivalent to opening a file
+     * <h4>Relationship with standard file open options</h4>
+     * For data stores on file systems, a <code>{@value} = true</code> parameter value is equivalent to opening a file
      * with {@link java.nio.file.StandardOpenOption#CREATE} and {@link java.nio.file.StandardOpenOption#APPEND APPEND}.
      * The other file standard options like {@link java.nio.file.StandardOpenOption#CREATE_NEW CREATE_NEW} and
      * {@link java.nio.file.StandardOpenOption#TRUNCATE_EXISTING TRUNCATE_EXISTING} should not be accessible through
      * this {@value} parameter. The reason is that {@link ParameterValueGroup} may be used for storing parameters
      * permanently (for example in a configuration file or in a database) for reopening the same {@link DataStore}
      * many times. File options designed for being used only once like {@code CREATE_NEW} and {@code TRUNCATE_EXISTING}
-     * are incompatible with this usage.</p></div>
+     * are incompatible with this usage.
      *
      * @see #LOCATION
      * @see #getOpenParameters()
@@ -125,13 +125,11 @@ public abstract class DataStoreProvider {
      * This name is used in some warnings or exception messages.
      * It may contain any characters, including white spaces
      * (i.e. this short name is <strong>not</strong> a format identifier).
+     * For a more comprehensive format name, see {@link #getFormat()}.
      *
-     * <div class="note"><b>Examples:</b>
+     * <h4>Examples</h4>
      * {@code "CSV"}, {@code "GeoTIFF"}, {@code "GML"}, {@code "GPX"}, {@code "JPEG"}, {@code "JPEG 2000"},
      * {@code "NetCDF"}, {@code "PNG"}, {@code "Shapefile"}.
-     * </div>
-     *
-     * For a more comprehensive format name, see {@link #getFormat()}.
      *
      * @return a short name or abbreviation for the data format.
      *
@@ -197,8 +195,8 @@ public abstract class DataStoreProvider {
      * Those parameters will be recognized by the default {@code DataStoreProvider} methods and used whenever a
      * {@link StorageConnector} is required.</p>
      *
-     * <div class="note"><b>Alternative:</b>
-     * the main differences between the use of {@code StorageConnector} and parameters are:
+     * <h4>Alternative</h4>
+     * The main differences between the use of {@code StorageConnector} and parameters are:
      * <ul class="verbose">
      *   <li>{@code StorageConnector} is designed for use with file or stream of unknown format;
      *       the format is automatically detected. By contrast, the use of parameters require to
@@ -207,7 +205,7 @@ public abstract class DataStoreProvider {
      *       and provide fine grain control over the store general behavior such as caching,
      *       time-outs, encoding, <i>etc</i>.</li>
      *   <li>Parameters can more easily be serialized in XML or configuration files.</li>
-     * </ul></div>
+     * </ul>
      *
      * @return description of the parameters required or accepted for opening a {@link DataStore}.
      *
@@ -236,14 +234,13 @@ public abstract class DataStoreProvider {
      * only that there appears to be a reasonable chance of success based on a brief inspection of the
      * {@linkplain StorageConnector#getStorage() storage object} or contents.
      *
-     * <div class="note"><b>Note for implementers</b>:
+     * <h4>Note for implementers</h4>
      * Implementations are responsible for restoring the storage object to its original position
      * on return of this method. Implementers can use the mark/reset mechanism for this purpose.
      * Marks are available as {@link java.nio.ByteBuffer#mark()}, {@link java.io.InputStream#mark(int)}
      * and {@link javax.imageio.stream.ImageInputStream#mark()}.
      * Alternatively, the {@link #probeContent(StorageConnector, Class, Prober)}
      * helper method manages automatically the marks for a set of known types.
-     * </div>
      *
      * @param  connector  information about the storage (URL, stream, JDBC connection, <i>etc</i>).
      * @return a {@linkplain ProbeResult#isSupported() supported} status if the given storage
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreRegistry.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreRegistry.java
index 5ccaaabd59..9f850b5f31 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreRegistry.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStoreRegistry.java
@@ -34,9 +34,9 @@ import org.apache.sis.util.ArraysExt;
  * Storage objects are typically {@link java.io.File} or {@link javax.sql.DataSource} instances, but can also
  * be any other objects documented in the {@link StorageConnector} class.
  *
- * <div class="note"><b>API note:</b>
- * this class is package-private for now in order to get more experience about what could be a good API.
- * This class may become public in a future SIS version.</div>
+ * <h2>API note</h2>
+ * This class is package-private for now in order to get more experience about what could be a good API.
+ * This class may become public in a future SIS version.
  *
  * <h2>Thread safety</h2>
  * The same {@code DataStoreRegistry} instance can be safely used by many threads without synchronization
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
index 155d005114..e690817941 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
@@ -36,13 +36,12 @@ import org.apache.sis.storage.event.StoreListener;
  * instance of {@link Aggregate}. The {@linkplain Aggregate#components() components} of an aggregate can be
  * themselves other aggregates, thus forming a tree.</p>
  *
- * <div class="note"><b>Relationship with ISO 19115:</b>
- * this type is closely related to the {@code DS_Resource} type defined by ISO 19115.
+ * <h2>Relationship with ISO 19115</h2>
+ * This type is closely related to the {@code DS_Resource} type defined by ISO 19115.
  * The Apache SIS type differs from the ISO type by being more closely related to data extraction,
  * as can be seen from the checked {@link DataStoreException} thrown by most methods.
  * Convenience methods for frequently requested information – for example {@link DataSet#getEnvelope()} – were added.
  * The sub-types performing the actual data extraction – for example {@link FeatureSet} – are specific to Apache SIS.
- * </div>
  *
  * @author  Johann Sorel (Geomatys)
  * @version 1.0
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/StorageConnector.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/StorageConnector.java
index 759331e2a1..24b225c09a 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/StorageConnector.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/StorageConnector.java
@@ -920,12 +920,12 @@ public class StorageConnector implements Serializable {
      * {@link #getStorageAs(Class)} return value in the same state as they found it. This method is
      * only for handling the cases where using a view has an indirect impact on another view.</p>
      *
-     * <div class="note"><b>Rational:</b>
+     * <h4>Rational</h4>
      * {@link DataStoreProvider#probeContent(StorageConnector)} contract requires that implementers reset the
      * input stream themselves. However if {@link ChannelDataInput} or {@link InputStreamReader} has been used,
      * then the user performed a call to {@link ChannelDataInput#reset()} (for instance), which did not reset
      * the underlying input stream. So we need to perform the missing {@link InputStream#reset()} here, then
-     * synchronize the {@code ChannelDataInput} position accordingly.</div>
+     * synchronize the {@code ChannelDataInput} position accordingly.
      *
      * @param  c  container of the view to reset, or {@code null} if none.
      * @return {@code true} if the given view, after reset, is valid.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableAggregate.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableAggregate.java
index b19fcf3f4a..bac0307b04 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableAggregate.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableAggregate.java
@@ -38,12 +38,11 @@ public interface WritableAggregate extends Aggregate {
      *  <li>{@link org.opengis.metadata.Metadata}</li>
      * </ul>
      *
-     * <div class="note"><b>Warning:</b>
-     * copying information between stores may produce differences in many aspects.
+     * <h4>Data transformation</h4>
+     * Copying information between stores may produce differences in many aspects.
      * The range of changes depends both on the original {@link Resource} structure
      * and the target {@code Resource} structure. If the differences are too large,
      * then this {@code Aggregate} may throw an exception.
-     * </div>
      *
      * @param  resource  the resource to copy in this {@code Aggregate}.
      * @return the effectively added resource. May be {@code resource} itself if it has been added verbatim.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableFeatureSet.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableFeatureSet.java
index 0754e06940..be9abaf8f7 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableFeatureSet.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/WritableFeatureSet.java
@@ -65,11 +65,11 @@ public interface WritableFeatureSet extends FeatureSet {
      * After successful insertion, the new features may appear after the features already present
      * but not necessarily; ordering is {@link DataStore} specific.
      *
-     * <div class="note"><b>API note:</b>
-     * this method expects an {@link Iterator} rather than a {@link Stream} for easing
+     * <h4>API note</h4>
+     * This method expects an {@link Iterator} rather than a {@link Stream} for easing
      * inter-operability with various API. Implementing a custom {@link Iterator} requires less effort
      * than implementing a {@link Stream}. On the other side if the user has a {@link Stream},
-     * obtaining an {@link Iterator} can be done by a call to {@link Stream#iterator()}.</div>
+     * obtaining an {@link Iterator} can be done by a call to {@link Stream#iterator()}.
      *
      * @param  features feature instances to insert or copy in this {@code FeatureSet}.
      * @throws IllegalFeatureTypeException if a feature given by the iterator is not of the type expected by this {@code FeatureSet}.
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/AggregatedFeatureSet.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/AggregatedFeatureSet.java
index 6f6450f292..a1f0fd5964 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/AggregatedFeatureSet.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/AggregatedFeatureSet.java
@@ -122,15 +122,16 @@ abstract class AggregatedFeatureSet extends AbstractFeatureSet {
      * This method tries to find a CRS common to all feature sets.
      * If no common CRS can be found, then the envelope is absent.
      *
-     * <div class="note"><b>Implementation note:</b>
-     * this method is final because overriding it would invalidate the unwrapping of other {@code AggregatedFeatureSet} instances.
-     * If we wish to allow overrides in a future version, we would need to revisit {@link #getEnvelopes(List)} first.</div>
-     *
      * @return union of envelopes from all dependencies.
      * @throws DataStoreException if an error occurred while computing the envelope.
      */
     @Override
     public final Optional<Envelope> getEnvelope() throws DataStoreException {
+        /*
+         * This method is final because overriding it would invalidate the unwrapping
+         * of other `AggregatedFeatureSet` instances. If we wish to allow overrides
+         * in a future version, we would need to revisit `getEnvelopes(List)` first.
+         */
         synchronized (getSynchronizationLock()) {
             if (!isEnvelopeComputed) {
                 final List<Envelope> envelopes = new ArrayList<>();
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/GroupAsPolylineOperation.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/GroupAsPolylineOperation.java
index 8277244ea7..6303da7ccc 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/GroupAsPolylineOperation.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/gpx/GroupAsPolylineOperation.java
@@ -41,7 +41,7 @@ import org.opengis.feature.AttributeType;
  * This base class expects a sequence of {@code Point} or {@code Polyline} instances as input.
  * The single (Multi){@code Polyline} instance is re-computed every time this property is requested.
  *
- * <div class="note"><b>Examples:</b>
+ * <h2>Examples</h2>
  * <p><i>Polylines created from points:</i>
  * a boat that record it's position every hour.
  * The list of all positions is stored in an attribute with [0 … ∞] multiplicity.
@@ -53,7 +53,6 @@ import org.opengis.feature.AttributeType;
  * The list of all tracks is stored in an attribute with [0 … ∞] multiplicity.
  * This class will extract each track and create a polyline as a new attribute.
  * Any change applied to the tracks will be visible on the polyline.</p>
- * </div>
  *
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/FormattedWriter.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/FormattedWriter.java
index af97b7c499..35585bd14e 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/FormattedWriter.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/FormattedWriter.java
@@ -25,14 +25,14 @@ import org.apache.sis.internal.xml.StreamWriterDelegate;
 /**
  * Adds indentation to a XML output.
  *
- * <div class="note"><b>Design note:</b>
- * an alternative approach would have been to provide {@code startIdentation()} and {@code endIndentation()}
+ * <h2>Design note</h2>
+ * An alternative approach would have been to provide {@code startIdentation()} and {@code endIndentation()}
  * convenience methods in {@link StaxStreamWriter}, and let subclasses perform their own formatting. It would
  * reduce the need to try to guess some formatting aspects (e.g. whether to format on a single line or not).
  * However, that approach does not integrate very well with JAXB. The {@code Marshaller.JAXB_FORMATTED_OUTPUT}
  * property seems to be ignored when marshalling a fragment using {@code XMLStreamWriter}.
  * Even if that property was supported, we found no way to tell to JAXB to begin the indentation at some level
- * (for taking in account the indentation of the elements containing the fragment to marshal with JAXB).</div>
+ * (for taking in account the indentation of the elements containing the fragment to marshal with JAXB).
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 0.8
diff --git a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamReader.java b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamReader.java
index c72a202f02..54721897ce 100644
--- a/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamReader.java
+++ b/storage/sis-xmlstore/src/main/java/org/apache/sis/internal/storage/xml/stream/StaxStreamReader.java
@@ -415,9 +415,9 @@ public abstract class StaxStreamReader extends StaxStreamIO implements XMLStream
      *   <li>{@code Infinity} — a {@link Double#valueOf(String)} specific value.</li>
      * </ul>
      *
-     * <div class="note"><b>Note:</b>
-     * this method duplicates {@link javax.xml.bind.DatatypeConverter#parseDouble(String)} work,
-     * but avoid synchronization or volatile field cost of {@code DatatypeConverter}.</div>
+     * <h4>Implementation note</h4>
+     * This method duplicates {@link javax.xml.bind.DatatypeConverter#parseDouble(String)} work,
+     * but avoid synchronization or volatile field cost of {@code DatatypeConverter}.
      *
      * @param  value  the text to parse.
      * @return the floating point value for the given text.
@@ -447,10 +447,10 @@ parse:  switch (value.length()) {
      * {@link Boolean#parseBoolean(String)} with one extension: the "0" value is considered
      * as {@code false} and the "1" value as {@code true}.
      *
-     * <div class="note"><b>Note:</b>
-     * this method duplicates {@link javax.xml.bind.DatatypeConverter#parseBoolean(String)} work
+     * <h4>Implementation note</h4>
+     * This method duplicates {@link javax.xml.bind.DatatypeConverter#parseBoolean(String)} work
      * (except for its behavior in case of invalid value), but avoid synchronization or volatile
-     * field cost of {@code DatatypeConverter}.</div>
+     * field cost of {@code DatatypeConverter}.
      *
      * @param value  the string value to parse as a boolean.
      * @return true if the boolean is equal to "true" or "1".