opencodecs 0.4.0__tar.gz → 0.5.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 (504) hide show
  1. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/VENDOR.toml +36 -11
  2. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bcdec/bcdec.h +53 -0
  3. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bitshuffle/bitshuffle_core.c +3 -1
  4. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bitshuffle/bitshuffle_core.h +4 -1
  5. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bitshuffle/bitshuffle_internals.h +4 -1
  6. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/cfitsio/ricecomp.c +31 -0
  7. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/libspng/spng.c +21 -6
  8. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/oc_eer/oc_eer.h +9 -3
  9. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/oc_giflzw/oc_giflzw.c +20 -5
  10. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/oc_giflzw/oc_giflzw.h +4 -3
  11. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/oc_tifflzw/oc_tifflzw.c +132 -70
  12. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/oc_tifflzw/oc_tifflzw.h +3 -2
  13. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/rgbe/rgbe.c +50 -8
  14. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/vendor_hashes.json +6 -6
  15. {opencodecs-0.4.0 → opencodecs-0.5.0}/CHANGES.rst +1037 -0
  16. {opencodecs-0.4.0/src/opencodecs.egg-info → opencodecs-0.5.0}/PKG-INFO +140 -127
  17. {opencodecs-0.4.0 → opencodecs-0.5.0}/README.md +139 -126
  18. {opencodecs-0.4.0 → opencodecs-0.5.0}/bench/build_libjxl.sh +9 -0
  19. {opencodecs-0.4.0 → opencodecs-0.5.0}/pyproject.toml +15 -19
  20. {opencodecs-0.4.0 → opencodecs-0.5.0}/setup.py +5 -3
  21. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/__init__.py +1 -1
  22. opencodecs-0.5.0/src/opencodecs/_aec_codec.py +557 -0
  23. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_avif_codec.py +103 -13
  24. opencodecs-0.5.0/src/opencodecs/_avif_heif_params.py +110 -0
  25. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_bcn_codec.py +9 -0
  26. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_bitshuffle_codec.py +26 -6
  27. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_blosc2_codec.py +33 -14
  28. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_bmp_codec.py +244 -46
  29. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_brotli_codec.py +9 -8
  30. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_byteshuffle_codec.py +47 -5
  31. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_deflate_codec.py +25 -10
  32. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_dicomrle_codec.py +18 -4
  33. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_dicomweb.py +2 -1
  34. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_eer_reader.py +7 -2
  35. opencodecs-0.5.0/src/opencodecs/_filter_args.py +41 -0
  36. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_gif_codec.py +57 -14
  37. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_gzip_codec.py +66 -21
  38. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_heif_codec.py +127 -20
  39. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_htj2k_codec.py +41 -8
  40. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_htj2k_pyramid.py +11 -7
  41. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_jpeg2k_codec.py +36 -25
  42. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_jpeg_codec.py +35 -8
  43. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_jpegls_codec.py +28 -3
  44. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_lerc_codec.py +34 -5
  45. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_lz4_codec.py +13 -8
  46. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_mozjpeg_codec.py +34 -11
  47. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_n5.py +16 -2
  48. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_ndtiff_writer.py +6 -2
  49. opencodecs-0.5.0/src/opencodecs/_numpy_codec.py +222 -0
  50. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_omezarr.py +3 -3
  51. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_omezarr_writer.py +5 -3
  52. opencodecs-0.5.0/src/opencodecs/_packints_codec.py +432 -0
  53. opencodecs-0.5.0/src/opencodecs/_pcodec_codec.py +210 -0
  54. opencodecs-0.5.0/src/opencodecs/_png_codec.py +154 -0
  55. opencodecs-0.5.0/src/opencodecs/_predictor_codec.py +622 -0
  56. opencodecs-0.5.0/src/opencodecs/_qoi_codec.py +86 -0
  57. opencodecs-0.5.0/src/opencodecs/_quantize_codec.py +508 -0
  58. opencodecs-0.5.0/src/opencodecs/_rcomp_codec.py +263 -0
  59. opencodecs-0.5.0/src/opencodecs/_rgbe.py +63 -0
  60. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_rgbe_codec.py +15 -4
  61. opencodecs-0.5.0/src/opencodecs/_snappy_codec.py +134 -0
  62. opencodecs-0.5.0/src/opencodecs/_sperr_codec.py +200 -0
  63. opencodecs-0.5.0/src/opencodecs/_sz3_codec.py +185 -0
  64. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_tiff_codec.py +82 -21
  65. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_tiff_writer.py +152 -71
  66. opencodecs-0.5.0/src/opencodecs/_webp_codec.py +266 -0
  67. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_zstd_codec.py +5 -7
  68. opencodecs-0.5.0/src/opencodecs/codecs/_aec.pyx +494 -0
  69. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_avif.pyx +204 -110
  70. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_bcdec.pyx +43 -8
  71. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_blosc2.pyx +126 -7
  72. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_brotli.pyx +55 -17
  73. opencodecs-0.5.0/src/opencodecs/codecs/_bytetools.pyx +615 -0
  74. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_charls.pyx +99 -37
  75. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_deflate.pyx +172 -17
  76. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_eer.pyx +44 -28
  77. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_gif.pyx +313 -330
  78. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_heif.pyx +314 -80
  79. opencodecs-0.5.0/src/opencodecs/codecs/_jpeg.pyx +842 -0
  80. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_jpeg2k.pyx +541 -145
  81. opencodecs-0.5.0/src/opencodecs/codecs/_jpeg_common.py +437 -0
  82. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_lerc.pyx +189 -32
  83. opencodecs-0.5.0/src/opencodecs/codecs/_lz4.pyx +662 -0
  84. opencodecs-0.5.0/src/opencodecs/codecs/_mozjpeg.pyx +589 -0
  85. opencodecs-0.5.0/src/opencodecs/codecs/_openjph.pyx +624 -0
  86. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_pcodec.pyx +122 -22
  87. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_png.pyx +233 -101
  88. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_qoi.pyx +11 -1
  89. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_rcomp.pyx +75 -39
  90. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_registry.py +4 -2
  91. opencodecs-0.5.0/src/opencodecs/codecs/_rgbe.pyx +377 -0
  92. opencodecs-0.5.0/src/opencodecs/codecs/_snappy.pyx +429 -0
  93. opencodecs-0.5.0/src/opencodecs/codecs/_sperr.pyx +746 -0
  94. opencodecs-0.5.0/src/opencodecs/codecs/_sz3.pyx +703 -0
  95. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_tiff.pyx +243 -212
  96. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_webp.pyx +94 -71
  97. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_zstd.pyx +77 -7
  98. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/avif.pxd +1 -0
  99. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/bcdec.pxd +9 -0
  100. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/blosc2.pxd +8 -0
  101. opencodecs-0.5.0/src/opencodecs/codecs/byteplanes.h +160 -0
  102. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/charls.pxd +5 -1
  103. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/heif.pxd +20 -0
  104. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/lerc.pxd +32 -0
  105. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/libaec.pxd +7 -0
  106. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/lz4.pxd +7 -0
  107. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/mozjpeg.pxd +9 -0
  108. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/openjpeg.pxd +20 -0
  109. opencodecs-0.5.0/src/opencodecs/codecs/openjph.pxd +73 -0
  110. opencodecs-0.5.0/src/opencodecs/codecs/openjph_shim.cpp +604 -0
  111. opencodecs-0.5.0/src/opencodecs/codecs/openjph_shim.h +169 -0
  112. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/sperr.pxd +4 -0
  113. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/spng.pxd +15 -1
  114. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/turbojpeg.pxd +34 -0
  115. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/webp.pxd +1 -0
  116. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/webp_shim.c +15 -6
  117. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/webp_shim.h +4 -3
  118. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/zstd.pxd +1 -0
  119. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/_sidecar_header.py +11 -9
  120. opencodecs-0.5.0/src/opencodecs/core/buffers.py +221 -0
  121. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/io.py +109 -43
  122. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/segment_compression.py +36 -0
  123. {opencodecs-0.4.0 → opencodecs-0.5.0/src/opencodecs.egg-info}/PKG-INFO +140 -127
  124. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs.egg-info/SOURCES.txt +24 -2
  125. opencodecs-0.5.0/tests/test_avif_heif_params.py +616 -0
  126. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_avif_sequence.py +31 -2
  127. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_bcdec.py +32 -2
  128. opencodecs-0.5.0/tests/test_bcn_rounding.py +121 -0
  129. opencodecs-0.5.0/tests/test_bitshuffle_format.py +49 -0
  130. opencodecs-0.5.0/tests/test_bmp_headers.py +521 -0
  131. opencodecs-0.5.0/tests/test_byteplanes.py +106 -0
  132. opencodecs-0.5.0/tests/test_bytestream_standards.py +1003 -0
  133. opencodecs-0.5.0/tests/test_charls.py +266 -0
  134. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_corpus_codec_decode.py +23 -25
  135. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_corpus_native_fixtures.py +21 -2
  136. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_corpus_png.py +38 -0
  137. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_coverage_push.py +0 -48
  138. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_delta_parity.py +65 -0
  139. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_direct_filter_outputs.py +3 -1
  140. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_eer.py +115 -6
  141. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_encode_comprehensive.py +9 -4
  142. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_error_handling.py +11 -5
  143. opencodecs-0.5.0/tests/test_filter_compat.py +923 -0
  144. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_fits.py +6 -6
  145. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_gif.py +2 -1
  146. opencodecs-0.5.0/tests/test_gif_compositing.py +563 -0
  147. opencodecs-0.5.0/tests/test_htj2k_compat.py +513 -0
  148. opencodecs-0.5.0/tests/test_jpeg.py +843 -0
  149. opencodecs-0.5.0/tests/test_jpeg2k_compat.py +512 -0
  150. opencodecs-0.5.0/tests/test_lerc.py +217 -0
  151. opencodecs-0.5.0/tests/test_mozjpeg.py +280 -0
  152. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_n5.py +120 -0
  153. opencodecs-0.5.0/tests/test_numpy_codec_format.py +194 -0
  154. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_openjph.py +12 -15
  155. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_phase4_filters.py +42 -0
  156. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_phase6_codecs.py +5 -4
  157. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_pipeline_catalog.py +1 -1
  158. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_platform_branches.py +8 -4
  159. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_png_row_sessions.py +6 -4
  160. opencodecs-0.5.0/tests/test_png_standard.py +443 -0
  161. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_public_output_buffers.py +19 -3
  162. opencodecs-0.5.0/tests/test_qoi_standard.py +93 -0
  163. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_rcomp_truncated_input.py +2 -1
  164. opencodecs-0.5.0/tests/test_read_file_into.py +211 -0
  165. opencodecs-0.5.0/tests/test_rgbe_toplevel.py +304 -0
  166. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_sidecar_header.py +29 -9
  167. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_snappy.py +7 -1
  168. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tier1_scientific.py +35 -10
  169. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_codec_encode.py +34 -0
  170. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_native.py +41 -14
  171. opencodecs-0.5.0/tests/test_tiff_predictor2_interop.py +608 -0
  172. opencodecs-0.5.0/tests/test_tiff_predictor_loops.py +62 -0
  173. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_webp_animation.py +8 -3
  174. opencodecs-0.5.0/tests/test_webp_decode_options.py +207 -0
  175. opencodecs-0.5.0/tests/test_webp_encode_standard.py +239 -0
  176. opencodecs-0.5.0/tests/test_wrapper_streams.py +2012 -0
  177. opencodecs-0.4.0/src/opencodecs/_aec_codec.py +0 -136
  178. opencodecs-0.4.0/src/opencodecs/_numpy_codec.py +0 -124
  179. opencodecs-0.4.0/src/opencodecs/_packints_codec.py +0 -222
  180. opencodecs-0.4.0/src/opencodecs/_pcodec_codec.py +0 -76
  181. opencodecs-0.4.0/src/opencodecs/_png_codec.py +0 -96
  182. opencodecs-0.4.0/src/opencodecs/_predictor_codec.py +0 -519
  183. opencodecs-0.4.0/src/opencodecs/_qoi_codec.py +0 -57
  184. opencodecs-0.4.0/src/opencodecs/_quantize_codec.py +0 -174
  185. opencodecs-0.4.0/src/opencodecs/_rcomp_codec.py +0 -121
  186. opencodecs-0.4.0/src/opencodecs/_rgbe.py +0 -299
  187. opencodecs-0.4.0/src/opencodecs/_snappy_codec.py +0 -63
  188. opencodecs-0.4.0/src/opencodecs/_sperr_codec.py +0 -94
  189. opencodecs-0.4.0/src/opencodecs/_sz3_codec.py +0 -91
  190. opencodecs-0.4.0/src/opencodecs/_webp_codec.py +0 -184
  191. opencodecs-0.4.0/src/opencodecs/codecs/_aec.pyx +0 -365
  192. opencodecs-0.4.0/src/opencodecs/codecs/_bytetools.pyx +0 -366
  193. opencodecs-0.4.0/src/opencodecs/codecs/_jpeg.pyx +0 -474
  194. opencodecs-0.4.0/src/opencodecs/codecs/_lz4.pyx +0 -352
  195. opencodecs-0.4.0/src/opencodecs/codecs/_mozjpeg.pyx +0 -387
  196. opencodecs-0.4.0/src/opencodecs/codecs/_openjph.pyx +0 -359
  197. opencodecs-0.4.0/src/opencodecs/codecs/_rgbe.pyx +0 -241
  198. opencodecs-0.4.0/src/opencodecs/codecs/_snappy.pyx +0 -191
  199. opencodecs-0.4.0/src/opencodecs/codecs/_sperr.pyx +0 -279
  200. opencodecs-0.4.0/src/opencodecs/codecs/_sz3.pyx +0 -264
  201. opencodecs-0.4.0/src/opencodecs/codecs/byteplanes.h +0 -45
  202. opencodecs-0.4.0/src/opencodecs/codecs/openjph.pxd +0 -46
  203. opencodecs-0.4.0/src/opencodecs/codecs/openjph_shim.cpp +0 -451
  204. opencodecs-0.4.0/src/opencodecs/codecs/openjph_shim.h +0 -121
  205. opencodecs-0.4.0/src/opencodecs/core/buffers.py +0 -97
  206. opencodecs-0.4.0/src/opencodecs/tifffile_patch.py +0 -258
  207. opencodecs-0.4.0/tests/test_charls.py +0 -92
  208. opencodecs-0.4.0/tests/test_mozjpeg.py +0 -114
  209. opencodecs-0.4.0/tests/test_read_file_into.py +0 -117
  210. opencodecs-0.4.0/tests/test_tifffile_patch.py +0 -237
  211. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bcdec/LICENSE +0 -0
  212. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bcdec/README.md +0 -0
  213. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bitshuffle/LICENSE +0 -0
  214. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bitshuffle/README.rst +0 -0
  215. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bitshuffle/bitshuffle.c +0 -0
  216. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bitshuffle/bitshuffle.h +0 -0
  217. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bitshuffle/iochain.c +0 -0
  218. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/bitshuffle/iochain.h +0 -0
  219. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/cfitsio/License.txt +0 -0
  220. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/cfitsio/fits_hcompress.c +0 -0
  221. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/cfitsio/fits_hdecompress.c +0 -0
  222. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/cfitsio/fits_hdecompress_api.h +0 -0
  223. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/cfitsio/fitsio2.h +0 -0
  224. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/cfitsio/pliocomp.c +0 -0
  225. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/cfitsio/ricecomp.h +0 -0
  226. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/libspng/LICENSE +0 -0
  227. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/libspng/spng.h +0 -0
  228. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/oc_eer/LICENSE +0 -0
  229. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/oc_eer/oc_eer.c +0 -0
  230. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/oc_giflzw/LICENSE +0 -0
  231. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/oc_tifflzw/LICENSE +0 -0
  232. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/qoi/LICENSE +0 -0
  233. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/qoi/qoi.h +0 -0
  234. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/rgbe/rgbe.h +0 -0
  235. {opencodecs-0.4.0 → opencodecs-0.5.0}/3rdparty/rgbe/rgbe.txt +0 -0
  236. {opencodecs-0.4.0 → opencodecs-0.5.0}/LICENSE +0 -0
  237. {opencodecs-0.4.0 → opencodecs-0.5.0}/MANIFEST.in +0 -0
  238. {opencodecs-0.4.0 → opencodecs-0.5.0}/THIRD-PARTY.md +0 -0
  239. {opencodecs-0.4.0 → opencodecs-0.5.0}/patches/libjxl/README.md +0 -0
  240. {opencodecs-0.4.0 → opencodecs-0.5.0}/setup.cfg +0 -0
  241. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_b2nd_codec.py +0 -0
  242. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_brunsli_codec.py +0 -0
  243. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_bz2_codec.py +0 -0
  244. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_cms_codec.py +0 -0
  245. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_czi_codec.py +0 -0
  246. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_czi_reader.py +0 -0
  247. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_czi_writer.py +0 -0
  248. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_dicom.py +0 -0
  249. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_dicom_codec.py +0 -0
  250. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_dicom_pyramid.py +0 -0
  251. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_dm.py +0 -0
  252. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_dm_codec.py +0 -0
  253. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_emd.py +0 -0
  254. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_emd_codec.py +0 -0
  255. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_ets.py +0 -0
  256. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_fits.py +0 -0
  257. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_fits_codec.py +0 -0
  258. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_fits_compressed.py +0 -0
  259. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_h5_common.py +0 -0
  260. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_hdf5_codec.py +0 -0
  261. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_hdf5_http.py +0 -0
  262. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_imaris.py +0 -0
  263. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_jpeg2k_pyramid.py +0 -0
  264. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_jpeg_pyramid.py +0 -0
  265. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_jxl_codec.py +0 -0
  266. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_lif_codec.py +0 -0
  267. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_lif_native.py +0 -0
  268. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_lzma_codec.py +0 -0
  269. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_mozjpeg_pyramid.py +0 -0
  270. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_mrc.py +0 -0
  271. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_mrc_codec.py +0 -0
  272. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_mrc_writer.py +0 -0
  273. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_nd2_codec.py +0 -0
  274. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_nd2_native.py +0 -0
  275. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_ndtiff.py +0 -0
  276. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_ndtiff_pyramid.py +0 -0
  277. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_nifti.py +0 -0
  278. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_nifti_codec.py +0 -0
  279. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_nifti_writer.py +0 -0
  280. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_none_codec.py +0 -0
  281. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_nrrd.py +0 -0
  282. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_nrrd_codec.py +0 -0
  283. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_numpy_reader.py +0 -0
  284. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_oib_codec.py +0 -0
  285. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_oib_native.py +0 -0
  286. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_oir_codec.py +0 -0
  287. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_ole2.py +0 -0
  288. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_ome_xml.py +0 -0
  289. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_pyramid_build.py +0 -0
  290. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_scaled_pyramid.py +0 -0
  291. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_tiff_http.py +0 -0
  292. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_tiff_pyramid.py +0 -0
  293. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_ultrahdr_codec.py +0 -0
  294. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_vsi_codec.py +0 -0
  295. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_vsi_pyramid.py +0 -0
  296. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_zarr_codecs.py +0 -0
  297. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/_zfp_codec.py +0 -0
  298. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/__init__.py +0 -0
  299. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_b2nd.pyx +0 -0
  300. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_bitshuffle.pyx +0 -0
  301. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_bmp.pyx +0 -0
  302. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_brunsli.pyx +0 -0
  303. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_hcomp.pyx +0 -0
  304. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_isal.pyx +0 -0
  305. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_jpegxr.pyx +0 -0
  306. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_jxl.pyx +0 -0
  307. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_ndtiff.pyx +0 -0
  308. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_plio.pyx +0 -0
  309. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_uhdr.pyx +0 -0
  310. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/_zfp.pyx +0 -0
  311. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/b2nd.pxd +0 -0
  312. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/b2nd_helpers.c +0 -0
  313. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/b2nd_helpers.h +0 -0
  314. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/bitshuffle.pxd +0 -0
  315. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/brotli.pxd +0 -0
  316. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/brunsli.pxd +0 -0
  317. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/eer.pxd +0 -0
  318. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/giflib.pxd +0 -0
  319. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/heif_shim.h +0 -0
  320. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/isal_shim.c +0 -0
  321. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/jpegxr_shim.c +0 -0
  322. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/jpegxr_shim.h +0 -0
  323. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/libjxl.pxd +0 -0
  324. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/libuhdr.pxd +0 -0
  325. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/oc_decoder_vtable.h +0 -0
  326. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/pcodec.pxd +0 -0
  327. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/qoi.pxd +0 -0
  328. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/rgbe.pxd +0 -0
  329. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/snappy.pxd +0 -0
  330. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/sz3c.pxd +0 -0
  331. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/zfp.pxd +0 -0
  332. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/codecs/zlib_h.pxd +0 -0
  333. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/__init__.py +0 -0
  334. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/_io_helpers.py +0 -0
  335. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/_optional_backend.py +0 -0
  336. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/_range_index.py +0 -0
  337. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/_write_helpers.py +0 -0
  338. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/checksums.py +0 -0
  339. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/codec.py +0 -0
  340. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/color.py +0 -0
  341. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/errors.py +0 -0
  342. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/native_source.py +0 -0
  343. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/parallel.py +0 -0
  344. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/pipeline.py +0 -0
  345. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/pyramid.py +0 -0
  346. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/rows.py +0 -0
  347. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/scratch.py +0 -0
  348. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/streaming.py +0 -0
  349. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/tile_cache.py +0 -0
  350. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/core/verification.py +0 -0
  351. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/jxl.py +0 -0
  352. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/parallel.py +0 -0
  353. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/tiff_reader.py +0 -0
  354. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/uhdr.py +0 -0
  355. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs/zarr.py +0 -0
  356. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs.egg-info/dependency_links.txt +0 -0
  357. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs.egg-info/requires.txt +0 -0
  358. {opencodecs-0.4.0 → opencodecs-0.5.0}/src/opencodecs.egg-info/top_level.txt +0 -0
  359. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_auto_pyramid.py +0 -0
  360. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_b2nd_file_reader.py +0 -0
  361. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_bcn_bands.py +0 -0
  362. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_blosc2_partial.py +0 -0
  363. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_blosc2_threads.py +0 -0
  364. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_bounded_pipeline.py +0 -0
  365. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_brunsli.py +0 -0
  366. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_capability_manifest.py +0 -0
  367. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_chunked_means_cheap.py +0 -0
  368. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_codec_registry.py +0 -0
  369. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_container_pipeline.py +0 -0
  370. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_container_streaming.py +0 -0
  371. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_core_codec_api.py +0 -0
  372. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_corpus.py +0 -0
  373. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_corpus_manifest.py +0 -0
  374. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_corpus_other.py +0 -0
  375. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_corpus_tiff.py +0 -0
  376. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_corpus_vendors.py +0 -0
  377. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_coverage_final.py +0 -0
  378. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_coverage_finishing.py +0 -0
  379. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_coverage_last.py +0 -0
  380. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_coverage_more.py +0 -0
  381. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_bounded_iteration.py +0 -0
  382. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_direct_decode.py +0 -0
  383. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_fixture.py +0 -0
  384. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_mixed_subblocks.py +0 -0
  385. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_parallel_write.py +0 -0
  386. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_pyramid.py +0 -0
  387. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_read_dispatch.py +0 -0
  388. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_read_out.py +0 -0
  389. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_recompress.py +0 -0
  390. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_region_index.py +0 -0
  391. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_region_windows.py +0 -0
  392. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_segment_parts.py +0 -0
  393. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_slide_geometry.py +0 -0
  394. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_verification.py +0 -0
  395. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_write_pipeline.py +0 -0
  396. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_writer.py +0 -0
  397. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_czi_writer_shuffle.py +0 -0
  398. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_data_source.py +0 -0
  399. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_decode_releases_gil.py +0 -0
  400. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_deflate.py +0 -0
  401. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_dicom.py +0 -0
  402. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_dicom_encodings.py +0 -0
  403. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_dicom_parallel.py +0 -0
  404. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_dicom_slide_selection.py +0 -0
  405. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_dicom_wsi_pyramid.py +0 -0
  406. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_dicomweb.py +0 -0
  407. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_dm.py +0 -0
  408. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_dm_offsets.py +0 -0
  409. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_dm_synthetic.py +0 -0
  410. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_edge_cases.py +0 -0
  411. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_eer_parallel.py +0 -0
  412. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_eer_worker_budget.py +0 -0
  413. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_emd.py +0 -0
  414. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_fd_writes.py +0 -0
  415. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_filter_scratch.py +0 -0
  416. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_fits_parallel.py +0 -0
  417. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_gzip_presized.py +0 -0
  418. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_hdf5_http.py +0 -0
  419. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_hdf5_local.py +0 -0
  420. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_hdf5_parallel.py +0 -0
  421. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_hdf5_remote.py +0 -0
  422. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_heif_avif_features.py +0 -0
  423. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_heif_multi_image.py +0 -0
  424. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_htj2k_conformance.py +0 -0
  425. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_http_byte_savings.py +0 -0
  426. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_http_prefetch.py +0 -0
  427. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_http_unified.py +0 -0
  428. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_imaris.py +0 -0
  429. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_incremental_byte_codecs.py +0 -0
  430. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_io_chunked.py +0 -0
  431. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_isal.py +0 -0
  432. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_jpeg2k_region.py +0 -0
  433. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_jpegxr.py +0 -0
  434. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_jxl.py +0 -0
  435. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_lif_indexing.py +0 -0
  436. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_lif_native.py +0 -0
  437. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_live_archives.py +0 -0
  438. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_mrc.py +0 -0
  439. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_mrc_mrcz_http.py +0 -0
  440. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_mrc_nifti_writers.py +0 -0
  441. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_native_output_sinks.py +0 -0
  442. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_native_parity.py +0 -0
  443. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_native_source_callbacks.py +0 -0
  444. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_nd2_native.py +0 -0
  445. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_ndtiff.py +0 -0
  446. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_nifti.py +0 -0
  447. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_nrrd.py +0 -0
  448. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_nrrd_iteration.py +0 -0
  449. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_nrrd_slices.py +0 -0
  450. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_offset_readers.py +0 -0
  451. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_oib_indexing.py +0 -0
  452. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_oib_native.py +0 -0
  453. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_ome_xml.py +0 -0
  454. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_omezarr.py +0 -0
  455. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_omezarr_sharded_range.py +0 -0
  456. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_open_pyramid.py +0 -0
  457. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_optional_backend.py +0 -0
  458. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_owned_color_context.py +0 -0
  459. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_owned_image_decoders.py +0 -0
  460. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_parallel_jxl.py +0 -0
  461. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_phase5_icc.py +0 -0
  462. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_phase7_cms.py +0 -0
  463. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_pipeline_budget.py +0 -0
  464. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_pipeline_executor.py +0 -0
  465. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_pyramid_batched_regions.py +0 -0
  466. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_range_pipeline_completion.py +0 -0
  467. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_reader_contract.py +0 -0
  468. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_reader_source_kinds.py +0 -0
  469. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_reader_streaming.py +0 -0
  470. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_reference_parity.py +0 -0
  471. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_rgbe.py +0 -0
  472. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_scaled_pyramid.py +0 -0
  473. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_segment_encoder_binding.py +0 -0
  474. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_shared_io_regressions.py +0 -0
  475. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_source_pool_lifetime.py +0 -0
  476. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_streaming_means_streaming.py +0 -0
  477. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_threading_policy.py +0 -0
  478. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_fused_decode.py +0 -0
  479. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_http.py +0 -0
  480. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_parallel_decode.py +0 -0
  481. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_pipeline.py +0 -0
  482. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_pyramid.py +0 -0
  483. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_read_path.py +0 -0
  484. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_reader.py +0 -0
  485. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_spool.py +0 -0
  486. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_writer.py +0 -0
  487. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_writer_float_predictor.py +0 -0
  488. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tiff_writer_verification.py +0 -0
  489. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_tile_cache.py +0 -0
  490. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_uhdr.py +0 -0
  491. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_unified_api.py +0 -0
  492. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_url_sources.py +0 -0
  493. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_vendor_provenance.py +0 -0
  494. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_verified_encoding.py +0 -0
  495. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_version_consistency.py +0 -0
  496. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_vsi_oir.py +0 -0
  497. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_vsi_pyramid.py +0 -0
  498. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_writer_contract.py +0 -0
  499. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_writer_pipeline_completion.py +0 -0
  500. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_writer_verification.py +0 -0
  501. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_zarr_adapters.py +0 -0
  502. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_zarr_region_fast_path.py +0 -0
  503. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_zfp_blocks.py +0 -0
  504. {opencodecs-0.4.0 → opencodecs-0.5.0}/tests/test_zstd_owned_output.py +0 -0
