20/9/26 8.18.7

- tiffload: copy colormaps on page load [Ada Logics]
- buildlut: limit output lut size [Ada Logics]
- tiffload: check for undersized jp2k tiles [Ada Logics]
- hough_line: improve bounds check [Ada Logics]
- pdfiumload: check for buffer too small [Ada Logics]
- tiffload: check rgba settings between directories [Tanto Security]
- uhdrload: calculate gain map scale factor using round-to-nearest [lovell]
- jp2ksave: tag as UNTRUSTED [kleisauke]
- header: only parse EXIF metadata for blob values [Shopify]
- jp2kload: more size validation [Akokonunes]

25/8/26 8.18.6

- openexrload: more validation [Hygge Halcyon]
- heifload: tag as UNTRUSTED for libheif before 1.23.2

3/8/26 8.18.5

- maplut: fix possible OOB read with complex images [sage-mode-hunter]
- measure: verify image region is larger than patch count [lovell]
- matload: more specific Matlab detection
- reduceh: fix potential incorrect output with Highway < 1.1.0 [dloebl]
- jxlsave: ensure EXIF data is freed on error [kleisauke]
- icc_ac2rc: ensure ICC profile is closed on error [kleisauke]
- buildlut: guard against NaN values [kleisauke]
- tiffsave: better xyz handling [har-pi]
- more use of vips_image_decode() [har-pi]
- quantise: better conversion to rgba [har-pi]
- jp2kload: support palette images [Socialpranker]
- buildlut: better final write calculation [har-pi]

5/7/26 8.18.4

- heifload: raise security limits on references [caseywebdev]
- tiffload: squash out read errors in openin_source_read [aleens-labs]
- jxlsave: convert CMYK images to sRGB [DarthSim]
- heifload: fix `-Winteger-overflow` warning on 32-bit platforms [kleisauke]
- object: guard against non-input arguments [kleisauke]
- enumtypes: avoid misuse of `G_GNUC_CONST` for GCC 17 compat [kleisauke]

6/6/26 8.18.3

- invertlut: verify input mask positions [lovell]
- bandjoin_const: fix possible OOB read with RAD/LABQ images [kleisauke]
- edge: ensure parent object is built [lovell]
- object: guard against invalid interpolators [kleisauke]
- foreign: guard against NULL filenames [kleisauke]
- stdif: expand input by one column [lovell]
- dcrawload: add support for non-square pixels [jcupitt]
- image_sanity: ensure scanlines fit in INT_MAX [Niels Provos]
- rank: expand input by one column [kleisauke]
- hist_local: expand input by one column [kleisauke]
- fix possible null-pointer dereference in quantizr backend [felixbuenemann]
- jp2ksave: fix OOB read during chroma subsampling [dloebl]
- jp2ksave: prevent heap buffer overflow on non-RGB images [dloebl]
- heifload: tighten limits on memory use [provos]
- boolean: fix heap-buffer-overflow in lshift [dloebl]
- magickload: check animation height [Himanshu Anand]
- source: fix max/min confusion [Himanshu Anand]
- uhdrsave: use macro to size buffer [Himanshu Anand]
- draw_mask: fix support for packed LABQ images [lovell]
- reduceh: fix possible OOB read in Highway path [kleisauke]
- buildlut: check upper bound of x range [lovell]
- jxl: ensure status codes are propagated [lovell]
- archive: fix compatibility with MSVC [eunos-1128]
- ppmload: check image dimensions [lovell]
- thumbnail: better pyr detection [Niels Provos]
- jpegsave: fix scrgb save with uhdr disabled [jcupitt]

31/3/26 8.18.2

- convolution: avoid using unsigned accumulators [nakrovati]
- exif: check ifdN range [trailofbits]
- tiffload: check jpeg and jp2k components [wooseokdotkim]
- uhdrsave: set Q for gainmap recompress, don't chroma subsample RGB gainmaps
- uhdrsave: prevent early unref of image with alpha channel [lovell]
- rad2float: limit band count when converting from radiance [lovell]
- jxlload: check EXIF buffer size before reading header [lovell]

18/3/26 8.18.1

- vector: mask supported Highway targets by builtin targets [kleisauke]
- fix Highway paths on big-endian targets [kleisauke]
- fix build with MSVC [star-hengxing]
- fix compatibility with glibc 2.43 [mtasaka]
- pngload: avoid an expensive check during header read [kleisauke]
- improve vips7 JPEG load compatibility [kleisauke]
- fix saving 3-band MATRIX images [kleisauke]
- uhdrload: expose original gainmap scale factor [lovell]
- uhdrsave: control generated gainmap scale factor [lovell]
- source: guard against length truncation [Niebelungen-D]
- shrinkh: fix possible OOB read in Highway path [dloebl] [kleisauke]
- string_to_array_double: ensure delimiter list is consistent [dloebl] [lovell]
- fix loading/saving of non-8-bit JXL images [DarthSim]
- invertlut: check height before interpolating values [dloebl] [lovell]
- extract: check bounds using unsigned arithmetic [Niebelungen-D] [lovell]
- matrixload: guard against empty and very large inputs [Niebelungen-D] [lovell]
- unpremultiply: check `alpha_band` is in range [Niebelungen-D] [lovell]
- maplut: ensure lookup table index is unsigned [dloebl] [lovell]
- fwfft: fix heap-buffer-overflow for single-row images [dloebl]
- draw_flood: reject out-of-bounds start point [dloebl]
- openexrload: fix a leak with invalid images [kleisauke]
- canny: fix UB in atan2 lookup table init [dloebl] [kleisauke]
- conva: guard against divide by zero [kleisauke]
- csvload: check whitespace and separator are ASCII [Niebelungen-D] [lovell]
- bandrank: check `index` is in range [Niebelungen-D] [lovell]
- remainder_const: guard against divide by zero [kleisauke]
- vips_window_take: prevent int underflow for small mapped images [jcupitt]
- composite: fix UB (invalid-enum-value) in `->build()` [kleisauke]
- add: prevent possible int overflow [kleisauke]
- bandmean: prevent possible int overflow [kleisauke]
- fastcor: prevent possible int overflow [kleisauke]
- multiply: prevent possible int overflow [kleisauke]
- subtract: prevent possible int overflow [kleisauke]
- hist_cum: prevent possible int overflow [kleisauke]
- convasep: prevent possible int overflow [kleisauke]
- conva: prevent possible int overflow [kleisauke]
- convi: prevent possible int overflow [kleisauke]
- draw_circle: prevent possible int overflow [kleisauke]
- csvload: guard against negative index access [kleisauke]
- convi: guard against invalid shift [kleisauke]
- nary: guard against empty input [kleisauke]
- maplut: add missing overflow checks [kleisauke]
- jpegsave: fix assert fail when saving 2-band image [kleisauke]
- LabS2LabQ: fix UB (undefined-shift) [kleisauke]
- convasep: use unsigned accumulator where appropriate [kleisauke]
- min: fix possible OOB read with complex images [kleisauke]
- max: fix possible OOB read with complex images [kleisauke]
- guard against dimension overflow [ElhananHaenel] [kleisauke]
- gifload: prevent int overflow on 32-bit platforms [ElhananHaenel] [kleisauke]
- sign: use ready image instead of `unary->in` [kleisauke]
- statistic: use ready image instead of `statistic->in` [kleisauke]
- hist_plot: handle near-zero ranges for float images [kleisauke]
- affine: check bounds using unsigned arithmetic [kleisauke]

