Merge branch 'master' into no-blank-tiles

This commit is contained in:
John Cupitt 2016-05-15 09:48:21 +01:00
commit 72b67d0ec2
118 changed files with 1232 additions and 620 deletions

View File

@ -1,6 +1,5 @@
language: cpp language: cpp
before_install: before_install:
- sudo add-apt-repository ppa:lyrasis/precise-backports -y
- sudo apt-get update -qq - sudo apt-get update -qq
- sudo apt-get install automake gtk-doc-tools - sudo apt-get install automake gtk-doc-tools
- sudo apt-get install gobject-introspection - sudo apt-get install gobject-introspection
@ -8,7 +7,7 @@ before_install:
- sudo apt-get install libpng12-dev libwebp-dev libtiff4-dev libxml2-dev - sudo apt-get install libpng12-dev libwebp-dev libtiff4-dev libxml2-dev
- sudo apt-get install swig libmagick++-dev bc - sudo apt-get install swig libmagick++-dev bc
- sudo apt-get install libcfitsio3-dev libgsl0-dev libmatio-dev - sudo apt-get install libcfitsio3-dev libgsl0-dev libmatio-dev
- sudo apt-get install liborc-0.4-dev liblcms2-dev - sudo apt-get install liborc-0.4-dev liblcms2-dev libpoppler-glib-dev
before_script: before_script:
- ./bootstrap.sh - ./bootstrap.sh
- ./configure - ./configure

View File

@ -1,8 +1,15 @@
1/5/16 started 8.4
- many more wepsave options [Felix Bünemann]
- added quant_table option to wepsave [Felix Bünemann]
15/4/16 started 8.3.1 15/4/16 started 8.3.1
- rename vips wrapper script, it was still vips-8.2, thanks Benjamin - rename vips wrapper script, it was still vips-8.2, thanks Benjamin
- export C++ operator overloads for MSVC linking [Lovell] - export C++ operator overloads for MSVC linking [Lovell]
- fix magickload @page with GraphicsMagick - fix magickload @page with GraphicsMagick
- add giflib5 support - add giflib5 support
- allow resize >1 on one axis, <1 on the other
- vips_resize has an optional @kernel argument
- fix giflib4 detection [felixbuenemann]
29/1/16 started 8.3 29/1/16 started 8.3
- add vips_reduce*() ... a fast path for affine downsize - add vips_reduce*() ... a fast path for affine downsize

View File

@ -150,12 +150,14 @@ libraries automatically. See `./configure --help` for a set of flags to
control library detection. Packages are generally found with `pkg-config`, control library detection. Packages are generally found with `pkg-config`,
so make sure that is working. so make sure that is working.
libtiff and libjpeg do not usually use `pkg-config` so libvips looks for libtiff, giflib and libjpeg do not usually use `pkg-config` so libvips looks for
them in the default path and in `$prefix`. If you have installed your own them in the default path and in `$prefix`. If you have installed your own
versions of these libraries in a different location, libvips will not see versions of these libraries in a different location, libvips will not see
them. Use switches to libvips configure like: them. Use switches to libvips configure like:
./configure --prefix=/Users/john/vips \ ./configure --prefix=/Users/john/vips \
--with-giflib-includes=/opt/local/include \
--with-giflib-libraries=/opt/local/lib \
--with-tiff-includes=/opt/local/include \ --with-tiff-includes=/opt/local/include \
--with-tiff-libraries=/opt/local/lib \ --with-tiff-libraries=/opt/local/lib \
--with-jpeg-includes=/opt/local/include \ --with-jpeg-includes=/opt/local/include \
@ -187,8 +189,6 @@ If available, libvips adds support for EXIF metadata in JPEG files.
The standard gif loader. If this is not present, vips will try to load gifs The standard gif loader. If this is not present, vips will try to load gifs
via imagemagick instead. via imagemagick instead.
vips will only work with giflib 4.
### librsvg ### librsvg
The usual SVG loader. If this is not present, vips will try to load SVGs The usual SVG loader. If this is not present, vips will try to load SVGs
@ -234,6 +234,15 @@ If available, libvips adds support for loading all libMagick-supported
image file types. Use `--with-magickpackage=GraphicsMagick` to build against image file types. Use `--with-magickpackage=GraphicsMagick` to build against
graphicsmagick instead. graphicsmagick instead.
Imagemagick 6.9+ needs to have been built with `--with-modules`. Most packaged
IMs are, I think, but if you are rolling your own, you'll need to pass
this flag to configure.
If you are going to be using libvips with untrusted images, perhaps in a
web-server, for example, you should consider the security implications of
using a package with such a large attack surface. You might prefer not to
enable Magick support.
### pangoft2 ### pangoft2
If available, libvips adds support for text rendering. You need the If available, libvips adds support for text rendering. You need the

16
TODO
View File

@ -1,3 +1,19 @@
- this seems to not work:
$ vips copy k2.jpg x.dz[suffix=.jpg[Q=90]]
dzsave: not , or ) after parameter
- add more webp tests to py suite
- try moving some more of the CLI tests to py
- the gif tests in the suite sometimes fail with giflib5 because of an
uninitialized struct in giflib, see
https://sourceforge.net/p/giflib/bugs/94/
sadly ubuntu 16.04 only comes with giflib5, and giflib5 is currently broken
- I like the new int mask creator in reducev, can we use it in im_vips2imask() - I like the new int mask creator in reducev, can we use it in im_vips2imask()
as well? as well?

View File

@ -631,14 +631,14 @@ if test "$GIFLIB_LIBS" = ""; then
INCLUDES="$GIFLIB_INCLUDES $INCLUDES" INCLUDES="$GIFLIB_INCLUDES $INCLUDES"
# Try the standard search path first # Try the standard search path first
AC_TRY_LINK([#include <gif_lib.h>],[EGifSetGifVersion(0,0)], [ AC_TRY_LINK([#include <gif_lib.h>],[DGifSlurp(0)], [
GIFLIB_LIBS="-lgif" GIFLIB_LIBS="-lgif"
], [ ], [
# giflib is not in the standard search path, try $prefix # giflib is not in the standard search path, try $prefix
LIBS="-L${prefix}/lib $LIBS" LIBS="-L${prefix}/lib $LIBS"
AC_TRY_LINK([#include <gif_lib.h>],[EGifSetGifVersion(0,0)], [ AC_TRY_LINK([#include <gif_lib.h>],[DGifSlurp(0)], [
GIFLIB_LIBS="-L${prefix}/lib -lgif" GIFLIB_LIBS="-L${prefix}/lib -lgif"
], [ ], [
GIFLIB_LIBS=no GIFLIB_LIBS=no
@ -684,3 +684,123 @@ fi
])dnl ])dnl
dnl From FIND_MOTIF and ACX_PTHREAD, without much understanding
dnl
dnl FIND_LIBWEBP[ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]
dnl ---------------------------------------------------
dnl
dnl Find webp libraries and headers ... useful for platforms which are missing
dnl the webp .pc file
dnl
dnl Put compile stuff in LIBWEBP_INCLUDES
dnl Put link stuff in LIBWEBP_LIBS
dnl Define HAVE_LIBWEBP if found.
dnl
AC_DEFUN([FIND_LIBWEBP], [
AC_REQUIRE([AC_PATH_XTRA])
LIBWEBP_INCLUDES=""
LIBWEBP_LIBS=""
AC_ARG_WITH(libwebp,
AS_HELP_STRING([--without-libwebp], [build without libwebp (default: test)]))
# Treat --without-libwebp like --without-libwebp-includes --without-libwebp-libraries.
if test "$with_libwebp" = "no"; then
LIBWEBP_INCLUDES=no
LIBWEBP_LIBS=no
fi
AC_ARG_WITH(libwebp-includes,
AS_HELP_STRING([--with-libwebp-includes=DIR], [libwebp includes are in DIR]),
LIBWEBP_INCLUDES="-I$withval")
AC_ARG_WITH(libwebp-libraries,
AS_HELP_STRING([--with-libwebp-libraries=DIR], [libwebp libraries are in DIR]),
LIBWEBP_LIBS="-L$withval -lwebp")
AC_MSG_CHECKING(for libwebp)
# Look for webp/decode.h
if test "$LIBWEBP_INCLUDES" = ""; then
# Check the standard search path
AC_TRY_COMPILE([#include <webp/decode.h>],[int a;],[
LIBWEBP_INCLUDES=""
], [
# webp/decode.h is not in the standard search path, try
# $prefix
libwebp_save_INCLUDES="$INCLUDES"
INCLUDES="-I${prefix}/include $INCLUDES"
AC_TRY_COMPILE([#include <webp/decode.h>],[int a;],[
LIBWEBP_INCLUDES="-I${prefix}/include"
], [
LIBWEBP_INCLUDES="no"
])
INCLUDES=$libwebp_save_INCLUDES
])
fi
# Now for the libraries
if test "$LIBWEBP_LIBS" = ""; then
libwebp_save_LIBS="$LIBS"
libwebp_save_INCLUDES="$INCLUDES"
LIBS="-lwebp $LIBS"
INCLUDES="$LIBWEBP_INCLUDES $INCLUDES"
# Try the standard search path first
AC_TRY_LINK([#include <webp/decode.h>],[WebPInitDecoderConfig(0)], [
LIBWEBP_LIBS="-lwebp"
], [
# libwebp is not in the standard search path, try $prefix
LIBS="-L${prefix}/lib $LIBS"
AC_TRY_LINK([#include <webp/decode.h>],[WebPInitDecoderConfig(0)], [
LIBWEBP_LIBS="-L${prefix}/lib -lwebp"
], [
LIBWEBP_LIBS=no
])
])
LIBS="$libwebp_save_LIBS"
INCLUDES="$libwebp_save_INCLUDES"
fi
AC_SUBST(LIBWEBP_LIBS)
AC_SUBST(LIBWEBP_INCLUDES)
# Print a helpful message
libwebp_libraries_result="$LIBWEBP_LIBS"
libwebp_includes_result="$LIBWEBP_INCLUDES"
if test x"$libwebp_libraries_result" = x""; then
libwebp_libraries_result="in default path"
fi
if test x"$libwebp_includes_result" = x""; then
libwebp_includes_result="in default path"
fi
if test "$libwebp_libraries_result" = "no"; then
libwebp_libraries_result="(none)"
fi
if test "$libwebp_includes_result" = "no"; then
libwebp_includes_result="(none)"
fi
AC_MSG_RESULT([libraries $libwebp_libraries_result, headers $libwebp_includes_result])
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
if test "$LIBWEBP_INCLUDES" != "no" && test "$LIBWEBP_LIBS" != "no"; then
AC_DEFINE(HAVE_LIBWEBP,1,[Define if you have libwebp libraries and header files.])
$1
else
LIBWEBP_INCLUDES=""
LIBWEBP_LIBS=""
$2
fi
])dnl

View File

