GThread * vips_g_thread_new( const char *domain, GThreadFunc func, gpointer data ) { GThread *thread; VipsThreadInfo *info; GError *error = NULL; info = g_new( VipsThreadInfo, 1 ); info->domain = domain; info->func = func; info->data = data; #ifdef HAVE_THREAD_NEW thread = g_thread_try_new( domain, vips_thread_run, info, &error ); #else thread = g_thread_create( vips_thread_run, info, TRUE, &error ); #endif if( !thread ) { if( error ) vips_g_error( &error ); else vips_error( domain, "%s", _( "unable to create thread" ) ); } return( thread ); }
/* Open TIFF for input. */ TIFF * vips__tiff_openin( const char *path ) { /* No mmap --- no performance advantage with libtiff, and it burns up * our VM if the tiff file is large. */ const char *mode = "rm"; TIFF *tif; #ifdef DEBUG printf( "vips__tiff_openin( \"%s\" )\n", path ); #endif /*DEBUG*/ /* Need the utf-16 version on Windows. */ #ifdef OS_WIN32 { GError *error = NULL; wchar_t *path16; if( !(path16 = (wchar_t *) g_utf8_to_utf16( path, -1, NULL, NULL, &error )) ) { vips_g_error( &error ); return( NULL ); } tif = TIFFOpenW( path16, mode ); g_free( path16 ); } #else /*!OS_WIN32*/ tif = TIFFOpen( path, mode ); #endif /*OS_WIN32*/ if( !tif ) { vips_error( "tiff", _( "unable to open \"%s\" for input" ), path ); return( NULL ); } return( tif ); }
/* Open TIFF for output. */ TIFF * vips__tiff_openout( const char *path, gboolean bigtiff ) { TIFF *tif; const char *mode = bigtiff ? "w8" : "w"; #ifdef DEBUG printf( "vips__tiff_openout( \"%s\", \"%s\" )\n", path, mode ); #endif /*DEBUG*/ /* Need the utf-16 version on Windows. */ #ifdef OS_WIN32 { GError *error = NULL; wchar_t *path16; if( !(path16 = (wchar_t *) g_utf8_to_utf16( path, -1, NULL, NULL, &error )) ) { vips_g_error( &error ); return( NULL ); } tif = TIFFOpenW( path16, mode ); g_free( path16 ); } #else /*!OS_WIN32*/ tif = TIFFOpen( path, mode ); #endif /*OS_WIN32*/ if( !tif ) { vips_error( "tiff", _( "unable to open \"%s\" for output" ), path ); return( NULL ); } return( tif ); }