17/12/25 8.18.0

- add dcrawload, dcrawload_source, dcrawload_buffer: load raw camera files
  using libraw [lxsameer]
- add magickload_source: load from a source with imagemagick
- add vips__worker_exit(): enables fast threadpool shutdown
- larger mmap windows on 64-bit machines improve random access mode for many
  file formats
- pdfload: control region to be rendered via `page_box` [lovell]
- system: add "cache" argument
- add vips_image_get_tile_width(), vips_image_get_tile_height(): get tile
  cache geometry hints [jbaiter]
- add vips_uhdrload(), vips_uhdrload_buffer(), vips_uhdrload_source(): load an
  UltraHDR image
- add vips_uhdrsave(), vips_uhdrsave_buffer(), vips_uhdrsave_target(): save an
  UltraHDR image
- fix cpp binding leak [VivitionDeveloper]
- add "gainmap" to VipsKeep
- add vips_image_get_gainmap()
- thumbnail updates gainmaps
- add "bitdepth" to jxlsave
- add "path" option to vipsthumbnail, deprecate "output" option [zjturner]
- add "exact" to webpsave
- add "uhdr2scRGB"
- dzsave has gainmap support
- cpp: add .gainmap(), .set(VImage)
- add support for Oklab and Oklch colourspaces
- add vips_Oklab2XYZ(), vips_XYZ2Oklab()
- add vips_Oklab2Oklch(), vips_OKlch2Oklab()
- add vips_interpretation_bands()
- heifsave: add "tune" parameter
- require C++14 as a minimum standard [kleisauke]
- prefer libpng over spng

8.17.4

- vipsthumbnail: fix pyramidal image layer selection [esiqveland]
- tools: fix possible deadlock during process exit on win32
- fix temp dir handling on win32 with Unicode usernames [kleisauke]
- pngsave, ppmsave: support for more image interpretations [gcsideal]

30/10/25 8.17.3

- tiffsave: fix saved resolution with a non-default resolution-unit metadata
  item [machur]
- svgload: ensure short/malformed compressed input is ignored [kleisauke,lovell]
- dzsave: Zoomify: ensure correct tile count in ImageProperties.xml [kleisauke]
- VipsSaveable: reimplement with macros to help C++ compat [jcupitt]

13/9/25 8.17.2

- rank: fix an off-by-one error [larsmaxfield]
- popplerload, svgload: validate page size [Yang Luo]
- pdfiumload: allow both dpi and scale to be set [kleisauke]
- svgload: honor DPI when scaling elements with non-pixel units [kleisauke]
- disable redundant Highway AVX512 targets [kleisauke]
- openslideload_source: flag operation as "nocache" [kleisauke]
- remove `vipsprofile.1` man page from install [kleisauke]
- tiffload: ensure processing halts for memory-related errors [lovell]
- tiffload: increase memory limit from 20MB to 50MB [lovell]
- fix vapi build [stydxm]
- tiffsave: include sample format when copying tiff data [manthey]

7/7/25 8.17.1

- fix API docs build with meson < 0.60 [lovell]
- improve function checks in meson [kleisauke]
- tiff: use correct log domain in threadsafe warning handlers [kleisauke]
- shift 16-bit output down to 8-bit when unsupported by saver [kleisauke]
- text: prevent use of rgba subpixel anti-aliasing [lovell]
- tiffsave: always apply resolution unit conversion [kleisauke]
- cache: suppress invalidation errors in release builds [kleisauke]
- dzsave: IIIF: use named region of 'full' when no crop takes place [lovell]
- pdfload: fix potential crash with pdfium < 6633 [zhifengzhuang]

5/6/25 8.17.0

- gifsave: add `keep_duplicate_frames` flag [dloebl]
- add Magic Kernel support [akimon658]
- tiff: add threadsafe warning/error handlers (requires libtiff 4.5.0+) [lovell]
- tiffload: add support for `fail_on` flag [lovell]
- tiffload: add support for `unlimited` flag (requires libtiff 4.7.0+) [lovell]
- much more reliable operation caching
- colour: add support for auto-selecting the rendering intent [kleisauke]
- add matrixmultiply
- better handling of malformed size values [Simcha Kosman]
- improve performance of vips_shrink() [kleisauke]
- svgload: add support for custom CSS via `stylesheet` option [lovell]
- heifload: `unlimited` flag removes all limits (requires libheif 1.19.0+) [lovell]
- heifsave: improve alpha channel detection [lovell]
- convi: ensure double sum precision for floats [lovell]
- improve guard against corrupt ICC profiles with older lcms2 versions [kleisauke]
- improve vips_sink_screen() thumbnail rendering
- heifload: improve detection of seek beyond EOF [lovell]
- jp2kload: add `oneshot` flag [mbklein]
- share and reuse openslide connections
- drop support for openslide 3.3
- fix vips_quadratic()
- rename `thumbnail`'s export/import profile options as input/output for
  consistency
