opencodecs 0.1.6__tar.gz → 0.1.8__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 (207) hide show
  1. {opencodecs-0.1.6 → opencodecs-0.1.8}/CHANGES.rst +108 -6
  2. {opencodecs-0.1.6/src/opencodecs.egg-info → opencodecs-0.1.8}/PKG-INFO +1 -1
  3. {opencodecs-0.1.6 → opencodecs-0.1.8}/pyproject.toml +1 -1
  4. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/__init__.py +1 -1
  5. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_bcdec.c +152 -152
  6. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_bmp.c +152 -152
  7. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_eer.c +152 -152
  8. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_hcomp.c +152 -152
  9. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_plio.c +152 -152
  10. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_png.c +152 -152
  11. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_qoi.c +152 -152
  12. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_rcomp.c +152 -152
  13. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_rgbe.c +152 -152
  14. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/uhdr.py +97 -26
  15. {opencodecs-0.1.6 → opencodecs-0.1.8/src/opencodecs.egg-info}/PKG-INFO +1 -1
  16. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_uhdr.py +95 -5
  17. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/bcdec/bcdec.h +0 -0
  18. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/bitshuffle/bitshuffle_core.c +0 -0
  19. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/bitshuffle/iochain.c +0 -0
  20. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/cfitsio/fits_hdecompress.c +0 -0
  21. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/cfitsio/pliocomp.c +0 -0
  22. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/cfitsio/ricecomp.c +0 -0
  23. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/imcd_eer/eer.c +0 -0
  24. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/imcd_eer/eer.h +0 -0
  25. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/imcd_lzw/lzw.c +0 -0
  26. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/imcd_lzw/lzw.h +0 -0
  27. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/libspng/spng.c +0 -0
  28. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/oc_tifflzw/oc_tifflzw.c +0 -0
  29. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/oc_tifflzw/oc_tifflzw.h +0 -0
  30. {opencodecs-0.1.6 → opencodecs-0.1.8}/3rdparty/rgbe/rgbe.c +0 -0
  31. {opencodecs-0.1.6 → opencodecs-0.1.8}/MANIFEST.in +0 -0
  32. {opencodecs-0.1.6 → opencodecs-0.1.8}/README.md +0 -0
  33. {opencodecs-0.1.6 → opencodecs-0.1.8}/bench/build_libjxl.sh +0 -0
  34. {opencodecs-0.1.6 → opencodecs-0.1.8}/patches/libjxl/README.md +0 -0
  35. {opencodecs-0.1.6 → opencodecs-0.1.8}/setup.cfg +0 -0
  36. {opencodecs-0.1.6 → opencodecs-0.1.8}/setup.py +0 -0
  37. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_aec_codec.py +0 -0
  38. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_avif_codec.py +0 -0
  39. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_b2nd_codec.py +0 -0
  40. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_bcn_codec.py +0 -0
  41. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_bitshuffle_codec.py +0 -0
  42. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_blosc2_codec.py +0 -0
  43. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_bmp_codec.py +0 -0
  44. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_brotli_codec.py +0 -0
  45. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_brunsli_codec.py +0 -0
  46. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_byteshuffle_codec.py +0 -0
  47. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_bz2_codec.py +0 -0
  48. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_cms_codec.py +0 -0
  49. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_czi_codec.py +0 -0
  50. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_czi_reader.py +0 -0
  51. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_czi_writer.py +0 -0
  52. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_deflate_codec.py +0 -0
  53. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_dicomrle_codec.py +0 -0
  54. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_dicomweb.py +0 -0
  55. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_eer_reader.py +0 -0
  56. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_ets.py +0 -0
  57. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_fits.py +0 -0
  58. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_fits_codec.py +0 -0
  59. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_fits_compressed.py +0 -0
  60. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_gif_codec.py +0 -0
  61. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_gzip_codec.py +0 -0
  62. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_hdf5_codec.py +0 -0
  63. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_hdf5_http.py +0 -0
  64. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_heif_codec.py +0 -0
  65. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_htj2k_codec.py +0 -0
  66. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_jpeg2k_codec.py +0 -0
  67. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_jpeg_codec.py +0 -0
  68. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_jpegls_codec.py +0 -0
  69. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_jxl_codec.py +0 -0
  70. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_lerc_codec.py +0 -0
  71. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_lif_codec.py +0 -0
  72. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_lif_native.py +0 -0
  73. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_lz4_codec.py +0 -0
  74. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_lzma_codec.py +0 -0
  75. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_mozjpeg_codec.py +0 -0
  76. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_nd2_codec.py +0 -0
  77. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_nd2_native.py +0 -0
  78. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_ndtiff.py +0 -0
  79. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_ndtiff_pyramid.py +0 -0
  80. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_ndtiff_writer.py +0 -0
  81. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_none_codec.py +0 -0
  82. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_numpy_codec.py +0 -0
  83. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_oib_codec.py +0 -0
  84. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_oib_native.py +0 -0
  85. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_oir_codec.py +0 -0
  86. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_ole2.py +0 -0
  87. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_ome_xml.py +0 -0
  88. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_omezarr.py +0 -0
  89. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_omezarr_writer.py +0 -0
  90. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_packints_codec.py +0 -0
  91. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_pcodec_codec.py +0 -0
  92. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_png_codec.py +0 -0
  93. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_predictor_codec.py +0 -0
  94. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_pyramid_build.py +0 -0
  95. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_qoi_codec.py +0 -0
  96. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_quantize_codec.py +0 -0
  97. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_rcomp_codec.py +0 -0
  98. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_rgbe.py +0 -0
  99. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_rgbe_codec.py +0 -0
  100. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_snappy_codec.py +0 -0
  101. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_sperr_codec.py +0 -0
  102. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_sz3_codec.py +0 -0
  103. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_tiff_codec.py +0 -0
  104. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_tiff_http.py +0 -0
  105. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_tiff_pyramid.py +0 -0
  106. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_tiff_writer.py +0 -0
  107. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_ultrahdr_codec.py +0 -0
  108. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_vsi_codec.py +0 -0
  109. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_webp_codec.py +0 -0
  110. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_zarr_codecs.py +0 -0
  111. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_zfp_codec.py +0 -0
  112. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/_zstd_codec.py +0 -0
  113. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/__init__.py +0 -0
  114. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_bitshuffle.c +0 -0
  115. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_bytetools.c +0 -0
  116. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_deflate.c +0 -0
  117. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_lz4.c +0 -0
  118. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_ndtiff.c +0 -0
  119. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_registry.py +0 -0
  120. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_tiff.c +0 -0
  121. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/codecs/_zstd.c +0 -0
  122. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/core/__init__.py +0 -0
  123. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/core/_io_helpers.py +0 -0
  124. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/core/_optional_backend.py +0 -0
  125. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/core/codec.py +0 -0
  126. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/core/color.py +0 -0
  127. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/core/errors.py +0 -0
  128. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/core/io.py +0 -0
  129. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/core/pyramid.py +0 -0
  130. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/core/segment_compression.py +0 -0
  131. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/jxl.py +0 -0
  132. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/parallel.py +0 -0
  133. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/tiff_reader.py +0 -0
  134. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/tifffile_patch.py +0 -0
  135. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs/zarr.py +0 -0
  136. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs.egg-info/SOURCES.txt +0 -0
  137. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs.egg-info/dependency_links.txt +0 -0
  138. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs.egg-info/requires.txt +0 -0
  139. {opencodecs-0.1.6 → opencodecs-0.1.8}/src/opencodecs.egg-info/top_level.txt +0 -0
  140. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_auto_pyramid.py +0 -0
  141. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_bcdec.py +0 -0
  142. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_brunsli.py +0 -0
  143. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_charls.py +0 -0
  144. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_core_codec_api.py +0 -0
  145. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_corpus.py +0 -0
  146. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_corpus_codec_decode.py +0 -0
  147. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_corpus_other.py +0 -0
  148. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_corpus_png.py +0 -0
  149. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_corpus_tiff.py +0 -0
  150. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_corpus_vendors.py +0 -0
  151. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_coverage_final.py +0 -0
  152. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_coverage_finishing.py +0 -0
  153. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_coverage_last.py +0 -0
  154. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_coverage_more.py +0 -0
  155. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_coverage_push.py +0 -0
  156. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_czi_fixture.py +0 -0
  157. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_czi_pyramid.py +0 -0
  158. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_czi_writer.py +0 -0
  159. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_data_source.py +0 -0
  160. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_deflate.py +0 -0
  161. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_dicomweb.py +0 -0
  162. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_edge_cases.py +0 -0
  163. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_eer.py +0 -0
  164. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_encode_comprehensive.py +0 -0
  165. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_error_handling.py +0 -0
  166. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_fits.py +0 -0
  167. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_gif.py +0 -0
  168. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_hdf5_http.py +0 -0
  169. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_hdf5_local.py +0 -0
  170. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_heif_avif_features.py +0 -0
  171. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_http_byte_savings.py +0 -0
  172. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_http_prefetch.py +0 -0
  173. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_http_unified.py +0 -0
  174. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_io_chunked.py +0 -0
  175. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_isal.py +0 -0
  176. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_jxl.py +0 -0
  177. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_lif_native.py +0 -0
  178. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_live_archives.py +0 -0
  179. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_mozjpeg.py +0 -0
  180. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_native_parity.py +0 -0
  181. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_nd2_native.py +0 -0
  182. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_ndtiff.py +0 -0
  183. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_oib_native.py +0 -0
  184. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_ome_xml.py +0 -0
  185. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_omezarr.py +0 -0
  186. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_omezarr_sharded_range.py +0 -0
  187. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_open_pyramid.py +0 -0
  188. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_openjph.py +0 -0
  189. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_optional_backend.py +0 -0
  190. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_parallel_jxl.py +0 -0
  191. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_phase4_filters.py +0 -0
  192. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_phase5_icc.py +0 -0
  193. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_phase6_codecs.py +0 -0
  194. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_phase7_cms.py +0 -0
  195. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_rgbe.py +0 -0
  196. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_snappy.py +0 -0
  197. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_tier1_scientific.py +0 -0
  198. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_tiff_codec_encode.py +0 -0
  199. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_tiff_http.py +0 -0
  200. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_tiff_native.py +0 -0
  201. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_tiff_pyramid.py +0 -0
  202. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_tiff_reader.py +0 -0
  203. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_tiff_writer.py +0 -0
  204. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_tifffile_patch.py +0 -0
  205. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_unified_api.py +0 -0
  206. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_vsi_oir.py +0 -0
  207. {opencodecs-0.1.6 → opencodecs-0.1.8}/tests/test_zarr_adapters.py +0 -0