@@ -59,9 +59,16 @@ multi-byte casts with byte-wise readers."""
59
59
  upstream = "bcdec.h"
60
60
  modified = true
61
61
  note = """Upstream at the pinned commit, plus one six-line comment on \
62
- the BC4/BC5 signed path and trailing whitespace stripped. Verified by \
63
- reconstruction: our file with that comment removed and trailing \
64
- whitespace normalized is byte-identical to upstream."""
62
+ the BC4/BC5 signed path, trailing whitespace stripped, and one block in \
63
+ bcdec_bc7. Before that block, reconstruction verified the rest: our file \
64
+ with that comment removed and trailing whitespace normalized was \
65
+ byte-identical to upstream. The block, marked "opencodecs:", sits ahead of pass 2: \
66
+ modes without secondary indices (all but 4 and 5) skip the general \
67
+ per-texel loop, and with two or three subsets mix all four channels in \
68
+ 16-bit lanes of one 64-bit integer. Output is bit-identical (each lane \
69
+ holds bcdec__interpolate's exact result); BC7 decode measured 1.1 to \
70
+ 1.4x faster with MSVC, clang-cl, GCC and Apple Clang. Worth sending \
71
+ upstream."""
65
72
 
66
73
  [[component]]
67
74
  name = "bitshuffle"