- restore vips_remosaic(), it was not being linked
- deprecate VipsSaveable, add VipsForeignSaveable
- move vips_image_preeval(), vips_image_eval(), vips_image_posteval() into the
  public API
- jxlsave: add support for chunked save (requires libjxl 0.9.0+)
- increase minimum version of libjxl dependency to 0.7.0
- increase minimum version of libheif dependency to 1.7.0
- improve scaling of hough_line feature space [ecbypi]
- heifload: limit per-image memory usage to 2GB (requires libheif 1.20.0+)
- svgload: add support for scRGB output via `high_bitdepth` flag [kstanikviacbs]
- remove vipsprofile from default install
- add ppmload_buffer [kleisauke]

12/3/25 8.16.1

- support multipage JXL
- fix PFM byte order on big-endian machines [agoode]
- morph: fix erode Highway path [kleisauke]
- morph: fix C-paths with masks containing zero [kleisauke]
- fix `--vips-info` CLI flag with GLib >= 2.80 [kleisauke]
- make `subsample-mode=on` and `lossless=true` mutually exclusive [kleisauke]
- fix SZI write with openslide4 [goran-hc]
- heifsave: prevent use of AV1 intra block copy feature [lovell]
- threadpool: improve cooperative downsizing [kleisauke]
- fix alpha shift during colourspace conversions [frederikrosenberg]
- heifsave: set image orientation using irot and imir transformations [lovell]
- XYZ2Yxy: guard against divide by zero
- fix MSVC compile error [na-trium-144]
- exif: ensure enumerated entries can be converted to string values [lovell]
- gifsave: add support for eval callback, ensure correct return code [lovell]
- tiffsave: honor disc threshold during pyramid save [kleisauke]
- fill_nearest: fix a leak
- colour: use suggested rendering intent as fallback [kleisauke]
- morph: fix Orc path with large masks [kleisauke]
- invertlut: fix final value in some cases
- matrixload: fix file format detect for some matrix types
- radload: improve sanity check of colour-related headers [lovell]
- heifsave: reject multiband images [lovell]
- heifload: prevent possible int overflow for large images [kleisauke]
- tiffload: add missing read loop [kleisauke]
- prevent possible use-after-free when debugging via `--vips-leak` flag [lovell]
- avoid possible overflow when multiplication result is cast up [lovell]

10/10/24 8.16.0

- allow small offsets for the PDF magic string [project0]
- add support for OJPEG tiffs [DarthSim]
- add "palette" metadata item to flag palette images [DarthSim]
- jxl load and save now support exif, xmp, animation [DarthSim]
- improved configure output
- add a filetype blocker for imagemagick
- add basic g_auto support
- support for long EXIF values [MarcosAndre]
- better system error messages on windows [kleisauke]
- add configurable max coordinate and vips_max_coord_get()
- improve kill handling
- PFM save and load now uses scRGB (ie. linear 0-1) [NiHoel]
- turn vips_addalpha() into a VipsOperation [RiskoZoSlovenska]
- add vips_rawsave_target(), vips_rawsave_buffer() [akash-akya]
- vipsheader supports multiple "-f field" arguments [sergeevabc]
- add "target_size" to webpsave [john-parton]
- add "passes" to webpsave [john-parton]
- revise sRGB -> B_W coefficients [daniellovera]
- add vips_sdf(), vips_clamp(), vips_maxpair(), vips_minpair()
- more const for the C++ API [Julianiolo]
- deprecate "cache" (use tilecache instead)
- add tests for tokenisation
- add "unpack_complex" option to vips_getpoint()
- add deflate compression level setting to tiffsave [ruven]
- add "smart_deblock" to webpsave [goodusername123]

4/10/24 8.15.5

- version bump, revise C++ soname

3/10/24 8.15.4

- fix an off-by-one error in vips__token_get()
- heifsave: fix crash when passing an invalid bitdepth [kleisauke]
- webpsave: fix memory leak on error [dloebl]
- heifsave: ensure NCLX profile is freed in lossless mode [kleisauke]
- threadpool: fix a race condition in error handling [kleisauke]
- disable GLib cast checks and asserts for plain builds [kleisauke]
- fix jpeg in tiff for high Q [nahilsobh]
- threadset: fix a race condition during thread exit [kleisauke]
- fix compatibility with MSVC [Julianiolo]

11/8/24 8.15.3

- fix dzsave of >8-bit images to JPEG
- jpegsave: fix chrominance subsampling mode with jpegli [kleisauke]
- pngload: disable ADLER32/CRC checking in non-fail mode [kleisauke]
- improve target_clones support check [kleisauke]
- fix pipe read limit
- fix a rare crash on Windows in highly threaded applications [Julianiolo]
- vipssave: fix infinite loop on Windows with large images [pdbourke]
- conva: fix a crash with {u,}{short,int} images [erdmann]
- fix vips_image_get_string
- heifsave: fix lossless mode [kleisauke]
- composite: fix dest-atop blend mode [kleisauke]
- fix vips_source_map for zero-length sources [kleisauke]

12/3/24 8.15.2

- fix deflate compression of tiff pyramids [manthey]
- thumbnail always writes 8-bit thumbnails [turtletowerz]
- lower min scale factor to 0.0 in svgload and pdfload [lovell]
- heifload: don't warn on images with nclx profiles [kleisauke]
- ppmload: ensure multi-line comments are skipped [lovell]
- fix arrayjoin with some pipelines [TheEssem]
- fix high Q mono JPEG TIFF write with mozjpeg [cavenel]
- tiffsave: ensure large file support (>2GB) on MSVC [kleisauke]
- check linker for target_clones support [lovell]

