wsi-rs 0.9.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wsi_rs-0.9.0/.cargo/config.toml +7 -0
- wsi_rs-0.9.0/.gitattributes +2 -0
- wsi_rs-0.9.0/.gitignore +61 -0
- wsi_rs-0.9.0/CHANGELOG.md +564 -0
- wsi_rs-0.9.0/Cargo.lock +1656 -0
- wsi_rs-0.9.0/Cargo.toml +155 -0
- wsi_rs-0.9.0/LICENSE +6 -0
- wsi_rs-0.9.0/LICENSE-APACHE +201 -0
- wsi_rs-0.9.0/LICENSE-MIT +21 -0
- wsi_rs-0.9.0/PKG-INFO +212 -0
- wsi_rs-0.9.0/README.md +480 -0
- wsi_rs-0.9.0/SECURITY.md +29 -0
- wsi_rs-0.9.0/SUPPLY_CHAIN.md +59 -0
- wsi_rs-0.9.0/api/wsi-rs-public-api-cuda.txt +1180 -0
- wsi_rs-0.9.0/api/wsi-rs-public-api-metal.txt +1187 -0
- wsi_rs-0.9.0/api/wsi-rs-public-api.txt +1146 -0
- wsi_rs-0.9.0/deny.toml +47 -0
- wsi_rs-0.9.0/docs/architecture.md +322 -0
- wsi_rs-0.9.0/examples/extract_jpeg_tiles.rs +163 -0
- wsi_rs-0.9.0/examples/tile_locations.rs +319 -0
- wsi_rs-0.9.0/pyproject.toml +33 -0
- wsi_rs-0.9.0/rust-toolchain.toml +5 -0
- wsi_rs-0.9.0/src/bin/svcache/tests.rs +237 -0
- wsi_rs-0.9.0/src/bin/svcache.rs +331 -0
- wsi_rs-0.9.0/src/core/batch/tests.rs +252 -0
- wsi_rs-0.9.0/src/core/batch.rs +325 -0
- wsi_rs-0.9.0/src/core/cache/flights/tests.rs +108 -0
- wsi_rs-0.9.0/src/core/cache/flights.rs +136 -0
- wsi_rs-0.9.0/src/core/cache/tests/tile_cache.rs +292 -0
- wsi_rs-0.9.0/src/core/cache.rs +452 -0
- wsi_rs-0.9.0/src/core/compression.rs +54 -0
- wsi_rs-0.9.0/src/core/decode_runtime/adaptive.rs +481 -0
- wsi_rs-0.9.0/src/core/decode_runtime/calibration.rs +363 -0
- wsi_rs-0.9.0/src/core/decode_runtime/reader.rs +243 -0
- wsi_rs-0.9.0/src/core/decode_runtime/tests.rs +1212 -0
- wsi_rs-0.9.0/src/core/decode_runtime.rs +430 -0
- wsi_rs-0.9.0/src/core/environment/tests.rs +11 -0
- wsi_rs-0.9.0/src/core/environment.rs +13 -0
- wsi_rs-0.9.0/src/core/execution_telemetry.rs +149 -0
- wsi_rs-0.9.0/src/core/file_identity/tests.rs +83 -0
- wsi_rs-0.9.0/src/core/file_identity.rs +118 -0
- wsi_rs-0.9.0/src/core/hash/tests.rs +161 -0
- wsi_rs-0.9.0/src/core/hash.rs +121 -0
- wsi_rs-0.9.0/src/core/limits/execution.rs +94 -0
- wsi_rs-0.9.0/src/core/limits/tests.rs +167 -0
- wsi_rs-0.9.0/src/core/limits.rs +386 -0
- wsi_rs-0.9.0/src/core/mod.rs +14 -0
- wsi_rs-0.9.0/src/core/positioned_file/tests.rs +8 -0
- wsi_rs-0.9.0/src/core/positioned_file.rs +50 -0
- wsi_rs-0.9.0/src/core/read_control/tests.rs +105 -0
- wsi_rs-0.9.0/src/core/read_control.rs +229 -0
- wsi_rs-0.9.0/src/core/registry/composition/display.rs +193 -0
- wsi_rs-0.9.0/src/core/registry/composition/fractional_u8/tests/reference.rs +185 -0
- wsi_rs-0.9.0/src/core/registry/composition/fractional_u8.rs +795 -0
- wsi_rs-0.9.0/src/core/registry/composition/integral/tests/reference.rs +78 -0
- wsi_rs-0.9.0/src/core/registry/composition/integral.rs +443 -0
- wsi_rs-0.9.0/src/core/registry/composition/mod.rs +18 -0
- wsi_rs-0.9.0/src/core/registry/composition/output.rs +183 -0
- wsi_rs-0.9.0/src/core/registry/composition/plan.rs +75 -0
- wsi_rs-0.9.0/src/core/registry/composition/region/tests/coalescing.rs +208 -0
- wsi_rs-0.9.0/src/core/registry/composition/region/tests.rs +895 -0
- wsi_rs-0.9.0/src/core/registry/composition/region.rs +700 -0
- wsi_rs-0.9.0/src/core/registry/composition/resolution.rs +210 -0
- wsi_rs-0.9.0/src/core/registry/composition/subtile/tests.rs +67 -0
- wsi_rs-0.9.0/src/core/registry/composition/subtile.rs +124 -0
- wsi_rs-0.9.0/src/core/registry/composition/tests/performance.rs +256 -0
- wsi_rs-0.9.0/src/core/registry/managed.rs +105 -0
- wsi_rs-0.9.0/src/core/registry/mod.rs +44 -0
- wsi_rs-0.9.0/src/core/registry/open_config.rs +246 -0
- wsi_rs-0.9.0/src/core/registry/open_options.rs +92 -0
- wsi_rs-0.9.0/src/core/registry/probe_cache/tests.rs +49 -0
- wsi_rs-0.9.0/src/core/registry/probe_cache.rs +63 -0
- wsi_rs-0.9.0/src/core/registry/registry_impl.rs +178 -0
- wsi_rs-0.9.0/src/core/registry/slide/budget.rs +171 -0
- wsi_rs-0.9.0/src/core/registry/slide/execution.rs +28 -0
- wsi_rs-0.9.0/src/core/registry/slide/locations/tests.rs +241 -0
- wsi_rs-0.9.0/src/core/registry/slide/locations.rs +209 -0
- wsi_rs-0.9.0/src/core/registry/slide/region.rs +144 -0
- wsi_rs-0.9.0/src/core/registry/slide/tests.rs +710 -0
- wsi_rs-0.9.0/src/core/registry/slide.rs +713 -0
- wsi_rs-0.9.0/src/core/registry/tests/cache.rs +209 -0
- wsi_rs-0.9.0/src/core/registry/tests/composition.rs +489 -0
- wsi_rs-0.9.0/src/core/registry/tests/control.rs +325 -0
- wsi_rs-0.9.0/src/core/registry/tests/display.rs +164 -0
- wsi_rs-0.9.0/src/core/registry/tests/mod.rs +7 -0
- wsi_rs-0.9.0/src/core/registry/tests/registry.rs +378 -0
- wsi_rs-0.9.0/src/core/registry/tests/slide.rs +404 -0
- wsi_rs-0.9.0/src/core/registry/tests/support.rs +153 -0
- wsi_rs-0.9.0/src/core/registry/traits.rs +487 -0
- wsi_rs-0.9.0/src/core/test_hooks.rs +157 -0
- wsi_rs-0.9.0/src/core/types/geometry.rs +480 -0
- wsi_rs-0.9.0/src/core/types/locations.rs +661 -0
- wsi_rs-0.9.0/src/core/types/mod.rs +20 -0
- wsi_rs-0.9.0/src/core/types/model.rs +1044 -0
- wsi_rs-0.9.0/src/core/types/pixels/display.rs +335 -0
- wsi_rs-0.9.0/src/core/types/pixels/ycbcr.rs +106 -0
- wsi_rs-0.9.0/src/core/types/pixels.rs +344 -0
- wsi_rs-0.9.0/src/core/types/requests.rs +437 -0
- wsi_rs-0.9.0/src/core/types/tests/display.rs +407 -0
- wsi_rs-0.9.0/src/core/types/tests/geometry.rs +301 -0
- wsi_rs-0.9.0/src/core/types/tests/j2k_format_tests.rs +19 -0
- wsi_rs-0.9.0/src/core/types/tests/locations.rs +254 -0
- wsi_rs-0.9.0/src/core/types/tests/mod.rs +6 -0
- wsi_rs-0.9.0/src/core/types/tests/model.rs +445 -0
- wsi_rs-0.9.0/src/core/types/tests/pixels.rs +131 -0
- wsi_rs-0.9.0/src/core/types/tests/requests.rs +414 -0
- wsi_rs-0.9.0/src/decode/jp2k/batch.rs +155 -0
- wsi_rs-0.9.0/src/decode/jp2k/cpu.rs +255 -0
- wsi_rs-0.9.0/src/decode/jp2k/cuda.rs +150 -0
- wsi_rs-0.9.0/src/decode/jp2k/device.rs +130 -0
- wsi_rs-0.9.0/src/decode/jp2k/metal.rs +72 -0
- wsi_rs-0.9.0/src/decode/jp2k/metal_batch.rs +367 -0
- wsi_rs-0.9.0/src/decode/jp2k/output.rs +46 -0
- wsi_rs-0.9.0/src/decode/jp2k/prepare.rs +179 -0
- wsi_rs-0.9.0/src/decode/jp2k/prepared_batch.rs +198 -0
- wsi_rs-0.9.0/src/decode/jp2k/tests/batch.rs +136 -0
- wsi_rs-0.9.0/src/decode/jp2k/tests/cooperative.rs +194 -0
- wsi_rs-0.9.0/src/decode/jp2k/tests/cpu.rs +116 -0
- wsi_rs-0.9.0/src/decode/jp2k/tests/device.rs +451 -0
- wsi_rs-0.9.0/src/decode/jp2k/tests/errors.rs +37 -0
- wsi_rs-0.9.0/src/decode/jp2k/tests/prepared_performance.rs +375 -0
- wsi_rs-0.9.0/src/decode/jp2k/tests.rs +83 -0
- wsi_rs-0.9.0/src/decode/jp2k.rs +55 -0
- wsi_rs-0.9.0/src/decode/jp2k_backend/tests.rs +27 -0
- wsi_rs-0.9.0/src/decode/jp2k_backend.rs +24 -0
- wsi_rs-0.9.0/src/decode/jp2k_codestream/tests/adapter.rs +65 -0
- wsi_rs-0.9.0/src/decode/jp2k_codestream/tests/reference.rs +62 -0
- wsi_rs-0.9.0/src/decode/jp2k_codestream.rs +75 -0
- wsi_rs-0.9.0/src/decode/jp2k_raster/tests.rs +197 -0
- wsi_rs-0.9.0/src/decode/jp2k_raster.rs +94 -0
- wsi_rs-0.9.0/src/decode/jpeg/dct_reemit/frame_writer.rs +152 -0
- wsi_rs-0.9.0/src/decode/jpeg/dct_reemit.rs +520 -0
- wsi_rs-0.9.0/src/decode/jpeg/frame.rs +489 -0
- wsi_rs-0.9.0/src/decode/jpeg/input.rs +677 -0
- wsi_rs-0.9.0/src/decode/jpeg/lossless/blocks.rs +164 -0
- wsi_rs-0.9.0/src/decode/jpeg/lossless/source.rs +341 -0
- wsi_rs-0.9.0/src/decode/jpeg/lossless/stack.rs +311 -0
- wsi_rs-0.9.0/src/decode/jpeg/lossless.rs +348 -0
- wsi_rs-0.9.0/src/decode/jpeg/tests/batch.rs +178 -0
- wsi_rs-0.9.0/src/decode/jpeg/tests/cpu.rs +270 -0
- wsi_rs-0.9.0/src/decode/jpeg/tests/errors.rs +31 -0
- wsi_rs-0.9.0/src/decode/jpeg/tests/input_repair.rs +175 -0
- wsi_rs-0.9.0/src/decode/jpeg/tests/lossless.rs +992 -0
- wsi_rs-0.9.0/src/decode/jpeg/tests.rs +213 -0
- wsi_rs-0.9.0/src/decode/jpeg.rs +476 -0
- wsi_rs-0.9.0/src/decode/jpegxr/tests.rs +68 -0
- wsi_rs-0.9.0/src/decode/jpegxr.rs +141 -0
- wsi_rs-0.9.0/src/decode/mod.rs +7 -0
- wsi_rs-0.9.0/src/decode/xml/tests.rs +135 -0
- wsi_rs-0.9.0/src/decode/xml.rs +192 -0
- wsi_rs-0.9.0/src/error/tests.rs +173 -0
- wsi_rs-0.9.0/src/error.rs +117 -0
- wsi_rs-0.9.0/src/formats/companion_path/tests.rs +43 -0
- wsi_rs-0.9.0/src/formats/companion_path.rs +68 -0
- wsi_rs-0.9.0/src/formats/composition.rs +51 -0
- wsi_rs-0.9.0/src/formats/dicom/backend.rs +100 -0
- wsi_rs-0.9.0/src/formats/dicom/decode.rs +603 -0
- wsi_rs-0.9.0/src/formats/dicom/frame_index/batch_io.rs +295 -0
- wsi_rs-0.9.0/src/formats/dicom/frame_index/model.rs +25 -0
- wsi_rs-0.9.0/src/formats/dicom/frame_index/offset_tables.rs +525 -0
- wsi_rs-0.9.0/src/formats/dicom/frame_index/raw_little_endian.rs +697 -0
- wsi_rs-0.9.0/src/formats/dicom/frame_index/token_stream.rs +116 -0
- wsi_rs-0.9.0/src/formats/dicom/frame_index/validation.rs +86 -0
- wsi_rs-0.9.0/src/formats/dicom/frame_index.rs +145 -0
- wsi_rs-0.9.0/src/formats/dicom/image/frame_decode.rs +316 -0
- wsi_rs-0.9.0/src/formats/dicom/image/frame_io.rs +397 -0
- wsi_rs-0.9.0/src/formats/dicom/image/frame_location.rs +216 -0
- wsi_rs-0.9.0/src/formats/dicom/image.rs +379 -0
- wsi_rs-0.9.0/src/formats/dicom/manifest/tests/directory_limit.rs +23 -0
- wsi_rs-0.9.0/src/formats/dicom/manifest.rs +789 -0
- wsi_rs-0.9.0/src/formats/dicom/metadata.rs +845 -0
- wsi_rs-0.9.0/src/formats/dicom/mod.rs +65 -0
- wsi_rs-0.9.0/src/formats/dicom/preflight.rs +433 -0
- wsi_rs-0.9.0/src/formats/dicom/reader/batch_plan.rs +229 -0
- wsi_rs-0.9.0/src/formats/dicom/reader/cpu.rs +203 -0
- wsi_rs-0.9.0/src/formats/dicom/reader/device.rs +142 -0
- wsi_rs-0.9.0/src/formats/dicom/reader/managed.rs +160 -0
- wsi_rs-0.9.0/src/formats/dicom/reader.rs +186 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/batch.rs +476 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/cache.rs +104 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/decode_formats.rs +986 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/device.rs +552 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/fixtures.rs +415 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/frame_boundaries.rs +456 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/frame_io.rs +521 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/frame_lifecycle.rs +521 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/frame_offsets.rs +472 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/image_cache.rs +355 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/locations.rs +620 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/manifest_building.rs +472 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/metadata_parsing.rs +503 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/mod.rs +120 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/preflight_levels.rs +140 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/runtime.rs +114 -0
- wsi_rs-0.9.0/src/formats/dicom/tests/twelve_bit.rs +490 -0
- wsi_rs-0.9.0/src/formats/dicom/transfer_syntax.rs +151 -0
- wsi_rs-0.9.0/src/formats/geometry/tests.rs +17 -0
- wsi_rs-0.9.0/src/formats/geometry.rs +76 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/ini.rs +127 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/jpeg/tests.rs +581 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/jpeg.rs +706 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/levels.rs +88 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/locations.rs +89 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/model.rs +77 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/slide/parse.rs +331 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/slide/tests/limits.rs +7 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/slide.rs +206 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/tests/backend.rs +375 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/tests/errors.rs +228 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/tests/fixtures.rs +162 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/tests/locations.rs +156 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms/tests.rs +144 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vms.rs +147 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vmu/ngr.rs +262 -0
- wsi_rs-0.9.0/src/formats/hamamatsu_vmu.rs +352 -0
- wsi_rs-0.9.0/src/formats/ini/tests.rs +58 -0
- wsi_rs-0.9.0/src/formats/ini.rs +100 -0
- wsi_rs-0.9.0/src/formats/mirax/batch.rs +137 -0
- wsi_rs-0.9.0/src/formats/mirax/helpers.rs +284 -0
- wsi_rs-0.9.0/src/formats/mirax/index/tests/budget.rs +16 -0
- wsi_rs-0.9.0/src/formats/mirax/index/tests/io.rs +119 -0
- wsi_rs-0.9.0/src/formats/mirax/index.rs +765 -0
- wsi_rs-0.9.0/src/formats/mirax/locations.rs +290 -0
- wsi_rs-0.9.0/src/formats/mirax/slide/parse.rs +699 -0
- wsi_rs-0.9.0/src/formats/mirax/slide.rs +250 -0
- wsi_rs-0.9.0/src/formats/mirax/tests/backend.rs +671 -0
- wsi_rs-0.9.0/src/formats/mirax/tests/errors.rs +294 -0
- wsi_rs-0.9.0/src/formats/mirax/tests/fixtures.rs +332 -0
- wsi_rs-0.9.0/src/formats/mirax/tests/locations.rs +414 -0
- wsi_rs-0.9.0/src/formats/mirax/tests/parser.rs +438 -0
- wsi_rs-0.9.0/src/formats/mirax/tests.rs +99 -0
- wsi_rs-0.9.0/src/formats/mirax.rs +518 -0
- wsi_rs-0.9.0/src/formats/mod.rs +14 -0
- wsi_rs-0.9.0/src/formats/olympus_vsi/pixels.rs +180 -0
- wsi_rs-0.9.0/src/formats/olympus_vsi/scene/header.rs +210 -0
- wsi_rs-0.9.0/src/formats/olympus_vsi/scene/index/tests/io.rs +102 -0
- wsi_rs-0.9.0/src/formats/olympus_vsi/scene/index.rs +304 -0
- wsi_rs-0.9.0/src/formats/olympus_vsi/scene.rs +158 -0
- wsi_rs-0.9.0/src/formats/olympus_vsi/slide.rs +153 -0
- wsi_rs-0.9.0/src/formats/olympus_vsi/tests/fixtures.rs +160 -0
- wsi_rs-0.9.0/src/formats/olympus_vsi/tests/locations.rs +152 -0
- wsi_rs-0.9.0/src/formats/olympus_vsi/tests.rs +813 -0
- wsi_rs-0.9.0/src/formats/olympus_vsi.rs +363 -0
- wsi_rs-0.9.0/src/formats/raw_jp2k/tests.rs +783 -0
- wsi_rs-0.9.0/src/formats/raw_jp2k.rs +601 -0
- wsi_rs-0.9.0/src/formats/svcache/build.rs +595 -0
- wsi_rs-0.9.0/src/formats/svcache/paths.rs +75 -0
- wsi_rs-0.9.0/src/formats/svcache/reader.rs +178 -0
- wsi_rs-0.9.0/src/formats/svcache/storage.rs +631 -0
- wsi_rs-0.9.0/src/formats/svcache/tests/build.rs +361 -0
- wsi_rs-0.9.0/src/formats/svcache/tests/fixtures.rs +48 -0
- wsi_rs-0.9.0/src/formats/svcache/tests/metadata.rs +238 -0
- wsi_rs-0.9.0/src/formats/svcache/tests/mod.rs +17 -0
- wsi_rs-0.9.0/src/formats/svcache/tests/probe.rs +107 -0
- wsi_rs-0.9.0/src/formats/svcache/tests/reader.rs +360 -0
- wsi_rs-0.9.0/src/formats/svcache/tests/storage.rs +200 -0
- wsi_rs-0.9.0/src/formats/svcache.rs +323 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/access.rs +413 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/model.rs +285 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/ndpi_offsets.rs +73 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/parse.rs +521 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/tests/arrays.rs +128 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/tests/chains.rs +205 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/tests/fixtures.rs +242 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/tests/headers.rs +136 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/tests/mod.rs +27 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/tests/model.rs +130 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/tests/ndpi.rs +48 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/tests/resolution.rs +102 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container/tests/scalars.rs +168 -0
- wsi_rs-0.9.0/src/formats/tiff_family/container.rs +9 -0
- wsi_rs-0.9.0/src/formats/tiff_family/error/tests.rs +178 -0
- wsi_rs-0.9.0/src/formats/tiff_family/error.rs +126 -0
- wsi_rs-0.9.0/src/formats/tiff_family/icc/tests.rs +88 -0
- wsi_rs-0.9.0/src/formats/tiff_family/icc.rs +92 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio/tests/detection.rs +63 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio/tests/fixtures.rs +143 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio/tests/interpretation.rs +698 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio/tests/mod.rs +4 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio/tests/properties.rs +92 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio.rs +329 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/argos/tests.rs +301 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/argos.rs +490 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/common.rs +325 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/generic/layout.rs +295 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/generic/support.rs +145 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/generic/tests.rs +766 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/generic.rs +35 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/huron/tests.rs +147 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/huron.rs +188 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/leica/tests.rs +640 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/leica.rs +813 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/mod.rs +422 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi/tests/corpus.rs +26 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi/tests/fixtures.rs +231 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi/tests/geometry.rs +105 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi/tests/interpretation.rs +414 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi/tests/mod.rs +4 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi.rs +733 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ome/layout.rs +597 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ome/metadata.rs +416 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ome/tests.rs +556 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ome.rs +50 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/philips/tests.rs +300 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/philips.rs +499 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/tests.rs +256 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/trestle/tests.rs +148 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/trestle.rs +281 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana/geometry.rs +296 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana/layout.rs +283 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana/metadata.rs +180 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana/stitching.rs +443 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana/tests.rs +781 -0
- wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana.rs +38 -0
- wsi_rs-0.9.0/src/formats/tiff_family/mod.rs +204 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/associated.rs +449 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/caches/tests/single_flight.rs +212 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/caches.rs +311 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/decode_batch.rs +71 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/dispatch.rs +791 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/image_ops.rs +237 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/jpeg_frame.rs +75 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/jpegxr.rs +58 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/locations/codec.rs +498 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/locations/ndpi.rs +429 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/locations/strips.rs +71 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/locations.rs +356 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/lossless_raw.rs +343 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/managed.rs +76 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/mod.rs +105 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/ndpi_batch.rs +181 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/ndpi_core.rs +716 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/ndpi_retile.rs +163 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/ndpi_tiles.rs +357 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/reader.rs +108 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/stripped_level.rs +451 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/subtiles.rs +271 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/synthetic.rs +691 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/associated.rs +560 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/cache.rs +166 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/codecs.rs +423 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/device.rs +204 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/dispatch.rs +842 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/fixtures/layout.rs +121 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/fixtures/mod.rs +7 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/fixtures/ndpi.rs +360 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/fixtures/tiff.rs +532 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/locations.rs +944 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/lossless_raw.rs +636 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/display.rs +348 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/errors.rs +453 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/fixtures.rs +88 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/locations.rs +494 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/mod.rs +6 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/payload.rs +410 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/restart.rs +235 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/synthetic.rs +798 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests.rs +36 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tiled_ifd/addressing.rs +503 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tiled_ifd/batch.rs +311 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tiled_ifd/codecs.rs +527 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tiled_ifd/raw.rs +314 -0
- wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tiled_ifd.rs +6 -0
- wsi_rs-0.9.0/src/formats/tiff_family/test_support.rs +365 -0
- wsi_rs-0.9.0/src/formats/tiff_family/tests/argos_huron.rs +66 -0
- wsi_rs-0.9.0/src/formats/tiff_family/tests/fixtures.rs +620 -0
- wsi_rs-0.9.0/src/formats/tiff_family/tests/mod.rs +4 -0
- wsi_rs-0.9.0/src/formats/tiff_family/tests/probe.rs +177 -0
- wsi_rs-0.9.0/src/formats/tiff_family/tests/read.rs +518 -0
- wsi_rs-0.9.0/src/formats/zeiss/attachments/tests.rs +123 -0
- wsi_rs-0.9.0/src/formats/zeiss/attachments.rs +377 -0
- wsi_rs-0.9.0/src/formats/zeiss/batch.rs +264 -0
- wsi_rs-0.9.0/src/formats/zeiss/composition.rs +110 -0
- wsi_rs-0.9.0/src/formats/zeiss/container/directory.rs +196 -0
- wsi_rs-0.9.0/src/formats/zeiss/container/format.rs +62 -0
- wsi_rs-0.9.0/src/formats/zeiss/container/metadata.rs +151 -0
- wsi_rs-0.9.0/src/formats/zeiss/container/mod.rs +123 -0
- wsi_rs-0.9.0/src/formats/zeiss/container/model.rs +362 -0
- wsi_rs-0.9.0/src/formats/zeiss/container/parser.rs +131 -0
- wsi_rs-0.9.0/src/formats/zeiss/container/payload.rs +235 -0
- wsi_rs-0.9.0/src/formats/zeiss/container/pixel.rs +207 -0
- wsi_rs-0.9.0/src/formats/zeiss/level.rs +90 -0
- wsi_rs-0.9.0/src/formats/zeiss/locations.rs +416 -0
- wsi_rs-0.9.0/src/formats/zeiss/metadata.rs +382 -0
- wsi_rs-0.9.0/src/formats/zeiss/preflight/directory.rs +83 -0
- wsi_rs-0.9.0/src/formats/zeiss/preflight/tests.rs +366 -0
- wsi_rs-0.9.0/src/formats/zeiss/preflight.rs +449 -0
- wsi_rs-0.9.0/src/formats/zeiss/raster.rs +256 -0
- wsi_rs-0.9.0/src/formats/zeiss/slide/parse.rs +447 -0
- wsi_rs-0.9.0/src/formats/zeiss/slide.rs +273 -0
- wsi_rs-0.9.0/src/formats/zeiss/source.rs +102 -0
- wsi_rs-0.9.0/src/formats/zeiss/subblock.rs +152 -0
- wsi_rs-0.9.0/src/formats/zeiss/tests/attachment_cases.rs +204 -0
- wsi_rs-0.9.0/src/formats/zeiss/tests/container_cases.rs +56 -0
- wsi_rs-0.9.0/src/formats/zeiss/tests/error_cases.rs +111 -0
- wsi_rs-0.9.0/src/formats/zeiss/tests/fixtures.rs +319 -0
- wsi_rs-0.9.0/src/formats/zeiss/tests/generated.rs +398 -0
- wsi_rs-0.9.0/src/formats/zeiss/tests/location_cases.rs +441 -0
- wsi_rs-0.9.0/src/formats/zeiss/tests/metadata_cases.rs +335 -0
- wsi_rs-0.9.0/src/formats/zeiss/tests/subblock_cache.rs +319 -0
- wsi_rs-0.9.0/src/formats/zeiss/tests/tile_cases.rs +602 -0
- wsi_rs-0.9.0/src/formats/zeiss/tests.rs +191 -0
- wsi_rs-0.9.0/src/formats/zeiss/tiles.rs +245 -0
- wsi_rs-0.9.0/src/formats/zeiss.rs +102 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/compound.rs +127 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/header.rs +248 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/locations.rs +225 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/model.rs +89 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/mosaic.rs +151 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/sectors.rs +509 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/slide.rs +501 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tags.rs +104 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/backend.rs +235 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/errors.rs +213 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/fixtures.rs +343 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/header.rs +64 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/locations.rs +581 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/mosaic.rs +9 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/slide.rs +46 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/tags.rs +55 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/tiles.rs +7 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tests.rs +4 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi/tiles.rs +345 -0
- wsi_rs-0.9.0/src/formats/zeiss_zvi.rs +101 -0
- wsi_rs-0.9.0/src/lib.rs +154 -0
- wsi_rs-0.9.0/src/output/cuda/tests.rs +105 -0
- wsi_rs-0.9.0/src/output/cuda.rs +265 -0
- wsi_rs-0.9.0/src/output/download.rs +181 -0
- wsi_rs-0.9.0/src/output/metal/interop.rs +563 -0
- wsi_rs-0.9.0/src/output/metal/prewarm.j2k +0 -0
- wsi_rs-0.9.0/src/output/metal/session.rs +176 -0
- wsi_rs-0.9.0/src/output/metal/tests/address.rs +138 -0
- wsi_rs-0.9.0/src/output/metal/tests/conversion.rs +235 -0
- wsi_rs-0.9.0/src/output/metal/tests/download.rs +127 -0
- wsi_rs-0.9.0/src/output/metal/tests/perf.rs +132 -0
- wsi_rs-0.9.0/src/output/metal/tests.rs +35 -0
- wsi_rs-0.9.0/src/output/metal/tile.rs +141 -0
- wsi_rs-0.9.0/src/output/metal/ycbcr.metal +77 -0
- wsi_rs-0.9.0/src/output/metal/ycbcr.rs +311 -0
- wsi_rs-0.9.0/src/output/metal/ycbcr_perf.metal +19 -0
- wsi_rs-0.9.0/src/output/metal/ycbcr_probe.metal +8 -0
- wsi_rs-0.9.0/src/output/metal.rs +20 -0
- wsi_rs-0.9.0/src/output/mod.rs +8 -0
- wsi_rs-0.9.0/src/properties/tests.rs +53 -0
- wsi_rs-0.9.0/src/properties.rs +81 -0
- wsi_rs-0.9.0/src/slide_candidates.rs +22 -0
- wsi_rs-0.9.0/src/test_support.rs +165 -0
- wsi_rs-0.9.0/supply-chain/audits.toml +356 -0
- wsi_rs-0.9.0/supply-chain/config.toml +674 -0
- wsi_rs-0.9.0/supply-chain/imports.lock +649 -0
- wsi_rs-0.9.0/test-support/Cargo.toml +26 -0
- wsi_rs-0.9.0/test-support/src/corpus.rs +1033 -0
- wsi_rs-0.9.0/test-support/src/lib.rs +2 -0
- wsi_rs-0.9.0/test-support/src/openslide.rs +1181 -0
- wsi_rs-0.9.0/tests/argos_huron.rs +186 -0
- wsi_rs-0.9.0/tests/candidate_paths.rs +37 -0
- wsi_rs-0.9.0/tests/color_regression.rs +310 -0
- wsi_rs-0.9.0/tests/czi_performance.rs +101 -0
- wsi_rs-0.9.0/tests/decode_performance.rs +410 -0
- wsi_rs-0.9.0/tests/dicom_12bit.rs +284 -0
- wsi_rs-0.9.0/tests/dicom_parity.rs +228 -0
- wsi_rs-0.9.0/tests/fixtures/dicom_12bit/README.md +30 -0
- wsi_rs-0.9.0/tests/fixtures/dicom_12bit/mono2-extended.dcm +0 -0
- wsi_rs-0.9.0/tests/fixtures/dicom_12bit/mono2-extended.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/dicom_12bit/mono2-progressive.dcm +0 -0
- wsi_rs-0.9.0/tests/fixtures/dicom_12bit/mono2-progressive.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/dicom_12bit/ybr422-extended.dcm +0 -0
- wsi_rs-0.9.0/tests/fixtures/dicom_12bit/ybr422-extended.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/dicom_12bit/ybr422-progressive.dcm +0 -0
- wsi_rs-0.9.0/tests/fixtures/dicom_12bit/ybr422-progressive.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/README.md +51 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/generate.py +261 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/openjph_rgb_u8_53.j2k +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/openjph_rgb_u8_53.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/openjph_rgb_u8_53.r1.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/openjph_rgb_u8_53.r2.ppm +4 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_mct.j2k +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_mct.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_mct.r1.ppm +4 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_mct.r2.ppm +4 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_nomct.j2k +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_nomct.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_nomct.r1.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_nomct.r2.ppm +4 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_rct.j2k +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_rct.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_rct.r1.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_rct.r2.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/truncated_tall_tag_tree.j2k +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_420.j2k +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_420.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_420.wsi-rgb +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_422.j2k +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_422.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_422.wsi-rgb +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_444.j2k +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_444.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_444.wsi-rgb +0 -0
- wsi_rs-0.9.0/tests/fixtures/jpeg/README.md +21 -0
- wsi_rs-0.9.0/tests/fixtures/jpeg/baseline_420_16x16.jpg +0 -0
- wsi_rs-0.9.0/tests/fixtures/jpeg/baseline_420_16x16.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jpeg/baseline_420_16x16.r2.ppm +4 -0
- wsi_rs-0.9.0/tests/fixtures/jpeg/progressive_8x8.jpg +0 -0
- wsi_rs-0.9.0/tests/fixtures/jpeg/progressive_8x8.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/jpeg/progressive_8x8.r1.ppm +4 -0
- wsi_rs-0.9.0/tests/fixtures/jxr/README.md +20 -0
- wsi_rs-0.9.0/tests/fixtures/jxr/rgb.czi +0 -0
- wsi_rs-0.9.0/tests/fixtures/jxr/rgb.jxr +0 -0
- wsi_rs-0.9.0/tests/fixtures/jxr/rgb.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/parity_corpus.private.toml.example +69 -0
- wsi_rs-0.9.0/tests/fixtures/parity_corpus.public.toml +461 -0
- wsi_rs-0.9.0/tests/fixtures/public_dicom/README.md +35 -0
- wsi_rs-0.9.0/tests/fixtures/public_dicom/progressive-sof2.dcm +0 -0
- wsi_rs-0.9.0/tests/fixtures/public_dicom/progressive-sof2.ppm +4 -0
- wsi_rs-0.9.0/tests/fixtures/public_dicom/ybr-ict.dcm +0 -0
- wsi_rs-0.9.0/tests/fixtures/public_dicom/ybr-ict.ppm +0 -0
- wsi_rs-0.9.0/tests/fixtures/public_dicom/ybr-rct.dcm +0 -0
- wsi_rs-0.9.0/tests/fixtures/public_dicom/ybr-rct.ppm +148 -12
- wsi_rs-0.9.0/tests/fixtures/public_dicom/ybr-rct.svcache +0 -0
- wsi_rs-0.9.0/tests/hamamatsu_vmu.rs +441 -0
- wsi_rs-0.9.0/tests/j2k_parity.rs +139 -0
- wsi_rs-0.9.0/tests/metal_edge_conformance.rs +64 -0
- wsi_rs-0.9.0/tests/metal_surface_smoke.rs +55 -0
- wsi_rs-0.9.0/tests/openslide_compare.rs +517 -0
- wsi_rs-0.9.0/tests/openslide_parity.rs +355 -0
- wsi_rs-0.9.0/tests/openslide_test_support/mod.rs +1 -0
- wsi_rs-0.9.0/tests/panning_performance.rs +362 -0
- wsi_rs-0.9.0/tests/real_wsi_behavior.rs +347 -0
- wsi_rs-0.9.0/tests/repo_integrity.rs +6 -0
- wsi_rs-0.9.0/tests/repo_policy/hygiene.rs +244 -0
- wsi_rs-0.9.0/tests/repo_policy/support.rs +52 -0
- wsi_rs-0.9.0/tests/repo_policy/unsafe_syntax.rs +252 -0
- wsi_rs-0.9.0/tests/support/bench.rs +61 -0
- wsi_rs-0.9.0/tests/support/compare.rs +102 -0
- wsi_rs-0.9.0/tests/support/corpus.rs +74 -0
- wsi_rs-0.9.0/tests/support/mod.rs +33 -0
- wsi_rs-0.9.0/tests/support/openslide_shim.rs +6 -0
- wsi_rs-0.9.0/tests/support/oracles.rs +1033 -0
- wsi_rs-0.9.0/tests/support_unit.rs +400 -0
- wsi_rs-0.9.0/tests/vendor_reference.rs +106 -0
- wsi_rs-0.9.0/tests/zeiss_czi.rs +126 -0
- wsi_rs-0.9.0/tests/zeiss_zvi.rs +185 -0
- wsi_rs-0.9.0/wsi-rs-python/Cargo.toml +31 -0
- wsi_rs-0.9.0/wsi-rs-python/README.md +190 -0
- wsi_rs-0.9.0/wsi-rs-python/build.rs +6 -0
- wsi_rs-0.9.0/wsi-rs-python/src/lib.rs +302 -0
- wsi_rs-0.9.0/wsi-rs-python/src/locations.rs +397 -0
- wsi_rs-0.9.0/wsi-rs-python/src/metadata.rs +120 -0
- wsi_rs-0.9.0/wsi-rs-python/src/tiles.rs +171 -0
- wsi_rs-0.9.0/wsi-rs-python/tests/test_j2k.py +60 -0
- wsi_rs-0.9.0/wsi-rs-python/tests/test_locations.py +323 -0
- wsi_rs-0.9.0/wsi-rs-python/tests/test_reader.py +193 -0
- wsi_rs-0.9.0/wsi-rs-python/wsi_rs.pyi +110 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
[alias]
|
|
2
|
+
xtask = "run --locked --package xtask --target-dir target/xtask --"
|
|
3
|
+
run-checks = "xtask validate"
|
|
4
|
+
# First-party J2K and JXR follow their main branches. This moves Cargo.lock to
|
|
5
|
+
# their newest commits and leaves every other dependency as locked; CI runs it
|
|
6
|
+
# before every build. For the fuzz workspace, add `--manifest-path fuzz/Cargo.toml`.
|
|
7
|
+
latest = "update -p j2k -p jxr"
|
wsi_rs-0.9.0/.gitignore
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
target/
|
|
2
|
+
/.DS_Store
|
|
3
|
+
**/.DS_Store
|
|
4
|
+
bench/results/
|
|
5
|
+
lcov.info
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.py[cod]
|
|
8
|
+
|
|
9
|
+
# Local tools, credentials, and editor state
|
|
10
|
+
.DS_Store
|
|
11
|
+
.codex/
|
|
12
|
+
.claude/
|
|
13
|
+
.local-docs/
|
|
14
|
+
# Session reports belong in .local-docs/, never in tracked docs.
|
|
15
|
+
/docs/audit/
|
|
16
|
+
/docs/audits/
|
|
17
|
+
.local-tools/
|
|
18
|
+
.codex-security-*/
|
|
19
|
+
reasonix.toml
|
|
20
|
+
.env
|
|
21
|
+
.env.*
|
|
22
|
+
!.env.example
|
|
23
|
+
!.env.sample
|
|
24
|
+
*.key
|
|
25
|
+
*.pem
|
|
26
|
+
*.p12
|
|
27
|
+
*.pfx
|
|
28
|
+
.vscode/
|
|
29
|
+
.idea/
|
|
30
|
+
*.swp
|
|
31
|
+
|
|
32
|
+
# Local dependencies, build outputs, and caches
|
|
33
|
+
node_modules/
|
|
34
|
+
.venv*/
|
|
35
|
+
.pytest_cache/
|
|
36
|
+
.ruff_cache/
|
|
37
|
+
/dist/
|
|
38
|
+
/coverage/
|
|
39
|
+
lcov*.info
|
|
40
|
+
*.profraw
|
|
41
|
+
*.profdata
|
|
42
|
+
*.log
|
|
43
|
+
|
|
44
|
+
# Private writing and execution plans; maintained outside the software repos
|
|
45
|
+
/manuscript/
|
|
46
|
+
/grant/
|
|
47
|
+
/paper/
|
|
48
|
+
/papers/
|
|
49
|
+
/docs/manuscript/
|
|
50
|
+
/docs/papers/
|
|
51
|
+
/docs/benchmarks/paper/
|
|
52
|
+
/docs/plans/
|
|
53
|
+
/docs/workplans/
|
|
54
|
+
/docs/refactor/
|
|
55
|
+
/docs/superpowers/
|
|
56
|
+
/MIGRATION.md
|
|
57
|
+
/migration.md
|
|
58
|
+
*.docx
|
|
59
|
+
*.pptx
|
|
60
|
+
*.pdf
|
|
61
|
+
/tests/fixtures/parity_corpus.private.toml
|
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: MIT OR Apache-2.0 -->
|
|
2
|
+
|
|
3
|
+
# Changelog
|
|
4
|
+
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
## [0.9.0] - 2026-10-29
|
|
8
|
+
|
|
9
|
+
wsi-rs is on crates.io again, built on J2K 0.13.1 and JXR 0.4, and the Python
|
|
10
|
+
bindings are on PyPI as `wsi-rs`.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Opens TIFFs stored in strips when the largest image is 8-bit grayscale or
|
|
15
|
+
RGB, uncompressed or compressed with LZW, Deflate, Zstd or JPEG, including
|
|
16
|
+
YCbCr JPEG and the horizontal predictor. Before, only a single-image
|
|
17
|
+
uncompressed 8-bit RGB TIFF opened. A tile read decodes only the strips it
|
|
18
|
+
covers, so images over the 128 MiB decoded-image limit open; each compressed
|
|
19
|
+
strip must fit it. Other images in the file become associated images.
|
|
20
|
+
16-bit, palette, CMYK and alpha strip images still return an error, and a
|
|
21
|
+
strip-only `.vsi` file without its companion folder is not opened as a
|
|
22
|
+
plain TIFF.
|
|
23
|
+
- `Slide::tile_location` and `Slide::level_tile_locations` report where tiles'
|
|
24
|
+
encoded bytes are stored: the file, byte ranges, framing (`Standalone`,
|
|
25
|
+
`JpegTables`, `BarePayload` or `Prefixed`) and the codec parameters a decoder
|
|
26
|
+
outside wsi-rs needs, or that a tile is `Absent` or `NotAddressable` and why.
|
|
27
|
+
`EncodedUnit::assemble` turns the bytes at those ranges into a standalone
|
|
28
|
+
stream; for a unit that covers its whole tile it equals what
|
|
29
|
+
`read_raw_compressed_tile` returns, except for bare payloads that raw reads
|
|
30
|
+
return as reordered or decoded samples. A unit a tile is cut from assembles
|
|
31
|
+
to the whole stored image. Every range is checked against the file size,
|
|
32
|
+
and a level listing stays within the tile-index limit. Every slide format
|
|
33
|
+
reports locations; `.svcache` files, which hold wsi-rs's own decoded tiles,
|
|
34
|
+
do not. ([#27](https://github.com/frames-sg/wsi-rs/issues/27))
|
|
35
|
+
- `read_raw_compressed_tile` covers tiles it used to reject. A tile cut from a
|
|
36
|
+
larger stored JPEG (Ventana subtiles, NDPI levels without restart markers,
|
|
37
|
+
MIRAX and CZI crops, strip-based TIFFs, ZVI windows) is cropped in the
|
|
38
|
+
coefficient domain, as `jpegtran -crop` does: quantized coefficients are kept
|
|
39
|
+
and only the entropy coding is redone. When the tile origin is not on the
|
|
40
|
+
JPEG's MCU grid, the crop starts at the previous MCU boundary and the new
|
|
41
|
+
`RawCompressedTile::tile_region` locates the tile. A crop holds the whole
|
|
42
|
+
source unit's DCT coefficients, about 12 bytes per pixel for a 4:4:4 JPEG,
|
|
43
|
+
and its working set must fit the new `SlideLimits::lossless_crop_bytes`
|
|
44
|
+
(256 MiB by default). A crop that does not fit returns the whole stored
|
|
45
|
+
JPEG unchanged, made standalone as `tile_location` describes it, with
|
|
46
|
+
`tile_region` locating the tile, as JPEG 2000 and JPEG XR crops do;
|
|
47
|
+
`jpegtran -crop` can cut it. So does a crop whose output would exceed the
|
|
48
|
+
encoded-unit limit. Apart from the usual admission limits, only a stored
|
|
49
|
+
JPEG over the encoded-unit limit, or a tile spanning several JPEG strips
|
|
50
|
+
whose crop does not fit, returns `WsiError::ResourceLimit`. TIFF LZW,
|
|
51
|
+
Deflate, Zstd, uncompressed and JPEG XR tiles, DICOM native and RLE frames, MIRAX PNG and
|
|
52
|
+
BMP records, CZI subblocks, Hamamatsu VMU and Zeiss ZVI planes now pass
|
|
53
|
+
through. Tiles of lossless codecs that cannot be returned as stored come
|
|
54
|
+
back as exact uncompressed samples.
|
|
55
|
+
- `SlideLimits::lossless_crop_bytes` and `with_lossless_crop_bytes` set the
|
|
56
|
+
working set of a lossless JPEG crop in a raw tile read, 256 MiB by default,
|
|
57
|
+
so 4096x4096 4:4:4 sources and large NDPI levels crop. Raw reads that may
|
|
58
|
+
crop reserve it as per-operation transient work, so it must stay within
|
|
59
|
+
`operation_transient_bytes` (384 MiB); decoded reads and other raw reads
|
|
60
|
+
do not reserve it. `encoded_unit_bytes` still caps every stored unit.
|
|
61
|
+
Custom `SlideReader`s admitted at the encoded-unit limit can ask for more
|
|
62
|
+
for a raw read with `SlideReader::raw_compressed_tile_reservation_hint`.
|
|
63
|
+
- Python: `Slide.tile_location`, `Slide.level_tile_locations` and
|
|
64
|
+
`CompressedTile.tile_region`, with a kerchunk-style reference example in the
|
|
65
|
+
Python README. The `tile_locations` example checks reported ranges against
|
|
66
|
+
`read_raw_compressed_tile`.
|
|
67
|
+
- `Compression::Png`, `Compression::Bmp` and
|
|
68
|
+
`EncodedTilePhotometricInterpretation::Monochrome1`.
|
|
69
|
+
- Python wheels: publishing a GitHub release builds abi3 wheels for Python
|
|
70
|
+
3.10 and later (Linux x86_64 and aarch64 on glibc 2.28 or newer, macOS
|
|
71
|
+
arm64 and x86_64, Windows x64) and an sdist. Each wheel is tested, then all
|
|
72
|
+
of them are attached to the release and published to PyPI as `wsi-rs`
|
|
73
|
+
through trusted publishing, so `pip install wsi-rs` works. Pull requests
|
|
74
|
+
that touch the bindings build and test the same wheels.
|
|
75
|
+
|
|
76
|
+
### Changed
|
|
77
|
+
|
|
78
|
+
- Raw DICOM `MONOCHROME1` tiles and raw grayscale TIFF JPEG tiles tagged
|
|
79
|
+
MinIsWhite report `EncodedTilePhotometricInterpretation::Monochrome1`
|
|
80
|
+
instead of `Monochrome2`.
|
|
81
|
+
- Raw TIFF JPEG and JPEG 2000 edge tiles report the size of the encoded
|
|
82
|
+
image, which usually keeps the whole stored tile, with `tile_region`
|
|
83
|
+
marking the clipped tile in it. They used to report the clipped size, which
|
|
84
|
+
did not match the image the bytes decode to. A JPEG or codestream smaller
|
|
85
|
+
than its tile returns an error.
|
|
86
|
+
- Raw Hamamatsu VMS tiles carry a JPEG header with the restart interval
|
|
87
|
+
cleared, the same header `tile_location` reports. Only that header field
|
|
88
|
+
changes; decoded pixels are unchanged.
|
|
89
|
+
- J2K dependencies follow the J2K `main` branch instead of the 0.8.1
|
|
90
|
+
maintenance revision. Main carries the CUDA packet-header fix along with
|
|
91
|
+
later decoder fixes and speedups.
|
|
92
|
+
- JXR follows its `main` branch, which builds on J2K `main`, so wsi-rs compiles
|
|
93
|
+
one J2K instead of also J2K 0.12 for JXR. It requires JXR 0.4, the release
|
|
94
|
+
line built on J2K 0.13.
|
|
95
|
+
- Builds take the newest J2K and JXR `main` commits: `cargo latest` updates
|
|
96
|
+
them, and every CI job but packaging runs it before building; packaging
|
|
97
|
+
checks the committed `Cargo.lock`. cargo-vet treats J2K and JXR
|
|
98
|
+
as first-party code, reviewed in their own repositories, instead of
|
|
99
|
+
requiring an audit for each revision.
|
|
100
|
+
- The J2K dependencies require 0.13.1, so a published wsi-rs resolves at
|
|
101
|
+
least J2K 0.13.1, with its CPU and Metal batch region fixes, instead of
|
|
102
|
+
accepting 0.13.0.
|
|
103
|
+
- Raw `.j2k` and `.j2c` levels with a side over 4096 pixels are read as
|
|
104
|
+
1024 x 1024 tiles, each a region decode, instead of one tile covering the
|
|
105
|
+
level, so a read decodes only the tiles it covers. A tile batch decodes its
|
|
106
|
+
tiles serially side by side, where J2K decodes Tier-1 in bands as the inverse
|
|
107
|
+
DWT reads them. Smaller levels still decode whole. Metal decodes tile batches
|
|
108
|
+
at reductions up to 3 as one batch of regions sharing the codestream's bytes;
|
|
109
|
+
deeper levels decode on the CPU. CUDA decoding is offered only when the full
|
|
110
|
+
resolution is one tile. A raw read of a full-resolution tile returns the
|
|
111
|
+
whole codestream with `tile_region` locating the tile; reduced resolutions
|
|
112
|
+
have no raw read.
|
|
113
|
+
|
|
114
|
+
### Fixed
|
|
115
|
+
|
|
116
|
+
- NDPI DCT retiling returns an error for an AC coefficient outside the
|
|
117
|
+
8-bit baseline range, which it encoded wrongly, and for corrupt block grids,
|
|
118
|
+
where it copied blocks wrapped from the next row.
|
|
119
|
+
- Merging TIFF `JPEGTables` into a tile shorter than its SOI marker returns
|
|
120
|
+
an error instead of panicking.
|
|
121
|
+
- Raw `.j2k` and `.j2c` files whose decoded image exceeds 128 MiB, about 44.7
|
|
122
|
+
megapixels of RGB, open. The decoded-image limit now bounds each decoded
|
|
123
|
+
tile; it rejected the whole image at open. Reduced levels of such files
|
|
124
|
+
decode, where they failed against the full-resolution size.
|
|
125
|
+
- A tile read from an uncompressed strip-based RGB TIFF reads only the rows it
|
|
126
|
+
covers. It read the whole image, and read it again for every tile when the
|
|
127
|
+
image was larger than the format cache.
|
|
128
|
+
- Some complete LZW-compressed TIFF tiles and strips failed to decode as
|
|
129
|
+
truncated: J2K's LZW decoder stopped when the input ran out, before reading
|
|
130
|
+
the end code in its last bytes. J2K `main` reads to the end code.
|
|
131
|
+
|
|
132
|
+
## [0.8.1] - 2026-10-27
|
|
133
|
+
|
|
134
|
+
This is a GitHub source release. The fixed J2K dependency is pinned to a Git
|
|
135
|
+
commit; 0.8.1 is not published on crates.io.
|
|
136
|
+
|
|
137
|
+
### Added
|
|
138
|
+
|
|
139
|
+
- Experimental Python reader bindings expose slide metadata, tile coverage,
|
|
140
|
+
and ordered compressed-tile batches with JPEG color hints. Reads release
|
|
141
|
+
the GIL; each DataLoader worker opens its own slide. Pixel decoding and
|
|
142
|
+
tensor output remain in the separate `j2k` extension.
|
|
143
|
+
- Reads single-file OME-TIFF. Pyramid levels come from each plane's SubIFDs;
|
|
144
|
+
channels, Z planes and time points follow the OME-XML `TiffData` mapping, and
|
|
145
|
+
`label`, `macro` and `thumbnail` images become associated images. Multi-file
|
|
146
|
+
datasets return an error.
|
|
147
|
+
- Opt-in cooperative CPU and Metal JPEG 2000 batch decoding through
|
|
148
|
+
`MetalBackendSessions::with_cooperative_cpu_workers`. Cloned sessions share
|
|
149
|
+
one cooperative slot and fall back to ordinary Metal while it is busy.
|
|
150
|
+
Automatic slide acceleration retains its existing policy.
|
|
151
|
+
- `Slide::level_encoding` and `Slide::associated_encoding` report how source
|
|
152
|
+
pixels are stored: the codec, decoded and stored sizes, and
|
|
153
|
+
`SourceEncoding::lossy` when the transfer syntax or format establishes it.
|
|
154
|
+
DICOM reports each associated image and each level, summed over the level's
|
|
155
|
+
files when they share codec and lossiness. Both return an error when the
|
|
156
|
+
source sizes cannot be read.
|
|
157
|
+
- `Slide::tile_is_present` reports whether metadata marks a tile as acquired,
|
|
158
|
+
without decoding it: tiled TIFF (a zero byte count is absent), Zeiss CZI and
|
|
159
|
+
sparsely tiled DICOM answer; other formats return `None`, to be treated as
|
|
160
|
+
present.
|
|
161
|
+
- DICOM reads images stored in 16-bit words with 9 to 16 bits stored, in the
|
|
162
|
+
native, RLE, lossless JPEG, JPEG 2000 and HTJ2K transfer syntaxes, as `Uint16`
|
|
163
|
+
samples. RLE sources report `Compression::Rle`.
|
|
164
|
+
- DICOM slides list the files behind each level and associated image in the
|
|
165
|
+
`dicom.level.<n>.source-files` and `dicom.associated.<name>.source-file`
|
|
166
|
+
properties.
|
|
167
|
+
|
|
168
|
+
### Changed
|
|
169
|
+
|
|
170
|
+
- Uses J2K 0.13.0 with its CUDA packet-header race fix backported and pinned
|
|
171
|
+
to an exact Git revision. This includes the TIFF LZW decoder and updated
|
|
172
|
+
JPEG integrity checks. Direct Zstandard use moves to 0.14.3.
|
|
173
|
+
- Removes the external CZI test oracle and its dependency. CZI parsing and
|
|
174
|
+
corpus sampling use the native reader.
|
|
175
|
+
- Uses JXR 0.3.1, whose faster CPU entropy decoding and direct coefficient
|
|
176
|
+
storage speed up JPEG XR tiles in Zeiss CZI slides and tiled TIFF files.
|
|
177
|
+
Decoded pixels are unchanged.
|
|
178
|
+
- TIFF files have their SubIFDs parsed when opened. A TIFF whose SubIFDs tag
|
|
179
|
+
points at an IFD that was already parsed, or outside the file, fails to open.
|
|
180
|
+
- `CpuTile::to_rgba`, and so `Slide::read_region_rgba` on uncompressed YCbCr
|
|
181
|
+
TIFF tiles, converts YCbCr with the lookup tables that OpenSlide and the
|
|
182
|
+
JPEG 2000 path use instead of floating-point math. About 0.08% of YCbCr
|
|
183
|
+
values change by 1 in one channel, to match OpenSlide.
|
|
184
|
+
- Region reads such as `Slide::read_region` report `PlaneOutOfRange` with the
|
|
185
|
+
last valid plane index as `max`, as MIRAX, VSI and ZVI tile reads do,
|
|
186
|
+
instead of the axis count.
|
|
187
|
+
|
|
188
|
+
### Fixed
|
|
189
|
+
|
|
190
|
+
- JPEG XR tiles decode inside the codec thread pool. A caller holding slide
|
|
191
|
+
admission no longer waits on global Rayon workers blocked on the same slide.
|
|
192
|
+
- TIFF files whose level areas exceed 64 bits no longer panic in debug builds
|
|
193
|
+
or order pyramid levels wrongly.
|
|
194
|
+
- Generic tiled TIFF files read each level's own JPEG tables, falling back to
|
|
195
|
+
the first level's, instead of using the first level's tables for every level.
|
|
196
|
+
- DICOM files with an SV or UV element before Pixel Data are indexed by the
|
|
197
|
+
fast frame scanner instead of falling back to the slower parser.
|
|
198
|
+
- JPEG tiles decoded with forced dimensions patch the frame header itself, not
|
|
199
|
+
`FF Cx` bytes inside an earlier APPn, DQT or COM segment.
|
|
200
|
+
- MIRAX data files and the VMS macro image must still be the files the slide
|
|
201
|
+
was opened on. A read after one is replaced fails instead of reading the new
|
|
202
|
+
file, and `Slide::associated_encoding` for a replaced VMS macro fails instead
|
|
203
|
+
of reporting the new file's size.
|
|
204
|
+
- `.svcache` errors about a corrupt cache name the cache file, not the source
|
|
205
|
+
slide or an empty path, and a tile payload that cannot be read reports
|
|
206
|
+
`IoWithPath` with the cache file instead of a bare `Io` error, as does
|
|
207
|
+
probing a cache file that cannot be opened. A bad scene or
|
|
208
|
+
series in an `.svcache` read or a partial build reports `SceneOutOfRange` or
|
|
209
|
+
`SeriesOutOfRange` with the real count, not `LevelOutOfRange` with a count
|
|
210
|
+
of 0.
|
|
211
|
+
- Partial `.svcache` builds that merge an existing cache copy nothing from a
|
|
212
|
+
level whose dimensions or tile grid changed, instead of copying its tiles to
|
|
213
|
+
the wrong positions.
|
|
214
|
+
- DICOM tile reads, raw tile reads and `Slide::tile_is_present` reject a
|
|
215
|
+
scene, series or plane the slide doesn't have with `SceneOutOfRange`,
|
|
216
|
+
`SeriesOutOfRange` or `PlaneOutOfRange`, instead of answering for the first
|
|
217
|
+
one. `Slide::tile_codec_kind` reports `TileCodecKind::Other` for them.
|
|
218
|
+
- Zeiss CZI tile reads report a series the slide doesn't have as
|
|
219
|
+
`SeriesOutOfRange` with the real count, instead of `SceneOutOfRange`.
|
|
220
|
+
- Opening a VMU slide whose macro image size cannot be read reports
|
|
221
|
+
`IoWithPath` with the macro file instead of a bare `Io` error.
|
|
222
|
+
- XML metadata parsing applies its nesting-depth limit to self-closing
|
|
223
|
+
elements too, not only to elements with content.
|
|
224
|
+
- CUDA JPEG 2000 batches size their decode windows at 4 bytes per pixel, like
|
|
225
|
+
Metal, so a window no longer admits about a third more pixels than its
|
|
226
|
+
4 MiB target.
|
|
227
|
+
- TIFF associated images (Aperio, Huron, ARGOS, Leica) whose SamplesPerPixel
|
|
228
|
+
tag is 0 or above 65535 report a channel count clamped to 1–65535 instead of
|
|
229
|
+
a wrapped value such as 0.
|
|
230
|
+
- A missing tile in a TIFF slide no longer allocates an unbounded blank tile;
|
|
231
|
+
blank tiles larger than the decoded-image limit fail with an error.
|
|
232
|
+
- `Slide::open_with_options` with `SvcachePolicy::PreferFresh` and a custom
|
|
233
|
+
registry (`SlideOpenOptions::with_registry`) that has no `.svcache` backend
|
|
234
|
+
opens the source slide instead of redirecting to a `.svcache` file and
|
|
235
|
+
failing.
|
|
236
|
+
- Hamamatsu VMS errors for a level with no JPEG shards, and Olympus VSI errors
|
|
237
|
+
for negative or missing ETS tile coordinates, name the slide file instead of
|
|
238
|
+
an empty path.
|
|
239
|
+
- I/O errors while opening or reading the header of a `.svcache` file name the
|
|
240
|
+
cache file.
|
|
241
|
+
|
|
242
|
+
## [0.8.0] - 2026-10-06
|
|
243
|
+
|
|
244
|
+
### Added
|
|
245
|
+
|
|
246
|
+
- `MetalBackendSessions::prewarm` compiles a session's JPEG 2000 GPU kernels
|
|
247
|
+
ahead of time, so the first slide read doesn't wait for them.
|
|
248
|
+
|
|
249
|
+
### Changed
|
|
250
|
+
|
|
251
|
+
- Requires Rust 1.99 or newer.
|
|
252
|
+
- Uses J2K 0.12.0 and JXR 0.3.0, including the updated CUDA and Metal batch
|
|
253
|
+
decode paths.
|
|
254
|
+
- CUDA JPEG 2000 tile reads use bounded encoded-image batches for parallel
|
|
255
|
+
planning and pooled uploads. Results keep their request order and logical
|
|
256
|
+
crop; a recoverable tile failure does not discard neighboring results.
|
|
257
|
+
- Metal JPEG 2000 batches share Tier-1 dispatch across compatible prepared
|
|
258
|
+
groups while retaining the existing 4 MiB execution window.
|
|
259
|
+
- `.svcache` files are looked up in `~/.cache/wsi-rs/svcache/` instead of
|
|
260
|
+
`~/.cache/slideviewer/svcache/`. Move existing cache files there or rebuild
|
|
261
|
+
them.
|
|
262
|
+
- The OpenSlide shim opens slides with a 32 MiB tile cache, matching OpenSlide
|
|
263
|
+
4.0.1, and no display cache; format-specific caches scale down with it.
|
|
264
|
+
- The OpenSlide shim composes small MIRAX reads in one pass and writes cached
|
|
265
|
+
regular-grid regions directly into the caller's pixel buffer.
|
|
266
|
+
- Faster XML metadata parsing when opening ARGOS, Leica, Philips and Ventana
|
|
267
|
+
slides.
|
|
268
|
+
- With the `route-telemetry` feature, route tile counts are reported only in
|
|
269
|
+
the per-device sections; the `execution` section no longer repeats them.
|
|
270
|
+
|
|
271
|
+
### Fixed
|
|
272
|
+
|
|
273
|
+
- Concurrent single-tile reads of one DICOM slide no longer queue behind each
|
|
274
|
+
other under the default memory limits, and Metal decodes DICOM frames in
|
|
275
|
+
groups instead of one at a time.
|
|
276
|
+
- DICOM slides that store progressive JPEG frames under the baseline JPEG
|
|
277
|
+
transfer syntax, as some 3DHISTECH scanners do, now read in full.
|
|
278
|
+
- Multi-tile JPEG reads also use CPU cores that free up while the read is
|
|
279
|
+
running, so concurrent reads finish sooner.
|
|
280
|
+
- CPU batch helpers yield cores when new callers need them. Concurrent tiled
|
|
281
|
+
TIFF JPEG reads avoid adding caller threads to a pool that already uses
|
|
282
|
+
every CPU core.
|
|
283
|
+
- MIRAX JPEG reads reserve memory from indexed source sizes, so small tiles
|
|
284
|
+
can share a bounded batch instead of each reserving the maximum input size.
|
|
285
|
+
- MIRAX source batches decode on the caller with help from the shared CPU
|
|
286
|
+
pool. JPEG tiles with known dimensions use J2K's direct output API and
|
|
287
|
+
reusable decode scratch, including TIFF tiles whose color hints match the
|
|
288
|
+
JPEG header. Larger MIRAX reads use wider bounded row bands to reduce
|
|
289
|
+
repeated tile planning.
|
|
290
|
+
- The first GPU calibration read no longer includes Metal kernel compilation,
|
|
291
|
+
which could make a decode route settle on the CPU.
|
|
292
|
+
|
|
293
|
+
### Security
|
|
294
|
+
|
|
295
|
+
- Tiny raw JPEG 2000 files with impossible tile grids are rejected before
|
|
296
|
+
decoding can spend excessive time processing absent tiles.
|
|
297
|
+
- Malformed DICOM file-meta headers using `SV` or `UV` no longer bypass length
|
|
298
|
+
checks and trigger oversized allocations.
|
|
299
|
+
|
|
300
|
+
## 0.7.0 (unpublished) - 2026-09-28
|
|
301
|
+
|
|
302
|
+
### Added
|
|
303
|
+
|
|
304
|
+
- 12-bit JPEG DICOM slides (JPEG Extended and progressive JPEG). Reads return
|
|
305
|
+
16-bit RGB samples holding the 12-bit values; grayscale expands to RGB.
|
|
306
|
+
12-bit decoding runs on the CPU. The OpenSlide shim rejects 12-bit DICOM, as
|
|
307
|
+
OpenSlide does.
|
|
308
|
+
- Hamamatsu VMU slides, with full 16-bit samples, metadata and macro images.
|
|
309
|
+
The OpenSlide shim returns them as 8-bit RGB, as OpenSlide does.
|
|
310
|
+
- ARGOS and Huron TIFF slides, including ARGOS sparse tiles and z-planes, and
|
|
311
|
+
associated images for both.
|
|
312
|
+
- Zeiss CZI slides: single-plane brightfield scans stored uncompressed, as JPEG
|
|
313
|
+
or as JPEG XR. 16-bit embedded preview images keep all 16 bits.
|
|
314
|
+
- JPEG XR tiles in tiled TIFF files.
|
|
315
|
+
- DICOM JPEG Extended, progressive JPEG and lossless JPEG transfer syntaxes.
|
|
316
|
+
- Raw JPEG 2000 codestreams (`.j2k`, `.j2c`) expose each resolution as a
|
|
317
|
+
pyramid level, matching OpenJPEG's reduced-resolution decodes exactly.
|
|
318
|
+
- Raw compressed JPEG tile access for CZI, MIRAX, full-resolution VMS and
|
|
319
|
+
ordinary tiled TIFF.
|
|
320
|
+
- Olympus VSI raw JPEG 2000 tile access and GPU-resident Metal and CUDA tile
|
|
321
|
+
reads.
|
|
322
|
+
- Per-slide resource limits (`SlideLimits`).
|
|
323
|
+
- ICC profiles for associated images, also through the OpenSlide shim.
|
|
324
|
+
- GPU-resident JPEG 2000 and HTJ2K tile reads on Metal and CUDA
|
|
325
|
+
(`read_tile_metal`, `read_tiles_metal`, `read_tile_cuda`, `read_tiles_cuda`).
|
|
326
|
+
|
|
327
|
+
### Changed
|
|
328
|
+
|
|
329
|
+
- All normal reads (tiles, batches, regions, display tiles and associated
|
|
330
|
+
images) return `CpuTile`. Custom `SlideReader` implementations provide one CPU
|
|
331
|
+
tile method, and batch reads keep request order by default.
|
|
332
|
+
- `DecodeAcceleration::{Auto, CpuOnly}` replaces the output-routing and sampling
|
|
333
|
+
controls. `Auto` uses the GPU for JPEG 2000 only when it measures at least 15%
|
|
334
|
+
faster, including copying the result back, and falls back to the CPU on any
|
|
335
|
+
GPU error.
|
|
336
|
+
- The GPU is timed on a background thread instead of during the read, except
|
|
337
|
+
for batches too large to keep after the read. The CPU is timed on the read
|
|
338
|
+
that needs the tiles. If GPU startup is much slower than CPU decoding, that
|
|
339
|
+
kind of tile stays on the CPU.
|
|
340
|
+
- All JPEG 2000 CPU decoding shares one thread pool for the process.
|
|
341
|
+
Per-slide thread-pool settings are gone.
|
|
342
|
+
- Default caches are 64 MiB for decoded tiles, 32 MiB for display tiles and
|
|
343
|
+
32 MiB shared by format-specific caches. Older per-cache settings are scaled
|
|
344
|
+
to fit that total.
|
|
345
|
+
- Every built-in format counts the metadata and indexes it parses against the
|
|
346
|
+
slide's limits. Custom readers are trusted while opening, and their reads
|
|
347
|
+
reserve memory conservatively.
|
|
348
|
+
- Ventana reduced levels are slower than in 0.6 because they are now stitched
|
|
349
|
+
correctly (see Fixed). They are still faster than OpenSlide.
|
|
350
|
+
- On Apple Silicon Macs, slide fingerprints use the CPU's SHA-256 instructions.
|
|
351
|
+
|
|
352
|
+
### Removed
|
|
353
|
+
|
|
354
|
+
- `TileOutputPreference`, `DeviceOutputContext`, `OutputBackendRequest`,
|
|
355
|
+
`TilePixels`, `DeviceTile`, the public route-decision types, the route-sample
|
|
356
|
+
setting and GPU decoding of ordinary JPEG. Use `DecodeAcceleration` and the
|
|
357
|
+
GPU-resident tile APIs instead.
|
|
358
|
+
- `SlideReader::recommended_shared_cache_bytes`. Cache sizes are set per slide.
|
|
359
|
+
|
|
360
|
+
### Fixed
|
|
361
|
+
|
|
362
|
+
Pixels that differed from OpenSlide:
|
|
363
|
+
|
|
364
|
+
- NDPI and VMS levels that OpenSlide derives by JPEG scaling (1/2, 1/4, 1/8)
|
|
365
|
+
now match OpenSlide 4.0.1 exactly. They differed by up to 3 levels, or up to
|
|
366
|
+
about 160 for slides with subsampled color.
|
|
367
|
+
- Ventana BIF reduced levels are built from the stitched full-resolution tile
|
|
368
|
+
map, as OpenSlide does. They used the unstitched overview images, which put
|
|
369
|
+
tissue 36 to 60 µm out of place and showed blank filler.
|
|
370
|
+
- Overlapping tiles in Ventana level 0 and MIRAX are painted in OpenSlide's
|
|
371
|
+
order and arithmetic, so overlaps look the same as in OpenSlide.
|
|
372
|
+
- MIRAX levels whose images split into fractional sub-tiles are resampled at
|
|
373
|
+
their exact offsets, and RGB sources use Pixman's rounding, as in OpenSlide.
|
|
374
|
+
- The OpenSlide shim keeps partly covered edge pixels on Ventana and MIRAX
|
|
375
|
+
reduced levels.
|
|
376
|
+
- Metal YCbCr-to-RGB conversion matches the CPU exactly; non-neutral colors
|
|
377
|
+
were off.
|
|
378
|
+
- Sparse Philips and generic TIFF tiles stay transparent in single and batched
|
|
379
|
+
reads.
|
|
380
|
+
- DICOM honors RGB and YBR color-transform metadata.
|
|
381
|
+
- Invalid levels, missing associated images, the shim's error state,
|
|
382
|
+
zero-length ICC reads, Leica barcodes and slide bounds behave as in OpenSlide.
|
|
383
|
+
- Raw JPEG 2000 slides report `openslide.vendor` and `openslide.quickhash-1`
|
|
384
|
+
like other formats.
|
|
385
|
+
- J2K 0.11.3 fixes JPEG 2000 decoding of subsampled images whose origin is not
|
|
386
|
+
zero.
|
|
387
|
+
|
|
388
|
+
Crashes, hangs and bad files:
|
|
389
|
+
|
|
390
|
+
- Fixed a deadlock when several readers read display tiles from the same
|
|
391
|
+
generated NDPI level.
|
|
392
|
+
- Concurrent MIRAX reads no longer interfere with each other.
|
|
393
|
+
- Generated NDPI levels use virtual tiles, so zooming and fractional regions
|
|
394
|
+
don't decode an entire level.
|
|
395
|
+
- Short TIFF payloads, malformed CZI payload lengths and invalid CZI geometry
|
|
396
|
+
are rejected before decoding.
|
|
397
|
+
- Aperio, Ventana, DICOM, NDPI and MIRAX reject bad geometry, bad sparse data,
|
|
398
|
+
out-of-range offsets and non-finite physical metadata.
|
|
399
|
+
- Corrupt JPEG 2000 codestreams fail immediately instead of retrying, and no
|
|
400
|
+
longer build excessive coding trees (J2K 0.11.3).
|
|
401
|
+
- Corrupt MIRAX slides are recognized as MIRAX, so opening reports the real
|
|
402
|
+
error.
|
|
403
|
+
- CZI keeps planes separate, respects resource limits and keeps mosaic overlap
|
|
404
|
+
order. Requests for missing native levels return errors.
|
|
405
|
+
- Generic TIFF and Philips associated images use each image's own JPEG tables
|
|
406
|
+
and decode one strip at a time.
|
|
407
|
+
- VMS reads keep complete index records when the file ends with an incomplete
|
|
408
|
+
row.
|
|
409
|
+
- The shim installer no longer creates incorrect `libopenslide.4` aliases.
|
|
410
|
+
|
|
411
|
+
Speed and memory:
|
|
412
|
+
|
|
413
|
+
- Multi-tile JPEG reads from tiled TIFF slides (SVS, Leica and similar) decode
|
|
414
|
+
in parallel again.
|
|
415
|
+
- NDPI region reads no longer queue behind other readers' work.
|
|
416
|
+
- MIRAX handles opened on the same files share one parsed index.
|
|
417
|
+
- OpenSlide-compatible region reads use row bands to cap memory, compose cached
|
|
418
|
+
regions straight into the output, and skip empty areas of sparse slides.
|
|
419
|
+
- Ventana reduced levels decode each stored tile once per batch and no longer
|
|
420
|
+
re-decode tiles while panning.
|
|
421
|
+
- Aperio reduced-level, zoom and thumbnail reads are back to 0.6 speed.
|
|
422
|
+
- Cached region reads from MIRAX, VMS, CZI and ZVI are faster with many
|
|
423
|
+
concurrent readers.
|
|
424
|
+
- CZI reuses decoded source blocks across neighboring output tiles.
|
|
425
|
+
- Region reads stream large requests in batches sized to the memory budget.
|
|
426
|
+
|
|
427
|
+
## [0.6.0] - 2026-08-25
|
|
428
|
+
|
|
429
|
+
### Changed
|
|
430
|
+
|
|
431
|
+
- The Metal backend uses `objc2-metal` (through J2K 0.10.0) instead of
|
|
432
|
+
`metal-rs`. Create sessions with `MetalBackendSessions::system_default`.
|
|
433
|
+
Raw-buffer adoption takes a `MetalBuffer`, and the unsynchronized
|
|
434
|
+
`MetalDeviceStorage::Buffer` variant is removed.
|
|
435
|
+
- `CpuTile::pixels_arc` returns `Option<Arc<Vec<u8>>>` and no longer copies
|
|
436
|
+
pixels. Store an `Arc<Vec<u8>>` and call `as_slice()` where you need a byte
|
|
437
|
+
slice.
|
|
438
|
+
- The OpenSlide shim reports its version as `OpenSlide 4.0.1+wsi-rs-0.6.0`.
|
|
439
|
+
|
|
440
|
+
## [0.5.2] - 2026-07-31
|
|
441
|
+
|
|
442
|
+
### Added
|
|
443
|
+
|
|
444
|
+
- `CudaDeviceTile::download_cpu` copies a CUDA tile to CPU memory.
|
|
445
|
+
- OpenSlide shim caches are sized in bytes and can be shared. A slide keeps its
|
|
446
|
+
cache alive after the C cache handle is released.
|
|
447
|
+
- `Slide::prepare_level_controlled` builds a DICOM frame index ahead of time,
|
|
448
|
+
can be cancelled, and is reused by every later read.
|
|
449
|
+
- Optional diagnostics for DICOM frame indexing (method, fallback, reuse and
|
|
450
|
+
timing). They cost nothing when off.
|
|
451
|
+
|
|
452
|
+
### Changed
|
|
453
|
+
|
|
454
|
+
- Requires the `j2k` 0.8 codec crates.
|
|
455
|
+
- DICOM, MIRAX, VMS and Zeiss caches share one budget from `CacheConfig`.
|
|
456
|
+
- Opening a slide applies your cache settings during format detection and
|
|
457
|
+
reuses that parse.
|
|
458
|
+
- Picking the best level for a downsample matches OpenSlide at exact level
|
|
459
|
+
boundaries and for non-finite requests.
|
|
460
|
+
- Controlled tile reads keep request order, use the same CPU/GPU choice as
|
|
461
|
+
other reads, and stop for good once cancelled.
|
|
462
|
+
|
|
463
|
+
### Fixed
|
|
464
|
+
|
|
465
|
+
- Oversized DICOM frames split across fragments are rejected before
|
|
466
|
+
allocation. Truncated MIRAX files fail fingerprinting instead of hashing
|
|
467
|
+
partial data.
|
|
468
|
+
- Zeiss attachments are extracted to securely created temporary files instead
|
|
469
|
+
of predictable paths.
|
|
470
|
+
- When a shim install fails and putting the original files back also fails,
|
|
471
|
+
the backups are kept and both errors are reported
|
|
472
|
+
(`execute_install_detailed`).
|
|
473
|
+
- DICOM frames are located through the file's offset tables and checked
|
|
474
|
+
against the file size, instead of scanning all pixel data. Unusual layouts
|
|
475
|
+
fall back to scanning.
|
|
476
|
+
- Fixed races between cancellation and the CPU/GPU choice; partial DICOM
|
|
477
|
+
indexes are never cached.
|
|
478
|
+
- TIFF edge tiles have the right size in CPU and Metal JPEG and JPEG 2000
|
|
479
|
+
output.
|
|
480
|
+
|
|
481
|
+
## [0.5.1] - 2026-07-17
|
|
482
|
+
|
|
483
|
+
### Added
|
|
484
|
+
|
|
485
|
+
- Cancellation tokens (`ReadCancellationToken`) and controlled tile reads, so a
|
|
486
|
+
viewer can stop reads it no longer needs.
|
|
487
|
+
|
|
488
|
+
### Fixed
|
|
489
|
+
|
|
490
|
+
- Metal JPEG and JPEG 2000 edge tiles are cropped to their real size, matching
|
|
491
|
+
CPU reads, instead of repeating padding pixels at the right and bottom edges.
|
|
492
|
+
- Compressed tile sizes come from the TIFF tile size, not the codec's padded
|
|
493
|
+
size.
|
|
494
|
+
- Reads check for cancellation around tile I/O and decoding.
|
|
495
|
+
|
|
496
|
+
## [0.5.0] - 2026-07-15
|
|
497
|
+
|
|
498
|
+
### Changed
|
|
499
|
+
|
|
500
|
+
- Requires the `j2k` 0.7.2 codec crates; the old `signinum-*` aliases are gone.
|
|
501
|
+
- Metal outputs keep their GPU memory alive through `ResidentMetalImage`.
|
|
502
|
+
Raw-buffer storage whose lifetime can't be checked is rejected.
|
|
503
|
+
- `.svcache` files use schema 3, which checks the source file's identity and a
|
|
504
|
+
sampled content hash, not just its size and modification time. Rebuild
|
|
505
|
+
schema 2 cache files.
|
|
506
|
+
|
|
507
|
+
### Fixed
|
|
508
|
+
|
|
509
|
+
- Metal YCbCr conversion works for images larger than 4 GiB.
|
|
510
|
+
- Stricter parser limits. Companion file names in slide metadata can't point
|
|
511
|
+
outside the slide's files. The shim installer rolls back cleanly when it
|
|
512
|
+
fails.
|
|
513
|
+
|
|
514
|
+
## [0.4.0] - 2026-06-20
|
|
515
|
+
|
|
516
|
+
- First release under the `wsi-rs` name. Earlier versions were published as
|
|
517
|
+
`statumen` and are now yanked.
|
|
518
|
+
- Public constructors and request builders check their inputs.
|
|
519
|
+
|
|
520
|
+
## [0.3.1] - 2026-05-26
|
|
521
|
+
|
|
522
|
+
- Requires the `j2k` 0.4.4 codec crates.
|
|
523
|
+
|
|
524
|
+
## [0.3.0] - 2026-05-12
|
|
525
|
+
|
|
526
|
+
- Uses the `j2k` 0.4 codec crates. The repository moved to `frames-sg/wsi-rs`.
|
|
527
|
+
|
|
528
|
+
## [0.1.5] - 2026-05-06
|
|
529
|
+
|
|
530
|
+
- Requires `j2k-jpeg-metal` 0.2.2.
|
|
531
|
+
|
|
532
|
+
## [0.1.4] - 2026-05-06
|
|
533
|
+
|
|
534
|
+
- Added a tile output preference that requires compressed device tiles.
|
|
535
|
+
|
|
536
|
+
## [0.1.3] - 2026-05-05
|
|
537
|
+
|
|
538
|
+
- Clearer errors for malformed NDPI files.
|
|
539
|
+
|
|
540
|
+
## [0.1.2] - 2026-05-05
|
|
541
|
+
|
|
542
|
+
- Raw compressed JPEG tile access and batched NDPI tile decoding on Metal.
|
|
543
|
+
- JPEG 2000 decoding goes through the `j2k` crate.
|
|
544
|
+
- Updated `lru` to fix `RUSTSEC-2026-0002`.
|
|
545
|
+
|
|
546
|
+
## [0.1.1]
|
|
547
|
+
|
|
548
|
+
- First public release.
|
|
549
|
+
|
|
550
|
+
[Unreleased]: https://github.com/frames-sg/wsi-rs/compare/v0.8.1...HEAD
|
|
551
|
+
[0.8.1]: https://github.com/frames-sg/wsi-rs/compare/v0.8.0...v0.8.1
|
|
552
|
+
[0.8.0]: https://github.com/frames-sg/wsi-rs/compare/v0.6.0...v0.8.0
|
|
553
|
+
[0.6.0]: https://github.com/frames-sg/wsi-rs/compare/v0.5.2...v0.6.0
|
|
554
|
+
[0.5.2]: https://github.com/frames-sg/wsi-rs/compare/v0.5.1...v0.5.2
|
|
555
|
+
[0.5.1]: https://github.com/frames-sg/wsi-rs/compare/v0.5.0...v0.5.1
|
|
556
|
+
[0.5.0]: https://github.com/frames-sg/wsi-rs/compare/398dd681fc7c27b7020d9b35ae066c9ecbf127f2...v0.5.0
|
|
557
|
+
[0.4.0]: https://github.com/frames-sg/wsi-rs/tree/398dd681fc7c27b7020d9b35ae066c9ecbf127f2
|
|
558
|
+
[0.3.1]: https://docs.rs/statumen/0.3.1/statumen/
|
|
559
|
+
[0.3.0]: https://docs.rs/statumen/0.3.0/statumen/
|
|
560
|
+
[0.1.5]: https://docs.rs/statumen/0.1.5/statumen/
|
|
561
|
+
[0.1.4]: https://docs.rs/statumen/0.1.4/statumen/
|
|
562
|
+
[0.1.3]: https://docs.rs/statumen/0.1.3/statumen/
|
|
563
|
+
[0.1.2]: https://docs.rs/statumen/0.1.2/statumen/
|
|
564
|
+
[0.1.1]: https://docs.rs/statumen/0.1.1/statumen/
|