@@ -84,7 +91,10 @@ uint64 branch of bshuf_write_uint64_BE. They silence MSVC C4244; the \
84
91
  truncation is intended in all three, the value is masked to a byte \
85
92
  already. Re-derived from upstream in 2026-09 so this delta is three \
86
93
  lines that can be read, rather than a file nobody could account for. \
87
- Worth sending upstream."""
94
+ And the USESSE2 guard also accepts _M_X64: MSVC never defines \
95
+ __SSE2__, though SSE2 is part of x86-64, so MSVC builds ran the scalar \
96
+ fallback, measured at half the speed of the SSE2 path. Both are worth \
97
+ sending upstream."""
88
98
  [[component.file]]
89
99
  local = "3rdparty/bitshuffle/bitshuffle_core.h"
90
100
  upstream = "src/bitshuffle_core.h"
@@ -92,7 +102,8 @@ Worth sending upstream."""
92
102
  modified = true
93
103
  note = """Upstream master, except the BSHUF_VERSION macros, which \
94
104
  upstream left at 0.4.0 on master; ours say 0.5.2 to match the released \
95
- version the rest of this directory tracks."""
105
+ version the rest of this directory tracks. And stdint.h is included for \
106
+ MSVC too, as in bitshuffle_internals.h."""
96
107
  [[component.file]]
