better temp file habndling on Windows

this patch reuses file descriptors rather than duping them

duping was problematic on Windows -- reusing is a bit hacky, but seems
to work
This commit is contained in:
John Cupitt 2012-07-05 14:40:18 +01:00
parent 34f25dabd5
commit 0367f90fc4
5 changed files with 118 additions and 93 deletions

View File

@ -285,9 +285,6 @@ vips_image_dispose( GObject *gobject )
if( image->fd != -1 ) { if( image->fd != -1 ) {
VIPS_DEBUG_MSG( "vips_image_dispose: closing output file\n" ); VIPS_DEBUG_MSG( "vips_image_dispose: closing output file\n" );
if( image->dtype == VIPS_IMAGE_OPENOUT )
(void) vips__writehist( image );
if( vips_tracked_close( image->fd ) == -1 ) if( vips_tracked_close( image->fd ) == -1 )
vips_error( "VipsImage", vips_error( "VipsImage",
"%s", _( "unable to close fd" ) ); "%s", _( "unable to close fd" ) );
@ -606,7 +603,8 @@ vips_image_build( VipsObject *object )
*/ */
switch( mode[0] ) { switch( mode[0] ) {
case 'v': case 'v':
/* Used by 'r' for native open of vips, see below. /* Used by 'r' for native open of vips, see below. Also by
* vips_image_rewind_output().
*/ */
if( vips_image_open_input( image ) ) if( vips_image_open_input( image ) )
return( -1 ); return( -1 );
@ -793,6 +791,18 @@ vips_image_real_invalidate( VipsImage *image )
g_mutex_unlock( image->sslock ); g_mutex_unlock( image->sslock );
} }
static void
vips_image_real_written( VipsImage *image, int *result )
{
VIPS_DEBUG_MSG( "vips_image_real_written: %p\n", image );
/* For vips image write, append the xml after the data.
*/
if( image->dtype == VIPS_IMAGE_OPENOUT &&
vips__writehist( image ) )
*result = -1;
}
static void static void
vips_image_class_init( VipsImageClass *class ) vips_image_class_init( VipsImageClass *class )
{ {
@ -828,6 +838,7 @@ vips_image_class_init( VipsImageClass *class )
vobject_class->build = vips_image_build; vobject_class->build = vips_image_build;
class->invalidate = vips_image_real_invalidate; class->invalidate = vips_image_real_invalidate;
class->written = vips_image_real_written;
/* Create properties. /* Create properties.
*/ */
@ -1895,50 +1906,52 @@ vips_image_write_line( VipsImage *image, int ypos, VipsPel *linebuffer )
return( 0 ); return( 0 );
} }
/* Rewind an output file. /* Rewind an output file. VIPS images only.
*/ */
static int static int
vips_image_rewind_output( VipsImage *image ) vips_image_rewind_output( VipsImage *image )
{ {
int fd; int fd;
#ifdef DEBUG_IO g_assert( image->dtype == VIPS_IMAGE_OPENOUT );
#endif/*DEBUG_IO*/
printf( "vips_image_rewind_output: %s\n", image->filename );
/* If this is a temp OPENOUT image on Windows, rewinding will close #ifdef DEBUG_IO
* the FD and delete the file (since we set O_TEMP). printf( "vips_image_rewind_output: %s\n", image->filename );
#endif/*DEBUG_IO*/
/* We want to keep the fd across rewind.
* *
* We open the file again with a temp handle here to make sure it * On Windows, we open temp files with _O_TEMPORARY. We mustn't close
* stays alive until the "rd" open we do just below. * the file since this will delete it.
*
* We could open the file again to keep a reference to it alive, but
* this is also problematic on Windows.
*/ */
if( (fd = vips__open_image_read( image->filename )) == -1 ) fd = image->fd;
return( -1 ); image->fd = -1;
/* Free any resources the image holds and reset to a base /* Free any resources the image holds and reset to a base
* state. * state.
*/ */
vips_object_rewind( VIPS_OBJECT( image ) ); vips_object_rewind( VIPS_OBJECT( image ) );
/* And reopen .. recurse to get a mmaped image. /* And reopen ... recurse to get a mmaped image.
*
* We use "v" mode to get it opened as a vips image, byopassing the
* file type checks. They will fail on Windows becasue you can't open
* fds more than once.
*/ */
image->fd = fd;
g_object_set( image, g_object_set( image,
"mode", "rd", "mode", "v",
NULL ); NULL );
if( vips_object_build( VIPS_OBJECT( image ) ) ) { if( vips_object_build( VIPS_OBJECT( image ) ) ) {
vips_error( "VipsImage", vips_error( "VipsImage",
_( "auto-rewind for %s failed" ), _( "auto-rewind for %s failed" ),
image->filename ); image->filename );
vips_tracked_close( fd );
return( -1 ); return( -1 );
} }
/* Now we've reopened, we can drop the ref we made.
*/
vips_tracked_close( fd );
printf( "vips_image_rewind_output: deleteing temp\n" );
/* Now we've finished writing and reopened as read, we can /* Now we've finished writing and reopened as read, we can
* delete-on-close. * delete-on-close.
* *
@ -1948,7 +1961,7 @@ vips_image_rewind_output( VipsImage *image )
* *
* On Windows this will fail because the file is open and you can't * On Windows this will fail because the file is open and you can't
* delete open files. However, on Windows we set O_TEMP, so the file * delete open files. However, on Windows we set O_TEMP, so the file
* will be deleted anyway on exit. * will be deleted when the fd is finally closed.
*/ */
vips_image_delete( image ); vips_image_delete( image );

View File

@ -356,9 +356,9 @@ vips_tracked_open( const char *pathname, int flags, ... )
vips_tracked_files += 1; vips_tracked_files += 1;
#ifdef DEBUG #ifdef DEBUG
#endif /*DEBUG*/
printf( "vips_tracked_open: %s = %d (%d)\n", printf( "vips_tracked_open: %s = %d (%d)\n",
pathname, fd, vips_tracked_files ); pathname, fd, vips_tracked_files );
#endif /*DEBUG*/
g_mutex_unlock( vips_tracked_mutex ); g_mutex_unlock( vips_tracked_mutex );
@ -391,8 +391,8 @@ vips_tracked_close( int fd )
vips_tracked_files -= 1; vips_tracked_files -= 1;
#ifdef DEBUG #ifdef DEBUG
#endif /*DEBUG*/
printf( "vips_tracked_close: %d (%d)\n", fd, vips_tracked_files ); printf( "vips_tracked_close: %d (%d)\n", fd, vips_tracked_files );
#endif /*DEBUG*/
g_mutex_unlock( vips_tracked_mutex ); g_mutex_unlock( vips_tracked_mutex );

View File

@ -1212,10 +1212,10 @@ static void
vips_object_real_rewind( VipsObject *object ) vips_object_real_rewind( VipsObject *object )
{ {
#ifdef DEBUG #ifdef DEBUG
#endif /*DEBUG*/
printf( "vips_object_real_rewind\n" ); printf( "vips_object_real_rewind\n" );
vips_object_print_name( object ); vips_object_print_name( object );
printf( "\n" ); printf( "\n" );
#endif /*DEBUG*/
g_object_run_dispose( G_OBJECT( object ) ); g_object_run_dispose( G_OBJECT( object ) );

View File

@ -106,8 +106,12 @@
#endif /*O_BINARY*/ #endif /*O_BINARY*/
/* Open mode for image write ... on some systems, have to set BINARY too. /* Open mode for image write ... on some systems, have to set BINARY too.
*
* We use O_RDWR not O_WRONLY since after writing we may want to rewind the
* image and read from it.
*
*/ */
#define MODE_WRITE BINARYIZE (O_WRONLY | O_CREAT | O_TRUNC) #define MODE_WRITE BINARYIZE (O_RDWR | O_CREAT | O_TRUNC)
/* Mode for read/write. This is if we might later want to mmaprw () the file. /* Mode for read/write. This is if we might later want to mmaprw () the file.
*/ */
@ -950,8 +954,16 @@ vips_image_open_input( VipsImage *image )
gint64 rsize; gint64 rsize;
image->dtype = VIPS_IMAGE_OPENIN; image->dtype = VIPS_IMAGE_OPENIN;
if( (image->fd = vips__open_image_read( image->filename )) == -1 )
return( -1 ); /* We may have an fd already, see vips_image_rewind_output().
*/
if( image->fd == -1 ) {
image->fd = vips__open_image_read( image->filename );
if( image->fd == -1 )
return( -1 );
}
vips__seek( image->fd, 0 );
if( read( image->fd, header, VIPS_SIZEOF_HEADER ) != if( read( image->fd, header, VIPS_SIZEOF_HEADER ) !=
VIPS_SIZEOF_HEADER || VIPS_SIZEOF_HEADER ||
vips__read_header_bytes( image, header ) ) { vips__read_header_bytes( image, header ) ) {

View File

@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=glib&keywords=I18N+L10N&component=general\n" "product=glib&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-06-20 22:20+0100\n" "POT-Creation-Date: 2012-07-05 12:04+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -333,7 +333,7 @@ msgstr ""
#: ../libvips/arithmetic/measure.c:236 ../libvips/conversion/extract.c:214 #: ../libvips/arithmetic/measure.c:236 ../libvips/conversion/extract.c:214
#: ../libvips/conversion/black.c:128 ../libvips/conversion/copy.c:331 #: ../libvips/conversion/black.c:128 ../libvips/conversion/copy.c:331
#: ../libvips/conversion/embed.c:536 ../libvips/foreign/rawload.c:122 #: ../libvips/conversion/embed.c:536 ../libvips/foreign/rawload.c:122
#: ../libvips/iofuncs/image.c:845 #: ../libvips/iofuncs/image.c:847
msgid "Width" msgid "Width"
msgstr "" msgstr ""
@ -344,7 +344,7 @@ msgstr ""
#: ../libvips/arithmetic/measure.c:243 ../libvips/conversion/extract.c:221 #: ../libvips/arithmetic/measure.c:243 ../libvips/conversion/extract.c:221
#: ../libvips/conversion/black.c:135 ../libvips/conversion/copy.c:338 #: ../libvips/conversion/black.c:135 ../libvips/conversion/copy.c:338
#: ../libvips/conversion/embed.c:543 ../libvips/foreign/rawload.c:129 #: ../libvips/conversion/embed.c:543 ../libvips/foreign/rawload.c:129
#: ../libvips/iofuncs/image.c:852 #: ../libvips/iofuncs/image.c:854
msgid "Height" msgid "Height"
msgstr "" msgstr ""
@ -783,7 +783,7 @@ msgid "cast an image"
msgstr "" msgstr ""
#: ../libvips/conversion/cast.c:482 ../libvips/conversion/copy.c:352 #: ../libvips/conversion/cast.c:482 ../libvips/conversion/copy.c:352
#: ../libvips/iofuncs/image.c:866 #: ../libvips/iofuncs/image.c:868
msgid "Format" msgid "Format"
msgstr "" msgstr ""
@ -819,7 +819,7 @@ msgstr ""
#: ../libvips/conversion/im_grid.c:164 #: ../libvips/conversion/im_grid.c:164
#: ../libvips/convolution/im_contrast_surface.c:140 #: ../libvips/convolution/im_contrast_surface.c:140
#: ../libvips/iofuncs/sinkscreen.c:1082 ../libvips/iofuncs/image.c:710 #: ../libvips/iofuncs/sinkscreen.c:1082 ../libvips/iofuncs/image.c:712
#: ../libvips/morphology/im_rank.c:342 #: ../libvips/morphology/im_rank.c:342
msgid "bad parameters" msgid "bad parameters"
msgstr "" msgstr ""
@ -887,23 +887,23 @@ msgstr ""
#: ../libvips/conversion/black.c:129 ../libvips/conversion/copy.c:332 #: ../libvips/conversion/black.c:129 ../libvips/conversion/copy.c:332
#: ../libvips/conversion/embed.c:537 ../libvips/foreign/rawload.c:123 #: ../libvips/conversion/embed.c:537 ../libvips/foreign/rawload.c:123
#: ../libvips/iofuncs/image.c:846 #: ../libvips/iofuncs/image.c:848
msgid "Image width in pixels" msgid "Image width in pixels"
msgstr "" msgstr ""
#: ../libvips/conversion/black.c:136 ../libvips/conversion/copy.c:339 #: ../libvips/conversion/black.c:136 ../libvips/conversion/copy.c:339
#: ../libvips/conversion/embed.c:544 ../libvips/foreign/rawload.c:130 #: ../libvips/conversion/embed.c:544 ../libvips/foreign/rawload.c:130
#: ../libvips/iofuncs/image.c:853 #: ../libvips/iofuncs/image.c:855
msgid "Image height in pixels" msgid "Image height in pixels"
msgstr "" msgstr ""
#: ../libvips/conversion/black.c:142 ../libvips/conversion/copy.c:345 #: ../libvips/conversion/black.c:142 ../libvips/conversion/copy.c:345
#: ../libvips/foreign/rawload.c:136 ../libvips/iofuncs/image.c:859 #: ../libvips/foreign/rawload.c:136 ../libvips/iofuncs/image.c:861
msgid "Bands" msgid "Bands"
msgstr "" msgstr ""
#: ../libvips/conversion/black.c:143 ../libvips/conversion/copy.c:346 #: ../libvips/conversion/black.c:143 ../libvips/conversion/copy.c:346
#: ../libvips/foreign/rawload.c:137 ../libvips/iofuncs/image.c:860 #: ../libvips/foreign/rawload.c:137 ../libvips/iofuncs/image.c:862
msgid "Number of bands in image" msgid "Number of bands in image"
msgstr "" msgstr ""
@ -919,59 +919,59 @@ msgstr ""
msgid "Swap bytes in image between little and big-endian" msgid "Swap bytes in image between little and big-endian"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:353 ../libvips/iofuncs/image.c:867 #: ../libvips/conversion/copy.c:353 ../libvips/iofuncs/image.c:869
msgid "Pixel format in image" msgid "Pixel format in image"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:359 ../libvips/iofuncs/image.c:873 #: ../libvips/conversion/copy.c:359 ../libvips/iofuncs/image.c:875
msgid "Coding" msgid "Coding"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:360 ../libvips/iofuncs/image.c:874 #: ../libvips/conversion/copy.c:360 ../libvips/iofuncs/image.c:876
msgid "Pixel coding" msgid "Pixel coding"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:366 ../libvips/iofuncs/image.c:880 #: ../libvips/conversion/copy.c:366 ../libvips/iofuncs/image.c:882
msgid "Interpretation" msgid "Interpretation"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:367 ../libvips/iofuncs/image.c:881 #: ../libvips/conversion/copy.c:367 ../libvips/iofuncs/image.c:883
msgid "Pixel interpretation" msgid "Pixel interpretation"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:373 ../libvips/foreign/tiffsave.c:251 #: ../libvips/conversion/copy.c:373 ../libvips/foreign/tiffsave.c:251
#: ../libvips/iofuncs/image.c:887 #: ../libvips/iofuncs/image.c:889
msgid "Xres" msgid "Xres"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:374 ../libvips/foreign/tiffsave.c:252 #: ../libvips/conversion/copy.c:374 ../libvips/foreign/tiffsave.c:252
#: ../libvips/iofuncs/image.c:888 #: ../libvips/iofuncs/image.c:890
msgid "Horizontal resolution in pixels/mm" msgid "Horizontal resolution in pixels/mm"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:380 ../libvips/foreign/tiffsave.c:258 #: ../libvips/conversion/copy.c:380 ../libvips/foreign/tiffsave.c:258
#: ../libvips/iofuncs/image.c:894 #: ../libvips/iofuncs/image.c:896
msgid "Yres" msgid "Yres"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:381 ../libvips/foreign/tiffsave.c:259 #: ../libvips/conversion/copy.c:381 ../libvips/foreign/tiffsave.c:259
#: ../libvips/iofuncs/image.c:895 #: ../libvips/iofuncs/image.c:897
msgid "Vertical resolution in pixels/mm" msgid "Vertical resolution in pixels/mm"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:387 ../libvips/iofuncs/image.c:901 #: ../libvips/conversion/copy.c:387 ../libvips/iofuncs/image.c:903
msgid "Xoffset" msgid "Xoffset"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:388 ../libvips/iofuncs/image.c:902 #: ../libvips/conversion/copy.c:388 ../libvips/iofuncs/image.c:904
msgid "Horizontal offset of origin" msgid "Horizontal offset of origin"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:394 ../libvips/iofuncs/image.c:908 #: ../libvips/conversion/copy.c:394 ../libvips/iofuncs/image.c:910
msgid "Yoffset" msgid "Yoffset"
msgstr "" msgstr ""
#: ../libvips/conversion/copy.c:395 ../libvips/iofuncs/image.c:909 #: ../libvips/conversion/copy.c:395 ../libvips/iofuncs/image.c:911
msgid "Vertical offset of origin" msgid "Vertical offset of origin"
msgstr "" msgstr ""
@ -1153,7 +1153,7 @@ msgstr ""
msgid "command failed: \"%s\"" msgid "command failed: \"%s\""
msgstr "" msgstr ""
#: ../libvips/conversion/embed.c:430 ../libvips/iofuncs/image.c:1777 #: ../libvips/conversion/embed.c:430 ../libvips/iofuncs/image.c:1779
msgid "bad dimensions" msgid "bad dimensions"
msgstr "" msgstr ""
@ -1293,7 +1293,7 @@ msgstr ""
#: ../libvips/foreign/jpegload.c:245 ../libvips/foreign/rawload.c:115 #: ../libvips/foreign/jpegload.c:245 ../libvips/foreign/rawload.c:115
#: ../libvips/foreign/matload.c:128 ../libvips/foreign/fitssave.c:128 #: ../libvips/foreign/matload.c:128 ../libvips/foreign/fitssave.c:128
#: ../libvips/foreign/radsave.c:119 ../libvips/foreign/vipssave.c:125 #: ../libvips/foreign/radsave.c:119 ../libvips/foreign/vipssave.c:125
#: ../libvips/foreign/pngsave.c:166 ../libvips/iofuncs/image.c:915 #: ../libvips/foreign/pngsave.c:166 ../libvips/iofuncs/image.c:917
msgid "Filename" msgid "Filename"
msgstr "" msgstr ""
@ -1706,11 +1706,11 @@ msgstr ""
msgid "load raw data from a file" msgid "load raw data from a file"
msgstr "" msgstr ""
#: ../libvips/foreign/rawload.c:143 ../libvips/iofuncs/image.c:943 #: ../libvips/foreign/rawload.c:143 ../libvips/iofuncs/image.c:945
msgid "Size of header" msgid "Size of header"
msgstr "" msgstr ""
#: ../libvips/foreign/rawload.c:144 ../libvips/iofuncs/image.c:944 #: ../libvips/foreign/rawload.c:144 ../libvips/iofuncs/image.c:946
msgid "Offset in bytes from start of file" msgid "Offset in bytes from start of file"
msgstr "" msgstr ""
@ -2382,116 +2382,116 @@ msgid_plural " %s, %d bands, %s"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: ../libvips/iofuncs/image.c:529 #: ../libvips/iofuncs/image.c:531
#, c-format #, c-format
msgid "%s %s: %d threads, %d x %d tiles, groups of %d scanlines" msgid "%s %s: %d threads, %d x %d tiles, groups of %d scanlines"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:542 #: ../libvips/iofuncs/image.c:544
#, c-format #, c-format
msgid "%s %s: %d%% complete" msgid "%s %s: %d%% complete"
msgstr "" msgstr ""
#. Spaces at end help to erase the %complete message we overwrite. #. Spaces at end help to erase the %complete message we overwrite.
#. #.
#: ../libvips/iofuncs/image.c:559 #: ../libvips/iofuncs/image.c:561
#, c-format #, c-format
msgid "%s %s: done in %ds \n" msgid "%s %s: done in %ds \n"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:738 #: ../libvips/iofuncs/image.c:740
#, c-format #, c-format
msgid "unable to open \"%s\", file too short" msgid "unable to open \"%s\", file too short"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:748 #: ../libvips/iofuncs/image.c:750
#, c-format #, c-format
msgid "%s is longer than expected" msgid "%s is longer than expected"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:765 #: ../libvips/iofuncs/image.c:767
#, c-format #, c-format
msgid "bad mode \"%s\"" msgid "bad mode \"%s\""
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:820 #: ../libvips/iofuncs/image.c:822
msgid "image class" msgid "image class"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:916 #: ../libvips/iofuncs/image.c:918
msgid "Image filename" msgid "Image filename"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:922 #: ../libvips/iofuncs/image.c:924
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:923 #: ../libvips/iofuncs/image.c:925
msgid "Open mode" msgid "Open mode"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:929 #: ../libvips/iofuncs/image.c:931
msgid "Kill" msgid "Kill"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:930 #: ../libvips/iofuncs/image.c:932
msgid "Block evaluation on this image" msgid "Block evaluation on this image"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:936 #: ../libvips/iofuncs/image.c:938
msgid "Demand style" msgid "Demand style"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:937 #: ../libvips/iofuncs/image.c:939
msgid "Preferred demand style for this image" msgid "Preferred demand style for this image"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:950 #: ../libvips/iofuncs/image.c:952
msgid "Foreign buffer" msgid "Foreign buffer"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:951 #: ../libvips/iofuncs/image.c:953
msgid "Pointer to foreign pixels" msgid "Pointer to foreign pixels"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:1215 #: ../libvips/iofuncs/image.c:1217
#, c-format #, c-format
msgid "killed for image \"%s\"" msgid "killed for image \"%s\""
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:1815 #: ../libvips/iofuncs/image.c:1817
msgid "bad image descriptor" msgid "bad image descriptor"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:1873 ../libvips/iofuncs/generate.c:682 #: ../libvips/iofuncs/image.c:1875 ../libvips/iofuncs/generate.c:682
#, c-format #, c-format
msgid "unable to output to a %s image" msgid "unable to output to a %s image"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:1917 #: ../libvips/iofuncs/image.c:1930
#, c-format #, c-format
msgid "auto-rewind for %s failed" msgid "auto-rewind for %s failed"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:1973 ../libvips/iofuncs/image.c:2168 #: ../libvips/iofuncs/image.c:1993 ../libvips/iofuncs/image.c:2188
#: ../libvips/iofuncs/image.c:2185 #: ../libvips/iofuncs/image.c:2205
msgid "no image data" msgid "no image data"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:2041 ../libvips/iofuncs/image.c:2208 #: ../libvips/iofuncs/image.c:2061 ../libvips/iofuncs/image.c:2228
msgid "image not readable" msgid "image not readable"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:2062 ../libvips/iofuncs/image.c:2238 #: ../libvips/iofuncs/image.c:2082 ../libvips/iofuncs/image.c:2258
#: ../libvips/iofuncs/image.c:2247 #: ../libvips/iofuncs/image.c:2267
msgid "image already written" msgid "image already written"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:2086 ../libvips/iofuncs/image.c:2259 #: ../libvips/iofuncs/image.c:2106 ../libvips/iofuncs/image.c:2279
msgid "image not writeable" msgid "image not writeable"
msgstr "" msgstr ""
#: ../libvips/iofuncs/image.c:2132 #: ../libvips/iofuncs/image.c:2152
msgid "bad file type" msgid "bad file type"
msgstr "" msgstr ""
@ -2500,41 +2500,41 @@ msgstr ""
msgid "start function failed for image %s" msgid "start function failed for image %s"
msgstr "" msgstr ""
#: ../libvips/iofuncs/region.c:528 ../libvips/iofuncs/region.c:598 #: ../libvips/iofuncs/region.c:531 ../libvips/iofuncs/region.c:601
#: ../libvips/iofuncs/region.c:745 ../libvips/iofuncs/region.c:1241 #: ../libvips/iofuncs/region.c:748 ../libvips/iofuncs/region.c:1244
msgid "valid clipped to nothing" msgid "valid clipped to nothing"
msgstr "" msgstr ""
#: ../libvips/iofuncs/region.c:642 #: ../libvips/iofuncs/region.c:645
msgid "bad image type" msgid "bad image type"
msgstr "" msgstr ""
#: ../libvips/iofuncs/region.c:687 #: ../libvips/iofuncs/region.c:690
msgid "no pixel data on attached image" msgid "no pixel data on attached image"
msgstr "" msgstr ""
#: ../libvips/iofuncs/region.c:693 #: ../libvips/iofuncs/region.c:696
msgid "images do not match in pixel size" msgid "images do not match in pixel size"
msgstr "" msgstr ""
#: ../libvips/iofuncs/region.c:726 ../libvips/iofuncs/region.c:1223 #: ../libvips/iofuncs/region.c:729 ../libvips/iofuncs/region.c:1226
msgid "dest too small" msgid "dest too small"
msgstr "" msgstr ""
#: ../libvips/iofuncs/region.c:813 #: ../libvips/iofuncs/region.c:816
msgid "bad position" msgid "bad position"
msgstr "" msgstr ""
#: ../libvips/iofuncs/region.c:1102 ../libvips/iofuncs/region.c:1294 #: ../libvips/iofuncs/region.c:1105 ../libvips/iofuncs/region.c:1297
#, c-format #, c-format
msgid "unable to input from a %s image" msgid "unable to input from a %s image"
msgstr "" msgstr ""
#: ../libvips/iofuncs/region.c:1126 #: ../libvips/iofuncs/region.c:1129
msgid "incomplete header" msgid "incomplete header"
msgstr "" msgstr ""
#: ../libvips/iofuncs/region.c:1197 #: ../libvips/iofuncs/region.c:1200
msgid "inappropriate region type" msgid "inappropriate region type"
msgstr "" msgstr ""