18/12/23 8.15.1

- reduceh: fix Highway path on SSE2 [DarthSim]
- fix JPEG in TIFF colourspace for Q >= 90 [heman1-test]
- fix build with upcoming libjxl 0.9 [kleisauke]
- jxlsave: lower min effort value to 1 [DarthSim]
- fix build without libjpeg [ionenwks]
- fix vips7 plugin load [jcupitt]
- allow ".jfif" as a suffix for jpegsave [casperbrike]
- don't let the magick sniffer hijack TIFF [kleisauke]
- ignore BLOCKED classes in foreign map [jcupitt]
- add locks to fftw3 calls [akash-akya]

11/11/23 8.15.0

- add support for target_clones attribute [lovell]
	* use with (un)premultiply for ~10% perf gain on AVX CPUs
	* use with XYZ to LAB colourspace conversion for ~10% perf gain on AVX CPUs
- add fast path to extract_band and bandjoin for uchar images [lovell]
- reduce `vips_sharpen` max `sigma` to 10 [lovell]
- inline scRGB to XYZ colourspace conversion, ~2x faster [lovell]
- set "interlaced=1" for interlaced GIF images [kleisauke]
- add @line_art to find_trim [miltoncandelero]
- improve C++ binding [MathemanFlo]
	* add `inplace()` / `VImage::new_from_memory_copy()`
	* add overloads for `draw_*()` / `VImage::thumbnail_buffer()`
- allow negative line spacing in text [donghuikugou]
- add VIPS_META_BITS_PER_SAMPLE metadata, deprecate the
  "palette-bit-depth" and "heif-bitdepth" meta fields [MathemanFlo]
- add "revalidate" to foreign loaders [jcupitt]
- add `premultiplied` option to smartcrop [lovell]
- add "prewitt" and "scharr" edge detectors, "sobel" is more accurate for
  non-uchar formats [jcupitt]
- add support for forms in pdfium loader [kleisauke]
- swap built-in profiles with ICC v4 variants [kleisauke]
- remove libgsf dependency in favor of libarchive [kleisauke]
- better chunking for small shrinks [jcupitt]
- use alpha range of 0.0 - 1.0 for scRGB images [DarthSim]
- add support for 16-bit float TIFFs [DarthSim]
- add direct mode to dzsave [jcupitt]
- require C++11 as a minimum standard [kleisauke]
- add support for SIMD via Highway [kleisauke]
- threaded write in tiffsave for tiled JPEG and JPEG2000 [jcupitt]
- add vips_thread_execute() to the public API [jcupitt]
- add "keep" flag to foreign savers, deprecate "strip" [a3mar]
- improve scRGB handling [jcupitt]

18/9/23 8.14.5

- fix a crash with alpha plus icc_import and icc_export [jcupitt]
- fix a crash in jxlsave [jcupitt]

15/8/23 8.14.4

- fix null-pointer dereference during svgload [kleisauke]
- heif{load,save}: guard against NULL strings [kleisauke]
- pdfiumload: fix rendering of pages with different sizes [DarthSim]

20/7/23 8.14.3

- fix ICC handling of greyscale images with a incompatible profile [kleisauke]
- fix use-after-free during tiff pyramid save [kleisauke]
- fix vips7 PNG load and save when using libspng [jcupitt]
- tiffload: slightly relax tile size sanity check [lovell]
- heifsave: limit dimensions to a maximum edge of 16384 [lovell]
- colourspace: ensure CMYK conversion uses the embedded ICC profile [kleisauke]
- ensure chromatic adaptation during icc_{im,ex}port() [kleisauke]
- improve ICC compatibility check for CMYK images [kleisauke]

21/3/23 8.14.2

- use a private fontmap in vips_text() [jcupitt]
- increase sanity checks on TIFF tile dimensions [lovell]
- ensure compatibility with libheif > 1.14.2 [kleisauke]
- minor doc fixes [jcupitt]
- sanitise dimensions in JPEG-compressed TIFF images [lovell]
- fix target pnm write [ewelot]
- dedupe FITS header write [ewelot]
- fix `strip` parameter in webpsave [jcupitt]
- earlier abort of webpsave on kill [dloebl]
- fix thumbnail of CMYK images with an embedded ICC profile [kleisauke]
- fix ICC handling of RGB images with a monochrome profile [kleisauke]
- ensure ICC transforms keep all precision [kleisauke]
- fix openslideload associated=XXX load [jcupitt]
- fix compatibility with MSVC [SpaceIm]

9/1/23 8.14.1

- add vips_thread_isworker() compatibility function [remicollet]
- add vips_semaphore_down_timeout() [kleisauke]
- idle threads are removed after 15s [kleisauke]
- fix version number in gtk-doc index [kleisauke]
- save mono fits images as NAXIS=2 [ewelot]
- fix jpeg `autorotate` for orientation 3 [zhifengzhuang]

22/12/22 8.14.0

- remove autotools
- remove various obsolete scripts
- remove benchmark
- `jp2ksave` defaults to chroma subsample off, and jp2 write
- don't minimise `vips_sink_screen()` input after expose ... improves
  caching during interactive use
- require libjxl 0.6+
- add `interlace` option to GIF save [dloebl]
- magick load sets `magick-format` metadata [aksdb]
- add `.pnm` save [ewelot]
- threaded tiff jp2k and jpeg decompress
- improve speed and efficiency of animated WebP write [dloebl]
- add `rgb` mode to openslideload
- new thread recycler
- threadpools size dynamically with load
- operations can hint threadpool size
- faster `dzsave`
- support for N-colour ICC profiles
- add bash completions for `vips`
- fits load and allows many more bands
- fits write doesn't duplicate header fields
- add `wrap` to `vips_text()`
- GIF load supports truncated frames [tlsa]
- EXIF support for PNG load and save
- expose location of interest when using attention based cropping [ejoebstl]
- deprecate gifsave `reoptimise`, add `reuse`
- add `encoder` to heifsave [dloebl]
- add `cplusplus` meson build option [jcupitt]
- make arrayjoin much faster with large arrays

