diff --git a/TODO b/TODO index cdf1866b..3cfc7517 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,15 @@ +- on win see: + + vips2tiff:389 unknown control sequence + \W \S \s \d \c + + if( !(buffer = vips__file_read_name( profile, VIPS_ICC_DIR, &length )) ) + + config.h:#define VIPS_ICC_DIR "C:\Windows\System32\spool\drivers\color" + + hehe argh + + - add APPROX convsep test? - add more webp tests to py suite diff --git a/configure.ac b/configure.ac index 9b40cefe..e2df036f 100644 --- a/configure.ac +++ b/configure.ac @@ -383,6 +383,17 @@ PKG_CHECK_MODULES(TYPE_INIT, glib-2.0 < 2.36, ] ) +# with 2.40 we have g_win32_get_command_line() on win +PKG_CHECK_MODULES(TYPE_INIT, glib-2.0 >= 2.40, + [if test x"$vips_os_win32" = x"yes"; then + AC_DEFINE(HAVE_G_WIN32_GET_COMMAND_LINE,1,[define if your glib has g_win32_get_command_line().]) + have_g_win32_get_command_line=yes + fi + ], + [: + ] +) + # check for gtk-doc GTK_DOC_CHECK([1.14],[--flavour no-tmpl]) @@ -1136,3 +1147,11 @@ You may need to copy this file, for example: ;; esac fi + +if test x"$vips_os_win32" = x"yes"; then + if test x"$have_g_win32_get_command_line" != x"yes"; then + AC_MSG_RESULT([dnl +Your glib is too old, vips will not support unicode command-line arguments. + ]) + fi +fi diff --git a/libvips/iofuncs/util.c b/libvips/iofuncs/util.c index 48158410..823b08bf 100644 --- a/libvips/iofuncs/util.c +++ b/libvips/iofuncs/util.c @@ -558,6 +558,41 @@ filename_hasdir( const char *filename ) return( hasdir ); } +/* fopen() with utf8 filename and mode. + */ +static FILE * +vips__fopen( const char *filename, const char *mode ) +{ + FILE *fp; + +#ifdef OS_WIN32 + GError *error = NULL; + wchar_t *path16, *mode16; + + if( !(path16 = (wchar_t *) + g_utf8_to_utf16( filename, -1, NULL, NULL, &error )) ) { + vips_g_error( error ); + return( NULL ); + } + + if( !(mode16 = (wchar_t *) + g_utf8_to_utf16( mode, -1, NULL, NULL, &error )) ) { + g_free( path16 ); + vips_g_error( error ); + return( NULL ); + } + + fp = _wfopen( path16, mode16 ); + + g_free( path16 ); + g_free( mode16 ); +#else /*!OS_WIN32*/ + fp = fopen( filename, mode ); +#endif + + return( fp ); +} + /* Open a file. We take an optional fallback dir as well and will try opening * there if opening directly fails. * @@ -581,7 +616,7 @@ vips__file_open_read( const char *filename, const char *fallback_dir, mode = "r"; #endif /*BINARY_OPEN*/ - if( (fp = fopen( filename, mode )) ) + if( (fp = vips__fopen( filename, mode )) ) return( fp ); if( fallback_dir && @@ -589,7 +624,7 @@ vips__file_open_read( const char *filename, const char *fallback_dir, char *path; path = g_build_filename( fallback_dir, filename, NULL ); - fp = fopen( path, mode ); + fp = vips__fopen( path, mode ); g_free( path ); if( fp ) @@ -617,7 +652,7 @@ vips__file_open_write( const char *filename, gboolean text_mode ) mode = "w"; #endif /*BINARY_OPEN*/ - if( !(fp = fopen( filename, mode )) ) { + if( !(fp = vips__fopen( filename, mode )) ) { vips_error_system( errno, "vips__file_open_write", _( "unable to open file \"%s\" for writing" ), filename ); diff --git a/tools/vipsthumbnail.c b/tools/vipsthumbnail.c index b6199d87..17dd8235 100644 --- a/tools/vipsthumbnail.c +++ b/tools/vipsthumbnail.c @@ -680,6 +680,14 @@ main( int argc, char **argv ) textdomain( GETTEXT_PACKAGE ); setlocale( LC_ALL, "" ); + /* On Windows, argv is ascii-only .. use this to get a utf-8 version of + * the args. + */ +#ifdef HAVE_G_WIN32_GET_COMMAND_LINE + printf( "using g_win32_get_command_line()\n" ); + argv = g_win32_get_command_line(); +#endif /*HAVE_G_WIN32_GET_COMMAND_LINE*/ + context = g_option_context_new( _( "- thumbnail generator" ) ); main_group = g_option_group_new( NULL, NULL, NULL, NULL, NULL ); @@ -738,6 +746,12 @@ main( int argc, char **argv ) g_object_unref( process ); } + /* We don't free this on error exit, sadly. + */ +#ifdef HAVE_G_WIN32_GET_COMMAND_LINE + g_strfreev( argv ); +#endif /*HAVE_G_WIN32_GET_COMMAND_LINE*/ + vips_shutdown(); return( result );