Skip to content

tell buffer and target savers the file format #2499

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 22 commits into from
Oct 28, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
- added restart_interval option to jpegsave [manthey]
- add IIIF3 support to dzsaave [martimpassos]
- add atan2 [indus]
- improve buffer and target save file format selection
- added VipsForeignPpmFormat, @format arg to ppm savers

16/8/21 started 8.11.4
- fix off-by-one error in new rank fast path
Expand Down
13 changes: 13 additions & 0 deletions libvips/foreign/foreign.c
Original file line number Diff line number Diff line change
Expand Up @@ -1795,6 +1795,7 @@ vips_foreign_save_class_init( VipsForeignSaveClass *class )
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsForeignSave, page_height ),
0, VIPS_MAX_COORD, 0 );

}

static void
Expand Down Expand Up @@ -2782,7 +2783,10 @@ vips_foreign_operation_init( void )
extern GType vips_foreign_load_ppm_file_get_type( void );
extern GType vips_foreign_load_ppm_source_get_type( void );
extern GType vips_foreign_save_ppm_file_get_type( void );
extern GType vips_foreign_save_pbm_target_get_type( void );
extern GType vips_foreign_save_pgm_target_get_type( void );
extern GType vips_foreign_save_ppm_target_get_type( void );
extern GType vips_foreign_save_pfm_target_get_type( void );

extern GType vips_foreign_load_png_file_get_type( void );
extern GType vips_foreign_load_png_buffer_get_type( void );
Expand Down Expand Up @@ -2841,7 +2845,9 @@ vips_foreign_operation_init( void )
extern GType vips_foreign_load_magick7_file_get_type( void );
extern GType vips_foreign_load_magick7_buffer_get_type( void );
extern GType vips_foreign_save_magick_file_get_type( void );
extern GType vips_foreign_save_magick_bmp_file_get_type( void );
extern GType vips_foreign_save_magick_buffer_get_type( void );
extern GType vips_foreign_save_magick_bmp_buffer_get_type( void );

extern GType vips_foreign_save_dz_file_get_type( void );
extern GType vips_foreign_save_dz_buffer_get_type( void );
Expand Down Expand Up @@ -2881,6 +2887,7 @@ vips_foreign_operation_init( void )
extern GType vips_foreign_save_heif_file_get_type( void );
extern GType vips_foreign_save_heif_buffer_get_type( void );
extern GType vips_foreign_save_heif_target_get_type( void );
extern GType vips_foreign_save_avif_target_get_type( void );

extern GType vips_foreign_load_nifti_file_get_type( void );
extern GType vips_foreign_load_nifti_source_get_type( void );
Expand Down Expand Up @@ -2922,7 +2929,10 @@ vips_foreign_operation_init( void )
vips_foreign_load_ppm_file_get_type();
vips_foreign_load_ppm_source_get_type();
vips_foreign_save_ppm_file_get_type();
vips_foreign_save_pbm_target_get_type();
vips_foreign_save_pgm_target_get_type();
vips_foreign_save_ppm_target_get_type();
vips_foreign_save_pfm_target_get_type();
#endif /*HAVE_PPM*/

#ifdef HAVE_RADIANCE
Expand Down Expand Up @@ -3052,7 +3062,9 @@ vips_foreign_operation_init( void )

#if defined(ENABLE_MAGICKSAVE) && !defined(MAGICK_MODULE)
vips_foreign_save_magick_file_get_type();
vips_foreign_save_magick_bmp_file_get_type();
vips_foreign_save_magick_buffer_get_type();
vips_foreign_save_magick_bmp_buffer_get_type();
#endif /*defined(ENABLE_MAGICKSAVE) && !defined(MAGICK_MODULE)*/

#ifdef HAVE_CFITSIO
Expand Down Expand Up @@ -3081,6 +3093,7 @@ vips_foreign_operation_init( void )
vips_foreign_save_heif_file_get_type();
vips_foreign_save_heif_buffer_get_type();
vips_foreign_save_heif_target_get_type();
vips_foreign_save_avif_target_get_type();
#endif /*defined(HAVE_HEIF_ENCODER) && !defined(HEIF_MODULE)*/