9/11/22 started 8.13.4
- missing include in mosaic_fuzzer [ServOKio]
- emit "finish" at the end of targetcustom write [lucaskanashiro]

11/10/22 started 8.13.3
- improve rules for 16-bit heifsave [johntrunc]
- improve libspng palette write [kleisauke]
- improve libspng palette sort [DarthSim]
- ensure EXIF has prefix before parsing [lovell]
- fix low bit depth palette spng save [DarthSim]
- fix thumbnail of non-sRGB images with an export profile [kleisauke]

5/9/22 started 8.13.2
- in dzsave, add add missing include directive for errno/EEXIST [kleisauke]
- fix 8 bit palette PNG save [lovell]
- fix null string in buffer print [pclewis]
- revise caching of seq mode loaders [jcupitt]
- reduce latency on dzsave kill [kleisauke]
- improve text too large check [kleisauke]
- fix subifd writing for small images [ruven]
- name ICC profiles in spngsave [lovell]

24/7/22 started 8.13.1
- fix im7 feature detection in meson
- add a summary table at the end of configure in meson
- fix libpng fallback when spng is disabled in meson
- add "unlimited" to jpegload
- better 0 detection in unpremultiply
- fix low bitdepth spng save [jeffska]
- fix PNG low bitdepth save of high bitdepth images
- add support for libjxl 0.7 [kleisauke]
- improve compatibility with older libgsf versions [kleisauke]

21/11/21 started 8.13
- configure fails for requested but unmet dependencies [remicollet]
- add support for another quantiser [DarthSim]
- add "extend", "background" and "premultiplied" to vips_mapim() to fix edge
  antialiasing [GavinJoyce]
- add support for HDR HEIC and AVIF images
- add vips_spngsave()
- jpeg2000 load left-justifies bitdepth
- add "password" option to pdfload, fix byte ordering of "background"
- add vips_operation_block_set(), vips_block_untrusted_set()
- improve the pixel rng
- new meson build system [tintou]
- improve introspection annotations [tintou]
- add "unlimited" to heifload [lovell]
- add support for regions in C++ API [shado23]
- add "maxerror" to gifsave [dloebl]
- update libnsgif API [tlsa]
- deprecate "properties" option to dzsave (now always on)
- add vips_dzsave_buffer()
- always set the min stack size for pthreads, if we can
- add "fail-on" to thumbnail
- add "gap" option to vips_reduce[hv]() and vips_resize() [kleisauke]
- add "ceil" option to vips_shrink() [kleisauke]
- quality improvements for image resizing [kleisauke]
- add vips_source_new_from_target()
- add vips_target_seek(), vips_target_read(), vips_target_new_temp()
- add vips_tiffsave_target()
- add vips_target_end(), deprecate vips_target_finish()
- add "mixed" to webpsave [dloebl]
- add support for ICC profiles and linear encoding to JXL load and save [f1ac]
- add "reoptimise" to gifsave [dloebl]
- add "bitdepth" to magicksave [dloebl]
- change default PNG filter to "none" [lovell]

26/11/21 started 8.12.3
- better arg checking for vips_hist_find_ndim() [travisbell]
- fix thumbnail with CMYK output [AdamGaskins]
- fix size_t / ssize_t confusion [flga]
- fix jxl compatibility break [lovell]

26/11/21 started 8.12.2
- make exif resuint optional and default to inch
- win: don't set create time on inappropriate file descriptors [lovell]
- fall back to magicksave for gif if cgif is not present [erik-frontify]
- fix a crash with 0 length vectors
- change default frame delay for GIFs from 1s to 0.1s
- remove stray trailing comma from iiif3 dirnames [whalehub]
- fix TTF load [chregu]
- revise GIF save alpha threshold [jfcalvo]
- raise libpng pixel size limit from 1m to 10m pixels [jskrzypek]
- fix gif save change detector [TheEssem]
- fix load from pipe with variable size reads

21/11/21 started 8.12.1
- fix insert [chregu]

14/6/21 started 8.12
- all tools support `--version`
- add vips_svgload_string() convenience function
- fix thumbnail with small image plus crop plus no upsize [Andrewsville]
- rename speed / reduction-effort / etc. params as "effort"
- add gifsave [lovell]
- arrayjoin minimises inputs during sequential processing, saving a lot of
  memory and file descriptors
- add vips_image_get_format_max()
- flatten handles out of range alpha and max_alpha correctly
- don't use atexit for cleanup, it's too unreliable
- tiff writer loops for the whole image rather than per page [LionelArn2]
- fix VipsSource with named pipes [vibbix]
- added restart_interval option to jpegsave [manthey]
- add IIIF3 support to dzsave [martimpassos]
- add atan2 to math2 [indus]
- improve buffer and target save file format selection
- added VipsForeignPpmFormat, format arg to ppm savers
- add fail-on to give better control over loader error sensitivity
- add hyperbolic functions sinh, cosh, tanh, asinh, acosh, atanh [hroskes]
- add untiled jp2k load
- "insert" will minimise in seq mode
- better EXIF string handling [lovell]

16/8/21 started 8.11.4
- fix off-by-one error in new rank fast path
- add "unlimited" flag to png load [joshuamsager]
- improve filtering of .v enums [lovell]
- better logic to prevent shrink to nothing in thumbnail [kleisauke]

14/7/21 started 8.11.3
- build threadpool later [kleisauke]
- add jxlsave prototypes [adil-benameur]
- limit text chunks in PNGs [randy408]

15/6/20 started 8.11.2
- better libdir guessing [remi]
- fix tiff pyramid creation with jp2k compression (was broken by 8.11.1)
- don't load modules if we're built without modules

