Merge branch 'master' into deftomat-master
This commit is contained in:
commit
3871369d3e
@ -2,6 +2,9 @@
|
|||||||
- add vips_image_get/set_array_int()
|
- add vips_image_get/set_array_int()
|
||||||
- disable webp alpha output if all frame fill the canvas and are solid
|
- disable webp alpha output if all frame fill the canvas and are solid
|
||||||
- support arrays of delays for animated images [deftomat]
|
- support arrays of delays for animated images [deftomat]
|
||||||
|
- add "unlimited" flag to svgload
|
||||||
|
- disable webp alpha output if all frames fill the canvas and are solid
|
||||||
|
- add "compression" option to heifsave [lovell]
|
||||||
|
|
||||||
24/5/19 started 8.8.1
|
24/5/19 started 8.8.1
|
||||||
- improve realpath() use on older libc
|
- improve realpath() use on older libc
|
||||||
@ -16,6 +19,8 @@ magic number [przemyslawpluta]
|
|||||||
- remove 256 band limit in arithmetic.c [erdmann]
|
- remove 256 band limit in arithmetic.c [erdmann]
|
||||||
- disable Orc if building with CET [lovell]
|
- disable Orc if building with CET [lovell]
|
||||||
- fix vipsthumbnail with pyr tiff [kleisauke]
|
- fix vipsthumbnail with pyr tiff [kleisauke]
|
||||||
|
- text autofit could occasionally terminate early [levmorozov]
|
||||||
|
- fewer warnings on tiffload [chregu]
|
||||||
|
|
||||||
21/9/18 started 8.8.0
|
21/9/18 started 8.8.0
|
||||||
- much faster smartcrop [lovell]
|
- much faster smartcrop [lovell]
|
||||||
|
13
configure.ac
13
configure.ac
@ -1038,13 +1038,14 @@ fi
|
|||||||
AC_ARG_WITH([rsvg],
|
AC_ARG_WITH([rsvg],
|
||||||
AS_HELP_STRING([--without-rsvg], [build without rsvg (default: test)]))
|
AS_HELP_STRING([--without-rsvg], [build without rsvg (default: test)]))
|
||||||
|
|
||||||
|
# 2.40.3 so we get the UNLIMITED open flag
|
||||||
if test x"$with_rsvg" != x"no"; then
|
if test x"$with_rsvg" != x"no"; then
|
||||||
PKG_CHECK_MODULES(RSVG, [librsvg-2.0 >= 2.34 cairo >= 1.2],
|
PKG_CHECK_MODULES(RSVG, [librsvg-2.0 >= 2.40.3 cairo >= 1.2],
|
||||||
[AC_DEFINE(HAVE_RSVG,1,[define if you have librsvg-2.0 >= 2.34.0 and cairo >= 1.2 installed.])
|
[AC_DEFINE(HAVE_RSVG,1,[define if you have librsvg-2.0 >= 2.40.3 and cairo >= 1.2 installed.])
|
||||||
with_rsvg=yes
|
with_rsvg=yes
|
||||||
PACKAGES_USED="$PACKAGES_USED librsvg-2.0 cairo"
|
PACKAGES_USED="$PACKAGES_USED librsvg-2.0 cairo"
|
||||||
],
|
],
|
||||||
[AC_MSG_WARN([librsvg-2.0 >= 2.34.0 or cairo >= 1.2 not found; disabling SVG load via rsvg])
|
[AC_MSG_WARN([librsvg-2.0 >= 2.40.3 or cairo >= 1.2 not found; disabling SVG load via rsvg])
|
||||||
with_rsvg=no
|
with_rsvg=no
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@ -1159,14 +1160,14 @@ if test x"$with_cfitsio" != x"no"; then
|
|||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# libwebp ... target 0.5+ to reduce complication
|
# libwebp ... target 0.6+ to reduce complication
|
||||||
# webp has the stuff for handling metadata in two separate libraries -- we
|
# webp has the stuff for handling metadata in two separate libraries -- we
|
||||||
# insit on having all of them
|
# insit on having all of them
|
||||||
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" != x"no"; then
|
if test x"$with_libwebp" != x"no"; then
|
||||||
PKG_CHECK_MODULES(LIBWEBP, libwebp >= 0.5 libwebpmux >= 0.5 libwebpdemux >= 0.5,
|
PKG_CHECK_MODULES(LIBWEBP, libwebp >= 0.6 libwebpmux >= 0.6 libwebpdemux >= 0.6,
|
||||||
[AC_DEFINE(HAVE_LIBWEBP,1,[define if you have libwebp/libwebpmux/libwebpdemux installed.])
|
[AC_DEFINE(HAVE_LIBWEBP,1,[define if you have libwebp/libwebpmux/libwebpdemux installed.])
|
||||||
with_libwebp=yes
|
with_libwebp=yes
|
||||||
PACKAGES_USED="$PACKAGES_USED libwebp libwebpmux libwebpdemux"
|
PACKAGES_USED="$PACKAGES_USED libwebp libwebpmux libwebpdemux"
|
||||||
@ -1475,7 +1476,7 @@ SVG import with librsvg-2.0: $with_rsvg
|
|||||||
zlib: $with_zlib
|
zlib: $with_zlib
|
||||||
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, libwebpmux, libwebpdemux 0.5.0 or later)
|
(requires libwebp, libwebpmux, libwebpdemux 0.6.0 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)
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
* 16/3/19
|
* 16/3/19
|
||||||
* - add `justify`
|
* - add `justify`
|
||||||
* - set Xoffset/Yoffset to ink left/top
|
* - set Xoffset/Yoffset to ink left/top
|
||||||
|
* 27/6/19
|
||||||
|
* - fitting could occasionally terminate early [levmorozov]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -204,18 +206,13 @@ vips_text_get_extents( VipsText *text, VipsRect *extents )
|
|||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return -ve for extents too small, 0 for a fit, +ve for extents too large.
|
/* Return -ve for extents too small, +ve for extents too large.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
vips_text_rect_difference( VipsRect *target, VipsRect *extents )
|
vips_text_rect_difference( VipsRect *target, VipsRect *extents )
|
||||||
{
|
{
|
||||||
if( vips_rect_includesrect( target, extents ) ) {
|
if( vips_rect_includesrect( target, extents ) )
|
||||||
if( target->width == extents->width ||
|
|
||||||
target->height == extents->height )
|
|
||||||
return( 0 );
|
|
||||||
|
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
|
||||||
else
|
else
|
||||||
return( 1 );
|
return( 1 );
|
||||||
}
|
}
|
||||||
@ -261,10 +258,9 @@ vips_text_autofit( VipsText *text )
|
|||||||
previous_difference = difference;
|
previous_difference = difference;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hit the size, or we straddle the target.
|
/* Stop if we straddle the target.
|
||||||
*/
|
*/
|
||||||
if( difference == 0 ||
|
if( difference != previous_difference )
|
||||||
difference != previous_difference )
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
previous_difference = difference;
|
previous_difference = difference;
|
||||||
|
@ -146,7 +146,8 @@ void
|
|||||||
vips__heif_error( struct heif_error *error )
|
vips__heif_error( struct heif_error *error )
|
||||||
{
|
{
|
||||||
if( error->code )
|
if( error->code )
|
||||||
vips_error( "heifload", "%s", error->message );
|
vips_error( "heif", "%s (%d.%d)", error->message, error->code,
|
||||||
|
error->subcode );
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *heif_magic[] = {
|
static const char *heif_magic[] = {
|
||||||
@ -814,6 +815,8 @@ vips_foreign_load_heif_file_header( VipsForeignLoad *load )
|
|||||||
|
|
||||||
const char *vips__heif_suffs[] = {
|
const char *vips__heif_suffs[] = {
|
||||||
".heic",
|
".heic",
|
||||||
|
".heif",
|
||||||
|
".avif",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
*
|
*
|
||||||
* 5/7/18
|
* 5/7/18
|
||||||
* - from niftisave.c
|
* - from niftisave.c
|
||||||
|
* 3/7/19 [lovell]
|
||||||
|
* - add "compression" option
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -65,6 +67,10 @@ typedef struct _VipsForeignSaveHeif {
|
|||||||
*/
|
*/
|
||||||
gboolean lossless;
|
gboolean lossless;
|
||||||
|
|
||||||
|
/* Compression format
|
||||||
|
*/
|
||||||
|
VipsForeignHeifCompression compression;
|
||||||
|
|
||||||
int page_width;
|
int page_width;
|
||||||
int page_height;
|
int page_height;
|
||||||
int n_pages;
|
int n_pages;
|
||||||
@ -81,7 +87,7 @@ typedef struct _VipsForeignSaveHeif {
|
|||||||
*/
|
*/
|
||||||
struct heif_image *img;
|
struct heif_image *img;
|
||||||
|
|
||||||
/* The libheif memory area will fill with pixels from the libvips
|
/* The libheif memory area we fill with pixels from the libvips
|
||||||
* pipe.
|
* pipe.
|
||||||
*/
|
*/
|
||||||
uint8_t *data;
|
uint8_t *data;
|
||||||
@ -293,12 +299,15 @@ vips_foreign_save_heif_build( VipsObject *object )
|
|||||||
build( object ) )
|
build( object ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
/* TODO ... should be a param? the other useful one is AVC.
|
|
||||||
*/
|
|
||||||
error = heif_context_get_encoder_for_format( heif->ctx,
|
error = heif_context_get_encoder_for_format( heif->ctx,
|
||||||
heif_compression_HEVC, &heif->encoder );
|
heif->compression, &heif->encoder );
|
||||||
if( error.code ) {
|
if( error.code ) {
|
||||||
vips__heif_error( &error );
|
if( error.code == heif_error_Unsupported_filetype )
|
||||||
|
vips_error( "heifsave",
|
||||||
|
"%s", _( "Unsupported compression" ) );
|
||||||
|
else
|
||||||
|
vips__heif_error( &error );
|
||||||
|
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,8 +331,8 @@ vips_foreign_save_heif_build( VipsObject *object )
|
|||||||
heif->page_height = vips_image_get_page_height( save->ready );
|
heif->page_height = vips_image_get_page_height( save->ready );
|
||||||
heif->n_pages = save->ready->Ysize / heif->page_height;
|
heif->n_pages = save->ready->Ysize / heif->page_height;
|
||||||
|
|
||||||
/* Make a heif image the size of a page. We repeatedly fill this with
|
/* Make a heif image the size of a page. We send sink_disc() output
|
||||||
* sink_disc() and write a frame each time it fills.
|
* here and write a frame each time it fills.
|
||||||
*/
|
*/
|
||||||
error = heif_image_create( heif->page_width, heif->page_height,
|
error = heif_image_create( heif->page_width, heif->page_height,
|
||||||
heif_colorspace_RGB, heif_chroma_interleaved_RGB, &heif->img );
|
heif_colorspace_RGB, heif_chroma_interleaved_RGB, &heif->img );
|
||||||
@ -378,7 +387,7 @@ vips_foreign_save_heif_class_init( VipsForeignSaveHeifClass *class )
|
|||||||
gobject_class->set_property = vips_object_set_property;
|
gobject_class->set_property = vips_object_set_property;
|
||||||
gobject_class->get_property = vips_object_get_property;
|
gobject_class->get_property = vips_object_get_property;
|
||||||
|
|
||||||
object_class->nickname = "heifsave";
|
object_class->nickname = "heifsave_base";
|
||||||
object_class->description = _( "save image in HEIF format" );
|
object_class->description = _( "save image in HEIF format" );
|
||||||
object_class->build = vips_foreign_save_heif_build;
|
object_class->build = vips_foreign_save_heif_build;
|
||||||
|
|
||||||
@ -401,6 +410,14 @@ vips_foreign_save_heif_class_init( VipsForeignSaveHeifClass *class )
|
|||||||
G_STRUCT_OFFSET( VipsForeignSaveHeif, lossless ),
|
G_STRUCT_OFFSET( VipsForeignSaveHeif, lossless ),
|
||||||
FALSE );
|
FALSE );
|
||||||
|
|
||||||
|
VIPS_ARG_ENUM( class, "compression", 14,
|
||||||
|
_( "compression" ),
|
||||||
|
_( "Compression format" ),
|
||||||
|
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||||
|
G_STRUCT_OFFSET( VipsForeignSaveHeif, compression ),
|
||||||
|
VIPS_TYPE_FOREIGN_HEIF_COMPRESSION,
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_HEVC );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -408,6 +425,7 @@ vips_foreign_save_heif_init( VipsForeignSaveHeif *heif )
|
|||||||
{
|
{
|
||||||
heif->ctx = heif_context_alloc();
|
heif->ctx = heif_context_alloc();
|
||||||
heif->Q = 50;
|
heif->Q = 50;
|
||||||
|
heif->compression = VIPS_FOREIGN_HEIF_COMPRESSION_HEVC;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct _VipsForeignSaveHeifFile {
|
typedef struct _VipsForeignSaveHeifFile {
|
||||||
@ -580,6 +598,7 @@ vips_foreign_save_heif_buffer_init( VipsForeignSaveHeifBuffer *buffer )
|
|||||||
*
|
*
|
||||||
* * @Q: %gint, quality factor
|
* * @Q: %gint, quality factor
|
||||||
* * @lossless: %gboolean, enable lossless encoding
|
* * @lossless: %gboolean, enable lossless encoding
|
||||||
|
* * @compression: #VipsForeignHeifCompression, write with this compression
|
||||||
*
|
*
|
||||||
* Write a VIPS image to a file in HEIF format.
|
* Write a VIPS image to a file in HEIF format.
|
||||||
*
|
*
|
||||||
@ -588,6 +607,8 @@ vips_foreign_save_heif_buffer_init( VipsForeignSaveHeifBuffer *buffer )
|
|||||||
*
|
*
|
||||||
* Set @lossless %TRUE to switch to lossless compression.
|
* Set @lossless %TRUE to switch to lossless compression.
|
||||||
*
|
*
|
||||||
|
* Use @compression to set the encoder e.g. HEVC, AVC, AV1
|
||||||
|
*
|
||||||
* See also: vips_image_write_to_file(), vips_heifload().
|
* See also: vips_image_write_to_file(), vips_heifload().
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -1 on error.
|
* Returns: 0 on success, -1 on error.
|
||||||
@ -616,6 +637,7 @@ vips_heifsave( VipsImage *in, const char *filename, ... )
|
|||||||
*
|
*
|
||||||
* * @Q: %gint, quality factor
|
* * @Q: %gint, quality factor
|
||||||
* * @lossless: %gboolean, enable lossless encoding
|
* * @lossless: %gboolean, enable lossless encoding
|
||||||
|
* * @compression: #VipsForeignHeifCompression, write with this compression
|
||||||
*
|
*
|
||||||
* As vips_heifsave(), but save to a memory buffer.
|
* As vips_heifsave(), but save to a memory buffer.
|
||||||
*
|
*
|
||||||
|
@ -14,6 +14,9 @@
|
|||||||
* - handle scaling of svg files missing width and height attributes
|
* - handle scaling of svg files missing width and height attributes
|
||||||
* 22/3/18 lovell
|
* 22/3/18 lovell
|
||||||
* - svgload was missing is_a
|
* - svgload was missing is_a
|
||||||
|
* 28/6/19
|
||||||
|
* - add "unlimited"
|
||||||
|
* - requires us to use the gio API to librsvg
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -107,6 +110,10 @@ typedef struct _VipsForeignLoadSvg {
|
|||||||
*/
|
*/
|
||||||
double cairo_scale;
|
double cairo_scale;
|
||||||
|
|
||||||
|
/* Allow SVGs of any size.
|
||||||
|
*/
|
||||||
|
gboolean unlimited;
|
||||||
|
|
||||||
RsvgHandle *page;
|
RsvgHandle *page;
|
||||||
|
|
||||||
} VipsForeignLoadSvg;
|
} VipsForeignLoadSvg;
|
||||||
@ -440,6 +447,13 @@ vips_foreign_load_svg_class_init( VipsForeignLoadSvgClass *class )
|
|||||||
G_STRUCT_OFFSET( VipsForeignLoadSvg, scale ),
|
G_STRUCT_OFFSET( VipsForeignLoadSvg, scale ),
|
||||||
0.001, 100000.0, 1.0 );
|
0.001, 100000.0, 1.0 );
|
||||||
|
|
||||||
|
VIPS_ARG_BOOL( class, "unlimited", 23,
|
||||||
|
_( "Unlimited" ),
|
||||||
|
_( "Allow SVG of any size" ),
|
||||||
|
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||||
|
G_STRUCT_OFFSET( VipsForeignLoadSvg, unlimited ),
|
||||||
|
FALSE );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -480,14 +494,20 @@ vips_foreign_load_svg_file_header( VipsForeignLoad *load )
|
|||||||
{
|
{
|
||||||
VipsForeignLoadSvg *svg = (VipsForeignLoadSvg *) load;
|
VipsForeignLoadSvg *svg = (VipsForeignLoadSvg *) load;
|
||||||
VipsForeignLoadSvgFile *file = (VipsForeignLoadSvgFile *) load;
|
VipsForeignLoadSvgFile *file = (VipsForeignLoadSvgFile *) load;
|
||||||
|
RsvgHandleFlags flags = svg->unlimited ? RSVG_HANDLE_FLAG_UNLIMITED : 0;
|
||||||
|
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
if( !(svg->page = rsvg_handle_new_from_file(
|
GFile *gfile;
|
||||||
file->filename, &error )) ) {
|
|
||||||
|
gfile = g_file_new_for_path( file->filename );
|
||||||
|
if( !(svg->page = rsvg_handle_new_from_gfile_sync(
|
||||||
|
gfile, flags, NULL, &error )) ) {
|
||||||
|
g_object_unref( gfile );
|
||||||
vips_g_error( &error );
|
vips_g_error( &error );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
g_object_unref( gfile );
|
||||||
|
|
||||||
VIPS_SETSTR( load->out->filename, file->filename );
|
VIPS_SETSTR( load->out->filename, file->filename );
|
||||||
|
|
||||||
@ -558,14 +578,21 @@ vips_foreign_load_svg_buffer_header( VipsForeignLoad *load )
|
|||||||
VipsForeignLoadSvg *svg = (VipsForeignLoadSvg *) load;
|
VipsForeignLoadSvg *svg = (VipsForeignLoadSvg *) load;
|
||||||
VipsForeignLoadSvgBuffer *buffer =
|
VipsForeignLoadSvgBuffer *buffer =
|
||||||
(VipsForeignLoadSvgBuffer *) load;
|
(VipsForeignLoadSvgBuffer *) load;
|
||||||
|
RsvgHandleFlags flags = svg->unlimited ? RSVG_HANDLE_FLAG_UNLIMITED : 0;
|
||||||
|
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
if( !(svg->page = rsvg_handle_new_from_data(
|
GInputStream *gstream;
|
||||||
buffer->buf->data, buffer->buf->length, &error )) ) {
|
|
||||||
|
gstream = g_memory_input_stream_new_from_data(
|
||||||
|
buffer->buf->data, buffer->buf->length, NULL );
|
||||||
|
if( !(svg->page = rsvg_handle_new_from_stream_sync(
|
||||||
|
gstream, NULL, flags, NULL, &error )) ) {
|
||||||
|
g_object_unref( gstream );
|
||||||
vips_g_error( &error );
|
vips_g_error( &error );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
g_object_unref( gstream );
|
||||||
|
|
||||||
return( vips_foreign_load_svg_header( load ) );
|
return( vips_foreign_load_svg_header( load ) );
|
||||||
}
|
}
|
||||||
@ -612,6 +639,7 @@ vips_foreign_load_svg_buffer_init( VipsForeignLoadSvgBuffer *buffer )
|
|||||||
*
|
*
|
||||||
* * @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
|
||||||
|
* * @unlimited: %gboolean, allow SVGs of any size
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
@ -622,6 +650,9 @@ vips_foreign_load_svg_buffer_init( VipsForeignLoadSvgBuffer *buffer )
|
|||||||
* This function only reads the image header and does not render any pixel
|
* This function only reads the image header and does not render any pixel
|
||||||
* data. Rendering occurs when pixels are accessed.
|
* data. Rendering occurs when pixels are accessed.
|
||||||
*
|
*
|
||||||
|
* SVGs larger than 10MB are normally blocked for security. Set @unlimited to
|
||||||
|
* allow SVGs of any size.
|
||||||
|
*
|
||||||
* See also: vips_image_new_from_file().
|
* See also: vips_image_new_from_file().
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -1 on error.
|
* Returns: 0 on success, -1 on error.
|
||||||
@ -650,6 +681,7 @@ vips_svgload( const char *filename, VipsImage **out, ... )
|
|||||||
*
|
*
|
||||||
* * @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
|
||||||
|
* * @unlimited: %gboolean, allow SVGs of any size
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
|
@ -254,6 +254,7 @@ typedef struct _RtiffHeader {
|
|||||||
gboolean separate;
|
gboolean separate;
|
||||||
int orientation;
|
int orientation;
|
||||||
gboolean premultiplied;
|
gboolean premultiplied;
|
||||||
|
uint16 compression;
|
||||||
|
|
||||||
/* Result of TIFFIsTiled().
|
/* Result of TIFFIsTiled().
|
||||||
*/
|
*/
|
||||||
@ -1331,9 +1332,12 @@ rtiff_set_header( Rtiff *rtiff, VipsImage *out )
|
|||||||
uint32 data_length;
|
uint32 data_length;
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
/* Request YCbCr expansion.
|
/* Request YCbCr expansion. libtiff complains if you do this for
|
||||||
|
* non-jpg images.
|
||||||
*/
|
*/
|
||||||
TIFFSetField( rtiff->tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB );
|
if( rtiff->header.compression == COMPRESSION_JPEG )
|
||||||
|
TIFFSetField( rtiff->tiff,
|
||||||
|
TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB );
|
||||||
|
|
||||||
out->Xsize = rtiff->header.width;
|
out->Xsize = rtiff->header.width;
|
||||||
out->Ysize = rtiff->header.height * rtiff->n;
|
out->Ysize = rtiff->header.height * rtiff->n;
|
||||||
@ -2074,7 +2078,6 @@ rtiff_header_read( Rtiff *rtiff, RtiffHeader *header )
|
|||||||
{
|
{
|
||||||
uint16 extra_samples_count;
|
uint16 extra_samples_count;
|
||||||
uint16 *extra_samples_types;
|
uint16 *extra_samples_types;
|
||||||
uint16 compression;
|
|
||||||
|
|
||||||
if( !tfget32( rtiff->tiff, TIFFTAG_IMAGEWIDTH, &header->width ) ||
|
if( !tfget32( rtiff->tiff, TIFFTAG_IMAGEWIDTH, &header->width ) ||
|
||||||
!tfget32( rtiff->tiff, TIFFTAG_IMAGELENGTH, &header->height ) ||
|
!tfget32( rtiff->tiff, TIFFTAG_IMAGELENGTH, &header->height ) ||
|
||||||
@ -2088,8 +2091,8 @@ rtiff_header_read( Rtiff *rtiff, RtiffHeader *header )
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
TIFFGetFieldDefaulted( rtiff->tiff,
|
TIFFGetFieldDefaulted( rtiff->tiff,
|
||||||
TIFFTAG_COMPRESSION, &compression );
|
TIFFTAG_COMPRESSION, &header->compression );
|
||||||
if( compression == COMPRESSION_JPEG )
|
if( header->compression == COMPRESSION_JPEG )
|
||||||
/* We want to always expand subsampled YCBCR images to full
|
/* We want to always expand subsampled YCBCR images to full
|
||||||
* RGB.
|
* RGB.
|
||||||
*/
|
*/
|
||||||
|
@ -186,7 +186,7 @@ vips_webp_write_init( VipsWebPWrite *write, VipsImage *image,
|
|||||||
if( near_lossless )
|
if( near_lossless )
|
||||||
write->config.near_lossless = Q;
|
write->config.near_lossless = Q;
|
||||||
if( smart_subsample )
|
if( smart_subsample )
|
||||||
write->config.preprocessing |= 4;
|
write->config.use_sharp_yuv = 1;
|
||||||
|
|
||||||
if( !WebPValidateConfig( &write->config ) ) {
|
if( !WebPValidateConfig( &write->config ) ) {
|
||||||
vips_webp_write_unset( write );
|
vips_webp_write_unset( write );
|
||||||
|
@ -74,6 +74,8 @@ GType vips_foreign_dz_depth_get_type (void) G_GNUC_CONST;
|
|||||||
#define VIPS_TYPE_FOREIGN_DZ_DEPTH (vips_foreign_dz_depth_get_type())
|
#define VIPS_TYPE_FOREIGN_DZ_DEPTH (vips_foreign_dz_depth_get_type())
|
||||||
GType vips_foreign_dz_container_get_type (void) G_GNUC_CONST;
|
GType vips_foreign_dz_container_get_type (void) G_GNUC_CONST;
|
||||||
#define VIPS_TYPE_FOREIGN_DZ_CONTAINER (vips_foreign_dz_container_get_type())
|
#define VIPS_TYPE_FOREIGN_DZ_CONTAINER (vips_foreign_dz_container_get_type())
|
||||||
|
GType vips_foreign_heif_compression_get_type (void) G_GNUC_CONST;
|
||||||
|
#define VIPS_TYPE_FOREIGN_HEIF_COMPRESSION (vips_foreign_heif_compression_get_type())
|
||||||
/* enumerations from "../../../libvips/include/vips/image.h" */
|
/* enumerations from "../../../libvips/include/vips/image.h" */
|
||||||
GType vips_demand_style_get_type (void) G_GNUC_CONST;
|
GType vips_demand_style_get_type (void) G_GNUC_CONST;
|
||||||
#define VIPS_TYPE_DEMAND_STYLE (vips_demand_style_get_type())
|
#define VIPS_TYPE_DEMAND_STYLE (vips_demand_style_get_type())
|
||||||
|
@ -623,6 +623,23 @@ typedef enum {
|
|||||||
int vips_dzsave( VipsImage *in, const char *name, ... )
|
int vips_dzsave( VipsImage *in, const char *name, ... )
|
||||||
__attribute__((sentinel));
|
__attribute__((sentinel));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VipsForeignHeifCompression:
|
||||||
|
* @VIPS_FOREIGN_HEIF_COMPRESSION_HEVC: x265
|
||||||
|
* @VIPS_FOREIGN_HEIF_COMPRESSION_AVC: x264
|
||||||
|
* @VIPS_FOREIGN_HEIF_COMPRESSION_JPEG: jpeg
|
||||||
|
* @VIPS_FOREIGN_HEIF_COMPRESSION_AV1: aom
|
||||||
|
*
|
||||||
|
* The compression format to use inside a HEIF container.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_HEVC = 1,
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_AVC = 2,
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_JPEG = 3,
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_AV1 = 4,
|
||||||
|
VIPS_FOREIGN_HEIF_COMPRESSION_LAST
|
||||||
|
} VipsForeignHeifCompression;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /*__cplusplus*/
|
#endif /*__cplusplus*/
|
||||||
|
@ -657,6 +657,26 @@ vips_foreign_dz_container_get_type( void )
|
|||||||
|
|
||||||
return( etype );
|
return( etype );
|
||||||
}
|
}
|
||||||
|
GType
|
||||||
|
vips_foreign_heif_compression_get_type( void )
|
||||||
|
{
|
||||||
|
static GType etype = 0;
|
||||||
|
|
||||||
|
if( etype == 0 ) {
|
||||||
|
static const GEnumValue values[] = {
|
||||||
|
{VIPS_FOREIGN_HEIF_COMPRESSION_HEVC, "VIPS_FOREIGN_HEIF_COMPRESSION_HEVC", "hevc"},
|
||||||
|
{VIPS_FOREIGN_HEIF_COMPRESSION_AVC, "VIPS_FOREIGN_HEIF_COMPRESSION_AVC", "avc"},
|
||||||
|
{VIPS_FOREIGN_HEIF_COMPRESSION_JPEG, "VIPS_FOREIGN_HEIF_COMPRESSION_JPEG", "jpeg"},
|
||||||
|
{VIPS_FOREIGN_HEIF_COMPRESSION_AV1, "VIPS_FOREIGN_HEIF_COMPRESSION_AV1", "av1"},
|
||||||
|
{VIPS_FOREIGN_HEIF_COMPRESSION_LAST, "VIPS_FOREIGN_HEIF_COMPRESSION_LAST", "last"},
|
||||||
|
{0, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
etype = g_enum_register_static( "VipsForeignHeifCompression", values );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( etype );
|
||||||
|
}
|
||||||
/* enumerations from "../../libvips/include/vips/image.h" */
|
/* enumerations from "../../libvips/include/vips/image.h" */
|
||||||
GType
|
GType
|
||||||
vips_demand_style_get_type( void )
|
vips_demand_style_get_type( void )
|
||||||
|
Loading…
Reference in New Issue
Block a user