vips__foreign_load_operation =
Expand Down
11 changes: 11 additions & 0 deletions libvips/foreign/heifload.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,17 @@

#include "pforeign.h"

const char *vips__heic_suffs[] = {
".heic",
".heif",
NULL
};

const char *vips__avif_suffs[] = {
".avif",
NULL
};

const char *vips__heif_suffs[] = {
".heic",
".heif",
Expand Down
57 changes: 44 additions & 13 deletions libvips/foreign/heifsave.c
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,6 @@ vips_foreign_save_heif_build( VipsObject *object )
VipsForeignSave *save = (VipsForeignSave *) object;
VipsForeignSaveHeif *heif = (VipsForeignSaveHeif *) object;

const char *filename;
struct heif_error error;
struct heif_writer writer;
char *chroma;
Expand All @@ -357,15 +356,6 @@ vips_foreign_save_heif_build( VipsObject *object )
if( vips_copy( save->ready, &heif->image, NULL ) )
return( -1 );

/* Compression defaults to VIPS_FOREIGN_HEIF_COMPRESSION_AV1 for .avif
* suffix.
*/
filename = vips_connection_filename( VIPS_CONNECTION( heif->target ) );
if( !vips_object_argument_isset( object, "compression" ) &&
filename &&
vips_iscasepostfix( filename, ".avif" ) )
heif->compression = VIPS_FOREIGN_HEIF_COMPRESSION_AV1;

error = heif_context_get_encoder_for_format( heif->ctx,
(enum heif_compression_format) heif->compression,
&heif->encoder );
Expand Down Expand Up @@ -489,7 +479,6 @@ vips_foreign_save_heif_class_init( VipsForeignSaveHeifClass *class )
{
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsForeignClass *foreign_class = (VipsForeignClass *) class;
VipsForeignSaveClass *save_class = (VipsForeignSaveClass *) class;

gobject_class->dispose = vips_foreign_save_heif_dispose;
Expand All @@ -500,8 +489,6 @@ vips_foreign_save_heif_class_init( VipsForeignSaveHeifClass *class )
object_class->description = _( "save image in HEIF format" );
object_class->build = vips_foreign_save_heif_build;

foreign_class->suffs = vips__heif_suffs;

save_class->saveable = VIPS_SAVEABLE_RGBA_ONLY;
save_class->format_table = vips_heif_bandfmt;

Expand Down Expand Up @@ -588,6 +575,9 @@ vips_foreign_save_heif_file_build( VipsObject *object )
if( !(heif->target = vips_target_new_to_file( file->filename )) )
return( -1 );

if( vips_iscasepostfix( file->filename, ".avif" ) )
heif->compression = VIPS_FOREIGN_HEIF_COMPRESSION_AV1;

if( VIPS_OBJECT_CLASS( vips_foreign_save_heif_file_parent_class )->
build( object ) )
return( -1 );
Expand All @@ -600,13 +590,16 @@ vips_foreign_save_heif_file_class_init( VipsForeignSaveHeifFileClass *class )
{
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsForeignClass *foreign_class = (VipsForeignClass *) class;

gobject_class->set_property = vips_object_set_property;
gobject_class->get_property = vips_object_get_property;

object_class->nickname = "heifsave";
object_class->build = vips_foreign_save_heif_file_build;

foreign_class->suffs = vips__heif_suffs;

VIPS_ARG_STRING( class, "filename", 1,
_( "Filename" ),
_( "Filename to save to" ),
Expand Down Expand Up @@ -664,13 +657,16 @@ vips_foreign_save_heif_buffer_class_init(
{
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsForeignClass *foreign_class = (VipsForeignClass *) class;

gobject_class->set_property = vips_object_set_property;
gobject_class->get_property = vips_object_get_property;

object_class->nickname = "heifsave_buffer";
object_class->build = vips_foreign_save_heif_buffer_build;

foreign_class->suffs = vips__heic_suffs;

VIPS_ARG_BOXED( class, "buffer", 1,
_( "Buffer" ),
_( "Buffer to save to" ),
Expand Down Expand Up @@ -721,13 +717,16 @@ vips_foreign_save_heif_target_class_init(
{
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsForeignClass *foreign_class = (VipsForeignClass *) class;

gobject_class->set_property = vips_object_set_property;
gobject_class->get_property = vips_object_get_property;

object_class->nickname = "heifsave_target";
object_class->build = vips_foreign_save_heif_target_build;

foreign_class->suffs = vips__heic_suffs;

VIPS_ARG_OBJECT( class, "target", 1,
_( "Target" ),
_( "Target to save to" ),
Expand All @@ -742,6 +741,38 @@ vips_foreign_save_heif_target_init( VipsForeignSaveHeifTarget *target )
{
}

typedef VipsForeignSaveHeifTarget VipsForeignSaveAvifTarget;
typedef VipsForeignSaveHeifTargetClass VipsForeignSaveAvifTargetClass;

G_DEFINE_TYPE( VipsForeignSaveAvifTarget, vips_foreign_save_avif_target,
vips_foreign_save_heif_target_get_type() );

static void
vips_foreign_save_avif_target_class_init(
VipsForeignSaveAvifTargetClass *class )
{
VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsForeignClass *foreign_class = (VipsForeignClass *) class;
VipsOperationClass *operation_class = (VipsOperationClass *) class;

object_class->nickname = "avifsave_target";
object_class->description = _( "save image in AVIF format" );

foreign_class->suffs = vips__avif_suffs;

/* Hide from UI.
*/
operation_class->flags = VIPS_OPERATION_DEPRECATED;
}

static void
vips_foreign_save_avif_target_init( VipsForeignSaveAvifTarget *target )
{
VipsForeignSaveHeif *heif = (VipsForeignSaveHeif *) target;

heif->compression = VIPS_FOREIGN_HEIF_COMPRESSION_AV1;
}

#endif /*HAVE_HEIF_ENCODER*/

/* The C API wrappers are defined in foreign.c.
Expand Down
6 changes: 6 additions & 0 deletions libvips/foreign/pforeign.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,10 @@ int vips__mat_header( const char *filename, VipsImage *out );
int vips__mat_ismat( const char *filename );

extern const char *vips__ppm_suffs[];
extern const char *vips__save_pbm_suffs[];
extern const char *vips__save_pgm_suffs[];
extern const char *vips__save_ppm_suffs[];
extern const char *vips__save_pfm_suffs[];

int vips__ppm_save_target( VipsImage *in, VipsTarget *target,
gboolean ascii, gboolean squash );
Expand Down Expand Up @@ -235,6 +239,8 @@ typedef void *(*VipsNiftiMapFn)( const char *name, GValue *value, glong offset,
void *a, void *b );
void *vips__foreign_nifti_map( VipsNiftiMapFn fn, void *a, void *b );

extern const char *vips__heic_suffs[];
extern const char *vips__avif_suffs[];
extern const char *vips__heif_suffs[];

extern const char *vips__jp2k_suffs[];
Expand Down
6 changes: 5 additions & 1 deletion libvips/foreign/ppmload.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,11 @@ static char *magic_names[] = {

/* Shared with ppmsave.
*/
const char *vips__ppm_suffs[] = { ".ppm", ".pgm", ".pbm", ".pfm", NULL };
const char *vips__ppm_suffs[] = { ".pbm", ".pgm", ".ppm", ".pfm", NULL };
const char *vips__save_pbm_suffs[] = { ".pbm", NULL };
const char *vips__save_pgm_suffs[] = { ".pgm", NULL };
const char *vips__save_ppm_suffs[] = { ".ppm", NULL };
const char *vips__save_pfm_suffs[] = { ".pfm", NULL };

static gboolean
vips_foreign_load_ppm_is_a_source( VipsSource *source )
Expand Down
Loading