@ -2,7 +2,7 @@
# also update the version number in the m4 macros below # also update the version number in the m4 macros below
AC_INIT([vips], [8.3.1], [vipsip@jiscmail.ac.uk]) AC_INIT([vips], [8.4.0], [vipsip@jiscmail.ac.uk])
# required for gobject-introspection # required for gobject-introspection
AC_PREREQ(2.62) AC_PREREQ(2.62)
@ -17,8 +17,8 @@ AC_CONFIG_MACRO_DIR([m4])
# user-visible library versioning # user-visible library versioning
m4_define([vips_major_version], [8]) m4_define([vips_major_version], [8])
m4_define([vips_minor_version], [3]) m4_define([vips_minor_version], [4])
m4_define([vips_micro_version], [1]) m4_define([vips_micro_version], [0])
m4_define([vips_version], m4_define([vips_version],
[vips_major_version.vips_minor_version.vips_micro_version]) [vips_major_version.vips_minor_version.vips_micro_version])
@ -38,7 +38,7 @@ VIPS_VERSION_STRING=$VIPS_VERSION-`date`
# binary interface changes not backwards compatible?: reset age to 0 # binary interface changes not backwards compatible?: reset age to 0
LIBRARY_CURRENT=46 LIBRARY_CURRENT=46
LIBRARY_REVISION=1 LIBRARY_REVISION=2
LIBRARY_AGE=4 LIBRARY_AGE=4
# patched into include/vips/version.h # patched into include/vips/version.h
@ -439,66 +439,66 @@ fi
if test x"$with_magick" != "xno"; then if test x"$with_magick" != "xno"; then
# we SetImageOption to disable some DICOM read processing, but that's only # we SetImageOption to disable some DICOM read processing, but that's only
# in more recent imagemagicks and not in graphicsmagick # in more recent imagemagicks and not in graphicsmagick
save_LIBS=$LIBS save_LIBS="$LIBS"
LIBS="$LIBS $MAGICK_LIBS" LIBS="$LIBS $MAGICK_LIBS"
AC_CHECK_FUNCS(SetImageOption, AC_CHECK_FUNCS(SetImageOption,
AC_DEFINE(HAVE_SETIMAGEOPTION,1, AC_DEFINE(HAVE_SETIMAGEOPTION,1,
[define if your magick has SetImageOption.])) [define if your magick has SetImageOption.]))
LIBS=$save_LIBS LIBS="$save_LIBS"
fi fi
if test x"$with_magick" != "xno"; then if test x"$with_magick" != "xno"; then
# newer ImageMagicks use MagickCoreGenesis instead of InitializeMagick argh # newer ImageMagicks use MagickCoreGenesis instead of InitializeMagick argh
save_LIBS=$LIBS save_LIBS="$LIBS"
LIBS="$LIBS $MAGICK_LIBS" LIBS="$LIBS $MAGICK_LIBS"
AC_CHECK_FUNCS(MagickCoreGenesis, AC_CHECK_FUNCS(MagickCoreGenesis,
AC_DEFINE(HAVE_MAGICKCOREGENESIS,1, AC_DEFINE(HAVE_MAGICKCOREGENESIS,1,
[define if your magick has MagickCoreGenesis.])) [define if your magick has MagickCoreGenesis.]))
LIBS=$save_LIBS LIBS="$save_LIBS"
fi fi
if test x"$with_magick" != "xno"; then if test x"$with_magick" != "xno"; then
# newer ImageMagicks use ResetImagePropertyIterator instead of # newer ImageMagicks use ResetImagePropertyIterator instead of
# ResetImageAttributeIterator argh # ResetImageAttributeIterator argh
save_LIBS=$LIBS save_LIBS="$LIBS"
LIBS="$LIBS $MAGICK_LIBS" LIBS="$LIBS $MAGICK_LIBS"
AC_CHECK_FUNCS(ResetImagePropertyIterator, AC_CHECK_FUNCS(ResetImagePropertyIterator,
AC_DEFINE(HAVE_RESETIMAGEPROPERTYITERATOR,1, AC_DEFINE(HAVE_RESETIMAGEPROPERTYITERATOR,1,
[define if your magick has ResetImagePropertyIterator.])) [define if your magick has ResetImagePropertyIterator.]))
LIBS=$save_LIBS LIBS="$save_LIBS"
fi fi
if test x"$with_magick" != "xno"; then if test x"$with_magick" != "xno"; then
# so ... do we have ResetImageAttributeIterator()? GM does not # so ... do we have ResetImageAttributeIterator()? GM does not
save_LIBS=$LIBS save_LIBS="$LIBS"
LIBS="$LIBS $MAGICK_LIBS" LIBS="$LIBS $MAGICK_LIBS"
AC_CHECK_FUNCS(ResetImageAttributeIterator, AC_CHECK_FUNCS(ResetImageAttributeIterator,
AC_DEFINE(HAVE_RESETIMAGEATTRIBUTEITERATOR,1, AC_DEFINE(HAVE_RESETIMAGEATTRIBUTEITERATOR,1,
[define if your magick has ResetImageAttributeIterator.])) [define if your magick has ResetImageAttributeIterator.]))
LIBS=$save_LIBS LIBS="$save_LIBS"
fi fi
if test x"$with_magick" != "xno"; then if test x"$with_magick" != "xno"; then
# more recent magicks have GetVirtualPixels rather than GetImagePixels # more recent magicks have GetVirtualPixels rather than GetImagePixels
save_LIBS=$LIBS save_LIBS="$LIBS"
LIBS="$LIBS $MAGICK_LIBS" LIBS="$LIBS $MAGICK_LIBS"
AC_CHECK_FUNCS(GetVirtualPixels, AC_CHECK_FUNCS(GetVirtualPixels,
AC_DEFINE(HAVE_GETVIRTUALPIXELS,1, AC_DEFINE(HAVE_GETVIRTUALPIXELS,1,
[define if your magick has GetVirtualPixels.])) [define if your magick has GetVirtualPixels.]))
LIBS=$save_LIBS LIBS="$save_LIBS"
fi fi
if test x"$with_magick" != "xno"; then if test x"$with_magick" != "xno"; then
# do we have number_scenes in image_info ... imagemagick uses this, gm # do we have number_scenes in image_info ... imagemagick uses this, gm
# still uses subrange # still uses subrange
save_CFLAGS=$CFLAGS save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $MAGICK_CFLAGS" CFLAGS="$CFLAGS $MAGICK_CFLAGS"
AC_CHECK_MEMBER([struct _ImageInfo.number_scenes], AC_CHECK_MEMBER([struct _ImageInfo.number_scenes],
AC_DEFINE(HAVE_NUMBER_SCENES,1, AC_DEFINE(HAVE_NUMBER_SCENES,1,
[define if your magick has ImageInfo.number_scenes.]), [define if your magick has ImageInfo.number_scenes.]),
[], [],
[#include <magick/api.h>]) [#include <magick/api.h>])
CFLAGS=$save_CFLAGS CFLAGS="$save_CFLAGS"
fi fi
# orc # orc
@ -511,12 +511,12 @@ if test x"$with_orc" != "xno"; then
[AC_DEFINE(HAVE_ORC,1,[define if you have orc-0.4.11 or later installed.]) [AC_DEFINE(HAVE_ORC,1,[define if you have orc-0.4.11 or later installed.])
with_orc=yes with_orc=yes
PACKAGES_USED="$PACKAGES_USED orc-0.4" PACKAGES_USED="$PACKAGES_USED orc-0.4"
save_LIBS=$LIBS save_LIBS="$LIBS"
LIBS="$LIBS $ORC_LIBS" LIBS="$LIBS $ORC_LIBS"
AC_CHECK_FUNCS(orc_program_get_error, AC_CHECK_FUNCS(orc_program_get_error,
AC_DEFINE(HAVE_ORC_PROGRAM_GET_ERROR,1, AC_DEFINE(HAVE_ORC_PROGRAM_GET_ERROR,1,
[define if your orc has orc_program_get_error.])) [define if your orc has orc_program_get_error.]))
LIBS=$save_LIBS LIBS="$save_LIBS"
], ],
[AC_MSG_WARN([orc-0.4.11 or later not found; disabling orc support]) [AC_MSG_WARN([orc-0.4.11 or later not found; disabling orc support])
with_orc=no with_orc=no
@ -563,12 +563,12 @@ AC_ARG_WITH([poppler],
AS_HELP_STRING([--without-poppler], [build without poppler (default: test)])) AS_HELP_STRING([--without-poppler], [build without poppler (default: test)]))
if test x"$with_poppler" != x"no"; then if test x"$with_poppler" != x"no"; then
PKG_CHECK_MODULES(POPPLER, [poppler-glib >= 0.30.0 cairo >= 1.2], PKG_CHECK_MODULES(POPPLER, [poppler-glib >= 0.16.0 cairo >= 1.2],
[AC_DEFINE(HAVE_POPPLER,1,[define if you have poppler-glib >= 0.30.0 and cairo >= 1.2 installed.]) [AC_DEFINE(HAVE_POPPLER,1,[define if you have poppler-glib >= 0.16.0 and cairo >= 1.2 installed.])
with_poppler=yes with_poppler=yes
PACKAGES_USED="$PACKAGES_USED poppler-glib cairo" PACKAGES_USED="$PACKAGES_USED poppler-glib cairo"
], ],
[AC_MSG_WARN([poppler-glib >= 0.30.0 or cairo >= 1.2 not found; disabling PDF load via poppler]) [AC_MSG_WARN([poppler-glib >= 0.16.0 or cairo >= 1.2 not found; disabling PDF load via poppler])
with_poppler=no with_poppler=no
] ]
) )
@ -673,17 +673,24 @@ if test x"$with_cfitsio" != "xno"; then
fi fi
# libwebp # libwebp
# some platforms, like ubuntu 12.04, are missing the .pc files for libwebp, so
# we fall back to FIND_LIBWEBP
AC_ARG_WITH([libwebp], AC_ARG_WITH([libwebp],
AS_HELP_STRING([--without-libwebp], [build without libwebp (default: test)])) AS_HELP_STRING([--without-libwebp], [build without libwebp (default: test)]))
if test x"$with_libwebp" != "xno"; then if test x"$with_libwebp" != "xno"; then
PKG_CHECK_MODULES(LIBWEBP, libwebp, PKG_CHECK_MODULES(LIBWEBP, libwebp >= 0.1.3,
[AC_DEFINE(HAVE_LIBWEBP,1,[define if you have libwebp installed.]) [AC_DEFINE(HAVE_LIBWEBP,1,[define if you have libwebp installed.])
with_libwebp=yes with_libwebp=yes
PACKAGES_USED="$PACKAGES_USED libwebp"], PACKAGES_USED="$PACKAGES_USED libwebp"],
[AC_MSG_WARN([libwebp not found; disabling libwebp support]) [FIND_LIBWEBP([
with_libwebp=no with_libwebp="yes (found by search)"
]) ], [
AC_MSG_WARN([libwebp not found; disabling WEBP support])
with_libwebp=no
])
]
)
fi fi
# pangoft2 # pangoft2
@ -791,19 +798,13 @@ FIND_JPEG(
]) ])
# JPEG extension parameters available in libjpeg-turbo >=1.5.0, mozjpeg >=3.0 # JPEG extension parameters available in libjpeg-turbo >=1.5.0, mozjpeg >=3.0
if test x"$with_jpeg" = "xyes"; then if test x"$with_jpeg" != "xno"; then
AC_MSG_CHECKING([for JPEG extension parameters]) save_LIBS="$LIBS"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ LIBS="$LIBS $JPEG_LIBS"
#include <stdio.h> AC_CHECK_FUNCS(jpeg_c_bool_param_supported,
#include <jpeglib.h> AC_DEFINE(HAVE_JPEG_EXT_PARAMS,1,
]], [[ [define if your libjpeg has extension parameters.]))
J_BOOLEAN_PARAM test; LIBS="$save_LIBS"
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_JPEG_EXT_PARAMS],1,[libjpeg has extension parameters])
], [
AC_MSG_RESULT([no])
])
fi fi
# libexif # libexif
@ -824,11 +825,11 @@ fi
# how annoying # how annoying
if test x"$with_libexif" != "xno"; then if test x"$with_libexif" != "xno"; then
# cppflags not cflags because we want the preproc to see the -I as well # cppflags not cflags because we want the preproc to see the -I as well
save_CPPFLAGS=$CPPFLAGS save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$EXIF_CFLAGS $CPPFLAGS" CPPFLAGS="$EXIF_CFLAGS $CPPFLAGS"
AC_CHECK_HEADER(exif-data.h, AC_CHECK_HEADER(exif-data.h,
AC_DEFINE(UNTAGGED_EXIF,1,[libexif includes don't need libexif prefix])) AC_DEFINE(UNTAGGED_EXIF,1,[libexif includes don't need libexif prefix]))
CPPFLAGS=$save_CPPFLAGS CPPFLAGS="$save_CPPFLAGS"
fi fi
# make python binding? # make python binding?
@ -967,11 +968,12 @@ file import with OpenSlide: $with_openslide
(requires openslide-3.3.0 or later) (requires openslide-3.3.0 or later)
file import with matio: $with_matio file import with matio: $with_matio
PDF import with poppler-glib: $with_poppler PDF import with poppler-glib: $with_poppler
(requires poppler-glib 0.30.0 or later) (requires poppler-glib 0.16.0 or later)
SVG import with librsvg-2.0: $with_rsvg SVG import with librsvg-2.0: $with_rsvg
(requires librsvg-2.0 2.40.0 or later) (requires librsvg-2.0 2.40.0 or later)
file import with cfitsio: $with_cfitsio file import with cfitsio: $with_cfitsio
file import/export with libwebp: $with_libwebp file import/export with libwebp: $with_libwebp
(requires libwebp-0.1.3 or later)
text rendering with pangoft2: $with_pangoft2 text rendering with pangoft2: $with_pangoft2
file import/export with libpng: $with_png file import/export with libpng: $with_png
(requires libpng-1.2.9 or later) (requires libpng-1.2.9 or later)

View File

@ -475,7 +475,7 @@ vips_hist_find_init( VipsHistFind *hist_find )
* *
* Optional arguments: * Optional arguments:
* *
* @band: band to equalise * * @band: band to equalise
* *
* Find the histogram of @in. Find the histogram for band @band (producing a * Find the histogram of @in. Find the histogram for band @band (producing a
* one-band histogram), or for all bands (producing an n-band histogram) if * one-band histogram), or for all bands (producing an n-band histogram) if

View File

@ -323,7 +323,7 @@ vips_hist_find_ndim_init( VipsHistFindNDim *ndim )
* *
* Optional arguments: * Optional arguments:
* *
* @bins: number of bins to make on each axis * * @bins: number of bins to make on each axis
* *
* Make a one, two or three dimensional histogram of a 1, 2 or * Make a one, two or three dimensional histogram of a 1, 2 or
* 3 band image. Divide each axis into @bins bins .. ie. * 3 band image. Divide each axis into @bins bins .. ie.

View File

@ -275,9 +275,9 @@ vips_hough_circle_init( VipsHoughCircle *hough_circle )
* *
* Optional arguments: * Optional arguments:
* *
* @scale: scale down dimensions by this much * * @scale: scale down dimensions by this much
* @min_radius: smallest radius to search for * * @min_radius: smallest radius to search for
* @max_radius: largest radius to search for * * @max_radius: largest radius to search for
* *
* Find the circular Hough transform of an image. @in must be one band, with * Find the circular Hough transform of an image. @in must be one band, with
* non-zero pixels for image edges. @out is three-band, with the third channel * non-zero pixels for image edges. @out is three-band, with the third channel

View File

@ -169,8 +169,8 @@ vips_hough_line_init( VipsHoughLine *hough_line )
* *
* Optional arguments: * Optional arguments:
* *
* @width: horizontal size of parameter space * * @width: horizontal size of parameter space
* @height: vertical size of parameter space * * @height: vertical size of parameter space
* *
* Find the line Hough transform for @in. @in must have one band. @out has one * Find the line Hough transform for @in. @in must have one band. @out has one
* band, with pixels being the number of votes for that line. The X dimension * band, with pixels being the number of votes for that line. The X dimension

View File

@ -448,7 +448,7 @@ vips_linearv( VipsImage *in, VipsImage **out,
* *
* Optional arguments: * Optional arguments:
* *
* @uchar: output uchar pixels * * @uchar: output uchar pixels
* *
* Pass an image through a linear transform, ie. (@out = @in * @a + @b). Output * Pass an image through a linear transform, ie. (@out = @in * @a + @b). Output
* is float for integer input, double for double input, complex for * is float for integer input, double for double input, complex for
@ -489,7 +489,7 @@ vips_linear( VipsImage *in, VipsImage **out, double *a, double *b, int n, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @uchar: output uchar pixels * * @uchar: output uchar pixels
* *
* Run vips_linear() with a single constant. * Run vips_linear() with a single constant.
* *

View File

@ -486,12 +486,12 @@ vips_max_init( VipsMax *max )
* *
* Optional arguments: * Optional arguments:
* *
* @x: horizontal position of maximum * * @x: horizontal position of maximum
* @y: vertical position of maximum * * @y: vertical position of maximum
* @size: number of maxima to find * * @size: number of maxima to find
* @out_array: return array of maximum values * * @out_array: return array of maximum values
* @x_array: corresponding horizontal positions * * @x_array: corresponding horizontal positions
* @y_array: corresponding vertical positions * * @y_array: corresponding vertical positions
* *
* This operation finds the maximum value in an image. * This operation finds the maximum value in an image.
* *

View File

@ -269,10 +269,10 @@ vips_measure_init( VipsMeasure *measure )
* *
* Optional arguments: * Optional arguments:
* *
* @left: area of image containing chart * * @left: area of image containing chart
* @top: area of image containing chart * * @top: area of image containing chart
* @width: area of image containing chart * * @width: area of image containing chart
* @height: area of image containing chart * * @height: area of image containing chart
* *
* Analyse a grid of colour patches, producing an array of patch averages. * Analyse a grid of colour patches, producing an array of patch averages.
* The mask has a row for each measured patch and a column for each image * The mask has a row for each measured patch and a column for each image

View File

@ -489,12 +489,12 @@ vips_min_init( VipsMin *min )
* *
* Optional arguments: * Optional arguments:
* *
* @x: horizontal position of minimum * * @x: horizontal position of minimum
* @y: vertical position of minimum * * @y: vertical position of minimum
* @size: number of minima to find * * @size: number of minima to find
* @out_array: return array of minimum values * * @out_array: return array of minimum values
* @x_array: corresponding horizontal positions * * @x_array: corresponding horizontal positions
* @y_array: corresponding vertical positions * * @y_array: corresponding vertical positions
* *
* This operation finds the minimum value in an image. * This operation finds the minimum value in an image.
* *

View File

@ -228,7 +228,6 @@ vips_colour_gen( VipsRegion *or,
{ {
VipsRegion **ir = (VipsRegion **) seq; VipsRegion **ir = (VipsRegion **) seq;
VipsColour *colour = VIPS_COLOUR( b ); VipsColour *colour = VIPS_COLOUR( b );
VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS( colour );
VipsColourClass *class = VIPS_COLOUR_GET_CLASS( colour ); VipsColourClass *class = VIPS_COLOUR_GET_CLASS( colour );
VipsRect *r = &or->valid; VipsRect *r = &or->valid;
@ -252,7 +251,7 @@ vips_colour_gen( VipsRegion *or,
VIPS_GATE_STOP( "vips_colour_gen: work" ); VIPS_GATE_STOP( "vips_colour_gen: work" );
VIPS_COUNT_PIXELS( or, object_class->nickname ); VIPS_COUNT_PIXELS( or, VIPS_OBJECT_GET_CLASS( colour )->nickname );
return( 0 ); return( 0 );
} }

View File

@ -625,7 +625,7 @@ vips_colourspace_init( VipsColourspace *colourspace )
* *
* Optional arguments: * Optional arguments:
* *
* @source_space: input colour space * * @source_space: input colour space
* *
* This operation looks at the interpretation field of @in (or uses * This operation looks at the interpretation field of @in (or uses
* @source_space, if set) and runs * @source_space, if set) and runs

View File

@ -1255,10 +1255,10 @@ vips_icc_ac2rc( VipsImage *in, VipsImage **out, const char *profile_filename )
* *
* Optional arguments: * Optional arguments:
* *
* @input_profile: get the input profile from here * * @input_profile: get the input profile from here
* @intent: transform with this intent * * @intent: transform with this intent
* @embedded: use profile embedded in input image * * @embedded: use profile embedded in input image
* @pcs: use XYZ or LAB PCS * * @pcs: use XYZ or LAB PCS
* *
* Import an image from device space to D65 LAB with an ICC profile. If @pcs is * Import an image from device space to D65 LAB with an ICC profile. If @pcs is
* set to #VIPS_PCS_XYZ, use CIE XYZ PCS instead. * set to #VIPS_PCS_XYZ, use CIE XYZ PCS instead.
@ -1294,10 +1294,10 @@ vips_icc_import( VipsImage *in, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @intent: transform with this intent * * @intent: transform with this intent
* @depth: depth of output image in bits * * @depth: depth of output image in bits
* @output_profile: get the output profile from here * * @output_profile: get the output profile from here
* @pcs: use XYZ or LAB PCS * * @pcs: use XYZ or LAB PCS
* *
* Export an image from D65 LAB to device space with an ICC profile. * Export an image from D65 LAB to device space with an ICC profile.
* If @pcs is * If @pcs is
@ -1330,10 +1330,10 @@ vips_icc_export( VipsImage *in, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @input_profile: get the input profile from here * * @input_profile: get the input profile from here
* @intent: transform with this intent * * @intent: transform with this intent
* @depth: depth of output image in bits * * @depth: depth of output image in bits
* @embedded: use profile embedded in input image * * @embedded: use profile embedded in input image
* *
* Transform an image with a pair of ICC profiles. The input image is moved to * Transform an image with a pair of ICC profiles. The input image is moved to
* profile-connection space with the input profile and then to the output * profile-connection space with the input profile and then to the output

View File

@ -268,7 +268,7 @@ vips_scRGB2BW_init( VipsscRGB2BW *scRGB2BW )
* *
* Optional arguments: * Optional arguments:
* *
* @depth: depth of output image in bits * * @depth: depth of output image in bits
* *
* Convert an scRGB image to greyscale. Set @depth to 16 to get 16-bit output. * Convert an scRGB image to greyscale. Set @depth to 16 to get 16-bit output.
* *

View File

@ -296,7 +296,7 @@ vips_scRGB2sRGB_init( VipsscRGB2sRGB *scRGB2sRGB )
* *
* Optional arguments: * Optional arguments:
* *
* @depth: depth of output image in bits * * @depth: depth of output image in bits
* *
* Convert an scRGB image to sRGB. Set @depth to 16 to get 16-bit output. * Convert an scRGB image to sRGB. Set @depth to 16 to get 16-bit output.
* *

View File

@ -397,13 +397,13 @@ vips_arrayjoinv( VipsImage **in, VipsImage **out, int n, va_list ap )
* *
* Optional arguments: * Optional arguments:
* *
* @across: number of images per row * * @across: number of images per row
* @shim: space between images, in pixels * * @shim: space between images, in pixels
* @background: background ink colour * * @background: background ink colour
* @halign: low, centre or high alignment * * @halign: low, centre or high alignment
* @valign: low, centre or high alignment * * @valign: low, centre or high alignment
* @hspacing: horizontal distance between images * * @hspacing: horizontal distance between images
* @vspacing: vertical distance between images * * @vspacing: vertical distance between images
* *
* Lay out the images in @in in a grid. The grid is @across images across and * Lay out the images in @in in a grid. The grid is @across images across and
* however high is necessary to use up all of @in. Images are set down * however high is necessary to use up all of @in. Images are set down

View File

@ -214,7 +214,7 @@ vips_autorot_init( VipsAutorot *autorot )
* *
* Optional arguments: * Optional arguments:
* *
* @angle: output #VipsAngle the image was rotated by * * @angle: output #VipsAngle the image was rotated by
* *
* Look at the exif tags and rotate the image to make it upright. The * Look at the exif tags and rotate the image to make it upright. The
* orientation tag is removed from @out to prevent accidental double rotation. * orientation tag is removed from @out to prevent accidental double rotation.

View File

@ -186,7 +186,7 @@ vips_bandfold_init( VipsBandfold *bandfold )
* *
* Optional arguments: * Optional arguments:
* *
* @factor: fold by this factor * * @factor: fold by this factor
* *
* Fold up an image horizontally: width is collapsed into bands. * Fold up an image horizontally: width is collapsed into bands.
* Use @factor to set how much to fold by: @factor 3, for example, will make * Use @factor to set how much to fold by: @factor 3, for example, will make

View File

@ -286,7 +286,7 @@ vips_bandrankv( VipsImage **in, VipsImage **out, int n, va_list ap )
* *
* Optional arguments: * Optional arguments:
* *
* @index: pick this index from list of sorted values * * @index: pick this index from list of sorted values
* *
* Sorts the images @in band-element-wise, then outputs an * Sorts the images @in band-element-wise, then outputs an
* image in which each band element is selected from the sorted list by the * image in which each band element is selected from the sorted list by the

View File

@ -189,7 +189,7 @@ vips_bandunfold_init( VipsBandunfold *bandunfold )
* *
* Optional arguments: * Optional arguments:
* *
* @factor: unfold by this factor * * @factor: unfold by this factor
* *
* Unfold image bands into x axis. * Unfold image bands into x axis.
* Use @factor to set how much to unfold by: @factor 3, for example, will make * Use @factor to set how much to unfold by: @factor 3, for example, will make

View File

@ -144,9 +144,9 @@ vips_cache_init( VipsCache *cache )
* *
* Optional arguments: * Optional arguments:
* *
* @tile_width: width of tiles in cache * * @tile_width: width of tiles in cache
* @tile_height: height of tiles in cache * * @tile_height: height of tiles in cache
* @max_tiles: maximum number of tiles to cache * * @max_tiles: maximum number of tiles to cache
* *
* This operation behaves rather like vips_copy() between images * This operation behaves rather like vips_copy() between images
* @in and @out, except that it keeps a cache of computed pixels. * @in and @out, except that it keeps a cache of computed pixels.

View File

@ -587,7 +587,7 @@ vips_castv( VipsImage *in, VipsImage **out, VipsBandFormat format, va_list ap )
* *
* Optional arguments: * Optional arguments:
* *
* @shift: integer values are shifted * * @shift: integer values are shifted
* *
* Convert @in to @format. You can convert between any pair of formats. * Convert @in to @format. You can convert between any pair of formats.
* Floats are truncated (not rounded). Out of range values are clipped. * Floats are truncated (not rounded). Out of range values are clipped.

View File

@ -366,16 +366,16 @@ vips_copy_init( VipsCopy *copy )
* *
* Optional arguments: * Optional arguments:
* *
* @width: set image width * * @width: set image width
* @height: set image height * * @height: set image height
* @bands: set image bands * * @bands: set image bands
* @format: set image format * * @format: set image format
* @coding: set image coding * * @coding: set image coding
* @interpretation: set image interpretation * * @interpretation: set image interpretation
* @xres: set image xres * * @xres: set image xres
* @yres: set image yres * * @yres: set image yres
* @xoffset: set image xoffset * * @xoffset: set image xoffset
* @yoffset: set image yoffset * * @yoffset: set image yoffset
* *
* Copy an image, optionally modifying the header. VIPS copies images by * Copy an image, optionally modifying the header. VIPS copies images by
* copying pointers, so this operation is instant, even for very large images. * copying pointers, so this operation is instant, even for very large images.

View File

@ -627,8 +627,8 @@ vips_embed_init( VipsEmbed *embed )
* *
* Optional arguments: * Optional arguments:
* *
* @extend: #VipsExtend to generate the edge pixels (default: black) * * @extend: #VipsExtend to generate the edge pixels (default: black)
* @background: #VipsArrayDouble colour for edge pixels * * @background: #VipsArrayDouble colour for edge pixels
* *
* The opposite of vips_extract_area(): embed @in within an image of size * The opposite of vips_extract_area(): embed @in within an image of size
* @width by @height at position @x, @y. * @width by @height at position @x, @y.

View File

@ -455,7 +455,7 @@ vips_extract_band_init( VipsExtractBand *extract )
* *
* Optional arguments: * Optional arguments:
* *
* @n: number of bands to extract * * @n: number of bands to extract
* *
* Extract a band or bands from an image. Extracting out of range is an error. * Extract a band or bands from an image. Extracting out of range is an error.
* *

View File

@ -409,8 +409,8 @@ vips_flatten_init( VipsFlatten *flatten )
* *
* Optional arguments: * Optional arguments:
* *
* @background: #VipsArrayDouble colour for new pixels * * @background: #VipsArrayDouble colour for new pixels
* @max_alpha: %gdouble, maximum value for alpha * * @max_alpha: %gdouble, maximum value for alpha
* *
* Take the last band of @in as an alpha and use it to blend the * Take the last band of @in as an alpha and use it to blend the
* remaining channels with @background. * remaining channels with @background.

View File

@ -168,7 +168,7 @@ vips_gamma_init( VipsGamma *gamma )
* *
* Optional arguments: * Optional arguments:
* *
* @exponent: gamma, default 1.0 / 2.4 * * @exponent: gamma, default 1.0 / 2.4
* *
* Calculate @in ** (1 / @exponent), normalising to the maximum range of the * Calculate @in ** (1 / @exponent), normalising to the maximum range of the
* input type. For float types use 1.0 as the maximum. * input type. For float types use 1.0 as the maximum.

View File

@ -517,7 +517,7 @@ vips_ifthenelse_init( VipsIfthenelse *ifthenelse )
* *
* Optional arguments: * Optional arguments:
* *
* @blend: blend smoothly between @in1 and @in2 * * @blend: blend smoothly between @in1 and @in2
* *
* This operation scans the condition image @cond * This operation scans the condition image @cond
* and uses it to select pixels from either the then image @in1 or the else * and uses it to select pixels from either the then image @in1 or the else

View File

@ -573,8 +573,8 @@ vips_insert_init( VipsInsert *insert )
* *
* Optional arguments: * Optional arguments:
* *
* @expand: expand output to hold whole of both images * * @expand: expand output to hold whole of both images
* @background: colour for new pixels * * @background: colour for new pixels
* *
* Insert @sub into @main at position @x, @y. * Insert @sub into @main at position @x, @y.
* *

View File

@ -296,10 +296,10 @@ vips_join_init( VipsJoin *join )
* *
* Optional arguments: * Optional arguments:
* *
* @expand: %TRUE to expand the output image to hold all of the input pixels * * @expand: %TRUE to expand the output image to hold all of the input pixels
* @shim: space between images, in pixels * * @shim: space between images, in pixels
* @background: background ink colour * * @background: background ink colour
* @align: low, centre or high alignment * * @align: low, centre or high alignment
* *
* Join @in1 and @in2 together, left-right or up-down depending on the value * Join @in1 and @in2 together, left-right or up-down depending on the value
* of @direction. * of @direction.

View File

@ -269,7 +269,7 @@ vips_msb_init( VipsMsb *msb )
* *
* Optional arguments: * Optional arguments:
* *
* @band: msb just this band * * @band: msb just this band
* *
* Turn any integer image to 8-bit unsigned char by discarding all but the most * Turn any integer image to 8-bit unsigned char by discarding all but the most
* significant byte. Signed values are converted to unsigned by adding 128. * significant byte. Signed values are converted to unsigned by adding 128.

View File

@ -273,7 +273,7 @@ vips_premultiply_init( VipsPremultiply *premultiply )
* *
* Optional arguments: * Optional arguments:
* *
* @max_alpha: %gdouble, maximum value for alpha * * @max_alpha: %gdouble, maximum value for alpha
* *
* Premultiplies any alpha channel. * Premultiplies any alpha channel.
* The final band is taken to be the alpha * The final band is taken to be the alpha

View File

@ -291,7 +291,7 @@ vips_rot45_init( VipsRot45 *rot45 )
* *
* Optional arguments: * Optional arguments:
* *
* @angle: rotation angle * * @angle: rotation angle
* *
* Rotate @in by a multiple of 45 degrees. Odd-length sides and square images * Rotate @in by a multiple of 45 degrees. Odd-length sides and square images
* only. * only.

View File

@ -183,8 +183,8 @@ vips_scale_init( VipsScale *scale )
* *
* Optional arguments: * Optional arguments:
* *
* @log: log scale pixels * * @log: log scale pixels
* @exp: exponent for log scale * * @exp: exponent for log scale
* *
* Search the image for the maximum and minimum value, then return the image * Search the image for the maximum and minimum value, then return the image
* as unsigned 8-bit, scaled so that the maximum value is 255 and the * as unsigned 8-bit, scaled so that the maximum value is 255 and the

View File

@ -364,9 +364,9 @@ vips_sequential_init( VipsSequential *sequential )
* *
* Optional arguments: * Optional arguments:
* *
* @trace: trace requests * * @trace: trace requests
* @strip_height: height of cache strips * * @strip_height: height of cache strips
* @access: access pattern * * @access: access pattern
* *
* This operation behaves rather like vips_copy() between images * This operation behaves rather like vips_copy() between images
* @in and @out, except that it checks that pixels are only requested * @in and @out, except that it checks that pixels are only requested

View File

@ -314,7 +314,7 @@ vips_subsample_init( VipsSubsample *subsample )
* *
* Optional arguments: * Optional arguments:
* *
* @point: turn on point sample mode * * @point: turn on point sample mode
* *
* Subsample an image by an integer fraction. This is fast, nearest-neighbour * Subsample an image by an integer fraction. This is fast, nearest-neighbour
* shrink. * shrink.

View File

@ -824,12 +824,12 @@ vips_tile_cache_init( VipsTileCache *cache )
* *
* Optional arguments: * Optional arguments:
* *
* @tile_width: width of tiles in cache * * @tile_width: width of tiles in cache
* @tile_height: height of tiles in cache * * @tile_height: height of tiles in cache
* @max_tiles: maximum number of tiles to cache * * @max_tiles: maximum number of tiles to cache
* @access: hint expected access pattern #VipsAccess * * @access: hint expected access pattern #VipsAccess
* @threaded: allow many threads * * @threaded: allow many threads
* @persistent: don't drop cache at end of computation * * @persistent: don't drop cache at end of computation
* *
* This operation behaves rather like vips_copy() between images * This operation behaves rather like vips_copy() between images
* @in and @out, except that it keeps a cache of computed pixels. * @in and @out, except that it keeps a cache of computed pixels.
@ -1018,9 +1018,9 @@ vips_line_cache_init( VipsLineCache *cache )
* *
* Optional arguments: * Optional arguments:
* *
* @access: hint expected access pattern #VipsAccess * * @access: hint expected access pattern #VipsAccess
* @tile_height: height of tiles in cache * * @tile_height: height of tiles in cache
* @threaded: allow many threads * * @threaded: allow many threads
* *
* This operation behaves rather like vips_copy() between images * This operation behaves rather like vips_copy() between images
* @in and @out, except that it keeps a cache of computed scanlines. * @in and @out, except that it keeps a cache of computed scanlines.

View File

@ -283,7 +283,7 @@ vips_unpremultiply_init( VipsUnpremultiply *unpremultiply )
* *
* Optional arguments: * Optional arguments:
* *
* @max_alpha: %gdouble, maximum value for alpha * * @max_alpha: %gdouble, maximum value for alpha
* *
* Unpremultiplies any alpha channel. * Unpremultiplies any alpha channel.
* The final band is taken to be the alpha * The final band is taken to be the alpha

View File

@ -150,8 +150,8 @@ vips_wrap_init( VipsWrap *wrap )
* *
* Optional arguments: * Optional arguments:
* *
* @x: horizontal displacement * * @x: horizontal displacement
* @y: vertical displacement * * @y: vertical displacement
* *
* Slice an image up and move the segments about so that the pixel that was * Slice an image up and move the segments about so that the pixel that was
* at 0, 0 is now at @x, @y. If @x and @y are not set, they default to the * at 0, 0 is now at @x, @y. If @x and @y are not set, they default to the

View File

@ -175,9 +175,9 @@ vips_conv_init( VipsConv *conv )
* *
* Optional arguments: * Optional arguments:
* *
* @precision: calculation accuracy * * @precision: calculation accuracy
* @layers: number of layers for approximation * * @layers: number of layers for approximation
* @cluster: cluster lines closer than this distance * * @cluster: cluster lines closer than this distance
* *
* Convolution. * Convolution.
* *

View File

@ -143,9 +143,9 @@ vips_convsep_init( VipsConvsep *convsep )
* *
* Optional arguments: * Optional arguments:
* *
* @precision: calculation accuracy * * @precision: calculation accuracy
* @layers: number of layers for approximation * * @layers: number of layers for approximation
* @cluster: cluster lines closer than this distance * * @cluster: cluster lines closer than this distance
* *
* Perform a separable convolution of @in with @mask. * Perform a separable convolution of @in with @mask.
* See vips_conv() for a detailed description. * See vips_conv() for a detailed description.

View File

@ -168,8 +168,8 @@ vips_gaussblur_init( VipsGaussblur *gaussblur )
* *
* Optional arguments: * Optional arguments:
* *
* @precision: #VipsPrecision for blur, default VIPS_PRECISION_INTEGER * * @precision: #VipsPrecision for blur, default VIPS_PRECISION_INTEGER
* @min_ampl: minimum amplitude, default 0.2 * * @min_ampl: minimum amplitude, default 0.2
* *
* This operator runs vips_gaussmat() and vips_convsep() for you on an image. * This operator runs vips_gaussmat() and vips_convsep() for you on an image.
* Set @min_ampl smaller to generate a larger, more accurate mask. Set @sigma * Set @min_ampl smaller to generate a larger, more accurate mask. Set @sigma

View File

@ -394,12 +394,12 @@ vips_sharpen_init( VipsSharpen *sharpen )
* *
* Optional arguments: * Optional arguments:
* *
* @sigma: sigma of gaussian * * @sigma: sigma of gaussian
* @x1: flat/jaggy threshold * * @x1: flat/jaggy threshold
* @y2: maximum amount of brightening * * @y2: maximum amount of brightening
* @y3: maximum amount of darkening * * @y3: maximum amount of darkening
* @m1: slope for flat areas * * @m1: slope for flat areas
* @m2: slope for jaggy areas * * @m2: slope for jaggy areas
* *
* Selectively sharpen the L channel of a LAB image. The input image is * Selectively sharpen the L channel of a LAB image. The input image is
* transformed to #VIPS_INTERPRETATION_LABS. * transformed to #VIPS_INTERPRETATION_LABS.

View File

@ -162,7 +162,7 @@ vips_black_init( VipsBlack *black )
* *
* Optional arguments: * Optional arguments:
* *
* @bands: output bands * * @bands: output bands
* *
* Make a black unsigned char image of a specified size. * Make a black unsigned char image of a specified size.
* *

View File

@ -123,8 +123,8 @@ vips_eye_init( VipsEye *eye )
* *
* Optional arguments: * Optional arguments:
* *
* @factor: maximum spatial frequency * * @factor: maximum spatial frequency
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Create a test pattern with increasing spatial frequence in X and * Create a test pattern with increasing spatial frequence in X and
* amplitude in Y. @factor should be between 0 and 1 and determines the * amplitude in Y. @factor should be between 0 and 1 and determines the

View File

@ -234,8 +234,8 @@ vips_gaussmat_init( VipsGaussmat *gaussmat )
* *
* Optional arguments: * Optional arguments:
* *
* @separable: generate a separable gaussian * * @separable: generate a separable gaussian
* @precision: #VipsPrecision for @out * * @precision: #VipsPrecision for @out
* *
* Creates a circularly symmetric Gaussian image of radius * Creates a circularly symmetric Gaussian image of radius
* @sigma. The size of the mask is determined by the variable @min_ampl; * @sigma. The size of the mask is determined by the variable @min_ampl;

View File

@ -195,8 +195,8 @@ vips_gaussnoise_init( VipsGaussnoise *gaussnoise )
* *
* Optional arguments: * Optional arguments:
* *
* @mean: mean of generated pixels * * @mean: mean of generated pixels
* @sigma: standard deviation of generated pixels * * @sigma: standard deviation of generated pixels
* *
* Make a one band float image of gaussian noise with the specified * Make a one band float image of gaussian noise with the specified
* distribution. The noise distribution is created by averaging 12 random * distribution. The noise distribution is created by averaging 12 random

View File

@ -107,7 +107,7 @@ vips_grey_init( VipsGrey *grey )
* *
* Optional arguments: * Optional arguments:
* *
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Create a one-band float image with the left-most column zero and the * Create a one-band float image with the left-most column zero and the
* right-most 1. Intermediate pixels are a linear ramp. * right-most 1. Intermediate pixels are a linear ramp.

View File

@ -178,9 +178,9 @@ vips_identity_init( VipsIdentity *identity )
* *
* Optional arguments: * Optional arguments:
* *
* @bands: number of bands to create * * @bands: number of bands to create
* @ushort: %TRUE for an unsigned short identity * * @ushort: %TRUE for an unsigned short identity
* @size: number of LUT elements for a ushort image * * @size: number of LUT elements for a ushort image
* *
* Creates an identity lookup table, ie. one which will leave an image * Creates an identity lookup table, ie. one which will leave an image
* unchanged when applied with vips_maplut(). Each entry in the table has a * unchanged when applied with vips_maplut(). Each entry in the table has a

View File

@ -314,7 +314,7 @@ vips_invertlut_init( VipsInvertlut *lut )
* *
* Optional arguments: * Optional arguments:
* *
* @size: generate this much * * @size: generate this much
* *
* Given a mask of target values and real values, generate a LUT which * Given a mask of target values and real values, generate a LUT which
* will map reals to targets. Handy for linearising images from * will map reals to targets. Handy for linearising images from

View File

@ -251,8 +251,8 @@ vips_logmat_init( VipsLogmat *logmat )
* *
* Optional arguments: * Optional arguments:
* *
* @separable: generate a separable mask * * @separable: generate a separable mask
* @precision: #VipsPrecision for @out * * @precision: #VipsPrecision for @out
* *
* Creates a circularly symmetric Laplacian of Gaussian mask * Creates a circularly symmetric Laplacian of Gaussian mask
* of radius * of radius

View File

@ -127,10 +127,10 @@ vips_mask_butterworth_init( VipsMaskButterworth *butterworth )
* *
* Optional arguments: * Optional arguments:
* *
* @nodc: don't set the DC pixel * * @nodc: don't set the DC pixel
* @reject: invert the filter sense * * @reject: invert the filter sense
* @optical: coordinates in optical space * * @optical: coordinates in optical space
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Make an butterworth high- or low-pass filter, that is, one with a variable, * Make an butterworth high- or low-pass filter, that is, one with a variable,
* smooth transition * smooth transition

View File

@ -171,10 +171,10 @@ vips_mask_butterworth_band_init(
* *
* Optional arguments: * Optional arguments:
* *
* @nodc: don't set the DC pixel * * @nodc: don't set the DC pixel
* @reject: invert the filter sense * * @reject: invert the filter sense
* @optical: coordinates in optical space * * @optical: coordinates in optical space
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Make an butterworth band-pass or band-reject filter, that is, one with a * Make an butterworth band-pass or band-reject filter, that is, one with a
* variable, smooth transition positioned at @frequency_cutoff_x, * variable, smooth transition positioned at @frequency_cutoff_x,

View File

@ -131,10 +131,10 @@ vips_mask_butterworth_ring_init(
* *
* Optional arguments: * Optional arguments:
* *
* @nodc: don't set the DC pixel * * @nodc: don't set the DC pixel
* @reject: invert the filter sense * * @reject: invert the filter sense
* @optical: coordinates in optical space * * @optical: coordinates in optical space
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Make a butterworth ring-pass or ring-reject filter, that is, one with a * Make a butterworth ring-pass or ring-reject filter, that is, one with a
* variable, * variable,

View File

@ -114,10 +114,10 @@ vips_mask_fractal_init( VipsMaskFractal *fractal )
* *
* Optional arguments: * Optional arguments:
* *
* @nodc: don't set the DC pixel * * @nodc: don't set the DC pixel
* @reject: invert the filter sense * * @reject: invert the filter sense
* @optical: coordinates in optical space * * @optical: coordinates in optical space
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* This operation should be used to create fractal images by filtering the * This operation should be used to create fractal images by filtering the
* power spectrum of Gaussian white noise. See vips_gaussnoise(). * power spectrum of Gaussian white noise. See vips_gaussnoise().

View File

@ -116,10 +116,10 @@ vips_mask_gaussian_init( VipsMaskGaussian *gaussian )
* *
* Optional arguments: * Optional arguments:
* *
* @nodc: don't set the DC pixel * * @nodc: don't set the DC pixel
* @reject: invert the filter sense * * @reject: invert the filter sense
* @optical: coordinates in optical space * * @optical: coordinates in optical space
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Make a gaussian high- or low-pass filter, that is, one with a variable, * Make a gaussian high- or low-pass filter, that is, one with a variable,
* smooth transition positioned at @frequency_cutoff. * smooth transition positioned at @frequency_cutoff.

View File

@ -155,10 +155,10 @@ vips_mask_gaussian_band_init( VipsMaskGaussianBand *gaussian_band )
* *
* Optional arguments: * Optional arguments:
* *
* @nodc: don't set the DC pixel * * @nodc: don't set the DC pixel
* @reject: invert the filter sense * * @reject: invert the filter sense
* @optical: coordinates in optical space * * @optical: coordinates in optical space
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Make a gaussian band-pass or band-reject filter, that is, one with a * Make a gaussian band-pass or band-reject filter, that is, one with a
* variable, smooth transition positioned at @frequency_cutoff_x, * variable, smooth transition positioned at @frequency_cutoff_x,

View File

@ -124,10 +124,10 @@ vips_mask_gaussian_ring_init( VipsMaskGaussianRing *gaussian_ring )
* *
* Optional arguments: * Optional arguments:
* *
* @nodc: don't set the DC pixel * * @nodc: don't set the DC pixel
* @reject: invert the filter sense * * @reject: invert the filter sense
* @optical: coordinates in optical space * * @optical: coordinates in optical space
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Make a gaussian ring-pass or ring-reject filter, that is, one with a * Make a gaussian ring-pass or ring-reject filter, that is, one with a
* variable, smooth transition positioned at @frequency_cutoff of width * variable, smooth transition positioned at @frequency_cutoff of width

View File

@ -105,10 +105,10 @@ vips_mask_ideal_init( VipsMaskIdeal *ideal )
* *
* Optional arguments: * Optional arguments:
* *
* @nodc: don't set the DC pixel * * @nodc: don't set the DC pixel
* @reject: invert the filter sense * * @reject: invert the filter sense
* @optical: coordinates in optical space * * @optical: coordinates in optical space
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Make an ideal high- or low-pass filter, that is, one with a sharp cutoff * Make an ideal high- or low-pass filter, that is, one with a sharp cutoff
* positioned at @frequency_cutoff, where @frequency_cutoff is in * positioned at @frequency_cutoff, where @frequency_cutoff is in

View File

@ -137,10 +137,10 @@ vips_mask_ideal_band_init( VipsMaskIdealBand *ideal_band )
* *
* Optional arguments: * Optional arguments:
* *
* @nodc: don't set the DC pixel * * @nodc: don't set the DC pixel
* @reject: invert the filter sense * * @reject: invert the filter sense
* @optical: coordinates in optical space * * @optical: coordinates in optical space
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Make an ideal band-pass or band-reject filter, that is, one with a * Make an ideal band-pass or band-reject filter, that is, one with a
* sharp cutoff around the point @frequency_cutoff_x, @frequency_cutoff_y, * sharp cutoff around the point @frequency_cutoff_x, @frequency_cutoff_y,

View File

@ -120,10 +120,10 @@ vips_mask_ideal_ring_init( VipsMaskIdealRing *ideal_ring )
* *
* Optional arguments: * Optional arguments:
* *
* @nodc: don't set the DC pixel * * @nodc: don't set the DC pixel
* @reject: invert the filter sense * * @reject: invert the filter sense
* @optical: coordinates in optical space * * @optical: coordinates in optical space
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Make an ideal ring-pass or ring-reject filter, that is, one with a sharp * Make an ideal ring-pass or ring-reject filter, that is, one with a sharp
* ring positioned at @frequency_cutoff of width @width, where * ring positioned at @frequency_cutoff of width @width, where

View File

@ -154,9 +154,9 @@ vips_sines_init( VipsSines *sines )
* *
* Optional arguments: * Optional arguments:
* *
* @hfreq: horizontal frequency * * @hfreq: horizontal frequency
* @vreq: vertical frequency * * @vreq: vertical frequency
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Creates a float one band image of the a sine waveform in two * Creates a float one band image of the a sine waveform in two
* dimensions. * dimensions.

View File

@ -341,11 +341,11 @@ vips_text_init( VipsText *text )
* *
* Optional arguments: * Optional arguments:
* *
* @font: font to render with * * @font: font to render with
* @width: render within this many pixels across * * @width: render within this many pixels across
* @alignment: left/centre/right alignment * * @alignment: left/centre/right alignment
* @dpi: render at this resolution * * @dpi: render at this resolution
* @spacing: space lines by this in points * * @spacing: space lines by this in points
* *
* Draw the string @text to an image. @out is a one-band 8-bit * Draw the string @text to an image. @out is a one-band 8-bit
* unsigned char image, with 0 for no text and 255 for text. Values inbetween * unsigned char image, with 0 for no text and 255 for text. Values inbetween

View File

@ -315,16 +315,16 @@ vips_tonelut_init( VipsTonelut *lut )
* *
* Optional arguments: * Optional arguments:
* *
* @in_max: input range * * @in_max: input range
* @out_max: output range * * @out_max: output range
* @Lb: black-point [0-100] * * @Lb: black-point [0-100]
* @Lw: white-point [0-100] * * @Lw: white-point [0-100]
* @Ps: shadow point (eg. 0.2) * * @Ps: shadow point (eg. 0.2)
* @Pm: mid-tone point (eg. 0.5) * * @Pm: mid-tone point (eg. 0.5)
* @Ph: highlight point (eg. 0.8) * * @Ph: highlight point (eg. 0.8)
* @S: shadow adjustment (+/- 30) * * @S: shadow adjustment (+/- 30)
* @M: mid-tone adjustment (+/- 30) * * @M: mid-tone adjustment (+/- 30)
* @H: highlight adjustment (+/- 30) * * @H: highlight adjustment (+/- 30)
* *
* vips_tonelut() generates a tone curve for the adjustment of image * vips_tonelut() generates a tone curve for the adjustment of image
* levels. It is mostly designed for adjusting the L* part of a LAB image in * levels. It is mostly designed for adjusting the L* part of a LAB image in

View File

@ -246,9 +246,9 @@ vips_xyz_init( VipsXyz *xyz )
* *
* Optional arguments: * Optional arguments:
* *
* @csize: size for third dimension * * @csize: size for third dimension
* @dsize: size for fourth dimension * * @dsize: size for fourth dimension
* @esize: size for fifth dimension * * @esize: size for fifth dimension
* *
* Create a two-band uint32 image where the elements in the first band have the * Create a two-band uint32 image where the elements in the first band have the
* value of their x coordinate and elements in the second band have their y * value of their x coordinate and elements in the second band have their y

View File

@ -106,7 +106,7 @@ vips_zone_init( VipsZone *zone )
* *
* Optional arguments: * Optional arguments:
* *
* @uchar: output a uchar image * * @uchar: output a uchar image
* *
* Create a one-band image of a zone plate. * Create a one-band image of a zone plate.
* *

View File

@ -294,7 +294,7 @@ vips_draw_circlev( VipsImage *image,
* *
* Optional arguments: * Optional arguments:
* *
* @fill: fill the draw_circle * * @fill: fill the draw_circle
* *
* Draws a circle on @image. If @fill is %TRUE then the circle is filled, * Draws a circle on @image. If @fill is %TRUE then the circle is filled,
* otherwise a 1-pixel-wide perimeter is drawn. * otherwise a 1-pixel-wide perimeter is drawn.
@ -330,7 +330,7 @@ vips_draw_circle( VipsImage *image,
* *
* Optional arguments: * Optional arguments:
* *
* @fill: fill the draw_circle * * @fill: fill the draw_circle
* *
* As vips_draw_circle(), but just takes a single double for @ink. * As vips_draw_circle(), but just takes a single double for @ink.
* *

View File

@ -685,12 +685,12 @@ vips_draw_floodv( VipsImage *image,
* *
* Optional arguments: * Optional arguments:
* *
* @test: test this image * * @test: test this image
* @equal: fill while equal to edge * * @equal: fill while equal to edge
* @left: output left edge of bounding box of modified area * * @left: output left edge of bounding box of modified area
* @top: output top edge of bounding box of modified area * * @top: output top edge of bounding box of modified area
* @width: output width of bounding box of modified area * * @width: output width of bounding box of modified area
* @height: output height of bounding box of modified area * * @height: output height of bounding box of modified area
* *
* Flood-fill @image with @ink, starting at position @x, @y. The filled area is * Flood-fill @image with @ink, starting at position @x, @y. The filled area is
* bounded by pixels that are equal to the ink colour, in other words, it * bounded by pixels that are equal to the ink colour, in other words, it
@ -736,12 +736,12 @@ vips_draw_flood( VipsImage *image,
* *
* Optional arguments: * Optional arguments:
* *
* @test: test this image * * @test: test this image
* @equal: fill while equal to edge * * @equal: fill while equal to edge
* @left: output left edge of bounding box of modified area * * @left: output left edge of bounding box of modified area
* @top: output top edge of bounding box of modified area * * @top: output top edge of bounding box of modified area
* @width: output width of bounding box of modified area * * @width: output width of bounding box of modified area
* @height: output height of bounding box of modified area * * @height: output height of bounding box of modified area
* *
* As vips_draw_flood(), but just takes a single double for @ink. * As vips_draw_flood(), but just takes a single double for @ink.
* *

View File

@ -300,7 +300,7 @@ vips_draw_image_init( VipsDrawImage *draw_image )
* *
* Optional arguments: * Optional arguments:
* *
* @mode: how to combine pixels * * @mode: how to combine pixels
* *
* Draw @sub on top of @image at position @x, @y. The two images must have the * Draw @sub on top of @image at position @x, @y. The two images must have the
* same Coding. If @sub has 1 band, the bands will be duplicated to match the * same Coding. If @sub has 1 band, the bands will be duplicated to match the

View File

@ -240,7 +240,7 @@ vips_draw_rectv( VipsImage *image,
* *
* Optional arguments: * Optional arguments:
* *
* @fill: fill the rect * * @fill: fill the rect
* *
* Paint pixels within @left, @top, @width, @height in @image with @ink. If * Paint pixels within @left, @top, @width, @height in @image with @ink. If
* @fill is zero, just paint a 1-pixel-wide outline. * @fill is zero, just paint a 1-pixel-wide outline.
@ -276,7 +276,7 @@ vips_draw_rect( VipsImage *image,
* *
* Optional arguments: * Optional arguments:
* *
* @fill: fill the rect * * @fill: fill the rect
* *
* As vips_draw_rect(), but just take a single double for @ink. * As vips_draw_rect(), but just take a single double for @ink.
* *

View File

@ -2,6 +2,7 @@ noinst_LTLIBRARIES = libforeign.la
libforeign_la_SOURCES = \ libforeign_la_SOURCES = \
gifload.c \ gifload.c \
cairo.c \
pdfload.c \ pdfload.c \
svgload.c \ svgload.c \
radiance.h \ radiance.h \

66
libvips/foreign/cairo.c Normal file
View File

@ -0,0 +1,66 @@
/* Shared code for cairo based loaders like svgload and pdfload.
*/
/*
This file is part of VIPS.
VIPS is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
*/
/*
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /*HAVE_CONFIG_H*/
#include <vips/vips.h>
#include <vips/internal.h>
/* Convert from ARGB to RGBA and undo premultiplication.
*
* See also openslide's argb2rgba().
*/
void
vips__cairo2rgba( guint32 * restrict buf, int n )
{
int i;
for( i = 0; i < n; i++ ) {
guint32 * restrict p = buf + i;
guint32 x = *p;
guint8 a = x >> 24;
VipsPel * restrict out = (VipsPel *) p;
if( a == 255 )
*p = GUINT32_TO_BE( (x << 8) | 255 );
else if( a == 0 )
*p = GUINT32_TO_BE( x << 8 );
else {
/* Undo premultiplication.
*/
out[0] = 255 * ((x >> 16) & 255) / a;
out[1] = 255 * ((x >> 8) & 255) / a;
out[2] = 255 * (x & 255) / a;
out[3] = a;
}
}
}

View File

@ -187,10 +187,10 @@ vips_foreign_load_csv_init( VipsForeignLoadCsv *csv )
* *
* Optional arguments: * Optional arguments:
* *
* @skip: skip this many lines at start of file * * @skip: skip this many lines at start of file
* @lines: read this many lines from file * * @lines: read this many lines from file
* @whitespace: set of whitespace characters * * @whitespace: set of whitespace characters
* @separator: set of separator characters * * @separator: set of separator characters
* *
* Load a CSV (comma-separated values) file. The output image is always 1 * Load a CSV (comma-separated values) file. The output image is always 1
* band (monochrome), #VIPS_FORMAT_DOUBLE. Use vips_bandfold() to turn * band (monochrome), #VIPS_FORMAT_DOUBLE. Use vips_bandfold() to turn

View File

@ -128,7 +128,7 @@ vips_foreign_save_csv_init( VipsForeignSaveCsv *csv )
* *
* Optional arguments: * Optional arguments:
* *
* @separator: separator string * * @separator: separator string
* *
* Writes the pixels in @in to the @filename as CSV (comma-separated values). * Writes the pixels in @in to the @filename as CSV (comma-separated values).
* The image is written * The image is written

View File

@ -2128,16 +2128,16 @@ vips_foreign_save_dz_init( VipsForeignSaveDz *dz )
* *
* Optional arguments: * Optional arguments:
* *
* @layout; directory layout convention * * @layout; directory layout convention
* @suffix: suffix for tile tiles * * @suffix: suffix for tile tiles
* @overlap; set tile overlap * * @overlap; set tile overlap
* @tile_size; set tile size * * @tile_size; set tile size
* @background: background colour * * @background: background colour
* @depth: how deep to make the pyramid * * @depth: how deep to make the pyramid
* @centre: centre the tiles * * @centre: centre the tiles
* @angle: rotate the image by this much * * @angle: rotate the image by this much
* @container: set container type * * @container: set container type
* @properties: write a properties file * * @properties: write a properties file
* *
* Save an image as a set of tiles at various resolutions. By default dzsave * Save an image as a set of tiles at various resolutions. By default dzsave
* uses DeepZoom layout -- use @layout to pick other conventions. * uses DeepZoom layout -- use @layout to pick other conventions.

View File

@ -1823,8 +1823,8 @@ vips_vipssave( VipsImage *in, const char *filename, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @all_frames: %gboolean, load all frames in sequence * * @all_frames: %gboolean, load all frames in sequence
* @density: string, canvas resolution for rendering vector formats like SVG * * @density: string, canvas resolution for rendering vector formats like SVG
* *
* Read in an image using libMagick, the ImageMagick library. This library can * Read in an image using libMagick, the ImageMagick library. This library can
* read more than 80 file formats, including SVG, BMP, EPS, DICOM and many * read more than 80 file formats, including SVG, BMP, EPS, DICOM and many
@ -1870,8 +1870,8 @@ vips_magickload( const char *filename, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @all_frames: %gboolean, load all frames in sequence * * @all_frames: %gboolean, load all frames in sequence
* @density: string, canvas resolution for rendering vector formats like SVG * * @density: string, canvas resolution for rendering vector formats like SVG
* *
* Read an image memory block using libMagick into a VIPS image. Exactly as * Read an image memory block using libMagick into a VIPS image. Exactly as
* vips_magickload(), but read from a memory source. * vips_magickload(), but read from a memory source.
@ -1911,7 +1911,7 @@ vips_magickload_buffer( void *buf, size_t len, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @page: int, load this page * * @page: int, load this page
* *
* Read a TIFF file into a VIPS image. It is a full baseline TIFF 6 reader, * Read a TIFF file into a VIPS image. It is a full baseline TIFF 6 reader,
* with extensions for tiled images, multipage images, LAB colour space, * with extensions for tiled images, multipage images, LAB colour space,
@ -1949,7 +1949,7 @@ vips_tiffload( const char *filename, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @page: %gint, load this page * * @page: %gint, load this page
* *
* Read a TIFF-formatted memory block into a VIPS image. Exactly as * Read a TIFF-formatted memory block into a VIPS image. Exactly as
* vips_tiffload(), but read from a memory source. * vips_tiffload(), but read from a memory source.
@ -1989,20 +1989,20 @@ vips_tiffload_buffer( void *buf, size_t len, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @compression: use this #VipsForeignTiffCompression * * @compression: use this #VipsForeignTiffCompression
* @Q: %gint quality factor * * @Q: %gint quality factor
* @predictor: use this #VipsForeignTiffPredictor * * @predictor: use this #VipsForeignTiffPredictor
* @profile: filename of ICC profile to attach * * @profile: filename of ICC profile to attach
* @tile: set %TRUE to write a tiled tiff * * @tile: set %TRUE to write a tiled tiff
* @tile_width: %gint for tile size * * @tile_width: %gint for tile size
* @tile_height: %gint for tile size * * @tile_height: %gint for tile size
* @pyramid: set %TRUE to write an image pyramid * * @pyramid: set %TRUE to write an image pyramid
* @squash: set %TRUE to squash 8-bit images down to 1 bit * * @squash: set %TRUE to squash 8-bit images down to 1 bit
* @miniswhite: set %TRUE to write 1-bit images as MINISWHITE * * @miniswhite: set %TRUE to write 1-bit images as MINISWHITE
* @resunit: #VipsForeignTiffResunit for resolution unit * * @resunit: #VipsForeignTiffResunit for resolution unit
* @xres: %gdouble horizontal resolution in pixels/mm * * @xres: %gdouble horizontal resolution in pixels/mm
* @yres: %gdouble vertical resolution in pixels/mm * * @yres: %gdouble vertical resolution in pixels/mm
* @bigtiff: set %TRUE to write a BigTiff file * * @bigtiff: set %TRUE to write a BigTiff file
* *
* Write a VIPS image to a file as TIFF. * Write a VIPS image to a file as TIFF.
* *
@ -2089,9 +2089,9 @@ vips_tiffsave( VipsImage *in, const char *filename, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @shrink: %gint, shrink by this much on load * * @shrink: %gint, shrink by this much on load
* @fail: %gboolean, fail on warnings * * @fail: %gboolean, fail on warnings
* @autorotate: %gboolean, use exif Orientation tag to rotate the image during load * * @autorotate: %gboolean, use exif Orientation tag to rotate the image during load
* *
* Read a JPEG file into a VIPS image. It can read most 8-bit JPEG images, * Read a JPEG file into a VIPS image. It can read most 8-bit JPEG images,
* including CMYK and YCbCr. * including CMYK and YCbCr.
@ -2167,8 +2167,8 @@ vips_jpegload( const char *filename, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @shrink: %gint, shrink by this much on load * * @shrink: %gint, shrink by this much on load
* @fail: %gboolean, fail on warnings * * @fail: %gboolean, fail on warnings
* *
* Read a JPEG-formatted memory block into a VIPS image. Exactly as * Read a JPEG-formatted memory block into a VIPS image. Exactly as
* vips_jpegload(), but read from a memory buffer. * vips_jpegload(), but read from a memory buffer.
@ -2208,15 +2208,16 @@ vips_jpegload_buffer( void *buf, size_t len, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @Q: %gint, quality factor * * @Q: %gint, quality factor
* @profile: filename of ICC profile to attach * * @profile: filename of ICC profile to attach
* @optimize_coding: %gboolean, compute optimal Huffman coding tables * * @optimize_coding: %gboolean, compute optimal Huffman coding tables
* @interlace: %gboolean, write an interlaced (progressive) jpeg * * @interlace: %gboolean, write an interlaced (progressive) jpeg
* @strip: %gboolean, remove all metadata from image * * @strip: %gboolean, remove all metadata from image
* @no-subsample: %gboolean, disable chroma subsampling * * @no-subsample: %gboolean, disable chroma subsampling
* @trellis_quant: %gboolean, apply trellis quantisation to each 8x8 block * * @trellis_quant: %gboolean, apply trellis quantisation to each 8x8 block
* @overshoot_deringing: %gboolean, overshoot samples with extreme values * * @overshoot_deringing: %gboolean, overshoot samples with extreme values
* @optimize_scans: %gboolean, split DCT coefficients into separate scans * * @optimize_scans: %gboolean, split DCT coefficients into separate scans
* * @quant_table: %gint, quantization table index
* *
* Write a VIPS image to a file as JPEG. * Write a VIPS image to a file as JPEG.
* *
@ -2268,6 +2269,33 @@ vips_jpegload_buffer( void *buf, size_t len, VipsImage **out, ... )
* (e.g. mozjpeg >= 3.0), split the spectrum of DCT coefficients into * (e.g. mozjpeg >= 3.0), split the spectrum of DCT coefficients into
* separate scans. Reduces file size but increases compression time. * separate scans. Reduces file size but increases compression time.
* *
* If @quant_table is set and the version of libjpeg supports it
* (e.g. mozjpeg >= 3.0) it selects the quantization table to use:
*
* * 0 Tables from JPEG Annex K (vips and libjpeg default)
* * 1 Flat table
* * 2 Table tuned for MSSIM on Kodak image set
* * 3 Table from ImageMagick by N. Robidoux (current mozjpeg default)
* * 4 Table tuned for PSNR-HVS-M on Kodak image set
* * 5 Table from Relevance of Human Vision to JPEG-DCT Compression (1992)
* * 6 Table from DCTune Perceptual Optimization of Compressed Dental
* X-Rays (1997)
* * 7 Table from A Visual Detection Model for DCT Coefficient
* Quantization (1993)
* * 8 Table from An Improved Detection Model for DCT Coefficient
* Quantization (1993)
*
* Quantization table 0 is the default in vips and libjpeg(-turbo), but it
* tends to favor detail over color accuracy, producting colored patches and
* stripes as well as heavy banding in flat areas at high compression ratios.
* Quantization table 2 is a good candidate to try if the default quantization
* table produces banding or color shifts and is well suited for hires images.
* Quantization table 3 is the default in mozjpeg and has been tuned to produce
* good results at the default quality setting; banding at high compression.
* Quantization table 4 is the most accurate at the cost of compression ratio.
* Tables 5-7 are based on older research papers, but generally achieve worse
* compression ratios and/or quality than 2 or 4.
*
* See also: vips_jpegsave_buffer(), vips_image_write_to_file(). * See also: vips_jpegsave_buffer(), vips_image_write_to_file().
* *
* Returns: 0 on success, -1 on error. * Returns: 0 on success, -1 on error.
@ -2294,15 +2322,16 @@ vips_jpegsave( VipsImage *in, const char *filename, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @Q: JPEG quality factor * * @Q: JPEG quality factor
* @profile: attach this ICC profile * * @profile: attach this ICC profile
* @optimize_coding: compute optimal Huffman coding tables * * @optimize_coding: compute optimal Huffman coding tables
* @interlace: write an interlaced (progressive) jpeg * * @interlace: write an interlaced (progressive) jpeg
* @strip: remove all metadata from image * * @strip: remove all metadata from image
* @no-subsample: disable chroma subsampling * * @no-subsample: disable chroma subsampling
* @trellis_quant: %gboolean, apply trellis quantisation to each 8x8 block * * @trellis_quant: %gboolean, apply trellis quantisation to each 8x8 block
* @overshoot_deringing: %gboolean, overshoot samples with extreme values * * @overshoot_deringing: %gboolean, overshoot samples with extreme values
* @optimize_scans: %gboolean, split DCT coefficients into separate scans * * @optimize_scans: %gboolean, split DCT coefficients into separate scans
* * @quant_table: %gint, quantization table index
* *
* As vips_jpegsave(), but save to a memory buffer. * As vips_jpegsave(), but save to a memory buffer.
* *
@ -2349,14 +2378,15 @@ vips_jpegsave_buffer( VipsImage *in, void **buf, size_t *len, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @Q: JPEG quality factor * * @Q: JPEG quality factor
* @profile: attach this ICC profile * * @profile: attach this ICC profile
* @optimize_coding: compute optimal Huffman coding tables * * @optimize_coding: compute optimal Huffman coding tables
* @strip: remove all metadata from image * * @strip: remove all metadata from image
* @no-subsample: disable chroma subsampling * * @no-subsample: disable chroma subsampling
* @trellis_quant: %gboolean, apply trellis quantisation to each 8x8 block * * @trellis_quant: %gboolean, apply trellis quantisation to each 8x8 block
* @overshoot_deringing: %gboolean, overshoot samples with extreme values * * @overshoot_deringing: %gboolean, overshoot samples with extreme values
* @optimize_scans: %gboolean, split DCT coefficients into separate scans * * @optimize_scans: %gboolean, split DCT coefficients into separate scans
* * @quant_table: %gint, quantization table index
* *
* As vips_jpegsave(), but save as a mime jpeg on stdout. * As vips_jpegsave(), but save as a mime jpeg on stdout.
* *
@ -2385,7 +2415,7 @@ vips_jpegsave_mime( VipsImage *in, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @shrink: %gint, shrink by this much on load * * @shrink: %gint, shrink by this much on load
* *
* Read a WebP file into a VIPS image. * Read a WebP file into a VIPS image.
* *
@ -2417,7 +2447,7 @@ vips_webpload( const char *filename, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @shrink: %gint, shrink by this much on load * * @shrink: %gint, shrink by this much on load
* *
* Read a WebP-formatted memory block into a VIPS image. Exactly as * Read a WebP-formatted memory block into a VIPS image. Exactly as
* vips_webpload(), but read from a memory buffer. * vips_webpload(), but read from a memory buffer.
@ -2457,7 +2487,28 @@ vips_webpload_buffer( void *buf, size_t len, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @Q: quality factor * * @Q: %gint quality factor
* * @lossless: %gboolean enables lossless compression
* * @preset: #VipsForeignWebpPreset choose lossy compression preset
* * @smart_subsample: %gboolean enables high quality chroma subsampling
* * @near_lossless: %gboolean use preprocessing in lossless mode (controlled by Q)
* * @alpha_q: %gint set alpha quality in lossless mode
*
* Write an image to a file in WebP format.
*
* By default, images are saved in lossy format, with
* @Q giving the WebP quality factor. It has the range 0 - 100, with the
* default 75.
*
* Use @preset to hint the image type to the lossy compressor. The default is
* #VIPS_FOREIGN_WEBP_PRESET_DEFAULT.
* Set @smart_subsample to enable high quality chroma subsampling.
* Use @alpha_q to set the quality for the alpha channel in lossy mode. It has
* the range 1 - 100, with the default 100.
*
* Set @lossless to use lossless compression, or combine @near_lossless
* with @Q 80, 60, 40 or 20 to apply increasing amounts of preprocessing
* which improves the near-lossless compression ratio by up to 50%.
* *
* See also: vips_webpload(), vips_image_write_to_file(). * See also: vips_webpload(), vips_image_write_to_file().
* *
@ -2485,7 +2536,18 @@ vips_webpsave( VipsImage *in, const char *filename, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @Q: JPEG quality factor * * @Q: %gint quality factor
* * @lossless: %gboolean enables lossless compression
* * @preset: #VipsForeignWebpPreset choose lossy compression preset
* * @smart_subsample: %gboolean enables high quality chroma subsampling
* * @near_lossless: %gboolean use preprocessing in lossless mode (controlled by Q)
* * @alpha_q: %gint set alpha quality in lossless mode
*
* As vips_webpsave(), but save to a memory buffer.
*
* The address of the buffer is returned in @obuf, the length of the buffer in
* @olen. You are responsible for freeing the buffer with g_free() when you
* are done with it.
* *
* See also: vips_webpsave(). * See also: vips_webpsave().
* *
@ -2526,7 +2588,12 @@ vips_webpsave_buffer( VipsImage *in, void **buf, size_t *len, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @Q: quality factor * * @Q: %gint quality factor
* * @lossless: %gboolean enables lossless compression
* * @preset: #VipsForeignWebpPreset choose lossy compression preset
* * @smart_subsample: %gboolean enables high quality chroma subsampling
* * @near_lossless: %gboolean use preprocessing in lossless mode (controlled by Q)
* * @alpha_q: %gint set alpha quality in lossless mode
* *
* As vips_webpsave(), but save as a mime webp on stdout. * As vips_webpsave(), but save as a mime webp on stdout.
* *
@ -2587,9 +2654,9 @@ vips_openexrload( const char *filename, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @level: load this level * * @level: load this level
* @associated: load this associated image * * @associated: load this associated image
* @autocrop: crop to image bounds * * @autocrop: crop to image bounds
* *
* Read a virtual slide supported by the OpenSlide library into a VIPS image. * Read a virtual slide supported by the OpenSlide library into a VIPS image.
* OpenSlide supports images in Aperio, Hamamatsu, MIRAX, Sakura, Trestle, * OpenSlide supports images in Aperio, Hamamatsu, MIRAX, Sakura, Trestle,
@ -2690,8 +2757,6 @@ vips_fitssave( VipsImage *in, const char *filename, ... )
* @out: decompressed image * @out: decompressed image
* @...: %NULL-terminated list of optional named arguments * @...: %NULL-terminated list of optional named arguments
* *
* Optional arguments:
*
* Read a PNG file into a VIPS image. It can read all png images, including 8- * Read a PNG file into a VIPS image. It can read all png images, including 8-
* and 16-bit images, 1 and 3 channel, with and without an alpha channel. * and 16-bit images, 1 and 3 channel, with and without an alpha channel.
* *
@ -2762,10 +2827,10 @@ vips_pngload_buffer( void *buf, size_t len, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @compression: compression level * * @compression: compression level
* @interlace: interlace image * * @interlace: interlace image
* @profile: ICC profile to embed * * @profile: ICC profile to embed
* @filter: #VipsForeignPngFilter row filter flag(s) * * @filter: #VipsForeignPngFilter row filter flag(s)
* *
* Write a VIPS image to a file as PNG. * Write a VIPS image to a file as PNG.
* *
@ -2818,10 +2883,10 @@ vips_pngsave( VipsImage *in, const char *filename, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @compression: compression level * * @compression: compression level
* @interlace: interlace image * * @interlace: interlace image
* @profile: ICC profile to embed * * @profile: ICC profile to embed
* @filter: libpng row filter flag(s) * * @filter: libpng row filter flag(s)
* *
* As vips_pngsave(), but save to a memory buffer. * As vips_pngsave(), but save to a memory buffer.
* *
@ -2899,9 +2964,9 @@ vips_matload( const char *filename, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @page: %gint, load this page, numbered from zero * * @page: %gint, load this page, numbered from zero
* @dpi: %gdouble, render at this DPI * * @dpi: %gdouble, render at this DPI
* @scale: %gdouble, scale render by this factor * * @scale: %gdouble, scale render by this factor
* *
* Render a PDF file into a VIPS image. Rendering uses the libpoppler library * Render a PDF file into a VIPS image. Rendering uses the libpoppler library
* and should be fast. * and should be fast.
@ -2960,9 +3025,9 @@ vips_pdfload( const char *filename, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @page: %gint, load this page, numbered from zero * * @page: %gint, load this page, numbered from zero
* @dpi: %gdouble, render at this DPI * * @dpi: %gdouble, render at this DPI
* @scale: %gdouble, scale render by this factor * * @scale: %gdouble, scale render by this factor
* *
* Read a PDF-formatted memory block into a VIPS image. Exactly as * Read a PDF-formatted memory block into a VIPS image. Exactly as
* vips_pdfload(), but read from a memory buffer. * vips_pdfload(), but read from a memory buffer.
@ -3002,8 +3067,8 @@ vips_pdfload_buffer( void *buf, size_t len, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @dpi: %gdouble, render at this DPI * * @dpi: %gdouble, render at this DPI
* @scale: %gdouble, scale render by this factor * * @scale: %gdouble, scale render by this factor
* *
* Render a SVG file into a VIPS image. Rendering uses the librsvg library * Render a SVG file into a VIPS image. Rendering uses the librsvg library
* and should be fast. * and should be fast.
@ -3040,8 +3105,8 @@ vips_svgload( const char *filename, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @dpi: %gdouble, render at this DPI * * @dpi: %gdouble, render at this DPI
* @scale: %gdouble, scale render by this factor * * @scale: %gdouble, scale render by this factor
* *
* Read a SVG-formatted memory block into a VIPS image. Exactly as * Read a SVG-formatted memory block into a VIPS image. Exactly as
* vips_svgload(), but read from a memory buffer. * vips_svgload(), but read from a memory buffer.
@ -3081,7 +3146,7 @@ vips_svgload_buffer( void *buf, size_t len, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @page: %ginit, page (frame) to read * * @page: %ginit, page (frame) to read
* *
* Read a GIF file into a VIPS image. Rendering uses the giflib library. * Read a GIF file into a VIPS image. Rendering uses the giflib library.
* *
@ -3116,7 +3181,7 @@ vips_gifload( const char *filename, VipsImage **out, ... )
* *
* Optional arguments: * Optional arguments:
* *
* @page: %ginit, page (frame) to read * * @page: %ginit, page (frame) to read
* *
* Read a GIF-formatted memory block into a VIPS image. Exactly as * Read a GIF-formatted memory block into a VIPS image. Exactly as
* vips_gifload(), but read from a memory buffer. * vips_gifload(), but read from a memory buffer.

View File

@ -153,15 +153,33 @@ vips_foreign_load_gif_errstr( int error_code )
#endif /*HAVE_GIFLIB_5*/ #endif /*HAVE_GIFLIB_5*/
} }
static void
vips_foreign_load_gif_error_vips( VipsForeignLoadGif *gif, int error )
{
VipsObjectClass *class = VIPS_OBJECT_GET_CLASS( gif );
const char *message;
if( (message = vips_foreign_load_gif_errstr( error )) )
vips_error( class->nickname, "%s", message );
}
static void static void
vips_foreign_load_gif_error( VipsForeignLoadGif *gif ) vips_foreign_load_gif_error( VipsForeignLoadGif *gif )
{ {
int error;
error = 0;
#ifdef HAVE_GIFLIB_5 #ifdef HAVE_GIFLIB_5
if( gif->file ) if( gif->file )
vips_foreign_load_gif_errstr( gif->file->Error ); error = gif->file->Error;
#else #else
vips_foreign_load_gif_errstr( GifLastError() ); error = GifLastError();
#endif #endif
if( error )
vips_foreign_load_gif_error_vips( gif, error );
} }
static void static void
@ -172,13 +190,13 @@ vips_foreign_load_gif_close( VipsForeignLoadGif *gif )
int error; int error;
if( DGifCloseFile( gif->file, &error ) ) if( DGifCloseFile( gif->file, &error ) )
vips_foreign_load_gif_errstr( error ); vips_foreign_load_gif_error_vips( gif, error );
gif->file = NULL; gif->file = NULL;
} }
#else #else
if( gif->file ) { if( gif->file ) {
if( DGifCloseFile( gif->file ) ) if( DGifCloseFile( gif->file ) )
vips_foreign_load_gif_errstr( GifLastError() ); vips_foreign_load_gif_error_vips( gif, GifLastError() );
gif->file = NULL; gif->file = NULL;
} }
#endif #endif
@ -194,13 +212,13 @@ vips_foreign_load_gif_open( VipsForeignLoadGif *gif, const char *filename )
int error; int error;
if( !(gif->file = DGifOpenFileName( filename, &error )) ) { if( !(gif->file = DGifOpenFileName( filename, &error )) ) {
vips_foreign_load_gif_errstr( error ); vips_foreign_load_gif_error_vips( gif, error );
return( -1 ); return( -1 );
} }
} }
#else #else
if( !(gif->file = DGifOpenFileName( filename )) ) { if( !(gif->file = DGifOpenFileName( filename )) ) {
vips_foreign_load_gif_errstr( GifLastError() ); vips_foreign_load_gif_error_vips( gif, GifLastError() );
return( -1 ); return( -1 );
} }
#endif #endif
@ -218,13 +236,13 @@ vips_foreign_load_gif_open_buffer( VipsForeignLoadGif *gif, InputFunc read_fn )
int error; int error;
if( !(gif->file = DGifOpen( gif, read_fn, &error )) ) { if( !(gif->file = DGifOpen( gif, read_fn, &error )) ) {
vips_foreign_load_gif_errstr( error ); vips_foreign_load_gif_error_vips( gif, error );
return( -1 ); return( -1 );
} }
} }
#else #else
if( !(gif->file = DGifOpen( gif, read_fn )) ) { if( !(gif->file = DGifOpen( gif, read_fn )) ) {
vips_foreign_load_gif_errstr( GifLastError() ); vips_foreign_load_gif_error_vips( gif, GifLastError() );
return( -1 ); return( -1 );
} }
#endif #endif
@ -435,7 +453,7 @@ vips_foreign_load_gif_load( VipsForeignLoad *load )
GifByteType *extension; GifByteType *extension;
int ext_code; int ext_code;
if( DGifGetRecordType( gif->file, &record) == GIF_ERROR ) { if( DGifGetRecordType( gif->file, &record ) == GIF_ERROR ) {
vips_foreign_load_gif_error( gif ); vips_foreign_load_gif_error( gif );
return( -1 ); return( -1 );
} }

View File

@ -103,6 +103,10 @@ typedef struct _VipsForeignSaveJpeg {
*/ */
gboolean optimize_scans; gboolean optimize_scans;
/* Use predefined quantization table with given index.
*/
int quant_table;
} VipsForeignSaveJpeg; } VipsForeignSaveJpeg;
typedef VipsForeignSaveClass VipsForeignSaveJpegClass; typedef VipsForeignSaveClass VipsForeignSaveJpegClass;
@ -194,6 +198,13 @@ vips_foreign_save_jpeg_class_init( VipsForeignSaveJpegClass *class )
G_STRUCT_OFFSET( VipsForeignSaveJpeg, optimize_scans ), G_STRUCT_OFFSET( VipsForeignSaveJpeg, optimize_scans ),
FALSE ); FALSE );
VIPS_ARG_INT( class, "quant_table", 18,
_( "Quantization table" ),
_( "Use predefined quantization table with given index" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsForeignSaveJpeg, quant_table ),
0, 8, 0 );
} }
static void static void
@ -230,7 +241,8 @@ vips_foreign_save_jpeg_file_build( VipsObject *object )
if( vips__jpeg_write_file( save->ready, file->filename, if( vips__jpeg_write_file( save->ready, file->filename,
jpeg->Q, jpeg->profile, jpeg->optimize_coding, jpeg->Q, jpeg->profile, jpeg->optimize_coding,
jpeg->interlace, save->strip, jpeg->no_subsample, jpeg->interlace, save->strip, jpeg->no_subsample,
jpeg->trellis_quant, jpeg->overshoot_deringing, jpeg->optimize_scans) ) jpeg->trellis_quant, jpeg->overshoot_deringing,
jpeg->optimize_scans, jpeg->quant_table ) )
return( -1 ); return( -1 );
return( 0 ); return( 0 );
@ -294,7 +306,8 @@ vips_foreign_save_jpeg_buffer_build( VipsObject *object )
if( vips__jpeg_write_buffer( save->ready, if( vips__jpeg_write_buffer( save->ready,
&obuf, &olen, jpeg->Q, jpeg->profile, jpeg->optimize_coding, &obuf, &olen, jpeg->Q, jpeg->profile, jpeg->optimize_coding,
jpeg->interlace, save->strip, jpeg->no_subsample, jpeg->interlace, save->strip, jpeg->no_subsample,
jpeg->trellis_quant, jpeg->overshoot_deringing, jpeg->optimize_scans) ) jpeg->trellis_quant, jpeg->overshoot_deringing,
jpeg->optimize_scans, jpeg->quant_table ) )
return( -1 ); return( -1 );
blob = vips_blob_new( (VipsCallbackFn) vips_free, obuf, olen ); blob = vips_blob_new( (VipsCallbackFn) vips_free, obuf, olen );
@ -357,7 +370,8 @@ vips_foreign_save_jpeg_mime_build( VipsObject *object )
if( vips__jpeg_write_buffer( save->ready, if( vips__jpeg_write_buffer( save->ready,
&obuf, &olen, jpeg->Q, jpeg->profile, jpeg->optimize_coding, &obuf, &olen, jpeg->Q, jpeg->profile, jpeg->optimize_coding,
jpeg->interlace, save->strip, jpeg->no_subsample, jpeg->interlace, save->strip, jpeg->no_subsample,
jpeg->trellis_quant, jpeg->overshoot_deringing, jpeg->optimize_scans) ) jpeg->trellis_quant, jpeg->overshoot_deringing,
jpeg->optimize_scans, jpeg->quant_table ) )
return( -1 ); return( -1 );
printf( "Content-length: %zu\r\n", olen ); printf( "Content-length: %zu\r\n", olen );

View File

@ -156,8 +156,8 @@ vips_foreign_save_ppm_init( VipsForeignSavePpm *ppm )
* *
* Optional arguments: * Optional arguments:
* *
* @ascii: save as ASCII rather than binary * * @ascii: save as ASCII rather than binary
* @squash: squash 8-bit images down to one bit * * @squash: squash 8-bit images down to one bit
* *
* Write a VIPS image to a file as PPM. It can write 1, 8, 16 or * Write a VIPS image to a file as PPM. It can write 1, 8, 16 or
* 32 bit unsigned integer images, float images, colour or monochrome, * 32 bit unsigned integer images, float images, colour or monochrome,

View File

@ -165,7 +165,7 @@ vips_foreign_load_raw_init( VipsForeignLoadRaw *raw )
* *
* Optional arguments: * Optional arguments:
* *
* @offset: offset in bytes from start of file * * @offset: offset in bytes from start of file
* *
* This operation mmaps the file, setting @out so that access to that * This operation mmaps the file, setting @out so that access to that
* image will read from the file. * image will read from the file.

View File

@ -149,34 +149,6 @@ vips_foreign_load_svg_header( VipsForeignLoad *load )
return( 0 ); return( 0 );
} }
/* Convert from ARGB to RGBA and undo premultiplication.
*/
void
vips__cairo2rgba( guint32 * restrict buf, int n )
{
int i;
for( i = 0; i < n; i++ ) {
guint32 * restrict p = buf + i;
guint32 x = *p;
guint8 a = x >> 24;
VipsPel * restrict out = (VipsPel *) p;
if( a == 255 )
*p = GUINT32_TO_BE( (x << 8) | 255 );
else if( a == 0 )
*p = GUINT32_TO_BE( x << 8 );
else {
/* Undo premultiplication.
*/
out[0] = 255 * ((x >> 16) & 255) / a;
out[1] = 255 * ((x >> 8) & 255) / a;
out[2] = 255 * (x & 255) / a;
out[3] = a;
}
}
}
static int static int
vips_foreign_load_svg_generate( VipsRegion *or, vips_foreign_load_svg_generate( VipsRegion *or,
void *seq, void *a, void *b, gboolean *stop ) void *seq, void *a, void *b, gboolean *stop )

View File

@ -74,6 +74,8 @@
* - don't write JFIF headers if we are stripping, thanks Benjamin * - don't write JFIF headers if we are stripping, thanks Benjamin
* 13/4/16 * 13/4/16
* - remove deleted exif fields more carefully * - remove deleted exif fields more carefully
* 9/5/16 felixbuenemann
* - add quant_table
*/ */
/* /*
@ -966,7 +968,7 @@ static int
write_vips( Write *write, int qfac, const char *profile, write_vips( Write *write, int qfac, const char *profile,
gboolean optimize_coding, gboolean progressive, gboolean strip, gboolean optimize_coding, gboolean progressive, gboolean strip,
gboolean no_subsample, gboolean trellis_quant, gboolean no_subsample, gboolean trellis_quant,
gboolean overshoot_deringing, gboolean optimize_scans ) gboolean overshoot_deringing, gboolean optimize_scans, int quant_table )
{ {
VipsImage *in; VipsImage *in;
J_COLOR_SPACE space; J_COLOR_SPACE space;
@ -1022,10 +1024,9 @@ write_vips( Write *write, int qfac, const char *profile,
JINT_COMPRESS_PROFILE, JCP_FASTEST ); JINT_COMPRESS_PROFILE, JCP_FASTEST );
#endif #endif
/* Rest to default. /* Reset to default.
*/ */
jpeg_set_defaults( &write->cinfo ); jpeg_set_defaults( &write->cinfo );
jpeg_set_quality( &write->cinfo, qfac, TRUE );
/* Compute optimal Huffman coding tables. /* Compute optimal Huffman coding tables.
*/ */
@ -1077,6 +1078,18 @@ write_vips( Write *write, int qfac, const char *profile,
vips_warn( "vips2jpeg", "%s", vips_warn( "vips2jpeg", "%s",
_( "Ignoring optimize_scans for baseline" ) ); _( "Ignoring optimize_scans for baseline" ) );
} }
/* Use predefined quantization table.
*/
if( quant_table > 0 ) {
if( jpeg_c_int_param_supported( &write->cinfo,
JINT_BASE_QUANT_TBL_IDX ) )
jpeg_c_set_int_param( &write->cinfo,
JINT_BASE_QUANT_TBL_IDX, quant_table );
else
vips_warn( "vips2jpeg",
"%s", _( "Setting quant_table unsupported" ) );
}
#else #else
/* Using jpeglib.h without extension parameters, warn of ignored /* Using jpeglib.h without extension parameters, warn of ignored
* options. * options.
@ -1088,8 +1101,14 @@ write_vips( Write *write, int qfac, const char *profile,
"%s", _( "Ignoring overshoot_deringing" ) ); "%s", _( "Ignoring overshoot_deringing" ) );
if( optimize_scans ) if( optimize_scans )
vips_warn( "vips2jpeg", "%s", _( "Ignoring optimize_scans" ) ); vips_warn( "vips2jpeg", "%s", _( "Ignoring optimize_scans" ) );
if( quant_table > 0 )
vips_warn( "vips2jpeg", "%s", _( "Ignoring quant_table" ) );
#endif #endif
/* Set compression quality. Must be called after setting params above.
*/
jpeg_set_quality( &write->cinfo, qfac, TRUE );
/* Enable progressive write. /* Enable progressive write.
*/ */
if( progressive ) if( progressive )
@ -1160,7 +1179,7 @@ vips__jpeg_write_file( VipsImage *in,
const char *filename, int Q, const char *profile, const char *filename, int Q, const char *profile,
gboolean optimize_coding, gboolean progressive, gboolean strip, gboolean optimize_coding, gboolean progressive, gboolean strip,
gboolean no_subsample, gboolean trellis_quant, gboolean no_subsample, gboolean trellis_quant,
gboolean overshoot_deringing, gboolean optimize_scans ) gboolean overshoot_deringing, gboolean optimize_scans, int quant_table )
{ {
Write *write; Write *write;
@ -1192,7 +1211,7 @@ vips__jpeg_write_file( VipsImage *in,
*/ */
if( write_vips( write, if( write_vips( write,
Q, profile, optimize_coding, progressive, strip, no_subsample, Q, profile, optimize_coding, progressive, strip, no_subsample,
trellis_quant, overshoot_deringing, optimize_scans ) ) { trellis_quant, overshoot_deringing, optimize_scans, quant_table ) ) {
write_destroy( write ); write_destroy( write );
return( -1 ); return( -1 );
} }
@ -1446,7 +1465,7 @@ vips__jpeg_write_buffer( VipsImage *in,
void **obuf, size_t *olen, int Q, const char *profile, void **obuf, size_t *olen, int Q, const char *profile,
gboolean optimize_coding, gboolean progressive, gboolean optimize_coding, gboolean progressive,
gboolean strip, gboolean no_subsample, gboolean trellis_quant, gboolean strip, gboolean no_subsample, gboolean trellis_quant,
gboolean overshoot_deringing, gboolean optimize_scans ) gboolean overshoot_deringing, gboolean optimize_scans, int quant_table )
{ {
Write *write; Write *write;
@ -1477,7 +1496,7 @@ vips__jpeg_write_buffer( VipsImage *in,
*/ */
if( write_vips( write, if( write_vips( write,
Q, profile, optimize_coding, progressive, strip, no_subsample, Q, profile, optimize_coding, progressive, strip, no_subsample,
trellis_quant, overshoot_deringing, optimize_scans ) ) { trellis_quant, overshoot_deringing, optimize_scans, quant_table ) ) {
write_destroy( write ); write_destroy( write );
return( -1 ); return( -1 );

View File

@ -4,6 +4,8 @@
* - from vips2jpeg.c * - from vips2jpeg.c
* 31/5/16 * 31/5/16
* - buffer write ignored lossless, thanks aaron42net * - buffer write ignored lossless, thanks aaron42net
* 2/5/16 Felix Bünemann
* - used advanced encoding API, expose controls
*/ */
/* /*
@ -46,6 +48,7 @@
#ifdef HAVE_LIBWEBP #ifdef HAVE_LIBWEBP
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <vips/vips.h> #include <vips/vips.h>
@ -53,125 +56,162 @@
#include "webp.h" #include "webp.h"
typedef size_t (*webp_encoder)( const uint8_t *rgb, typedef int (*webp_import)( WebPPicture *picture,
int width, int height, int stride, const uint8_t *rgb, int stride );
float quality_factor, uint8_t **output );
typedef size_t (*webp_encoder_lossless)( const uint8_t *rgb, static WebPPreset
int width, int height, int stride, uint8_t **output ); get_preset( VipsForeignWebpPreset preset )
int
vips__webp_write_file( VipsImage *in, const char *filename,
int Q, gboolean lossless )
{ {
VipsImage *memory; switch( preset ) {
size_t len; case VIPS_FOREIGN_WEBP_PRESET_DEFAULT:
uint8_t *buffer; return( WEBP_PRESET_DEFAULT );
FILE *fp; case VIPS_FOREIGN_WEBP_PRESET_PICTURE:
return( WEBP_PRESET_PICTURE );
case VIPS_FOREIGN_WEBP_PRESET_PHOTO:
return( WEBP_PRESET_PHOTO );
case VIPS_FOREIGN_WEBP_PRESET_DRAWING:
return( WEBP_PRESET_DRAWING );
case VIPS_FOREIGN_WEBP_PRESET_ICON:
return( WEBP_PRESET_ICON );
case VIPS_FOREIGN_WEBP_PRESET_TEXT:
return( WEBP_PRESET_TEXT );
if( !(memory = vips_image_copy_memory( in )) ) default:
return( -1 ); g_assert_not_reached();
if( lossless ) {
webp_encoder_lossless encoder;
if( in->Bands == 4 )
encoder = WebPEncodeLosslessRGBA;
else
encoder = WebPEncodeLosslessRGB;
if( !(len = encoder( VIPS_IMAGE_ADDR( memory, 0, 0 ),
memory->Xsize, memory->Ysize,
VIPS_IMAGE_SIZEOF_LINE( memory ),
&buffer )) ) {
VIPS_UNREF( memory );
vips_error( "vips2webp",
"%s", _( "unable to encode" ) );
return( -1 );
}
}
else {
webp_encoder encoder;
if( in->Bands == 4 )
encoder = WebPEncodeRGBA;
else
encoder = WebPEncodeRGB;
if( !(len = encoder( VIPS_IMAGE_ADDR( memory, 0, 0 ),
memory->Xsize, memory->Ysize,
VIPS_IMAGE_SIZEOF_LINE( memory ),
Q, &buffer )) ) {
VIPS_UNREF( memory );
vips_error( "vips2webp",
"%s", _( "unable to encode" ) );
return( -1 );
}
} }
VIPS_UNREF( memory ); /* Keep -Wall happy.
*/
if( !(fp = vips__file_open_write( filename, FALSE )) ) { return( -1 );
free( buffer );
return( -1 );
}
if( vips__file_write( buffer, len, 1, fp ) ) {
fclose( fp );
free( buffer );
return( -1 );
}
fclose( fp );
free( buffer );
return( 0 );
} }
int typedef struct {
vips__webp_write_buffer( VipsImage *in, void **obuf, size_t *olen, uint8_t *mem;
int Q, gboolean lossless ) size_t size;
size_t max_size;
} VipsWebPMemoryWriter;
static void
init_memory_writer( VipsWebPMemoryWriter *writer ) {
writer->mem = NULL;
writer->size = 0;
writer->max_size = 0;
}
static int
memory_write( const uint8_t *data, size_t data_size,
const WebPPicture *picture ) {
VipsWebPMemoryWriter * const writer =
(VipsWebPMemoryWriter*) picture->custom_ptr;
size_t next_size;
if( !writer )
return( 0 );
next_size = writer->size + data_size;
if( next_size > writer->max_size ) {
uint8_t *new_mem;
const size_t next_max_size =
VIPS_MAX( 8192, VIPS_MAX( next_size,
writer->max_size * 2 ) );
if( !(new_mem = (uint8_t*) g_try_malloc( next_max_size )) )
return( 0 );
if( writer->size > 0 )
memcpy( new_mem, writer->mem, writer->size );
g_free( writer->mem );
writer->mem = new_mem;
writer->max_size = next_max_size;
}
if( data_size > 0 ) {
memcpy( writer->mem + writer->size, data, data_size );
writer->size += data_size;
}
return( 1 );
}
static int
write_webp( WebPPicture *pic, VipsImage *in,
int Q, gboolean lossless, VipsForeignWebpPreset preset,
gboolean smart_subsample, gboolean near_lossless,
int alpha_q )
{ {
VipsImage *memory; VipsImage *memory;
WebPConfig config;
webp_import import;
if ( !WebPConfigPreset( &config, get_preset( preset ), Q ) ) {
vips_error( "vips2webp",
"%s", _( "config version error" ) );
return( -1 );
}
#if WEBP_ENCODER_ABI_VERSION >= 0x0100
config.lossless = lossless || near_lossless;
config.alpha_quality = alpha_q;
/* Smart subsampling requires use_argb because
* it is applied during RGB to YUV conversion.
*/
pic->use_argb = lossless || near_lossless || smart_subsample;
#else
if( lossless || near_lossless )
vips_warn( "vips2webp",
"%s", _( "lossless unsupported" ) );
if( alpha_q != 100 )
vips_warn( "vips2webp",
"%s", _( "alpha_q unsupported" ) );
#endif
#if WEBP_ENCODER_ABI_VERSION >= 0x0209
if( near_lossless )
config.near_lossless = Q;
if( smart_subsample )
config.preprocessing |= 4;
#else
if( near_lossless )
vips_warn( "vips2webp",
"%s", _( "near_lossless unsupported" ) );
if( smart_subsample )
vips_warn( "vips2webp",
"%s", _( "smart_subsample unsupported" ) );
#endif
if( !WebPValidateConfig( &config ) ) {
vips_error( "vips2webp",
"%s", _( "invalid configuration" ) );
return( -1 );
}
if( !(memory = vips_image_copy_memory( in )) ) if( !(memory = vips_image_copy_memory( in )) )
return( -1 ); return( -1 );
if( lossless ) { pic->width = memory->Xsize;
webp_encoder_lossless encoder; pic->height = memory->Ysize;
if( in->Bands == 4 ) if( in->Bands == 4 )
encoder = WebPEncodeLosslessRGBA; import = WebPPictureImportRGBA;
else else
encoder = WebPEncodeLosslessRGB; import = WebPPictureImportRGB;
if( !(*olen = encoder( VIPS_IMAGE_ADDR( memory, 0, 0 ), if( !import( pic, VIPS_IMAGE_ADDR( memory, 0, 0 ),
memory->Xsize, memory->Ysize, VIPS_IMAGE_SIZEOF_LINE( memory ) ) ) {
VIPS_IMAGE_SIZEOF_LINE( memory ), VIPS_UNREF( memory );
(uint8_t **) obuf )) ) { vips_error( "vips2webp",
VIPS_UNREF( memory ); "%s", _( "picture memory error" ) );
vips_error( "vips2webp", return( -1 );
"%s", _( "unable to encode" ) );
return( -1 );
}
} }
else {
webp_encoder encoder;
if( in->Bands == 4 ) if( !WebPEncode( &config, pic ) ) {
encoder = WebPEncodeRGBA; VIPS_UNREF( memory );
else vips_error( "vips2webp",
encoder = WebPEncodeRGB; "%s", _( "unable to encode" ) );
return( -1 );
if( !(*olen = encoder( VIPS_IMAGE_ADDR( memory, 0, 0 ),
memory->Xsize, memory->Ysize,
VIPS_IMAGE_SIZEOF_LINE( memory ),
Q, (uint8_t **) obuf )) ) {
VIPS_UNREF( memory );
vips_error( "vips2webp",
"%s", _( "unable to encode" ) );
return( -1 );
}
} }
VIPS_UNREF( memory ); VIPS_UNREF( memory );
@ -179,4 +219,84 @@ vips__webp_write_buffer( VipsImage *in, void **obuf, size_t *olen,
return( 0 ); return( 0 );
} }
int
vips__webp_write_file( VipsImage *in, const char *filename,
int Q, gboolean lossless, VipsForeignWebpPreset preset,
gboolean smart_subsample, gboolean near_lossless,
int alpha_q )
{
WebPPicture pic;
VipsWebPMemoryWriter writer;
FILE *fp;
if( !WebPPictureInit( &pic ) ) {
vips_error( "vips2webp",
"%s", _( "picture version error" ) );
return( -1 );
}
init_memory_writer( &writer );
pic.writer = memory_write;
pic.custom_ptr = &writer;
if( write_webp( &pic, in, Q, lossless, preset, smart_subsample,
near_lossless, alpha_q ) ) {
WebPPictureFree( &pic );
g_free( writer.mem );
return -1;
}
WebPPictureFree( &pic );
if( !(fp = vips__file_open_write( filename, FALSE )) ) {
g_free( writer.mem );
return( -1 );
}
if( vips__file_write( writer.mem, writer.size, 1, fp ) ) {
fclose( fp );
g_free( writer.mem );
return( -1 );
}
fclose( fp );
g_free( writer.mem );
return( 0 );
}
int
vips__webp_write_buffer( VipsImage *in, void **obuf, size_t *olen,
int Q, gboolean lossless, VipsForeignWebpPreset preset,
gboolean smart_subsample, gboolean near_lossless,
int alpha_q )
{
WebPPicture pic;
VipsWebPMemoryWriter writer;
if( !WebPPictureInit( &pic ) ) {
vips_error( "vips2webp",
"%s", _( "picture version error" ) );
return( -1 );
}
init_memory_writer( &writer );
pic.writer = memory_write;
pic.custom_ptr = &writer;
if( write_webp( &pic, in, Q, lossless, preset, smart_subsample,
near_lossless, alpha_q ) ) {
WebPPictureFree( &pic );
g_free( writer.mem );
return -1;
}
WebPPictureFree( &pic );
*obuf = writer.mem;
*olen = writer.size;
return( 0 );
}
#endif /*HAVE_LIBWEBP*/ #endif /*HAVE_LIBWEBP*/

View File

@ -41,12 +41,12 @@ int vips__jpeg_write_file( VipsImage *in,
const char *filename, int Q, const char *profile, const char *filename, int Q, const char *profile,
gboolean optimize_coding, gboolean progressive, gboolean strip, gboolean optimize_coding, gboolean progressive, gboolean strip,
gboolean no_subsample, gboolean trellis_quant, gboolean no_subsample, gboolean trellis_quant,
gboolean overshoot_deringing, gboolean optimize_scans ); gboolean overshoot_deringing, gboolean optimize_scans, int quant_table );
int vips__jpeg_write_buffer( VipsImage *in, int vips__jpeg_write_buffer( VipsImage *in,
void **obuf, size_t *olen, int Q, const char *profile, void **obuf, size_t *olen, int Q, const char *profile,
gboolean optimize_coding, gboolean progressive, gboolean strip, gboolean optimize_coding, gboolean progressive, gboolean strip,
gboolean no_subsample, gboolean trellis_quant, gboolean no_subsample, gboolean trellis_quant,
gboolean overshoot_deringing, gboolean optimize_scans ); gboolean overshoot_deringing, gboolean optimize_scans, int quant_table );
int vips__isjpeg_buffer( const void *buf, size_t len ); int vips__isjpeg_buffer( const void *buf, size_t len );
int vips__isjpeg( const char *filename ); int vips__isjpeg( const char *filename );

View File

@ -49,9 +49,13 @@ int vips__webp_read_buffer( const void *buf, size_t len,
VipsImage *out, int shrink ); VipsImage *out, int shrink );
int vips__webp_write_file( VipsImage *out, const char *filename, int vips__webp_write_file( VipsImage *out, const char *filename,
int Q, gboolean lossless ); int Q, gboolean lossless, VipsForeignWebpPreset preset,
gboolean smart_subsample, gboolean near_lossless,
int alpha_q );
int vips__webp_write_buffer( VipsImage *out, void **buf, size_t *len, int vips__webp_write_buffer( VipsImage *out, void **buf, size_t *len,
int Q, gboolean lossless ); int Q, gboolean lossless, VipsForeignWebpPreset preset,
gboolean smart_subsample, gboolean near_lossless,
int alpha_q );
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -60,6 +60,22 @@ typedef struct _VipsForeignSaveWebp {
*/ */
gboolean lossless; gboolean lossless;
/* Lossy compression preset.
*/
VipsForeignWebpPreset preset;
/* Enable smart chroma subsampling.
*/
gboolean smart_subsample;
/* Use preprocessing in lossless mode.
*/
gboolean near_lossless;
/* Alpha quality.
*/
int alpha_q;
} VipsForeignSaveWebp; } VipsForeignSaveWebp;
typedef VipsForeignSaveClass VipsForeignSaveWebpClass; typedef VipsForeignSaveClass VipsForeignSaveWebpClass;
@ -100,7 +116,7 @@ vips_foreign_save_webp_class_init( VipsForeignSaveWebpClass *class )
_( "Q factor" ), _( "Q factor" ),
VIPS_ARGUMENT_OPTIONAL_INPUT, VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsForeignSaveWebp, Q ), G_STRUCT_OFFSET( VipsForeignSaveWebp, Q ),
1, 100, 75 ); 0, 100, 75 );
VIPS_ARG_BOOL( class, "lossless", 11, VIPS_ARG_BOOL( class, "lossless", 11,
_( "lossless" ), _( "lossless" ),
@ -109,12 +125,42 @@ vips_foreign_save_webp_class_init( VipsForeignSaveWebpClass *class )
G_STRUCT_OFFSET( VipsForeignSaveWebp, lossless ), G_STRUCT_OFFSET( VipsForeignSaveWebp, lossless ),
FALSE ); FALSE );
VIPS_ARG_ENUM( class, "preset", 12,
_( "preset" ),
_( "Preset for lossy compression" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsForeignSaveWebp, preset ),
VIPS_TYPE_FOREIGN_WEBP_PRESET,
VIPS_FOREIGN_WEBP_PRESET_DEFAULT );
VIPS_ARG_BOOL( class, "smart_subsample", 13,
_( "Smart subsampling" ),
_( "Enable high quality chroma subsampling" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsForeignSaveWebp, smart_subsample ),
FALSE );
VIPS_ARG_BOOL( class, "near_lossless", 14,
_( "Near lossless" ),
_( "Enable preprocessing in lossless mode (uses Q)" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsForeignSaveWebp, near_lossless ),
FALSE );
VIPS_ARG_INT( class, "alpha_q", 15,
_( "Alpha quality" ),
_( "Change alpha plane fidelity for lossy compression" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsForeignSaveWebp, alpha_q ),
0, 100, 100 );
} }
static void static void
vips_foreign_save_webp_init( VipsForeignSaveWebp *webp ) vips_foreign_save_webp_init( VipsForeignSaveWebp *webp )
{ {
webp->Q = 80; webp->Q = 75;
webp->alpha_q = 100;
} }
typedef struct _VipsForeignSaveWebpFile { typedef struct _VipsForeignSaveWebpFile {
@ -143,7 +189,9 @@ vips_foreign_save_webp_file_build( VipsObject *object )
return( -1 ); return( -1 );
if( vips__webp_write_file( save->ready, file->filename, if( vips__webp_write_file( save->ready, file->filename,
webp->Q, webp->lossless ) ) webp->Q, webp->lossless, webp->preset,
webp->smart_subsample, webp->near_lossless,
webp->alpha_q ) )
return( -1 ); return( -1 );
return( 0 ); return( 0 );
@ -205,7 +253,9 @@ vips_foreign_save_webp_buffer_build( VipsObject *object )
return( -1 ); return( -1 );
if( vips__webp_write_buffer( save->ready, &obuf, &olen, if( vips__webp_write_buffer( save->ready, &obuf, &olen,
webp->Q, webp->lossless ) ) webp->Q, webp->lossless, webp->preset,
webp->smart_subsample, webp->near_lossless,
webp->alpha_q ) )
return( -1 ); return( -1 );
blob = vips_blob_new( (VipsCallbackFn) vips_free, obuf, olen ); blob = vips_blob_new( (VipsCallbackFn) vips_free, obuf, olen );
@ -266,7 +316,9 @@ vips_foreign_save_webp_mime_build( VipsObject *object )
return( -1 ); return( -1 );
if( vips__webp_write_buffer( save->ready, &obuf, &olen, if( vips__webp_write_buffer( save->ready, &obuf, &olen,
webp->Q, webp->lossless ) ) webp->Q, webp->lossless, webp->preset,
webp->smart_subsample, webp->near_lossless,
webp->alpha_q ) )
return( -1 ); return( -1 );
printf( "Content-length: %zu\r\n", olen ); printf( "Content-length: %zu\r\n", olen );

View File

@ -276,7 +276,7 @@ vips_invfft_init( VipsInvfft *invfft )
* *
* Optional arguments: * Optional arguments:
* *
* @real: only output the real part * * @real: only output the real part
* *
* Transform an image from Fourier space to real space. The result is complex. * Transform an image from Fourier space to real space. The result is complex.
* If you are OK with a real result, set @real, it's quicker. * If you are OK with a real result, set @real, it's quicker.

View File

@ -138,7 +138,7 @@ vips_hist_equal_init( VipsHistEqual *equal )
* *
* Optional arguments: * Optional arguments:
* *
* @band: band to equalise * * @band: band to equalise
* *
* Histogram-equalise @in. Equalise using band @bandno, or if @bandno is -1, * Histogram-equalise @in. Equalise using band @bandno, or if @bandno is -1,
* equalise bands independently. * equalise bands independently.

View File

@ -735,7 +735,7 @@ vips_maplut_init( VipsMaplut *maplut )
* *
* Optional arguments: * Optional arguments:
* *
* @band: apply one-band @lut to this band of @in * * @band: apply one-band @lut to this band of @in
* *
* Map an image through another image acting as a LUT (Look Up Table). * Map an image through another image acting as a LUT (Look Up Table).
* The lut may have any type and the output image will be that type. * The lut may have any type and the output image will be that type.

View File

@ -367,10 +367,10 @@ vips_stdif_init( VipsStdif *stdif )
* *
* Optional arguments: * Optional arguments:
* *
* @a: weight of new mean * * @a: weight of new mean
* @m0: target mean * * @m0: target mean
* @b: weight of new deviation * * @b: weight of new deviation
* @s0: target deviation * * @s0: target deviation
* *
* vips_stdif() preforms statistical differencing according to the formula * vips_stdif() preforms statistical differencing according to the formula
* given in page 45 of the book "An Introduction to Digital Image * given in page 45 of the book "An Introduction to Digital Image

View File

@ -14,6 +14,8 @@ GType vips_foreign_flags_get_type (void) G_GNUC_CONST;
#define VIPS_TYPE_FOREIGN_FLAGS (vips_foreign_flags_get_type()) #define VIPS_TYPE_FOREIGN_FLAGS (vips_foreign_flags_get_type())
GType vips_saveable_get_type (void) G_GNUC_CONST; GType vips_saveable_get_type (void) G_GNUC_CONST;
#define VIPS_TYPE_SAVEABLE (vips_saveable_get_type()) #define VIPS_TYPE_SAVEABLE (vips_saveable_get_type())
GType vips_foreign_webp_preset_get_type (void) G_GNUC_CONST;
#define VIPS_TYPE_FOREIGN_WEBP_PRESET (vips_foreign_webp_preset_get_type())
GType vips_foreign_tiff_compression_get_type (void) G_GNUC_CONST; GType vips_foreign_tiff_compression_get_type (void) G_GNUC_CONST;
#define VIPS_TYPE_FOREIGN_TIFF_COMPRESSION (vips_foreign_tiff_compression_get_type()) #define VIPS_TYPE_FOREIGN_TIFF_COMPRESSION (vips_foreign_tiff_compression_get_type())
GType vips_foreign_tiff_predictor_get_type (void) G_GNUC_CONST; GType vips_foreign_tiff_predictor_get_type (void) G_GNUC_CONST;

View File

@ -338,6 +338,27 @@ int vips_jpegsave_buffer( VipsImage *in, void **buf, size_t *len, ... )
int vips_jpegsave_mime( VipsImage *in, ... ) int vips_jpegsave_mime( VipsImage *in, ... )
__attribute__((sentinel)); __attribute__((sentinel));
/**
* VipsForeignWebpPreset:
* @VIPS_FOREIGN_WEBP_PRESET_DEFAULT: default preset
* @VIPS_FOREIGN_WEBP_PRESET_PICTURE: digital picture, like portrait, inner shot
* @VIPS_FOREIGN_WEBP_PRESET_PHOTO: outdoor photograph, with natural lighting
* @VIPS_FOREIGN_WEBP_PRESET_DRAWING: hand or line drawing, with high-contrast details
* @VIPS_FOREIGN_WEBP_PRESET_ICON: small-sized colorful images
* @VIPS_FOREIGN_WEBP_PRESET_TEXT: text-like
*
* Tune lossy encoder settings for different image types.
*/
typedef enum {
VIPS_FOREIGN_WEBP_PRESET_DEFAULT,
VIPS_FOREIGN_WEBP_PRESET_PICTURE,
VIPS_FOREIGN_WEBP_PRESET_PHOTO,
VIPS_FOREIGN_WEBP_PRESET_DRAWING,
VIPS_FOREIGN_WEBP_PRESET_ICON,
VIPS_FOREIGN_WEBP_PRESET_TEXT,
VIPS_FOREIGN_WEBP_PRESET_LAST
} VipsForeignWebpPreset;
int vips_webpload( const char *filename, VipsImage **out, ... ) int vips_webpload( const char *filename, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_webpload_buffer( void *buf, size_t len, VipsImage **out, ... ) int vips_webpload_buffer( void *buf, size_t len, VipsImage **out, ... )

View File

@ -70,6 +70,28 @@ vips_saveable_get_type( void )
return( etype ); return( etype );
} }
GType GType
vips_foreign_webp_preset_get_type( void )
{
static GType etype = 0;
if( etype == 0 ) {
static const GEnumValue values[] = {
{VIPS_FOREIGN_WEBP_PRESET_DEFAULT, "VIPS_FOREIGN_WEBP_PRESET_DEFAULT", "default"},
{VIPS_FOREIGN_WEBP_PRESET_PICTURE, "VIPS_FOREIGN_WEBP_PRESET_PICTURE", "picture"},
{VIPS_FOREIGN_WEBP_PRESET_PHOTO, "VIPS_FOREIGN_WEBP_PRESET_PHOTO", "photo"},
{VIPS_FOREIGN_WEBP_PRESET_DRAWING, "VIPS_FOREIGN_WEBP_PRESET_DRAWING", "drawing"},
{VIPS_FOREIGN_WEBP_PRESET_ICON, "VIPS_FOREIGN_WEBP_PRESET_ICON", "icon"},
{VIPS_FOREIGN_WEBP_PRESET_TEXT, "VIPS_FOREIGN_WEBP_PRESET_TEXT", "text"},
{VIPS_FOREIGN_WEBP_PRESET_LAST, "VIPS_FOREIGN_WEBP_PRESET_LAST", "last"},
{0, NULL, NULL}
};
etype = g_enum_register_static( "VipsForeignWebpPreset", values );
}
return( etype );
}
GType
vips_foreign_tiff_compression_get_type( void ) vips_foreign_tiff_compression_get_type( void )
{ {
static GType etype = 0; static GType etype = 0;

View File

@ -433,10 +433,10 @@ vips_image_guess_format( const VipsImage *image )
break; break;
case VIPS_INTERPRETATION_CMYK: case VIPS_INTERPRETATION_CMYK:
if( image->BandFmt != VIPS_FORMAT_USHORT ) if( image->BandFmt == VIPS_FORMAT_USHORT )
format = VIPS_FORMAT_UCHAR; format = VIPS_FORMAT_USHORT;
else else
format = image->BandFmt; format = VIPS_FORMAT_UCHAR;
break; break;
case VIPS_INTERPRETATION_LABQ: case VIPS_INTERPRETATION_LABQ:
@ -453,14 +453,15 @@ vips_image_guess_format( const VipsImage *image )
break; break;
case VIPS_INTERPRETATION_MATRIX: case VIPS_INTERPRETATION_MATRIX:
if( image->BandFmt != VIPS_FORMAT_DOUBLE ) if( image->BandFmt == VIPS_FORMAT_DOUBLE )
format = VIPS_FORMAT_FLOAT; format = VIPS_FORMAT_DOUBLE;
else else
format = image->BandFmt; format = VIPS_FORMAT_FLOAT;
break; break;
default: default:
g_assert_not_reached(); format = VIPS_FORMAT_NOTSET;
break;
} }
return( format ); return( format );

View File

@ -1837,8 +1837,8 @@ vips_filename_get_options( const char *vips_filename )
* *
* Optional arguments: * Optional arguments:
* *
* @access: hint #VipsAccess mode to loader * * @access: hint #VipsAccess mode to loader
* @disc: load via a temporary disc file * * @disc: load via a temporary disc file
* *
* vips_image_new_from_file() opens @name for reading. It can load files * vips_image_new_from_file() opens @name for reading. It can load files
* in many image formats, including VIPS, TIFF, PNG, JPEG, FITS, Matlab, * in many image formats, including VIPS, TIFF, PNG, JPEG, FITS, Matlab,

View File

@ -329,11 +329,11 @@ vips_system_init( VipsSystem *system )
* *
* Optional arguments: * Optional arguments:
* *
* @in: array of input images * * @in: array of input images
* @out: output image * * @out: output image
* @in_format: write input files like this * * @in_format: write input files like this
* @out_format: write output filename like this * * @out_format: write output filename like this
* @log: stdout of command is returned here * * @log: stdout of command is returned here
* *
* vips_system() runs a command, optionally passing a set of images in and * vips_system() runs a command, optionally passing a set of images in and
* optionally getting an image back. The command's stdout is returned in @log. * optionally getting an image back. The command's stdout is returned in @log.

Some files were not shown because too many files have changed in this diff Show More