18/6/21 started 8.11.1
- add more example code to C docs
- update libtool support in configure.ac
- more startup info if VIPS_INFO is set
- command-line programs set glib prgname (no longer set for you by VIPS_INIT)
- enable strip chopping for TIFF read [DavidStorm]
- disable modules by default for static builds [kleisauke]
- fix jpeg tiff pyramid save

14/8/20 started 8.11
- add vips_jpegload_source() and vips_svgload_source() to public C API
- integrate doxygen in build system to generate C++ API docs
- improve C++ API doc comments
- add VipsInterpolate and guint64 support to C++ API
- add VImage::new_from_memory_steal [Zeranoe]
- vipsthumbnail supports stdin / stdout thumbnailing
- have a lock just for pdfium [DarthSim]
- get pdfium load building again [Projkt-James]
- add _source load support for pdfium
- add "seed" param to perlin, worley and gaussnoise
- add vips_source_g_input_stream_new() to load images from a GInputStream
- add openslideload_source(), vipsload_source(), vipssave_target()
- add hist path to rank for large windows on uchar images
- better 8/16-bit choice for pngsave
- avoid NaN in mapim [afontenot]
- hist_find outputs a double histogram for large images [erdmann]
- fix ref leaks in mosaicing package
- run libvips leak test in CI
- add vips_fitsload_source(), vips_niftiload_source()
- png and gif load note background colour as metadata [781545872]
- add vips_image_[set|get]_array_double()
- add GIF load with libnsgif
- add jp2kload, jp2ksave
- add jp2k compression to tiff load and save
- add JPEG-XL load and save
- add black_point_compensation flag for icc transforms
- add "rgba" flag to vips_text() to enable full colour text rendering
- move openslide, libheif, poppler and magick to loadable modules [kleisauke]
- better detection of invalid ICC profiles, better fallback paths
- add "premultiply" flag to tiffsave
- new threading model has a single threadpool shared by all
  pipelines [kleisauke]

30/4/21 start 8.10.7
- better vips7 PNG load compatibility [SkyDiverCool]
- fix load of large PPM images from a pipe [ewelot]

22/12/20 start 8.10.6
- don't seek on bad file descriptors [kleisauke]
- check for null memory sources [kleisauke]
- improve ppmload, fixing a couple of small bugs
- improve EOF detection in jpegload [bozaro]
- improve error detection in spngload [randy408]
- fix includes of glib headers in C++ [lovell]
- fix build with more modern librsvg [lovell]
- fix a possible segv with very wide images [f1ac]
- fix issue thumbnailing RGBA images in linear mode [jjonesrs]
- improve vipsthumbnail profile handling
- fix tiff deflate predictor setting [Adios]
- fix vector path for composite on i386 [kleisauke]

18/12/20 started 8.10.5
- fix potential /0 in animated webp load [lovell]

14/12/20 started 8.10.4
- fix spng detection

18/10/20 started 8.10.3
- relax heic is_a rules [hisham]
- fix vips7 webp load [barryspearce]
- fix out of bounds exif read in heifload
- fix out of bounds read in tiffload
- fix tiffsave region shrink mode [imgifty]
- add missing flushes on write to target [harukizaemon]
- hide info messages you could get with some older glibs [kleisauke]
- fix --no-strip on dzsave with icc-profiles [altert]
- better GraphicsMagick image write [bfriesen]
- add missing read loops to spng, heif, giflib and ppm load [kleisauke]
- block zero width or height images from imagemagick load [Koen1999]
- check for overflow in gifload height [lovell]
- fix msb_first default in ppm load and save [ewelot]
- force binary mode on win for connection read / write [Alreiber]
- better testing for output to target [barryspearce]
- ppmload_source was missing is_a [ewelot]
- improve webpload rounding and blending behaviour [lovell]
- fix range clip in int32 -> unsigned casts [ewelot]
- fix precision error in clip of float -> int casts [ewelot]
- fix load of HEIC images with 0 length metadata [ddennedy-gpsw]
- revise rounding in reduce [kleisauke]

6/9/20 started 8.10.2
- update magicksave/load profile handling [kelilevi]
- better demand hint rules [kaas3000]
- fix tiff thumbnail from buffer and source [vansante]
- in jpegsave, don't set JFIF resolution if we set EXIF resolution
- bump minimum libheif version to 1.3 [lovell]
- dzsave in iiif mode could set info.json dimensions off by one [Linden6]
- pdfload allows dpi and scale to both be set [le0daniel]
- allow gaussblur sigma zero, meaning no blur
- better heif signature detection [lovell]
- fix vips_fractsurf() typo [kleisauke]
- better heif EOF detection [lovell]
- fix gir build with g-o-i 1.66+ [László]
- improve seek behaviour on pipes
- add "speed" param to heifsave [lovell]
- fix regression in C path for dilate / erode [kleisauke]
- fix build with libheif save but no load [estepnv]

9/8/20 started 8.10.1
- fix markdown -> xml conversion in doc generation
- remove typedef redefinitions to please old gccs
- fix regression in tiff pyramid thumbnailing [tand826]
- stop 0-length buffer being passed to imagemagick [lovell]
- convert no-profile CMYK to RGB on save [augustocdias]
- ensure SVG loader skips input with chars outside x09-x7F range [lovell]
- better mask sizing in gaussmat [johntrunc]
- fix tiffsave "squash" handling [barryspearce]
- fix jpegload autorotate [chregu]
- only start the background render thread on first use

24/1/20 started 8.10.0
- more conformat IIIF output from dzsave [regisrob]
- add @id to dzsave to set IIIF id property [regisrob]
- add max and min to region shrink [rgluskin]
- allow \ as an escape character in vips_break_token() [akemrir]
- tiffsave has a "depth" param to set max pyr depth
- libtiff LOGLUV images load and save as libvips XYZ
- add gifload_source, csvload_source, csvsave_target, matrixload_source,
  matrixsave_source, pdfload_source, heifload_source, heifsave_target,
  ppmload_source, ppmsave_target