97
108
  local = "3rdparty/bitshuffle/iochain.c"
98
109
  upstream = "src/iochain.c"
@@ -108,6 +119,11 @@ version the rest of this directory tracks."""
108
119
  [[component.file]]
109
120
  local = "3rdparty/bitshuffle/bitshuffle_internals.h"
110
121
  upstream = "src/bitshuffle_internals.h"
122
+ modified = true
123
+ note = """Pristine 0.5.2 except that stdint.h is included for MSVC, \
124
+ which has shipped it since 2010 but sets no __STDC_VERSION__ in its \
125
+ default C mode. The hand-written fallback typedefs have no int16_t, so \
126
+ the SSE2 path, once enabled for MSVC, did not compile."""
111
127
 
112
128
  [[component]]
113
129
  name = "cfitsio"
@@ -146,8 +162,12 @@ OC_THREAD_LOCAL, defined next to the min/max compatibility defines."""
146
162
  modified = true
147
163
  note = """Keeps the error-code return convention an earlier vendoring \
148
164
  introduced, because our binding depends on it, with upstream's \
149
- buffer-size guard applied on top. A blind update would break the \
150
- binding; port the fix, do not overwrite."""
165
+ buffer-size guard applied on top. The three decoders also check every \
166
+ input byte against the end of the stream (RICE_NEED_BYTE): upstream \
167
+ checks once per block, and a run of zero bits within a block has no \
168
+ length limit, so a damaged stream read past its buffer. See \
169
+ docs/rice_bounds.md. A blind update would break the binding and drop \
170
+ the checks; port the fix, do not overwrite."""
151
171
  # These three live in this directory but are opencodecs code, not
152
172
  # cfitsio's. ours = true means the drift check tracks them for
153
173
  # accidental edits but never compares them to upstream.
@@ -179,12 +199,17 @@ license = "BSD-2-Clause"
179
199
  local = "3rdparty/libspng/spng.c"
180
200
  upstream = "spng/spng.c"
181
201
  modified = true
182
- note = """Carries three opencodecs changes: the grayscale-defilter \
202
+ note = """Carries four opencodecs changes: the grayscale-defilter \
183
203
  patch, the filter_sum_* family (one function per filter instead of a \
184
- switch inside the per-byte loop), and the matching filter_scanline_* \
185
- family. The last two are the same transformation applied to the two \
204
+ switch inside the per-byte loop), the matching filter_scanline_* \
205
+ family, and a libdeflate bypass for an explicit compression strategy. \
206
+ The second and third are the same transformation applied to the two \
186
207
  halves of the encode filter path; both are branch hoisting, and both \
187
- produce byte-identical output to the code they replaced."""
208
+ produce byte-identical output to the code they replaced. The fourth: \
209
+ under SPNG_USE_LIBDEFLATE the IDAT stream is compressed in one \
210
+ libdeflate call; setting SPNG_IMG_COMPRESSION_STRATEGY switches that \
211
+ context back to zlib's deflate, since libdeflate has no strategy \
212
+ setting and the option would otherwise be ignored."""
188
213
  [[component.file]]
189
214
  local = "3rdparty/libspng/spng.h"
190
215
  upstream = "spng/spng.h"
@@ -1404,6 +1404,59 @@ BCDECDEF void bcdec_bc7(const void* compressedBlock, void* decompressedBlock, in
1404
1404
  }
1405
1405
  }
1406
1406
 
1407
+ /* opencodecs: modes without secondary indices (all but 4 and 5) have
1408
+ no rotation either, so they skip the general loop below. With two or
1409
+ three subsets all four channels mix at once: an endpoint's channels
1410
+ sit in the 16-bit lanes of one 64-bit integer, and as 255 * 64 + 32
1411
+ fits in a lane, one multiply per endpoint weights every channel with
1412
+ no carry between lanes, leaving bcdec__interpolate's exact result in
1413
+ each. One subset keeps the per-channel form, which Clang turns into
1414
+ NEON vector multiplies; the lanes measured 20% slower there. MSVC
1415
+ tested the subset count, secondary indices and rotation for every
1416
+ texel and multiplied each channel separately. Decoding 2048 x 2048
1417
+ random blocks, or all mode 6, measured 1.1 to 1.4x faster with MSVC
1418
+ 14.41 to 14.51, clang-cl, GCC and Apple Clang. */
1419
+ if (!indexBits2) {
1420
+ if (numPartitions == 1) {
1421
+ for (i = 0; i < 4; ++i) {
1422
+ for (j = 0; j < 4; ++j) {
1423
+ index = indices[i][j];
1424
+ r = bcdec__interpolate(endpoints[0][0], endpoints[1][0], weights, index);
1425
+ g = bcdec__interpolate(endpoints[0][1], endpoints[1][1], weights, index);
1426
+ b = bcdec__interpolate(endpoints[0][2], endpoints[1][2], weights, index);
1427
+ a = bcdec__interpolate(endpoints[0][3], endpoints[1][3], weights, index);
1428
+ decompressed[j * 4 + 0] = r;
1429
+ decompressed[j * 4 + 1] = g;
1430
+ decompressed[j * 4 + 2] = b;
1431
+ decompressed[j * 4 + 3] = a;
1432
+ }
1433
+ decompressed += destinationPitch;
1434
+ }
1435
+ } else {
1436
+ unsigned long long lo[3], hi[3], v;
1437
+ int w;
1438
+ for (k = 0; k < numPartitions; ++k) {
1439
+ lo[k] = (unsigned long long)endpoints[k * 2][0] | ((unsigned long long)endpoints[k * 2][1] << 16) |
1440
+ ((unsigned long long)endpoints[k * 2][2] << 32) | ((unsigned long long)endpoints[k * 2][3] << 48);
1441
+ hi[k] = (unsigned long long)endpoints[k * 2 + 1][0] | ((unsigned long long)endpoints[k * 2 + 1][1] << 16) |
1442
+ ((unsigned long long)endpoints[k * 2 + 1][2] << 32) | ((unsigned long long)endpoints[k * 2 + 1][3] << 48);
1443
+ }
1444
+ for (i = 0; i < 4; ++i) {
1445
+ for (j = 0; j < 4; ++j) {
1446
+ partitionSet = partition_sets[numPartitions - 2][partition][i][j] & 0x03;
1447
+ w = weights[(int)indices[i][j]];
1448
+ v = (lo[partitionSet] * (unsigned)(64 - w) + hi[partitionSet] * (unsigned)w + 0x0020002000200020ULL) >> 6;
1449
+ decompressed[j * 4 + 0] = (unsigned char)v;
1450
+ decompressed[j * 4 + 1] = (unsigned char)(v >> 16);
1451
+ decompressed[j * 4 + 2] = (unsigned char)(v >> 32);
1452
+ decompressed[j * 4 + 3] = (unsigned char)(v >> 48);
1453
+ }
1454
+ decompressed += destinationPitch;
1455
+ }
1456
+ }
1457
+ return;
1458
+ }
1459
+
1407
1460
  /* Pass #2: reading alpha indices (if any) and interpolating & rotating */
1408
1461
  for (i = 0; i < 4; ++i) {
1409
1462
  for (j = 0; j < 4; ++j) {
@@ -24,7 +24,9 @@
24
24
  #define USEAVX2
25
25
  #endif
26
26
 
27
- #if defined(__SSE2__) || defined(NO_WARN_X86_INTRINSICS)
27
+ /* opencodecs: or _M_X64. MSVC never defines __SSE2__, though every x86-64
28
+ CPU has SSE2, so MSVC builds ran the scalar fallback at half the speed. */
29
+ #if defined(__SSE2__) || defined(_M_X64) || defined(NO_WARN_X86_INTRINSICS)
28
30
  #define USESSE2
29
31
  #endif
30
32
 
@@ -31,7 +31,10 @@
31
31
  #define BITSHUFFLE_CORE_H
32
32
 
33
33
  // We assume GNU g++ defining `__cplusplus` has stdint.h
34
- #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199900L) || defined(__cplusplus)
34
+ /* opencodecs: and MSVC, which has shipped stdint.h since 2010 but sets no
35
+ __STDC_VERSION__ in its default C mode. The fallback below has no
36
+ int16_t, which the SSE2 byte transpose needs. */
37
+ #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199900L) || defined(__cplusplus) || defined(_MSC_VER)
35
38
  #include <stdint.h>
36
39
  #else
37
40
  typedef unsigned char uint8_t;
@@ -14,7 +14,10 @@
14
14
  #define BITSHUFFLE_INTERNALS_H
15
15
 
16
16
  // We assume GNU g++ defining `__cplusplus` has stdint.h
17
- #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199900L) || defined(__cplusplus)
17
+ /* opencodecs: and MSVC, which has shipped stdint.h since 2010 but sets no
18
+ __STDC_VERSION__ in its default C mode. The fallback below has no
19
+ int16_t, which the SSE2 byte transpose needs. */
20
+ #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199900L) || defined(__cplusplus) || defined(_MSC_VER)
18
21
  #include <stdint.h>
19
22
  #else
20
23
  typedef unsigned char uint8_t;
@@ -892,6 +892,19 @@ done_outputing_bits(Buffer *buffer)
892
892
  */
893
893
 
894
894
  /*---------------------------------------------------------------------------*/
895
+ /* Every input byte the decoders below read goes through this check
896
+ first (an opencodecs change). cfitsio checks for the end of the
897
+ input only once per block, which lets a corrupt or truncated stream
898
+ read past the buffer within a block: the run of leading zeros in a
899
+ Rice code has no length limit, so the overrun is unbounded. A valid
900
+ stream never reads past its last byte, so the check does not change
901
+ what one decodes to. */
902
+ #define RICE_NEED_BYTE() \
903
+ do { \
904
+ if (c >= cend) \
905
+ return RCOMP_ERROR_EOS; \
906
+ } while (0)
907
+
895
908
  /* this routine used to be called 'rdecomp' (WDP) */
896
909
 
897
910
  int
@@ -979,12 +992,14 @@ rdecomp_int(
979
992
  c += 4;
980
993
  cend = c + clen - 4;
981
994
 
995
+ RICE_NEED_BYTE();
982
996
  b = *c++; /* bit buffer */
983
997
  nbits = 8; /* number of bits remaining in b */
984
998
  for (i = 0; i < nx;) {
985
999
  /* get the FS value from first fsbits */
986
1000
  nbits -= fsbits;
987
1001
  while (nbits < 0) {
1002
+ RICE_NEED_BYTE();
988
1003
  b = (b << 8) | (*c++);
989
1004
  nbits += 8;
990
1005
  }
@@ -1004,10 +1019,12 @@ rdecomp_int(
1004
1019
  k = bbits - nbits;
1005
1020
  diff = b << k;
1006
1021
  for (k -= 8; k >= 0; k -= 8) {
1022
+ RICE_NEED_BYTE();
1007
1023
  b = *c++;
1008
1024
  diff |= b << k;
1009
1025
  }
1010
1026
  if (nbits > 0) {
1027
+ RICE_NEED_BYTE();
1011
1028
  b = *c++;
1012
1029
  diff |= b >> (-k);
1013
1030
  b &= (1 << nbits) - 1;
@@ -1034,6 +1051,7 @@ rdecomp_int(
1034
1051
  /* count number of leading zeros */
1035
1052
  while (b == 0) {
1036
1053
  nbits += 8;
1054
+ RICE_NEED_BYTE();
1037
1055
  b = *c++;
1038
1056
  }
1039
1057
  nzero = nbits - nonzero_count[b];
@@ -1043,6 +1061,7 @@ rdecomp_int(
1043
1061
  /* get the FS trailing bits */
1044
1062
  nbits -= fs;
1045
1063
  while (nbits < 0) {
1064
+ RICE_NEED_BYTE();
1046
1065
  b = (b << 8) | (*c++);
1047
1066
  nbits += 8;
1048
1067
  }
@@ -1154,12 +1173,14 @@ rdecomp_short(
1154
1173
  c += 2;
1155
1174
  cend = c + clen - 2;
1156
1175
 
1176
+ RICE_NEED_BYTE();
1157
1177
  b = *c++; /* bit buffer */
1158
1178
  nbits = 8; /* number of bits remaining in b */
1159
1179
  for (i = 0; i < nx;) {
1160
1180
  /* get the FS value from first fsbits */
1161
1181
  nbits -= fsbits;
1162
1182
  while (nbits < 0) {
1183
+ RICE_NEED_BYTE();
1163
1184
  b = (b << 8) | (*c++);
1164
1185
  nbits += 8;
1165
1186
  }
@@ -1179,10 +1200,12 @@ rdecomp_short(
1179
1200
  k = bbits - nbits;
1180
1201
  diff = b << k;
1181
1202
  for (k -= 8; k >= 0; k -= 8) {
1203
+ RICE_NEED_BYTE();
1182
1204
  b = *c++;
1183
1205
  diff |= b << k;
1184
1206
  }
1185
1207
  if (nbits > 0) {
1208
+ RICE_NEED_BYTE();
1186
1209
  b = *c++;
1187
1210
  diff |= b >> (-k);
1188
1211
  b &= (1 << nbits) - 1;
@@ -1210,6 +1233,7 @@ rdecomp_short(
1210
1233
  /* count number of leading zeros */
1211
1234
  while (b == 0) {
1212
1235
  nbits += 8;
1236
+ RICE_NEED_BYTE();
1213
1237
  b = *c++;
1214
1238
  }
1215
1239
  nzero = nbits - nonzero_count[b];
@@ -1219,6 +1243,7 @@ rdecomp_short(
1219
1243
  /* get the FS trailing bits */
1220
1244
  nbits -= fs;
1221
1245
  while (nbits < 0) {
1246
+ RICE_NEED_BYTE();
1222
1247
  b = (b << 8) | (*c++);
1223
1248
  nbits += 8;
1224
1249
  }
@@ -1325,12 +1350,14 @@ rdecomp_byte(
1325
1350
  c += 1;
1326
1351
  cend = c + clen - 1;
1327
1352
 
1353
+ RICE_NEED_BYTE();
1328
1354
  b = *c++; /* bit buffer */
1329
1355
  nbits = 8; /* number of bits remaining in b */
1330
1356
  for (i = 0; i < nx;) {
1331
1357
  /* get the FS value from first fsbits */
1332
1358
  nbits -= fsbits;
1333
1359
  while (nbits < 0) {
1360
+ RICE_NEED_BYTE();
1334
1361
  b = (b << 8) | (*c++);
1335
1362
  nbits += 8;
1336
1363
  }
@@ -1350,10 +1377,12 @@ rdecomp_byte(
1350
1377
  k = bbits - nbits;
1351
1378
  diff = b << k;
1352
1379
  for (k -= 8; k >= 0; k -= 8) {
1380
+ RICE_NEED_BYTE();
1353
1381
  b = *c++;
1354
1382
  diff |= b << k;
1355
1383
  }
1356
1384
  if (nbits > 0) {
1385
+ RICE_NEED_BYTE();
1357
1386
  b = *c++;
1358
1387
  diff |= b >> (-k);
1359
1388
  b &= (1 << nbits) - 1;
@@ -1381,6 +1410,7 @@ rdecomp_byte(
1381
1410
  /* count number of leading zeros */
1382
1411
  while (b == 0) {
1383
1412
  nbits += 8;
1413
+ RICE_NEED_BYTE();
1384
1414
  b = *c++;
1385
1415
  }
1386
1416
  nzero = nbits - nonzero_count[b];
@@ -1390,6 +1420,7 @@ rdecomp_byte(
1390
1420
  /* get the FS trailing bits */
1391
1421
  nbits -= fs;
1392
1422
  while (nbits < 0) {
1423
+ RICE_NEED_BYTE();
1393
1424
  b = (b << 8) | (*c++);
1394
1425
  nbits += 8;
1395
1426
  }
@@ -358,6 +358,7 @@ struct spng_ctx
358
358
  size_t libdef_inbuf_size;
359
359
  size_t libdef_inbuf_cap;
360
360
  int libdef_level; /* requested compression level */
361
+ int libdef_bypass; /* image strategy set: use zlib */
361
362
  #endif
362
363
  unsigned char *scanline_buf, *prev_scanline_buf, *row_buf, *filtered_scanline_buf;
363
364
  unsigned char *scanline, *prev_scanline, *row, *filtered_scanline;
@@ -1264,9 +1265,16 @@ static int spng__deflate_init(spng_ctx *ctx, struct spng__zlib_options *options)
1264
1265
  {
1265
1266
  libdeflate_free_compressor(
1266
1267
  (struct libdeflate_compressor *)ctx->libdef_compressor);
1268
+ ctx->libdef_compressor = NULL;
1269
+ }
1270
+ /* libdeflate has no strategy setting. When the caller set the image
1271
+ strategy explicitly, IDAT goes through zlib's deflate (initialized
1272
+ above with that strategy) so the setting is honored. */
1273
+ if(!ctx->libdef_bypass)
1274
+ {
1275
+ ctx->libdef_compressor = libdeflate_alloc_compressor(ctx->libdef_level);
1276
+ if(ctx->libdef_compressor == NULL) return SPNG_EZLIB_INIT;
1267
1277
  }
1268
- ctx->libdef_compressor = libdeflate_alloc_compressor(ctx->libdef_level);
1269
- if(ctx->libdef_compressor == NULL) return SPNG_EZLIB_INIT;
1270
1278
  if(ctx->libdef_inbuf)
1271
1279
  {
1272
1280
  spng__free(ctx, ctx->libdef_inbuf);
@@ -4685,6 +4693,8 @@ static int write_idat_bytes(spng_ctx *ctx, const void *scanline, size_t len, int
4685
4693
  int ret = 0;
4686
4694
 
4687
4695
  #ifdef SPNG_USE_LIBDEFLATE
4696
+ if(!ctx->libdef_bypass)
4697
+ {
4688
4698
  (void)flush;
4689
4699
  /* Append the scanline bytes to our libdeflate input accumulator.
4690
4700
  The actual compression happens in finish_idat() once we have
@@ -4707,7 +4717,8 @@ static int write_idat_bytes(spng_ctx *ctx, const void *scanline, size_t len, int
4707
4717
  memcpy(ctx->libdef_inbuf + ctx->libdef_inbuf_size, scanline, len);
4708
4718
  ctx->libdef_inbuf_size = need;
4709
4719
  return 0;
4710
- #else
4720
+ }
4721
+ #endif
4711
4722
  unsigned char *data = NULL;
4712
4723
  z_stream *zstream = &ctx->zstream;
4713
4724
  uint32_t idat_length = SPNG_WRITE_SIZE;
@@ -4736,7 +4747,6 @@ static int write_idat_bytes(spng_ctx *ctx, const void *scanline, size_t len, int
4736
4747
  if(ret != Z_OK) return SPNG_EZLIB;
4737
4748
 
4738
4749
  return 0;
4739
- #endif
4740
4750
  }
4741
4751
 
4742
4752
  static int finish_idat(spng_ctx *ctx)
@@ -4746,6 +4756,8 @@ static int finish_idat(spng_ctx *ctx)
4746
4756
  uint32_t idat_length = SPNG_WRITE_SIZE;
4747
4757
 
4748
4758
  #ifdef SPNG_USE_LIBDEFLATE
4759
+ if(!ctx->libdef_bypass)
4760
+ {
4749
4761
  /* One-shot compress the accumulated filtered-row stream and
4750
4762
  splay the output across SPNG_WRITE_SIZE-sized IDAT chunks.
4751
4763
  Reader compatibility is identical — PNG concatenates IDATs
@@ -4817,7 +4829,8 @@ static int finish_idat(spng_ctx *ctx)
4817
4829
  ctx->libdef_inbuf_cap = 0;
4818
4830
 
4819
4831
  return finish_chunk(ctx);
4820
- #else
4832
+ }
4833
+ #endif
4821
4834
  z_stream *zstream = &ctx->zstream;
4822
4835
 
4823
4836
  while(ret != Z_STREAM_END)
@@ -4850,7 +4863,6 @@ static int finish_idat(spng_ctx *ctx)
4850
4863
  if(ret) return ret;
4851
4864
 
4852
4865
  return finish_chunk(ctx);
4853
- #endif
4854
4866
  }
4855
4867
 
4856
4868
  static int encode_scanline(spng_ctx *ctx, const void *scanline, size_t len)
@@ -5533,6 +5545,9 @@ int spng_set_option(spng_ctx *ctx, enum spng_option option, int value)
5533
5545
  case SPNG_IMG_COMPRESSION_STRATEGY:
5534
5546
  {
5535
5547
  ctx->image_options.strategy = value;
5548
+ #ifdef SPNG_USE_LIBDEFLATE
5549
+ ctx->libdef_bypass = 1;
5550
+ #endif
5536
5551
  break;
5537
5552
  }
5538
5553
  case SPNG_TEXT_COMPRESSION_LEVEL:
@@ -25,9 +25,15 @@
25
25
  * 2-bit symbol (1 horz + 1 vert): s ^= 0x03 -> 0b11
26
26
  *
27
27
  * Both constants flip exactly the MSB of each field and leave the low
28
- * bits alone, so the rule is width-independent and we apply it for all
29
- * widths. NOTE: imagecodecs applies the inversion for field widths 1 and
30
- * 2 but not 3 and 4; real Falcon hardware only ever emits 1 or 2, so
28
+ * bits alone. RELION's comment on that XOR (citing Thermo Fisher) says
29
+ * the field is a SIGNED 2-bit value, -2..1 (signed 1-bit for 1-bit
30
+ * fields). Turning a signed n-bit field into an unsigned index means
31
+ * adding 2^(n-1), which is flipping its top bit, at every width; so we
32
+ * apply that rule for all widths. Thermo Fisher's public EER format
33
+ * document (v3.0) defines only the tags and leaves the bitstream out of
34
+ * scope, so this is the only stated convention. NOTE: imagecodecs XORs
35
+ * each field with its WIDTH (^3, ^4), which equals the top-bit flip only
36
+ * at widths 1 and 2; real Falcon hardware only ever emits 1 or 2, so
31
37
  * that divergence does not affect real data. See
32
38
  * tests/test_eer.py::test_eer_subpixel_inversion_is_width_independent.
33
39
  *
@@ -107,7 +107,11 @@ static int decode_inner(
107
107
  accum_bits -= code_size;
108
108
 
109
109
  if (OC_UNLIKELY(code == eoi_code)) {
110
- return 0;
110
+ /* An end code before the frame is full is an error in
111
+ * libgif too (D_GIF_ERR_EOF_TOO_SOON, "Image EOF detected
112
+ * before image complete"). Returning success here left the
113
+ * rest of the caller's raster unwritten. */
114
+ return (out_p == out_end) ? 0 : -2;
111
115
  }
112
116
  if (OC_UNLIKELY(code == clear_code)) {
113
117
  code_size = min_code_size + 1;
@@ -125,8 +129,12 @@ static int decode_inner(
125
129
  if (OC_UNLIKELY(c >= next_code)) {
126
130
  /* "KwKwK" special case: the code refers to an entry we're
127
131
  * about to add. Emit the previous string + first byte of
128
- * previous string. */
129
- if (OC_UNLIKELY(prev_code < 0)) {
132
+ * previous string. Only next_code itself can be that entry;
133
+ * a larger code was never defined, and accepting it made
134
+ * it prev_code, so the next table entry pointed at an
135
+ * uninitialized slot and a later prefix walk read outside
136
+ * the table. libgif rejects it too (D_GIF_ERR_IMAGE_DEFECT). */
137
+ if (OC_UNLIKELY(prev_code < 0 || c > next_code)) {
130
138
  return -4;
131
139
  }
132
140
  stack[sp++] = (uint8_t) first_byte[prev_code];
@@ -145,9 +153,16 @@ static int decode_inner(
145
153
  stack[sp++] = (uint8_t) c;
146
154
  uint8_t first = (uint8_t) c;
147
155
 
148
- /* Bounds check + drain stack into output (reversed → forward). */
156
+ /* Bounds check + drain stack into output (reversed → forward).
157
+ * A stream that codes more pixels than the frame holds fills
158
+ * the frame and stops: libgif (DGifGetLine) decodes exactly
159
+ * width * height pixels and skips the rest of the data, so the
160
+ * surplus is ignored rather than failing the decode. */
149
161
  if (OC_UNLIKELY(out_p + sp > out_end)) {
150
- return -3;
162
+ while (out_p < out_end) {
163
+ *out_p++ = stack[--sp];
164
+ }
165
+ return 0;
151
166
  }
152
167
  /* Reverse copy: stack[sp-1..0] → out_p[0..sp-1]. */
153
168
  for (int i = sp - 1; i >= 0; i--) {
@@ -42,10 +42,11 @@ typedef struct {
42
42
  * output: pre-allocated buffer of `output_len` bytes (= width*height).
43
43
  *
44
44
  * Return value:
45
- * 0 on success.
45
+ * 0 on success: exactly output_len pixels were written. Codes past
46
+ * the last pixel are ignored, as libgif ignores them.
46
47
  * -1 invalid min_code_size.
47
- * -2 truncated input (ran out before EOI).
48
- * -3 output overrun (image had more pixels than buffer).
48
+ * -2 the image data ended (end of input, or the EOI code) before
49
+ * output_len pixels were decoded.
49
50
  * -4 invalid code referenced before it was defined.
50
51
  */
51
52
  int oc_giflzw_decode_blocks(