Merge remote-tracking branch 'origin/7.30'
This commit is contained in:
commit
31f3f8681a
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,5 @@
|
|||||||
vips-*.tar.gz
|
vips-*.tar.gz
|
||||||
|
gtk-doc.make
|
||||||
libvips-scan
|
libvips-scan
|
||||||
libvips-scan.c
|
libvips-scan.c
|
||||||
Makefile.in
|
Makefile.in
|
||||||
|
@ -6,6 +6,9 @@
|
|||||||
- so affinei and affinei_all appear in Python
|
- so affinei and affinei_all appear in Python
|
||||||
- be more cautious enabling YCbCr mode in tiff write
|
- be more cautious enabling YCbCr mode in tiff write
|
||||||
- add "DEPRECATED" flag to arguments
|
- add "DEPRECATED" flag to arguments
|
||||||
|
- jpeg load/save note and use the preferred resolution unit
|
||||||
|
- better error msgs for enum args
|
||||||
|
- test for gtk-doc in bootstrap
|
||||||
|
|
||||||
20/7/12 started 7.30.0
|
20/7/12 started 7.30.0
|
||||||
- support "rs" mode in vips7
|
- support "rs" mode in vips7
|
||||||
|
7
TODO
7
TODO
@ -1,3 +1,10 @@
|
|||||||
|
carrierwave-vips-benchmark seems to fail for 200x200 images with a non-seq
|
||||||
|
error
|
||||||
|
|
||||||
|
see also the gist comparing oil and vips
|
||||||
|
|
||||||
|
stop compile warnings for production build
|
||||||
|
|
||||||
blocking bugs
|
blocking bugs
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
@ -28,7 +28,13 @@ cp $ACDIR/lcmessage.m4 m4
|
|||||||
cp $ACDIR/progtest.m4 m4
|
cp $ACDIR/progtest.m4 m4
|
||||||
cp $ACDIR/introspection.m4 m4
|
cp $ACDIR/introspection.m4 m4
|
||||||
|
|
||||||
gtkdocize --copy --docdir doc/reference --flavour no-tmpl || exit 1
|
# some systems struggle to install gtk-doc ... test for it first
|
||||||
|
if gtkdocize --version >/dev/null 2>&1; then
|
||||||
|
echo setting up gtk-doc ...
|
||||||
|
gtkdocize --copy --docdir doc/reference --flavour no-tmpl
|
||||||
|
else
|
||||||
|
echo no gtk-doc found -- disabling
|
||||||
|
fi
|
||||||
|
|
||||||
# some systems need libtoolize, some glibtoolize ... how annoying
|
# some systems need libtoolize, some glibtoolize ... how annoying
|
||||||
echo testing for glibtoolize ...
|
echo testing for glibtoolize ...
|
||||||
|
177
gtk-doc.make
177
gtk-doc.make
@ -1,177 +0,0 @@
|
|||||||
# -*- mode: makefile -*-
|
|
||||||
|
|
||||||
####################################
|
|
||||||
# Everything below here is generic #
|
|
||||||
####################################
|
|
||||||
|
|
||||||
if GTK_DOC_USE_LIBTOOL
|
|
||||||
GTKDOC_CC = $(LIBTOOL) --mode=compile $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
|
||||||
GTKDOC_LD = $(LIBTOOL) --mode=link $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
|
|
||||||
GTKDOC_RUN = $(LIBTOOL) --mode=execute
|
|
||||||
else
|
|
||||||
GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
|
||||||
GTKDOC_LD = $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
|
|
||||||
GTKDOC_RUN = sh -c
|
|
||||||
endif
|
|
||||||
|
|
||||||
# We set GPATH here; this gives us semantics for GNU make
|
|
||||||
# which are more like other make's VPATH, when it comes to
|
|
||||||
# whether a source that is a target of one rule is then
|
|
||||||
# searched for in VPATH/GPATH.
|
|
||||||
#
|
|
||||||
GPATH = $(srcdir)
|
|
||||||
|
|
||||||
TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
$(content_files) \
|
|
||||||
$(HTML_IMAGES) \
|
|
||||||
$(DOC_MAIN_SGML_FILE) \
|
|
||||||
$(DOC_MODULE)-sections.txt \
|
|
||||||
$(DOC_MODULE)-overrides.txt
|
|
||||||
|
|
||||||
DOC_STAMPS=scan-build.stamp sgml-build.stamp html-build.stamp \
|
|
||||||
$(srcdir)/sgml.stamp $(srcdir)/html.stamp
|
|
||||||
|
|
||||||
SCANOBJ_FILES = \
|
|
||||||
$(DOC_MODULE).args \
|
|
||||||
$(DOC_MODULE).hierarchy \
|
|
||||||
$(DOC_MODULE).interfaces \
|
|
||||||
$(DOC_MODULE).prerequisites \
|
|
||||||
$(DOC_MODULE).signals
|
|
||||||
|
|
||||||
REPORT_FILES = \
|
|
||||||
$(DOC_MODULE)-undocumented.txt \
|
|
||||||
$(DOC_MODULE)-undeclared.txt \
|
|
||||||
$(DOC_MODULE)-unused.txt
|
|
||||||
|
|
||||||
CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS)
|
|
||||||
|
|
||||||
if ENABLE_GTK_DOC
|
|
||||||
all-local: html-build.stamp
|
|
||||||
else
|
|
||||||
all-local:
|
|
||||||
endif
|
|
||||||
|
|
||||||
docs: html-build.stamp
|
|
||||||
|
|
||||||
$(REPORT_FILES): sgml-build.stamp
|
|
||||||
|
|
||||||
#### scan ####
|
|
||||||
|
|
||||||
scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
|
|
||||||
@echo 'gtk-doc: Scanning header files'
|
|
||||||
@-chmod -R u+w $(srcdir)
|
|
||||||
cd $(srcdir) && \
|
|
||||||
gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES)
|
|
||||||
if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \
|
|
||||||
CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \
|
|
||||||
else \
|
|
||||||
cd $(srcdir) ; \
|
|
||||||
for i in $(SCANOBJ_FILES) ; do \
|
|
||||||
test -f $$i || touch $$i ; \
|
|
||||||
done \
|
|
||||||
fi
|
|
||||||
touch scan-build.stamp
|
|
||||||
|
|
||||||
$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
|
|
||||||
@true
|
|
||||||
|
|
||||||
#### xml ####
|
|
||||||
|
|
||||||
sgml-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
|
|
||||||
@echo 'gtk-doc: Building XML'
|
|
||||||
@-chmod -R u+w $(srcdir)
|
|
||||||
cd $(srcdir) && \
|
|
||||||
gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $(MKDB_OPTIONS)
|
|
||||||
touch sgml-build.stamp
|
|
||||||
|
|
||||||
sgml.stamp: sgml-build.stamp
|
|
||||||
@true
|
|
||||||
|
|
||||||
#### html ####
|
|
||||||
|
|
||||||
html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
|
|
||||||
@echo 'gtk-doc: Building HTML'
|
|
||||||
@-chmod -R u+w $(srcdir)
|
|
||||||
rm -rf $(srcdir)/html
|
|
||||||
mkdir $(srcdir)/html
|
|
||||||
mkhtml_options=""; \
|
|
||||||
gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \
|
|
||||||
if test "$(?)" = "0"; then \
|
|
||||||
mkhtml_options=--path="$(srcdir)"; \
|
|
||||||
fi
|
|
||||||
cd $(srcdir)/html && gtkdoc-mkhtml $(mkhtml_options) $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
|
|
||||||
test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html )
|
|
||||||
@echo 'gtk-doc: Fixing cross-references'
|
|
||||||
cd $(srcdir) && gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
|
|
||||||
touch html-build.stamp
|
|
||||||
|
|
||||||
##############
|
|
||||||
|
|
||||||
clean-local:
|
|
||||||
rm -f *~ *.bak
|
|
||||||
rm -rf .libs
|
|
||||||
|
|
||||||
distclean-local:
|
|
||||||
cd $(srcdir) && \
|
|
||||||
rm -rf xml $(REPORT_FILES) \
|
|
||||||
$(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
|
|
||||||
|
|
||||||
maintainer-clean-local: clean
|
|
||||||
cd $(srcdir) && rm -rf html
|
|
||||||
|
|
||||||
install-data-local:
|
|
||||||
installfiles=`echo $(srcdir)/html/*`; \
|
|
||||||
if test "$$installfiles" = '$(srcdir)/html/*'; \
|
|
||||||
then echo '-- Nothing to install' ; \
|
|
||||||
else \
|
|
||||||
if test -n "$(DOC_MODULE_VERSION)"; then \
|
|
||||||
installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
|
|
||||||
else \
|
|
||||||
installdir="$(DESTDIR)$(TARGET_DIR)"; \
|
|
||||||
fi; \
|
|
||||||
$(mkinstalldirs) $${installdir} ; \
|
|
||||||
for i in $$installfiles; do \
|
|
||||||
echo '-- Installing '$$i ; \
|
|
||||||
$(INSTALL_DATA) $$i $${installdir}; \
|
|
||||||
done; \
|
|
||||||
if test -n "$(DOC_MODULE_VERSION)"; then \
|
|
||||||
mv -f $${installdir}/$(DOC_MODULE).devhelp2 \
|
|
||||||
$${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \
|
|
||||||
mv -f $${installdir}/$(DOC_MODULE).devhelp \
|
|
||||||
$${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp; \
|
|
||||||
fi; \
|
|
||||||
! which gtkdoc-rebase >/dev/null 2>&1 || \
|
|
||||||
gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir} ; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
uninstall-local:
|
|
||||||
if test -n "$(DOC_MODULE_VERSION)"; then \
|
|
||||||
installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
|
|
||||||
else \
|
|
||||||
installdir="$(DESTDIR)$(TARGET_DIR)"; \
|
|
||||||
fi; \
|
|
||||||
rm -rf $${installdir}
|
|
||||||
|
|
||||||
#
|
|
||||||
# Require gtk-doc when making dist
|
|
||||||
#
|
|
||||||
if ENABLE_GTK_DOC
|
|
||||||
dist-check-gtkdoc:
|
|
||||||
else
|
|
||||||
dist-check-gtkdoc:
|
|
||||||
@echo "*** gtk-doc must be installed and enabled in order to make dist"
|
|
||||||
@false
|
|
||||||
endif
|
|
||||||
|
|
||||||
dist-hook: dist-check-gtkdoc dist-hook-local
|
|
||||||
mkdir $(distdir)/html
|
|
||||||
cp $(srcdir)/html/* $(distdir)/html
|
|
||||||
-cp $(srcdir)/$(DOC_MODULE).types $(distdir)/
|
|
||||||
-cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/
|
|
||||||
cd $(distdir) && rm -f $(DISTCLEANFILES)
|
|
||||||
! which gtkdoc-rebase >/dev/null 2>&1 || \
|
|
||||||
gtkdoc-rebase --online --relative --html-dir=$(distdir)/html
|
|
||||||
|
|
||||||
.PHONY : dist-hook-local docs
|
|
@ -7,6 +7,8 @@
|
|||||||
* - from VipsForeignLoad
|
* - from VipsForeignLoad
|
||||||
* 14/7/12
|
* 14/7/12
|
||||||
* - support skip forwards as well, so we can do extract/insert
|
* - support skip forwards as well, so we can do extract/insert
|
||||||
|
* 10/8/12
|
||||||
|
* - add @trace option
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -60,6 +62,7 @@ typedef struct _VipsSequential {
|
|||||||
VipsImage *in;
|
VipsImage *in;
|
||||||
|
|
||||||
int y_pos;
|
int y_pos;
|
||||||
|
gboolean trace;
|
||||||
} VipsSequential;
|
} VipsSequential;
|
||||||
|
|
||||||
typedef VipsConversionClass VipsSequentialClass;
|
typedef VipsConversionClass VipsSequentialClass;
|
||||||
@ -74,14 +77,15 @@ vips_sequential_generate( VipsRegion *or,
|
|||||||
VipsRect *r = &or->valid;
|
VipsRect *r = &or->valid;
|
||||||
VipsRegion *ir = (VipsRegion *) seq;
|
VipsRegion *ir = (VipsRegion *) seq;
|
||||||
|
|
||||||
VIPS_DEBUG_MSG( "vips_sequential_generate %d\n", r->top );
|
if( sequential->trace )
|
||||||
|
vips_diag( "VipsSequential",
|
||||||
|
"%d lines, starting at line %d", r->height, r->top );
|
||||||
|
|
||||||
/* We can't go backwards, but we can skip forwards.
|
/* We can't go backwards, but we can skip forwards.
|
||||||
*/
|
*/
|
||||||
if( r->top < sequential->y_pos ) {
|
if( r->top < sequential->y_pos ) {
|
||||||
vips_error( "VipsSequential",
|
vips_error( "VipsSequential",
|
||||||
_( "non-sequential read --- "
|
_( "at line %d in file, but line %d requested" ),
|
||||||
"at position %d in file, but position %d requested" ),
|
|
||||||
sequential->y_pos, r->top );
|
sequential->y_pos, r->top );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
@ -107,6 +111,10 @@ vips_sequential_generate( VipsRegion *or,
|
|||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
sequential->y_pos += rect.height;
|
sequential->y_pos += rect.height;
|
||||||
|
|
||||||
|
if( sequential->trace )
|
||||||
|
vips_diag( "VipsSequential",
|
||||||
|
"skipping %d lines", rect.height );
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert( sequential->y_pos == r->top );
|
g_assert( sequential->y_pos == r->top );
|
||||||
@ -169,11 +177,19 @@ vips_sequential_class_init( VipsSequentialClass *class )
|
|||||||
_( "Input image" ),
|
_( "Input image" ),
|
||||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||||
G_STRUCT_OFFSET( VipsSequential, in ) );
|
G_STRUCT_OFFSET( VipsSequential, in ) );
|
||||||
|
|
||||||
|
VIPS_ARG_BOOL( class, "trace", 2,
|
||||||
|
_( "trace" ),
|
||||||
|
_( "trace pixel requests" ),
|
||||||
|
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||||
|
G_STRUCT_OFFSET( VipsSequential, trace ),
|
||||||
|
TRUE );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
vips_sequential_init( VipsSequential *sequential )
|
vips_sequential_init( VipsSequential *sequential )
|
||||||
{
|
{
|
||||||
|
sequential->trace = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -182,6 +198,10 @@ vips_sequential_init( VipsSequential *sequential )
|
|||||||
* @out: output image
|
* @out: output image
|
||||||
* @...: %NULL-terminated list of optional named arguments
|
* @...: %NULL-terminated list of optional named arguments
|
||||||
*
|
*
|
||||||
|
* Optional arguments:
|
||||||
|
*
|
||||||
|
* @trace: trace requests
|
||||||
|
*
|
||||||
* 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
|
||||||
* top-to-bottom. If an out of order request is made, it throws an exception.
|
* top-to-bottom. If an out of order request is made, it throws an exception.
|
||||||
@ -189,6 +209,10 @@ vips_sequential_init( VipsSequential *sequential )
|
|||||||
* This operation is handy with tilecache for loading file formats which are
|
* This operation is handy with tilecache for loading file formats which are
|
||||||
* strictly top-to-bottom, like PNG.
|
* strictly top-to-bottom, like PNG.
|
||||||
*
|
*
|
||||||
|
* If @trace is true, the operation will print diagnostic messages for each
|
||||||
|
* block of pixels which are processed. This can help find the cause of
|
||||||
|
* non-sequential accesses.
|
||||||
|
*
|
||||||
* See also: vips_image_cache().
|
* See also: vips_image_cache().
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -1 on error.
|
* Returns: 0 on success, -1 on error.
|
||||||
|
@ -45,6 +45,8 @@
|
|||||||
* - read jfif resolution as well as exif
|
* - read jfif resolution as well as exif
|
||||||
* 19/2/12
|
* 19/2/12
|
||||||
* - switch to lazy reading
|
* - switch to lazy reading
|
||||||
|
* 7/8/12
|
||||||
|
* - note EXIF resolution unit in VIPS_META_RESOLUTION_UNIT
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -493,6 +495,8 @@ set_vips_resolution( VipsImage *im, ExifData *ed )
|
|||||||
*/
|
*/
|
||||||
xres /= 25.4;
|
xres /= 25.4;
|
||||||
yres /= 25.4;
|
yres /= 25.4;
|
||||||
|
vips_image_set_string( im,
|
||||||
|
VIPS_META_RESOLUTION_UNIT, "in" );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
@ -500,6 +504,8 @@ set_vips_resolution( VipsImage *im, ExifData *ed )
|
|||||||
*/
|
*/
|
||||||
xres /= 10.0;
|
xres /= 10.0;
|
||||||
yres /= 10.0;
|
yres /= 10.0;
|
||||||
|
vips_image_set_string( im,
|
||||||
|
VIPS_META_RESOLUTION_UNIT, "cm" );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -48,6 +48,8 @@
|
|||||||
* - rebuild exif tags from coded metadata values
|
* - rebuild exif tags from coded metadata values
|
||||||
* 24/11/11
|
* 24/11/11
|
||||||
* - turn into a set of write fns ready to be called from a class
|
* - turn into a set of write fns ready to be called from a class
|
||||||
|
* 7/8/12
|
||||||
|
* - use VIPS_META_RESOLUTION_UNIT to select resoltuion unit
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -345,13 +347,33 @@ static int
|
|||||||
set_exif_resolution( ExifData *ed, VipsImage *im )
|
set_exif_resolution( ExifData *ed, VipsImage *im )
|
||||||
{
|
{
|
||||||
double xres, yres;
|
double xres, yres;
|
||||||
|
char *p;
|
||||||
int unit;
|
int unit;
|
||||||
|
|
||||||
/* Always save as inches - more progs support it for read.
|
/* Default to inches, more progs support it.
|
||||||
*/
|
*/
|
||||||
|
unit = 2;
|
||||||
|
if( vips_image_get_typeof( im, VIPS_META_RESOLUTION_UNIT ) &&
|
||||||
|
!vips_image_get_string( im, VIPS_META_RESOLUTION_UNIT, &p ) &&
|
||||||
|
vips_isprefix( "cm", p ) )
|
||||||
|
unit = 3;
|
||||||
|
|
||||||
|
switch( unit ) {
|
||||||
|
case 2:
|
||||||
xres = im->Xres * 25.4;
|
xres = im->Xres * 25.4;
|
||||||
yres = im->Yres * 25.4;
|
yres = im->Yres * 25.4;
|
||||||
unit = 2;
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
xres = im->Xres * 10.0;
|
||||||
|
yres = im->Yres * 10.0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
vips_warn( "VipsJpeg",
|
||||||
|
"%s", _( "unknown EXIF resolution unit" ) );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if( write_tag( ed, EXIF_TAG_X_RESOLUTION, EXIF_FORMAT_RATIONAL,
|
if( write_tag( ed, EXIF_TAG_X_RESOLUTION, EXIF_FORMAT_RATIONAL,
|
||||||
vips_exif_set_double, (void *) &xres ) ||
|
vips_exif_set_double, (void *) &xres ) ||
|
||||||
|
@ -556,8 +556,9 @@ vips_image_posteval_cb( VipsImage *image, VipsProgress *progress )
|
|||||||
{
|
{
|
||||||
/* Spaces at end help to erase the %complete message we overwrite.
|
/* Spaces at end help to erase the %complete message we overwrite.
|
||||||
*/
|
*/
|
||||||
printf( _( "%s %s: done in %ds \n" ),
|
printf( _( "%s %s: done in %.3gs \n" ),
|
||||||
g_get_prgname(), image->filename, progress->run );
|
g_get_prgname(), image->filename,
|
||||||
|
g_timer_elapsed( progress->start, NULL ) );
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
@ -1438,6 +1438,29 @@ vips_object_class_install_argument( VipsObjectClass *object_class,
|
|||||||
#endif /*DEBUG*/
|
#endif /*DEBUG*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Make a bad-enum error. A common and fiddly case.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
vips_enum_error( VipsObjectClass *class, GType otype, const char *value )
|
||||||
|
{
|
||||||
|
GEnumClass *genum = G_ENUM_CLASS( g_type_class_ref( otype ) );
|
||||||
|
int i;
|
||||||
|
char str[1000];
|
||||||
|
VipsBuf buf = VIPS_BUF_STATIC( str );
|
||||||
|
|
||||||
|
/* -1 since we always have a "last" member.
|
||||||
|
*/
|
||||||
|
for( i = 0; i < genum->n_values - 1; i++ ) {
|
||||||
|
if( i > 0 )
|
||||||
|
vips_buf_appends( &buf, ", " );
|
||||||
|
vips_buf_appends( &buf, genum->values[i].value_nick );
|
||||||
|
}
|
||||||
|
|
||||||
|
vips_error( class->nickname, _( "enum '%s' has no member '%s', "
|
||||||
|
"should be one of: %s" ),
|
||||||
|
g_type_name( otype ), value, vips_buf_all( &buf ) );
|
||||||
|
}
|
||||||
|
|
||||||
/* Set a named arg from a string.
|
/* Set a named arg from a string.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
@ -1578,9 +1601,7 @@ vips_object_set_argument_from_string( VipsObject *object,
|
|||||||
g_type_class_ref( otype ), value )) ) {
|
g_type_class_ref( otype ), value )) ) {
|
||||||
if( !(enum_value = g_enum_get_value_by_nick(
|
if( !(enum_value = g_enum_get_value_by_nick(
|
||||||
g_type_class_ref( otype ), value )) ) {
|
g_type_class_ref( otype ), value )) ) {
|
||||||
vips_error( class->nickname,
|
vips_enum_error( class, otype, value );
|
||||||
_( "enum '%s' has no member '%s'" ),
|
|
||||||
g_type_name( otype ), value );
|
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user