- revise vipsthumbnail flags
- add VIPS_LEAK env var
- add vips_pipe_read_limit_set(), --vips-pipe-read-limit,
  VIPS_PIPE_READ_LIMIT
- revise gifload to fix BACKGROUND and PREVIOUS dispose [alon-ne]
- add subsample_mode, deprecate no_subsample in jpegsave [Elad-Laufer]
- add vips_isdirf()
- add PAGENUMBER support to tiff write [jclavoie-jive]
- add "all" mode to smartcrop
- flood fill could stop half-way for some very complex shapes
- better handling of unaligned reads in multipage tiffs [petoor]
- mark old --delete option to vipsthumbnail as deprecated [UweOhse]
- png save with a bad ICC profile just gives a warning
- add "premultipled" option to vips_affine(), clarified vips_resize()
  behaviour with alpha channels
- improve bioformats support with read and write of tiff subifd pyramids
- thumbnail exploits subifd pyramids
- handle all EXIF orientation cases, deprecate
  vips_autorot_get_angle() [Elad-Laufer]
- load PNGs with libspng, if possible
- deprecate heifload autorotate -- it's now always on
- revised resize improves accuracy [kleisauke]
- add --vips-config flag to show configuration info
- add "bitdepth" param to tiff save, deprecate "squash" [MathemanFlo]
- tiff load and save now supports 2 and 4 bit data [MathemanFlo]
- pngsave @bitdepth parameter lets you write 1, 2 and 4 bit PNGs
- ppmsave also uses "bitdepth" now, for consistency
- reduce operation cache max to 100
- rework the final bits of vips7 for vips8 [kleisauke]
- --disable-deprecated now works [kleisauke]
- vipsheader allows "stdin" as a filename
- gifload allows gifs with images outside the canvas
- wasm compatibility patches [kleisauke]
- webpsave has a @profile param

24/4/20 started 8.9.3
- better iiif tile naming [IllyaMoskvin]

31/1/19 started 8.9.2
- fix a deadlock with --vips-leak [DarthSim]
- better gifload behaviour for DISPOSAL_UNSPECIFIED [DarthSim]
- ban ppm max_value < 0
- add fuzz corpus to dist
- detect read errors correctly in source_sniff
- fix regression in autorot [malomalo]
- thumbnail on HEIC images could select the thumbnail incorrectly under some
  size modes [ZorinArsenij]

20/6/19 started 8.9.1
- don't use the new source loaders for new_from_file or new_from_buffer, it
  will break the loader priority system
- fix thumbnail autorot [janko]
- fix a warning with magicksave with no delay array [chregu]
- fix a race in tiled tiff load [kleisauke]
- better imagemagick init [LebronCurry]
- lock for metadata changes [jcupitt]

20/6/19 started 8.9.0
- add vips_image_get/set_array_int()
- disable webp alpha output if all frame fill the canvas and are solid
- support arrays of delays for animated images [deftomat]
- add "unlimited" flag to svgload
- disable webp alpha output if all frames fill the canvas and are solid
- add "compression" option to heifsave [lovell]
- support webp and zstd compression in tiff
- loaders use "minimise" to close input files earlier
- integrate support for oss-fuzz [omira-sch]
- add vips_switch() / vips_case() ... fast many-way ifthenelse
- better const handling for arithmetic operators fixes comparisons against out
  of range values
- sharpen restores input colourspace
- handle alpha in heifload / heifsave [meyermarcel]
- add @interpretation and @format to rawload
- nifti load/save uses double for all floating point metadata
- add vips_error_buffer_copy()
- add VipsSource and VipsTarget: a universal IO class for loaders and savers
- jpeg, png, tiff (though not tiffsave), rad, svg, ppm and webp use the
  new IO class
- rewritten ppm load/save is faster and uses less memory
- add @no_strip option to dzsave [kalozka1]
- add iiif layout to dzsave
- fix use of resolution-unit metadata on tiff save [kayarre]
- support TIFF CIELAB images with alpha [angelmixu]
- support TIFF with premultiplied alpha in any band
- block metadata changes on shared images [pvdz]
- RGB and sRGB are synonmous

17/9/19 started 8.8.4
- improve compatibility with older imagemagick versions
- remove realpath, since it can fail on systems with grsec

31/8/19 started 8.8.3
- revert sharpen restoring the input colourspace
- xres/yres tiffsave params were in pixels/cm [f--f]

9/7/19 started 8.8.2
- better early shutdown in readers
- don't attempt to save large XMP to jpeg [tnextday]
- always fetch HEIC metadata from the main image [zhoux2016]
- fix loop in malformed ppm [Kyle-Kyle]
- better support for PNGs with long comment names
- fix build with GM
- add locks for pdfium load
- fix build with MSVC
- fix a problem with shinkv tail processing [angelmixu]
- fix a read one byte beyond buffer bug in jpegload
- make GIF parsing less strict
- better feof() handling in GIF load
- clip coding and interpretation on vips image read
- check image bounds for GIF load
- prevent over-pre-shrink in thumbnail [kleisauke]
- fix sharpen with sigma 0.5 [2h4dl]
- sharpen restores input colourspace
- verify bands/format for coded images
- improve data_length handling for jpeg metadata

24/5/19 started 8.8.1
- improve realpath() use on older libc
- better magickload error messages
- more consistent behaviour for page-height metadata
- fix for composite with many small images and some combinations of blend modes
- fix memleak in tiff pyr save to memory [scossu]
- istiff attempts to read the first directory rather than just testing the
  magic number [przemyslawpluta]
- much faster ismagick() [jcupitt]
- better behaviour for vips_region_fetch() if request lies partly outside image
- remove 256 band limit in arithmetic.c [erdmann]
- disable Orc if building with CET [lovell]
- fix vipsthumbnail with pyr tiff [kleisauke]
- text autofit could occasionally terminate early [levmorozov]
- fewer warnings on tiffload [chregu]
- vips_resize() breaks aspect ratio and limits shrink to prevent <1px
  dimensions [lovell]

