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.
Files changed (553) hide show
  1. wsi_rs-0.9.0/.cargo/config.toml +7 -0
  2. wsi_rs-0.9.0/.gitattributes +2 -0
  3. wsi_rs-0.9.0/.gitignore +61 -0
  4. wsi_rs-0.9.0/CHANGELOG.md +564 -0
  5. wsi_rs-0.9.0/Cargo.lock +1656 -0
  6. wsi_rs-0.9.0/Cargo.toml +155 -0
  7. wsi_rs-0.9.0/LICENSE +6 -0
  8. wsi_rs-0.9.0/LICENSE-APACHE +201 -0
  9. wsi_rs-0.9.0/LICENSE-MIT +21 -0
  10. wsi_rs-0.9.0/PKG-INFO +212 -0
  11. wsi_rs-0.9.0/README.md +480 -0
  12. wsi_rs-0.9.0/SECURITY.md +29 -0
  13. wsi_rs-0.9.0/SUPPLY_CHAIN.md +59 -0
  14. wsi_rs-0.9.0/api/wsi-rs-public-api-cuda.txt +1180 -0
  15. wsi_rs-0.9.0/api/wsi-rs-public-api-metal.txt +1187 -0
  16. wsi_rs-0.9.0/api/wsi-rs-public-api.txt +1146 -0
  17. wsi_rs-0.9.0/deny.toml +47 -0
  18. wsi_rs-0.9.0/docs/architecture.md +322 -0
  19. wsi_rs-0.9.0/examples/extract_jpeg_tiles.rs +163 -0
  20. wsi_rs-0.9.0/examples/tile_locations.rs +319 -0
  21. wsi_rs-0.9.0/pyproject.toml +33 -0
  22. wsi_rs-0.9.0/rust-toolchain.toml +5 -0
  23. wsi_rs-0.9.0/src/bin/svcache/tests.rs +237 -0
  24. wsi_rs-0.9.0/src/bin/svcache.rs +331 -0
  25. wsi_rs-0.9.0/src/core/batch/tests.rs +252 -0
  26. wsi_rs-0.9.0/src/core/batch.rs +325 -0
  27. wsi_rs-0.9.0/src/core/cache/flights/tests.rs +108 -0
  28. wsi_rs-0.9.0/src/core/cache/flights.rs +136 -0
  29. wsi_rs-0.9.0/src/core/cache/tests/tile_cache.rs +292 -0
  30. wsi_rs-0.9.0/src/core/cache.rs +452 -0
  31. wsi_rs-0.9.0/src/core/compression.rs +54 -0
  32. wsi_rs-0.9.0/src/core/decode_runtime/adaptive.rs +481 -0
  33. wsi_rs-0.9.0/src/core/decode_runtime/calibration.rs +363 -0
  34. wsi_rs-0.9.0/src/core/decode_runtime/reader.rs +243 -0
  35. wsi_rs-0.9.0/src/core/decode_runtime/tests.rs +1212 -0
  36. wsi_rs-0.9.0/src/core/decode_runtime.rs +430 -0
  37. wsi_rs-0.9.0/src/core/environment/tests.rs +11 -0
  38. wsi_rs-0.9.0/src/core/environment.rs +13 -0
  39. wsi_rs-0.9.0/src/core/execution_telemetry.rs +149 -0
  40. wsi_rs-0.9.0/src/core/file_identity/tests.rs +83 -0
  41. wsi_rs-0.9.0/src/core/file_identity.rs +118 -0
  42. wsi_rs-0.9.0/src/core/hash/tests.rs +161 -0
  43. wsi_rs-0.9.0/src/core/hash.rs +121 -0
  44. wsi_rs-0.9.0/src/core/limits/execution.rs +94 -0
  45. wsi_rs-0.9.0/src/core/limits/tests.rs +167 -0
  46. wsi_rs-0.9.0/src/core/limits.rs +386 -0
  47. wsi_rs-0.9.0/src/core/mod.rs +14 -0
  48. wsi_rs-0.9.0/src/core/positioned_file/tests.rs +8 -0
  49. wsi_rs-0.9.0/src/core/positioned_file.rs +50 -0
  50. wsi_rs-0.9.0/src/core/read_control/tests.rs +105 -0
  51. wsi_rs-0.9.0/src/core/read_control.rs +229 -0
  52. wsi_rs-0.9.0/src/core/registry/composition/display.rs +193 -0
  53. wsi_rs-0.9.0/src/core/registry/composition/fractional_u8/tests/reference.rs +185 -0
  54. wsi_rs-0.9.0/src/core/registry/composition/fractional_u8.rs +795 -0
  55. wsi_rs-0.9.0/src/core/registry/composition/integral/tests/reference.rs +78 -0
  56. wsi_rs-0.9.0/src/core/registry/composition/integral.rs +443 -0
  57. wsi_rs-0.9.0/src/core/registry/composition/mod.rs +18 -0
  58. wsi_rs-0.9.0/src/core/registry/composition/output.rs +183 -0
  59. wsi_rs-0.9.0/src/core/registry/composition/plan.rs +75 -0
  60. wsi_rs-0.9.0/src/core/registry/composition/region/tests/coalescing.rs +208 -0
  61. wsi_rs-0.9.0/src/core/registry/composition/region/tests.rs +895 -0
  62. wsi_rs-0.9.0/src/core/registry/composition/region.rs +700 -0
  63. wsi_rs-0.9.0/src/core/registry/composition/resolution.rs +210 -0
  64. wsi_rs-0.9.0/src/core/registry/composition/subtile/tests.rs +67 -0
  65. wsi_rs-0.9.0/src/core/registry/composition/subtile.rs +124 -0
  66. wsi_rs-0.9.0/src/core/registry/composition/tests/performance.rs +256 -0
  67. wsi_rs-0.9.0/src/core/registry/managed.rs +105 -0
  68. wsi_rs-0.9.0/src/core/registry/mod.rs +44 -0
  69. wsi_rs-0.9.0/src/core/registry/open_config.rs +246 -0
  70. wsi_rs-0.9.0/src/core/registry/open_options.rs +92 -0
  71. wsi_rs-0.9.0/src/core/registry/probe_cache/tests.rs +49 -0
  72. wsi_rs-0.9.0/src/core/registry/probe_cache.rs +63 -0
  73. wsi_rs-0.9.0/src/core/registry/registry_impl.rs +178 -0
  74. wsi_rs-0.9.0/src/core/registry/slide/budget.rs +171 -0
  75. wsi_rs-0.9.0/src/core/registry/slide/execution.rs +28 -0
  76. wsi_rs-0.9.0/src/core/registry/slide/locations/tests.rs +241 -0
  77. wsi_rs-0.9.0/src/core/registry/slide/locations.rs +209 -0
  78. wsi_rs-0.9.0/src/core/registry/slide/region.rs +144 -0
  79. wsi_rs-0.9.0/src/core/registry/slide/tests.rs +710 -0
  80. wsi_rs-0.9.0/src/core/registry/slide.rs +713 -0
  81. wsi_rs-0.9.0/src/core/registry/tests/cache.rs +209 -0
  82. wsi_rs-0.9.0/src/core/registry/tests/composition.rs +489 -0
  83. wsi_rs-0.9.0/src/core/registry/tests/control.rs +325 -0
  84. wsi_rs-0.9.0/src/core/registry/tests/display.rs +164 -0
  85. wsi_rs-0.9.0/src/core/registry/tests/mod.rs +7 -0
  86. wsi_rs-0.9.0/src/core/registry/tests/registry.rs +378 -0
  87. wsi_rs-0.9.0/src/core/registry/tests/slide.rs +404 -0
  88. wsi_rs-0.9.0/src/core/registry/tests/support.rs +153 -0
  89. wsi_rs-0.9.0/src/core/registry/traits.rs +487 -0
  90. wsi_rs-0.9.0/src/core/test_hooks.rs +157 -0
  91. wsi_rs-0.9.0/src/core/types/geometry.rs +480 -0
  92. wsi_rs-0.9.0/src/core/types/locations.rs +661 -0
  93. wsi_rs-0.9.0/src/core/types/mod.rs +20 -0
  94. wsi_rs-0.9.0/src/core/types/model.rs +1044 -0
  95. wsi_rs-0.9.0/src/core/types/pixels/display.rs +335 -0
  96. wsi_rs-0.9.0/src/core/types/pixels/ycbcr.rs +106 -0
  97. wsi_rs-0.9.0/src/core/types/pixels.rs +344 -0
  98. wsi_rs-0.9.0/src/core/types/requests.rs +437 -0
  99. wsi_rs-0.9.0/src/core/types/tests/display.rs +407 -0
  100. wsi_rs-0.9.0/src/core/types/tests/geometry.rs +301 -0
  101. wsi_rs-0.9.0/src/core/types/tests/j2k_format_tests.rs +19 -0
  102. wsi_rs-0.9.0/src/core/types/tests/locations.rs +254 -0
  103. wsi_rs-0.9.0/src/core/types/tests/mod.rs +6 -0
  104. wsi_rs-0.9.0/src/core/types/tests/model.rs +445 -0
  105. wsi_rs-0.9.0/src/core/types/tests/pixels.rs +131 -0
  106. wsi_rs-0.9.0/src/core/types/tests/requests.rs +414 -0
  107. wsi_rs-0.9.0/src/decode/jp2k/batch.rs +155 -0
  108. wsi_rs-0.9.0/src/decode/jp2k/cpu.rs +255 -0
  109. wsi_rs-0.9.0/src/decode/jp2k/cuda.rs +150 -0
  110. wsi_rs-0.9.0/src/decode/jp2k/device.rs +130 -0
  111. wsi_rs-0.9.0/src/decode/jp2k/metal.rs +72 -0
  112. wsi_rs-0.9.0/src/decode/jp2k/metal_batch.rs +367 -0
  113. wsi_rs-0.9.0/src/decode/jp2k/output.rs +46 -0
  114. wsi_rs-0.9.0/src/decode/jp2k/prepare.rs +179 -0
  115. wsi_rs-0.9.0/src/decode/jp2k/prepared_batch.rs +198 -0
  116. wsi_rs-0.9.0/src/decode/jp2k/tests/batch.rs +136 -0
  117. wsi_rs-0.9.0/src/decode/jp2k/tests/cooperative.rs +194 -0
  118. wsi_rs-0.9.0/src/decode/jp2k/tests/cpu.rs +116 -0
  119. wsi_rs-0.9.0/src/decode/jp2k/tests/device.rs +451 -0
  120. wsi_rs-0.9.0/src/decode/jp2k/tests/errors.rs +37 -0
  121. wsi_rs-0.9.0/src/decode/jp2k/tests/prepared_performance.rs +375 -0
  122. wsi_rs-0.9.0/src/decode/jp2k/tests.rs +83 -0
  123. wsi_rs-0.9.0/src/decode/jp2k.rs +55 -0
  124. wsi_rs-0.9.0/src/decode/jp2k_backend/tests.rs +27 -0
  125. wsi_rs-0.9.0/src/decode/jp2k_backend.rs +24 -0
  126. wsi_rs-0.9.0/src/decode/jp2k_codestream/tests/adapter.rs +65 -0
  127. wsi_rs-0.9.0/src/decode/jp2k_codestream/tests/reference.rs +62 -0
  128. wsi_rs-0.9.0/src/decode/jp2k_codestream.rs +75 -0
  129. wsi_rs-0.9.0/src/decode/jp2k_raster/tests.rs +197 -0
  130. wsi_rs-0.9.0/src/decode/jp2k_raster.rs +94 -0
  131. wsi_rs-0.9.0/src/decode/jpeg/dct_reemit/frame_writer.rs +152 -0
  132. wsi_rs-0.9.0/src/decode/jpeg/dct_reemit.rs +520 -0
  133. wsi_rs-0.9.0/src/decode/jpeg/frame.rs +489 -0
  134. wsi_rs-0.9.0/src/decode/jpeg/input.rs +677 -0
  135. wsi_rs-0.9.0/src/decode/jpeg/lossless/blocks.rs +164 -0
  136. wsi_rs-0.9.0/src/decode/jpeg/lossless/source.rs +341 -0
  137. wsi_rs-0.9.0/src/decode/jpeg/lossless/stack.rs +311 -0
  138. wsi_rs-0.9.0/src/decode/jpeg/lossless.rs +348 -0
  139. wsi_rs-0.9.0/src/decode/jpeg/tests/batch.rs +178 -0
  140. wsi_rs-0.9.0/src/decode/jpeg/tests/cpu.rs +270 -0
  141. wsi_rs-0.9.0/src/decode/jpeg/tests/errors.rs +31 -0
  142. wsi_rs-0.9.0/src/decode/jpeg/tests/input_repair.rs +175 -0
  143. wsi_rs-0.9.0/src/decode/jpeg/tests/lossless.rs +992 -0
  144. wsi_rs-0.9.0/src/decode/jpeg/tests.rs +213 -0
  145. wsi_rs-0.9.0/src/decode/jpeg.rs +476 -0
  146. wsi_rs-0.9.0/src/decode/jpegxr/tests.rs +68 -0
  147. wsi_rs-0.9.0/src/decode/jpegxr.rs +141 -0
  148. wsi_rs-0.9.0/src/decode/mod.rs +7 -0
  149. wsi_rs-0.9.0/src/decode/xml/tests.rs +135 -0
  150. wsi_rs-0.9.0/src/decode/xml.rs +192 -0
  151. wsi_rs-0.9.0/src/error/tests.rs +173 -0
  152. wsi_rs-0.9.0/src/error.rs +117 -0
  153. wsi_rs-0.9.0/src/formats/companion_path/tests.rs +43 -0
  154. wsi_rs-0.9.0/src/formats/companion_path.rs +68 -0
  155. wsi_rs-0.9.0/src/formats/composition.rs +51 -0
  156. wsi_rs-0.9.0/src/formats/dicom/backend.rs +100 -0
  157. wsi_rs-0.9.0/src/formats/dicom/decode.rs +603 -0
  158. wsi_rs-0.9.0/src/formats/dicom/frame_index/batch_io.rs +295 -0
  159. wsi_rs-0.9.0/src/formats/dicom/frame_index/model.rs +25 -0
  160. wsi_rs-0.9.0/src/formats/dicom/frame_index/offset_tables.rs +525 -0
  161. wsi_rs-0.9.0/src/formats/dicom/frame_index/raw_little_endian.rs +697 -0
  162. wsi_rs-0.9.0/src/formats/dicom/frame_index/token_stream.rs +116 -0
  163. wsi_rs-0.9.0/src/formats/dicom/frame_index/validation.rs +86 -0
  164. wsi_rs-0.9.0/src/formats/dicom/frame_index.rs +145 -0
  165. wsi_rs-0.9.0/src/formats/dicom/image/frame_decode.rs +316 -0
  166. wsi_rs-0.9.0/src/formats/dicom/image/frame_io.rs +397 -0
  167. wsi_rs-0.9.0/src/formats/dicom/image/frame_location.rs +216 -0
  168. wsi_rs-0.9.0/src/formats/dicom/image.rs +379 -0
  169. wsi_rs-0.9.0/src/formats/dicom/manifest/tests/directory_limit.rs +23 -0
  170. wsi_rs-0.9.0/src/formats/dicom/manifest.rs +789 -0
  171. wsi_rs-0.9.0/src/formats/dicom/metadata.rs +845 -0
  172. wsi_rs-0.9.0/src/formats/dicom/mod.rs +65 -0
  173. wsi_rs-0.9.0/src/formats/dicom/preflight.rs +433 -0
  174. wsi_rs-0.9.0/src/formats/dicom/reader/batch_plan.rs +229 -0
  175. wsi_rs-0.9.0/src/formats/dicom/reader/cpu.rs +203 -0
  176. wsi_rs-0.9.0/src/formats/dicom/reader/device.rs +142 -0
  177. wsi_rs-0.9.0/src/formats/dicom/reader/managed.rs +160 -0
  178. wsi_rs-0.9.0/src/formats/dicom/reader.rs +186 -0
  179. wsi_rs-0.9.0/src/formats/dicom/tests/batch.rs +476 -0
  180. wsi_rs-0.9.0/src/formats/dicom/tests/cache.rs +104 -0
  181. wsi_rs-0.9.0/src/formats/dicom/tests/decode_formats.rs +986 -0
  182. wsi_rs-0.9.0/src/formats/dicom/tests/device.rs +552 -0
  183. wsi_rs-0.9.0/src/formats/dicom/tests/fixtures.rs +415 -0
  184. wsi_rs-0.9.0/src/formats/dicom/tests/frame_boundaries.rs +456 -0
  185. wsi_rs-0.9.0/src/formats/dicom/tests/frame_io.rs +521 -0
  186. wsi_rs-0.9.0/src/formats/dicom/tests/frame_lifecycle.rs +521 -0
  187. wsi_rs-0.9.0/src/formats/dicom/tests/frame_offsets.rs +472 -0
  188. wsi_rs-0.9.0/src/formats/dicom/tests/image_cache.rs +355 -0
  189. wsi_rs-0.9.0/src/formats/dicom/tests/locations.rs +620 -0
  190. wsi_rs-0.9.0/src/formats/dicom/tests/manifest_building.rs +472 -0
  191. wsi_rs-0.9.0/src/formats/dicom/tests/metadata_parsing.rs +503 -0
  192. wsi_rs-0.9.0/src/formats/dicom/tests/mod.rs +120 -0
  193. wsi_rs-0.9.0/src/formats/dicom/tests/preflight_levels.rs +140 -0
  194. wsi_rs-0.9.0/src/formats/dicom/tests/runtime.rs +114 -0
  195. wsi_rs-0.9.0/src/formats/dicom/tests/twelve_bit.rs +490 -0
  196. wsi_rs-0.9.0/src/formats/dicom/transfer_syntax.rs +151 -0
  197. wsi_rs-0.9.0/src/formats/geometry/tests.rs +17 -0
  198. wsi_rs-0.9.0/src/formats/geometry.rs +76 -0
  199. wsi_rs-0.9.0/src/formats/hamamatsu_vms/ini.rs +127 -0
  200. wsi_rs-0.9.0/src/formats/hamamatsu_vms/jpeg/tests.rs +581 -0
  201. wsi_rs-0.9.0/src/formats/hamamatsu_vms/jpeg.rs +706 -0
  202. wsi_rs-0.9.0/src/formats/hamamatsu_vms/levels.rs +88 -0
  203. wsi_rs-0.9.0/src/formats/hamamatsu_vms/locations.rs +89 -0
  204. wsi_rs-0.9.0/src/formats/hamamatsu_vms/model.rs +77 -0
  205. wsi_rs-0.9.0/src/formats/hamamatsu_vms/slide/parse.rs +331 -0
  206. wsi_rs-0.9.0/src/formats/hamamatsu_vms/slide/tests/limits.rs +7 -0
  207. wsi_rs-0.9.0/src/formats/hamamatsu_vms/slide.rs +206 -0
  208. wsi_rs-0.9.0/src/formats/hamamatsu_vms/tests/backend.rs +375 -0
  209. wsi_rs-0.9.0/src/formats/hamamatsu_vms/tests/errors.rs +228 -0
  210. wsi_rs-0.9.0/src/formats/hamamatsu_vms/tests/fixtures.rs +162 -0
  211. wsi_rs-0.9.0/src/formats/hamamatsu_vms/tests/locations.rs +156 -0
  212. wsi_rs-0.9.0/src/formats/hamamatsu_vms/tests.rs +144 -0
  213. wsi_rs-0.9.0/src/formats/hamamatsu_vms.rs +147 -0
  214. wsi_rs-0.9.0/src/formats/hamamatsu_vmu/ngr.rs +262 -0
  215. wsi_rs-0.9.0/src/formats/hamamatsu_vmu.rs +352 -0
  216. wsi_rs-0.9.0/src/formats/ini/tests.rs +58 -0
  217. wsi_rs-0.9.0/src/formats/ini.rs +100 -0
  218. wsi_rs-0.9.0/src/formats/mirax/batch.rs +137 -0
  219. wsi_rs-0.9.0/src/formats/mirax/helpers.rs +284 -0
  220. wsi_rs-0.9.0/src/formats/mirax/index/tests/budget.rs +16 -0
  221. wsi_rs-0.9.0/src/formats/mirax/index/tests/io.rs +119 -0
  222. wsi_rs-0.9.0/src/formats/mirax/index.rs +765 -0
  223. wsi_rs-0.9.0/src/formats/mirax/locations.rs +290 -0
  224. wsi_rs-0.9.0/src/formats/mirax/slide/parse.rs +699 -0
  225. wsi_rs-0.9.0/src/formats/mirax/slide.rs +250 -0
  226. wsi_rs-0.9.0/src/formats/mirax/tests/backend.rs +671 -0
  227. wsi_rs-0.9.0/src/formats/mirax/tests/errors.rs +294 -0
  228. wsi_rs-0.9.0/src/formats/mirax/tests/fixtures.rs +332 -0
  229. wsi_rs-0.9.0/src/formats/mirax/tests/locations.rs +414 -0
  230. wsi_rs-0.9.0/src/formats/mirax/tests/parser.rs +438 -0
  231. wsi_rs-0.9.0/src/formats/mirax/tests.rs +99 -0
  232. wsi_rs-0.9.0/src/formats/mirax.rs +518 -0
  233. wsi_rs-0.9.0/src/formats/mod.rs +14 -0
  234. wsi_rs-0.9.0/src/formats/olympus_vsi/pixels.rs +180 -0
  235. wsi_rs-0.9.0/src/formats/olympus_vsi/scene/header.rs +210 -0
  236. wsi_rs-0.9.0/src/formats/olympus_vsi/scene/index/tests/io.rs +102 -0
  237. wsi_rs-0.9.0/src/formats/olympus_vsi/scene/index.rs +304 -0
  238. wsi_rs-0.9.0/src/formats/olympus_vsi/scene.rs +158 -0
  239. wsi_rs-0.9.0/src/formats/olympus_vsi/slide.rs +153 -0
  240. wsi_rs-0.9.0/src/formats/olympus_vsi/tests/fixtures.rs +160 -0
  241. wsi_rs-0.9.0/src/formats/olympus_vsi/tests/locations.rs +152 -0
  242. wsi_rs-0.9.0/src/formats/olympus_vsi/tests.rs +813 -0
  243. wsi_rs-0.9.0/src/formats/olympus_vsi.rs +363 -0
  244. wsi_rs-0.9.0/src/formats/raw_jp2k/tests.rs +783 -0
  245. wsi_rs-0.9.0/src/formats/raw_jp2k.rs +601 -0
  246. wsi_rs-0.9.0/src/formats/svcache/build.rs +595 -0
  247. wsi_rs-0.9.0/src/formats/svcache/paths.rs +75 -0
  248. wsi_rs-0.9.0/src/formats/svcache/reader.rs +178 -0
  249. wsi_rs-0.9.0/src/formats/svcache/storage.rs +631 -0
  250. wsi_rs-0.9.0/src/formats/svcache/tests/build.rs +361 -0
  251. wsi_rs-0.9.0/src/formats/svcache/tests/fixtures.rs +48 -0
  252. wsi_rs-0.9.0/src/formats/svcache/tests/metadata.rs +238 -0
  253. wsi_rs-0.9.0/src/formats/svcache/tests/mod.rs +17 -0
  254. wsi_rs-0.9.0/src/formats/svcache/tests/probe.rs +107 -0
  255. wsi_rs-0.9.0/src/formats/svcache/tests/reader.rs +360 -0
  256. wsi_rs-0.9.0/src/formats/svcache/tests/storage.rs +200 -0
  257. wsi_rs-0.9.0/src/formats/svcache.rs +323 -0
  258. wsi_rs-0.9.0/src/formats/tiff_family/container/access.rs +413 -0
  259. wsi_rs-0.9.0/src/formats/tiff_family/container/model.rs +285 -0
  260. wsi_rs-0.9.0/src/formats/tiff_family/container/ndpi_offsets.rs +73 -0
  261. wsi_rs-0.9.0/src/formats/tiff_family/container/parse.rs +521 -0
  262. wsi_rs-0.9.0/src/formats/tiff_family/container/tests/arrays.rs +128 -0
  263. wsi_rs-0.9.0/src/formats/tiff_family/container/tests/chains.rs +205 -0
  264. wsi_rs-0.9.0/src/formats/tiff_family/container/tests/fixtures.rs +242 -0
  265. wsi_rs-0.9.0/src/formats/tiff_family/container/tests/headers.rs +136 -0
  266. wsi_rs-0.9.0/src/formats/tiff_family/container/tests/mod.rs +27 -0
  267. wsi_rs-0.9.0/src/formats/tiff_family/container/tests/model.rs +130 -0
  268. wsi_rs-0.9.0/src/formats/tiff_family/container/tests/ndpi.rs +48 -0
  269. wsi_rs-0.9.0/src/formats/tiff_family/container/tests/resolution.rs +102 -0
  270. wsi_rs-0.9.0/src/formats/tiff_family/container/tests/scalars.rs +168 -0
  271. wsi_rs-0.9.0/src/formats/tiff_family/container.rs +9 -0
  272. wsi_rs-0.9.0/src/formats/tiff_family/error/tests.rs +178 -0
  273. wsi_rs-0.9.0/src/formats/tiff_family/error.rs +126 -0
  274. wsi_rs-0.9.0/src/formats/tiff_family/icc/tests.rs +88 -0
  275. wsi_rs-0.9.0/src/formats/tiff_family/icc.rs +92 -0
  276. wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio/tests/detection.rs +63 -0
  277. wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio/tests/fixtures.rs +143 -0
  278. wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio/tests/interpretation.rs +698 -0
  279. wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio/tests/mod.rs +4 -0
  280. wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio/tests/properties.rs +92 -0
  281. wsi_rs-0.9.0/src/formats/tiff_family/layout/aperio.rs +329 -0
  282. wsi_rs-0.9.0/src/formats/tiff_family/layout/argos/tests.rs +301 -0
  283. wsi_rs-0.9.0/src/formats/tiff_family/layout/argos.rs +490 -0
  284. wsi_rs-0.9.0/src/formats/tiff_family/layout/common.rs +325 -0
  285. wsi_rs-0.9.0/src/formats/tiff_family/layout/generic/layout.rs +295 -0
  286. wsi_rs-0.9.0/src/formats/tiff_family/layout/generic/support.rs +145 -0
  287. wsi_rs-0.9.0/src/formats/tiff_family/layout/generic/tests.rs +766 -0
  288. wsi_rs-0.9.0/src/formats/tiff_family/layout/generic.rs +35 -0
  289. wsi_rs-0.9.0/src/formats/tiff_family/layout/huron/tests.rs +147 -0
  290. wsi_rs-0.9.0/src/formats/tiff_family/layout/huron.rs +188 -0
  291. wsi_rs-0.9.0/src/formats/tiff_family/layout/leica/tests.rs +640 -0
  292. wsi_rs-0.9.0/src/formats/tiff_family/layout/leica.rs +813 -0
  293. wsi_rs-0.9.0/src/formats/tiff_family/layout/mod.rs +422 -0
  294. wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi/tests/corpus.rs +26 -0
  295. wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi/tests/fixtures.rs +231 -0
  296. wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi/tests/geometry.rs +105 -0
  297. wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi/tests/interpretation.rs +414 -0
  298. wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi/tests/mod.rs +4 -0
  299. wsi_rs-0.9.0/src/formats/tiff_family/layout/ndpi.rs +733 -0
  300. wsi_rs-0.9.0/src/formats/tiff_family/layout/ome/layout.rs +597 -0
  301. wsi_rs-0.9.0/src/formats/tiff_family/layout/ome/metadata.rs +416 -0
  302. wsi_rs-0.9.0/src/formats/tiff_family/layout/ome/tests.rs +556 -0
  303. wsi_rs-0.9.0/src/formats/tiff_family/layout/ome.rs +50 -0
  304. wsi_rs-0.9.0/src/formats/tiff_family/layout/philips/tests.rs +300 -0
  305. wsi_rs-0.9.0/src/formats/tiff_family/layout/philips.rs +499 -0
  306. wsi_rs-0.9.0/src/formats/tiff_family/layout/tests.rs +256 -0
  307. wsi_rs-0.9.0/src/formats/tiff_family/layout/trestle/tests.rs +148 -0
  308. wsi_rs-0.9.0/src/formats/tiff_family/layout/trestle.rs +281 -0
  309. wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana/geometry.rs +296 -0
  310. wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana/layout.rs +283 -0
  311. wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana/metadata.rs +180 -0
  312. wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana/stitching.rs +443 -0
  313. wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana/tests.rs +781 -0
  314. wsi_rs-0.9.0/src/formats/tiff_family/layout/ventana.rs +38 -0
  315. wsi_rs-0.9.0/src/formats/tiff_family/mod.rs +204 -0
  316. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/associated.rs +449 -0
  317. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/caches/tests/single_flight.rs +212 -0
  318. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/caches.rs +311 -0
  319. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/decode_batch.rs +71 -0
  320. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/dispatch.rs +791 -0
  321. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/image_ops.rs +237 -0
  322. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/jpeg_frame.rs +75 -0
  323. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/jpegxr.rs +58 -0
  324. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/locations/codec.rs +498 -0
  325. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/locations/ndpi.rs +429 -0
  326. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/locations/strips.rs +71 -0
  327. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/locations.rs +356 -0
  328. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/lossless_raw.rs +343 -0
  329. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/managed.rs +76 -0
  330. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/mod.rs +105 -0
  331. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/ndpi_batch.rs +181 -0
  332. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/ndpi_core.rs +716 -0
  333. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/ndpi_retile.rs +163 -0
  334. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/ndpi_tiles.rs +357 -0
  335. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/reader.rs +108 -0
  336. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/stripped_level.rs +451 -0
  337. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/subtiles.rs +271 -0
  338. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/synthetic.rs +691 -0
  339. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/associated.rs +560 -0
  340. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/cache.rs +166 -0
  341. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/codecs.rs +423 -0
  342. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/device.rs +204 -0
  343. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/dispatch.rs +842 -0
  344. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/fixtures/layout.rs +121 -0
  345. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/fixtures/mod.rs +7 -0
  346. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/fixtures/ndpi.rs +360 -0
  347. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/fixtures/tiff.rs +532 -0
  348. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/locations.rs +944 -0
  349. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/lossless_raw.rs +636 -0
  350. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/display.rs +348 -0
  351. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/errors.rs +453 -0
  352. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/fixtures.rs +88 -0
  353. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/locations.rs +494 -0
  354. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/mod.rs +6 -0
  355. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/payload.rs +410 -0
  356. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/ndpi/restart.rs +235 -0
  357. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests/synthetic.rs +798 -0
  358. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tests.rs +36 -0
  359. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tiled_ifd/addressing.rs +503 -0
  360. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tiled_ifd/batch.rs +311 -0
  361. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tiled_ifd/codecs.rs +527 -0
  362. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tiled_ifd/raw.rs +314 -0
  363. wsi_rs-0.9.0/src/formats/tiff_family/pixel_access/tiled_ifd.rs +6 -0
  364. wsi_rs-0.9.0/src/formats/tiff_family/test_support.rs +365 -0
  365. wsi_rs-0.9.0/src/formats/tiff_family/tests/argos_huron.rs +66 -0
  366. wsi_rs-0.9.0/src/formats/tiff_family/tests/fixtures.rs +620 -0
  367. wsi_rs-0.9.0/src/formats/tiff_family/tests/mod.rs +4 -0
  368. wsi_rs-0.9.0/src/formats/tiff_family/tests/probe.rs +177 -0
  369. wsi_rs-0.9.0/src/formats/tiff_family/tests/read.rs +518 -0
  370. wsi_rs-0.9.0/src/formats/zeiss/attachments/tests.rs +123 -0
  371. wsi_rs-0.9.0/src/formats/zeiss/attachments.rs +377 -0
  372. wsi_rs-0.9.0/src/formats/zeiss/batch.rs +264 -0
  373. wsi_rs-0.9.0/src/formats/zeiss/composition.rs +110 -0
  374. wsi_rs-0.9.0/src/formats/zeiss/container/directory.rs +196 -0
  375. wsi_rs-0.9.0/src/formats/zeiss/container/format.rs +62 -0
  376. wsi_rs-0.9.0/src/formats/zeiss/container/metadata.rs +151 -0
  377. wsi_rs-0.9.0/src/formats/zeiss/container/mod.rs +123 -0
  378. wsi_rs-0.9.0/src/formats/zeiss/container/model.rs +362 -0
  379. wsi_rs-0.9.0/src/formats/zeiss/container/parser.rs +131 -0
  380. wsi_rs-0.9.0/src/formats/zeiss/container/payload.rs +235 -0
  381. wsi_rs-0.9.0/src/formats/zeiss/container/pixel.rs +207 -0
  382. wsi_rs-0.9.0/src/formats/zeiss/level.rs +90 -0
  383. wsi_rs-0.9.0/src/formats/zeiss/locations.rs +416 -0
  384. wsi_rs-0.9.0/src/formats/zeiss/metadata.rs +382 -0
  385. wsi_rs-0.9.0/src/formats/zeiss/preflight/directory.rs +83 -0
  386. wsi_rs-0.9.0/src/formats/zeiss/preflight/tests.rs +366 -0
  387. wsi_rs-0.9.0/src/formats/zeiss/preflight.rs +449 -0
  388. wsi_rs-0.9.0/src/formats/zeiss/raster.rs +256 -0
  389. wsi_rs-0.9.0/src/formats/zeiss/slide/parse.rs +447 -0
  390. wsi_rs-0.9.0/src/formats/zeiss/slide.rs +273 -0
  391. wsi_rs-0.9.0/src/formats/zeiss/source.rs +102 -0
  392. wsi_rs-0.9.0/src/formats/zeiss/subblock.rs +152 -0
  393. wsi_rs-0.9.0/src/formats/zeiss/tests/attachment_cases.rs +204 -0
  394. wsi_rs-0.9.0/src/formats/zeiss/tests/container_cases.rs +56 -0
  395. wsi_rs-0.9.0/src/formats/zeiss/tests/error_cases.rs +111 -0
  396. wsi_rs-0.9.0/src/formats/zeiss/tests/fixtures.rs +319 -0
  397. wsi_rs-0.9.0/src/formats/zeiss/tests/generated.rs +398 -0
  398. wsi_rs-0.9.0/src/formats/zeiss/tests/location_cases.rs +441 -0
  399. wsi_rs-0.9.0/src/formats/zeiss/tests/metadata_cases.rs +335 -0
  400. wsi_rs-0.9.0/src/formats/zeiss/tests/subblock_cache.rs +319 -0
  401. wsi_rs-0.9.0/src/formats/zeiss/tests/tile_cases.rs +602 -0
  402. wsi_rs-0.9.0/src/formats/zeiss/tests.rs +191 -0
  403. wsi_rs-0.9.0/src/formats/zeiss/tiles.rs +245 -0
  404. wsi_rs-0.9.0/src/formats/zeiss.rs +102 -0
  405. wsi_rs-0.9.0/src/formats/zeiss_zvi/compound.rs +127 -0
  406. wsi_rs-0.9.0/src/formats/zeiss_zvi/header.rs +248 -0
  407. wsi_rs-0.9.0/src/formats/zeiss_zvi/locations.rs +225 -0
  408. wsi_rs-0.9.0/src/formats/zeiss_zvi/model.rs +89 -0
  409. wsi_rs-0.9.0/src/formats/zeiss_zvi/mosaic.rs +151 -0
  410. wsi_rs-0.9.0/src/formats/zeiss_zvi/sectors.rs +509 -0
  411. wsi_rs-0.9.0/src/formats/zeiss_zvi/slide.rs +501 -0
  412. wsi_rs-0.9.0/src/formats/zeiss_zvi/tags.rs +104 -0
  413. wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/backend.rs +235 -0
  414. wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/errors.rs +213 -0
  415. wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/fixtures.rs +343 -0
  416. wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/header.rs +64 -0
  417. wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/locations.rs +581 -0
  418. wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/mosaic.rs +9 -0
  419. wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/slide.rs +46 -0
  420. wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/tags.rs +55 -0
  421. wsi_rs-0.9.0/src/formats/zeiss_zvi/tests/tiles.rs +7 -0
  422. wsi_rs-0.9.0/src/formats/zeiss_zvi/tests.rs +4 -0
  423. wsi_rs-0.9.0/src/formats/zeiss_zvi/tiles.rs +345 -0
  424. wsi_rs-0.9.0/src/formats/zeiss_zvi.rs +101 -0
  425. wsi_rs-0.9.0/src/lib.rs +154 -0
  426. wsi_rs-0.9.0/src/output/cuda/tests.rs +105 -0
  427. wsi_rs-0.9.0/src/output/cuda.rs +265 -0
  428. wsi_rs-0.9.0/src/output/download.rs +181 -0
  429. wsi_rs-0.9.0/src/output/metal/interop.rs +563 -0
  430. wsi_rs-0.9.0/src/output/metal/prewarm.j2k +0 -0
  431. wsi_rs-0.9.0/src/output/metal/session.rs +176 -0
  432. wsi_rs-0.9.0/src/output/metal/tests/address.rs +138 -0
  433. wsi_rs-0.9.0/src/output/metal/tests/conversion.rs +235 -0
  434. wsi_rs-0.9.0/src/output/metal/tests/download.rs +127 -0
  435. wsi_rs-0.9.0/src/output/metal/tests/perf.rs +132 -0
  436. wsi_rs-0.9.0/src/output/metal/tests.rs +35 -0
  437. wsi_rs-0.9.0/src/output/metal/tile.rs +141 -0
  438. wsi_rs-0.9.0/src/output/metal/ycbcr.metal +77 -0
  439. wsi_rs-0.9.0/src/output/metal/ycbcr.rs +311 -0
  440. wsi_rs-0.9.0/src/output/metal/ycbcr_perf.metal +19 -0
  441. wsi_rs-0.9.0/src/output/metal/ycbcr_probe.metal +8 -0
  442. wsi_rs-0.9.0/src/output/metal.rs +20 -0
  443. wsi_rs-0.9.0/src/output/mod.rs +8 -0
  444. wsi_rs-0.9.0/src/properties/tests.rs +53 -0
  445. wsi_rs-0.9.0/src/properties.rs +81 -0
  446. wsi_rs-0.9.0/src/slide_candidates.rs +22 -0
  447. wsi_rs-0.9.0/src/test_support.rs +165 -0
  448. wsi_rs-0.9.0/supply-chain/audits.toml +356 -0
  449. wsi_rs-0.9.0/supply-chain/config.toml +674 -0
  450. wsi_rs-0.9.0/supply-chain/imports.lock +649 -0
  451. wsi_rs-0.9.0/test-support/Cargo.toml +26 -0
  452. wsi_rs-0.9.0/test-support/src/corpus.rs +1033 -0
  453. wsi_rs-0.9.0/test-support/src/lib.rs +2 -0
  454. wsi_rs-0.9.0/test-support/src/openslide.rs +1181 -0
  455. wsi_rs-0.9.0/tests/argos_huron.rs +186 -0
  456. wsi_rs-0.9.0/tests/candidate_paths.rs +37 -0
  457. wsi_rs-0.9.0/tests/color_regression.rs +310 -0
  458. wsi_rs-0.9.0/tests/czi_performance.rs +101 -0
  459. wsi_rs-0.9.0/tests/decode_performance.rs +410 -0
  460. wsi_rs-0.9.0/tests/dicom_12bit.rs +284 -0
  461. wsi_rs-0.9.0/tests/dicom_parity.rs +228 -0
  462. wsi_rs-0.9.0/tests/fixtures/dicom_12bit/README.md +30 -0
  463. wsi_rs-0.9.0/tests/fixtures/dicom_12bit/mono2-extended.dcm +0 -0
  464. wsi_rs-0.9.0/tests/fixtures/dicom_12bit/mono2-extended.ppm +0 -0
  465. wsi_rs-0.9.0/tests/fixtures/dicom_12bit/mono2-progressive.dcm +0 -0
  466. wsi_rs-0.9.0/tests/fixtures/dicom_12bit/mono2-progressive.ppm +0 -0
  467. wsi_rs-0.9.0/tests/fixtures/dicom_12bit/ybr422-extended.dcm +0 -0
  468. wsi_rs-0.9.0/tests/fixtures/dicom_12bit/ybr422-extended.ppm +0 -0
  469. wsi_rs-0.9.0/tests/fixtures/dicom_12bit/ybr422-progressive.dcm +0 -0
  470. wsi_rs-0.9.0/tests/fixtures/dicom_12bit/ybr422-progressive.ppm +0 -0
  471. wsi_rs-0.9.0/tests/fixtures/jp2k/README.md +51 -0
  472. wsi_rs-0.9.0/tests/fixtures/jp2k/generate.py +261 -0
  473. wsi_rs-0.9.0/tests/fixtures/jp2k/openjph_rgb_u8_53.j2k +0 -0
  474. wsi_rs-0.9.0/tests/fixtures/jp2k/openjph_rgb_u8_53.ppm +0 -0
  475. wsi_rs-0.9.0/tests/fixtures/jp2k/openjph_rgb_u8_53.r1.ppm +0 -0
  476. wsi_rs-0.9.0/tests/fixtures/jp2k/openjph_rgb_u8_53.r2.ppm +4 -0
  477. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_mct.j2k +0 -0
  478. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_mct.ppm +0 -0
  479. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_mct.r1.ppm +4 -0
  480. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_mct.r2.ppm +4 -0
  481. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_nomct.j2k +0 -0
  482. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_nomct.ppm +0 -0
  483. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_nomct.r1.ppm +0 -0
  484. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_nomct.r2.ppm +4 -0
  485. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_rct.j2k +0 -0
  486. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_rct.ppm +0 -0
  487. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_rct.r1.ppm +0 -0
  488. wsi_rs-0.9.0/tests/fixtures/jp2k/rgb_rct.r2.ppm +0 -0
  489. wsi_rs-0.9.0/tests/fixtures/jp2k/truncated_tall_tag_tree.j2k +0 -0
  490. wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_420.j2k +0 -0
  491. wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_420.ppm +0 -0
  492. wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_420.wsi-rgb +0 -0
  493. wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_422.j2k +0 -0
  494. wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_422.ppm +0 -0
  495. wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_422.wsi-rgb +0 -0
  496. wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_444.j2k +0 -0
  497. wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_444.ppm +0 -0
  498. wsi_rs-0.9.0/tests/fixtures/jp2k/ycbcr_444.wsi-rgb +0 -0
  499. wsi_rs-0.9.0/tests/fixtures/jpeg/README.md +21 -0
  500. wsi_rs-0.9.0/tests/fixtures/jpeg/baseline_420_16x16.jpg +0 -0
  501. wsi_rs-0.9.0/tests/fixtures/jpeg/baseline_420_16x16.ppm +0 -0
  502. wsi_rs-0.9.0/tests/fixtures/jpeg/baseline_420_16x16.r2.ppm +4 -0
  503. wsi_rs-0.9.0/tests/fixtures/jpeg/progressive_8x8.jpg +0 -0
  504. wsi_rs-0.9.0/tests/fixtures/jpeg/progressive_8x8.ppm +0 -0
  505. wsi_rs-0.9.0/tests/fixtures/jpeg/progressive_8x8.r1.ppm +4 -0
  506. wsi_rs-0.9.0/tests/fixtures/jxr/README.md +20 -0
  507. wsi_rs-0.9.0/tests/fixtures/jxr/rgb.czi +0 -0
  508. wsi_rs-0.9.0/tests/fixtures/jxr/rgb.jxr +0 -0
  509. wsi_rs-0.9.0/tests/fixtures/jxr/rgb.ppm +0 -0
  510. wsi_rs-0.9.0/tests/fixtures/parity_corpus.private.toml.example +69 -0
  511. wsi_rs-0.9.0/tests/fixtures/parity_corpus.public.toml +461 -0
  512. wsi_rs-0.9.0/tests/fixtures/public_dicom/README.md +35 -0
  513. wsi_rs-0.9.0/tests/fixtures/public_dicom/progressive-sof2.dcm +0 -0
  514. wsi_rs-0.9.0/tests/fixtures/public_dicom/progressive-sof2.ppm +4 -0
  515. wsi_rs-0.9.0/tests/fixtures/public_dicom/ybr-ict.dcm +0 -0
  516. wsi_rs-0.9.0/tests/fixtures/public_dicom/ybr-ict.ppm +0 -0
  517. wsi_rs-0.9.0/tests/fixtures/public_dicom/ybr-rct.dcm +0 -0
  518. wsi_rs-0.9.0/tests/fixtures/public_dicom/ybr-rct.ppm +148 -12
  519. wsi_rs-0.9.0/tests/fixtures/public_dicom/ybr-rct.svcache +0 -0
  520. wsi_rs-0.9.0/tests/hamamatsu_vmu.rs +441 -0
  521. wsi_rs-0.9.0/tests/j2k_parity.rs +139 -0
  522. wsi_rs-0.9.0/tests/metal_edge_conformance.rs +64 -0
  523. wsi_rs-0.9.0/tests/metal_surface_smoke.rs +55 -0
  524. wsi_rs-0.9.0/tests/openslide_compare.rs +517 -0
  525. wsi_rs-0.9.0/tests/openslide_parity.rs +355 -0
  526. wsi_rs-0.9.0/tests/openslide_test_support/mod.rs +1 -0
  527. wsi_rs-0.9.0/tests/panning_performance.rs +362 -0
  528. wsi_rs-0.9.0/tests/real_wsi_behavior.rs +347 -0
  529. wsi_rs-0.9.0/tests/repo_integrity.rs +6 -0
  530. wsi_rs-0.9.0/tests/repo_policy/hygiene.rs +244 -0
  531. wsi_rs-0.9.0/tests/repo_policy/support.rs +52 -0
  532. wsi_rs-0.9.0/tests/repo_policy/unsafe_syntax.rs +252 -0
  533. wsi_rs-0.9.0/tests/support/bench.rs +61 -0
  534. wsi_rs-0.9.0/tests/support/compare.rs +102 -0
  535. wsi_rs-0.9.0/tests/support/corpus.rs +74 -0
  536. wsi_rs-0.9.0/tests/support/mod.rs +33 -0
  537. wsi_rs-0.9.0/tests/support/openslide_shim.rs +6 -0
  538. wsi_rs-0.9.0/tests/support/oracles.rs +1033 -0
  539. wsi_rs-0.9.0/tests/support_unit.rs +400 -0
  540. wsi_rs-0.9.0/tests/vendor_reference.rs +106 -0
  541. wsi_rs-0.9.0/tests/zeiss_czi.rs +126 -0
  542. wsi_rs-0.9.0/tests/zeiss_zvi.rs +185 -0
  543. wsi_rs-0.9.0/wsi-rs-python/Cargo.toml +31 -0
  544. wsi_rs-0.9.0/wsi-rs-python/README.md +190 -0
  545. wsi_rs-0.9.0/wsi-rs-python/build.rs +6 -0
  546. wsi_rs-0.9.0/wsi-rs-python/src/lib.rs +302 -0
  547. wsi_rs-0.9.0/wsi-rs-python/src/locations.rs +397 -0
  548. wsi_rs-0.9.0/wsi-rs-python/src/metadata.rs +120 -0
  549. wsi_rs-0.9.0/wsi-rs-python/src/tiles.rs +171 -0
  550. wsi_rs-0.9.0/wsi-rs-python/tests/test_j2k.py +60 -0
  551. wsi_rs-0.9.0/wsi-rs-python/tests/test_locations.py +323 -0
  552. wsi_rs-0.9.0/wsi-rs-python/tests/test_reader.py +193 -0
  553. 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"
@@ -0,0 +1,2 @@
1
+ # P6 pixel references may contain no NUL bytes, but are never text.
2
+ *.ppm binary
@@ -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/