@@ -10,6 +10,104 @@ Versions follow the same ``YYYY.M.D`` cadence as upstream when we
10
10
  publish; the entries below cluster work by date rather than by
11
11
  release because most of it has shipped continuously to ``main``.
12
12
 
13
+ 0.1.8 (2026-06-02)
14
+ ------------------
15
+
16
+ **DCT-domain decode-time scale on JPEG + decode_native**
17
+
18
+ ``opencodecs.codecs._jpeg.decode`` now exposes libjpeg-turbo's
19
+ ``tj3SetScalingFactor`` knob via a new ``scale=`` kwarg (plus
20
+ explicit ``scale_num`` / ``scale_denom`` for advanced callers). The
21
+ decoder skips the inverse-DCT work for high-frequency coefficients
22
+ when the caller requests a downsampled output, so a 1/8 decode runs
23
+ ~2× faster than a full decode and produces a 64× smaller raster.
24
+
25
+ Supported factors are libjpeg-turbo's full set of 16 ratios N/8 for
26
+ N ∈ {1, 2, …, 16} — i.e. anywhere between 1/8 and 2/1. The new
27
+ ``opencodecs.codecs._jpeg.supported_scaling_factors()`` returns them
28
+ as ``(num, denom)`` pairs. ``scale=`` accepts:
29
+
30
+ * an integer N (interpreted as ``1/N``)
31
+ * a float (snapped to the closest supported ratio)
32
+ * a tuple ``(num, denom)`` verbatim
33
+
34
+ ``opencodecs.uhdr.decode_native(..., scale=...)`` threads the same
35
+ knob through both the SDR base and the gain-map JPEG decodes. The
36
+ gain-application kernel runs on the smaller rasters, so the whole
37
+ pipeline scales — a 2k² Ultra-HDR decode at ``scale=8`` returns a
38
+ ``(250, 250, 3)`` fp16 raster in ~25 ms vs ~53 ms for the full
39
+ decode. Useful for thumbnail / preview pipelines that want real
40
+ HDR pixels off cloud-stored Ultra-HDR without paying the megapixel
41
+ JPEG decode cost. Lossless source not required — the JPEG file is
42
+ unchanged on disk; the savings come from skipping IDCT work.
43
+
44
+ (libuhdr lossless support is unchanged: ISO 21496-1's SDR base layer
45
+ is required to be baseline DCT JPEG, so lossless-mode JPEG would
46
+ not be a conforming Ultra-HDR file.)
47
+
48
+ 0.1.7 (2026-06-02)
49
+ ------------------
50
+
51
+ **Patched libultrahdr bundle**
52
+
53
+ Since v0.1.6 we build libuhdr ourselves; v0.1.7 starts carrying
54
+ local patches via ``patches/libultrahdr/*.patch``, applied by
55
+ ``bench/build_codec_libs.sh::build_libultrahdr`` after the source
56
+ fetch. Five upstream post-v1.4.0 cherry-picks land first:
57
+
58
+ * ``5ed39d6`` — fix ``CLIP3`` parameter order in libuhdr's own
59
+ ``applyGainMap``. The bug clamped a constant ``0.0f`` instead of
60
+ the gainmap weight whenever ``display_boost ≠ hdr_capacity_max``,
61
+ silently producing wrong HDR output on libuhdr's wrapped
62
+ ``decode()`` path. ``opencodecs.uhdr.decode_native`` is unaffected
63
+ (it uses our own Cython gain-application kernel).
64
+ * ``7088ca7`` — error-message typo in ``jpegr.cpp``.
65
+ * ``13a058f`` — ``icc.h`` Endian_Swap macros now respect actual
66
+ host endianness instead of an unconditionally-true ``USE_BIG_ENDIAN_IN_ICC``.
67
+ No effect on x86_64/aarch64 (little-endian); fixes PowerPC/s390x.
68
+ * ``5fa99b5`` — add missing ``<cstdint>`` include for GCC 15.
69
+ * ``8cbc983`` — same ``CLIP3`` fix as ``5ed39d6`` in the GPU path
70
+ (we don't link the GPU path; carried for hygiene).
71
+
72
+ **New API: ``opencodecs.uhdr.probe(data) -> dict``**
73
+
74
+ Parse an Ultra-HDR container's MPF metadata without any pixel
75
+ decode. Returns base + gainmap dimensions plus the gainmap
76
+ metadata block (``max_content_boost`` / ``min_content_boost`` /
77
+ ``gamma`` / capacity). Wraps libuhdr's existing ``uhdr_dec_probe``
78
+ + accessors. ~180× faster than ``decode()`` for any HDR-aware
79
+ flow that only needs dimensions or capacity — image indexing,
80
+ thumbnail generation, HTTP HEAD-style inspection, routing batches
81
+ by content-boost.
82
+
83
+ **Gain-map tunables on ``encode_native``: ``gain_quality`` + ``gain_scale``**
84
+
85
+ Two new kwargs let callers shrink the gain-map layer
86
+ independently of the SDR base:
87
+
88
+ * ``gain_quality`` — JPEG quality for the gain-map layer only
89
+ (defaults to track ``quality``). The gain map is heavily
90
+ band-limited so ``gain_quality=70`` is visually equivalent to
91
+ ``q95`` and cuts ~30% off the gain-map bytes.
92
+ * ``gain_scale`` — integer power-of-2 downsample factor for the
93
+ gain-map raster (``1`` keeps full resolution, ``2`` halves both
94
+ axes for quarter-area, etc.). Stride decimation; ~5 ms on a 2k²
95
+ uint8 gain map. Round-trips through ``probe`` / ``decode_native``
96
+ cleanly — the container records the actual gain-map dimensions
97
+ and the decoder upscales on apply.
98
+
99
+ **True streaming encode: ``encode_native(..., out=fp)``**
100
+
101
+ The old ``encode_to(fp, hdr, ...)`` was a forward-compatible
102
+ ``fp.write(encode_native(hdr, **kw))`` wrapper. v0.1.7 makes both
103
+ genuinely streaming: ``encode_assembled`` (and by extension
104
+ ``encode_native`` / ``encode_to``) now accept an ``out=`` file-
105
+ like, and when given they hand a zero-copy ``memoryview`` over
106
+ libuhdr's internal output buffer to ``out.write()``. Skips the
107
+ final ``PyBytes_FromStringAndSize`` allocation + memcpy. Saves
108
+ ~1× output-size peak memory and ~3 ms wall-clock on a 5 MB encode.
109
+ ``encode_to`` now returns ``None`` instead of the byte count.
110
+
13
111
  0.1.6 (2026-06-01)
14
112
  ------------------
15
113
 
@@ -69,12 +167,16 @@ streaming write-out without changing their code.
69
167
 
70
168
  **CI / build robustness**
71
169
 
72
- * ``_uhdr`` extension now links ``-lmvec -lm`` on Linux. GCC at
73
- ``-O3 -ffast-math`` auto-vectorises the sRGB LUT-init ``pow()``
74
- calls into ``_ZGV*`` symbols from glibc's libmvec. AlmaLinux 8's
75
- manylinux toolchain auto-links libmvec so the issue was masked
76
- in CI, but Ubuntu's GCC doesn't caught when verifying on a
77
- threadripper Ubuntu 25.04 box.
170
+ * ``_uhdr`` extension's ``-ffast-math`` is now narrowed to
171
+ ``-ffast-math -fno-finite-math-only
172
+ -fno-unsafe-math-optimizations -fno-math-errno
173
+ -fno-trapping-math``. The ``-funsafe-math-optimizations``
174
+ sub-flag is what tells GCC to replace libm calls with libmvec's
175
+ vectorised ``_ZGV*`` variants, which link-fail on Ubuntu (Ubuntu's
176
+ default gcc doesn't auto-link libmvec like manylinux_2_28 does)
177
+ and aren't available at all on aarch64. Same flag set the edt
178
+ extension uses for the same reason. Keeps FMA + reordering
179
+ perf; eliminates the libmvec dependency entirely.
78
180
  * The libaec source URL moved from ``gitlab.dkrz.de`` (now
79
181
  auth-gated; anonymous requests redirect to ``/users/sign_in``)
80
182
  to DKRZ's GitHub mirror at
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencodecs
3
- Version: 0.1.6
3
+ Version: 0.1.8
4
4
  Summary: Streaming, network-aware image codecs for scientific imaging (prototype: JPEG XL)
5
5
  Author: Kevin Cutler
6
6
  License: BSD-3-Clause
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "opencodecs"
7
- version = "0.1.6"
7
+ version = "0.1.8"
8
8
  description = "Streaming, network-aware image codecs for scientific imaging (prototype: JPEG XL)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -191,4 +191,4 @@ __all__ = [
191
191
  "CziWriter", "CziPyramidWriter",
192
192
  ]
193
193
 
194
- __version__ = "0.1.6"
194
+ __version__ = "0.1.8"