This ensures child processes do not inherit open file descriptors
and will close a small but long-standing bug reported against
sharp over five years ago.
The change to lcms2 to support this is backwards compatible so
the flag will be ignored by existing versions.
The fopen 'e' flag will soon be part of the POSIX standard, and
is already supported in Linux and BSD. macOS currently ignores
it but will add support soon. Only Windows has a problem with it,
hence the ifdef wrapper.
* start adding dzsave to a target
made a thing for gsf to write to a target
* fix stray tabs in dzsave
* fix dzsave write to "."
Early versions of libgsf did not support writing to ".", so we had an ugly
workaround, but this should now be OK.
Fixing this ought to make write to target simple
* dzsave_target compiles
no idea if it works though
* seems to work now
creates stray 0 length files though, very odd
* fix stray files from dzsave
next: save to buffer is returning null
* fix buffer flush in dzsave
all tests pass!
* update changelog
* compiles, but untested
* works, but libtiff needs seek for write
next: add seek methods to target
* add target seek and read
seem to work
next: disc temps for disc output
* add libnsgif COPYING
oops, we were missing the COPYING file
see https://github.com/libvips/libvips/issues/2800
thanks mika-fischer
* tiffsave uses a disc temp if it can
* revise temp target rules
only make a disc temp if we are writing to a filesystem target
* add new target methods to targetcustom
since finish did not return an error code
also make sure we don't call target_end from inside _dispose, since that
can't signal error either
see https://github.com/libvips/libvips/issues/2801
* Allow to modify/create EXIF 2.3 ASCII tags
Make `tag_is_ascii` aware of the EXIF 2.3 ASCII tags that are
available since libexif 0.6.22.
See: https://github.com/kleisauke/net-vips/issues/167
* Fix CI
* quick proposal
warn on startup if untrusted operations might run
use vips_block_untrusted_set() to block untrusted operations, set an env
var or make a file to stop the warning
* mark fits, nifti and svg as untrusted
* remove the annoying "untrusted" warning message
better to warn on the download page
leave vips_block_untrusted_set() since it's obviously useful
* separate UNTRUSTED and BLOCKED
* typos
* add VIPS_BLOCK_UNTRUSTED env var
* move BLOCK_UNTRUSTED after plugin load
obviously, ooops
* add a test, disable *magick
although *magick is fuzzed, it's probably safer to disable it in
untrusted environments
* mark some more operations as untrusted
Strip TIFFs with rowperstrip of 1 used to use 1-pixel high cache tiles.
This could slow reading. This patch sets a minimum tile height near 16
but a multiple of the strip size.
* libnsgif: Update to latest upstream.
* nsgifload: Update for new pixel format API.
LibNSGIF now lets the client select a pixel colour component
order. We use NSGIF_BITMAP_FMT_R8G8B8A8, which is the same
format LibNSGIF always decoded to.
* nsgifload: Remove loop_count from VERBOSE output.
This was internal state for a nsgif_frame_prepare() managed
animation, but VIPS doesn't use nsgif_frame_prepare(). The
loop_count member has been removed from the public structure.
The nsgif_data_scan() call returns an error code that says
if anything was wrong with the source data.
It is not unusual for there to be bad stuff in a GIF, so we
only need to worry if we failed to find any frames.
* cgifsave: avoid size issue
avoid size issue by restoring the original transparency setting after quantization/dithering
* switch to per-frame alpha channel
* add option for lossy transparency
* switch lossy transparency off by default
* switch to g_malloc instead of g_malloc0
no need to 0 initialize at this point
* adapt to libvips coding conventions
* cgifsave: avoid size issue
avoid size issue by restoring the original transparency setting after quantization/dithering
* switch to per-frame alpha channel
* add option for lossy transparency
* switch lossy transparency off by default
* switch to g_malloc instead of g_malloc0
no need to 0 initialize at this point
* adapt to libvips coding conventions
* switch to official Homebrew sources for installing cgif
* bump required cgif version to v0.2.0
Use GLib's i18n support instead of copying and pasting that
logic into its own header. This deprecates the vips/intl.h
header in favour of glib/gi18n.h.
* Meson: remove space before colon
Since key-value pairs in Python are usually delimited as
colon+space instead of space+colon+space.
* Meson: disable modules by default when building static libraries
Corresponds to autotools. See: #2323.
* Meson: make modules a feature option
Corresponds to autotools, where modules are built
automatically if enabled and supported.
* Meson: specify minimum required GLib version
* Meson: fix indentation
* Remove unused function checks
* Simplify GLib configure checks
* Meson: ensure modules doesn't include enumtypes sources
Since that would cause duplicate symbols.
(`soname_header` can also be safely removed here,
since that is already included in `libvips_headers_dep`)
* LSan: remove GLib suppression
* LSan: disable the fast unwinder to get full stacktraces
* Move ASan/UBSan fuzzer options to CI configuration
* LSan: remove EOLed python2.7 suppression
* LSan: remove libstdc++ suppression
* LSan: add libx265 to suppression file
* Try to reproduce small memleak
* Try a possible patch
* Skip test if `im_benchmark` is not available
* CI: upgrade Clang version to 13
* CI: correct job names
* Meson: increase the timeout for tests
* README.md: correct Meson invocation
* Ensure that double asterisk characters are only used for gtk-doc comments
This triggers warnings when parsing the files with the introspection scanner
and gtk-doc
* Enhance the introspection support by fixing annotations
Also refine the .metadata file
Co-authored-by: John Cupitt <jcupitt@gmail.com>
* quick hack
won't even compile
* works!
at a basic level, anyway
* start wiring up metadata
* metadata done
* add spng interlaced save
* start adding index support
* fix palette save
* Update libvips/foreign/spngsave.c
Co-authored-by: Kleis Auke Wolthuizen <github@kleisauke.nl>
* start adding low bit depth write
* add a warning for low bitdepth write
* small fixes
* add 1/2/4 bit write
adapted from the vips2tiff bit packer
* small polish
* note spngsave in changelog
* Update libvips/foreign/spngsave.c
Co-authored-by: Kleis Auke Wolthuizen <github@kleisauke.nl>
* Update libvips/foreign/spngsave.c
Co-authored-by: Kleis Auke Wolthuizen <github@kleisauke.nl>
* revise 8 and 16-bit PNG write rules
* cleanup
* remove unnecessary palette filter optimisation
since libspng already does this
* add xres/yres rounding
thanks klies
he commit message for your changes. Lines starting
* look for spng.pc and libspng.pc
It can be called either, frustratingly.
* fix PACKAGES_USED for spng .pc changes
Co-authored-by: Kleis Auke Wolthuizen <github@kleisauke.nl>
We were loading 12-bit images as 0-4095 pixels, which then looked very
dark as RGB16. This patch left-justifies bits to fill 0-55, 0-65535 etc.
as required.
* libnsgif: Delete patch for read only source data.
The source data is now read only in upstream libnsgif and the code
has changed quite a bit so this does not apply.
* libnsgif: Update to latest upstream master.
* libnsgif: Only one insufficient data return code now.
There is only one code now, for "I need more data".
* libnsgif: Update for renamed structure member.
When we image_new_from_source, the source object has some of the loader
state: it tracks the current read position of the load library. This
means that we mustn't keep source loaders in the operation cache, since
a second call could give a different result because the source object
read position might have changed.
Also: add a rewind to get_flags_source in spngload, and jp2k needs to
tag its load region as having no thread ownership or you'll get assert
fails in the test suite with debug enabled.
This patch makes "insert" issue minimise signals for inputs in sequential
mode. This can drop memory use in some programs, for example:
```python
import sys
import random
import pyvips
image = pyvips.Image.black(20000, 20000)
for filename in sys.argv[2:]:
tile = pyvips.Image.new_from_file(filename, access='sequential')
x = random.randint(0, image.width - tile.width)
y = random.randint(0, image.height - tile.height)
image = image.insert(tile, x, y)
image.write_to_file(sys.argv[1])
```
Before this patch:
```
$ for i in {0..1000}; do cp ~/pics/k2.jpg $i.jpg; done
$ /usr/bin/time -f %M:%e ../manyjoin.py ../x.jpg *.jpg
5456256:4.34
```
With this patch:
```
$ /usr/bin/time -f %M:%e ../manyjoin.py ../x.jpg *.jpg
2475324:3.38
```
This patch makes arrayjoin leave a bigger margin off the end of each
input image. This can help some loaders which have large output caches.
See https://github.com/libvips/libvips/issues/2440
Instead of a simple fail/don't-fail boolean switch, add fail-on, an enum which sets the sensitivity of loaders to errors.
There's a new sensitivity level which tries to detect truncated images, but ignores other types of error.
tell buffer and target savers the file format
Currently, buffer and target savers are not told the format they should
write.
This is usually OK (the JPEG saver already knows it should write JPEG),
but some savers can write several formats, and these currently need an
extra parameter.
For example:
```ruby
buf = x.write_to_buffer ".bmp", format: "bmp"
```
The first ".bmp" gets libvips to pick magicksave, the second
`format:` param is necessary to tell magicksave to write BMP.
This patch adds stub subclasses so that the savers know the exact format. It also improves PPM save.
Webp decode can only shrink-on-load to int boundaries. This means that frames
in an animation which only update part of the canvas can get displaced by
up to 0.5 pixels, causing juddering.
see https://github.com/libvips/libvips/issues/2379
The filemode ifdefs had grown to 30 lines of code duplicated in four
source files. Move to a single copy in a private header (not part of the
public API).
* Cleanup unused defines
* win32: do not inherit open file handles in child processes
`O_NOINHERIT` and the `N` flag of `fopen` is available in all
supported Windows versions.
* unix: ensure any open file handles are closed on exec
`O_CLOEXEC` is available since Linux 2.6.23 and is ignored on
earlier versions. `e` flag of `fopen` is available since glibc 2.7.
* allow utf-8 header for svg detection
We were checking that the first 24 chars of an SVG were plain ASCII,
but that's not always the case, for example:
<svg id="レイヤー_1のコピー"
data-name="レイヤー 1のコピー"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 100 100">
</svg>
We now test for the string "<svg" being in the first 1000 bytes, and
everything up to that being valid utf-8.
See https://github.com/libvips/libvips/issues/2438
* raise priority of webpload
it was very low priority before, for some reason
switch GIF save to frame at a time
And make a new colormap if the frame average changes. This keeps memory use low, even for very large GIFs, though is somewhat slower.
See https://github.com/libvips/libvips/pull/2445
* Add jpeg restart_interval option.
This allows saving a jpeg with MCU restarts.
* Fix code style. Add description of restart_interval.
* Add a basic test based on output length.
* Update main change log.
We used to assume (in several places) that any source with a filename was
seekable. This patch adds a is_file test, and makes all the loaders use it.
see https://github.com/libvips/libvips/issues/2467
We were looping over pages, cropping each one out, and saving.
Now there's a single loop for thw whole of the image, so things like
percent reporting work in the obvious way.
See https://github.com/libvips/libvips/issues/2450
remove shutdown from atexit
Because atexit() can be called at almost any point during process termination,
including after worker threads have been force-quit, we can't use it for
cleanup.
New policy: use vips_shutdown() explicitly if you need to clean up,
though it's optional. Only use atexit() for leak checking.
* fic gtk-doc typenames in cgif
* fix flatten clipping
flatten could produce out of range values if max_alpha was less than
the limit of the numeric range of the format
https://github.com/libvips/libvips/issues/2431
* Ensure UBSan exits with a non-zero code on error
* Avoid misaligned member access in mosaic_fuzzer
* Add missing VIPS_CLIP in scRGB2sRGB/scRGB2BW
* Fix UBSan error in flatten
By using saturated casts for the int types (copied from vips_cast).
* CI: ensure fuzzer log is printed on error
* Avoid UB in heifload
* Revert flatten change
I could no longer reproduce this with clang 12 locally.
* Indentation fixes [skip ci]
Provides control over the maximum number of colours in the output
image palette, making the API more closely match that of pngsave.
Lowering the bitdepth to 7 (from the default value of 8), which
halves the maximum number of colours from 255 to 127, typically
reduces encoding time by ~20%.
By making the sequential line cache non-persistent, and only minimising
when the read point is well past the image.
On large arrayjoin operations, this saves many GB of memory.
See https://github.com/kleisauke/net-vips/issues/135
arrayjoin with a sequential pipeline will now minimise inputs when they
are no longer being used. This drops the number of open file handles
needed to construct large arrays.
Sadly, memory savings are minimal.
see https://github.com/kleisauke/net-vips/issues/135