21/9/18 started 8.8.0
- much faster smartcrop [lovell]
- add low/high to smartcrop [jcupitt]
- add XMP support to png read/write [jcupitt]
- deprecate thumbnail auto_rotate, add no_rotate [jcupitt]
- implement thumbnail shrink-on-load for openslide images [jcupitt]
- add animated webp support [jcupitt]
- revise vips_cast() to improve behaviour with uint images [erdmann]
- add bandand()/or()/eor() to cplusplus binding [clcaalu]
- implement shrink-on-load for tiff pyramids [jcupitt]
- added vips_image_set_blob_copy() [jcupitt]
- don't stop composite on first non-transparent image [felixbuenemann, GDmac]
- add vips_rect_overlapsrect()
- composite is much faster at positioning subimages
- stop tiff pyr layers if width or height drop to 1 [gvincke]
- dzsave has a new skip_blanks option
- add vips_CMYK2XYZ() and vips_XYZ2CMYK(), plus associated routes
- include cmyk and srgb fallback profiles
- add vips_profile_load() and use it everywhere
- fix race in temp filename creation [lhecker]
- add @reduction_effort param to webpsave [lovell]
- add @option_string param to thumbnail_buffer [kleisauke]
- add XMP, IPCT, ICC, EXIF etc. support to magickload/magicksave
- much lower memuse for gifload
- tilecache speedups
- add vips_heifload(), vips_heifsave()
- add heif thumbnail support to vips_thumbnail()
- free threadpool earlier, reducing mem growth for some long-running
  processes [jtorresfabra]
- add vips_region_fetch() / _width() / _height() for language bindings
- vips_text() supports justification
- move vips_image_set_kill() and iskilled() to the public API
- dzsave to szi sets suffix correctly [martinweihrauch]
- dzsave szi writes "scan-properties.xml"
- add vips_image_(get|set)_image()
- add openslideload option to attach all associated images as metadata
- dzsave to szi will write all associated images
- remove old c++ and python interfaces
- vipsthumbnail can thumbnail animated and multipage images
- deprecate webpload @shrink, use @scale instead

31/3/19 started 8.7.5
- better buffer sizing in tiff reader [omira-sch]

4/1/19 started 8.7.4
- magickload with magick6 API did not chain exceptions correctly causing a
  memory leak under some conditions [kleisauke]
- zero memory on allocate to prevent write of uninitialized memory under some
  error conditions [Balint Varga-Perke]

21/11/18 started 8.7.3
- fix infinite loop for autofit with non-scaleable font
- mapim was not offsetting by window offset [erdmann]
- better rounding for scale [kleisauke]
- fix a memleak in magick6load [kleisauke]

21/11/18 started 8.7.2
- more info output for temp files to help diagnose problems
- vips_text() could set the wrong DPI
- vips_text() leaked in autofit mode

23/9/18 started 8.7.1
- update function list in docs [janko-m]
- test for g_str_to_ascii() [jcupitt]
- fix temp file open on Windows and fallback on linux [lovell]

23/12/17 started 8.7.0
- add magicksave, save image with libMagick [dlemstra]
- remove jpeg thumbnail from EXIF if "jpeg-thumbnail-data" has been removed by
  user
- hough_line scales width to 0 - 180, not 0 - 360
- hough_line is 4x faster
- hough_circle is 2x faster
- add vips_sobel() and vips_canny() edge detectors
- add vips_rotate() ... a convenience method for vips_similarity()
- svgload was missing is_a [lovell]
- better header sniffing for small files
- drop incompatible ICC profiles before save
- better hasalpha rules
- create funcs always make MULTIBAND (ie. no alpha)
- use O_TMPFILE, if available [Alexander--]
- set "interlaced=1" for interlaced JPG and PNG images
- add PDFium PDF loader
- jpegload adds a jpeg-chroma-subsample field with eg. 4:4:4 for no
  chrominance subsampling.
- tiffload, pdfload, magickload set VIPS_META_N_PAGES "n-pages" metadata item
- add fontfile option to vips_text() [fangqiao]
- add vips_transpose3d() -- swap major dimensions in a volumetric image
- remove vips7 stuff from default API ... you must now #include it explicitly
- added vips_argument_get_id() to fix derived classes on win32 [angelmixu]
- fix compile with MSVC 2017 [angelmixu]
- pdfload has a option for background
- vips7 C++ interface defaults off
- make members, getters and operators "const" in cpp API
- composite has params for x/y position of sub-images [medakk]
- add Mitchell kernel
- pyramid builders have a choice of 2x2 shrinkers [harukizaemon]
- add `palette` option to pngsave [felixbuenemann]
- add basic nifti load/save support
- support writing string-valued fields via libexif
- paste in the test suite from pyvips
- get EXIF tag names from tag plus ifd [@Nan619]
- escape ASCII control characters in XML
- magickload now sniffs some file types itself
- update radiance load from upstream
- add region_shrink to tiffsave
- mapim could fail for float index images with coordinates out of int range
- scale openexr alpha to 0 - 255
- close input earlier, when we can [kleisauke]
- add vips_object_get_args() for language bindings [kleisauke]

12/3/18 started 8.6.4
- better fitting of fonts with overhanging edges [Adrià]
- revise C++ example [fangqiao]
- strict round down on jpeg shrink on load [davidwood]
- configure test for g++ 7.2 and composite.cpp
- don't Ping in magickload, too unreliable
- ensure WebP can add metadata when compiled with libwebpmux [lovell]
- improve accuracy of vector path convolution [felixbuenemann]

12/2/18 started 8.6.3
- use pkg-config to find libjpeg, if we can
- better clean of output image in vips_image_write() fixes a crash
  writing twice to memory
- better rounding behaviour in convolution means we hit the vector path more
  often
- fix a crash if a delayed load failed [gsharpsh00ter]
- icc_import attaches the fallback profile if it used it

