opencodecs 0.1.7__tar.gz → 0.1.9__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.7 → opencodecs-0.1.9}/CHANGES.rst +75 -0
  2. {opencodecs-0.1.7/src/opencodecs.egg-info → opencodecs-0.1.9}/PKG-INFO +1 -1
  3. {opencodecs-0.1.7 → opencodecs-0.1.9}/pyproject.toml +1 -1
  4. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/__init__.py +1 -1
  5. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_bcdec.c +152 -152
  6. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_bmp.c +152 -152
  7. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_eer.c +152 -152
  8. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_hcomp.c +152 -152
  9. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_plio.c +152 -152
  10. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_png.c +152 -152
  11. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_qoi.c +152 -152
  12. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_rcomp.c +152 -152
  13. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_rgbe.c +152 -152
  14. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/uhdr.py +83 -10
  15. {opencodecs-0.1.7 → opencodecs-0.1.9/src/opencodecs.egg-info}/PKG-INFO +1 -1
  16. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_uhdr.py +91 -0
  17. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/bcdec/bcdec.h +0 -0
  18. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/bitshuffle/bitshuffle_core.c +0 -0
  19. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/bitshuffle/iochain.c +0 -0
  20. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/cfitsio/fits_hdecompress.c +0 -0
  21. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/cfitsio/pliocomp.c +0 -0
  22. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/cfitsio/ricecomp.c +0 -0
  23. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/imcd_eer/eer.c +0 -0
  24. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/imcd_eer/eer.h +0 -0
  25. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/imcd_lzw/lzw.c +0 -0
  26. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/imcd_lzw/lzw.h +0 -0
  27. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/libspng/spng.c +0 -0
  28. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/oc_tifflzw/oc_tifflzw.c +0 -0
  29. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/oc_tifflzw/oc_tifflzw.h +0 -0
  30. {opencodecs-0.1.7 → opencodecs-0.1.9}/3rdparty/rgbe/rgbe.c +0 -0
  31. {opencodecs-0.1.7 → opencodecs-0.1.9}/MANIFEST.in +0 -0
  32. {opencodecs-0.1.7 → opencodecs-0.1.9}/README.md +0 -0
  33. {opencodecs-0.1.7 → opencodecs-0.1.9}/bench/build_libjxl.sh +0 -0
  34. {opencodecs-0.1.7 → opencodecs-0.1.9}/patches/libjxl/README.md +0 -0
  35. {opencodecs-0.1.7 → opencodecs-0.1.9}/setup.cfg +0 -0
  36. {opencodecs-0.1.7 → opencodecs-0.1.9}/setup.py +0 -0
  37. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_aec_codec.py +0 -0
  38. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_avif_codec.py +0 -0
  39. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_b2nd_codec.py +0 -0
  40. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_bcn_codec.py +0 -0
  41. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_bitshuffle_codec.py +0 -0
  42. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_blosc2_codec.py +0 -0
  43. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_bmp_codec.py +0 -0
  44. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_brotli_codec.py +0 -0
  45. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_brunsli_codec.py +0 -0
  46. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_byteshuffle_codec.py +0 -0
  47. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_bz2_codec.py +0 -0
  48. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_cms_codec.py +0 -0
  49. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_czi_codec.py +0 -0
  50. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_czi_reader.py +0 -0
  51. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_czi_writer.py +0 -0
  52. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_deflate_codec.py +0 -0
  53. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_dicomrle_codec.py +0 -0
  54. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_dicomweb.py +0 -0
  55. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_eer_reader.py +0 -0
  56. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_ets.py +0 -0
  57. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_fits.py +0 -0
  58. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_fits_codec.py +0 -0
  59. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_fits_compressed.py +0 -0
  60. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_gif_codec.py +0 -0
  61. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_gzip_codec.py +0 -0
  62. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_hdf5_codec.py +0 -0
  63. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_hdf5_http.py +0 -0
  64. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_heif_codec.py +0 -0
  65. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_htj2k_codec.py +0 -0
  66. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_jpeg2k_codec.py +0 -0
  67. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_jpeg_codec.py +0 -0
  68. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_jpegls_codec.py +0 -0
  69. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_jxl_codec.py +0 -0
  70. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_lerc_codec.py +0 -0
  71. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_lif_codec.py +0 -0
  72. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_lif_native.py +0 -0
  73. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_lz4_codec.py +0 -0
  74. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_lzma_codec.py +0 -0
  75. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_mozjpeg_codec.py +0 -0
  76. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_nd2_codec.py +0 -0
  77. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_nd2_native.py +0 -0
  78. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_ndtiff.py +0 -0
  79. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_ndtiff_pyramid.py +0 -0
  80. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_ndtiff_writer.py +0 -0
  81. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_none_codec.py +0 -0
  82. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_numpy_codec.py +0 -0
  83. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_oib_codec.py +0 -0
  84. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_oib_native.py +0 -0
  85. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_oir_codec.py +0 -0
  86. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_ole2.py +0 -0
  87. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_ome_xml.py +0 -0
  88. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_omezarr.py +0 -0
  89. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_omezarr_writer.py +0 -0
  90. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_packints_codec.py +0 -0
  91. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_pcodec_codec.py +0 -0
  92. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_png_codec.py +0 -0
  93. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_predictor_codec.py +0 -0
  94. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_pyramid_build.py +0 -0
  95. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_qoi_codec.py +0 -0
  96. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_quantize_codec.py +0 -0
  97. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_rcomp_codec.py +0 -0
  98. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_rgbe.py +0 -0
  99. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_rgbe_codec.py +0 -0
  100. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_snappy_codec.py +0 -0
  101. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_sperr_codec.py +0 -0
  102. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_sz3_codec.py +0 -0
  103. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_tiff_codec.py +0 -0
  104. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_tiff_http.py +0 -0
  105. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_tiff_pyramid.py +0 -0
  106. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_tiff_writer.py +0 -0
  107. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_ultrahdr_codec.py +0 -0
  108. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_vsi_codec.py +0 -0
  109. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_webp_codec.py +0 -0
  110. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_zarr_codecs.py +0 -0
  111. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_zfp_codec.py +0 -0
  112. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/_zstd_codec.py +0 -0
  113. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/__init__.py +0 -0
  114. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_bitshuffle.c +0 -0
  115. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_bytetools.c +0 -0
  116. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_deflate.c +0 -0
  117. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_lz4.c +0 -0
  118. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_ndtiff.c +0 -0
  119. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_registry.py +0 -0
  120. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_tiff.c +0 -0
  121. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/codecs/_zstd.c +0 -0
  122. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/core/__init__.py +0 -0
  123. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/core/_io_helpers.py +0 -0
  124. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/core/_optional_backend.py +0 -0
  125. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/core/codec.py +0 -0
  126. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/core/color.py +0 -0
  127. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/core/errors.py +0 -0
  128. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/core/io.py +0 -0
  129. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/core/pyramid.py +0 -0
  130. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/core/segment_compression.py +0 -0
  131. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/jxl.py +0 -0
  132. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/parallel.py +0 -0
  133. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/tiff_reader.py +0 -0
  134. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/tifffile_patch.py +0 -0
  135. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs/zarr.py +0 -0
  136. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs.egg-info/SOURCES.txt +0 -0
  137. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs.egg-info/dependency_links.txt +0 -0
  138. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs.egg-info/requires.txt +0 -0
  139. {opencodecs-0.1.7 → opencodecs-0.1.9}/src/opencodecs.egg-info/top_level.txt +0 -0
  140. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_auto_pyramid.py +0 -0
  141. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_bcdec.py +0 -0
  142. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_brunsli.py +0 -0
  143. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_charls.py +0 -0
  144. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_core_codec_api.py +0 -0
  145. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_corpus.py +0 -0
  146. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_corpus_codec_decode.py +0 -0
  147. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_corpus_other.py +0 -0
  148. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_corpus_png.py +0 -0
  149. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_corpus_tiff.py +0 -0
  150. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_corpus_vendors.py +0 -0
  151. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_coverage_final.py +0 -0
  152. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_coverage_finishing.py +0 -0
  153. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_coverage_last.py +0 -0
  154. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_coverage_more.py +0 -0
  155. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_coverage_push.py +0 -0
  156. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_czi_fixture.py +0 -0
  157. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_czi_pyramid.py +0 -0
  158. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_czi_writer.py +0 -0
  159. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_data_source.py +0 -0
  160. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_deflate.py +0 -0
  161. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_dicomweb.py +0 -0
  162. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_edge_cases.py +0 -0
  163. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_eer.py +0 -0
  164. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_encode_comprehensive.py +0 -0
  165. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_error_handling.py +0 -0
  166. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_fits.py +0 -0
  167. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_gif.py +0 -0
  168. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_hdf5_http.py +0 -0
  169. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_hdf5_local.py +0 -0
  170. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_heif_avif_features.py +0 -0
  171. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_http_byte_savings.py +0 -0
  172. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_http_prefetch.py +0 -0
  173. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_http_unified.py +0 -0
  174. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_io_chunked.py +0 -0
  175. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_isal.py +0 -0
  176. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_jxl.py +0 -0
  177. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_lif_native.py +0 -0
  178. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_live_archives.py +0 -0
  179. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_mozjpeg.py +0 -0
  180. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_native_parity.py +0 -0
  181. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_nd2_native.py +0 -0
  182. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_ndtiff.py +0 -0
  183. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_oib_native.py +0 -0
  184. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_ome_xml.py +0 -0
  185. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_omezarr.py +0 -0
  186. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_omezarr_sharded_range.py +0 -0
  187. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_open_pyramid.py +0 -0
  188. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_openjph.py +0 -0
  189. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_optional_backend.py +0 -0
  190. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_parallel_jxl.py +0 -0
  191. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_phase4_filters.py +0 -0
  192. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_phase5_icc.py +0 -0
  193. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_phase6_codecs.py +0 -0
  194. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_phase7_cms.py +0 -0
  195. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_rgbe.py +0 -0
  196. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_snappy.py +0 -0
  197. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_tier1_scientific.py +0 -0
  198. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_tiff_codec_encode.py +0 -0
  199. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_tiff_http.py +0 -0
  200. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_tiff_native.py +0 -0
  201. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_tiff_pyramid.py +0 -0
  202. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_tiff_reader.py +0 -0
  203. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_tiff_writer.py +0 -0
  204. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_tifffile_patch.py +0 -0
  205. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_unified_api.py +0 -0
  206. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_vsi_oir.py +0 -0
  207. {opencodecs-0.1.7 → opencodecs-0.1.9}/tests/test_zarr_adapters.py +0 -0
@@ -10,6 +10,81 @@ 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.9 (2026-06-02)
14
+ ------------------
15
+
16
+ **Lossless SDR base layer on encode (opt-in)**
17
+
18
+ ``opencodecs.codecs._jpeg.encode`` gained a ``lossless=False`` kwarg
19
+ that switches libjpeg-turbo into predictive lossless mode
20
+ (``TJPARAM_LOSSLESS=1``, PSV=1, forced 4:4:4 chroma). Output is
21
+ bit-exact through the libjpeg-turbo decoder, at the cost of ~3-5×
22
+ larger files vs ``level=95`` baseline DCT on natural-image content.
23
+
24
+ ``opencodecs.uhdr.encode_native(lossless=True)`` routes the SDR base
25
+ layer through that lossless path while keeping the gain map lossy
26
+ (there's no perceptual benefit to making a band-limited gain map
27
+ lossless, and it would balloon the file).
28
+
29
+ Empirical caveats — verified on macOS 15 with an HDR-capable
30
+ display:
31
+
32
+ * macOS Preview, Chrome 116+, and any viewer that parses the MPF /
33
+ XMP gain-map block directly **HDR-render the output normally**.
34
+ * libuhdr's reference ``uhdr_decode`` (and therefore
35
+ ``opencodecs.uhdr.decode``) **rejects** the file. It enforces a
36
+ strict ``JCS_YCbCr`` / ``JCS_GRAYSCALE`` colorspace check that
37
+ lossless-mode JPEG (which writes ``JCS_RGB``) fails.
38
+ * Apple's ``CGImageSource`` ``Headroom`` property and
39
+ ``kCGImageAuxiliaryDataTypeISOGainMap`` aux-data accessors miss
40
+ the HDR signal (same root cause), even though Preview's actual
41
+ render path composites the gain map correctly.
42
+ * ``opencodecs.uhdr.decode_native`` reads it cleanly — it uses our
43
+ own gain-application kernel without libuhdr's colorspace gate.
44
+
45
+ Use only when exact SDR-base-pixel preservation is a hard
46
+ requirement (archival, scientific imaging) and every consumer in
47
+ your pipeline is either Preview / Chrome / ``decode_native``. The
48
+ ``v0.1.8`` note that called lossless "not a conforming Ultra-HDR
49
+ file" was too strong — it's non-conforming to libuhdr's reference
50
+ decoder and Apple's narrow ImageIO API, but visual HDR consumers
51
+ accept it just fine.
52
+
53
+ 0.1.8 (2026-06-02)
54
+ ------------------
55
+
56
+ **DCT-domain decode-time scale on JPEG + decode_native**
57
+
58
+ ``opencodecs.codecs._jpeg.decode`` now exposes libjpeg-turbo's
59
+ ``tj3SetScalingFactor`` knob via a new ``scale=`` kwarg (plus
60
+ explicit ``scale_num`` / ``scale_denom`` for advanced callers). The
61
+ decoder skips the inverse-DCT work for high-frequency coefficients
62
+ when the caller requests a downsampled output, so a 1/8 decode runs
63
+ ~2× faster than a full decode and produces a 64× smaller raster.
64
+
65
+ Supported factors are libjpeg-turbo's full set of 16 ratios N/8 for
66
+ N ∈ {1, 2, …, 16} — i.e. anywhere between 1/8 and 2/1. The new
67
+ ``opencodecs.codecs._jpeg.supported_scaling_factors()`` returns them
68
+ as ``(num, denom)`` pairs. ``scale=`` accepts:
69
+
70
+ * an integer N (interpreted as ``1/N``)
71
+ * a float (snapped to the closest supported ratio)
72
+ * a tuple ``(num, denom)`` verbatim
73
+
74
+ ``opencodecs.uhdr.decode_native(..., scale=...)`` threads the same
75
+ knob through both the SDR base and the gain-map JPEG decodes. The
76
+ gain-application kernel runs on the smaller rasters, so the whole
77
+ pipeline scales — a 2k² Ultra-HDR decode at ``scale=8`` returns a
78
+ ``(250, 250, 3)`` fp16 raster in ~25 ms vs ~53 ms for the full
79
+ decode. Useful for thumbnail / preview pipelines that want real
80
+ HDR pixels off cloud-stored Ultra-HDR without paying the megapixel
81
+ JPEG decode cost. Lossless source not required — the JPEG file is
82
+ unchanged on disk; the savings come from skipping IDCT work.
83
+
84
+ (libuhdr lossless support is unchanged: ISO 21496-1's SDR base layer
85
+ is required to be baseline DCT JPEG, so lossless-mode JPEG would
86
+ not be a conforming Ultra-HDR file.)
87
+
13
88
  0.1.7 (2026-06-02)
14
89
  ------------------
15
90
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencodecs
3
- Version: 0.1.7
3
+ Version: 0.1.9
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.7"
7
+ version = "0.1.9"
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.7"
194
+ __version__ = "0.1.9"