experiment with renaming stream
rename as VipsConnection, VipsSource, VipsTarget etc. see https://github.com/libvips/libvips/issues/1494#issuecomment-569498619 renamed with this script: ``` set -e edit() { sed -i -E "$1" rename } for i in $*; do cp $i rename edit s/VIPS_STREAMOU/VIPS_TARGET_CUSTOM/g edit s/VIPS_STREAMO/VIPS_TARGET/g edit s/VIPS_STREAMIU/VIPS_SOURCE_CUSTOM/g edit s/VIPS_STREAMI/VIPS_SOURCE/g edit s/VIPS_STREAM/VIPS_CONNECTION/g edit s/vips_streamou/vips_target_custom/g edit s/vips_streamo/vips_target/g edit s/vips_streamiu/vips_source_custom/g edit s/vips_streami/vips_source/g edit s/vips_stream/vips_connection/g edit s/VipsStreamou/VipsTargetCustom/g edit s/VipsStreamo/VipsTarget/g edit s/VipsStreamiu/VipsSourceCustom/g edit s/VipsStreami/VipsSource/g edit s/VipsStream/VipsConnection/g # eg. VIPS_TYPE_STREAM or VIPS_IS_STREAM edit "s/VIPS_([A-Z]+)_STREAMOU/VIPS_\1_TARGET_CUSTOM/g" edit "s/VIPS_([A-Z]+)_STREAMO/VIPS_\1_TARGET/g" edit "s/VIPS_([A-Z]+)_STREAMIU/VIPS_\1_SOURCE_CUSTOM/g" edit "s/VIPS_([A-Z]+)_STREAMI/VIPS_\1_SOURCE/g" edit "s/VIPS_([A-Z]+)_STREAM/VIPS_\1_CONNECTION/g" edit s/streamou/target_custom/g edit s/streamo/target/g edit s/streamiu/source_custom/g edit s/streami/source/g # various identifiers which also change edit s/is_a_stream/is_a_source/g edit s/find_load_stream/find_load_source/g edit s/find_save_stream/find_save_target/g edit s/new_from_stream/new_from_source/g edit s/write_to_stream/write_to_target/g edit s/vips_thumbnail_stream/vips_thumbnail_source/g # eg. vips_webpload_stream edit "s/vips_([a-z]+)load_stream/vips_\1load_source/g" # eg. vips_webpsave_stream edit "s/vips_([a-z]+)save_stream/vips_\1save_target/g" mv rename $i done ```
This commit is contained in:
parent
c65e399c48
commit
4c5873809f
@ -597,20 +597,20 @@ VImage::new_from_buffer( const std::string &buf, const char *option_string,
|
||||
}
|
||||
|
||||
VImage
|
||||
VImage::new_from_stream( VStreamI streami, const char *option_string,
|
||||
VImage::new_from_source( VStreamI source, const char *option_string,
|
||||
VOption *options )
|
||||
{
|
||||
const char *operation_name;
|
||||
VImage out;
|
||||
|
||||
if( !(operation_name = vips_foreign_find_load_stream(
|
||||
streami.get_stream() )) ) {
|
||||
if( !(operation_name = vips_foreign_find_load_source(
|
||||
source.get_stream() )) ) {
|
||||
delete options;
|
||||
throw( VError() );
|
||||
}
|
||||
|
||||
options = (options ? options : VImage::option())->
|
||||
set( "streami", streami )->
|
||||
set( "source", source )->
|
||||
set( "out", &out );
|
||||
|
||||
call_option_string( operation_name, option_string, options );
|
||||
@ -703,7 +703,7 @@ VImage::write_to_buffer( const char *suffix, void **buf, size_t *size,
|
||||
}
|
||||
|
||||
void
|
||||
VImage::write_to_stream( const char *suffix, VStreamO streamo,
|
||||
VImage::write_to_target( const char *suffix, VStreamO target,
|
||||
VOption *options ) const
|
||||
{
|
||||
char filename[VIPS_PATH_MAX];
|
||||
@ -711,7 +711,7 @@ VImage::write_to_stream( const char *suffix, VStreamO streamo,
|
||||
const char *operation_name;
|
||||
|
||||
vips__filename_split8( suffix, filename, option_string );
|
||||
if( !(operation_name = vips_foreign_find_save_stream( filename )) ) {
|
||||
if( !(operation_name = vips_foreign_find_save_target( filename )) ) {
|
||||
delete options;
|
||||
throw VError();
|
||||
}
|
||||
@ -719,7 +719,7 @@ VImage::write_to_stream( const char *suffix, VStreamO streamo,
|
||||
call_option_string( operation_name, option_string,
|
||||
(options ? options : VImage::option())->
|
||||
set( "in", *this )->
|
||||
set( "streamo", streamo ) );
|
||||
set( "target", target ) );
|
||||
}
|
||||
|
||||
#include "vips-operators.cpp"
|
||||
|
@ -47,9 +47,9 @@ VIPS_NAMESPACE_START
|
||||
VStreamI
|
||||
VStreamI::new_from_descriptor( int descriptor )
|
||||
{
|
||||
VipsStreami *input;
|
||||
VipsSource *input;
|
||||
|
||||
if( !(input = vips_streami_new_from_descriptor( descriptor )) )
|
||||
if( !(input = vips_source_new_from_descriptor( descriptor )) )
|
||||
throw VError();
|
||||
|
||||
VStreamI out( input );
|
||||
@ -60,9 +60,9 @@ VStreamI::new_from_descriptor( int descriptor )
|
||||
VStreamI
|
||||
VStreamI::new_from_file( const char *filename )
|
||||
{
|
||||
VipsStreami *input;
|
||||
VipsSource *input;
|
||||
|
||||
if( !(input = vips_streami_new_from_file( filename )) )
|
||||
if( !(input = vips_source_new_from_file( filename )) )
|
||||
throw VError();
|
||||
|
||||
VStreamI out( input );
|
||||
@ -73,9 +73,9 @@ VStreamI::new_from_file( const char *filename )
|
||||
VStreamI
|
||||
VStreamI::new_from_blob( VipsBlob *blob )
|
||||
{
|
||||
VipsStreami *input;
|
||||
VipsSource *input;
|
||||
|
||||
if( !(input = vips_streami_new_from_blob( blob )) )
|
||||
if( !(input = vips_source_new_from_blob( blob )) )
|
||||
throw VError();
|
||||
|
||||
VStreamI out( input );
|
||||
@ -87,9 +87,9 @@ VStreamI
|
||||
VStreamI::new_from_memory( const void *data,
|
||||
size_t size )
|
||||
{
|
||||
VipsStreami *input;
|
||||
VipsSource *input;
|
||||
|
||||
if( !(input = vips_streami_new_from_memory( data, size )) )
|
||||
if( !(input = vips_source_new_from_memory( data, size )) )
|
||||
throw VError();
|
||||
|
||||
VStreamI out( input );
|
||||
@ -100,9 +100,9 @@ VStreamI::new_from_memory( const void *data,
|
||||
VStreamI
|
||||
VStreamI::new_from_options( const char *options )
|
||||
{
|
||||
VipsStreami *input;
|
||||
VipsSource *input;
|
||||
|
||||
if( !(input = vips_streami_new_from_options( options )) )
|
||||
if( !(input = vips_source_new_from_options( options )) )
|
||||
throw VError();
|
||||
|
||||
VStreamI out( input );
|
||||
@ -116,7 +116,7 @@ VOption::set( const char *name, const VStreamI value )
|
||||
Pair *pair = new Pair( name );
|
||||
|
||||
pair->input = true;
|
||||
g_value_init( &pair->value, VIPS_TYPE_STREAMI );
|
||||
g_value_init( &pair->value, VIPS_TYPE_SOURCE );
|
||||
g_value_set_object( &pair->value, value.get_stream() );
|
||||
options.push_back( pair );
|
||||
|
||||
@ -126,9 +126,9 @@ VOption::set( const char *name, const VStreamI value )
|
||||
VStreamO
|
||||
VStreamO::new_to_descriptor( int descriptor )
|
||||
{
|
||||
VipsStreamo *output;
|
||||
VipsTarget *output;
|
||||
|
||||
if( !(output = vips_streamo_new_to_descriptor( descriptor )) )
|
||||
if( !(output = vips_target_new_to_descriptor( descriptor )) )
|
||||
throw VError();
|
||||
|
||||
VStreamO out( output );
|
||||
@ -139,9 +139,9 @@ VStreamO::new_to_descriptor( int descriptor )
|
||||
VStreamO
|
||||
VStreamO::new_to_file( const char *filename )
|
||||
{
|
||||
VipsStreamo *output;
|
||||
VipsTarget *output;
|
||||
|
||||
if( !(output = vips_streamo_new_to_file( filename )) )
|
||||
if( !(output = vips_target_new_to_file( filename )) )
|
||||
throw VError();
|
||||
|
||||
VStreamO out( output );
|
||||
@ -152,9 +152,9 @@ VStreamO::new_to_file( const char *filename )
|
||||
VStreamO
|
||||
VStreamO::new_to_memory()
|
||||
{
|
||||
VipsStreamo *output;
|
||||
VipsTarget *output;
|
||||
|
||||
if( !(output = vips_streamo_new_to_memory()) )
|
||||
if( !(output = vips_target_new_to_memory()) )
|
||||
throw VError();
|
||||
|
||||
VStreamO out( output );
|
||||
@ -168,7 +168,7 @@ VOption::set( const char *name, const VStreamO value )
|
||||
Pair *pair = new Pair( name );
|
||||
|
||||
pair->input = true;
|
||||
g_value_init( &pair->value, VIPS_TYPE_STREAMO );
|
||||
g_value_init( &pair->value, VIPS_TYPE_TARGET );
|
||||
g_value_set_object( &pair->value, value.get_stream() );
|
||||
options.push_back( pair );
|
||||
|
||||
|
@ -514,7 +514,7 @@ public:
|
||||
static VImage new_from_buffer( const std::string &buf,
|
||||
const char *option_string, VOption *options = 0 );
|
||||
|
||||
static VImage new_from_stream( VStreamI streami,
|
||||
static VImage new_from_source( VStreamI source,
|
||||
const char *option_string, VOption *options = 0 );
|
||||
|
||||
static VImage new_matrix( int width, int height );
|
||||
@ -569,7 +569,7 @@ public:
|
||||
void write_to_buffer( const char *suffix, void **buf, size_t *size,
|
||||
VOption *options = 0 ) const;
|
||||
|
||||
void write_to_stream( const char *suffix, VStreamO streamo,
|
||||
void write_to_target( const char *suffix, VStreamO target,
|
||||
VOption *options = 0 ) const;
|
||||
|
||||
void *
|
||||
|
@ -37,7 +37,7 @@ VIPS_NAMESPACE_START
|
||||
class VStreamI : VObject
|
||||
{
|
||||
public:
|
||||
VStreamI( VipsStreami *input, VSteal steal = STEAL ) :
|
||||
VStreamI( VipsSource *input, VSteal steal = STEAL ) :
|
||||
VObject( (VipsObject *) input, steal )
|
||||
{
|
||||
}
|
||||
@ -58,10 +58,10 @@ public:
|
||||
static
|
||||
VStreamI new_from_options( const char *options );
|
||||
|
||||
VipsStreami *
|
||||
VipsSource *
|
||||
get_stream() const
|
||||
{
|
||||
return( (VipsStreami *) VObject::get_object() );
|
||||
return( (VipsSource *) VObject::get_object() );
|
||||
}
|
||||
|
||||
};
|
||||
@ -69,7 +69,7 @@ public:
|
||||
class VStreamO : VObject
|
||||
{
|
||||
public:
|
||||
VStreamO( VipsStreamo *output, VSteal steal = STEAL ) :
|
||||
VStreamO( VipsTarget *output, VSteal steal = STEAL ) :
|
||||
VObject( (VipsObject *) output, steal )
|
||||
{
|
||||
}
|
||||
@ -83,10 +83,10 @@ public:
|
||||
static
|
||||
VStreamO new_to_memory();
|
||||
|
||||
VipsStreamo *
|
||||
VipsTarget *
|
||||
get_stream() const
|
||||
{
|
||||
return( (VipsStreamo *) VObject::get_object() );
|
||||
return( (VipsTarget *) VObject::get_object() );
|
||||
}
|
||||
|
||||
};
|
||||
|
@ -1039,11 +1039,11 @@ static VImage jpegload_buffer( VipsBlob *buffer, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Load image from jpeg stream.
|
||||
* @param streami Stream to load from.
|
||||
* @param source Stream to load from.
|
||||
* @param options Optional options.
|
||||
* @return Output image.
|
||||
*/
|
||||
static VImage jpegload_stream( VStreamI streami, VOption *options = 0 );
|
||||
static VImage jpegload_stream( VStreamI source, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Save image to jpeg file.
|
||||
@ -1067,10 +1067,10 @@ void jpegsave_mime( VOption *options = 0 ) const;
|
||||
|
||||
/**
|
||||
* Save image to jpeg stream.
|
||||
* @param streamo Stream to save to.
|
||||
* @param target Stream to save to.
|
||||
* @param options Optional options.
|
||||
*/
|
||||
void jpegsave_stream( VStreamO streamo, VOption *options = 0 ) const;
|
||||
void jpegsave_stream( VStreamO target, VOption *options = 0 ) const;
|
||||
|
||||
/**
|
||||
* Label regions in an image.
|
||||
@ -1517,11 +1517,11 @@ static VImage pngload_buffer( VipsBlob *buffer, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Load png from stream.
|
||||
* @param streami Stream to load from.
|
||||
* @param source Stream to load from.
|
||||
* @param options Optional options.
|
||||
* @return Output image.
|
||||
*/
|
||||
static VImage pngload_stream( VStreamI streami, VOption *options = 0 );
|
||||
static VImage pngload_stream( VStreamI source, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Save image to png file.
|
||||
@ -1539,10 +1539,10 @@ VipsBlob *pngsave_buffer( VOption *options = 0 ) const;
|
||||
|
||||
/**
|
||||
* Save image to png stream.
|
||||
* @param streamo Stream to save to.
|
||||
* @param target Stream to save to.
|
||||
* @param options Optional options.
|
||||
*/
|
||||
void pngsave_stream( VStreamO streamo, VOption *options = 0 ) const;
|
||||
void pngsave_stream( VStreamO target, VOption *options = 0 ) const;
|
||||
|
||||
/**
|
||||
* Load ppm from file.
|
||||
@ -1623,11 +1623,11 @@ static VImage radload_buffer( VipsBlob *buffer, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Load rad from stream.
|
||||
* @param streami Stream to load from.
|
||||
* @param source Stream to load from.
|
||||
* @param options Optional options.
|
||||
* @return Output image.
|
||||
*/
|
||||
static VImage radload_stream( VStreamI streami, VOption *options = 0 );
|
||||
static VImage radload_stream( VStreamI source, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Save image to radiance file.
|
||||
@ -1645,10 +1645,10 @@ VipsBlob *radsave_buffer( VOption *options = 0 ) const;
|
||||
|
||||
/**
|
||||
* Save image to radiance stream.
|
||||
* @param streamo Stream to save to.
|
||||
* @param target Stream to save to.
|
||||
* @param options Optional options.
|
||||
*/
|
||||
void radsave_stream( VStreamO streamo, VOption *options = 0 ) const;
|
||||
void radsave_stream( VStreamO target, VOption *options = 0 ) const;
|
||||
|
||||
/**
|
||||
* Rank filter.
|
||||
@ -1994,11 +1994,11 @@ static VImage svgload_buffer( VipsBlob *buffer, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Load svg from stream.
|
||||
* @param streami Stream to load from.
|
||||
* @param source Stream to load from.
|
||||
* @param options Optional options.
|
||||
* @return Output image.
|
||||
*/
|
||||
static VImage svgload_stream( VStreamI streami, VOption *options = 0 );
|
||||
static VImage svgload_stream( VStreamI source, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Find the index of the first non-zero pixel in tests.
|
||||
@ -2051,12 +2051,12 @@ VImage thumbnail_image( int width, VOption *options = 0 ) const;
|
||||
|
||||
/**
|
||||
* Generate thumbnail from stream.
|
||||
* @param streami Stream to load from.
|
||||
* @param source Stream to load from.
|
||||
* @param width Size to this width.
|
||||
* @param options Optional options.
|
||||
* @return Output image.
|
||||
*/
|
||||
static VImage thumbnail_stream( VStreamI streami, int width, VOption *options = 0 );
|
||||
static VImage thumbnail_stream( VStreamI source, int width, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Load tiff from file.
|
||||
@ -2076,11 +2076,11 @@ static VImage tiffload_buffer( VipsBlob *buffer, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Load tiff from stream.
|
||||
* @param streami Stream to load from.
|
||||
* @param source Stream to load from.
|
||||
* @param options Optional options.
|
||||
* @return Output image.
|
||||
*/
|
||||
static VImage tiffload_stream( VStreamI streami, VOption *options = 0 );
|
||||
static VImage tiffload_stream( VStreamI source, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Save image to tiff file.
|
||||
@ -2157,11 +2157,11 @@ static VImage webpload_buffer( VipsBlob *buffer, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Load webp from stream.
|
||||
* @param streami Stream to load from.
|
||||
* @param source Stream to load from.
|
||||
* @param options Optional options.
|
||||
* @return Output image.
|
||||
*/
|
||||
static VImage webpload_stream( VStreamI streami, VOption *options = 0 );
|
||||
static VImage webpload_stream( VStreamI source, VOption *options = 0 );
|
||||
|
||||
/**
|
||||
* Save image to webp file.
|
||||
@ -2179,10 +2179,10 @@ VipsBlob *webpsave_buffer( VOption *options = 0 ) const;
|
||||
|
||||
/**
|
||||
* Save image to webp stream.
|
||||
* @param streamo Stream to save to.
|
||||
* @param target Stream to save to.
|
||||
* @param options Optional options.
|
||||
*/
|
||||
void webpsave_stream( VStreamO streamo, VOption *options = 0 ) const;
|
||||
void webpsave_stream( VStreamO target, VOption *options = 0 ) const;
|
||||
|
||||
/**
|
||||
* Make a worley noise image.
|
||||
|
@ -1628,14 +1628,14 @@ VImage VImage::jpegload_buffer( VipsBlob *buffer, VOption *options )
|
||||
return( out );
|
||||
}
|
||||
|
||||
VImage VImage::jpegload_stream( VStreamI streami, VOption *options )
|
||||
VImage VImage::jpegload_stream( VStreamI source, VOption *options )
|
||||
{
|
||||
VImage out;
|
||||
|
||||
call( "jpegload_stream",
|
||||
(options ? options : VImage::option())->
|
||||
set( "out", &out )->
|
||||
set( "streami", streami ) );
|
||||
set( "source", source ) );
|
||||
|
||||
return( out );
|
||||
}
|
||||
@ -1667,12 +1667,12 @@ void VImage::jpegsave_mime( VOption *options ) const
|
||||
set( "in", *this ) );
|
||||
}
|
||||
|
||||
void VImage::jpegsave_stream( VStreamO streamo, VOption *options ) const
|
||||
void VImage::jpegsave_stream( VStreamO target, VOption *options ) const
|
||||
{
|
||||
call( "jpegsave_stream",
|
||||
(options ? options : VImage::option())->
|
||||
set( "in", *this )->
|
||||
set( "streamo", streamo ) );
|
||||
set( "target", target ) );
|
||||
}
|
||||
|
||||
VImage VImage::labelregions( VOption *options ) const
|
||||
@ -2319,14 +2319,14 @@ VImage VImage::pngload_buffer( VipsBlob *buffer, VOption *options )
|
||||
return( out );
|
||||
}
|
||||
|
||||
VImage VImage::pngload_stream( VStreamI streami, VOption *options )
|
||||
VImage VImage::pngload_stream( VStreamI source, VOption *options )
|
||||
{
|
||||
VImage out;
|
||||
|
||||
call( "pngload_stream",
|
||||
(options ? options : VImage::option())->
|
||||
set( "out", &out )->
|
||||
set( "streami", streami ) );
|
||||
set( "source", source ) );
|
||||
|
||||
return( out );
|
||||
}
|
||||
@ -2351,12 +2351,12 @@ VipsBlob *VImage::pngsave_buffer( VOption *options ) const
|
||||
return( buffer );
|
||||
}
|
||||
|
||||
void VImage::pngsave_stream( VStreamO streamo, VOption *options ) const
|
||||
void VImage::pngsave_stream( VStreamO target, VOption *options ) const
|
||||
{
|
||||
call( "pngsave_stream",
|
||||
(options ? options : VImage::option())->
|
||||
set( "in", *this )->
|
||||
set( "streamo", streamo ) );
|
||||
set( "target", target ) );
|
||||
}
|
||||
|
||||
VImage VImage::ppmload( const char *filename, VOption *options )
|
||||
@ -2478,14 +2478,14 @@ VImage VImage::radload_buffer( VipsBlob *buffer, VOption *options )
|
||||
return( out );
|
||||
}
|
||||
|
||||
VImage VImage::radload_stream( VStreamI streami, VOption *options )
|
||||
VImage VImage::radload_stream( VStreamI source, VOption *options )
|
||||
{
|
||||
VImage out;
|
||||
|
||||
call( "radload_stream",
|
||||
(options ? options : VImage::option())->
|
||||
set( "out", &out )->
|
||||
set( "streami", streami ) );
|
||||
set( "source", source ) );
|
||||
|
||||
return( out );
|
||||
}
|
||||
@ -2510,12 +2510,12 @@ VipsBlob *VImage::radsave_buffer( VOption *options ) const
|
||||
return( buffer );
|
||||
}
|
||||
|
||||
void VImage::radsave_stream( VStreamO streamo, VOption *options ) const
|
||||
void VImage::radsave_stream( VStreamO target, VOption *options ) const
|
||||
{
|
||||
call( "radsave_stream",
|
||||
(options ? options : VImage::option())->
|
||||
set( "in", *this )->
|
||||
set( "streamo", streamo ) );
|
||||
set( "target", target ) );
|
||||
}
|
||||
|
||||
VImage VImage::rank( int width, int height, int index, VOption *options ) const
|
||||
@ -3062,14 +3062,14 @@ VImage VImage::svgload_buffer( VipsBlob *buffer, VOption *options )
|
||||
return( out );
|
||||
}
|
||||
|
||||
VImage VImage::svgload_stream( VStreamI streami, VOption *options )
|
||||
VImage VImage::svgload_stream( VStreamI source, VOption *options )
|
||||
{
|
||||
VImage out;
|
||||
|
||||
call( "svgload_stream",
|
||||
(options ? options : VImage::option())->
|
||||
set( "out", &out )->
|
||||
set( "streami", streami ) );
|
||||
set( "source", source ) );
|
||||
|
||||
return( out );
|
||||
}
|
||||
@ -3144,14 +3144,14 @@ VImage VImage::thumbnail_image( int width, VOption *options ) const
|
||||
return( out );
|
||||
}
|
||||
|
||||
VImage VImage::thumbnail_stream( VStreamI streami, int width, VOption *options )
|
||||
VImage VImage::thumbnail_stream( VStreamI source, int width, VOption *options )
|
||||
{
|
||||
VImage out;
|
||||
|
||||
call( "thumbnail_stream",
|
||||
(options ? options : VImage::option())->
|
||||
set( "out", &out )->
|
||||
set( "streami", streami )->
|
||||
set( "source", source )->
|
||||
set( "width", width ) );
|
||||
|
||||
return( out );
|
||||
@ -3181,14 +3181,14 @@ VImage VImage::tiffload_buffer( VipsBlob *buffer, VOption *options )
|
||||
return( out );
|
||||
}
|
||||
|
||||
VImage VImage::tiffload_stream( VStreamI streami, VOption *options )
|
||||
VImage VImage::tiffload_stream( VStreamI source, VOption *options )
|
||||
{
|
||||
VImage out;
|
||||
|
||||
call( "tiffload_stream",
|
||||
(options ? options : VImage::option())->
|
||||
set( "out", &out )->
|
||||
set( "streami", streami ) );
|
||||
set( "source", source ) );
|
||||
|
||||
return( out );
|
||||
}
|
||||
@ -3304,14 +3304,14 @@ VImage VImage::webpload_buffer( VipsBlob *buffer, VOption *options )
|
||||
return( out );
|
||||
}
|
||||
|
||||
VImage VImage::webpload_stream( VStreamI streami, VOption *options )
|
||||
VImage VImage::webpload_stream( VStreamI source, VOption *options )
|
||||
{
|
||||
VImage out;
|
||||
|
||||
call( "webpload_stream",
|
||||
(options ? options : VImage::option())->
|
||||
set( "out", &out )->
|
||||
set( "streami", streami ) );
|
||||
set( "source", source ) );
|
||||
|
||||
return( out );
|
||||
}
|
||||
@ -3336,12 +3336,12 @@ VipsBlob *VImage::webpsave_buffer( VOption *options ) const
|
||||
return( buffer );
|
||||
}
|
||||
|
||||
void VImage::webpsave_stream( VStreamO streamo, VOption *options ) const
|
||||
void VImage::webpsave_stream( VStreamO target, VOption *options ) const
|
||||
{
|
||||
call( "webpsave_stream",
|
||||
(options ? options : VImage::option())->
|
||||
set( "in", *this )->
|
||||
set( "streamo", streamo ) );
|
||||
set( "target", target ) );
|
||||
}
|
||||
|
||||
VImage VImage::worley( int width, int height, VOption *options )
|
||||
|
@ -112,16 +112,16 @@ jpeg2vips( const char *name, IMAGE *out, gboolean header_only )
|
||||
|
||||
#ifdef HAVE_JPEG
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( -1 );
|
||||
if( vips__jpeg_read_stream( streami, out,
|
||||
if( vips__jpeg_read_stream( source, out,
|
||||
header_only, shrink, fail_on_warn, FALSE ) ) {
|
||||
VIPS_UNREF( streami );
|
||||
VIPS_UNREF( source );
|
||||
return( -1 );
|
||||
}
|
||||
VIPS_UNREF( streami );
|
||||
VIPS_UNREF( source );
|
||||
}
|
||||
#else
|
||||
vips_error( "im_jpeg2vips",
|
||||
|
@ -84,16 +84,16 @@ png2vips( const char *name, IMAGE *out, gboolean header_only )
|
||||
|
||||
#ifdef HAVE_PNG
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
int result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( -1 );
|
||||
if( header_only )
|
||||
result = vips__png_header_stream( streami, out );
|
||||
result = vips__png_header_stream( source, out );
|
||||
else
|
||||
result = vips__png_read_stream( streami, out, TRUE );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips__png_read_stream( source, out, TRUE );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
if( result )
|
||||
return( result );
|
||||
|
@ -56,13 +56,13 @@
|
||||
static gboolean
|
||||
im_istifftiled( const char *filename )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gboolean result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( FALSE );
|
||||
result = vips__istiff_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips__istiff_stream( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -71,16 +71,16 @@ static int
|
||||
im_tiff_read_header( const char *filename, VipsImage *out,
|
||||
int page, int n, gboolean autorotate )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( -1 );
|
||||
if( vips__tiff_read_header_stream( streami,
|
||||
if( vips__tiff_read_header_stream( source,
|
||||
out, page, n, autorotate ) ) {
|
||||
VIPS_UNREF( streami );
|
||||
VIPS_UNREF( source );
|
||||
return( -1 );
|
||||
}
|
||||
VIPS_UNREF( streami );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -89,15 +89,15 @@ static int
|
||||
im_tiff_read( const char *filename, VipsImage *out,
|
||||
int page, int n, gboolean autorotate )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( -1 );
|
||||
if( vips__tiff_read_stream( streami, out, page, n, autorotate ) ) {
|
||||
VIPS_UNREF( streami );
|
||||
if( vips__tiff_read_stream( source, out, page, n, autorotate ) ) {
|
||||
VIPS_UNREF( source );
|
||||
return( -1 );
|
||||
}
|
||||
VIPS_UNREF( streami );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
@ -52,16 +52,16 @@ webp2vips( const char *name, IMAGE *out, gboolean header_only )
|
||||
|
||||
#ifdef HAVE_LIBWEBP
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
int result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( -1 );
|
||||
if( header_only )
|
||||
result = vips__webp_read_header_stream( streami, out, 0, 1, 1 );
|
||||
result = vips__webp_read_header_stream( source, out, 0, 1, 1 );
|
||||
else
|
||||
result = vips__webp_read_stream( streami, out, 0, 1, 1 );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips__webp_read_stream( source, out, 0, 1, 1 );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
if( result )
|
||||
return( result );
|
||||
@ -82,12 +82,12 @@ vips__iswebp( const char *filename )
|
||||
gboolean result;
|
||||
|
||||
#ifdef HAVE_LIBWEBP
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( FALSE );
|
||||
result = vips__png_ispng_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips__png_ispng_stream( source );
|
||||
VIPS_UNREF( source );
|
||||
#else /*!HAVE_LIBWEBP*/
|
||||
result = -1;
|
||||
#endif /*HAVE_LIBWEBP*/
|
||||
|
@ -457,8 +457,8 @@ vips_foreign_load_summary_class( VipsObjectClass *object_class, VipsBuf *buf )
|
||||
vips_buf_appends( buf, ", is_a" );
|
||||
if( class->is_a_buffer )
|
||||
vips_buf_appends( buf, ", is_a_buffer" );
|
||||
if( class->is_a_stream )
|
||||
vips_buf_appends( buf, ", is_a_stream" );
|
||||
if( class->is_a_source )
|
||||
vips_buf_appends( buf, ", is_a_source" );
|
||||
if( class->get_flags )
|
||||
vips_buf_appends( buf, ", get_flags" );
|
||||
if( class->get_flags_filename )
|
||||
@ -632,20 +632,20 @@ vips_foreign_find_load_buffer( const void *data, size_t size )
|
||||
/* Can this VipsForeign open this stream?
|
||||
*/
|
||||
static void *
|
||||
vips_foreign_find_load_stream_sub( void *item, void *a, void *b )
|
||||
vips_foreign_find_load_source_sub( void *item, void *a, void *b )
|
||||
{
|
||||
VipsObjectClass *object_class = VIPS_OBJECT_CLASS( item );
|
||||
VipsForeignLoadClass *load_class = VIPS_FOREIGN_LOAD_CLASS( item );
|
||||
VipsStreami *streami = VIPS_STREAMI( a );
|
||||
VipsSource *source = VIPS_SOURCE( a );
|
||||
|
||||
if( load_class->is_a_stream &&
|
||||
if( load_class->is_a_source &&
|
||||
vips_ispostfix( object_class->nickname, "_stream" ) ) {
|
||||
/* We may have done a read() rather than a sniff() in one of
|
||||
* the is_a testers. Always rewind.
|
||||
*/
|
||||
(void) vips_streami_rewind( streami );
|
||||
(void) vips_source_rewind( source );
|
||||
|
||||
if( load_class->is_a_stream( streami ) )
|
||||
if( load_class->is_a_source( source ) )
|
||||
return( load_class );
|
||||
}
|
||||
|
||||
@ -653,28 +653,28 @@ vips_foreign_find_load_stream_sub( void *item, void *a, void *b )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_foreign_find_load_stream:
|
||||
* @streami: stream to load from
|
||||
* vips_foreign_find_load_source:
|
||||
* @source: stream to load from
|
||||
*
|
||||
* Searches for an operation you could use to load a stream. To see the
|
||||
* range of buffer loaders supported by your vips, try something like:
|
||||
*
|
||||
* vips -l | grep load_stream
|
||||
*
|
||||
* See also: vips_image_new_from_stream().
|
||||
* See also: vips_image_new_from_source().
|
||||
*
|
||||
* Returns: (transfer none): the name of an operation on success, %NULL on
|
||||
* error.
|
||||
*/
|
||||
const char *
|
||||
vips_foreign_find_load_stream( VipsStreami *streami )
|
||||
vips_foreign_find_load_source( VipsSource *source )
|
||||
{
|
||||
VipsForeignLoadClass *load_class;
|
||||
|
||||
if( !(load_class = (VipsForeignLoadClass *) vips_foreign_map(
|
||||
"VipsForeignLoad",
|
||||
vips_foreign_find_load_stream_sub,
|
||||
streami, NULL )) ) {
|
||||
vips_foreign_find_load_source_sub,
|
||||
source, NULL )) ) {
|
||||
vips_error( "VipsForeignLoad",
|
||||
"%s", _( "stream is not in a known format" ) );
|
||||
return( NULL );
|
||||
@ -737,17 +737,17 @@ vips_foreign_is_a_buffer( const char *loader, const void *data, size_t size )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_foreign_is_a_stream:
|
||||
* vips_foreign_is_a_source:
|
||||
* @loader: name of loader to use for test
|
||||
* @streami: stream to test
|
||||
* @source: stream to test
|
||||
*
|
||||
* Return %TRUE if @streami can be loaded by @loader. @loader is something
|
||||
* Return %TRUE if @source can be loaded by @loader. @loader is something
|
||||
* like "tiffload_stream" or "VipsForeignLoadTiffStream".
|
||||
*
|
||||
* Returns: %TRUE if @data can be loaded by @stream.
|
||||
*/
|
||||
gboolean
|
||||
vips_foreign_is_a_stream( const char *loader, VipsStreami *streami )
|
||||
vips_foreign_is_a_source( const char *loader, VipsSource *source )
|
||||
{
|
||||
const VipsObjectClass *class;
|
||||
VipsForeignLoadClass *load_class;
|
||||
@ -755,8 +755,8 @@ vips_foreign_is_a_stream( const char *loader, VipsStreami *streami )
|
||||
if( !(class = vips_class_find( "VipsForeignLoad", loader )) )
|
||||
return( FALSE );
|
||||
load_class = VIPS_FOREIGN_LOAD_CLASS( class );
|
||||
if( load_class->is_a_stream &&
|
||||
load_class->is_a_stream( streami ) )
|
||||
if( load_class->is_a_source &&
|
||||
load_class->is_a_source( source ) )
|
||||
return( TRUE );
|
||||
|
||||
return( FALSE );
|
||||
@ -1901,7 +1901,7 @@ vips_foreign_save( VipsImage *in, const char *name, ... )
|
||||
/* Can this class write this filetype to a stream?
|
||||
*/
|
||||
static void *
|
||||
vips_foreign_find_save_stream_sub( VipsForeignSaveClass *save_class,
|
||||
vips_foreign_find_save_target_sub( VipsForeignSaveClass *save_class,
|
||||
const char *suffix )
|
||||
{
|
||||
VipsObjectClass *object_class = VIPS_OBJECT_CLASS( save_class );
|
||||
@ -1916,7 +1916,7 @@ vips_foreign_find_save_stream_sub( VipsForeignSaveClass *save_class,
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_foreign_find_save_stream:
|
||||
* vips_foreign_find_save_target:
|
||||
* @suffix: format to find a saver for
|
||||
*
|
||||
* Searches for an operation you could use to write to a stream in @suffix
|
||||
@ -1927,7 +1927,7 @@ vips_foreign_find_save_stream_sub( VipsForeignSaveClass *save_class,
|
||||
* Returns: the name of an operation on success, %NULL on error
|
||||
*/
|
||||
const char *
|
||||
vips_foreign_find_save_stream( const char *name )
|
||||
vips_foreign_find_save_target( const char *name )
|
||||
{
|
||||
char suffix[VIPS_PATH_MAX];
|
||||
char option_string[VIPS_PATH_MAX];
|
||||
@ -1937,7 +1937,7 @@ vips_foreign_find_save_stream( const char *name )
|
||||
|
||||
if( !(save_class = (VipsForeignSaveClass *) vips_foreign_map(
|
||||
"VipsForeignSave",
|
||||
(VipsSListMap2Fn) vips_foreign_find_save_stream_sub,
|
||||
(VipsSListMap2Fn) vips_foreign_find_save_target_sub,
|
||||
(void *) suffix, NULL )) ) {
|
||||
vips_error( "VipsForeignSave",
|
||||
_( "\"%s\" is not a known stream format" ), name );
|
||||
|
@ -193,7 +193,7 @@ typedef struct _ReadJpeg {
|
||||
|
||||
/* The stream we read from.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
} ReadJpeg;
|
||||
|
||||
@ -208,7 +208,7 @@ typedef struct {
|
||||
|
||||
/* Private stuff during read.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
unsigned char buf[STREAM_BUFFER_SIZE];
|
||||
|
||||
} Source;
|
||||
@ -238,7 +238,7 @@ stream_fill_input_buffer( j_decompress_ptr cinfo )
|
||||
|
||||
size_t read;
|
||||
|
||||
if( (read = vips_streami_read( src->streami,
|
||||
if( (read = vips_source_read( src->source,
|
||||
src->buf, STREAM_BUFFER_SIZE )) > 0 ) {
|
||||
src->pub.next_input_byte = src->buf;
|
||||
src->pub.bytes_in_buffer = read;
|
||||
@ -277,11 +277,11 @@ readjpeg_open_input( ReadJpeg *jpeg )
|
||||
{
|
||||
j_decompress_ptr cinfo = &jpeg->cinfo;
|
||||
|
||||
if( jpeg->streami &&
|
||||
if( jpeg->source &&
|
||||
!cinfo->src ) {
|
||||
Source *src;
|
||||
|
||||
if( vips_streami_rewind( jpeg->streami ) )
|
||||
if( vips_source_rewind( jpeg->source ) )
|
||||
return( -1 );
|
||||
|
||||
cinfo->src = (struct jpeg_source_mgr *)
|
||||
@ -290,7 +290,7 @@ readjpeg_open_input( ReadJpeg *jpeg )
|
||||
sizeof( Source ) );
|
||||
|
||||
src = (Source *) cinfo->src;
|
||||
src->streami = jpeg->streami;
|
||||
src->source = jpeg->source;
|
||||
src->pub.init_source = stream_init_source;
|
||||
src->pub.fill_input_buffer = stream_fill_input_buffer;
|
||||
src->pub.resync_to_restart = jpeg_resync_to_restart;
|
||||
@ -326,7 +326,7 @@ readjpeg_free( ReadJpeg *jpeg )
|
||||
*/
|
||||
jpeg_destroy_decompress( &jpeg->cinfo );
|
||||
|
||||
VIPS_UNREF( jpeg->streami );
|
||||
VIPS_UNREF( jpeg->source );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -340,11 +340,11 @@ readjpeg_close_cb( VipsObject *object, ReadJpeg *jpeg )
|
||||
static void
|
||||
readjpeg_minimise_cb( VipsImage *image, ReadJpeg *jpeg )
|
||||
{
|
||||
vips_streami_minimise( jpeg->streami );
|
||||
vips_source_minimise( jpeg->source );
|
||||
}
|
||||
|
||||
static ReadJpeg *
|
||||
readjpeg_new( VipsStreami *streami, VipsImage *out,
|
||||
readjpeg_new( VipsSource *source, VipsImage *out,
|
||||
int shrink, gboolean fail, gboolean autorotate )
|
||||
{
|
||||
ReadJpeg *jpeg;
|
||||
@ -352,8 +352,8 @@ readjpeg_new( VipsStreami *streami, VipsImage *out,
|
||||
if( !(jpeg = VIPS_NEW( out, ReadJpeg )) )
|
||||
return( NULL );
|
||||
|
||||
jpeg->streami = streami;
|
||||
g_object_ref( streami );
|
||||
jpeg->source = source;
|
||||
g_object_ref( source );
|
||||
jpeg->shrink = shrink;
|
||||
jpeg->fail = fail;
|
||||
jpeg->cinfo.err = jpeg_std_error( &jpeg->eman.pub );
|
||||
@ -559,7 +559,7 @@ read_jpeg_header( ReadJpeg *jpeg, VipsImage *out )
|
||||
xres, yres );
|
||||
|
||||
VIPS_SETSTR( out->filename,
|
||||
vips_stream_filename( VIPS_STREAM( jpeg->streami ) ) );
|
||||
vips_connection_filename( VIPS_CONNECTION( jpeg->source ) ) );
|
||||
|
||||
vips_image_pipelinev( out, VIPS_DEMAND_STYLE_FATSTRIP, NULL );
|
||||
|
||||
@ -959,12 +959,12 @@ vips__jpeg_read( ReadJpeg *jpeg, VipsImage *out, gboolean header_only )
|
||||
}
|
||||
|
||||
int
|
||||
vips__jpeg_read_stream( VipsStreami *streami, VipsImage *out,
|
||||
vips__jpeg_read_stream( VipsSource *source, VipsImage *out,
|
||||
gboolean header_only, int shrink, int fail, gboolean autorotate )
|
||||
{
|
||||
ReadJpeg *jpeg;
|
||||
|
||||
if( !(jpeg = readjpeg_new( streami, out, shrink, fail, autorotate )) )
|
||||
if( !(jpeg = readjpeg_new( source, out, shrink, fail, autorotate )) )
|
||||
return( -1 );
|
||||
|
||||
if( setjmp( jpeg->eman.jmp ) )
|
||||
@ -975,9 +975,9 @@ vips__jpeg_read_stream( VipsStreami *streami, VipsImage *out,
|
||||
return( -1 );
|
||||
|
||||
if( header_only )
|
||||
vips_streami_minimise( streami );
|
||||
vips_source_minimise( source );
|
||||
else {
|
||||
if( vips_streami_decode( streami ) )
|
||||
if( vips_source_decode( source ) )
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
@ -985,11 +985,11 @@ vips__jpeg_read_stream( VipsStreami *streami, VipsImage *out,
|
||||
}
|
||||
|
||||
int
|
||||
vips__isjpeg_stream( VipsStreami *streami )
|
||||
vips__isjpeg_stream( VipsSource *source )
|
||||
{
|
||||
const unsigned char *p;
|
||||
|
||||
if( (p = vips_streami_sniff( streami, 2 )) &&
|
||||
if( (p = vips_source_sniff( source, 2 )) &&
|
||||
p[0] == 0xff &&
|
||||
p[1] == 0xd8 )
|
||||
return( 1 );
|
||||
|
@ -70,7 +70,7 @@ typedef struct _VipsForeignLoadJpeg {
|
||||
|
||||
/* Set by subclasses.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
/* Shrink by this much during load.
|
||||
*/
|
||||
@ -92,7 +92,7 @@ vips_foreign_load_jpeg_dispose( GObject *gobject )
|
||||
{
|
||||
VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) gobject;
|
||||
|
||||
VIPS_UNREF( jpeg->streami );
|
||||
VIPS_UNREF( jpeg->source );
|
||||
|
||||
G_OBJECT_CLASS( vips_foreign_load_jpeg_parent_class )->
|
||||
dispose( gobject );
|
||||
@ -136,7 +136,7 @@ vips_foreign_load_jpeg_header( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) load;
|
||||
|
||||
if( vips__jpeg_read_stream( jpeg->streami,
|
||||
if( vips__jpeg_read_stream( jpeg->source,
|
||||
load->out, TRUE, jpeg->shrink, load->fail, jpeg->autorotate ) )
|
||||
return( -1 );
|
||||
|
||||
@ -148,7 +148,7 @@ vips_foreign_load_jpeg_load( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) load;
|
||||
|
||||
if( vips__jpeg_read_stream( jpeg->streami,
|
||||
if( vips__jpeg_read_stream( jpeg->source,
|
||||
load->real, FALSE, jpeg->shrink, load->fail,
|
||||
jpeg->autorotate ) )
|
||||
return( -1 );
|
||||
@ -207,7 +207,7 @@ vips_foreign_load_jpeg_init( VipsForeignLoadJpeg *jpeg )
|
||||
typedef struct _VipsForeignLoadJpegStream {
|
||||
VipsForeignLoadJpeg parent_object;
|
||||
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
} VipsForeignLoadJpegStream;
|
||||
|
||||
@ -223,9 +223,9 @@ vips_foreign_load_jpeg_stream_build( VipsObject *object )
|
||||
VipsForeignLoadJpegStream *stream =
|
||||
(VipsForeignLoadJpegStream *) object;
|
||||
|
||||
if( stream->streami ) {
|
||||
jpeg->streami = stream->streami;
|
||||
g_object_ref( jpeg->streami );
|
||||
if( stream->source ) {
|
||||
jpeg->source = stream->source;
|
||||
g_object_ref( jpeg->source );
|
||||
}
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_load_jpeg_stream_parent_class )->
|
||||
@ -236,9 +236,9 @@ vips_foreign_load_jpeg_stream_build( VipsObject *object )
|
||||
}
|
||||
|
||||
static gboolean
|
||||
vips_foreign_load_jpeg_stream_is_a_stream( VipsStreami *streami )
|
||||
vips_foreign_load_jpeg_stream_is_a_source( VipsSource *source )
|
||||
{
|
||||
return( vips__isjpeg_stream( streami ) );
|
||||
return( vips__isjpeg_stream( source ) );
|
||||
}
|
||||
|
||||
static void
|
||||
@ -256,14 +256,14 @@ vips_foreign_load_jpeg_stream_class_init(
|
||||
object_class->description = _( "load image from jpeg stream" );
|
||||
object_class->build = vips_foreign_load_jpeg_stream_build;
|
||||
|
||||
load_class->is_a_stream = vips_foreign_load_jpeg_stream_is_a_stream;
|
||||
load_class->is_a_source = vips_foreign_load_jpeg_stream_is_a_source;
|
||||
|
||||
VIPS_ARG_OBJECT( class, "streami", 1,
|
||||
VIPS_ARG_OBJECT( class, "source", 1,
|
||||
_( "Streami" ),
|
||||
_( "Stream to load from" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsForeignLoadJpegStream, streami ),
|
||||
VIPS_TYPE_STREAMI );
|
||||
G_STRUCT_OFFSET( VipsForeignLoadJpegStream, source ),
|
||||
VIPS_TYPE_SOURCE );
|
||||
|
||||
}
|
||||
|
||||
@ -291,8 +291,8 @@ vips_foreign_load_jpeg_file_build( VipsObject *object )
|
||||
VipsForeignLoadJpegFile *file = (VipsForeignLoadJpegFile *) object;
|
||||
|
||||
if( file->filename &&
|
||||
!(jpeg->streami =
|
||||
vips_streami_new_from_file( file->filename )) )
|
||||
!(jpeg->source =
|
||||
vips_source_new_from_file( file->filename )) )
|
||||
return( -1 );
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_load_jpeg_file_parent_class )->
|
||||
@ -305,13 +305,13 @@ vips_foreign_load_jpeg_file_build( VipsObject *object )
|
||||
static gboolean
|
||||
vips_foreign_load_jpeg_file_is_a( const char *filename )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gboolean result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( FALSE );
|
||||
result = vips_foreign_load_jpeg_stream_is_a_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips_foreign_load_jpeg_stream_is_a_source( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -368,7 +368,7 @@ vips_foreign_load_jpeg_buffer_build( VipsObject *object )
|
||||
(VipsForeignLoadJpegBuffer *) object;
|
||||
|
||||
if( buffer->blob &&
|
||||
!(jpeg->streami = vips_streami_new_from_memory(
|
||||
!(jpeg->source = vips_source_new_from_memory(
|
||||
VIPS_AREA( buffer->blob )->data,
|
||||
VIPS_AREA( buffer->blob )->length )) )
|
||||
return( -1 );
|
||||
@ -383,13 +383,13 @@ vips_foreign_load_jpeg_buffer_build( VipsObject *object )
|
||||
static gboolean
|
||||
vips_foreign_load_jpeg_buffer_is_a_buffer( const void *buf, size_t len )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gboolean result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_memory( buf, len )) )
|
||||
if( !(source = vips_source_new_from_memory( buf, len )) )
|
||||
return( FALSE );
|
||||
result = vips_foreign_load_jpeg_stream_is_a_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips_foreign_load_jpeg_stream_is_a_source( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
|
@ -219,7 +219,7 @@ vips_foreign_save_jpeg_init( VipsForeignSaveJpeg *jpeg )
|
||||
typedef struct _VipsForeignSaveJpegStream {
|
||||
VipsForeignSaveJpeg parent_object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
} VipsForeignSaveJpegStream;
|
||||
|
||||
@ -240,7 +240,7 @@ vips_foreign_save_jpeg_stream_build( VipsObject *object )
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( vips__jpeg_write_stream( save->ready, stream->streamo,
|
||||
if( vips__jpeg_write_stream( save->ready, stream->target,
|
||||
jpeg->Q, jpeg->profile, jpeg->optimize_coding,
|
||||
jpeg->interlace, save->strip, jpeg->no_subsample,
|
||||
jpeg->trellis_quant, jpeg->overshoot_deringing,
|
||||
@ -264,12 +264,12 @@ vips_foreign_save_jpeg_stream_class_init(
|
||||
object_class->description = _( "save image to jpeg stream" );
|
||||
object_class->build = vips_foreign_save_jpeg_stream_build;
|
||||
|
||||
VIPS_ARG_OBJECT( class, "streamo", 1,
|
||||
VIPS_ARG_OBJECT( class, "target", 1,
|
||||
_( "Streamo" ),
|
||||
_( "Stream to save to" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsForeignSaveJpegStream, streamo ),
|
||||
VIPS_TYPE_STREAMO );
|
||||
G_STRUCT_OFFSET( VipsForeignSaveJpegStream, target ),
|
||||
VIPS_TYPE_TARGET );
|
||||
|
||||
}
|
||||
|
||||
@ -299,23 +299,23 @@ vips_foreign_save_jpeg_file_build( VipsObject *object )
|
||||
VipsForeignSaveJpeg *jpeg = (VipsForeignSaveJpeg *) object;
|
||||
VipsForeignSaveJpegFile *file = (VipsForeignSaveJpegFile *) object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_save_jpeg_file_parent_class )->
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_file( file->filename )) )
|
||||
if( !(target = vips_target_new_to_file( file->filename )) )
|
||||
return( -1 );
|
||||
if( vips__jpeg_write_stream( save->ready, streamo,
|
||||
if( vips__jpeg_write_stream( save->ready, target,
|
||||
jpeg->Q, jpeg->profile, jpeg->optimize_coding,
|
||||
jpeg->interlace, save->strip, jpeg->no_subsample,
|
||||
jpeg->trellis_quant, jpeg->overshoot_deringing,
|
||||
jpeg->optimize_scans, jpeg->quant_table ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -367,30 +367,30 @@ vips_foreign_save_jpeg_buffer_build( VipsObject *object )
|
||||
VipsForeignSaveJpeg *jpeg = (VipsForeignSaveJpeg *) object;
|
||||
VipsForeignSaveJpegBuffer *file = (VipsForeignSaveJpegBuffer *) object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
VipsBlob *blob;
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_save_jpeg_buffer_parent_class )->
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_memory()) )
|
||||
if( !(target = vips_target_new_to_memory()) )
|
||||
return( -1 );
|
||||
|
||||
if( vips__jpeg_write_stream( save->ready, streamo,
|
||||
if( vips__jpeg_write_stream( save->ready, target,
|
||||
jpeg->Q, jpeg->profile, jpeg->optimize_coding,
|
||||
jpeg->interlace, save->strip, jpeg->no_subsample,
|
||||
jpeg->trellis_quant, jpeg->overshoot_deringing,
|
||||
jpeg->optimize_scans, jpeg->quant_table ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
g_object_get( streamo, "blob", &blob, NULL );
|
||||
g_object_get( target, "blob", &blob, NULL );
|
||||
g_object_set( file, "buffer", blob, NULL );
|
||||
vips_area_unref( VIPS_AREA( blob ) );
|
||||
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -438,7 +438,7 @@ vips_foreign_save_jpeg_mime_build( VipsObject *object )
|
||||
VipsForeignSave *save = (VipsForeignSave *) object;
|
||||
VipsForeignSaveJpeg *jpeg = (VipsForeignSaveJpeg *) object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
VipsBlob *blob;
|
||||
const unsigned char *obuf;
|
||||
size_t olen;
|
||||
@ -447,19 +447,19 @@ vips_foreign_save_jpeg_mime_build( VipsObject *object )
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_memory()) )
|
||||
if( !(target = vips_target_new_to_memory()) )
|
||||
return( -1 );
|
||||
|
||||
if( vips__jpeg_write_stream( save->ready, streamo,
|
||||
if( vips__jpeg_write_stream( save->ready, target,
|
||||
jpeg->Q, jpeg->profile, jpeg->optimize_coding,
|
||||
jpeg->interlace, save->strip, jpeg->no_subsample,
|
||||
jpeg->trellis_quant, jpeg->overshoot_deringing,
|
||||
jpeg->optimize_scans, jpeg->quant_table ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
g_object_get( streamo, "blob", &blob, NULL );
|
||||
g_object_get( target, "blob", &blob, NULL );
|
||||
|
||||
obuf = vips_blob_get( blob, &olen );
|
||||
printf( "Content-length: %zu\r\n", olen );
|
||||
@ -470,7 +470,7 @@ vips_foreign_save_jpeg_mime_build( VipsObject *object )
|
||||
|
||||
vips_area_unref( VIPS_AREA( blob ) );
|
||||
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -610,9 +610,9 @@ vips_jpegsave( VipsImage *in, const char *filename, ... )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_jpegsave_stream: (method)
|
||||
* vips_jpegsave_target: (method)
|
||||
* @in: image to save
|
||||
* @streamo: save image to this stream
|
||||
* @target: save image to this stream
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
* Optional arguments:
|
||||
@ -630,18 +630,18 @@ vips_jpegsave( VipsImage *in, const char *filename, ... )
|
||||
*
|
||||
* As vips_jpegsave(), but save to a stream.
|
||||
*
|
||||
* See also: vips_jpegsave(), vips_image_write_to_stream().
|
||||
* See also: vips_jpegsave(), vips_image_write_to_target().
|
||||
*
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_jpegsave_stream( VipsImage *in, VipsStreamo *streamo, ... )
|
||||
vips_jpegsave_target( VipsImage *in, VipsTarget *target, ... )
|
||||
{
|
||||
va_list ap;
|
||||
int result;
|
||||
|
||||
va_start( ap, streamo );
|
||||
result = vips_call_split( "jpegsave_stream", ap, in, streamo );
|
||||
va_start( ap, target );
|
||||
result = vips_call_split( "jpegsave_stream", ap, in, target );
|
||||
va_end( ap );
|
||||
|
||||
return( result );
|
||||
|
@ -79,11 +79,11 @@ int vips__tiff_write_buf( VipsImage *in,
|
||||
VipsRegionShrink region_shrink,
|
||||
int level, gboolean lossless );
|
||||
|
||||
gboolean vips__istiff_stream( VipsStreami *streami );
|
||||
gboolean vips__istifftiled_stream( VipsStreami *streami );
|
||||
int vips__tiff_read_header_stream( VipsStreami *streami, VipsImage *out,
|
||||
gboolean vips__istiff_stream( VipsSource *source );
|
||||
gboolean vips__istifftiled_stream( VipsSource *source );
|
||||
int vips__tiff_read_header_stream( VipsSource *source, VipsImage *out,
|
||||
int page, int n, gboolean autorotate );
|
||||
int vips__tiff_read_stream( VipsStreami *streami, VipsImage *out,
|
||||
int vips__tiff_read_stream( VipsSource *source, VipsImage *out,
|
||||
int page, int n, gboolean autorotate );
|
||||
|
||||
extern const char *vips__foreign_tiff_suffs[];
|
||||
@ -145,37 +145,37 @@ int vips__mat_ismat( const char *filename );
|
||||
|
||||
extern const char *vips__ppm_suffs[];
|
||||
|
||||
int vips__ppm_save_stream( VipsImage *in, VipsStreamo *streamo,
|
||||
int vips__ppm_save_stream( VipsImage *in, VipsTarget *target,
|
||||
gboolean ascii, gboolean squash );
|
||||
int vips__rad_israd( VipsStreami *streami );
|
||||
int vips__rad_header( VipsStreami *streami, VipsImage *out );
|
||||
int vips__rad_load( VipsStreami *streami, VipsImage *out );
|
||||
int vips__rad_israd( VipsSource *source );
|
||||
int vips__rad_header( VipsSource *source, VipsImage *out );
|
||||
int vips__rad_load( VipsSource *source, VipsImage *out );
|
||||
|
||||
int vips__rad_save( VipsImage *in, VipsStreamo *streamo );
|
||||
int vips__rad_save( VipsImage *in, VipsTarget *target );
|
||||
|
||||
extern const char *vips__rad_suffs[];
|
||||
|
||||
extern const char *vips__jpeg_suffs[];
|
||||
|
||||
int vips__jpeg_write_stream( VipsImage *in, VipsStreamo *streamo,
|
||||
int vips__jpeg_write_stream( VipsImage *in, VipsTarget *target,
|
||||
int Q, const char *profile,
|
||||
gboolean optimize_coding, gboolean progressive, gboolean strip,
|
||||
gboolean no_subsample, gboolean trellis_quant,
|
||||
gboolean overshoot_deringing, gboolean optimize_scans,
|
||||
int quant_table );
|
||||
|
||||
int vips__jpeg_read_stream( VipsStreami *streami, VipsImage *out,
|
||||
int vips__jpeg_read_stream( VipsSource *source, VipsImage *out,
|
||||
gboolean header_only, int shrink, int fail, gboolean autorotate );
|
||||
int vips__isjpeg_stream( VipsStreami *streami );
|
||||
int vips__isjpeg_stream( VipsSource *source );
|
||||
|
||||
int vips__png_ispng_stream( VipsStreami *streami );
|
||||
int vips__png_header_stream( VipsStreami *streami, VipsImage *out );
|
||||
int vips__png_read_stream( VipsStreami *streami, VipsImage *out,
|
||||
int vips__png_ispng_stream( VipsSource *source );
|
||||
int vips__png_header_stream( VipsSource *source, VipsImage *out );
|
||||
int vips__png_read_stream( VipsSource *source, VipsImage *out,
|
||||
gboolean fail );
|
||||
gboolean vips__png_isinterlaced_stream( VipsStreami *streami );
|
||||
gboolean vips__png_isinterlaced_stream( VipsSource *source );
|
||||
extern const char *vips__png_suffs[];
|
||||
|
||||
int vips__png_write_stream( VipsImage *in, VipsStreamo *streamo,
|
||||
int vips__png_write_stream( VipsImage *in, VipsTarget *target,
|
||||
int compress, int interlace, const char *profile,
|
||||
VipsForeignPngFilter filter, gboolean strip,
|
||||
gboolean palette, int colours, int Q, double dither );
|
||||
@ -192,14 +192,14 @@ extern const VipsWebPNames vips__webp_names[];
|
||||
extern const int vips__n_webp_names;
|
||||
extern const char *vips__webp_suffs[];
|
||||
|
||||
int vips__iswebp_stream( VipsStreami *streami );
|
||||
int vips__iswebp_stream( VipsSource *source );
|
||||
|
||||
int vips__webp_read_header_stream( VipsStreami *streami, VipsImage *out,
|
||||
int vips__webp_read_header_stream( VipsSource *source, VipsImage *out,
|
||||
int page, int n, double scale );
|
||||
int vips__webp_read_stream( VipsStreami *streami, VipsImage *out,
|
||||
int vips__webp_read_stream( VipsSource *source, VipsImage *out,
|
||||
int page, int n, double scale );
|
||||
|
||||
int vips__webp_write_stream( VipsImage *image, VipsStreamo *streamo,
|
||||
int vips__webp_write_stream( VipsImage *image, VipsTarget *target,
|
||||
int Q, gboolean lossless, VipsForeignWebpPreset preset,
|
||||
gboolean smart_subsample, gboolean near_lossless,
|
||||
int alpha_q, int reduction_effort,
|
||||
|
@ -57,7 +57,7 @@ typedef struct _VipsForeignLoadPng {
|
||||
|
||||
/* Set by subclasses.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
} VipsForeignLoadPng;
|
||||
|
||||
@ -71,19 +71,19 @@ vips_foreign_load_png_dispose( GObject *gobject )
|
||||
{
|
||||
VipsForeignLoadPng *png = (VipsForeignLoadPng *) gobject;
|
||||
|
||||
VIPS_UNREF( png->streami );
|
||||
VIPS_UNREF( png->source );
|
||||
|
||||
G_OBJECT_CLASS( vips_foreign_load_png_parent_class )->
|
||||
dispose( gobject );
|
||||
}
|
||||
|
||||
static VipsForeignFlags
|
||||
vips_foreign_load_png_get_flags_stream( VipsStreami *streami )
|
||||
vips_foreign_load_png_get_flags_stream( VipsSource *source )
|
||||
{
|
||||
VipsForeignFlags flags;
|
||||
|
||||
flags = 0;
|
||||
if( vips__png_isinterlaced_stream( streami ) )
|
||||
if( vips__png_isinterlaced_stream( source ) )
|
||||
flags |= VIPS_FOREIGN_PARTIAL;
|
||||
else
|
||||
flags |= VIPS_FOREIGN_SEQUENTIAL;
|
||||
@ -96,19 +96,19 @@ vips_foreign_load_png_get_flags( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
|
||||
|
||||
return( vips_foreign_load_png_get_flags_stream( png->streami ) );
|
||||
return( vips_foreign_load_png_get_flags_stream( png->source ) );
|
||||
}
|
||||
|
||||
static VipsForeignFlags
|
||||
vips_foreign_load_png_get_flags_filename( const char *filename )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
VipsForeignFlags flags;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( 0 );
|
||||
flags = vips_foreign_load_png_get_flags_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
flags = vips_foreign_load_png_get_flags_stream( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( flags );
|
||||
}
|
||||
@ -118,7 +118,7 @@ vips_foreign_load_png_header( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
|
||||
|
||||
if( vips__png_header_stream( png->streami, load->out ) )
|
||||
if( vips__png_header_stream( png->source, load->out ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -129,7 +129,7 @@ vips_foreign_load_png_load( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
|
||||
|
||||
if( vips__png_read_stream( png->streami, load->real, load->fail ) )
|
||||
if( vips__png_read_stream( png->source, load->real, load->fail ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -170,7 +170,7 @@ typedef struct _VipsForeignLoadPngStream {
|
||||
|
||||
/* Load from a stream.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
} VipsForeignLoadPngStream;
|
||||
|
||||
@ -185,9 +185,9 @@ vips_foreign_load_png_stream_build( VipsObject *object )
|
||||
VipsForeignLoadPng *png = (VipsForeignLoadPng *) object;
|
||||
VipsForeignLoadPngStream *stream = (VipsForeignLoadPngStream *) object;
|
||||
|
||||
if( stream->streami ) {
|
||||
png->streami = stream->streami;
|
||||
g_object_ref( png->streami );
|
||||
if( stream->source ) {
|
||||
png->source = stream->source;
|
||||
g_object_ref( png->source );
|
||||
}
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_load_png_stream_parent_class )->
|
||||
@ -198,9 +198,9 @@ vips_foreign_load_png_stream_build( VipsObject *object )
|
||||
}
|
||||
|
||||
static gboolean
|
||||
vips_foreign_load_png_stream_is_a_stream( VipsStreami *streami )
|
||||
vips_foreign_load_png_stream_is_a_source( VipsSource *source )
|
||||
{
|
||||
return( vips__png_ispng_stream( streami ) );
|
||||
return( vips__png_ispng_stream( source ) );
|
||||
}
|
||||
|
||||
static void
|
||||
@ -217,14 +217,14 @@ vips_foreign_load_png_stream_class_init( VipsForeignLoadPngStreamClass *class )
|
||||
object_class->description = _( "load png from stream" );
|
||||
object_class->build = vips_foreign_load_png_stream_build;
|
||||
|
||||
load_class->is_a_stream = vips_foreign_load_png_stream_is_a_stream;
|
||||
load_class->is_a_source = vips_foreign_load_png_stream_is_a_source;
|
||||
|
||||
VIPS_ARG_OBJECT( class, "streami", 1,
|
||||
VIPS_ARG_OBJECT( class, "source", 1,
|
||||
_( "Streami" ),
|
||||
_( "Stream to load from" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsForeignLoadPngStream, streami ),
|
||||
VIPS_TYPE_STREAMI );
|
||||
G_STRUCT_OFFSET( VipsForeignLoadPngStream, source ),
|
||||
VIPS_TYPE_SOURCE );
|
||||
|
||||
}
|
||||
|
||||
@ -254,7 +254,7 @@ vips_foreign_load_png_file_build( VipsObject *object )
|
||||
VipsForeignLoadPngFile *file = (VipsForeignLoadPngFile *) object;
|
||||
|
||||
if( file->filename &&
|
||||
!(png->streami = vips_streami_new_from_file( file->filename )) )
|
||||
!(png->source = vips_source_new_from_file( file->filename )) )
|
||||
return( -1 );
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_load_png_file_parent_class )->
|
||||
@ -267,13 +267,13 @@ vips_foreign_load_png_file_build( VipsObject *object )
|
||||
static gboolean
|
||||
vips_foreign_load_png_file_is_a( const char *filename )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gboolean result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( FALSE );
|
||||
result = vips_foreign_load_png_stream_is_a_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips_foreign_load_png_stream_is_a_source( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -331,7 +331,7 @@ vips_foreign_load_png_buffer_build( VipsObject *object )
|
||||
VipsForeignLoadPngBuffer *buffer = (VipsForeignLoadPngBuffer *) object;
|
||||
|
||||
if( buffer->blob &&
|
||||
!(png->streami = vips_streami_new_from_memory(
|
||||
!(png->source = vips_source_new_from_memory(
|
||||
VIPS_AREA( buffer->blob )->data,
|
||||
VIPS_AREA( buffer->blob )->length )) )
|
||||
return( -1 );
|
||||
@ -346,13 +346,13 @@ vips_foreign_load_png_buffer_build( VipsObject *object )
|
||||
static gboolean
|
||||
vips_foreign_load_png_buffer_is_a_buffer( const void *buf, size_t len )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gboolean result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_memory( buf, len )) )
|
||||
if( !(source = vips_source_new_from_memory( buf, len )) )
|
||||
return( FALSE );
|
||||
result = vips_foreign_load_png_stream_is_a_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips_foreign_load_png_stream_is_a_source( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -455,8 +455,8 @@ vips_pngload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_pngload_stream:
|
||||
* @streami: stream to load from
|
||||
* vips_pngload_source:
|
||||
* @source: stream to load from
|
||||
* @out: (out): image to write
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
@ -467,13 +467,13 @@ vips_pngload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_pngload_stream( VipsStreami *streami, VipsImage **out, ... )
|
||||
vips_pngload_source( VipsSource *source, VipsImage **out, ... )
|
||||
{
|
||||
va_list ap;
|
||||
int result;
|
||||
|
||||
va_start( ap, out );
|
||||
result = vips_call_split( "pngload_stream", ap, streami, out );
|
||||
result = vips_call_split( "pngload_stream", ap, source, out );
|
||||
va_end( ap );
|
||||
|
||||
return( result );
|
||||
|
@ -182,7 +182,7 @@ vips_foreign_save_png_init( VipsForeignSavePng *png )
|
||||
typedef struct _VipsForeignSavePngStream {
|
||||
VipsForeignSavePng parent_object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
} VipsForeignSavePngStream;
|
||||
|
||||
typedef VipsForeignSavePngClass VipsForeignSavePngStreamClass;
|
||||
@ -201,7 +201,7 @@ vips_foreign_save_png_stream_build( VipsObject *object )
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( vips__png_write_stream( save->ready, stream->streamo,
|
||||
if( vips__png_write_stream( save->ready, stream->target,
|
||||
png->compression, png->interlace, png->profile, png->filter,
|
||||
save->strip, png->palette, png->colours, png->Q, png->dither ) )
|
||||
return( -1 );
|
||||
@ -222,12 +222,12 @@ vips_foreign_save_png_stream_class_init( VipsForeignSavePngStreamClass *class )
|
||||
object_class->description = _( "save image to png stream" );
|
||||
object_class->build = vips_foreign_save_png_stream_build;
|
||||
|
||||
VIPS_ARG_OBJECT( class, "streamo", 1,
|
||||
VIPS_ARG_OBJECT( class, "target", 1,
|
||||
_( "Streamo" ),
|
||||
_( "Stream to save to" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsForeignSavePngStream, streamo ),
|
||||
VIPS_TYPE_STREAMO );
|
||||
G_STRUCT_OFFSET( VipsForeignSavePngStream, target ),
|
||||
VIPS_TYPE_TARGET );
|
||||
|
||||
}
|
||||
|
||||
@ -254,22 +254,22 @@ vips_foreign_save_png_file_build( VipsObject *object )
|
||||
VipsForeignSavePng *png = (VipsForeignSavePng *) object;
|
||||
VipsForeignSavePngFile *png_file = (VipsForeignSavePngFile *) object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_save_png_file_parent_class )->
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_file( png_file->filename )) )
|
||||
if( !(target = vips_target_new_to_file( png_file->filename )) )
|
||||
return( -1 );
|
||||
if( vips__png_write_stream( save->ready, streamo,
|
||||
if( vips__png_write_stream( save->ready, target,
|
||||
png->compression, png->interlace,
|
||||
png->profile, png->filter, save->strip, png->palette,
|
||||
png->colours, png->Q, png->dither ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -318,29 +318,29 @@ vips_foreign_save_png_buffer_build( VipsObject *object )
|
||||
VipsForeignSavePng *png = (VipsForeignSavePng *) object;
|
||||
VipsForeignSavePngBuffer *buffer = (VipsForeignSavePngBuffer *) object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
VipsBlob *blob;
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_save_png_buffer_parent_class )->
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_memory()) )
|
||||
if( !(target = vips_target_new_to_memory()) )
|
||||
return( -1 );
|
||||
|
||||
if( vips__png_write_stream( save->ready, streamo,
|
||||
if( vips__png_write_stream( save->ready, target,
|
||||
png->compression, png->interlace, png->profile, png->filter,
|
||||
save->strip, png->palette, png->colours, png->Q,
|
||||
png->dither ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
g_object_get( streamo, "blob", &blob, NULL );
|
||||
g_object_get( target, "blob", &blob, NULL );
|
||||
g_object_set( buffer, "buffer", blob, NULL );
|
||||
vips_area_unref( VIPS_AREA( blob ) );
|
||||
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -498,9 +498,9 @@ vips_pngsave_buffer( VipsImage *in, void **buf, size_t *len, ... )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_pngsave_stream: (method)
|
||||
* vips_pngsave_target: (method)
|
||||
* @in: image to save
|
||||
* @streamo: save image to this stream
|
||||
* @target: save image to this stream
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
* Optional arguments:
|
||||
@ -516,18 +516,18 @@ vips_pngsave_buffer( VipsImage *in, void **buf, size_t *len, ... )
|
||||
*
|
||||
* As vips_pngsave(), but save to a stream.
|
||||
*
|
||||
* See also: vips_pngsave(), vips_image_write_to_stream().
|
||||
* See also: vips_pngsave(), vips_image_write_to_target().
|
||||
*
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_pngsave_stream( VipsImage *in, VipsStreamo *streamo, ... )
|
||||
vips_pngsave_target( VipsImage *in, VipsTarget *target, ... )
|
||||
{
|
||||
va_list ap;
|
||||
int result;
|
||||
|
||||
va_start( ap, streamo );
|
||||
result = vips_call_split( "pngsave_stream", ap, in, streamo );
|
||||
va_start( ap, target );
|
||||
result = vips_call_split( "pngsave_stream", ap, in, target );
|
||||
va_end( ap );
|
||||
|
||||
return( result );
|
||||
|
@ -90,7 +90,7 @@ typedef struct _VipsForeignLoadPpm {
|
||||
|
||||
/* The stream we load from, and the buffered wrapper for it.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
VipsBufis *bufis;
|
||||
|
||||
/* Properties of this ppm, from the header.
|
||||
@ -134,11 +134,11 @@ static char *magic_names[] = {
|
||||
const char *vips__ppm_suffs[] = { ".ppm", ".pgm", ".pbm", ".pfm", NULL };
|
||||
|
||||
static gboolean
|
||||
vips_foreign_load_ppm_is_a_stream( VipsStreami *streami )
|
||||
vips_foreign_load_ppm_is_a_source( VipsSource *source )
|
||||
{
|
||||
const unsigned char *data;
|
||||
|
||||
if( (data = vips_streami_sniff( streami, 2 )) ) {
|
||||
if( (data = vips_source_sniff( source, 2 )) ) {
|
||||
int i;
|
||||
|
||||
for( i = 0; i < VIPS_NUMBER( magic_names ); i++ )
|
||||
@ -185,7 +185,7 @@ vips_foreign_load_ppm_dispose( GObject *gobject )
|
||||
VipsForeignLoadPpm *ppm = (VipsForeignLoadPpm *) gobject;
|
||||
|
||||
VIPS_UNREF( ppm->bufis );
|
||||
VIPS_UNREF( ppm->streami );
|
||||
VIPS_UNREF( ppm->source );
|
||||
|
||||
G_OBJECT_CLASS( vips_foreign_load_ppm_parent_class )->
|
||||
dispose( gobject );
|
||||
@ -213,7 +213,7 @@ vips_foreign_load_ppm_parse_header( VipsForeignLoadPpm *ppm )
|
||||
1, 1, 1, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
if( vips_streami_rewind( ppm->streami ) )
|
||||
if( vips_source_rewind( ppm->source ) )
|
||||
return( -1 );
|
||||
|
||||
/* Read in the magic number.
|
||||
@ -331,14 +331,14 @@ vips_foreign_load_ppm_get_flags( VipsForeignLoad *load )
|
||||
|
||||
flags = 0;
|
||||
|
||||
/* If this streami supports fast mmap and this PPM is >=8 bit binary,
|
||||
/* If this source supports fast mmap and this PPM is >=8 bit binary,
|
||||
* then we can mmap the file and support partial load. Otherwise,
|
||||
* it's sequential.
|
||||
*/
|
||||
if( !ppm->have_read_header &&
|
||||
vips_foreign_load_ppm_parse_header( ppm ) )
|
||||
return( 0 );
|
||||
if( vips_streami_is_mappable( ppm->streami ) &&
|
||||
if( vips_source_is_mappable( ppm->source ) &&
|
||||
!ppm->ascii &&
|
||||
ppm->bits >= 8 )
|
||||
flags |= VIPS_FOREIGN_PARTIAL;
|
||||
@ -366,7 +366,7 @@ vips_foreign_load_ppm_set_image( VipsForeignLoadPpm *ppm, VipsImage *image )
|
||||
"ppm-max-value", VIPS_ABS( ppm->max_value ) );
|
||||
|
||||
VIPS_SETSTR( image->filename,
|
||||
vips_stream_filename( VIPS_STREAM( ppm->bufis->streami ) ) );
|
||||
vips_connection_filename( VIPS_CONNECTION( ppm->bufis->source ) ) );
|
||||
}
|
||||
|
||||
static int
|
||||
@ -380,7 +380,7 @@ vips_foreign_load_ppm_header( VipsForeignLoad *load )
|
||||
|
||||
vips_foreign_load_ppm_set_image( ppm, load->out );
|
||||
|
||||
vips_streami_minimise( ppm->streami );
|
||||
vips_source_minimise( ppm->source );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -398,8 +398,8 @@ vips_foreign_load_ppm_map( VipsForeignLoadPpm *ppm, VipsImage *image )
|
||||
const void *data;
|
||||
|
||||
vips_bufis_unbuffer( ppm->bufis );
|
||||
header_offset = vips_streami_seek( ppm->streami, 0, SEEK_CUR );
|
||||
data = vips_streami_map( ppm->streami, &length );
|
||||
header_offset = vips_source_seek( ppm->source, 0, SEEK_CUR );
|
||||
data = vips_source_map( ppm->source, &length );
|
||||
if( header_offset < 0 ||
|
||||
!data )
|
||||
return( -1 );
|
||||
@ -435,7 +435,7 @@ vips_foreign_load_ppm_generate_binary( VipsRegion *or,
|
||||
|
||||
size_t bytes_read;
|
||||
|
||||
bytes_read = vips_streami_read( ppm->streami, q, sizeof_line );
|
||||
bytes_read = vips_source_read( ppm->source, q, sizeof_line );
|
||||
if( bytes_read != sizeof_line ) {
|
||||
vips_error( class->nickname,
|
||||
"%s", _( "file truncated" ) );
|
||||
@ -564,7 +564,7 @@ vips_foreign_load_ppm_load( VipsForeignLoad *load )
|
||||
|
||||
/* If the stream is mappable and this is a binary file, we can map it.
|
||||
*/
|
||||
if( vips_streami_is_mappable( ppm->streami ) &&
|
||||
if( vips_source_is_mappable( ppm->source ) &&
|
||||
!ppm->ascii &&
|
||||
ppm->bits >= 8 ) {
|
||||
if( vips_foreign_load_ppm_map( ppm, load->real ) )
|
||||
@ -599,7 +599,7 @@ vips_foreign_load_ppm_load( VipsForeignLoad *load )
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
if( vips_streami_decode( ppm->streami ) )
|
||||
if( vips_source_decode( ppm->source ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -653,13 +653,13 @@ G_DEFINE_TYPE( VipsForeignLoadPpmFile, vips_foreign_load_ppm_file,
|
||||
static gboolean
|
||||
vips_foreign_load_ppm_file_is_a( const char *filename )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gboolean result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( FALSE );
|
||||
result = vips_foreign_load_ppm_is_a_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips_foreign_load_ppm_is_a_source( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -671,10 +671,10 @@ vips_foreign_load_ppm_file_build( VipsObject *object )
|
||||
VipsForeignLoadPpm *ppm = (VipsForeignLoadPpm *) object;
|
||||
|
||||
if( file->filename ) {
|
||||
if( !(ppm->streami =
|
||||
vips_streami_new_from_file( file->filename )) )
|
||||
if( !(ppm->source =
|
||||
vips_source_new_from_file( file->filename )) )
|
||||
return( -1 );
|
||||
ppm->bufis = vips_bufis_new_from_streami( ppm->streami );
|
||||
ppm->bufis = vips_bufis_new_from_source( ppm->source );
|
||||
}
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_load_ppm_file_parent_class )->
|
||||
|
@ -61,7 +61,7 @@ typedef int (*VipsSavePpmFn)( VipsForeignSavePpm *, VipsImage *, VipsPel * );
|
||||
typedef struct _VipsForeignSavePpm {
|
||||
VipsForeignSave parent_object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
gboolean ascii;
|
||||
gboolean squash;
|
||||
|
||||
@ -78,9 +78,9 @@ vips_foreign_save_ppm_dispose( GObject *gobject )
|
||||
{
|
||||
VipsForeignSavePpm *ppm = (VipsForeignSavePpm *) gobject;
|
||||
|
||||
if( ppm->streamo )
|
||||
vips_streamo_finish( ppm->streamo );
|
||||
VIPS_UNREF( ppm->streamo );
|
||||
if( ppm->target )
|
||||
vips_target_finish( ppm->target );
|
||||
VIPS_UNREF( ppm->target );
|
||||
|
||||
G_OBJECT_CLASS( vips_foreign_save_ppm_parent_class )->
|
||||
dispose( gobject );
|
||||
@ -97,17 +97,17 @@ vips_foreign_save_ppm_line_ascii( VipsForeignSavePpm *ppm,
|
||||
for( i = 0; i < n_elements; i++ ) {
|
||||
switch( image->BandFmt ) {
|
||||
case VIPS_FORMAT_UCHAR:
|
||||
vips_streamo_writef( ppm->streamo,
|
||||
vips_target_writef( ppm->target,
|
||||
"%d ", p[i] );
|
||||
break;
|
||||
|
||||
case VIPS_FORMAT_USHORT:
|
||||
vips_streamo_writef( ppm->streamo,
|
||||
vips_target_writef( ppm->target,
|
||||
"%d ", ((unsigned short *) p)[i] );
|
||||
break;
|
||||
|
||||
case VIPS_FORMAT_UINT:
|
||||
vips_streamo_writef( ppm->streamo,
|
||||
vips_target_writef( ppm->target,
|
||||
"%d ", ((unsigned int *) p)[i] );
|
||||
break;
|
||||
|
||||
@ -116,7 +116,7 @@ vips_foreign_save_ppm_line_ascii( VipsForeignSavePpm *ppm,
|
||||
}
|
||||
}
|
||||
|
||||
if( vips_streamo_writes( ppm->streamo, "\n" ) )
|
||||
if( vips_target_writes( ppm->target, "\n" ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -129,9 +129,9 @@ vips_foreign_save_ppm_line_ascii_squash( VipsForeignSavePpm *ppm,
|
||||
int x;
|
||||
|
||||
for( x = 0; x < image->Xsize; x++ )
|
||||
vips_streamo_writef( ppm->streamo, "%d ", p[x] ? 0 : 1 );
|
||||
vips_target_writef( ppm->target, "%d ", p[x] ? 0 : 1 );
|
||||
|
||||
if( vips_streamo_writes( ppm->streamo, "\n" ) )
|
||||
if( vips_target_writes( ppm->target, "\n" ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -141,7 +141,7 @@ static int
|
||||
vips_foreign_save_ppm_line_binary( VipsForeignSavePpm *ppm,
|
||||
VipsImage *image, VipsPel *p )
|
||||
{
|
||||
if( vips_streamo_write( ppm->streamo,
|
||||
if( vips_target_write( ppm->target,
|
||||
p, VIPS_IMAGE_SIZEOF_LINE( image ) ) )
|
||||
return( -1 );
|
||||
|
||||
@ -164,7 +164,7 @@ vips_foreign_save_ppm_line_binary_squash( VipsForeignSavePpm *ppm,
|
||||
bits |= p[x] ? 0 : 1;
|
||||
|
||||
if( n_bits == 8 ) {
|
||||
if( VIPS_STREAMO_PUTC( ppm->streamo, bits ) )
|
||||
if( VIPS_TARGET_PUTC( ppm->target, bits ) )
|
||||
return( -1 );
|
||||
|
||||
bits = 0;
|
||||
@ -175,7 +175,7 @@ vips_foreign_save_ppm_line_binary_squash( VipsForeignSavePpm *ppm,
|
||||
/* Flush any remaining bits in this line.
|
||||
*/
|
||||
if( n_bits &&
|
||||
VIPS_STREAMO_PUTC( ppm->streamo, bits ) )
|
||||
VIPS_TARGET_PUTC( ppm->target, bits ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -234,28 +234,28 @@ vips_foreign_save_ppm( VipsForeignSavePpm *ppm, VipsImage *image )
|
||||
else
|
||||
g_assert_not_reached();
|
||||
|
||||
vips_streamo_writef( ppm->streamo, "%s\n", magic );
|
||||
vips_target_writef( ppm->target, "%s\n", magic );
|
||||
date = vips__get_iso8601();
|
||||
vips_streamo_writef( ppm->streamo,
|
||||
vips_target_writef( ppm->target,
|
||||
"#vips2ppm - %s\n", date );
|
||||
g_free( date );
|
||||
vips_streamo_writef( ppm->streamo,
|
||||
vips_target_writef( ppm->target,
|
||||
"%d %d\n", image->Xsize, image->Ysize );
|
||||
|
||||
if( !ppm->squash )
|
||||
switch( image->BandFmt ) {
|
||||
case VIPS_FORMAT_UCHAR:
|
||||
vips_streamo_writef( ppm->streamo,
|
||||
vips_target_writef( ppm->target,
|
||||
"%d\n", UCHAR_MAX );
|
||||
break;
|
||||
|
||||
case VIPS_FORMAT_USHORT:
|
||||
vips_streamo_writef( ppm->streamo,
|
||||
vips_target_writef( ppm->target,
|
||||
"%d\n", USHRT_MAX );
|
||||
break;
|
||||
|
||||
case VIPS_FORMAT_UINT:
|
||||
vips_streamo_writef( ppm->streamo,
|
||||
vips_target_writef( ppm->target,
|
||||
"%d\n", UINT_MAX );
|
||||
break;
|
||||
|
||||
@ -272,7 +272,7 @@ vips_foreign_save_ppm( VipsForeignSavePpm *ppm, VipsImage *image )
|
||||
/* Need to be locale independent.
|
||||
*/
|
||||
g_ascii_dtostr( buf, G_ASCII_DTOSTR_BUF_SIZE, scale );
|
||||
vips_streamo_writes( ppm->streamo, buf );
|
||||
vips_target_writes( ppm->target, buf );
|
||||
}
|
||||
break;
|
||||
|
||||
@ -416,7 +416,7 @@ vips_foreign_save_ppm_file_build( VipsObject *object )
|
||||
VipsForeignSavePpmFile *file = (VipsForeignSavePpmFile *) object;
|
||||
|
||||
if( file->filename &&
|
||||
!(ppm->streamo = vips_streamo_new_to_file( file->filename )) )
|
||||
!(ppm->target = vips_target_new_to_file( file->filename )) )
|
||||
return( -1 );
|
||||
|
||||
return( VIPS_OBJECT_CLASS( vips_foreign_save_ppm_file_parent_class )->
|
||||
|
@ -28,7 +28,7 @@
|
||||
* - fix a buffer overflow for incorrectly coded old-style RLE
|
||||
* [HongxuChen]
|
||||
* 6/11/19
|
||||
* - revise for VipsStream
|
||||
* - revise for VipsConnection
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -722,7 +722,7 @@ typedef struct {
|
||||
} Read;
|
||||
|
||||
int
|
||||
vips__rad_israd( VipsStreami *streami )
|
||||
vips__rad_israd( VipsSource *source )
|
||||
{
|
||||
VipsBufis *bufis;
|
||||
const char *line;
|
||||
@ -730,7 +730,7 @@ vips__rad_israd( VipsStreami *streami )
|
||||
|
||||
/* Just test that the first line is the magic string.
|
||||
*/
|
||||
bufis = vips_bufis_new_from_streami( streami );
|
||||
bufis = vips_bufis_new_from_source( source );
|
||||
result = (line = vips_bufis_get_line( bufis )) &&
|
||||
strcmp( line, "#?RADIANCE" ) == 0;
|
||||
VIPS_UNREF( bufis );
|
||||
@ -748,22 +748,22 @@ static void
|
||||
read_minimise_cb( VipsObject *object, Read *read )
|
||||
{
|
||||
if( read->bufis )
|
||||
vips_streami_minimise( read->bufis->streami );
|
||||
vips_source_minimise( read->bufis->source );
|
||||
}
|
||||
|
||||
static Read *
|
||||
read_new( VipsStreami *streami, VipsImage *out )
|
||||
read_new( VipsSource *source, VipsImage *out )
|
||||
{
|
||||
Read *read;
|
||||
int i;
|
||||
|
||||
if( vips_streami_rewind( streami ) )
|
||||
if( vips_source_rewind( source ) )
|
||||
return( NULL );
|
||||
|
||||
if( !(read = VIPS_NEW( out, Read )) )
|
||||
return( NULL );
|
||||
|
||||
read->bufis = vips_bufis_new_from_streami( streami );
|
||||
read->bufis = vips_bufis_new_from_source( source );
|
||||
read->out = out;
|
||||
strcpy( read->format, COLRFMT );
|
||||
read->expos = 1.0;
|
||||
@ -869,8 +869,8 @@ rad2vips_get_header( Read *read, VipsImage *out )
|
||||
1, read->aspect );
|
||||
|
||||
VIPS_SETSTR( out->filename,
|
||||
vips_stream_filename(
|
||||
VIPS_STREAM( read->bufis->streami ) ) );
|
||||
vips_connection_filename(
|
||||
VIPS_CONNECTION( read->bufis->source ) ) );
|
||||
|
||||
vips_image_pipelinev( out, VIPS_DEMAND_STYLE_THINSTRIP, NULL );
|
||||
|
||||
@ -893,15 +893,15 @@ rad2vips_get_header( Read *read, VipsImage *out )
|
||||
}
|
||||
|
||||
int
|
||||
vips__rad_header( VipsStreami *streami, VipsImage *out )
|
||||
vips__rad_header( VipsSource *source, VipsImage *out )
|
||||
{
|
||||
Read *read;
|
||||
|
||||
if( !(read = read_new( streami, out )) )
|
||||
if( !(read = read_new( source, out )) )
|
||||
return( -1 );
|
||||
if( rad2vips_get_header( read, read->out ) )
|
||||
return( -1 );
|
||||
vips_streami_minimise( streami );
|
||||
vips_source_minimise( source );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -940,7 +940,7 @@ rad2vips_generate( VipsRegion *or,
|
||||
}
|
||||
|
||||
int
|
||||
vips__rad_load( VipsStreami *streami, VipsImage *out )
|
||||
vips__rad_load( VipsSource *source, VipsImage *out )
|
||||
{
|
||||
VipsImage **t = (VipsImage **)
|
||||
vips_object_local_array( VIPS_OBJECT( out ), 3 );
|
||||
@ -949,10 +949,10 @@ vips__rad_load( VipsStreami *streami, VipsImage *out )
|
||||
|
||||
#ifdef DEBUG
|
||||
printf( "rad2vips: reading \"%s\"\n",
|
||||
vips_stream_nick( VIPS_STREAM( streami ) ) );
|
||||
vips_connection_nick( VIPS_CONNECTION( source ) ) );
|
||||
#endif /*DEBUG*/
|
||||
|
||||
if( !(read = read_new( streami, out )) )
|
||||
if( !(read = read_new( source, out )) )
|
||||
return( -1 );
|
||||
|
||||
t[0] = vips_image_new();
|
||||
@ -967,7 +967,7 @@ vips__rad_load( VipsStreami *streami, VipsImage *out )
|
||||
vips_image_write( t[1], out ) )
|
||||
return( -1 );
|
||||
|
||||
if( vips_streami_decode( streami ) )
|
||||
if( vips_source_decode( source ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -977,7 +977,7 @@ vips__rad_load( VipsStreami *streami, VipsImage *out )
|
||||
*/
|
||||
typedef struct {
|
||||
VipsImage *in;
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
char format[256];
|
||||
double expos;
|
||||
@ -992,13 +992,13 @@ static void
|
||||
write_destroy( Write *write )
|
||||
{
|
||||
VIPS_FREE( write->line );
|
||||
VIPS_UNREF( write->streamo );
|
||||
VIPS_UNREF( write->target );
|
||||
|
||||
vips_free( write );
|
||||
}
|
||||
|
||||
static Write *
|
||||
write_new( VipsImage *in, VipsStreamo *streamo )
|
||||
write_new( VipsImage *in, VipsTarget *target )
|
||||
{
|
||||
Write *write;
|
||||
int i;
|
||||
@ -1007,8 +1007,8 @@ write_new( VipsImage *in, VipsStreamo *streamo )
|
||||
return( NULL );
|
||||
|
||||
write->in = in;
|
||||
write->streamo = streamo;
|
||||
g_object_ref( streamo );
|
||||
write->target = target;
|
||||
g_object_ref( target );
|
||||
|
||||
strcpy( write->format, COLRFMT );
|
||||
write->expos = 1.0;
|
||||
@ -1082,25 +1082,25 @@ vips2rad_put_header( Write *write )
|
||||
{
|
||||
vips2rad_make_header( write );
|
||||
|
||||
vips_streamo_writes( write->streamo, "#?RADIANCE\n" );
|
||||
vips_streamo_writef( write->streamo, "%s%s\n", FMTSTR, write->format );
|
||||
vips_streamo_writef( write->streamo, "%s%e\n", EXPOSSTR, write->expos );
|
||||
vips_streamo_writef( write->streamo,
|
||||
vips_target_writes( write->target, "#?RADIANCE\n" );
|
||||
vips_target_writef( write->target, "%s%s\n", FMTSTR, write->format );
|
||||
vips_target_writef( write->target, "%s%e\n", EXPOSSTR, write->expos );
|
||||
vips_target_writef( write->target,
|
||||
"%s %f %f %f\n", COLCORSTR,
|
||||
write->colcor[RED], write->colcor[GRN], write->colcor[BLU] );
|
||||
vips_streamo_writef( write->streamo,
|
||||
vips_target_writef( write->target,
|
||||
"SOFTWARE=vips %s\n", vips_version_string() );
|
||||
vips_streamo_writef( write->streamo,
|
||||
vips_target_writef( write->target,
|
||||
"%s%f\n", ASPECTSTR, write->aspect );
|
||||
vips_streamo_writef( write->streamo,
|
||||
vips_target_writef( write->target,
|
||||
"%s %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f\n",
|
||||
PRIMARYSTR,
|
||||
write->prims[RED][CIEX], write->prims[RED][CIEY],
|
||||
write->prims[GRN][CIEX], write->prims[GRN][CIEY],
|
||||
write->prims[BLU][CIEX], write->prims[BLU][CIEY],
|
||||
write->prims[WHT][CIEX], write->prims[WHT][CIEY] );
|
||||
vips_streamo_writes( write->streamo, "\n" );
|
||||
vips_streamo_writes( write->streamo,
|
||||
vips_target_writes( write->target, "\n" );
|
||||
vips_target_writes( write->target,
|
||||
resolu2str( resolu_buf, &write->rs ) );
|
||||
|
||||
return( 0 );
|
||||
@ -1115,7 +1115,7 @@ scanline_write( Write *write, COLR *scanline, int width )
|
||||
width > MAXELEN ) {
|
||||
/* Too large or small for RLE ... do a simple write.
|
||||
*/
|
||||
if( vips_streamo_write( write->streamo,
|
||||
if( vips_target_write( write->target,
|
||||
scanline, sizeof( COLR ) * width ) )
|
||||
return( -1 );
|
||||
}
|
||||
@ -1126,7 +1126,7 @@ scanline_write( Write *write, COLR *scanline, int width )
|
||||
*/
|
||||
rle_scanline_write( scanline, width, write->line, &length );
|
||||
|
||||
if( vips_streamo_write( write->streamo, write->line, length ) )
|
||||
if( vips_target_write( write->target, write->line, length ) )
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
@ -1159,7 +1159,7 @@ vips2rad_put_data( Write *write )
|
||||
}
|
||||
|
||||
int
|
||||
vips__rad_save( VipsImage *in, VipsStreamo *streamo )
|
||||
vips__rad_save( VipsImage *in, VipsTarget *target )
|
||||
{
|
||||
Write *write;
|
||||
|
||||
@ -1170,7 +1170,7 @@ vips__rad_save( VipsImage *in, VipsStreamo *streamo )
|
||||
if( vips_image_pio_input( in ) ||
|
||||
vips_check_coding_rad( "vips2rad", in ) )
|
||||
return( -1 );
|
||||
if( !(write = write_new( in, streamo )) )
|
||||
if( !(write = write_new( in, target )) )
|
||||
return( -1 );
|
||||
|
||||
if( vips2rad_put_header( write ) ||
|
||||
@ -1179,7 +1179,7 @@ vips__rad_save( VipsImage *in, VipsStreamo *streamo )
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
vips_streamo_finish( streamo );
|
||||
vips_target_finish( target );
|
||||
|
||||
write_destroy( write );
|
||||
|
||||
|
@ -57,7 +57,7 @@ typedef struct _VipsForeignLoadRad {
|
||||
|
||||
/* Set by subclasses.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
} VipsForeignLoadRad;
|
||||
|
||||
@ -71,7 +71,7 @@ vips_foreign_load_rad_dispose( GObject *gobject )
|
||||
{
|
||||
VipsForeignLoadRad *rad = (VipsForeignLoadRad *) gobject;
|
||||
|
||||
VIPS_UNREF( rad->streami );
|
||||
VIPS_UNREF( rad->source );
|
||||
|
||||
G_OBJECT_CLASS( vips_foreign_load_rad_parent_class )->
|
||||
dispose( gobject );
|
||||
@ -94,7 +94,7 @@ vips_foreign_load_rad_header( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadRad *rad = (VipsForeignLoadRad *) load;
|
||||
|
||||
if( vips__rad_header( rad->streami, load->out ) )
|
||||
if( vips__rad_header( rad->source, load->out ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -105,7 +105,7 @@ vips_foreign_load_rad_load( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadRad *rad = (VipsForeignLoadRad *) load;
|
||||
|
||||
if( vips__rad_load( rad->streami, load->real ) )
|
||||
if( vips__rad_load( rad->source, load->real ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -146,7 +146,7 @@ typedef struct _VipsForeignLoadRadStream {
|
||||
|
||||
/* Load from a stream.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
} VipsForeignLoadRadStream;
|
||||
|
||||
@ -161,9 +161,9 @@ vips_foreign_load_rad_stream_build( VipsObject *object )
|
||||
VipsForeignLoadRad *rad = (VipsForeignLoadRad *) object;
|
||||
VipsForeignLoadRadStream *stream = (VipsForeignLoadRadStream *) object;
|
||||
|
||||
if( stream->streami ) {
|
||||
rad->streami = stream->streami;
|
||||
g_object_ref( rad->streami );
|
||||
if( stream->source ) {
|
||||
rad->source = stream->source;
|
||||
g_object_ref( rad->source );
|
||||
}
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_load_rad_stream_parent_class )->
|
||||
@ -174,9 +174,9 @@ vips_foreign_load_rad_stream_build( VipsObject *object )
|
||||
}
|
||||
|
||||
static gboolean
|
||||
vips_foreign_load_rad_stream_is_a_stream( VipsStreami *streami )
|
||||
vips_foreign_load_rad_stream_is_a_source( VipsSource *source )
|
||||
{
|
||||
return( vips__rad_israd( streami ) );
|
||||
return( vips__rad_israd( source ) );
|
||||
}
|
||||
|
||||
static void
|
||||
@ -193,14 +193,14 @@ vips_foreign_load_rad_stream_class_init( VipsForeignLoadRadStreamClass *class )
|
||||
object_class->description = _( "load rad from stream" );
|
||||
object_class->build = vips_foreign_load_rad_stream_build;
|
||||
|
||||
load_class->is_a_stream = vips_foreign_load_rad_stream_is_a_stream;
|
||||
load_class->is_a_source = vips_foreign_load_rad_stream_is_a_source;
|
||||
|
||||
VIPS_ARG_OBJECT( class, "streami", 1,
|
||||
VIPS_ARG_OBJECT( class, "source", 1,
|
||||
_( "Streami" ),
|
||||
_( "Stream to load from" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsForeignLoadRadStream, streami ),
|
||||
VIPS_TYPE_STREAMI );
|
||||
G_STRUCT_OFFSET( VipsForeignLoadRadStream, source ),
|
||||
VIPS_TYPE_SOURCE );
|
||||
|
||||
}
|
||||
|
||||
@ -230,7 +230,7 @@ vips_foreign_load_rad_file_build( VipsObject *object )
|
||||
VipsForeignLoadRadFile *file = (VipsForeignLoadRadFile *) object;
|
||||
|
||||
if( file->filename &&
|
||||
!(rad->streami = vips_streami_new_from_file( file->filename )) )
|
||||
!(rad->source = vips_source_new_from_file( file->filename )) )
|
||||
return( -1 );
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_load_rad_file_parent_class )->
|
||||
@ -243,13 +243,13 @@ vips_foreign_load_rad_file_build( VipsObject *object )
|
||||
static int
|
||||
vips_foreign_load_rad_file_is_a( const char *filename )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
int result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( -1 );
|
||||
result = vips_foreign_load_rad_stream_is_a_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips_foreign_load_rad_stream_is_a_source( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -307,7 +307,7 @@ vips_foreign_load_rad_buffer_build( VipsObject *object )
|
||||
VipsForeignLoadRadBuffer *buffer = (VipsForeignLoadRadBuffer *) object;
|
||||
|
||||
if( buffer->blob &&
|
||||
!(rad->streami = vips_streami_new_from_memory(
|
||||
!(rad->source = vips_source_new_from_memory(
|
||||
VIPS_AREA( buffer->blob )->data,
|
||||
VIPS_AREA( buffer->blob )->length )) )
|
||||
return( -1 );
|
||||
@ -322,13 +322,13 @@ vips_foreign_load_rad_buffer_build( VipsObject *object )
|
||||
static gboolean
|
||||
vips_foreign_load_rad_buffer_is_a_buffer( const void *buf, size_t len )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gboolean result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_memory( buf, len )) )
|
||||
if( !(source = vips_source_new_from_memory( buf, len )) )
|
||||
return( FALSE );
|
||||
result = vips_foreign_load_rad_stream_is_a_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips_foreign_load_rad_stream_is_a_source( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -439,8 +439,8 @@ vips_radload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_radload_stream:
|
||||
* @streami: stream to load from
|
||||
* vips_radload_source:
|
||||
* @source: stream to load from
|
||||
* @out: (out): output image
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
@ -451,13 +451,13 @@ vips_radload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_radload_stream( VipsStreami *streami, VipsImage **out, ... )
|
||||
vips_radload_source( VipsSource *source, VipsImage **out, ... )
|
||||
{
|
||||
va_list ap;
|
||||
int result;
|
||||
|
||||
va_start( ap, out );
|
||||
result = vips_call_split( "radload_stream", ap, streami, out );
|
||||
result = vips_call_split( "radload_stream", ap, source, out );
|
||||
va_end( ap );
|
||||
|
||||
return( result );
|
||||
|
@ -122,19 +122,19 @@ vips_foreign_save_rad_file_build( VipsObject *object )
|
||||
VipsForeignSave *save = (VipsForeignSave *) object;
|
||||
VipsForeignSaveRadFile *file = (VipsForeignSaveRadFile *) object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_save_rad_file_parent_class )->
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_file( file->filename )) )
|
||||
if( !(target = vips_target_new_to_file( file->filename )) )
|
||||
return( -1 );
|
||||
if( vips__rad_save( save->ready, streamo ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
if( vips__rad_save( save->ready, target ) ) {
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -168,7 +168,7 @@ vips_foreign_save_rad_file_init( VipsForeignSaveRadFile *file )
|
||||
typedef struct _VipsForeignSaveRadStream {
|
||||
VipsForeignSaveRad parent_object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
} VipsForeignSaveRadStream;
|
||||
|
||||
typedef VipsForeignSaveRadClass VipsForeignSaveRadStreamClass;
|
||||
@ -186,7 +186,7 @@ vips_foreign_save_rad_stream_build( VipsObject *object )
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( vips__rad_save( save->ready, stream->streamo ) )
|
||||
if( vips__rad_save( save->ready, stream->target ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -205,12 +205,12 @@ vips_foreign_save_rad_stream_class_init( VipsForeignSaveRadStreamClass *class )
|
||||
object_class->description = _( "save image to Radiance stream" );
|
||||
object_class->build = vips_foreign_save_rad_stream_build;
|
||||
|
||||
VIPS_ARG_OBJECT( class, "streamo", 1,
|
||||
VIPS_ARG_OBJECT( class, "target", 1,
|
||||
_( "Streamo" ),
|
||||
_( "Stream to save to" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsForeignSaveRadStream, streamo ),
|
||||
VIPS_TYPE_STREAMO );
|
||||
G_STRUCT_OFFSET( VipsForeignSaveRadStream, target ),
|
||||
VIPS_TYPE_TARGET );
|
||||
|
||||
}
|
||||
|
||||
@ -235,26 +235,26 @@ vips_foreign_save_rad_buffer_build( VipsObject *object )
|
||||
{
|
||||
VipsForeignSave *save = (VipsForeignSave *) object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
VipsBlob *blob;
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_save_rad_buffer_parent_class )->
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_memory()) )
|
||||
if( !(target = vips_target_new_to_memory()) )
|
||||
return( -1 );
|
||||
|
||||
if( vips__rad_save( save->ready, streamo ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
if( vips__rad_save( save->ready, target ) ) {
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
g_object_get( streamo, "blob", &blob, NULL );
|
||||
g_object_get( target, "blob", &blob, NULL );
|
||||
g_object_set( save, "buffer", blob, NULL );
|
||||
vips_area_unref( VIPS_AREA( blob ) );
|
||||
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -360,9 +360,9 @@ vips_radsave_buffer( VipsImage *in, void **buf, size_t *len, ... )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_radsave_stream: (method)
|
||||
* vips_radsave_target: (method)
|
||||
* @in: image to save
|
||||
* @streamo: save image to this stream
|
||||
* @target: save image to this stream
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
* As vips_radsave(), but save to a stream.
|
||||
@ -372,13 +372,13 @@ vips_radsave_buffer( VipsImage *in, void **buf, size_t *len, ... )
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_radsave_stream( VipsImage *in, VipsStreamo *streamo, ... )
|
||||
vips_radsave_target( VipsImage *in, VipsTarget *target, ... )
|
||||
{
|
||||
va_list ap;
|
||||
int result;
|
||||
|
||||
va_start( ap, streamo );
|
||||
result = vips_call_split( "radsave_stream", ap, in, streamo );
|
||||
va_start( ap, target );
|
||||
result = vips_call_split( "radsave_stream", ap, in, target );
|
||||
va_end( ap );
|
||||
|
||||
return( result );
|
||||
|
@ -74,7 +74,7 @@
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
/* A GInputStream that's actually a VipsStreami under the hood. This lets us
|
||||
/* A GInputStream that's actually a VipsSource under the hood. This lets us
|
||||
* hook librsvg up to libvips using the GInputStream interface.
|
||||
*/
|
||||
|
||||
@ -93,16 +93,16 @@
|
||||
(G_TYPE_INSTANCE_GET_CLASS( (obj), \
|
||||
VIPS_TYPE_G_INPUT_STREAM, VipsGInputStreamClass ))
|
||||
|
||||
/* GInputStream <--> VipsStreami
|
||||
/* GInputStream <--> VipsSource
|
||||
*/
|
||||
typedef struct _VipsGInputStream {
|
||||
GInputStream parent_instance;
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* The VipsStreami we wrap.
|
||||
/* The VipsSource we wrap.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
} VipsGInputStream;
|
||||
|
||||
@ -130,7 +130,7 @@ vips_g_input_stream_get_property( GObject *object, guint prop_id,
|
||||
|
||||
switch( prop_id ) {
|
||||
case PROP_STREAM:
|
||||
g_value_set_object( value, gstream->streami );
|
||||
g_value_set_object( value, gstream->source );
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -146,7 +146,7 @@ vips_g_input_stream_set_property( GObject *object, guint prop_id,
|
||||
|
||||
switch( prop_id ) {
|
||||
case PROP_STREAM:
|
||||
gstream->streami = g_value_dup_object( value );
|
||||
gstream->source = g_value_dup_object( value );
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -159,7 +159,7 @@ vips_g_input_stream_finalize( GObject *object )
|
||||
{
|
||||
VipsGInputStream *gstream = VIPS_G_INPUT_STREAM( object );
|
||||
|
||||
VIPS_FREEF( g_object_unref, gstream->streami );
|
||||
VIPS_FREEF( g_object_unref, gstream->source );
|
||||
|
||||
G_OBJECT_CLASS( vips_g_input_stream_parent_class )->finalize( object );
|
||||
}
|
||||
@ -167,13 +167,13 @@ vips_g_input_stream_finalize( GObject *object )
|
||||
static goffset
|
||||
vips_g_input_stream_tell( GSeekable *seekable )
|
||||
{
|
||||
VipsStreami *streami = VIPS_G_INPUT_STREAM( seekable )->streami;
|
||||
VipsSource *source = VIPS_G_INPUT_STREAM( seekable )->source;
|
||||
|
||||
goffset pos;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_g_input_stream_tell:\n" );
|
||||
|
||||
pos = vips_streami_seek( streami, 0, SEEK_CUR );
|
||||
pos = vips_source_seek( source, 0, SEEK_CUR );
|
||||
if( pos == -1 )
|
||||
return( 0 );
|
||||
|
||||
@ -183,12 +183,12 @@ vips_g_input_stream_tell( GSeekable *seekable )
|
||||
static gboolean
|
||||
vips_g_input_stream_can_seek( GSeekable *seekable )
|
||||
{
|
||||
VipsStreami *streami = VIPS_G_INPUT_STREAM( seekable )->streami;
|
||||
VipsSource *source = VIPS_G_INPUT_STREAM( seekable )->source;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_g_input_stream_can_seek: %d\n",
|
||||
!streami->is_pipe );
|
||||
!source->is_pipe );
|
||||
|
||||
return( !streami->is_pipe );
|
||||
return( !source->is_pipe );
|
||||
}
|
||||
|
||||
static int
|
||||
@ -209,12 +209,12 @@ static gboolean
|
||||
vips_g_input_stream_seek( GSeekable *seekable, goffset offset,
|
||||
GSeekType type, GCancellable *cancellable, GError **error )
|
||||
{
|
||||
VipsStreami *streami = VIPS_G_INPUT_STREAM( seekable )->streami;
|
||||
VipsSource *source = VIPS_G_INPUT_STREAM( seekable )->source;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_g_input_stream_seek: offset = %" G_GINT64_FORMAT
|
||||
", type = %d\n", offset, type );
|
||||
|
||||
if( vips_streami_seek( streami, offset,
|
||||
if( vips_source_seek( source, offset,
|
||||
seek_type_to_lseek( type ) ) == -1 ) {
|
||||
g_set_error( error, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
@ -249,17 +249,17 @@ static gssize
|
||||
vips_g_input_stream_read( GInputStream *stream, void *buffer, gsize count,
|
||||
GCancellable *cancellable, GError **error )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gssize res;
|
||||
|
||||
streami = VIPS_G_INPUT_STREAM( stream )->streami;
|
||||
source = VIPS_G_INPUT_STREAM( stream )->source;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_g_input_stream_read: count: %zd\n", count );
|
||||
|
||||
if( g_cancellable_set_error_if_cancelled( cancellable, error ) )
|
||||
return( -1 );
|
||||
|
||||
if( (res = vips_streami_read( streami, buffer, count )) == -1 )
|
||||
if( (res = vips_source_read( source, buffer, count )) == -1 )
|
||||
g_set_error( error, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
_( "Error while reading: %s" ),
|
||||
@ -272,17 +272,17 @@ static gssize
|
||||
vips_g_input_stream_skip( GInputStream *stream, gsize count,
|
||||
GCancellable *cancellable, GError **error )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gssize position;
|
||||
|
||||
streami = VIPS_G_INPUT_STREAM( stream )->streami;
|
||||
source = VIPS_G_INPUT_STREAM( stream )->source;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_g_input_stream_skip: count: %zd\n", count );
|
||||
|
||||
if( g_cancellable_set_error_if_cancelled( cancellable, error ) )
|
||||
return( -1 );
|
||||
|
||||
position = vips_streami_seek( streami, count, SEEK_CUR );
|
||||
position = vips_source_seek( source, count, SEEK_CUR );
|
||||
if( position == -1 ) {
|
||||
g_set_error( error, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
@ -300,7 +300,7 @@ vips_g_input_stream_close( GInputStream *stream,
|
||||
{
|
||||
VipsGInputStream *gstream = VIPS_G_INPUT_STREAM( stream );
|
||||
|
||||
vips_streami_minimise( gstream->streami );
|
||||
vips_source_minimise( gstream->source );
|
||||
|
||||
return( TRUE );
|
||||
}
|
||||
@ -333,7 +333,7 @@ vips_g_input_stream_class_init( VipsGInputStreamClass *class )
|
||||
g_param_spec_object( "input",
|
||||
_( "Input" ),
|
||||
_( "Stream to wrap" ),
|
||||
VIPS_TYPE_STREAMI, G_PARAM_CONSTRUCT_ONLY |
|
||||
VIPS_TYPE_SOURCE, G_PARAM_CONSTRUCT_ONLY |
|
||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ) );
|
||||
|
||||
}
|
||||
@ -345,17 +345,17 @@ vips_g_input_stream_init( VipsGInputStream *gstream )
|
||||
|
||||
/**
|
||||
* g_input_stream_new_from_vips:
|
||||
* @streami: stream to wrap
|
||||
* @source: stream to wrap
|
||||
*
|
||||
* Create a new #GInputStream wrapping a #VipsStreami.
|
||||
* Create a new #GInputStream wrapping a #VipsSource.
|
||||
*
|
||||
* Returns: a new #GInputStream
|
||||
*/
|
||||
static GInputStream *
|
||||
g_input_stream_new_from_vips( VipsStreami *streami )
|
||||
g_input_stream_new_from_vips( VipsSource *source )
|
||||
{
|
||||
return( g_object_new( VIPS_TYPE_G_INPUT_STREAM,
|
||||
"input", streami,
|
||||
"input", source,
|
||||
NULL ) );
|
||||
}
|
||||
|
||||
@ -757,7 +757,7 @@ typedef struct _VipsForeignLoadSvgStream {
|
||||
|
||||
/* Load from a stream.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
} VipsForeignLoadSvgStream;
|
||||
|
||||
@ -767,12 +767,12 @@ G_DEFINE_TYPE( VipsForeignLoadSvgStream, vips_foreign_load_svg_stream,
|
||||
vips_foreign_load_svg_get_type() );
|
||||
|
||||
gboolean
|
||||
vips_foreign_load_svg_stream_is_a_stream( VipsStreami *streami )
|
||||
vips_foreign_load_svg_stream_is_a_source( VipsSource *source )
|
||||
{
|
||||
unsigned char *data;
|
||||
size_t bytes_read;
|
||||
|
||||
if( (bytes_read = vips_streami_sniff_at_most( streami,
|
||||
if( (bytes_read = vips_source_sniff_at_most( source,
|
||||
&data, SVG_HEADER_SIZE )) <= 0 )
|
||||
return( FALSE );
|
||||
|
||||
@ -791,10 +791,10 @@ vips_foreign_load_svg_stream_header( VipsForeignLoad *load )
|
||||
|
||||
GInputStream *gstream;
|
||||
|
||||
if( vips_streami_rewind( stream->streami ) )
|
||||
if( vips_source_rewind( stream->source ) )
|
||||
return( -1 );
|
||||
|
||||
gstream = g_input_stream_new_from_vips( stream->streami );
|
||||
gstream = g_input_stream_new_from_vips( stream->source );
|
||||
if( !(svg->page = rsvg_handle_new_from_stream_sync(
|
||||
gstream, NULL, flags, NULL, &error )) ) {
|
||||
g_object_unref( gstream );
|
||||
@ -811,9 +811,9 @@ vips_foreign_load_svg_stream_load( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadSvgStream *stream = (VipsForeignLoadSvgStream *) load;
|
||||
|
||||
if( vips_streami_rewind( stream->streami ) ||
|
||||
if( vips_source_rewind( stream->source ) ||
|
||||
vips_foreign_load_svg_load( load ) ||
|
||||
vips_streami_decode( stream->streami ) )
|
||||
vips_source_decode( stream->source ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -832,16 +832,16 @@ vips_foreign_load_svg_stream_class_init( VipsForeignLoadSvgStreamClass *class )
|
||||
object_class->nickname = "svgload_stream";
|
||||
object_class->description = _( "load svg from stream" );
|
||||
|
||||
load_class->is_a_stream = vips_foreign_load_svg_stream_is_a_stream;
|
||||
load_class->is_a_source = vips_foreign_load_svg_stream_is_a_source;
|
||||
load_class->header = vips_foreign_load_svg_stream_header;
|
||||
load_class->load = vips_foreign_load_svg_stream_load;
|
||||
|
||||
VIPS_ARG_OBJECT( class, "streami", 1,
|
||||
VIPS_ARG_OBJECT( class, "source", 1,
|
||||
_( "Streami" ),
|
||||
_( "Stream to load from" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsForeignLoadSvgStream, streami ),
|
||||
VIPS_TYPE_STREAMI );
|
||||
G_STRUCT_OFFSET( VipsForeignLoadSvgStream, source ),
|
||||
VIPS_TYPE_SOURCE );
|
||||
|
||||
}
|
||||
|
||||
@ -1100,8 +1100,8 @@ vips_svgload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_svgload_stream:
|
||||
* @streami: stream to load from
|
||||
* vips_svgload_source:
|
||||
* @source: stream to load from
|
||||
* @out: (out): image to write
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
@ -1112,13 +1112,13 @@ vips_svgload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_svgload_stream( VipsStreami *streami, VipsImage **out, ... )
|
||||
vips_svgload_source( VipsSource *source, VipsImage **out, ... )
|
||||
{
|
||||
va_list ap;
|
||||
int result;
|
||||
|
||||
va_start( ap, out );
|
||||
result = vips_call_split( "svgload_stream", ap, streami, out );
|
||||
result = vips_call_split( "svgload_stream", ap, source, out );
|
||||
va_end( ap );
|
||||
|
||||
return( result );
|
||||
|
@ -138,9 +138,9 @@ vips__tiff_openout( const char *path, gboolean bigtiff )
|
||||
static tsize_t
|
||||
openin_stream_read( thandle_t st, tdata_t data, tsize_t size )
|
||||
{
|
||||
VipsStreami *streami = VIPS_STREAMI( st );
|
||||
VipsSource *source = VIPS_SOURCE( st );
|
||||
|
||||
return( vips_streami_read( streami, data, size ) );
|
||||
return( vips_source_read( source, data, size ) );
|
||||
}
|
||||
|
||||
static tsize_t
|
||||
@ -154,17 +154,17 @@ openin_stream_write( thandle_t st, tdata_t buffer, tsize_t size )
|
||||
static toff_t
|
||||
openin_stream_seek( thandle_t st, toff_t position, int whence )
|
||||
{
|
||||
VipsStreami *streami = VIPS_STREAMI( st );
|
||||
VipsSource *source = VIPS_SOURCE( st );
|
||||
|
||||
return( vips_streami_seek( streami, position, whence ) );
|
||||
return( vips_source_seek( source, position, whence ) );
|
||||
}
|
||||
|
||||
static int
|
||||
openin_stream_close( thandle_t st )
|
||||
{
|
||||
VipsStreami *streami = VIPS_STREAMI( st );
|
||||
VipsSource *source = VIPS_SOURCE( st );
|
||||
|
||||
VIPS_UNREF( streami );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -172,12 +172,12 @@ openin_stream_close( thandle_t st )
|
||||
static toff_t
|
||||
openin_stream_length( thandle_t st )
|
||||
{
|
||||
VipsStreami *streami = VIPS_STREAMI( st );
|
||||
VipsSource *source = VIPS_SOURCE( st );
|
||||
|
||||
/* libtiff will use this to get file size if tags like StripByteCounts
|
||||
* are missing.
|
||||
*/
|
||||
return( vips_streami_length( streami ) );
|
||||
return( vips_source_length( source ) );
|
||||
}
|
||||
|
||||
static int
|
||||
@ -197,7 +197,7 @@ openin_stream_unmap( thandle_t st, tdata_t start, toff_t len )
|
||||
}
|
||||
|
||||
TIFF *
|
||||
vips__tiff_openin_stream( VipsStreami *streami )
|
||||
vips__tiff_openin_stream( VipsSource *source )
|
||||
{
|
||||
TIFF *tiff;
|
||||
|
||||
@ -205,11 +205,11 @@ vips__tiff_openin_stream( VipsStreami *streami )
|
||||
printf( "vips__tiff_openin_stream:\n" );
|
||||
#endif /*DEBUG*/
|
||||
|
||||
if( vips_streami_rewind( streami ) )
|
||||
if( vips_source_rewind( source ) )
|
||||
return( NULL );
|
||||
|
||||
if( !(tiff = TIFFClientOpen( "stream input", "rm",
|
||||
(thandle_t) streami,
|
||||
(thandle_t) source,
|
||||
openin_stream_read,
|
||||
openin_stream_write,
|
||||
openin_stream_seek,
|
||||
@ -224,7 +224,7 @@ vips__tiff_openin_stream( VipsStreami *streami )
|
||||
|
||||
/* Unreffed on close(), see above.
|
||||
*/
|
||||
g_object_ref( streami );
|
||||
g_object_ref( source );
|
||||
|
||||
return( tiff );
|
||||
}
|
||||
|
@ -37,7 +37,7 @@
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
TIFF *vips__tiff_openin_stream( VipsStreami *streami );
|
||||
TIFF *vips__tiff_openin_stream( VipsSource *source );
|
||||
|
||||
TIFF *vips__tiff_openout( const char *path, gboolean bigtiff );
|
||||
TIFF *vips__tiff_openout_buffer( VipsImage *image,
|
||||
|
@ -307,7 +307,7 @@ typedef void (*scanline_process_fn)( struct _Rtiff *,
|
||||
typedef struct _Rtiff {
|
||||
/* Parameters.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
VipsImage *out;
|
||||
int page;
|
||||
int n;
|
||||
@ -495,7 +495,7 @@ static void
|
||||
rtiff_free( Rtiff *rtiff )
|
||||
{
|
||||
VIPS_FREEF( TIFFClose, rtiff->tiff );
|
||||
VIPS_UNREF( rtiff->streami );
|
||||
VIPS_UNREF( rtiff->source );
|
||||
}
|
||||
|
||||
static void
|
||||
@ -507,12 +507,12 @@ rtiff_close_cb( VipsObject *object, Rtiff *rtiff )
|
||||
static void
|
||||
rtiff_minimise_cb( VipsImage *image, Rtiff *rtiff )
|
||||
{
|
||||
if( rtiff->streami )
|
||||
vips_streami_minimise( rtiff->streami );
|
||||
if( rtiff->source )
|
||||
vips_source_minimise( rtiff->source );
|
||||
}
|
||||
|
||||
static Rtiff *
|
||||
rtiff_new( VipsStreami *streami, VipsImage *out,
|
||||
rtiff_new( VipsSource *source, VipsImage *out,
|
||||
int page, int n, gboolean autorotate )
|
||||
{
|
||||
Rtiff *rtiff;
|
||||
@ -520,8 +520,8 @@ rtiff_new( VipsStreami *streami, VipsImage *out,
|
||||
if( !(rtiff = VIPS_NEW( out, Rtiff )) )
|
||||
return( NULL );
|
||||
|
||||
g_object_ref( streami );
|
||||
rtiff->streami = streami;
|
||||
g_object_ref( source );
|
||||
rtiff->source = source;
|
||||
rtiff->out = out;
|
||||
rtiff->page = page;
|
||||
rtiff->n = n;
|
||||
@ -558,7 +558,7 @@ rtiff_new( VipsStreami *streami, VipsImage *out,
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if( !(rtiff->tiff = vips__tiff_openin_stream( streami )) )
|
||||
if( !(rtiff->tiff = vips__tiff_openin_stream( source )) )
|
||||
return( NULL );
|
||||
|
||||
return( rtiff );
|
||||
@ -1434,7 +1434,7 @@ rtiff_set_header( Rtiff *rtiff, VipsImage *out )
|
||||
out->Ysize = rtiff->header.height * rtiff->n;
|
||||
|
||||
VIPS_SETSTR( out->filename,
|
||||
vips_stream_filename( VIPS_STREAM( rtiff->streami ) ) );
|
||||
vips_connection_filename( VIPS_CONNECTION( rtiff->source ) ) );
|
||||
|
||||
if( rtiff->n > 1 )
|
||||
vips_image_set_int( out,
|
||||
@ -2463,14 +2463,14 @@ vips__tiff_read_header_orientation( Rtiff *rtiff, VipsImage *out )
|
||||
typedef gboolean (*TiffPropertyFn)( TIFF *tif );
|
||||
|
||||
static gboolean
|
||||
vips__testtiff_stream( VipsStreami *streami, TiffPropertyFn fn )
|
||||
vips__testtiff_stream( VipsSource *source, TiffPropertyFn fn )
|
||||
{
|
||||
TIFF *tif;
|
||||
gboolean property;
|
||||
|
||||
vips__tiff_init();
|
||||
|
||||
if( !(tif = vips__tiff_openin_stream( streami )) ) {
|
||||
if( !(tif = vips__tiff_openin_stream( source )) ) {
|
||||
vips_error_clear();
|
||||
return( FALSE );
|
||||
}
|
||||
@ -2483,26 +2483,26 @@ vips__testtiff_stream( VipsStreami *streami, TiffPropertyFn fn )
|
||||
}
|
||||
|
||||
gboolean
|
||||
vips__istiff_stream( VipsStreami *streami )
|
||||
vips__istiff_stream( VipsSource *source )
|
||||
{
|
||||
return( vips__testtiff_stream( streami, NULL ) );
|
||||
return( vips__testtiff_stream( source, NULL ) );
|
||||
}
|
||||
|
||||
gboolean
|
||||
vips__istifftiled_stream( VipsStreami *streami )
|
||||
vips__istifftiled_stream( VipsSource *source )
|
||||
{
|
||||
return( vips__testtiff_stream( streami, TIFFIsTiled ) );
|
||||
return( vips__testtiff_stream( source, TIFFIsTiled ) );
|
||||
}
|
||||
|
||||
int
|
||||
vips__tiff_read_header_stream( VipsStreami *streami, VipsImage *out,
|
||||
vips__tiff_read_header_stream( VipsSource *source, VipsImage *out,
|
||||
int page, int n, gboolean autorotate )
|
||||
{
|
||||
Rtiff *rtiff;
|
||||
|
||||
vips__tiff_init();
|
||||
|
||||
if( !(rtiff = rtiff_new( streami, out, page, n, autorotate )) ||
|
||||
if( !(rtiff = rtiff_new( source, out, page, n, autorotate )) ||
|
||||
rtiff_header_read_all( rtiff ) )
|
||||
return( -1 );
|
||||
|
||||
@ -2511,16 +2511,16 @@ vips__tiff_read_header_stream( VipsStreami *streami, VipsImage *out,
|
||||
|
||||
vips__tiff_read_header_orientation( rtiff, out );
|
||||
|
||||
/* We never call vips_streami_decode() since we need to be able to
|
||||
/* We never call vips_source_decode() since we need to be able to
|
||||
* seek() the whole way through the file. Just minimise instead,
|
||||
*/
|
||||
vips_streami_minimise( streami );
|
||||
vips_source_minimise( source );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
int
|
||||
vips__tiff_read_stream( VipsStreami *streami, VipsImage *out,
|
||||
vips__tiff_read_stream( VipsSource *source, VipsImage *out,
|
||||
int page, int n, gboolean autorotate )
|
||||
{
|
||||
Rtiff *rtiff;
|
||||
@ -2532,7 +2532,7 @@ vips__tiff_read_stream( VipsStreami *streami, VipsImage *out,
|
||||
|
||||
vips__tiff_init();
|
||||
|
||||
if( !(rtiff = rtiff_new( streami, out, page, n, autorotate )) ||
|
||||
if( !(rtiff = rtiff_new( source, out, page, n, autorotate )) ||
|
||||
rtiff_header_read_all( rtiff ) )
|
||||
return( -1 );
|
||||
|
||||
@ -2545,10 +2545,10 @@ vips__tiff_read_stream( VipsStreami *streami, VipsImage *out,
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
/* We never call vips_streami_decode() since we need to be able to
|
||||
/* We never call vips_source_decode() since we need to be able to
|
||||
* seek() the whole way through the file. Just minimise instead,
|
||||
*/
|
||||
vips_streami_minimise( streami );
|
||||
vips_source_minimise( source );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
@ -59,7 +59,7 @@ typedef struct _VipsForeignLoadTiff {
|
||||
|
||||
/* Set by subclasses.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
/* Load this page.
|
||||
*/
|
||||
@ -85,19 +85,19 @@ vips_foreign_load_tiff_dispose( GObject *gobject )
|
||||
{
|
||||
VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) gobject;
|
||||
|
||||
VIPS_UNREF( tiff->streami );
|
||||
VIPS_UNREF( tiff->source );
|
||||
|
||||
G_OBJECT_CLASS( vips_foreign_load_tiff_parent_class )->
|
||||
dispose( gobject );
|
||||
}
|
||||
|
||||
static VipsForeignFlags
|
||||
vips_foreign_load_tiff_get_flags_stream( VipsStreami *streami )
|
||||
vips_foreign_load_tiff_get_flags_stream( VipsSource *source )
|
||||
{
|
||||
VipsForeignFlags flags;
|
||||
|
||||
flags = 0;
|
||||
if( vips__istifftiled_stream( streami ) )
|
||||
if( vips__istifftiled_stream( source ) )
|
||||
flags |= VIPS_FOREIGN_PARTIAL;
|
||||
else
|
||||
flags |= VIPS_FOREIGN_SEQUENTIAL;
|
||||
@ -108,13 +108,13 @@ vips_foreign_load_tiff_get_flags_stream( VipsStreami *streami )
|
||||
static VipsForeignFlags
|
||||
vips_foreign_load_tiff_get_flags_filename( const char *filename )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
VipsForeignFlags flags;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( 0 );
|
||||
flags = vips_foreign_load_tiff_get_flags_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
flags = vips_foreign_load_tiff_get_flags_stream( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( flags );
|
||||
}
|
||||
@ -124,7 +124,7 @@ vips_foreign_load_tiff_get_flags( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) load;
|
||||
|
||||
return( vips_foreign_load_tiff_get_flags_stream( tiff->streami ) );
|
||||
return( vips_foreign_load_tiff_get_flags_stream( tiff->source ) );
|
||||
}
|
||||
|
||||
static int
|
||||
@ -132,7 +132,7 @@ vips_foreign_load_tiff_header( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) load;
|
||||
|
||||
if( vips__tiff_read_header_stream( tiff->streami, load->out,
|
||||
if( vips__tiff_read_header_stream( tiff->source, load->out,
|
||||
tiff->page, tiff->n, tiff->autorotate ) )
|
||||
return( -1 );
|
||||
|
||||
@ -144,7 +144,7 @@ vips_foreign_load_tiff_load( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) load;
|
||||
|
||||
if( vips__tiff_read_stream( tiff->streami, load->real,
|
||||
if( vips__tiff_read_stream( tiff->source, load->real,
|
||||
tiff->page, tiff->n, tiff->autorotate ) )
|
||||
return( -1 );
|
||||
|
||||
@ -217,7 +217,7 @@ typedef struct _VipsForeignLoadTiffStream {
|
||||
|
||||
/* Load from a stream.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
} VipsForeignLoadTiffStream;
|
||||
|
||||
@ -233,9 +233,9 @@ vips_foreign_load_tiff_stream_build( VipsObject *object )
|
||||
VipsForeignLoadTiffStream *stream =
|
||||
(VipsForeignLoadTiffStream *) object;
|
||||
|
||||
if( stream->streami ) {
|
||||
tiff->streami = stream->streami;
|
||||
g_object_ref( tiff->streami );
|
||||
if( stream->source ) {
|
||||
tiff->source = stream->source;
|
||||
g_object_ref( tiff->source );
|
||||
}
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_load_tiff_stream_parent_class )->
|
||||
@ -246,9 +246,9 @@ vips_foreign_load_tiff_stream_build( VipsObject *object )
|
||||
}
|
||||
|
||||
static gboolean
|
||||
vips_foreign_load_tiff_stream_is_a_stream( VipsStreami *streami )
|
||||
vips_foreign_load_tiff_stream_is_a_source( VipsSource *source )
|
||||
{
|
||||
return( vips__istiff_stream( streami ) );
|
||||
return( vips__istiff_stream( source ) );
|
||||
}
|
||||
|
||||
static void
|
||||
@ -266,14 +266,14 @@ vips_foreign_load_tiff_stream_class_init(
|
||||
object_class->description = _( "load tiff from stream" );
|
||||
object_class->build = vips_foreign_load_tiff_stream_build;
|
||||
|
||||
load_class->is_a_stream = vips_foreign_load_tiff_stream_is_a_stream;
|
||||
load_class->is_a_source = vips_foreign_load_tiff_stream_is_a_source;
|
||||
|
||||
VIPS_ARG_OBJECT( class, "streami", 1,
|
||||
VIPS_ARG_OBJECT( class, "source", 1,
|
||||
_( "Streami" ),
|
||||
_( "Stream to load from" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsForeignLoadTiffStream, streami ),
|
||||
VIPS_TYPE_STREAMI );
|
||||
G_STRUCT_OFFSET( VipsForeignLoadTiffStream, source ),
|
||||
VIPS_TYPE_SOURCE );
|
||||
|
||||
}
|
||||
|
||||
@ -303,8 +303,8 @@ vips_foreign_load_tiff_file_build( VipsObject *object )
|
||||
VipsForeignLoadTiffFile *file = (VipsForeignLoadTiffFile *) object;
|
||||
|
||||
if( file->filename &&
|
||||
!(tiff->streami =
|
||||
vips_streami_new_from_file( file->filename )) )
|
||||
!(tiff->source =
|
||||
vips_source_new_from_file( file->filename )) )
|
||||
return( -1 );
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_load_tiff_file_parent_class )->
|
||||
@ -317,13 +317,13 @@ vips_foreign_load_tiff_file_build( VipsObject *object )
|
||||
static gboolean
|
||||
vips_foreign_load_tiff_file_is_a( const char *filename )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gboolean result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( FALSE );
|
||||
result = vips_foreign_load_tiff_stream_is_a_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips_foreign_load_tiff_stream_is_a_source( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -384,7 +384,7 @@ vips_foreign_load_tiff_buffer_build( VipsObject *object )
|
||||
(VipsForeignLoadTiffBuffer *) object;
|
||||
|
||||
if( buffer->blob &&
|
||||
!(tiff->streami = vips_streami_new_from_memory(
|
||||
!(tiff->source = vips_source_new_from_memory(
|
||||
VIPS_AREA( buffer->blob )->data,
|
||||
VIPS_AREA( buffer->blob )->length )) )
|
||||
return( -1 );
|
||||
@ -399,13 +399,13 @@ vips_foreign_load_tiff_buffer_build( VipsObject *object )
|
||||
static gboolean
|
||||
vips_foreign_load_tiff_buffer_is_a_buffer( const void *buf, size_t len )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gboolean result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_memory( buf, len )) )
|
||||
if( !(source = vips_source_new_from_memory( buf, len )) )
|
||||
return( FALSE );
|
||||
result = vips_foreign_load_tiff_stream_is_a_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips_foreign_load_tiff_stream_is_a_source( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -547,8 +547,8 @@ vips_tiffload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_tiffload_stream:
|
||||
* @streami: stream to load
|
||||
* vips_tiffload_source:
|
||||
* @source: stream to load
|
||||
* @out: (out): image to write
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
@ -566,13 +566,13 @@ vips_tiffload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_tiffload_stream( VipsStreami *streami, VipsImage **out, ... )
|
||||
vips_tiffload_source( VipsSource *source, VipsImage **out, ... )
|
||||
{
|
||||
va_list ap;
|
||||
int result;
|
||||
|
||||
va_start( ap, out );
|
||||
result = vips_call_split( "tiffload_stream", ap, streami, out );
|
||||
result = vips_call_split( "tiffload_stream", ap, source, out );
|
||||
va_end( ap );
|
||||
|
||||
return( result );
|
||||
|
@ -699,7 +699,7 @@ typedef struct {
|
||||
|
||||
/* Build the output area here.
|
||||
*/
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
/* Our output buffer.
|
||||
*/
|
||||
@ -714,7 +714,7 @@ empty_output_buffer( j_compress_ptr cinfo )
|
||||
{
|
||||
Dest *dest = (Dest *) cinfo->dest;
|
||||
|
||||
if( vips_streamo_write( dest->streamo,
|
||||
if( vips_target_write( dest->target,
|
||||
dest->buf, STREAM_BUFFER_SIZE ) )
|
||||
ERREXIT( cinfo, JERR_FILE_WRITE );
|
||||
|
||||
@ -742,17 +742,17 @@ term_destination( j_compress_ptr cinfo )
|
||||
{
|
||||
Dest *dest = (Dest *) cinfo->dest;
|
||||
|
||||
if( vips_streamo_write( dest->streamo,
|
||||
if( vips_target_write( dest->target,
|
||||
dest->buf, STREAM_BUFFER_SIZE - dest->pub.free_in_buffer ) )
|
||||
ERREXIT( cinfo, JERR_FILE_WRITE );
|
||||
|
||||
vips_streamo_finish( dest->streamo );
|
||||
vips_target_finish( dest->target );
|
||||
}
|
||||
|
||||
/* Set dest to one of our objects.
|
||||
*/
|
||||
static void
|
||||
stream_dest( j_compress_ptr cinfo, VipsStreamo *streamo )
|
||||
stream_dest( j_compress_ptr cinfo, VipsTarget *target )
|
||||
{
|
||||
Dest *dest;
|
||||
|
||||
@ -767,11 +767,11 @@ stream_dest( j_compress_ptr cinfo, VipsStreamo *streamo )
|
||||
dest->pub.init_destination = init_destination;
|
||||
dest->pub.empty_output_buffer = empty_output_buffer;
|
||||
dest->pub.term_destination = term_destination;
|
||||
dest->streamo = streamo;
|
||||
dest->target = target;
|
||||
}
|
||||
|
||||
int
|
||||
vips__jpeg_write_stream( VipsImage *in, VipsStreamo *streamo,
|
||||
vips__jpeg_write_stream( VipsImage *in, VipsTarget *target,
|
||||
int Q, const char *profile,
|
||||
gboolean optimize_coding, gboolean progressive,
|
||||
gboolean strip, gboolean no_subsample, gboolean trellis_quant,
|
||||
@ -795,7 +795,7 @@ vips__jpeg_write_stream( VipsImage *in, VipsStreamo *streamo,
|
||||
|
||||
/* Attach output.
|
||||
*/
|
||||
stream_dest( &write->cinfo, streamo );
|
||||
stream_dest( &write->cinfo, target );
|
||||
|
||||
/* Convert! Write errors come back here as an error return.
|
||||
*/
|
||||
|
@ -1762,7 +1762,7 @@ wtiff_gather( Wtiff *wtiff )
|
||||
wtiff->layer->below )
|
||||
for( layer = wtiff->layer->below; layer;
|
||||
layer = layer->below ) {
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
TIFF *in;
|
||||
|
||||
#ifdef DEBUG
|
||||
@ -1770,22 +1770,22 @@ wtiff_gather( Wtiff *wtiff )
|
||||
#endif /*DEBUG*/
|
||||
|
||||
if( layer->lname ) {
|
||||
if( !(streami =
|
||||
vips_streami_new_from_file(
|
||||
if( !(source =
|
||||
vips_source_new_from_file(
|
||||
layer->lname )) )
|
||||
return( -1 );
|
||||
}
|
||||
else {
|
||||
if( !(streami = vips_streami_new_from_memory(
|
||||
if( !(source = vips_source_new_from_memory(
|
||||
layer->buf, layer->len )) )
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
if( !(in = vips__tiff_openin_stream( streami )) ) {
|
||||
VIPS_UNREF( streami );
|
||||
if( !(in = vips__tiff_openin_stream( source )) ) {
|
||||
VIPS_UNREF( source );
|
||||
return( -1 );
|
||||
}
|
||||
VIPS_UNREF( streami );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
if( wtiff_copy_tiff( wtiff, wtiff->layer->tif, in ) ) {
|
||||
TIFFClose( in );
|
||||
|
@ -525,7 +525,7 @@ vips_webp_add_metadata( VipsWebPWrite *write )
|
||||
}
|
||||
|
||||
int
|
||||
vips__webp_write_stream( VipsImage *image, VipsStreamo *streamo,
|
||||
vips__webp_write_stream( VipsImage *image, VipsTarget *target,
|
||||
int Q, gboolean lossless, VipsForeignWebpPreset preset,
|
||||
gboolean smart_subsample, gboolean near_lossless,
|
||||
int alpha_q, int reduction_effort,
|
||||
@ -549,13 +549,13 @@ vips__webp_write_stream( VipsImage *image, VipsStreamo *streamo,
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
if( vips_streamo_write( streamo,
|
||||
if( vips_target_write( target,
|
||||
write.memory_writer.mem, write.memory_writer.size ) ) {
|
||||
vips_webp_write_unset( &write );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
vips_streamo_finish( streamo );
|
||||
vips_target_finish( target );
|
||||
|
||||
vips_webp_write_unset( &write );
|
||||
|
||||
|
@ -173,7 +173,7 @@ typedef struct {
|
||||
png_infop pInfo;
|
||||
png_bytep *row_pointer;
|
||||
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
/* read() to this buffer, copy to png as required. libpng does many
|
||||
* very small reads and we want to avoid a syscall for each one.
|
||||
@ -195,7 +195,7 @@ read_destroy( Read *read )
|
||||
|
||||
if( read->pPng )
|
||||
png_destroy_read_struct( &read->pPng, &read->pInfo, NULL );
|
||||
VIPS_UNREF( read->streami );
|
||||
VIPS_UNREF( read->source );
|
||||
VIPS_FREE( read->row_pointer );
|
||||
}
|
||||
|
||||
@ -208,8 +208,8 @@ read_close_cb( VipsImage *out, Read *read )
|
||||
static void
|
||||
read_minimise_cb( VipsImage *image, Read *read )
|
||||
{
|
||||
if( read->streami )
|
||||
vips_streami_minimise( read->streami );
|
||||
if( read->source )
|
||||
vips_source_minimise( read->source );
|
||||
}
|
||||
|
||||
static void
|
||||
@ -230,7 +230,7 @@ vips_png_read_stream( png_structp pPng, png_bytep data, png_size_t length )
|
||||
if( read->bytes_in_buffer <= 0 ) {
|
||||
gint64 bytes_read;
|
||||
|
||||
bytes_read = vips_streami_read( read->streami,
|
||||
bytes_read = vips_source_read( read->source,
|
||||
read->input_buffer, INPUT_BUFFER_SIZE );
|
||||
if( bytes_read <= 0 )
|
||||
png_error( pPng, "not enough data" );
|
||||
@ -249,7 +249,7 @@ vips_png_read_stream( png_structp pPng, png_bytep data, png_size_t length )
|
||||
}
|
||||
|
||||
static Read *
|
||||
read_new( VipsStreami *streami, VipsImage *out, gboolean fail )
|
||||
read_new( VipsSource *source, VipsImage *out, gboolean fail )
|
||||
{
|
||||
Read *read;
|
||||
|
||||
@ -263,8 +263,8 @@ read_new( VipsStreami *streami, VipsImage *out, gboolean fail )
|
||||
read->pPng = NULL;
|
||||
read->pInfo = NULL;
|
||||
read->row_pointer = NULL;
|
||||
read->streami = streami;
|
||||
g_object_ref( streami );
|
||||
read->source = source;
|
||||
g_object_ref( source );
|
||||
|
||||
g_signal_connect( out, "close",
|
||||
G_CALLBACK( read_close_cb ), read );
|
||||
@ -290,7 +290,7 @@ read_new( VipsStreami *streami, VipsImage *out, gboolean fail )
|
||||
PNG_CRC_QUIET_USE, PNG_CRC_QUIET_USE );
|
||||
#endif /*FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION*/
|
||||
|
||||
if( vips_streami_rewind( streami ) )
|
||||
if( vips_source_rewind( source ) )
|
||||
return( NULL );
|
||||
png_set_read_fn( read->pPng, read, vips_png_read_stream );
|
||||
|
||||
@ -482,7 +482,7 @@ png2vips_header( Read *read, VipsImage *out )
|
||||
Xres, Yres );
|
||||
|
||||
VIPS_SETSTR( out->filename,
|
||||
vips_stream_filename( VIPS_STREAM( read->streami ) ) );
|
||||
vips_connection_filename( VIPS_CONNECTION( read->source ) ) );
|
||||
|
||||
/* Uninterlaced images will be read in seq mode. Interlaced images are
|
||||
* read via a huge memory buffer.
|
||||
@ -694,11 +694,11 @@ png2vips_image( Read *read, VipsImage *out )
|
||||
}
|
||||
|
||||
gboolean
|
||||
vips__png_ispng_stream( VipsStreami *streami )
|
||||
vips__png_ispng_stream( VipsSource *source )
|
||||
{
|
||||
const unsigned char *p;
|
||||
|
||||
if( (p = vips_streami_sniff( streami, 8 )) &&
|
||||
if( (p = vips_source_sniff( source, 8 )) &&
|
||||
!png_sig_cmp( (png_bytep) p, 0, 8 ) )
|
||||
return( TRUE );
|
||||
|
||||
@ -706,27 +706,27 @@ vips__png_ispng_stream( VipsStreami *streami )
|
||||
}
|
||||
|
||||
int
|
||||
vips__png_header_stream( VipsStreami *streami, VipsImage *out )
|
||||
vips__png_header_stream( VipsSource *source, VipsImage *out )
|
||||
{
|
||||
Read *read;
|
||||
|
||||
if( !(read = read_new( streami, out, TRUE )) ||
|
||||
if( !(read = read_new( source, out, TRUE )) ||
|
||||
png2vips_header( read, out ) )
|
||||
return( -1 );
|
||||
|
||||
vips_streami_minimise( streami );
|
||||
vips_source_minimise( source );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
int
|
||||
vips__png_read_stream( VipsStreami *streami, VipsImage *out, gboolean fail )
|
||||
vips__png_read_stream( VipsSource *source, VipsImage *out, gboolean fail )
|
||||
{
|
||||
Read *read;
|
||||
|
||||
if( !(read = read_new( streami, out, fail )) ||
|
||||
if( !(read = read_new( source, out, fail )) ||
|
||||
png2vips_image( read, out ) ||
|
||||
vips_streami_decode( streami ) )
|
||||
vips_source_decode( source ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
@ -736,7 +736,7 @@ vips__png_read_stream( VipsStreami *streami, VipsImage *out, gboolean fail )
|
||||
* served partially from there. Non-interlaced PNGs may be read sequentially.
|
||||
*/
|
||||
gboolean
|
||||
vips__png_isinterlaced_stream( VipsStreami *streami )
|
||||
vips__png_isinterlaced_stream( VipsSource *source )
|
||||
{
|
||||
VipsImage *image;
|
||||
Read *read;
|
||||
@ -744,7 +744,7 @@ vips__png_isinterlaced_stream( VipsStreami *streami )
|
||||
|
||||
image = vips_image_new();
|
||||
|
||||
if( !(read = read_new( streami, image, TRUE )) ) {
|
||||
if( !(read = read_new( source, image, TRUE )) ) {
|
||||
g_object_unref( image );
|
||||
return( -1 );
|
||||
}
|
||||
@ -762,7 +762,7 @@ typedef struct {
|
||||
VipsImage *in;
|
||||
VipsImage *memory;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
png_structp pPng;
|
||||
png_infop pInfo;
|
||||
@ -773,9 +773,9 @@ static void
|
||||
write_finish( Write *write )
|
||||
{
|
||||
VIPS_UNREF( write->memory );
|
||||
if( write->streamo )
|
||||
vips_streamo_finish( write->streamo );
|
||||
VIPS_UNREF( write->streamo );
|
||||
if( write->target )
|
||||
vips_target_finish( write->target );
|
||||
VIPS_UNREF( write->target );
|
||||
if( write->pPng )
|
||||
png_destroy_write_struct( &write->pPng, &write->pInfo );
|
||||
}
|
||||
@ -791,12 +791,12 @@ user_write_data( png_structp pPng, png_bytep data, png_size_t length )
|
||||
{
|
||||
Write *write = (Write *) png_get_io_ptr( pPng );
|
||||
|
||||
if( vips_streamo_write( write->streamo, data, length ) )
|
||||
if( vips_target_write( write->target, data, length ) )
|
||||
png_error( pPng, "not enough data" );
|
||||
}
|
||||
|
||||
static Write *
|
||||
write_new( VipsImage *in, VipsStreamo *streamo )
|
||||
write_new( VipsImage *in, VipsTarget *target )
|
||||
{
|
||||
Write *write;
|
||||
|
||||
@ -805,8 +805,8 @@ write_new( VipsImage *in, VipsStreamo *streamo )
|
||||
memset( write, 0, sizeof( Write ) );
|
||||
write->in = in;
|
||||
write->memory = NULL;
|
||||
write->streamo = streamo;
|
||||
g_object_ref( streamo );
|
||||
write->target = target;
|
||||
g_object_ref( target );
|
||||
g_signal_connect( in, "close",
|
||||
G_CALLBACK( write_destroy ), write );
|
||||
|
||||
@ -1169,14 +1169,14 @@ write_vips( Write *write,
|
||||
}
|
||||
|
||||
int
|
||||
vips__png_write_stream( VipsImage *in, VipsStreamo *streamo,
|
||||
vips__png_write_stream( VipsImage *in, VipsTarget *target,
|
||||
int compression, int interlace,
|
||||
const char *profile, VipsForeignPngFilter filter, gboolean strip,
|
||||
gboolean palette, int colours, int Q, double dither )
|
||||
{
|
||||
Write *write;
|
||||
|
||||
if( !(write = write_new( in, streamo )) )
|
||||
if( !(write = write_new( in, target )) )
|
||||
return( -1 );
|
||||
|
||||
if( write_vips( write,
|
||||
|
@ -81,7 +81,7 @@
|
||||
/* What we track during a read.
|
||||
*/
|
||||
typedef struct {
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
/* The data we load, as a webp object.
|
||||
*/
|
||||
@ -311,13 +311,13 @@ vips_image_paint_image( VipsImage *frame,
|
||||
}
|
||||
|
||||
int
|
||||
vips__iswebp_stream( VipsStreami *streami )
|
||||
vips__iswebp_stream( VipsSource *source )
|
||||
{
|
||||
const unsigned char *p;
|
||||
|
||||
/* WebP is "RIFF xxxx WEBP" at the start, so we need 12 bytes.
|
||||
*/
|
||||
if( (p = vips_streami_sniff( streami, 12 )) &&
|
||||
if( (p = vips_source_sniff( source, 12 )) &&
|
||||
vips_isprefix( "RIFF", (char *) p ) &&
|
||||
vips_isprefix( "WEBP", (char *) p + 8 ) )
|
||||
return( 1 );
|
||||
@ -333,7 +333,7 @@ read_free( Read *read )
|
||||
VIPS_FREEF( WebPDemuxDelete, read->demux );
|
||||
WebPFreeDecBuffer( &read->config.output );
|
||||
|
||||
VIPS_UNREF( read->streami );
|
||||
VIPS_UNREF( read->source );
|
||||
VIPS_FREE( read->delays );
|
||||
VIPS_FREE( read );
|
||||
|
||||
@ -341,15 +341,15 @@ read_free( Read *read )
|
||||
}
|
||||
|
||||
static Read *
|
||||
read_new( VipsStreami *streami, int page, int n, double scale )
|
||||
read_new( VipsSource *source, int page, int n, double scale )
|
||||
{
|
||||
Read *read;
|
||||
|
||||
if( !(read = VIPS_NEW( NULL, Read )) )
|
||||
return( NULL );
|
||||
|
||||
read->streami = streami;
|
||||
g_object_ref( streami );
|
||||
read->source = source;
|
||||
g_object_ref( source );
|
||||
read->page = page;
|
||||
read->n = n;
|
||||
read->scale = scale;
|
||||
@ -364,7 +364,7 @@ read_new( VipsStreami *streami, int page, int n, double scale )
|
||||
read->config.output.is_external_memory = 1;
|
||||
|
||||
if( !(read->data.bytes =
|
||||
vips_streami_map( streami, &read->data.size )) ) {
|
||||
vips_source_map( source, &read->data.size )) ) {
|
||||
read_free( read );
|
||||
return( NULL );
|
||||
}
|
||||
@ -550,7 +550,7 @@ read_header( Read *read, VipsImage *out )
|
||||
1.0, 1.0 );
|
||||
vips_image_pipelinev( out, VIPS_DEMAND_STYLE_THINSTRIP, NULL );
|
||||
VIPS_SETSTR( out->filename,
|
||||
vips_stream_filename( VIPS_STREAM( read->streami ) ) );
|
||||
vips_connection_filename( VIPS_CONNECTION( read->source ) ) );
|
||||
|
||||
if( !WebPDemuxGetFrame( read->demux, 1, &read->iter ) ) {
|
||||
vips_error( "webp",
|
||||
@ -763,12 +763,12 @@ read_image( Read *read, VipsImage *out )
|
||||
}
|
||||
|
||||
int
|
||||
vips__webp_read_header_stream( VipsStreami *streami, VipsImage *out,
|
||||
vips__webp_read_header_stream( VipsSource *source, VipsImage *out,
|
||||
int page, int n, double scale )
|
||||
{
|
||||
Read *read;
|
||||
|
||||
if( !(read = read_new( streami, page, n, scale )) )
|
||||
if( !(read = read_new( source, page, n, scale )) )
|
||||
return( -1 );
|
||||
|
||||
if( read_header( read, out ) ) {
|
||||
@ -782,12 +782,12 @@ vips__webp_read_header_stream( VipsStreami *streami, VipsImage *out,
|
||||
}
|
||||
|
||||
int
|
||||
vips__webp_read_stream( VipsStreami *streami, VipsImage *out,
|
||||
vips__webp_read_stream( VipsSource *source, VipsImage *out,
|
||||
int page, int n, double scale )
|
||||
{
|
||||
Read *read;
|
||||
|
||||
if( !(read = read_new( streami, page, n, scale )) )
|
||||
if( !(read = read_new( source, page, n, scale )) )
|
||||
return( -1 );
|
||||
|
||||
if( read_image( read, out ) ) {
|
||||
|
@ -60,7 +60,7 @@ typedef struct _VipsForeignLoadWebp {
|
||||
|
||||
/* Set by subclasses.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
/* Load this page (frame number).
|
||||
*/
|
||||
@ -89,7 +89,7 @@ vips_foreign_load_webp_dispose( GObject *gobject )
|
||||
{
|
||||
VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) gobject;
|
||||
|
||||
VIPS_UNREF( webp->streami );
|
||||
VIPS_UNREF( webp->source );
|
||||
|
||||
G_OBJECT_CLASS( vips_foreign_load_webp_parent_class )->
|
||||
dispose( gobject );
|
||||
@ -131,7 +131,7 @@ vips_foreign_load_webp_header( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) load;
|
||||
|
||||
if( vips__webp_read_header_stream( webp->streami, load->out,
|
||||
if( vips__webp_read_header_stream( webp->source, load->out,
|
||||
webp->page, webp->n, webp->scale ) )
|
||||
return( -1 );
|
||||
|
||||
@ -143,7 +143,7 @@ vips_foreign_load_webp_load( VipsForeignLoad *load )
|
||||
{
|
||||
VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) load;
|
||||
|
||||
if( vips__webp_read_stream( webp->streami, load->real,
|
||||
if( vips__webp_read_stream( webp->source, load->real,
|
||||
webp->page, webp->n, webp->scale ) )
|
||||
return( -1 );
|
||||
|
||||
@ -220,7 +220,7 @@ vips_foreign_load_webp_init( VipsForeignLoadWebp *webp )
|
||||
typedef struct _VipsForeignLoadWebpStream {
|
||||
VipsForeignLoadWebp parent_object;
|
||||
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
} VipsForeignLoadWebpStream;
|
||||
|
||||
@ -236,9 +236,9 @@ vips_foreign_load_webp_stream_build( VipsObject *object )
|
||||
VipsForeignLoadWebpStream *stream =
|
||||
(VipsForeignLoadWebpStream *) object;
|
||||
|
||||
if( stream->streami ) {
|
||||
webp->streami = stream->streami;
|
||||
g_object_ref( webp->streami );
|
||||
if( stream->source ) {
|
||||
webp->source = stream->source;
|
||||
g_object_ref( webp->source );
|
||||
}
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_load_webp_stream_parent_class )->
|
||||
@ -263,14 +263,14 @@ vips_foreign_load_webp_stream_class_init(
|
||||
object_class->description = _( "load webp from stream" );
|
||||
object_class->build = vips_foreign_load_webp_stream_build;
|
||||
|
||||
load_class->is_a_stream = vips__iswebp_stream;
|
||||
load_class->is_a_source = vips__iswebp_stream;
|
||||
|
||||
VIPS_ARG_OBJECT( class, "streami", 1,
|
||||
VIPS_ARG_OBJECT( class, "source", 1,
|
||||
_( "Streami" ),
|
||||
_( "Stream to load from" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsForeignLoadWebpStream, streami ),
|
||||
VIPS_TYPE_STREAMI );
|
||||
G_STRUCT_OFFSET( VipsForeignLoadWebpStream, source ),
|
||||
VIPS_TYPE_SOURCE );
|
||||
|
||||
}
|
||||
|
||||
@ -300,8 +300,8 @@ vips_foreign_load_webp_file_build( VipsObject *object )
|
||||
VipsForeignLoadWebpFile *file = (VipsForeignLoadWebpFile *) object;
|
||||
|
||||
if( file->filename &&
|
||||
!(webp->streami =
|
||||
vips_streami_new_from_file( file->filename )) )
|
||||
!(webp->source =
|
||||
vips_source_new_from_file( file->filename )) )
|
||||
return( -1 );
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_load_webp_file_parent_class )->
|
||||
@ -314,13 +314,13 @@ vips_foreign_load_webp_file_build( VipsObject *object )
|
||||
static gboolean
|
||||
vips_foreign_load_webp_file_is_a( const char *filename )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gboolean result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( FALSE );
|
||||
result = vips__iswebp_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips__iswebp_stream( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -381,7 +381,7 @@ vips_foreign_load_webp_buffer_build( VipsObject *object )
|
||||
(VipsForeignLoadWebpBuffer *) object;
|
||||
|
||||
if( buffer->blob &&
|
||||
!(webp->streami = vips_streami_new_from_memory(
|
||||
!(webp->source = vips_source_new_from_memory(
|
||||
VIPS_AREA( buffer->blob )->data,
|
||||
VIPS_AREA( buffer->blob )->length )) )
|
||||
return( -1 );
|
||||
@ -396,13 +396,13 @@ vips_foreign_load_webp_buffer_build( VipsObject *object )
|
||||
static gboolean
|
||||
vips_foreign_load_webp_buffer_is_a_buffer( const void *buf, size_t len )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
gboolean result;
|
||||
|
||||
if( !(streami = vips_streami_new_from_memory( buf, len )) )
|
||||
if( !(source = vips_source_new_from_memory( buf, len )) )
|
||||
return( FALSE );
|
||||
result = vips__iswebp_stream( streami );
|
||||
VIPS_UNREF( streami );
|
||||
result = vips__iswebp_stream( source );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -526,8 +526,8 @@ vips_webpload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_webpload_stream:
|
||||
* @streami: stream to load from
|
||||
* vips_webpload_source:
|
||||
* @source: stream to load from
|
||||
* @out: (out): image to write
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
@ -544,13 +544,13 @@ vips_webpload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_webpload_stream( VipsStreami *streami, VipsImage **out, ... )
|
||||
vips_webpload_source( VipsSource *source, VipsImage **out, ... )
|
||||
{
|
||||
va_list ap;
|
||||
int result;
|
||||
|
||||
va_start( ap, out );
|
||||
result = vips_call_split( "webpload_stream", ap, streami, out );
|
||||
result = vips_call_split( "webpload_stream", ap, source, out );
|
||||
va_end( ap );
|
||||
|
||||
return( result );
|
||||
|
@ -222,7 +222,7 @@ vips_foreign_save_webp_init( VipsForeignSaveWebp *webp )
|
||||
typedef struct _VipsForeignSaveWebpStream {
|
||||
VipsForeignSaveWebp parent_object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
} VipsForeignSaveWebpStream;
|
||||
|
||||
@ -243,7 +243,7 @@ vips_foreign_save_webp_stream_build( VipsObject *object )
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( vips__webp_write_stream( save->ready, stream->streamo,
|
||||
if( vips__webp_write_stream( save->ready, stream->target,
|
||||
webp->Q, webp->lossless, webp->preset,
|
||||
webp->smart_subsample, webp->near_lossless,
|
||||
webp->alpha_q, webp->reduction_effort,
|
||||
@ -268,12 +268,12 @@ vips_foreign_save_webp_stream_class_init(
|
||||
object_class->description = _( "save image to webp stream" );
|
||||
object_class->build = vips_foreign_save_webp_stream_build;
|
||||
|
||||
VIPS_ARG_OBJECT( class, "streamo", 1,
|
||||
_( "streamo" ),
|
||||
VIPS_ARG_OBJECT( class, "target", 1,
|
||||
_( "target" ),
|
||||
_( "Stream to save to" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsForeignSaveWebpStream, streamo ),
|
||||
VIPS_TYPE_STREAMO );
|
||||
G_STRUCT_OFFSET( VipsForeignSaveWebpStream, target ),
|
||||
VIPS_TYPE_TARGET );
|
||||
}
|
||||
|
||||
static void
|
||||
@ -303,24 +303,24 @@ vips_foreign_save_webp_file_build( VipsObject *object )
|
||||
VipsForeignSaveWebp *webp = (VipsForeignSaveWebp *) object;
|
||||
VipsForeignSaveWebpFile *file = (VipsForeignSaveWebpFile *) object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_save_webp_file_parent_class )->
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_file( file->filename )) )
|
||||
if( !(target = vips_target_new_to_file( file->filename )) )
|
||||
return( -1 );
|
||||
if( vips__webp_write_stream( save->ready, streamo,
|
||||
if( vips__webp_write_stream( save->ready, target,
|
||||
webp->Q, webp->lossless, webp->preset,
|
||||
webp->smart_subsample, webp->near_lossless,
|
||||
webp->alpha_q, webp->reduction_effort,
|
||||
webp->min_size, webp->kmin, webp->kmax,
|
||||
save->strip ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -373,31 +373,31 @@ vips_foreign_save_webp_buffer_build( VipsObject *object )
|
||||
VipsForeignSaveWebpBuffer *buffer =
|
||||
(VipsForeignSaveWebpBuffer *) object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
VipsBlob *blob;
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_foreign_save_webp_buffer_parent_class )->
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_memory()) )
|
||||
if( !(target = vips_target_new_to_memory()) )
|
||||
return( -1 );
|
||||
|
||||
if( vips__webp_write_stream( save->ready, streamo,
|
||||
if( vips__webp_write_stream( save->ready, target,
|
||||
webp->Q, webp->lossless, webp->preset,
|
||||
webp->smart_subsample, webp->near_lossless,
|
||||
webp->alpha_q, webp->reduction_effort,
|
||||
webp->min_size, webp->kmin, webp->kmax,
|
||||
save->strip ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
g_object_get( streamo, "blob", &blob, NULL );
|
||||
g_object_get( target, "blob", &blob, NULL );
|
||||
g_object_set( buffer, "buffer", blob, NULL );
|
||||
vips_area_unref( VIPS_AREA( blob ) );
|
||||
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -445,7 +445,7 @@ vips_foreign_save_webp_mime_build( VipsObject *object )
|
||||
VipsForeignSave *save = (VipsForeignSave *) object;
|
||||
VipsForeignSaveWebp *webp = (VipsForeignSaveWebp *) object;
|
||||
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
VipsBlob *blob;
|
||||
void *data;
|
||||
size_t len;
|
||||
@ -454,20 +454,20 @@ vips_foreign_save_webp_mime_build( VipsObject *object )
|
||||
build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_memory()) )
|
||||
if( !(target = vips_target_new_to_memory()) )
|
||||
return( -1 );
|
||||
|
||||
if( vips__webp_write_stream( save->ready, streamo,
|
||||
if( vips__webp_write_stream( save->ready, target,
|
||||
webp->Q, webp->lossless, webp->preset,
|
||||
webp->smart_subsample, webp->near_lossless,
|
||||
webp->alpha_q, webp->reduction_effort,
|
||||
webp->min_size, webp->kmin, webp->kmax,
|
||||
save->strip ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
g_object_get( streamo, "blob", &blob, NULL );
|
||||
g_object_get( target, "blob", &blob, NULL );
|
||||
data = VIPS_AREA( blob )->data;
|
||||
len = VIPS_AREA( blob )->length;
|
||||
vips_area_unref( VIPS_AREA( blob ) );
|
||||
@ -478,7 +478,7 @@ vips_foreign_save_webp_mime_build( VipsObject *object )
|
||||
(void) fwrite( data, sizeof( char ), len, stdout );
|
||||
fflush( stdout );
|
||||
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
@ -671,9 +671,9 @@ vips_webpsave_mime( VipsImage *in, ... )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_webpsave_stream: (method)
|
||||
* vips_webpsave_target: (method)
|
||||
* @in: image to save
|
||||
* @streamo: save image to this stream
|
||||
* @target: save image to this stream
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
* Optional arguments:
|
||||
@ -697,13 +697,13 @@ vips_webpsave_mime( VipsImage *in, ... )
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_webpsave_stream( VipsImage *in, VipsStreamo *streamo, ... )
|
||||
vips_webpsave_target( VipsImage *in, VipsTarget *target, ... )
|
||||
{
|
||||
va_list ap;
|
||||
int result;
|
||||
|
||||
va_start( ap, streamo );
|
||||
result = vips_call_split( "webpsave_stream", ap, in, streamo );
|
||||
va_start( ap, target );
|
||||
result = vips_call_split( "webpsave_stream", ap, in, target );
|
||||
va_end( ap );
|
||||
|
||||
return( result );
|
||||
|
@ -1,5 +1,5 @@
|
||||
pkginclude_HEADERS = \
|
||||
stream.h \
|
||||
connection.h \
|
||||
bufis.h \
|
||||
basic.h \
|
||||
type.h \
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Buffered inputput from a VipsStreami
|
||||
/* Buffered inputput from a VipsSource
|
||||
*
|
||||
* J.Cupitt, 18/11/19
|
||||
*/
|
||||
@ -54,7 +54,7 @@ extern "C" {
|
||||
|
||||
#define VIPS_BUFIS_BUFFER_SIZE (4096)
|
||||
|
||||
/* Layer over streami: read with an input buffer.
|
||||
/* Layer over source: read with an input buffer.
|
||||
*
|
||||
* Libraries like libjpeg do their own input buffering and need raw IO, but
|
||||
* others, like radiance, need to parse the input into lines. A buffered read
|
||||
@ -65,9 +65,9 @@ typedef struct _VipsBufis {
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* The VipsStreami we wrap.
|
||||
/* The VipsSource we wrap.
|
||||
*/
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
/* The +1 means there's always a \0 byte at the end.
|
||||
*
|
||||
@ -93,23 +93,23 @@ typedef struct _VipsBufisClass {
|
||||
|
||||
GType vips_bufis_get_type( void );
|
||||
|
||||
VipsBufis *vips_bufis_new_from_streami( VipsStreami *streami );
|
||||
VipsBufis *vips_bufis_new_from_source( VipsSource *source );
|
||||
|
||||
void vips_bufis_unbuffer( VipsBufis *streamib );
|
||||
void vips_bufis_unbuffer( VipsBufis *sourceb );
|
||||
|
||||
int vips_bufis_getc( VipsBufis *streamib );
|
||||
int vips_bufis_getc( VipsBufis *sourceb );
|
||||
#define VIPS_BUFIS_GETC( S ) ( \
|
||||
(S)->read_point < (S)->chars_in_buffer ? \
|
||||
(S)->input_buffer[(S)->read_point++] : \
|
||||
vips_bufis_getc( S ) \
|
||||
)
|
||||
void vips_bufis_ungetc( VipsBufis *streamib );
|
||||
void vips_bufis_ungetc( VipsBufis *sourceb );
|
||||
#define VIPS_BUFIS_UNGETC( S ) { \
|
||||
if( (S)->read_point > 0 ) \
|
||||
(S)->read_point -= 1; \
|
||||
}
|
||||
|
||||
int vips_bufis_require( VipsBufis *streamib, int require );
|
||||
int vips_bufis_require( VipsBufis *sourceb, int require );
|
||||
#define VIPS_BUFIS_REQUIRE( S, R ) ( \
|
||||
(S)->read_point + (R) <= (S)->chars_in_buffer ? \
|
||||
0 : \
|
||||
@ -118,10 +118,10 @@ int vips_bufis_require( VipsBufis *streamib, int require );
|
||||
#define VIPS_BUFIS_PEEK( S ) ((S)->input_buffer + (S)->read_point)
|
||||
#define VIPS_BUFIS_FETCH( S ) ((S)->input_buffer[(S)->read_point++])
|
||||
|
||||
const char *vips_bufis_get_line( VipsBufis *streamib );
|
||||
char *vips_bufis_get_line_copy( VipsBufis *streamib );
|
||||
const char *vips_bufis_get_non_whitespace( VipsBufis *streamib );
|
||||
int vips_bufis_skip_whitespace( VipsBufis *streamib );
|
||||
const char *vips_bufis_get_line( VipsBufis *sourceb );
|
||||
char *vips_bufis_get_line_copy( VipsBufis *sourceb );
|
||||
const char *vips_bufis_get_non_whitespace( VipsBufis *sourceb );
|
||||
int vips_bufis_skip_whitespace( VipsBufis *sourceb );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
397
libvips/include/vips/connection.h
Normal file
397
libvips/include/vips/connection.h
Normal file
@ -0,0 +1,397 @@
|
||||
/* A byte source/sink .. it can be a pipe, socket, or perhaps a node.js stream.
|
||||
*
|
||||
* J.Cupitt, 19/6/14
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
This file is part of VIPS.
|
||||
|
||||
VIPS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301 USA
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
|
||||
|
||||
*/
|
||||
|
||||
#ifndef VIPS_CONNECTION_H
|
||||
#define VIPS_CONNECTION_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#define VIPS_TYPE_CONNECTION (vips_connection_get_type())
|
||||
#define VIPS_CONNECTION( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST( (obj), \
|
||||
VIPS_TYPE_CONNECTION, VipsConnection ))
|
||||
#define VIPS_CONNECTION_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_CAST( (klass), \
|
||||
VIPS_TYPE_CONNECTION, VipsConnectionClass))
|
||||
#define VIPS_IS_CONNECTION( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_CONNECTION ))
|
||||
#define VIPS_IS_CONNECTION_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_CONNECTION ))
|
||||
#define VIPS_CONNECTION_GET_CLASS( obj ) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS( (obj), \
|
||||
VIPS_TYPE_CONNECTION, VipsConnectionClass ))
|
||||
|
||||
/* Communicate with something like a socket or pipe.
|
||||
*/
|
||||
typedef struct _VipsConnection {
|
||||
VipsObject parent_object;
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* Read/write this fd if connected to a system pipe/socket. Override
|
||||
* ::read() and ::write() to do something else.
|
||||
*/
|
||||
int descriptor;
|
||||
|
||||
/* A descriptor we close with vips_tracked_close().
|
||||
*/
|
||||
int tracked_descriptor;
|
||||
|
||||
/* A descriptor we close with close().
|
||||
*/
|
||||
int close_descriptor;
|
||||
|
||||
/* If descriptor is a file, the filename we opened. Handy for error
|
||||
* messages.
|
||||
*/
|
||||
char *filename;
|
||||
|
||||
} VipsConnection;
|
||||
|
||||
typedef struct _VipsConnectionClass {
|
||||
VipsObjectClass parent_class;
|
||||
|
||||
} VipsConnectionClass;
|
||||
|
||||
GType vips_connection_get_type( void );
|
||||
|
||||
const char *vips_connection_filename( VipsConnection *stream );
|
||||
const char *vips_connection_nick( VipsConnection *stream );
|
||||
|
||||
#define VIPS_TYPE_SOURCE (vips_source_get_type())
|
||||
#define VIPS_SOURCE( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST( (obj), \
|
||||
VIPS_TYPE_SOURCE, VipsSource ))
|
||||
#define VIPS_SOURCE_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_CAST( (klass), \
|
||||
VIPS_TYPE_SOURCE, VipsSourceClass))
|
||||
#define VIPS_IS_SOURCE( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_SOURCE ))
|
||||
#define VIPS_IS_SOURCE_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_SOURCE ))
|
||||
#define VIPS_SOURCE_GET_CLASS( obj ) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS( (obj), \
|
||||
VIPS_TYPE_SOURCE, VipsSourceClass ))
|
||||
|
||||
/* Read from something like a socket, file or memory area and present the data
|
||||
* with a unified seek / read / map interface.
|
||||
*
|
||||
* During the header phase, we save data from unseekable streams in a buffer
|
||||
* so readers can rewind and read again. We don't buffer data during the
|
||||
* decode stage.
|
||||
*/
|
||||
typedef struct _VipsSource {
|
||||
VipsConnection parent_object;
|
||||
|
||||
/* We have two phases:
|
||||
*
|
||||
* During the header phase, we save bytes read from the input (if this
|
||||
* is an unseekable stream) so that we can rewind and try again, if
|
||||
* necessary.
|
||||
*
|
||||
* Once we reach decode phase, we no longer support rewind and the
|
||||
* buffer of saved data is discarded.
|
||||
*/
|
||||
gboolean decode;
|
||||
|
||||
/* TRUE if this input is something like a pipe. These don't support
|
||||
* stream or map -- all you can do is read() bytes sequentially.
|
||||
*
|
||||
* If you attempt to map or get the size of a pipe-style input, it'll
|
||||
* get read entirely into memory. Seeks will cause read up to the seek
|
||||
* point.
|
||||
*/
|
||||
gboolean have_tested_seek;
|
||||
gboolean is_pipe;
|
||||
|
||||
/* The current read point and length.
|
||||
*
|
||||
* length is -1 for is_pipe sources.
|
||||
*
|
||||
* off_t can be 32 bits on some platforms, so make sure we have a
|
||||
* full 64.
|
||||
*/
|
||||
gint64 read_position;
|
||||
gint64 length;
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* For sources where we have the whole image in memory (from a memory
|
||||
* buffer, from mmaping the file, from reading the pipe into memory),
|
||||
* a pointer to the start.
|
||||
*/
|
||||
const void *data;
|
||||
|
||||
/* For is_pipe sources, save data read during header phase here. If
|
||||
* we rewind and try again, serve data from this until it runs out.
|
||||
*
|
||||
* If we need to force the whole pipe into memory, read everything to
|
||||
* this and put a copy pf the pointer in data.
|
||||
*/
|
||||
GByteArray *header_bytes;
|
||||
|
||||
/* Save the first few bytes here for file type sniffing.
|
||||
*/
|
||||
GByteArray *sniff;
|
||||
|
||||
/* For a memory stream, the blob we read from.
|
||||
*/
|
||||
VipsBlob *blob;
|
||||
|
||||
/* If we mmaped the file, whet we need to unmmap on finalize.
|
||||
*/
|
||||
void *mmap_baseaddr;
|
||||
size_t mmap_length;
|
||||
|
||||
} VipsSource;
|
||||
|
||||
typedef struct _VipsSourceClass {
|
||||
VipsConnectionClass parent_class;
|
||||
|
||||
/* Subclasses can define these to implement other source methods.
|
||||
*/
|
||||
|
||||
/* Read from the stream into the supplied buffer, args exactly as
|
||||
* read(2). Set errno on error.
|
||||
*
|
||||
* We must return gint64, since ssize_t is often defined as unsigned
|
||||
* on Windows.
|
||||
*/
|
||||
gint64 (*read)( VipsSource *, void *, size_t );
|
||||
|
||||
/* Seek to a certain position, args exactly as lseek(2). Set errno on
|
||||
* error.
|
||||
*
|
||||
* Unseekable streams should always return -1. VipsSource will then
|
||||
* seek by _read()ing bytes into memory as required.
|
||||
*
|
||||
* We have to use int64 rather than off_t, since we must work on
|
||||
* Windows, where off_t can be 32-bits.
|
||||
*/
|
||||
gint64 (*seek)( VipsSource *, gint64, int );
|
||||
|
||||
} VipsSourceClass;
|
||||
|
||||
GType vips_source_get_type( void );
|
||||
|
||||
VipsSource *vips_source_new_from_descriptor( int descriptor );
|
||||
VipsSource *vips_source_new_from_file( const char *filename );
|
||||
VipsSource *vips_source_new_from_blob( VipsBlob *blob );
|
||||
VipsSource *vips_source_new_from_memory( const void *data, size_t size );
|
||||
VipsSource *vips_source_new_from_options( const char *options );
|
||||
|
||||
void vips_source_minimise( VipsSource *source );
|
||||
int vips_source_unminimise( VipsSource *source );
|
||||
int vips_source_decode( VipsSource *source );
|
||||
gint64 vips_source_read( VipsSource *source, void *data, size_t length );
|
||||
gboolean vips_source_is_mappable( VipsSource *source );
|
||||
const void *vips_source_map( VipsSource *source, size_t *length );
|
||||
VipsBlob *vips_source_map_blob( VipsSource *source );
|
||||
gint64 vips_source_seek( VipsSource *source, gint64 offset, int whence );
|
||||
int vips_source_rewind( VipsSource *source );
|
||||
size_t vips_source_sniff_at_most( VipsSource *source,
|
||||
unsigned char **data, size_t length );
|
||||
unsigned char *vips_source_sniff( VipsSource *source, size_t length );
|
||||
gint64 vips_source_length( VipsSource *source );
|
||||
|
||||
#define VIPS_TYPE_SOURCE_CUSTOM (vips_source_custom_get_type())
|
||||
#define VIPS_SOURCE_CUSTOM( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST( (obj), \
|
||||
VIPS_TYPE_SOURCE_CUSTOM, VipsSourceCustom ))
|
||||
#define VIPS_SOURCE_CUSTOM_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_CAST( (klass), \
|
||||
VIPS_TYPE_SOURCE_CUSTOM, VipsSourceCustomClass))
|
||||
#define VIPS_IS_SOURCE_CUSTOM( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_SOURCE_CUSTOM ))
|
||||
#define VIPS_IS_SOURCE_CUSTOM_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_SOURCE_CUSTOM ))
|
||||
#define VIPS_SOURCE_CUSTOM_GET_CLASS( obj ) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS( (obj), \
|
||||
VIPS_TYPE_SOURCE_CUSTOM, VipsSourceCustomClass ))
|
||||
|
||||
/* Subclass of source_custom with signals for handlers. This is supposed to be
|
||||
* useful for language bindings.
|
||||
*/
|
||||
typedef struct _VipsSourceCustom {
|
||||
VipsSource parent_object;
|
||||
|
||||
} VipsSourceCustom;
|
||||
|
||||
typedef struct _VipsSourceCustomClass {
|
||||
VipsSourceClass parent_class;
|
||||
|
||||
/* The action signals clients can use to implement read and seek.
|
||||
* We must use gint64 everywhere since there's no G_TYPE_SIZE.
|
||||
*/
|
||||
|
||||
gint64 (*read)( VipsSourceCustom *, void *, gint64 );
|
||||
gint64 (*seek)( VipsSourceCustom *, gint64, int );
|
||||
|
||||
} VipsSourceCustomClass;
|
||||
|
||||
GType vips_source_custom_get_type( void );
|
||||
VipsSourceCustom *vips_source_custom_new( void );
|
||||
|
||||
#define VIPS_TYPE_TARGET (vips_target_get_type())
|
||||
#define VIPS_TARGET( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST( (obj), \
|
||||
VIPS_TYPE_TARGET, VipsTarget ))
|
||||
#define VIPS_TARGET_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_CAST( (klass), \
|
||||
VIPS_TYPE_TARGET, VipsTargetClass))
|
||||
#define VIPS_IS_TARGET( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_TARGET ))
|
||||
#define VIPS_IS_TARGET_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_TARGET ))
|
||||
#define VIPS_TARGET_GET_CLASS( obj ) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS( (obj), \
|
||||
VIPS_TYPE_TARGET, VipsTargetClass ))
|
||||
|
||||
/* PNG writes in 8kb chunks, so we need to be a little larger than that.
|
||||
*/
|
||||
#define VIPS_TARGET_BUFFER_SIZE (8500)
|
||||
|
||||
/* Output to something like a socket, pipe or memory area.
|
||||
*/
|
||||
typedef struct _VipsTarget {
|
||||
VipsConnection parent_object;
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* This stream should write to memory.
|
||||
*/
|
||||
gboolean memory;
|
||||
|
||||
/* The stream has been finished and can no longer be written.
|
||||
*/
|
||||
gboolean finished;
|
||||
|
||||
/* Write memory output here.
|
||||
*/
|
||||
GByteArray *memory_buffer;
|
||||
|
||||
/* And return memory via this blob.
|
||||
*/
|
||||
VipsBlob *blob;
|
||||
|
||||
/* Buffer small writes here. write_point is the index of the next
|
||||
* character to write.
|
||||
*/
|
||||
unsigned char output_buffer[VIPS_TARGET_BUFFER_SIZE];
|
||||
int write_point;
|
||||
|
||||
} VipsTarget;
|
||||
|
||||
typedef struct _VipsTargetClass {
|
||||
VipsConnectionClass parent_class;
|
||||
|
||||
/* Write to output. Args exactly as write(2).
|
||||
*
|
||||
* We must return gint64, since ssize_t is often defined as unsigned
|
||||
* on Windows.
|
||||
*/
|
||||
gint64 (*write)( VipsTarget *, const void *, size_t );
|
||||
|
||||
/* Output has been generated, so do any clearing up,
|
||||
* eg. copy the bytes we saved in memory to the stream blob.
|
||||
*/
|
||||
void (*finish)( VipsTarget * );
|
||||
|
||||
} VipsTargetClass;
|
||||
|
||||
GType vips_target_get_type( void );
|
||||
|
||||
VipsTarget *vips_target_new_to_descriptor( int descriptor );
|
||||
VipsTarget *vips_target_new_to_file( const char *filename );
|
||||
VipsTarget *vips_target_new_to_memory( void );
|
||||
int vips_target_write( VipsTarget *target, const void *data, size_t length );
|
||||
void vips_target_finish( VipsTarget *target );
|
||||
unsigned char *vips_target_steal( VipsTarget *target, size_t *length );
|
||||
char *vips_target_steal_text( VipsTarget *target );
|
||||
|
||||
int vips_target_putc( VipsTarget *target, int ch );
|
||||
#define VIPS_TARGET_PUTC( S, C ) ( \
|
||||
(S)->write_point < VIPS_TARGET_BUFFER_SIZE ? \
|
||||
((S)->output_buffer[(S)->write_point++] = (C), 0) : \
|
||||
vips_target_putc( (S), (C) ) \
|
||||
)
|
||||
int vips_target_writes( VipsTarget *target, const char *str );
|
||||
int vips_target_writef( VipsTarget *target, const char *fmt, ... )
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
int vips_target_write_amp( VipsTarget *target, const char *str );
|
||||
|
||||
#define VIPS_TYPE_TARGET_CUSTOM (vips_target_custom_get_type())
|
||||
#define VIPS_TARGET_CUSTOM( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST( (obj), \
|
||||
VIPS_TYPE_TARGET_CUSTOM, VipsTargetCustom ))
|
||||
#define VIPS_TARGET_CUSTOM_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_CAST( (klass), \
|
||||
VIPS_TYPE_TARGET_CUSTOM, VipsTargetCustomClass))
|
||||
#define VIPS_IS_TARGET_CUSTOM( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_TARGET_CUSTOM ))
|
||||
#define VIPS_IS_TARGET_CUSTOM_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_TARGET_CUSTOM ))
|
||||
#define VIPS_TARGET_CUSTOM_GET_CLASS( obj ) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS( (obj), \
|
||||
VIPS_TYPE_TARGET_CUSTOM, VipsTargetCustomClass ))
|
||||
|
||||
#define VIPS_TARGET_CUSTOM_BUFFER_SIZE (4096)
|
||||
|
||||
/* Output to something like a socket, pipe or memory area.
|
||||
*/
|
||||
typedef struct _VipsTargetCustom {
|
||||
VipsTarget parent_object;
|
||||
|
||||
} VipsTargetCustom;
|
||||
|
||||
typedef struct _VipsTargetCustomClass {
|
||||
VipsTargetClass parent_class;
|
||||
|
||||
/* The action signals clients can use to implement write and finish.
|
||||
* We must use gint64 everywhere since there's no G_TYPE_SIZE.
|
||||
*/
|
||||
|
||||
gint64 (*write)( VipsTargetCustom *, const void *, gint64 );
|
||||
void (*finish)( VipsTargetCustom * );
|
||||
|
||||
} VipsTargetCustomClass;
|
||||
|
||||
GType vips_target_custom_get_type( void );
|
||||
VipsTargetCustom *vips_target_custom_new( void );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*VIPS_CONNECTION_H*/
|
@ -189,7 +189,7 @@ typedef struct _VipsForeignLoadClass {
|
||||
* This function should return %TRUE if the stream contains an image of
|
||||
* this type.
|
||||
*/
|
||||
gboolean (*is_a_stream)( VipsStreami *streami );
|
||||
gboolean (*is_a_source)( VipsSource *source );
|
||||
|
||||
/* Get the flags from a filename.
|
||||
*
|
||||
@ -240,14 +240,14 @@ GType vips_foreign_load_get_type(void);
|
||||
|
||||
const char *vips_foreign_find_load( const char *filename );
|
||||
const char *vips_foreign_find_load_buffer( const void *data, size_t size );
|
||||
const char *vips_foreign_find_load_stream( VipsStreami *streami );
|
||||
const char *vips_foreign_find_load_source( VipsSource *source );
|
||||
|
||||
VipsForeignFlags vips_foreign_flags( const char *loader, const char *filename );
|
||||
gboolean vips_foreign_is_a( const char *loader, const char *filename );
|
||||
gboolean vips_foreign_is_a_buffer( const char *loader,
|
||||
const void *data, size_t size );
|
||||
gboolean vips_foreign_is_a_stream( const char *loader,
|
||||
VipsStreami *streami );
|
||||
gboolean vips_foreign_is_a_source( const char *loader,
|
||||
VipsSource *source );
|
||||
|
||||
void vips_foreign_load_invalidate( VipsImage *image );
|
||||
|
||||
@ -354,7 +354,7 @@ GType vips_foreign_save_get_type(void);
|
||||
const char *vips_foreign_find_save( const char *filename );
|
||||
gchar **vips_foreign_get_suffixes( void );
|
||||
const char *vips_foreign_find_save_buffer( const char *suffix );
|
||||
const char *vips_foreign_find_save_stream( const char *suffix );
|
||||
const char *vips_foreign_find_save_target( const char *suffix );
|
||||
|
||||
int vips_vipsload( const char *filename, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
@ -369,7 +369,7 @@ int vips_jpegload( const char *filename, VipsImage **out, ... )
|
||||
int vips_jpegload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
int vips_jpegsave_stream( VipsImage *in, VipsStreamo *streamo, ... )
|
||||
int vips_jpegsave_target( VipsImage *in, VipsTarget *target, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_jpegsave( VipsImage *in, const char *filename, ... )
|
||||
__attribute__((sentinel));
|
||||
@ -399,14 +399,14 @@ typedef enum {
|
||||
VIPS_FOREIGN_WEBP_PRESET_LAST
|
||||
} VipsForeignWebpPreset;
|
||||
|
||||
int vips_webpload_stream( VipsStreami *streami, VipsImage **out, ... )
|
||||
int vips_webpload_source( VipsSource *source, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_webpload( const char *filename, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_webpload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
int vips_webpsave_stream( VipsImage *in, VipsStreamo *streamo, ... )
|
||||
int vips_webpsave_target( VipsImage *in, VipsTarget *target, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_webpsave( VipsImage *in, const char *filename, ... )
|
||||
__attribute__((sentinel));
|
||||
@ -481,7 +481,7 @@ int vips_tiffload( const char *filename, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_tiffload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_tiffload_stream( VipsStreami *streami, VipsImage **out, ... )
|
||||
int vips_tiffload_source( VipsSource *source, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_tiffsave( VipsImage *in, const char *filename, ... )
|
||||
__attribute__((sentinel));
|
||||
@ -549,13 +549,13 @@ typedef enum /*< flags >*/ {
|
||||
VIPS_FOREIGN_PNG_FILTER_ALL = 0xF8
|
||||
} VipsForeignPngFilter;
|
||||
|
||||
int vips_pngload_stream( VipsStreami *streami, VipsImage **out, ... )
|
||||
int vips_pngload_source( VipsSource *source, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_pngload( const char *filename, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_pngload_buffer( void *buf, size_t len, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_pngsave_stream( VipsImage *in, VipsStreamo *streamo, ... )
|
||||
int vips_pngsave_target( VipsImage *in, VipsTarget *target, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_pngsave( VipsImage *in, const char *filename, ... )
|
||||
__attribute__((sentinel));
|
||||
@ -570,7 +570,7 @@ int vips_ppmsave( VipsImage *in, const char *filename, ... )
|
||||
int vips_matload( const char *filename, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
int vips_radload_stream( VipsStreami *streami, VipsImage **out, ... )
|
||||
int vips_radload_source( VipsSource *source, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_radload( const char *filename, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
@ -580,7 +580,7 @@ int vips_radsave( VipsImage *in, const char *filename, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_radsave_buffer( VipsImage *in, void **buf, size_t *len, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_radsave_stream( VipsImage *in, VipsStreamo *streamo, ... )
|
||||
int vips_radsave_target( VipsImage *in, VipsTarget *target, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
int vips_pdfload( const char *filename, VipsImage **out, ... )
|
||||
|
@ -447,7 +447,7 @@ VipsImage *vips_image_new_from_memory_copy( const void *data, size_t size,
|
||||
VipsImage *vips_image_new_from_buffer( const void *buf, size_t len,
|
||||
const char *option_string, ... )
|
||||
__attribute__((sentinel));
|
||||
VipsImage *vips_image_new_from_stream( VipsStreami *streami,
|
||||
VipsImage *vips_image_new_from_source( VipsSource *source,
|
||||
const char *option_string, ... ) __attribute__((sentinel));
|
||||
VipsImage *vips_image_new_matrix( int width, int height );
|
||||
VipsImage *vips_image_new_matrixv( int width, int height, ... );
|
||||
@ -470,8 +470,8 @@ int vips_image_write_to_file( VipsImage *image, const char *name, ... )
|
||||
int vips_image_write_to_buffer( VipsImage *in,
|
||||
const char *suffix, void **buf, size_t *size, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_image_write_to_stream( VipsImage *in,
|
||||
const char *suffix, VipsStreamo *streamo, ... )
|
||||
int vips_image_write_to_target( VipsImage *in,
|
||||
const char *suffix, VipsTarget *target, ... )
|
||||
__attribute__((sentinel));
|
||||
void *vips_image_write_to_memory( VipsImage *in, size_t *size );
|
||||
|
||||
|
299
libvips/include/vips/renameE
Normal file
299
libvips/include/vips/renameE
Normal file
@ -0,0 +1,299 @@
|
||||
/* Old and broken stuff that we still enable by default, but don't document
|
||||
* and certainly don't recommend.
|
||||
*
|
||||
* 30/6/09
|
||||
* - from vips.h
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
This file is part of VIPS.
|
||||
|
||||
VIPS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301 USA
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
|
||||
|
||||
*/
|
||||
|
||||
#ifndef IM_ALMOSTDEPRECATED_H
|
||||
#define IM_ALMOSTDEPRECATED_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
/* Was public, now deprecated.
|
||||
*/
|
||||
typedef enum {
|
||||
IM_BBITS_BYTE = 8,
|
||||
IM_BBITS_SHORT = 16,
|
||||
IM_BBITS_INT = 32,
|
||||
IM_BBITS_FLOAT = 32,
|
||||
IM_BBITS_COMPLEX = 64,
|
||||
IM_BBITS_DOUBLE = 64,
|
||||
IM_BBITS_DPCOMPLEX = 128
|
||||
} VipsBBits;
|
||||
|
||||
/* Used to define a region of interest for im_extract() etc. Too boring to be
|
||||
* public API, see im_extract_area() etc.
|
||||
*/
|
||||
typedef struct {
|
||||
int xstart;
|
||||
int ystart;
|
||||
int xsize;
|
||||
int ysize;
|
||||
int chsel; /* 1 2 3 or 0, for r g b or all respectively
|
||||
*(channel select) */
|
||||
} IMAGE_BOX;
|
||||
|
||||
int im_extract( IMAGE *, IMAGE *, IMAGE_BOX * );
|
||||
DOUBLEMASK *im_measure( IMAGE *im, IMAGE_BOX *box, int h, int v,
|
||||
int *sel, int nsel, const char *name );
|
||||
|
||||
gboolean im_isuint( IMAGE *im );
|
||||
gboolean im_isint( IMAGE *im );
|
||||
gboolean im_isfloat( IMAGE *im );
|
||||
gboolean im_isscalar( IMAGE *im );
|
||||
gboolean im_iscomplex( IMAGE *im );
|
||||
|
||||
int im_c2ps( IMAGE *in, IMAGE *out );
|
||||
|
||||
int im_clip( IMAGE *in, IMAGE *out );
|
||||
|
||||
#define MASK_IDEAL_HIGHPASS IM_MASK_IDEAL_HIGHPASS
|
||||
#define MASK_IDEAL_LOWPASS IM_MASK_IDEAL_LOWPASS
|
||||
#define MASK_BUTTERWORTH_HIGHPASS IM_MASK_BUTTERWORTH_HIGHPASS
|
||||
#define MASK_BUTTERWORTH_LOWPASS IM_MASK_BUTTERWORTH_LOWPASS
|
||||
#define MASK_GAUSS_HIGHPASS IM_MASK_GAUSS_HIGHPASS
|
||||
#define MASK_GAUSS_LOWPASS IM_MASK_GAUSS_LOWPASS
|
||||
|
||||
#define MASK_IDEAL_RINGPASS IM_MASK_IDEAL_RINGPASS
|
||||
#define MASK_IDEAL_RINGREJECT IM_MASK_IDEAL_RINGREJECT
|
||||
#define MASK_BUTTERWORTH_RINGPASS IM_MASK_BUTTERWORTH_RINGPASS
|
||||
#define MASK_BUTTERWORTH_RINGREJECT IM_MASK_BUTTERWORTH_RINGREJECT
|
||||
#define MASK_GAUSS_RINGPASS IM_MASK_GAUSS_RINGPASS
|
||||
#define MASK_GAUSS_RINGREJECT IM_MASK_GAUSS_RINGREJECT
|
||||
|
||||
#define MASK_IDEAL_BANDPASS IM_MASK_IDEAL_BANDPASS
|
||||
#define MASK_IDEAL_BANDREJECT IM_MASK_IDEAL_BANDREJECT
|
||||
#define MASK_BUTTERWORTH_BANDPASS IM_MASK_BUTTERWORTH_BANDPASS
|
||||
#define MASK_BUTTERWORTH_BANDREJECT IM_MASK_BUTTERWORTH_BANDREJECT
|
||||
#define MASK_GAUSS_BANDPASS IM_MASK_GAUSS_BANDPASS
|
||||
#define MASK_GAUSS_BANDREJECT IM_MASK_GAUSS_BANDREJECT
|
||||
|
||||
#define MASK_FRACTAL_FLT IM_MASK_FRACTAL_FLT
|
||||
|
||||
#define MaskType ImMaskType
|
||||
|
||||
/* Copy and swap types.
|
||||
*/
|
||||
typedef enum {
|
||||
IM_ARCH_NATIVE,
|
||||
IM_ARCH_BYTE_SWAPPED,
|
||||
IM_ARCH_LSB_FIRST,
|
||||
IM_ARCH_MSB_FIRST
|
||||
} im_arch_type;
|
||||
|
||||
gboolean im_isnative( im_arch_type arch );
|
||||
int im_copy_from( IMAGE *in, IMAGE *out, im_arch_type architecture );
|
||||
|
||||
/* Backwards compatibility macros.
|
||||
*/
|
||||
#define im_clear_error_string() im_error_clear()
|
||||
#define im_errorstring() im_error_buffer()
|
||||
|
||||
/* Deprecated API.
|
||||
*/
|
||||
void im_errormsg( const char *fmt, ... )
|
||||
__attribute__((format(printf, 1, 2)));
|
||||
void im_verrormsg( const char *fmt, va_list ap );
|
||||
void im_errormsg_system( int err, const char *fmt, ... )
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
void im_diagnostics( const char *fmt, ... )
|
||||
__attribute__((format(printf, 1, 2)));
|
||||
void im_warning( const char *fmt, ... )
|
||||
__attribute__((format(printf, 1, 2)));
|
||||
|
||||
int im_iterate( VipsImage *im,
|
||||
VipsStartFn start, im_generate_fn generate, VipsStopFn stop,
|
||||
void *a, void *b
|
||||
);
|
||||
|
||||
/* Async rendering.
|
||||
*/
|
||||
int im_render_priority( VipsImage *in, VipsImage *out, VipsImage *mask,
|
||||
int width, int height, int max,
|
||||
int priority,
|
||||
void (*notify)( VipsImage *, VipsRect *, void * ), void *client );
|
||||
int im_cache( VipsImage *in, VipsImage *out, int width, int height, int max );
|
||||
|
||||
/* Deprecated operations.
|
||||
*/
|
||||
int im_cmulnorm( IMAGE *in1, IMAGE *in2, IMAGE *out );
|
||||
int im_fav4( IMAGE **, IMAGE * );
|
||||
int im_gadd( double, IMAGE *, double, IMAGE *, double, IMAGE *);
|
||||
int im_litecor( IMAGE *, IMAGE *, IMAGE *, int, double );
|
||||
int im_render_fade( IMAGE *in, IMAGE *out, IMAGE *mask,
|
||||
int width, int height, int max,
|
||||
int fps, int steps,
|
||||
int priority,
|
||||
void (*notify)( IMAGE *, VipsRect *, void * ), void *client );
|
||||
int im_render( IMAGE *in, IMAGE *out, IMAGE *mask,
|
||||
int width, int height, int max,
|
||||
void (*notify)( IMAGE *, VipsRect *, void * ), void *client );
|
||||
|
||||
int im_cooc_matrix( IMAGE *im, IMAGE *m,
|
||||
int xp, int yp, int xs, int ys, int dx, int dy, int flag );
|
||||
int im_cooc_asm( IMAGE *m, double *asmoment );
|
||||
int im_cooc_contrast( IMAGE *m, double *contrast );
|
||||
int im_cooc_correlation( IMAGE *m, double *correlation );
|
||||
int im_cooc_entropy( IMAGE *m, double *entropy );
|
||||
|
||||
int im_glds_matrix( IMAGE *im, IMAGE *m,
|
||||
int xpos, int ypos, int xsize, int ysize, int dx, int dy );
|
||||
int im_glds_asm( IMAGE *m, double *asmoment );
|
||||
int im_glds_contrast( IMAGE *m, double *contrast );
|
||||
int im_glds_entropy( IMAGE *m, double *entropy );
|
||||
int im_glds_mean( IMAGE *m, double *mean );
|
||||
|
||||
int im_dif_std(IMAGE *im, int xpos, int ypos, int xsize, int ysize, int dx, int dy, double *pmean, double *pstd);
|
||||
int im_simcontr( IMAGE *out, int xsize, int ysize );
|
||||
int im_spatres( IMAGE *in, IMAGE *out, int step );
|
||||
|
||||
int im_stretch3( IMAGE *in, IMAGE *out, double dx, double dy );
|
||||
|
||||
/* Renamed operations.
|
||||
*/
|
||||
|
||||
/* arithmetic
|
||||
*/
|
||||
int im_remainderconst_vec( IMAGE *in, IMAGE *out, int n, double *c );
|
||||
|
||||
/* boolean
|
||||
*/
|
||||
int im_andconst( IMAGE *, IMAGE *, double );
|
||||
int im_and_vec( IMAGE *, IMAGE *, int, double * );
|
||||
int im_orconst( IMAGE *, IMAGE *, double );
|
||||
int im_or_vec( IMAGE *, IMAGE *, int, double * );
|
||||
int im_eorconst( IMAGE *, IMAGE *, double );
|
||||
int im_eor_vec( IMAGE *, IMAGE *, int, double * );
|
||||
|
||||
/* mosaicing
|
||||
*/
|
||||
int im_affine( IMAGE *in, IMAGE *out,
|
||||
double a, double b, double c, double d, double dx, double dy,
|
||||
int ox, int oy, int ow, int oh );
|
||||
int im_similarity( IMAGE *in, IMAGE *out,
|
||||
double a, double b, double dx, double dy );
|
||||
int im_similarity_area( IMAGE *in, IMAGE *out,
|
||||
double a, double b, double dx, double dy,
|
||||
int ox, int oy, int ow, int oh );
|
||||
|
||||
/* colour
|
||||
*/
|
||||
int im_icc_export( IMAGE *in, IMAGE *out,
|
||||
const char *output_profile_filename, int intent );
|
||||
|
||||
/* conversion
|
||||
*/
|
||||
int im_clip2dcm( IMAGE *in, IMAGE *out );
|
||||
int im_clip2cm( IMAGE *in, IMAGE *out );
|
||||
int im_clip2us( IMAGE *in, IMAGE *out );
|
||||
int im_clip2ui( IMAGE *in, IMAGE *out );
|
||||
int im_clip2s( IMAGE *in, IMAGE *out );
|
||||
int im_clip2i( IMAGE *in, IMAGE *out );
|
||||
int im_clip2d( IMAGE *in, IMAGE *out );
|
||||
int im_clip2f( IMAGE *in, IMAGE *out );
|
||||
int im_clip2c( IMAGE *in, IMAGE *out );
|
||||
|
||||
int im_slice( IMAGE *in, IMAGE *out, double, double );
|
||||
int im_thresh( IMAGE *in, IMAGE *out, double );
|
||||
|
||||
int im_print( const char *message );
|
||||
|
||||
int im_convsub( IMAGE *in, IMAGE *out, INTMASK *mask, int xskip, int yskip );
|
||||
|
||||
int im_bernd( const char *tiffname, int x, int y, int w, int h );
|
||||
|
||||
int im_resize_linear( IMAGE *, IMAGE *, int, int );
|
||||
|
||||
int im_convf( IMAGE *in, IMAGE *out, DOUBLEMASK *mask );
|
||||
int im_convsepf( IMAGE *in, IMAGE *out, DOUBLEMASK *mask );
|
||||
int im_conv_raw( IMAGE *in, IMAGE *out, INTMASK *mask );
|
||||
int im_convf_raw( IMAGE *in, IMAGE *out, DOUBLEMASK *mask );
|
||||
int im_convsep_raw( IMAGE *in, IMAGE *out, INTMASK *mask );
|
||||
int im_convsepf_raw( IMAGE *in, IMAGE *out, DOUBLEMASK *mask );
|
||||
int im_fastcor_raw( IMAGE *in, IMAGE *ref, IMAGE *out );
|
||||
int im_spcor_raw( IMAGE *in, IMAGE *ref, IMAGE *out );
|
||||
int im_gradcor_raw( IMAGE *in, IMAGE *ref, IMAGE *out );
|
||||
int im_contrast_surface_raw( IMAGE *in, IMAGE *out,
|
||||
int half_win_size, int spacing );
|
||||
|
||||
int im_stdif_raw( IMAGE *in, IMAGE *out,
|
||||
double a, double m0, double b, double s0, int xwin, int ywin );
|
||||
int im_lhisteq_raw( IMAGE *in, IMAGE *out, int xwin, int ywin );
|
||||
|
||||
int im_erode_raw( IMAGE *in, IMAGE *out, INTMASK *m );
|
||||
int im_dilate_raw( IMAGE *in, IMAGE *out, INTMASK *m );
|
||||
int im_rank_raw( IMAGE *in, IMAGE *out, int xsize, int ysize, int order );
|
||||
|
||||
/* inplace
|
||||
*/
|
||||
int im_circle( IMAGE *im, int cx, int cy, int radius, int intensity );
|
||||
int im_line( IMAGE *, int, int, int, int, int );
|
||||
int im_segment( IMAGE *test, IMAGE *mask, int *segments );
|
||||
int im_paintrect( IMAGE *im, VipsRect *r, PEL *ink );
|
||||
int im_insertplace( IMAGE *main, IMAGE *sub, int x, int y );
|
||||
|
||||
int im_flood_copy( IMAGE *in, IMAGE *out, int x, int y, PEL *ink );
|
||||
int im_flood_blob_copy( IMAGE *in, IMAGE *out, int x, int y, PEL *ink );
|
||||
int im_flood_other_copy( IMAGE *test, IMAGE *mark, IMAGE *out,
|
||||
int x, int y, int serial );
|
||||
|
||||
int im_flood( IMAGE *im, int x, int y, PEL *ink, VipsRect *dout );
|
||||
int im_flood_blob( IMAGE *im, int x, int y, PEL *ink, VipsRect *dout );
|
||||
int im_flood_other( IMAGE *test, IMAGE *mark,
|
||||
int x, int y, int serial, VipsRect *dout );
|
||||
|
||||
int im_fastline( IMAGE *im, int x1, int y1, int x2, int y2, PEL *pel );
|
||||
int im_fastlineuser( IMAGE *im,
|
||||
int x1, int y1, int x2, int y2,
|
||||
VipsPlotFn fn, void *client1, void *client2, void *client3 );
|
||||
|
||||
int im_plotmask( IMAGE *im, int ix, int iy, PEL *ink, PEL *mask, VipsRect *r );
|
||||
int im_readpoint( IMAGE *im, int x, int y, PEL *pel );
|
||||
int im_plotpoint( IMAGE *im, int x, int y, PEL *pel );
|
||||
|
||||
int im_smudge( IMAGE *image, int ix, int iy, VipsRect *r );
|
||||
int im_smear( IMAGE *im, int ix, int iy, VipsRect *r );
|
||||
|
||||
void vips_warn( const char *domain, const char *fmt, ... )
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
void vips_vwarn( const char *domain, const char *fmt, va_list ap );
|
||||
void vips_info_set( gboolean info );
|
||||
void vips_info( const char *domain, const char *fmt, ... )
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
void vips_vinfo( const char *domain, const char *fmt, va_list ap );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*IM_ALMOSTDEPRECATED_H*/
|
@ -79,7 +79,7 @@ int vips_thumbnail_buffer( void *buf, size_t len, VipsImage **out,
|
||||
__attribute__((sentinel));
|
||||
int vips_thumbnail_image( VipsImage *in, VipsImage **out, int width, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_thumbnail_stream( VipsStreami *streami, VipsImage **out,
|
||||
int vips_thumbnail_source( VipsSource *source, VipsImage **out,
|
||||
int width, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
|
@ -1,397 +0,0 @@
|
||||
/* A byte source/sink .. it can be a pipe, socket, or perhaps a node.js stream.
|
||||
*
|
||||
* J.Cupitt, 19/6/14
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
This file is part of VIPS.
|
||||
|
||||
VIPS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301 USA
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
|
||||
|
||||
*/
|
||||
|
||||
#ifndef VIPS_STREAM_H
|
||||
#define VIPS_STREAM_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#define VIPS_TYPE_STREAM (vips_stream_get_type())
|
||||
#define VIPS_STREAM( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST( (obj), \
|
||||
VIPS_TYPE_STREAM, VipsStream ))
|
||||
#define VIPS_STREAM_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_CAST( (klass), \
|
||||
VIPS_TYPE_STREAM, VipsStreamClass))
|
||||
#define VIPS_IS_STREAM( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_STREAM ))
|
||||
#define VIPS_IS_STREAM_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_STREAM ))
|
||||
#define VIPS_STREAM_GET_CLASS( obj ) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS( (obj), \
|
||||
VIPS_TYPE_STREAM, VipsStreamClass ))
|
||||
|
||||
/* Communicate with something like a socket or pipe.
|
||||
*/
|
||||
typedef struct _VipsStream {
|
||||
VipsObject parent_object;
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* Read/write this fd if connected to a system pipe/socket. Override
|
||||
* ::read() and ::write() to do something else.
|
||||
*/
|
||||
int descriptor;
|
||||
|
||||
/* A descriptor we close with vips_tracked_close().
|
||||
*/
|
||||
int tracked_descriptor;
|
||||
|
||||
/* A descriptor we close with close().
|
||||
*/
|
||||
int close_descriptor;
|
||||
|
||||
/* If descriptor is a file, the filename we opened. Handy for error
|
||||
* messages.
|
||||
*/
|
||||
char *filename;
|
||||
|
||||
} VipsStream;
|
||||
|
||||
typedef struct _VipsStreamClass {
|
||||
VipsObjectClass parent_class;
|
||||
|
||||
} VipsStreamClass;
|
||||
|
||||
GType vips_stream_get_type( void );
|
||||
|
||||
const char *vips_stream_filename( VipsStream *stream );
|
||||
const char *vips_stream_nick( VipsStream *stream );
|
||||
|
||||
#define VIPS_TYPE_STREAMI (vips_streami_get_type())
|
||||
#define VIPS_STREAMI( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST( (obj), \
|
||||
VIPS_TYPE_STREAMI, VipsStreami ))
|
||||
#define VIPS_STREAMI_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_CAST( (klass), \
|
||||
VIPS_TYPE_STREAMI, VipsStreamiClass))
|
||||
#define VIPS_IS_STREAMI( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_STREAMI ))
|
||||
#define VIPS_IS_STREAMI_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_STREAMI ))
|
||||
#define VIPS_STREAMI_GET_CLASS( obj ) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS( (obj), \
|
||||
VIPS_TYPE_STREAMI, VipsStreamiClass ))
|
||||
|
||||
/* Read from something like a socket, file or memory area and present the data
|
||||
* with a unified seek / read / map interface.
|
||||
*
|
||||
* During the header phase, we save data from unseekable streams in a buffer
|
||||
* so readers can rewind and read again. We don't buffer data during the
|
||||
* decode stage.
|
||||
*/
|
||||
typedef struct _VipsStreami {
|
||||
VipsStream parent_object;
|
||||
|
||||
/* We have two phases:
|
||||
*
|
||||
* During the header phase, we save bytes read from the input (if this
|
||||
* is an unseekable stream) so that we can rewind and try again, if
|
||||
* necessary.
|
||||
*
|
||||
* Once we reach decode phase, we no longer support rewind and the
|
||||
* buffer of saved data is discarded.
|
||||
*/
|
||||
gboolean decode;
|
||||
|
||||
/* TRUE if this input is something like a pipe. These don't support
|
||||
* stream or map -- all you can do is read() bytes sequentially.
|
||||
*
|
||||
* If you attempt to map or get the size of a pipe-style input, it'll
|
||||
* get read entirely into memory. Seeks will cause read up to the seek
|
||||
* point.
|
||||
*/
|
||||
gboolean have_tested_seek;
|
||||
gboolean is_pipe;
|
||||
|
||||
/* The current read point and length.
|
||||
*
|
||||
* length is -1 for is_pipe sources.
|
||||
*
|
||||
* off_t can be 32 bits on some platforms, so make sure we have a
|
||||
* full 64.
|
||||
*/
|
||||
gint64 read_position;
|
||||
gint64 length;
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* For sources where we have the whole image in memory (from a memory
|
||||
* buffer, from mmaping the file, from reading the pipe into memory),
|
||||
* a pointer to the start.
|
||||
*/
|
||||
const void *data;
|
||||
|
||||
/* For is_pipe sources, save data read during header phase here. If
|
||||
* we rewind and try again, serve data from this until it runs out.
|
||||
*
|
||||
* If we need to force the whole pipe into memory, read everything to
|
||||
* this and put a copy pf the pointer in data.
|
||||
*/
|
||||
GByteArray *header_bytes;
|
||||
|
||||
/* Save the first few bytes here for file type sniffing.
|
||||
*/
|
||||
GByteArray *sniff;
|
||||
|
||||
/* For a memory stream, the blob we read from.
|
||||
*/
|
||||
VipsBlob *blob;
|
||||
|
||||
/* If we mmaped the file, whet we need to unmmap on finalize.
|
||||
*/
|
||||
void *mmap_baseaddr;
|
||||
size_t mmap_length;
|
||||
|
||||
} VipsStreami;
|
||||
|
||||
typedef struct _VipsStreamiClass {
|
||||
VipsStreamClass parent_class;
|
||||
|
||||
/* Subclasses can define these to implement other streami methods.
|
||||
*/
|
||||
|
||||
/* Read from the stream into the supplied buffer, args exactly as
|
||||
* read(2). Set errno on error.
|
||||
*
|
||||
* We must return gint64, since ssize_t is often defined as unsigned
|
||||
* on Windows.
|
||||
*/
|
||||
gint64 (*read)( VipsStreami *, void *, size_t );
|
||||
|
||||
/* Seek to a certain position, args exactly as lseek(2). Set errno on
|
||||
* error.
|
||||
*
|
||||
* Unseekable streams should always return -1. VipsStreami will then
|
||||
* seek by _read()ing bytes into memory as required.
|
||||
*
|
||||
* We have to use int64 rather than off_t, since we must work on
|
||||
* Windows, where off_t can be 32-bits.
|
||||
*/
|
||||
gint64 (*seek)( VipsStreami *, gint64, int );
|
||||
|
||||
} VipsStreamiClass;
|
||||
|
||||
GType vips_streami_get_type( void );
|
||||
|
||||
VipsStreami *vips_streami_new_from_descriptor( int descriptor );
|
||||
VipsStreami *vips_streami_new_from_file( const char *filename );
|
||||
VipsStreami *vips_streami_new_from_blob( VipsBlob *blob );
|
||||
VipsStreami *vips_streami_new_from_memory( const void *data, size_t size );
|
||||
VipsStreami *vips_streami_new_from_options( const char *options );
|
||||
|
||||
void vips_streami_minimise( VipsStreami *streami );
|
||||
int vips_streami_unminimise( VipsStreami *streami );
|
||||
int vips_streami_decode( VipsStreami *streami );
|
||||
gint64 vips_streami_read( VipsStreami *streami, void *data, size_t length );
|
||||
gboolean vips_streami_is_mappable( VipsStreami *streami );
|
||||
const void *vips_streami_map( VipsStreami *streami, size_t *length );
|
||||
VipsBlob *vips_streami_map_blob( VipsStreami *streami );
|
||||
gint64 vips_streami_seek( VipsStreami *streami, gint64 offset, int whence );
|
||||
int vips_streami_rewind( VipsStreami *streami );
|
||||
size_t vips_streami_sniff_at_most( VipsStreami *streami,
|
||||
unsigned char **data, size_t length );
|
||||
unsigned char *vips_streami_sniff( VipsStreami *streami, size_t length );
|
||||
gint64 vips_streami_length( VipsStreami *streami );
|
||||
|
||||
#define VIPS_TYPE_STREAMIU (vips_streamiu_get_type())
|
||||
#define VIPS_STREAMIU( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST( (obj), \
|
||||
VIPS_TYPE_STREAMIU, VipsStreamiu ))
|
||||
#define VIPS_STREAMIU_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_CAST( (klass), \
|
||||
VIPS_TYPE_STREAMIU, VipsStreamiuClass))
|
||||
#define VIPS_IS_STREAMIU( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_STREAMIU ))
|
||||
#define VIPS_IS_STREAMIU_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_STREAMIU ))
|
||||
#define VIPS_STREAMIU_GET_CLASS( obj ) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS( (obj), \
|
||||
VIPS_TYPE_STREAMIU, VipsStreamiuClass ))
|
||||
|
||||
/* Subclass of streamiu with signals for handlers. This is supposed to be
|
||||
* useful for language bindings.
|
||||
*/
|
||||
typedef struct _VipsStreamiu {
|
||||
VipsStreami parent_object;
|
||||
|
||||
} VipsStreamiu;
|
||||
|
||||
typedef struct _VipsStreamiuClass {
|
||||
VipsStreamiClass parent_class;
|
||||
|
||||
/* The action signals clients can use to implement read and seek.
|
||||
* We must use gint64 everywhere since there's no G_TYPE_SIZE.
|
||||
*/
|
||||
|
||||
gint64 (*read)( VipsStreamiu *, void *, gint64 );
|
||||
gint64 (*seek)( VipsStreamiu *, gint64, int );
|
||||
|
||||
} VipsStreamiuClass;
|
||||
|
||||
GType vips_streamiu_get_type( void );
|
||||
VipsStreamiu *vips_streamiu_new( void );
|
||||
|
||||
#define VIPS_TYPE_STREAMO (vips_streamo_get_type())
|
||||
#define VIPS_STREAMO( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST( (obj), \
|
||||
VIPS_TYPE_STREAMO, VipsStreamo ))
|
||||
#define VIPS_STREAMO_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_CAST( (klass), \
|
||||
VIPS_TYPE_STREAMO, VipsStreamoClass))
|
||||
#define VIPS_IS_STREAMO( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_STREAMO ))
|
||||
#define VIPS_IS_STREAMO_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_STREAMO ))
|
||||
#define VIPS_STREAMO_GET_CLASS( obj ) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS( (obj), \
|
||||
VIPS_TYPE_STREAMO, VipsStreamoClass ))
|
||||
|
||||
/* PNG writes in 8kb chunks, so we need to be a little larger than that.
|
||||
*/
|
||||
#define VIPS_STREAMO_BUFFER_SIZE (8500)
|
||||
|
||||
/* Output to something like a socket, pipe or memory area.
|
||||
*/
|
||||
typedef struct _VipsStreamo {
|
||||
VipsStream parent_object;
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* This stream should write to memory.
|
||||
*/
|
||||
gboolean memory;
|
||||
|
||||
/* The stream has been finished and can no longer be written.
|
||||
*/
|
||||
gboolean finished;
|
||||
|
||||
/* Write memory output here.
|
||||
*/
|
||||
GByteArray *memory_buffer;
|
||||
|
||||
/* And return memory via this blob.
|
||||
*/
|
||||
VipsBlob *blob;
|
||||
|
||||
/* Buffer small writes here. write_point is the index of the next
|
||||
* character to write.
|
||||
*/
|
||||
unsigned char output_buffer[VIPS_STREAMO_BUFFER_SIZE];
|
||||
int write_point;
|
||||
|
||||
} VipsStreamo;
|
||||
|
||||
typedef struct _VipsStreamoClass {
|
||||
VipsStreamClass parent_class;
|
||||
|
||||
/* Write to output. Args exactly as write(2).
|
||||
*
|
||||
* We must return gint64, since ssize_t is often defined as unsigned
|
||||
* on Windows.
|
||||
*/
|
||||
gint64 (*write)( VipsStreamo *, const void *, size_t );
|
||||
|
||||
/* Output has been generated, so do any clearing up,
|
||||
* eg. copy the bytes we saved in memory to the stream blob.
|
||||
*/
|
||||
void (*finish)( VipsStreamo * );
|
||||
|
||||
} VipsStreamoClass;
|
||||
|
||||
GType vips_streamo_get_type( void );
|
||||
|
||||
VipsStreamo *vips_streamo_new_to_descriptor( int descriptor );
|
||||
VipsStreamo *vips_streamo_new_to_file( const char *filename );
|
||||
VipsStreamo *vips_streamo_new_to_memory( void );
|
||||
int vips_streamo_write( VipsStreamo *streamo, const void *data, size_t length );
|
||||
void vips_streamo_finish( VipsStreamo *streamo );
|
||||
unsigned char *vips_streamo_steal( VipsStreamo *streamo, size_t *length );
|
||||
char *vips_streamo_steal_text( VipsStreamo *streamo );
|
||||
|
||||
int vips_streamo_putc( VipsStreamo *streamo, int ch );
|
||||
#define VIPS_STREAMO_PUTC( S, C ) ( \
|
||||
(S)->write_point < VIPS_STREAMO_BUFFER_SIZE ? \
|
||||
((S)->output_buffer[(S)->write_point++] = (C), 0) : \
|
||||
vips_streamo_putc( (S), (C) ) \
|
||||
)
|
||||
int vips_streamo_writes( VipsStreamo *streamo, const char *str );
|
||||
int vips_streamo_writef( VipsStreamo *streamo, const char *fmt, ... )
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
int vips_streamo_write_amp( VipsStreamo *streamo, const char *str );
|
||||
|
||||
#define VIPS_TYPE_STREAMOU (vips_streamou_get_type())
|
||||
#define VIPS_STREAMOU( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST( (obj), \
|
||||
VIPS_TYPE_STREAMOU, VipsStreamou ))
|
||||
#define VIPS_STREAMOU_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_CAST( (klass), \
|
||||
VIPS_TYPE_STREAMOU, VipsStreamouClass))
|
||||
#define VIPS_IS_STREAMOU( obj ) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE( (obj), VIPS_TYPE_STREAMOU ))
|
||||
#define VIPS_IS_STREAMOU_CLASS( klass ) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE( (klass), VIPS_TYPE_STREAMOU ))
|
||||
#define VIPS_STREAMOU_GET_CLASS( obj ) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS( (obj), \
|
||||
VIPS_TYPE_STREAMOU, VipsStreamouClass ))
|
||||
|
||||
#define VIPS_STREAMOU_BUFFER_SIZE (4096)
|
||||
|
||||
/* Output to something like a socket, pipe or memory area.
|
||||
*/
|
||||
typedef struct _VipsStreamou {
|
||||
VipsStreamo parent_object;
|
||||
|
||||
} VipsStreamou;
|
||||
|
||||
typedef struct _VipsStreamouClass {
|
||||
VipsStreamoClass parent_class;
|
||||
|
||||
/* The action signals clients can use to implement write and finish.
|
||||
* We must use gint64 everywhere since there's no G_TYPE_SIZE.
|
||||
*/
|
||||
|
||||
gint64 (*write)( VipsStreamou *, const void *, gint64 );
|
||||
void (*finish)( VipsStreamou * );
|
||||
|
||||
} VipsStreamouClass;
|
||||
|
||||
GType vips_streamou_get_type( void );
|
||||
VipsStreamou *vips_streamou_new( void );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*VIPS_STREAM_H*/
|
@ -113,7 +113,7 @@ extern "C" {
|
||||
#include <vips/object.h>
|
||||
#include <vips/type.h>
|
||||
#include <vips/gate.h>
|
||||
#include <vips/stream.h>
|
||||
#include <vips/connection.h>
|
||||
#include <vips/bufis.h>
|
||||
|
||||
#include <vips/version.h>
|
||||
|
106
libvips/include/vips/x.h
Normal file
106
libvips/include/vips/x.h
Normal file
@ -0,0 +1,106 @@
|
||||
/* resample.h
|
||||
*
|
||||
* 20/9/09
|
||||
* - from proto.h
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
This file is part of VIPS.
|
||||
|
||||
VIPS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301 USA
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
|
||||
|
||||
*/
|
||||
|
||||
#ifndef VIPS_RESAMPLE_H
|
||||
#define VIPS_RESAMPLE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
typedef enum {
|
||||
VIPS_KERNEL_NEAREST,
|
||||
VIPS_KERNEL_LINEAR,
|
||||
VIPS_KERNEL_CUBIC,
|
||||
VIPS_KERNEL_MITCHELL,
|
||||
VIPS_KERNEL_LANCZOS2,
|
||||
VIPS_KERNEL_LANCZOS3,
|
||||
VIPS_KERNEL_LAST
|
||||
} VipsKernel;
|
||||
|
||||
typedef enum {
|
||||
VIPS_SIZE_BOTH,
|
||||
VIPS_SIZE_UP,
|
||||
VIPS_SIZE_DOWN,
|
||||
VIPS_SIZE_FORCE,
|
||||
VIPS_SIZE_LAST
|
||||
} VipsSize;
|
||||
|
||||
int vips_shrink( VipsImage *in, VipsImage **out,
|
||||
double hshrink, double vshrink, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_shrinkh( VipsImage *in, VipsImage **out, int hshrink, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_shrinkv( VipsImage *in, VipsImage **out, int vshrink, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
int vips_reduce( VipsImage *in, VipsImage **out,
|
||||
double hshrink, double vshrink, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_reduceh( VipsImage *in, VipsImage **out, double hshrink, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_reducev( VipsImage *in, VipsImage **out, double vshrink, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
int vips_thumbnail( const char *filename, VipsImage **out, int width, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_thumbnail_buffer( void *buf, size_t len, VipsImage **out,
|
||||
int width, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_thumbnail_image( VipsImage *in, VipsImage **out, int width, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_thumbnail_source( VipsSource *source, VipsImage **out, int width, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
int vips_similarity( VipsImage *in, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_rotate( VipsImage *in, VipsImage **out, double angle, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_affine( VipsImage *in, VipsImage **out,
|
||||
double a, double b, double c, double d, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
int vips_resize( VipsImage *in, VipsImage **out, double scale, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
int vips_mapim( VipsImage *in, VipsImage **out, VipsImage *index, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
int vips_quadratic( VipsImage *in, VipsImage **out, VipsImage *coeff, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*VIPS_RESAMPLE_H*/
|
@ -1,11 +1,11 @@
|
||||
noinst_LTLIBRARIES = libiofuncs.la
|
||||
|
||||
libiofuncs_la_SOURCES = \
|
||||
stream.c \
|
||||
streami.c \
|
||||
streamiu.c \
|
||||
streamo.c \
|
||||
streamou.c \
|
||||
connection.c \
|
||||
source.c \
|
||||
sourceuser.c \
|
||||
target.c \
|
||||
targetuser.c \
|
||||
bufis.c \
|
||||
dbuf.c \
|
||||
reorder.c \
|
||||
|
@ -74,8 +74,8 @@ vips_bufis_class_init( VipsBufisClass *class )
|
||||
_( "Input" ),
|
||||
_( "Stream to load from" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsBufis, streami ),
|
||||
VIPS_TYPE_STREAMI );
|
||||
G_STRUCT_OFFSET( VipsBufis, source ),
|
||||
VIPS_TYPE_SOURCE );
|
||||
|
||||
}
|
||||
|
||||
@ -88,20 +88,20 @@ vips_bufis_init( VipsBufis *bufis )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_bufis_new_from_streami:
|
||||
* @streami: stream to operate on
|
||||
* vips_bufis_new_from_source:
|
||||
* @source: stream to operate on
|
||||
*
|
||||
* Create a bufis wrapping a streami.
|
||||
* Create a bufis wrapping a source.
|
||||
*
|
||||
* Returns: a new #VipsBufis
|
||||
*/
|
||||
VipsBufis *
|
||||
vips_bufis_new_from_streami( VipsStreami *streami )
|
||||
vips_bufis_new_from_source( VipsSource *source )
|
||||
{
|
||||
VipsBufis *bufis;
|
||||
|
||||
bufis = VIPS_BUFIS( g_object_new( VIPS_TYPE_BUFIS,
|
||||
"input", streami,
|
||||
"input", source,
|
||||
NULL ) );
|
||||
|
||||
if( vips_object_build( VIPS_OBJECT( bufis ) ) ) {
|
||||
@ -117,14 +117,14 @@ vips_bufis_new_from_streami( VipsStreami *streami )
|
||||
* @bufis: stream to operate on
|
||||
*
|
||||
* Discard the input buffer and reset the read point. You must call this
|
||||
* before using read or seek on the underlying #VipsStreami class.
|
||||
* before using read or seek on the underlying #VipsSource class.
|
||||
*/
|
||||
void
|
||||
vips_bufis_unbuffer( VipsBufis *bufis )
|
||||
{
|
||||
/* We'd read ahead a little way -- seek backwards by that amount.
|
||||
*/
|
||||
vips_streami_seek( bufis->streami,
|
||||
vips_source_seek( bufis->source,
|
||||
bufis->read_point - bufis->chars_in_buffer, SEEK_CUR );
|
||||
bufis->read_point = 0;
|
||||
bufis->chars_in_buffer = 0;
|
||||
@ -143,7 +143,7 @@ vips_bufis_refill( VipsBufis *bufis )
|
||||
*/
|
||||
g_assert( bufis->read_point == bufis->chars_in_buffer );
|
||||
|
||||
bytes_read = vips_streami_read( bufis->streami,
|
||||
bytes_read = vips_source_read( bufis->source,
|
||||
bufis->input_buffer, VIPS_BUFIS_BUFFER_SIZE );
|
||||
if( bytes_read == -1 )
|
||||
return( -1 );
|
||||
@ -255,13 +255,13 @@ vips_bufis_require( VipsBufis *bufis, int require )
|
||||
bufis->chars_in_buffer;
|
||||
size_t bytes_read;
|
||||
|
||||
if( (bytes_read = vips_streami_read( bufis->streami,
|
||||
if( (bytes_read = vips_source_read( bufis->source,
|
||||
to, space_available )) == -1 )
|
||||
return( -1 );
|
||||
if( bytes_read == 0 ) {
|
||||
vips_error(
|
||||
vips_stream_nick( VIPS_STREAM(
|
||||
bufis->streami ) ),
|
||||
vips_connection_nick( VIPS_CONNECTION(
|
||||
bufis->source ) ),
|
||||
"%s", _( "end of file" ) );
|
||||
return( -1 );
|
||||
}
|
||||
|
@ -63,7 +63,7 @@
|
||||
* @see_also: <link linkend="libvips-foreign">foreign</link>
|
||||
* @include: vips/vips.h
|
||||
*
|
||||
* A #VipsStream is a source or sink of bytes for something like jpeg loading.
|
||||
* A #VipsConnection is a source or sink of bytes for something like jpeg loading.
|
||||
* It can be connected to a network socket, for example, or perhaps a node.js
|
||||
* stream, or to an area of memory.
|
||||
*
|
||||
@ -71,21 +71,21 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* VipsStream:
|
||||
* VipsConnection:
|
||||
*
|
||||
* A #VipsStream is a source or sink of bytes for something like jpeg loading.
|
||||
* A #VipsConnection is a source or sink of bytes for something like jpeg loading.
|
||||
* It can be connected to a network socket, for example.
|
||||
*/
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE( VipsStream, vips_stream, VIPS_TYPE_OBJECT );
|
||||
G_DEFINE_ABSTRACT_TYPE( VipsConnection, vips_connection, VIPS_TYPE_OBJECT );
|
||||
|
||||
static void
|
||||
vips_stream_finalize( GObject *gobject )
|
||||
vips_connection_finalize( GObject *gobject )
|
||||
{
|
||||
VipsStream *stream = (VipsStream *) gobject;
|
||||
VipsConnection *stream = (VipsConnection *) gobject;
|
||||
|
||||
#ifdef VIPS_DEBUG
|
||||
VIPS_DEBUG_MSG( "vips_stream_finalize: " );
|
||||
VIPS_DEBUG_MSG( "vips_connection_finalize: " );
|
||||
vips_object_print_name( VIPS_OBJECT( gobject ) );
|
||||
VIPS_DEBUG_MSG( "\n" );
|
||||
#endif /*VIPS_DEBUG*/
|
||||
@ -106,15 +106,15 @@ vips_stream_finalize( GObject *gobject )
|
||||
|
||||
VIPS_FREE( stream->filename );
|
||||
|
||||
G_OBJECT_CLASS( vips_stream_parent_class )->finalize( gobject );
|
||||
G_OBJECT_CLASS( vips_connection_parent_class )->finalize( gobject );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_stream_class_init( VipsStreamClass *class )
|
||||
vips_connection_class_init( VipsConnectionClass *class )
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
|
||||
|
||||
gobject_class->finalize = vips_stream_finalize;
|
||||
gobject_class->finalize = vips_connection_finalize;
|
||||
gobject_class->set_property = vips_object_set_property;
|
||||
gobject_class->get_property = vips_object_get_property;
|
||||
|
||||
@ -122,20 +122,20 @@ vips_stream_class_init( VipsStreamClass *class )
|
||||
_( "Descriptor" ),
|
||||
_( "File descriptor for read or write" ),
|
||||
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||
G_STRUCT_OFFSET( VipsStream, descriptor ),
|
||||
G_STRUCT_OFFSET( VipsConnection, descriptor ),
|
||||
-1, 1000000000, 0 );
|
||||
|
||||
VIPS_ARG_STRING( class, "filename", 2,
|
||||
_( "Filename" ),
|
||||
_( "Name of file to open" ),
|
||||
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||
G_STRUCT_OFFSET( VipsStream, filename ),
|
||||
G_STRUCT_OFFSET( VipsConnection, filename ),
|
||||
NULL );
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
vips_stream_init( VipsStream *stream )
|
||||
vips_connection_init( VipsConnection *stream )
|
||||
{
|
||||
stream->descriptor = -1;
|
||||
stream->tracked_descriptor = -1;
|
||||
@ -143,13 +143,13 @@ vips_stream_init( VipsStream *stream )
|
||||
}
|
||||
|
||||
const char *
|
||||
vips_stream_filename( VipsStream *stream )
|
||||
vips_connection_filename( VipsConnection *stream )
|
||||
{
|
||||
return( stream->filename );
|
||||
}
|
||||
|
||||
const char *
|
||||
vips_stream_nick( VipsStream *stream )
|
||||
vips_connection_nick( VipsConnection *stream )
|
||||
{
|
||||
return( stream->filename ?
|
||||
stream->filename :
|
609
libvips/iofuncs/destination.c
Normal file
609
libvips/iofuncs/destination.c
Normal file
@ -0,0 +1,609 @@
|
||||
/* A byte source/sink .. it can be a pipe, file descriptor, memory area,
|
||||
* socket, node.js stream, etc.
|
||||
*
|
||||
* J.Cupitt, 19/6/14
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
This file is part of VIPS.
|
||||
|
||||
VIPS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301 USA
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
#define VIPS_DEBUG
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif /*HAVE_CONFIG_H*/
|
||||
#include <vips/intl.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif /*HAVE_UNISTD_H*/
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <vips/vips.h>
|
||||
#include <vips/internal.h>
|
||||
#include <vips/debug.h>
|
||||
|
||||
/* Try to make an O_BINARY ... sometimes need the leading '_'.
|
||||
*/
|
||||
#ifdef BINARY_OPEN
|
||||
#ifndef O_BINARY
|
||||
#ifdef _O_BINARY
|
||||
#define O_BINARY _O_BINARY
|
||||
#endif /*_O_BINARY*/
|
||||
#endif /*!O_BINARY*/
|
||||
#endif /*BINARY_OPEN*/
|
||||
|
||||
/* If we have O_BINARY, add it to a mode flags set.
|
||||
*/
|
||||
#ifdef O_BINARY
|
||||
#define BINARYIZE(M) ((M) | O_BINARY)
|
||||
#else /*!O_BINARY*/
|
||||
#define BINARYIZE(M) (M)
|
||||
#endif /*O_BINARY*/
|
||||
|
||||
#define MODE_READ BINARYIZE (O_RDONLY)
|
||||
#define MODE_READWRITE BINARYIZE (O_RDWR)
|
||||
#define MODE_WRITE BINARYIZE (O_WRONLY | O_CREAT | O_TRUNC)
|
||||
|
||||
G_DEFINE_TYPE( VipsDestination, vips_destination, VIPS_TYPE_CONNECTION );
|
||||
|
||||
static void
|
||||
vips_destination_finalize( GObject *gobject )
|
||||
{
|
||||
VipsDestination *destination = VIPS_DESTINATION( gobject );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_destination_finalize:\n" );
|
||||
|
||||
VIPS_FREEF( g_byte_array_unref, destination->memory_buffer );
|
||||
if( destination->blob ) {
|
||||
vips_area_unref( VIPS_AREA( destination->blob ) );
|
||||
destination->blob = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS( vips_destination_parent_class )->finalize( gobject );
|
||||
}
|
||||
|
||||
static int
|
||||
vips_destination_build( VipsObject *object )
|
||||
{
|
||||
VipsConnection *stream = VIPS_CONNECTION( object );
|
||||
VipsDestination *destination = VIPS_DESTINATION( object );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_destination_build: %p\n", stream );
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_destination_parent_class )->build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( vips_object_argument_isset( object, "filename" ) &&
|
||||
vips_object_argument_isset( object, "descriptor" ) ) {
|
||||
vips_error( vips_connection_nick( stream ),
|
||||
"%s", _( "don't set 'filename' and 'descriptor'" ) );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
if( stream->filename ) {
|
||||
const char *filename = stream->filename;
|
||||
|
||||
int fd;
|
||||
|
||||
/* 0644 is rw user, r group and other.
|
||||
*/
|
||||
if( (fd = vips_tracked_open( filename,
|
||||
MODE_WRITE, 0644 )) == -1 ) {
|
||||
vips_error_system( errno, vips_connection_nick( stream ),
|
||||
"%s", _( "unable to open for write" ) );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
stream->tracked_descriptor = fd;
|
||||
stream->descriptor = fd;
|
||||
}
|
||||
else if( vips_object_argument_isset( object, "descriptor" ) ) {
|
||||
stream->descriptor = dup( stream->descriptor );
|
||||
stream->close_descriptor = stream->descriptor;
|
||||
}
|
||||
else if( destination->memory ) {
|
||||
destination->memory_buffer = g_byte_array_new();
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static gint64
|
||||
vips_destination_write_real( VipsDestination *destination, const void *data, size_t length )
|
||||
{
|
||||
VipsConnection *stream = VIPS_CONNECTION( destination );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_destination_write_real: %zd bytes\n", length );
|
||||
|
||||
return( write( stream->descriptor, data, length ) );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_destination_finish_real( VipsDestination *destination )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_destination_finish_real:\n" );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_destination_class_init( VipsDestinationClass *class )
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
|
||||
VipsObjectClass *object_class = VIPS_OBJECT_CLASS( class );
|
||||
|
||||
gobject_class->finalize = vips_destination_finalize;
|
||||
gobject_class->set_property = vips_object_set_property;
|
||||
gobject_class->get_property = vips_object_get_property;
|
||||
|
||||
object_class->nickname = "destination";
|
||||
object_class->description = _( "stream stream" );
|
||||
|
||||
object_class->build = vips_destination_build;
|
||||
|
||||
class->write = vips_destination_write_real;
|
||||
class->finish = vips_destination_finish_real;
|
||||
|
||||
VIPS_ARG_BOOL( class, "memory", 3,
|
||||
_( "Memory" ),
|
||||
_( "File descriptor should output to memory" ),
|
||||
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||
G_STRUCT_OFFSET( VipsDestination, memory ),
|
||||
FALSE );
|
||||
|
||||
/* SET_ALWAYS means that blob is set by C and the obj system is not
|
||||
* involved in creation or destruction. It can be read at any time.
|
||||
*/
|
||||
VIPS_ARG_BOXED( class, "blob", 4,
|
||||
_( "Blob" ),
|
||||
_( "Blob to save to" ),
|
||||
VIPS_ARGUMENT_SET_ALWAYS,
|
||||
G_STRUCT_OFFSET( VipsDestination, blob ),
|
||||
VIPS_TYPE_BLOB );
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
vips_destination_init( VipsDestination *destination )
|
||||
{
|
||||
destination->blob = vips_blob_new( NULL, NULL, 0 );
|
||||
destination->write_point = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_new_to_descriptor:
|
||||
* @descriptor: write to this file descriptor
|
||||
*
|
||||
* Create a stream attached to a file descriptor.
|
||||
* @descriptor is kept open until the #VipsDestination is finalized.
|
||||
*
|
||||
* See also: vips_destination_new_to_file().
|
||||
*
|
||||
* Returns: a new #VipsDestination
|
||||
*/
|
||||
VipsDestination *
|
||||
vips_destination_new_to_descriptor( int descriptor )
|
||||
{
|
||||
VipsDestination *destination;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_destination_new_to_descriptor: %d\n",
|
||||
descriptor );
|
||||
|
||||
destination = VIPS_DESTINATION( g_object_new( VIPS_TYPE_DESTINATION,
|
||||
"descriptor", descriptor,
|
||||
NULL ) );
|
||||
|
||||
if( vips_object_build( VIPS_OBJECT( destination ) ) ) {
|
||||
VIPS_UNREF( destination );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( destination );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_new_to_file:
|
||||
* @filename: write to this file
|
||||
*
|
||||
* Create a stream attached to a file.
|
||||
*
|
||||
* Returns: a new #VipsDestination
|
||||
*/
|
||||
VipsDestination *
|
||||
vips_destination_new_to_file( const char *filename )
|
||||
{
|
||||
VipsDestination *destination;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_destination_new_to_file: %s\n",
|
||||
filename );
|
||||
|
||||
destination = VIPS_DESTINATION( g_object_new( VIPS_TYPE_DESTINATION,
|
||||
"filename", filename,
|
||||
NULL ) );
|
||||
|
||||
if( vips_object_build( VIPS_OBJECT( destination ) ) ) {
|
||||
VIPS_UNREF( destination );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( destination );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_new_to_memory:
|
||||
*
|
||||
* Create a stream which will stream to a memory area. Read from @blob to get
|
||||
* memory.
|
||||
*
|
||||
* See also: vips_destination_new_to_file().
|
||||
*
|
||||
* Returns: a new #VipsConnection
|
||||
*/
|
||||
VipsDestination *
|
||||
vips_destination_new_to_memory( void )
|
||||
{
|
||||
VipsDestination *destination;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_destination_new_to_memory:\n" );
|
||||
|
||||
destination = VIPS_DESTINATION( g_object_new( VIPS_TYPE_DESTINATION,
|
||||
"memory", TRUE,
|
||||
NULL ) );
|
||||
|
||||
if( vips_object_build( VIPS_OBJECT( destination ) ) ) {
|
||||
VIPS_UNREF( destination );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( destination );
|
||||
}
|
||||
|
||||
static int
|
||||
vips_destination_write_unbuffered( VipsDestination *destination,
|
||||
const void *data, size_t length )
|
||||
{
|
||||
VipsDestinationClass *class = VIPS_DESTINATION_GET_CLASS( destination );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_destination_write_unbuffered:\n" );
|
||||
|
||||
if( destination->finished )
|
||||
return( 0 );
|
||||
|
||||
if( destination->memory_buffer )
|
||||
g_byte_array_append( destination->memory_buffer, data, length );
|
||||
else
|
||||
while( length > 0 ) {
|
||||
gint64 bytes_written;
|
||||
|
||||
bytes_written = class->write( destination, data, length );
|
||||
|
||||
/* n == 0 isn't strictly an error, but we treat it as
|
||||
* one to make sure we don't get stuck in this loop.
|
||||
*/
|
||||
if( bytes_written <= 0 ) {
|
||||
vips_error_system( errno,
|
||||
vips_connection_nick(
|
||||
VIPS_CONNECTION( destination ) ),
|
||||
"%s", _( "write error" ) );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
length -= bytes_written;
|
||||
data += bytes_written;
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static int
|
||||
vips_destination_flush( VipsDestination *destination )
|
||||
{
|
||||
g_assert( destination->write_point >= 0 );
|
||||
g_assert( destination->write_point <= VIPS_DESTINATION_BUFFER_SIZE );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_destination_flush:\n" );
|
||||
|
||||
if( destination->write_point > 0 ) {
|
||||
if( vips_destination_write_unbuffered( destination,
|
||||
destination->output_buffer, destination->write_point ) )
|
||||
return( -1 );
|
||||
destination->write_point = 0;
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_write:
|
||||
* @destination: output stream to operate on
|
||||
* @buffer: bytes to write
|
||||
* @length: length of @buffer in bytes
|
||||
*
|
||||
* Write @length bytes from @buffer to the output.
|
||||
*
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_destination_write( VipsDestination *destination, const void *buffer, size_t length )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_destination_write: %zd bytes\n", length );
|
||||
|
||||
if( length > VIPS_DESTINATION_BUFFER_SIZE - destination->write_point &&
|
||||
vips_destination_flush( destination ) )
|
||||
return( -1 );
|
||||
|
||||
if( length > VIPS_DESTINATION_BUFFER_SIZE - destination->write_point ) {
|
||||
/* Still too large? Do an unbuffered write.
|
||||
*/
|
||||
if( vips_destination_write_unbuffered( destination, buffer, length ) )
|
||||
return( -1 );
|
||||
}
|
||||
else {
|
||||
memcpy( destination->output_buffer + destination->write_point,
|
||||
buffer, length );
|
||||
destination->write_point += length;
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_finish:
|
||||
* @destination: output stream to operate on
|
||||
* @buffer: bytes to write
|
||||
* @length: length of @buffer in bytes
|
||||
*
|
||||
* Call this at the end of write to make the stream do any cleaning up. You
|
||||
* can call it many times.
|
||||
*
|
||||
* After a destination has been finished, further writes will do nothing.
|
||||
*/
|
||||
void
|
||||
vips_destination_finish( VipsDestination *destination )
|
||||
{
|
||||
VipsDestinationClass *class = VIPS_DESTINATION_GET_CLASS( destination );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_destination_finish:\n" );
|
||||
|
||||
if( destination->finished )
|
||||
return;
|
||||
|
||||
(void) vips_destination_flush( destination );
|
||||
|
||||
/* Move the stream buffer into the blob so it can be read out.
|
||||
*/
|
||||
if( destination->memory_buffer ) {
|
||||
unsigned char *data;
|
||||
size_t length;
|
||||
|
||||
length = destination->memory_buffer->len;
|
||||
data = g_byte_array_free( destination->memory_buffer, FALSE );
|
||||
destination->memory_buffer = NULL;
|
||||
vips_blob_set( destination->blob,
|
||||
(VipsCallbackFn) g_free, data, length );
|
||||
}
|
||||
else
|
||||
class->finish( destination );
|
||||
|
||||
destination->finished = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_steal:
|
||||
* @destination: output stream to operate on
|
||||
* @length: return number of bytes of data
|
||||
*
|
||||
* Memory streams only (see vips_destination_new_to_memory()). Steal all data
|
||||
* written to the stream so far, and finish it.
|
||||
*
|
||||
* You must free the returned pointer with g_free().
|
||||
*
|
||||
* The data is NOT automatically null-terminated. vips_destination_putc() a '\0'
|
||||
* before calling this to get a null-terminated string.
|
||||
*
|
||||
* Returns: (array length=length) (element-type guint8) (transfer full): the
|
||||
* data
|
||||
*/
|
||||
unsigned char *
|
||||
vips_destination_steal( VipsDestination *destination, size_t *length )
|
||||
{
|
||||
unsigned char *data;
|
||||
|
||||
(void) vips_destination_flush( destination );
|
||||
|
||||
if( !destination->memory_buffer ||
|
||||
destination->finished ) {
|
||||
if( length )
|
||||
*length = destination->memory_buffer->len;
|
||||
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if( length )
|
||||
*length = destination->memory_buffer->len;
|
||||
data = g_byte_array_free( destination->memory_buffer, FALSE );
|
||||
destination->memory_buffer = NULL;
|
||||
|
||||
/* We must have a valid byte array or finish will fail.
|
||||
*/
|
||||
destination->memory_buffer = g_byte_array_new();
|
||||
|
||||
vips_destination_finish( destination );
|
||||
|
||||
return( data );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_steal_text:
|
||||
* @destination: output stream to operate on
|
||||
*
|
||||
* As vips_destination_steal_text(), but return a null-terminated string.
|
||||
*
|
||||
* Returns: (transfer full): stream contents as a null-terminated string.
|
||||
*/
|
||||
char *
|
||||
vips_destination_steal_text( VipsDestination *destination )
|
||||
{
|
||||
vips_destination_putc( destination, '\0' );
|
||||
|
||||
return( (char *) vips_destination_steal( destination, NULL ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_putc:
|
||||
* @destination: output stream to operate on
|
||||
* @ch: character to write
|
||||
*
|
||||
* Write a single character @ch to @destination. See the macro VIPS_DESTINATION_PUTC()
|
||||
* for a faster way to do this.
|
||||
*
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_destination_putc( VipsDestination *destination, int ch )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_destination_putc: %d\n", ch );
|
||||
|
||||
if( destination->write_point >= VIPS_DESTINATION_BUFFER_SIZE &&
|
||||
vips_destination_flush( destination ) )
|
||||
return( -1 );
|
||||
|
||||
destination->output_buffer[destination->write_point++] = ch;
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_writes:
|
||||
* @destination: output stream to operate on
|
||||
* @str: string to write
|
||||
*
|
||||
* Write a null-terminated string to @destination.
|
||||
*
|
||||
* Returns: 0 on success, and -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_destination_writes( VipsDestination *destination, const char *str )
|
||||
{
|
||||
return( vips_destination_write( destination,
|
||||
(unsigned char *) str, strlen( str ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_writef:
|
||||
* @destination: output stream to operate on
|
||||
* @fmt: <function>printf()</function>-style format string
|
||||
* @...: arguments to format string
|
||||
*
|
||||
* Format the string and write to @destination.
|
||||
*
|
||||
* Returns: 0 on success, and -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_destination_writef( VipsDestination *destination, const char *fmt, ... )
|
||||
{
|
||||
va_list ap;
|
||||
char *line;
|
||||
int result;
|
||||
|
||||
va_start( ap, fmt );
|
||||
line = g_strdup_vprintf( fmt, ap );
|
||||
va_end( ap );
|
||||
|
||||
result = vips_destination_writes( destination, line );
|
||||
|
||||
g_free( line );
|
||||
|
||||
return( result );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_write_amp:
|
||||
* @destination: output stream to operate on
|
||||
* @str: string to write
|
||||
*
|
||||
* Write @str to @destination, but escape stuff that xml hates in text. Our
|
||||
* argument string is utf-8.
|
||||
*
|
||||
* XML rules:
|
||||
*
|
||||
* - We must escape &<>
|
||||
* - Don't escape \n, \t, \r
|
||||
* - Do escape the other ASCII codes.
|
||||
*
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_destination_write_amp( VipsDestination *destination, const char *str )
|
||||
{
|
||||
const char *p;
|
||||
|
||||
for( p = str; *p; p++ )
|
||||
if( *p < 32 &&
|
||||
*p != '\n' &&
|
||||
*p != '\t' &&
|
||||
*p != '\r' ) {
|
||||
/* You'd think we could output "%x;", but xml
|
||||
* 1.0 parsers barf on that. xml 1.1 allows this, but
|
||||
* there are almost no parsers.
|
||||
*
|
||||
* U+2400 onwards are unicode glyphs for the ASCII
|
||||
* control characters, so we can use them -- thanks
|
||||
* electroly.
|
||||
*/
|
||||
if( vips_destination_writef( destination,
|
||||
"&#x%04x;", 0x2400 + *p ) )
|
||||
return( -1 );
|
||||
}
|
||||
else if( *p == '<' ) {
|
||||
if( vips_destination_writes( destination, "<" ) )
|
||||
return( -1 );
|
||||
}
|
||||
else if( *p == '>' ) {
|
||||
if( vips_destination_writes( destination, ">" ) )
|
||||
return( -1 );
|
||||
}
|
||||
else if( *p == '&' ) {
|
||||
if( vips_destination_writes( destination, "&" ) )
|
||||
return( -1 );
|
||||
}
|
||||
else {
|
||||
if( VIPS_DESTINATION_PUTC( destination, *p ) )
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
194
libvips/iofuncs/destinationcustom.c
Normal file
194
libvips/iofuncs/destinationcustom.c
Normal file
@ -0,0 +1,194 @@
|
||||
/* A Streamo subclass with signals you can easily hook up to other output
|
||||
* sources.
|
||||
*
|
||||
* J.Cupitt, 21/11/19
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
This file is part of VIPS.
|
||||
|
||||
VIPS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301 USA
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
#define VIPS_DEBUG
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif /*HAVE_CONFIG_H*/
|
||||
#include <vips/intl.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif /*HAVE_UNISTD_H*/
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <vips/vips.h>
|
||||
#include <vips/internal.h>
|
||||
#include <vips/debug.h>
|
||||
|
||||
#include "vipsmarshal.h"
|
||||
|
||||
G_DEFINE_TYPE( VipsDestinationCustom, vips_destination_custom, VIPS_TYPE_DESTINATION );
|
||||
|
||||
/* Our signals.
|
||||
*/
|
||||
enum {
|
||||
SIG_WRITE,
|
||||
SIG_FINISH,
|
||||
SIG_LAST
|
||||
};
|
||||
|
||||
static guint vips_destination_custom_signals[SIG_LAST] = { 0 };
|
||||
|
||||
static gint64
|
||||
vips_destination_custom_write_real( VipsDestination *destination,
|
||||
const void *data, size_t length )
|
||||
{
|
||||
gint64 bytes_written;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_destination_custom_write_real:\n" );
|
||||
|
||||
/* Return value if no attached handler.
|
||||
*/
|
||||
bytes_written = 0;
|
||||
|
||||
g_signal_emit( destination, vips_destination_custom_signals[SIG_WRITE], 0,
|
||||
data, (gint64) length, &bytes_written );
|
||||
|
||||
VIPS_DEBUG_MSG( " %zd\n", bytes_written );
|
||||
|
||||
return( bytes_written );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_destination_custom_finish_real( VipsDestination *destination )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_destination_custom_seek_real:\n" );
|
||||
|
||||
g_signal_emit( destination, vips_destination_custom_signals[SIG_FINISH], 0 );
|
||||
}
|
||||
|
||||
static gint64
|
||||
vips_destination_custom_write_signal_real( VipsDestinationCustom *destination_custom,
|
||||
const void *data, gint64 length )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_destination_custom_write_signal_real:\n" );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_destination_custom_finish_signal_real( VipsDestinationCustom *destination_custom )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_destination_custom_finish_signal_real:\n" );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_destination_custom_class_init( VipsDestinationCustomClass *class )
|
||||
{
|
||||
VipsObjectClass *object_class = VIPS_OBJECT_CLASS( class );
|
||||
VipsDestinationClass *destination_class = VIPS_DESTINATION_CLASS( class );
|
||||
|
||||
object_class->nickname = "destination_custom";
|
||||
object_class->description = _( "input stream" );
|
||||
|
||||
destination_class->write = vips_destination_custom_write_real;
|
||||
destination_class->finish = vips_destination_custom_finish_real;
|
||||
|
||||
class->write = vips_destination_custom_write_signal_real;
|
||||
class->finish = vips_destination_custom_finish_signal_real;
|
||||
|
||||
/**
|
||||
* VipsDestinationCustom::write:
|
||||
* @destination_custom: the stream being operated on
|
||||
* @data: %pointer, bytes to write
|
||||
* @length: %gint64, number of bytes
|
||||
*
|
||||
* This signal is emitted to write bytes to the stream.
|
||||
*
|
||||
* Returns: the number of bytes written.
|
||||
*/
|
||||
vips_destination_custom_signals[SIG_WRITE] = g_signal_new( "write",
|
||||
G_TYPE_FROM_CLASS( class ),
|
||||
G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET( VipsDestinationCustomClass, write ),
|
||||
NULL, NULL,
|
||||
vips_INT64__POINTER_INT64,
|
||||
G_TYPE_INT64, 2,
|
||||
G_TYPE_POINTER, G_TYPE_INT64 );
|
||||
|
||||
/**
|
||||
* VipsDestinationCustom::finish:
|
||||
* @destination_custom: the stream being operated on
|
||||
*
|
||||
* This signal is emitted at the end of write. The stream should do
|
||||
* any finishing necessary.
|
||||
*/
|
||||
vips_destination_custom_signals[SIG_FINISH] = g_signal_new( "finish",
|
||||
G_TYPE_FROM_CLASS( class ),
|
||||
G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET( VipsDestinationCustomClass, finish ),
|
||||
NULL, NULL,
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0 );
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
vips_destination_custom_init( VipsDestinationCustom *destination_custom )
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_destination_custom_new:
|
||||
*
|
||||
* Create a #VipsDestinationCustom. Attach signals to implement write and finish.
|
||||
*
|
||||
* Returns: a new #VipsDestinationCustom
|
||||
*/
|
||||
VipsDestinationCustom *
|
||||
vips_destination_custom_new( void )
|
||||
{
|
||||
VipsDestinationCustom *destination_custom;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_destination_custom_new:\n" );
|
||||
|
||||
destination_custom = VIPS_DESTINATION_CUSTOM( g_object_new( VIPS_TYPE_DESTINATION_CUSTOM, NULL ) );
|
||||
|
||||
if( vips_object_build( VIPS_OBJECT( destination_custom ) ) ) {
|
||||
VIPS_UNREF( destination_custom );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( destination_custom );
|
||||
}
|
@ -19,7 +19,7 @@
|
||||
* 9/10/18
|
||||
* - fix up vips_image_dump(), it was still using ints not enums
|
||||
* 10/12/19
|
||||
* - add vips_image_new_from_stream() / vips_image_write_to_stream()
|
||||
* - add vips_image_new_from_source() / vips_image_write_to_target()
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -1907,7 +1907,7 @@ vips_image_new_from_file( const char *name, ... )
|
||||
{
|
||||
char filename[VIPS_PATH_MAX];
|
||||
char option_string[VIPS_PATH_MAX];
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
const char *operation_name;
|
||||
va_list ap;
|
||||
int result;
|
||||
@ -1922,17 +1922,17 @@ vips_image_new_from_file( const char *name, ... )
|
||||
*
|
||||
* We need to hide any errors from this first phase.
|
||||
*/
|
||||
if( !(streami = vips_streami_new_from_file( filename )) )
|
||||
if( !(source = vips_source_new_from_file( filename )) )
|
||||
return( NULL );
|
||||
|
||||
vips_error_freeze();
|
||||
operation_name = vips_foreign_find_load_stream( streami );
|
||||
operation_name = vips_foreign_find_load_source( source );
|
||||
vips_error_thaw();
|
||||
|
||||
if( operation_name ) {
|
||||
va_start( ap, name );
|
||||
result = vips_call_split_option_string( operation_name,
|
||||
option_string, ap, streami, &out );
|
||||
option_string, ap, source, &out );
|
||||
va_end( ap );
|
||||
}
|
||||
else {
|
||||
@ -1947,7 +1947,7 @@ vips_image_new_from_file( const char *name, ... )
|
||||
va_end( ap );
|
||||
}
|
||||
|
||||
VIPS_UNREF( streami );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
if( result )
|
||||
return( NULL );
|
||||
@ -2159,7 +2159,7 @@ VipsImage *
|
||||
vips_image_new_from_buffer( const void *buf, size_t len,
|
||||
const char *option_string, ... )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
const char *operation_name;
|
||||
va_list ap;
|
||||
int result;
|
||||
@ -2170,13 +2170,13 @@ vips_image_new_from_buffer( const void *buf, size_t len,
|
||||
/* Search with the new stream API first, then fall back to the older
|
||||
* mechanism in case the loader we need has not been converted yet.
|
||||
*/
|
||||
if( !(streami = vips_streami_new_from_memory( buf, len )) )
|
||||
if( !(source = vips_source_new_from_memory( buf, len )) )
|
||||
return( NULL );
|
||||
|
||||
if( (operation_name = vips_foreign_find_load_stream( streami )) ) {
|
||||
if( (operation_name = vips_foreign_find_load_source( source )) ) {
|
||||
va_start( ap, option_string );
|
||||
result = vips_call_split_option_string( operation_name,
|
||||
option_string, ap, streami, &out );
|
||||
option_string, ap, source, &out );
|
||||
va_end( ap );
|
||||
}
|
||||
else {
|
||||
@ -2198,7 +2198,7 @@ vips_image_new_from_buffer( const void *buf, size_t len,
|
||||
vips_area_unref( VIPS_AREA( blob ) );
|
||||
}
|
||||
|
||||
VIPS_UNREF( streami );
|
||||
VIPS_UNREF( source );
|
||||
|
||||
if( result )
|
||||
return( NULL );
|
||||
@ -2207,27 +2207,27 @@ vips_image_new_from_buffer( const void *buf, size_t len,
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_image_new_from_stream: (constructor)
|
||||
* @streami: (transfer none): stream to fetch image from
|
||||
* vips_image_new_from_source: (constructor)
|
||||
* @source: (transfer none): stream to fetch image from
|
||||
* @option_string: set of extra options as a string
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
* Loads an image from the formatted stream @input,
|
||||
* loader recommended by vips_foreign_find_load_stream().
|
||||
* loader recommended by vips_foreign_find_load_source().
|
||||
*
|
||||
* Load options may be given in @option_string as "[name=value,...]" or given as
|
||||
* a NULL-terminated list of name-value pairs at the end of the arguments.
|
||||
* Options given in the function call override options given in the string.
|
||||
*
|
||||
* See also: vips_image_write_to_stream().
|
||||
* See also: vips_image_write_to_target().
|
||||
*
|
||||
* Returns: (transfer full): the new #VipsImage, or %NULL on error.
|
||||
*/
|
||||
VipsImage *
|
||||
vips_image_new_from_stream( VipsStreami *streami,
|
||||
vips_image_new_from_source( VipsSource *source,
|
||||
const char *option_string, ... )
|
||||
{
|
||||
const char *filename = vips_stream_filename( VIPS_STREAM( streami ) );
|
||||
const char *filename = vips_connection_filename( VIPS_CONNECTION( source ) );
|
||||
|
||||
const char *operation_name;
|
||||
va_list ap;
|
||||
@ -2237,13 +2237,13 @@ vips_image_new_from_stream( VipsStreami *streami,
|
||||
vips_check_init();
|
||||
|
||||
vips_error_freeze();
|
||||
operation_name = vips_foreign_find_load_stream( streami );
|
||||
operation_name = vips_foreign_find_load_source( source );
|
||||
vips_error_thaw();
|
||||
|
||||
if( operation_name ) {
|
||||
va_start( ap, option_string );
|
||||
result = vips_call_split_option_string( operation_name,
|
||||
option_string, ap, streami, &out );
|
||||
option_string, ap, source, &out );
|
||||
va_end( ap );
|
||||
}
|
||||
else if( filename ) {
|
||||
@ -2257,14 +2257,14 @@ vips_image_new_from_stream( VipsStreami *streami,
|
||||
option_string, ap, filename, &out );
|
||||
va_end( ap );
|
||||
}
|
||||
else if( vips_streami_is_mappable( streami ) ) {
|
||||
else if( vips_source_is_mappable( source ) ) {
|
||||
/* Try with the old buffer-based loaders.
|
||||
*/
|
||||
VipsBlob *blob;
|
||||
const void *buf;
|
||||
size_t len;
|
||||
|
||||
if( !(blob = vips_streami_map_blob( streami )) )
|
||||
if( !(blob = vips_source_map_blob( source )) )
|
||||
return( NULL );
|
||||
|
||||
buf = vips_blob_get( blob, &len );
|
||||
@ -2720,21 +2720,21 @@ vips_image_write_to_file( VipsImage *image, const char *name, ... )
|
||||
vips__filename_split8( name, filename, option_string );
|
||||
|
||||
vips_error_freeze();
|
||||
operation_name = vips_foreign_find_save_stream( filename );
|
||||
operation_name = vips_foreign_find_save_target( filename );
|
||||
vips_error_thaw();
|
||||
|
||||
if( operation_name ) {
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_file( filename )) )
|
||||
if( !(target = vips_target_new_to_file( filename )) )
|
||||
return( -1 );
|
||||
|
||||
va_start( ap, name );
|
||||
result = vips_call_split_option_string( operation_name,
|
||||
option_string, ap, image, streamo );
|
||||
option_string, ap, image, target );
|
||||
va_end( ap );
|
||||
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
}
|
||||
else if( (operation_name = vips_foreign_find_save( filename )) ) {
|
||||
va_start( ap, name );
|
||||
@ -2785,24 +2785,24 @@ vips_image_write_to_buffer( VipsImage *in,
|
||||
|
||||
vips__filename_split8( suffix, filename, option_string );
|
||||
|
||||
if( (operation_name = vips_foreign_find_save_stream( filename )) ) {
|
||||
VipsStreamo *streamo;
|
||||
if( (operation_name = vips_foreign_find_save_target( filename )) ) {
|
||||
VipsTarget *target;
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_memory()) )
|
||||
if( !(target = vips_target_new_to_memory()) )
|
||||
return( -1 );
|
||||
|
||||
va_start( ap, size );
|
||||
result = vips_call_split_option_string( operation_name,
|
||||
option_string, ap, in, streamo );
|
||||
option_string, ap, in, target );
|
||||
va_end( ap );
|
||||
|
||||
if( result ) {
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
g_object_get( streamo, "blob", &blob, NULL );
|
||||
VIPS_UNREF( streamo );
|
||||
g_object_get( target, "blob", &blob, NULL );
|
||||
VIPS_UNREF( target );
|
||||
}
|
||||
else if( (operation_name =
|
||||
vips_foreign_find_save_buffer( filename )) ) {
|
||||
@ -2837,10 +2837,10 @@ vips_image_write_to_buffer( VipsImage *in,
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_image_write_to_stream: (method)
|
||||
* vips_image_write_to_target: (method)
|
||||
* @in: image to write
|
||||
* @suffix: format to write
|
||||
* @streamo: stream to write to
|
||||
* @target: stream to write to
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
* Writes @in to @output in format @suffix.
|
||||
@ -2850,15 +2850,15 @@ vips_image_write_to_buffer( VipsImage *in,
|
||||
* Options given in the function call override options given in the filename.
|
||||
*
|
||||
* You can call the various save operations directly if you wish, see
|
||||
* vips_jpegsave_stream(), for example.
|
||||
* vips_jpegsave_target(), for example.
|
||||
*
|
||||
* See also: vips_image_write_to_file().
|
||||
*
|
||||
* Returns: 0 on success, -1 on error
|
||||
*/
|
||||
int
|
||||
vips_image_write_to_stream( VipsImage *in,
|
||||
const char *suffix, VipsStreamo *streamo, ... )
|
||||
vips_image_write_to_target( VipsImage *in,
|
||||
const char *suffix, VipsTarget *target, ... )
|
||||
{
|
||||
char filename[VIPS_PATH_MAX];
|
||||
char option_string[VIPS_PATH_MAX];
|
||||
@ -2867,12 +2867,12 @@ vips_image_write_to_stream( VipsImage *in,
|
||||
int result;
|
||||
|
||||
vips__filename_split8( suffix, filename, option_string );
|
||||
if( !(operation_name = vips_foreign_find_save_stream( filename )) )
|
||||
if( !(operation_name = vips_foreign_find_save_target( filename )) )
|
||||
return( -1 );
|
||||
|
||||
va_start( ap, streamo );
|
||||
va_start( ap, target );
|
||||
result = vips_call_split_option_string( operation_name, option_string,
|
||||
ap, in, streamo );
|
||||
ap, in, target );
|
||||
va_end( ap );
|
||||
|
||||
if( result )
|
||||
|
@ -330,10 +330,10 @@ vips_init( const char *argv0 )
|
||||
extern GType write_thread_state_get_type( void );
|
||||
extern GType sink_memory_thread_state_get_type( void );
|
||||
extern GType render_thread_state_get_type( void );
|
||||
extern GType vips_streami_get_type( void );
|
||||
extern GType vips_streamiu_get_type( void );
|
||||
extern GType vips_streamo_get_type( void );
|
||||
extern GType vips_streamou_get_type( void );
|
||||
extern GType vips_source_get_type( void );
|
||||
extern GType vips_source_custom_get_type( void );
|
||||
extern GType vips_target_get_type( void );
|
||||
extern GType vips_target_custom_get_type( void );
|
||||
|
||||
static gboolean started = FALSE;
|
||||
static gboolean done = FALSE;
|
||||
@ -448,10 +448,10 @@ vips_init( const char *argv0 )
|
||||
(void) write_thread_state_get_type();
|
||||
(void) sink_memory_thread_state_get_type();
|
||||
(void) render_thread_state_get_type();
|
||||
(void) vips_streami_get_type();
|
||||
(void) vips_streamiu_get_type();
|
||||
(void) vips_streamo_get_type();
|
||||
(void) vips_streamou_get_type();
|
||||
(void) vips_source_get_type();
|
||||
(void) vips_source_custom_get_type();
|
||||
(void) vips_target_get_type();
|
||||
(void) vips_target_custom_get_type();
|
||||
vips__meta_init_types();
|
||||
vips__interpolate_init();
|
||||
im__format_init();
|
||||
|
@ -1908,19 +1908,19 @@ vips_object_set_argument_from_string( VipsObject *object,
|
||||
vips__filename_split8( value, filename, option_string );
|
||||
|
||||
if( strcmp( "stdin", filename ) == 0 ) {
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
|
||||
if( !(streami =
|
||||
vips_streami_new_from_descriptor( 0 )) )
|
||||
if( !(source =
|
||||
vips_source_new_from_descriptor( 0 )) )
|
||||
return( -1 );
|
||||
if( !(out = vips_image_new_from_stream( streami,
|
||||
if( !(out = vips_image_new_from_source( source,
|
||||
option_string,
|
||||
"access", access,
|
||||
NULL )) ) {
|
||||
VIPS_UNREF( streami );
|
||||
VIPS_UNREF( source );
|
||||
return( -1 );
|
||||
}
|
||||
VIPS_UNREF( streami );
|
||||
VIPS_UNREF( source );
|
||||
}
|
||||
else {
|
||||
if( !(out = vips_image_new_from_file( value,
|
||||
@ -1937,24 +1937,24 @@ vips_object_set_argument_from_string( VipsObject *object,
|
||||
*/
|
||||
g_object_unref( out );
|
||||
}
|
||||
else if( g_type_is_a( otype, VIPS_TYPE_STREAMI ) ) {
|
||||
VipsStreami *streami;
|
||||
else if( g_type_is_a( otype, VIPS_TYPE_SOURCE ) ) {
|
||||
VipsSource *source;
|
||||
|
||||
if( !value ) {
|
||||
vips_object_no_value( object, name );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
if( !(streami = vips_streami_new_from_options( value )) )
|
||||
if( !(source = vips_source_new_from_options( value )) )
|
||||
return( -1 );
|
||||
|
||||
g_value_init( &gvalue, VIPS_TYPE_STREAMI );
|
||||
g_value_set_object( &gvalue, streami );
|
||||
g_value_init( &gvalue, VIPS_TYPE_SOURCE );
|
||||
g_value_set_object( &gvalue, source );
|
||||
|
||||
/* Setting gvalue will have upped @out's count again,
|
||||
* go back to 1 so that gvalue has the only ref.
|
||||
*/
|
||||
g_object_unref( streami );
|
||||
g_object_unref( source );
|
||||
}
|
||||
else if( g_type_is_a( otype, VIPS_TYPE_ARRAY_IMAGE ) ) {
|
||||
/* We have to have a special case for this, we can't just rely
|
||||
@ -2210,19 +2210,19 @@ vips_object_get_argument_to_string( VipsObject *object,
|
||||
vips__filename_split8( arg, filename, option_string );
|
||||
|
||||
if( vips_isprefix( ".", filename ) ) {
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
if( !(streamo = vips_streamo_new_to_descriptor( 1 )) )
|
||||
if( !(target = vips_target_new_to_descriptor( 1 )) )
|
||||
return( -1 );
|
||||
g_object_get( object, name, &in, NULL );
|
||||
if( vips_image_write_to_stream( in,
|
||||
arg, streamo, NULL ) ) {
|
||||
if( vips_image_write_to_target( in,
|
||||
arg, target, NULL ) ) {
|
||||
VIPS_UNREF( in );
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
return( -1 );
|
||||
}
|
||||
VIPS_UNREF( in );
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
}
|
||||
else {
|
||||
/* Pull out the image and write it.
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -58,7 +58,7 @@
|
||||
|
||||
#include "vipsmarshal.h"
|
||||
|
||||
G_DEFINE_TYPE( VipsStreamiu, vips_streamiu, VIPS_TYPE_STREAMI );
|
||||
G_DEFINE_TYPE( VipsSourceCustom, vips_source_custom, VIPS_TYPE_SOURCE );
|
||||
|
||||
/* Our signals.
|
||||
*/
|
||||
@ -68,43 +68,43 @@ enum {
|
||||
SIG_LAST
|
||||
};
|
||||
|
||||
static guint vips_streamiu_signals[SIG_LAST] = { 0 };
|
||||
static guint vips_source_custom_signals[SIG_LAST] = { 0 };
|
||||
|
||||
static gint64
|
||||
vips_streamiu_read_real( VipsStreami *streami,
|
||||
vips_source_custom_read_real( VipsSource *source,
|
||||
void *buffer, size_t length )
|
||||
{
|
||||
gint64 bytes_read;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamiu_read_real:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_source_custom_read_real:\n" );
|
||||
|
||||
/* Return this value (error) if there's no attached handler.
|
||||
*/
|
||||
bytes_read = 0;
|
||||
|
||||
g_signal_emit( streami, vips_streamiu_signals[SIG_READ], 0,
|
||||
g_signal_emit( source, vips_source_custom_signals[SIG_READ], 0,
|
||||
buffer, (gint64) length, &bytes_read );
|
||||
|
||||
VIPS_DEBUG_MSG( " vips_streamiu_read_real, seen %zd bytes\n",
|
||||
VIPS_DEBUG_MSG( " vips_source_custom_read_real, seen %zd bytes\n",
|
||||
bytes_read );
|
||||
|
||||
return( bytes_read );
|
||||
}
|
||||
|
||||
static gint64
|
||||
vips_streamiu_seek_real( VipsStreami *streami,
|
||||
vips_source_custom_seek_real( VipsSource *source,
|
||||
gint64 offset, int whence )
|
||||
{
|
||||
GValue args[3] = { { 0 } };
|
||||
GValue result = { 0 };
|
||||
gint64 new_position;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamiu_seek_real:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_source_custom_seek_real:\n" );
|
||||
|
||||
/* Set the signal args.
|
||||
*/
|
||||
g_value_init( &args[0], G_TYPE_OBJECT );
|
||||
g_value_set_object( &args[0], streami );
|
||||
g_value_set_object( &args[0], source );
|
||||
g_value_init( &args[1], G_TYPE_INT64 );
|
||||
g_value_set_int64( &args[1], offset );
|
||||
g_value_init( &args[2], G_TYPE_INT );
|
||||
@ -119,7 +119,7 @@ vips_streamiu_seek_real( VipsStreami *streami,
|
||||
* if no handlers are attached.
|
||||
*/
|
||||
g_signal_emitv( (const GValue *) &args,
|
||||
vips_streamiu_signals[SIG_SEEK], 0, &result );
|
||||
vips_source_custom_signals[SIG_SEEK], 0, &result );
|
||||
|
||||
new_position = g_value_get_int64( &result );
|
||||
|
||||
@ -128,48 +128,48 @@ vips_streamiu_seek_real( VipsStreami *streami,
|
||||
g_value_unset( &args[2] );
|
||||
g_value_unset( &result );
|
||||
|
||||
VIPS_DEBUG_MSG( " vips_streamiu_seek_real, seen new pos %zd\n",
|
||||
VIPS_DEBUG_MSG( " vips_source_custom_seek_real, seen new pos %zd\n",
|
||||
new_position );
|
||||
|
||||
return( new_position );
|
||||
}
|
||||
|
||||
static gint64
|
||||
vips_streamiu_read_signal_real( VipsStreamiu *streamiu,
|
||||
vips_source_custom_read_signal_real( VipsSourceCustom *source_custom,
|
||||
void *data, gint64 length )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_streamiu_read_signal_real:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_source_custom_read_signal_real:\n" );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static gint64
|
||||
vips_streamiu_seek_signal_real( VipsStreamiu *streamiu,
|
||||
vips_source_custom_seek_signal_real( VipsSourceCustom *source_custom,
|
||||
gint64 offset, int whence )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_streamiu_seek_signal_real:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_source_custom_seek_signal_real:\n" );
|
||||
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_streamiu_class_init( VipsStreamiuClass *class )
|
||||
vips_source_custom_class_init( VipsSourceCustomClass *class )
|
||||
{
|
||||
VipsObjectClass *object_class = VIPS_OBJECT_CLASS( class );
|
||||
VipsStreamiClass *streami_class = VIPS_STREAMI_CLASS( class );
|
||||
VipsSourceClass *source_class = VIPS_SOURCE_CLASS( class );
|
||||
|
||||
object_class->nickname = "streamiu";
|
||||
object_class->nickname = "source_custom";
|
||||
object_class->description = _( "input stream" );
|
||||
|
||||
streami_class->read = vips_streamiu_read_real;
|
||||
streami_class->seek = vips_streamiu_seek_real;
|
||||
source_class->read = vips_source_custom_read_real;
|
||||
source_class->seek = vips_source_custom_seek_real;
|
||||
|
||||
class->read = vips_streamiu_read_signal_real;
|
||||
class->seek = vips_streamiu_seek_signal_real;
|
||||
class->read = vips_source_custom_read_signal_real;
|
||||
class->seek = vips_source_custom_seek_signal_real;
|
||||
|
||||
/**
|
||||
* VipsStreamiu::read:
|
||||
* @streamiu: the stream being operated on
|
||||
* VipsSourceCustom::read:
|
||||
* @source_custom: the stream being operated on
|
||||
* @buffer: %gpointer, buffer to fill
|
||||
* @size: %gint64, size of buffer
|
||||
*
|
||||
@ -177,18 +177,18 @@ vips_streamiu_class_init( VipsStreamiuClass *class )
|
||||
*
|
||||
* Returns: the number of bytes read.
|
||||
*/
|
||||
vips_streamiu_signals[SIG_READ] = g_signal_new( "read",
|
||||
vips_source_custom_signals[SIG_READ] = g_signal_new( "read",
|
||||
G_TYPE_FROM_CLASS( class ),
|
||||
G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET( VipsStreamiuClass, read ),
|
||||
G_STRUCT_OFFSET( VipsSourceCustomClass, read ),
|
||||
NULL, NULL,
|
||||
vips_INT64__POINTER_INT64,
|
||||
G_TYPE_INT64, 2,
|
||||
G_TYPE_POINTER, G_TYPE_INT64 );
|
||||
|
||||
/**
|
||||
* VipsStreamiu::seek:
|
||||
* @streamiu: the stream being operated on
|
||||
* VipsSourceCustom::seek:
|
||||
* @source_custom: the stream being operated on
|
||||
* @offset: %gint64, seek offset
|
||||
* @whence: %gint, seek origin
|
||||
*
|
||||
@ -199,10 +199,10 @@ vips_streamiu_class_init( VipsStreamiuClass *class )
|
||||
*
|
||||
* Returns: the new seek position.
|
||||
*/
|
||||
vips_streamiu_signals[SIG_SEEK] = g_signal_new( "seek",
|
||||
vips_source_custom_signals[SIG_SEEK] = g_signal_new( "seek",
|
||||
G_TYPE_FROM_CLASS( class ),
|
||||
G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET( VipsStreamiuClass, seek ),
|
||||
G_STRUCT_OFFSET( VipsSourceCustomClass, seek ),
|
||||
NULL, NULL,
|
||||
vips_INT64__INT64_INT,
|
||||
G_TYPE_INT64, 2,
|
||||
@ -211,30 +211,30 @@ vips_streamiu_class_init( VipsStreamiuClass *class )
|
||||
}
|
||||
|
||||
static void
|
||||
vips_streamiu_init( VipsStreamiu *streamiu )
|
||||
vips_source_custom_init( VipsSourceCustom *source_custom )
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamiu_new:
|
||||
* vips_source_custom_new:
|
||||
*
|
||||
* Create a #VipsStreamiu. Attach signals to implement read and seek.
|
||||
* Create a #VipsSourceCustom. Attach signals to implement read and seek.
|
||||
*
|
||||
* Returns: a new #VipsStreamiu
|
||||
* Returns: a new #VipsSourceCustom
|
||||
*/
|
||||
VipsStreamiu *
|
||||
vips_streamiu_new( void )
|
||||
VipsSourceCustom *
|
||||
vips_source_custom_new( void )
|
||||
{
|
||||
VipsStreamiu *streamiu;
|
||||
VipsSourceCustom *source_custom;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamiu_new:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_source_custom_new:\n" );
|
||||
|
||||
streamiu = VIPS_STREAMIU( g_object_new( VIPS_TYPE_STREAMIU, NULL ) );
|
||||
source_custom = VIPS_SOURCE_CUSTOM( g_object_new( VIPS_TYPE_SOURCE_CUSTOM, NULL ) );
|
||||
|
||||
if( vips_object_build( VIPS_OBJECT( streamiu ) ) ) {
|
||||
VIPS_UNREF( streamiu );
|
||||
if( vips_object_build( VIPS_OBJECT( source_custom ) ) ) {
|
||||
VIPS_UNREF( source_custom );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( streamiu );
|
||||
return( source_custom );
|
||||
}
|
240
libvips/iofuncs/sourceuser.c
Normal file
240
libvips/iofuncs/sourceuser.c
Normal file
@ -0,0 +1,240 @@
|
||||
/* A Streami subclass with signals you can easily hook up to other input
|
||||
* sources.
|
||||
*
|
||||
* J.Cupitt, 21/11/19
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
This file is part of VIPS.
|
||||
|
||||
VIPS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301 USA
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
#define VIPS_DEBUG
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif /*HAVE_CONFIG_H*/
|
||||
#include <vips/intl.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif /*HAVE_UNISTD_H*/
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <vips/vips.h>
|
||||
#include <vips/internal.h>
|
||||
#include <vips/debug.h>
|
||||
|
||||
#include "vipsmarshal.h"
|
||||
|
||||
G_DEFINE_TYPE( VipsSourceCustom, vips_source_custom, VIPS_TYPE_SOURCE );
|
||||
|
||||
/* Our signals.
|
||||
*/
|
||||
enum {
|
||||
SIG_SEEK,
|
||||
SIG_READ,
|
||||
SIG_LAST
|
||||
};
|
||||
|
||||
static guint vips_source_custom_signals[SIG_LAST] = { 0 };
|
||||
|
||||
static gint64
|
||||
vips_source_custom_read_real( VipsSource *source,
|
||||
void *buffer, size_t length )
|
||||
{
|
||||
gint64 bytes_read;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_source_custom_read_real:\n" );
|
||||
|
||||
/* Return this value (error) if there's no attached handler.
|
||||
*/
|
||||
bytes_read = 0;
|
||||
|
||||
g_signal_emit( source, vips_source_custom_signals[SIG_READ], 0,
|
||||
buffer, (gint64) length, &bytes_read );
|
||||
|
||||
VIPS_DEBUG_MSG( " vips_source_custom_read_real, seen %zd bytes\n",
|
||||
bytes_read );
|
||||
|
||||
return( bytes_read );
|
||||
}
|
||||
|
||||
static gint64
|
||||
vips_source_custom_seek_real( VipsSource *source,
|
||||
gint64 offset, int whence )
|
||||
{
|
||||
GValue args[3] = { { 0 } };
|
||||
GValue result = { 0 };
|
||||
gint64 new_position;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_source_custom_seek_real:\n" );
|
||||
|
||||
/* Set the signal args.
|
||||
*/
|
||||
g_value_init( &args[0], G_TYPE_OBJECT );
|
||||
g_value_set_object( &args[0], source );
|
||||
g_value_init( &args[1], G_TYPE_INT64 );
|
||||
g_value_set_int64( &args[1], offset );
|
||||
g_value_init( &args[2], G_TYPE_INT );
|
||||
g_value_set_int( &args[2], whence );
|
||||
|
||||
/* Set the default value if no handlers are attached.
|
||||
*/
|
||||
g_value_init( &result, G_TYPE_INT64 );
|
||||
g_value_set_int64( &result, -1 );
|
||||
|
||||
/* We need to use this signal interface since we want a default value
|
||||
* if no handlers are attached.
|
||||
*/
|
||||
g_signal_emitv( (const GValue *) &args,
|
||||
vips_source_custom_signals[SIG_SEEK], 0, &result );
|
||||
|
||||
new_position = g_value_get_int64( &result );
|
||||
|
||||
g_value_unset( &args[0] );
|
||||
g_value_unset( &args[1] );
|
||||
g_value_unset( &args[2] );
|
||||
g_value_unset( &result );
|
||||
|
||||
VIPS_DEBUG_MSG( " vips_source_custom_seek_real, seen new pos %zd\n",
|
||||
new_position );
|
||||
|
||||
return( new_position );
|
||||
}
|
||||
|
||||
static gint64
|
||||
vips_source_custom_read_signal_real( VipsSourceCustom *source_custom,
|
||||
void *data, gint64 length )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_source_custom_read_signal_real:\n" );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static gint64
|
||||
vips_source_custom_seek_signal_real( VipsSourceCustom *source_custom,
|
||||
gint64 offset, int whence )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_source_custom_seek_signal_real:\n" );
|
||||
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_source_custom_class_init( VipsSourceCustomClass *class )
|
||||
{
|
||||
VipsObjectClass *object_class = VIPS_OBJECT_CLASS( class );
|
||||
VipsSourceClass *source_class = VIPS_SOURCE_CLASS( class );
|
||||
|
||||
object_class->nickname = "source_custom";
|
||||
object_class->description = _( "input stream" );
|
||||
|
||||
source_class->read = vips_source_custom_read_real;
|
||||
source_class->seek = vips_source_custom_seek_real;
|
||||
|
||||
class->read = vips_source_custom_read_signal_real;
|
||||
class->seek = vips_source_custom_seek_signal_real;
|
||||
|
||||
/**
|
||||
* VipsSourceCustom::read:
|
||||
* @source_custom: the stream being operated on
|
||||
* @buffer: %gpointer, buffer to fill
|
||||
* @size: %gint64, size of buffer
|
||||
*
|
||||
* This signal is emitted to read bytes from the source into @buffer.
|
||||
*
|
||||
* Returns: the number of bytes read.
|
||||
*/
|
||||
vips_source_custom_signals[SIG_READ] = g_signal_new( "read",
|
||||
G_TYPE_FROM_CLASS( class ),
|
||||
G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET( VipsSourceCustomClass, read ),
|
||||
NULL, NULL,
|
||||
vips_INT64__POINTER_INT64,
|
||||
G_TYPE_INT64, 2,
|
||||
G_TYPE_POINTER, G_TYPE_INT64 );
|
||||
|
||||
/**
|
||||
* VipsSourceCustom::seek:
|
||||
* @source_custom: the stream being operated on
|
||||
* @offset: %gint64, seek offset
|
||||
* @whence: %gint, seek origin
|
||||
*
|
||||
* This signal is emitted to seek the stream. The handler should
|
||||
* change the stream position appropriately.
|
||||
*
|
||||
* The handler on an unseekable stream should always return -1.
|
||||
*
|
||||
* Returns: the new seek position.
|
||||
*/
|
||||
vips_source_custom_signals[SIG_SEEK] = g_signal_new( "seek",
|
||||
G_TYPE_FROM_CLASS( class ),
|
||||
G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET( VipsSourceCustomClass, seek ),
|
||||
NULL, NULL,
|
||||
vips_INT64__INT64_INT,
|
||||
G_TYPE_INT64, 2,
|
||||
G_TYPE_INT64, G_TYPE_INT );
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
vips_source_custom_init( VipsSourceCustom *source_custom )
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_source_custom_new:
|
||||
*
|
||||
* Create a #VipsSourceCustom. Attach signals to implement read and seek.
|
||||
*
|
||||
* Returns: a new #VipsSourceCustom
|
||||
*/
|
||||
VipsSourceCustom *
|
||||
vips_source_custom_new( void )
|
||||
{
|
||||
VipsSourceCustom *source_custom;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_source_custom_new:\n" );
|
||||
|
||||
source_custom = VIPS_SOURCE_CUSTOM( g_object_new( VIPS_TYPE_SOURCE_CUSTOM, NULL ) );
|
||||
|
||||
if( vips_object_build( VIPS_OBJECT( source_custom ) ) ) {
|
||||
VIPS_UNREF( source_custom );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( source_custom );
|
||||
}
|
@ -78,38 +78,38 @@
|
||||
#define MODE_READWRITE BINARYIZE (O_RDWR)
|
||||
#define MODE_WRITE BINARYIZE (O_WRONLY | O_CREAT | O_TRUNC)
|
||||
|
||||
G_DEFINE_TYPE( VipsStreamo, vips_streamo, VIPS_TYPE_STREAM );
|
||||
G_DEFINE_TYPE( VipsTarget, vips_target, VIPS_TYPE_CONNECTION );
|
||||
|
||||
static void
|
||||
vips_streamo_finalize( GObject *gobject )
|
||||
vips_target_finalize( GObject *gobject )
|
||||
{
|
||||
VipsStreamo *streamo = VIPS_STREAMO( gobject );
|
||||
VipsTarget *target = VIPS_TARGET( gobject );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamo_finalize:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_target_finalize:\n" );
|
||||
|
||||
VIPS_FREEF( g_byte_array_unref, streamo->memory_buffer );
|
||||
if( streamo->blob ) {
|
||||
vips_area_unref( VIPS_AREA( streamo->blob ) );
|
||||
streamo->blob = NULL;
|
||||
VIPS_FREEF( g_byte_array_unref, target->memory_buffer );
|
||||
if( target->blob ) {
|
||||
vips_area_unref( VIPS_AREA( target->blob ) );
|
||||
target->blob = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS( vips_streamo_parent_class )->finalize( gobject );
|
||||
G_OBJECT_CLASS( vips_target_parent_class )->finalize( gobject );
|
||||
}
|
||||
|
||||
static int
|
||||
vips_streamo_build( VipsObject *object )
|
||||
vips_target_build( VipsObject *object )
|
||||
{
|
||||
VipsStream *stream = VIPS_STREAM( object );
|
||||
VipsStreamo *streamo = VIPS_STREAMO( object );
|
||||
VipsConnection *stream = VIPS_CONNECTION( object );
|
||||
VipsTarget *target = VIPS_TARGET( object );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamo_build: %p\n", stream );
|
||||
VIPS_DEBUG_MSG( "vips_target_build: %p\n", stream );
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_streamo_parent_class )->build( object ) )
|
||||
if( VIPS_OBJECT_CLASS( vips_target_parent_class )->build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( vips_object_argument_isset( object, "filename" ) &&
|
||||
vips_object_argument_isset( object, "descriptor" ) ) {
|
||||
vips_error( vips_stream_nick( stream ),
|
||||
vips_error( vips_connection_nick( stream ),
|
||||
"%s", _( "don't set 'filename' and 'descriptor'" ) );
|
||||
return( -1 );
|
||||
}
|
||||
@ -123,7 +123,7 @@ vips_streamo_build( VipsObject *object )
|
||||
*/
|
||||
if( (fd = vips_tracked_open( filename,
|
||||
MODE_WRITE, 0644 )) == -1 ) {
|
||||
vips_error_system( errno, vips_stream_nick( stream ),
|
||||
vips_error_system( errno, vips_connection_nick( stream ),
|
||||
"%s", _( "unable to open for write" ) );
|
||||
return( -1 );
|
||||
}
|
||||
@ -135,52 +135,52 @@ vips_streamo_build( VipsObject *object )
|
||||
stream->descriptor = dup( stream->descriptor );
|
||||
stream->close_descriptor = stream->descriptor;
|
||||
}
|
||||
else if( streamo->memory ) {
|
||||
streamo->memory_buffer = g_byte_array_new();
|
||||
else if( target->memory ) {
|
||||
target->memory_buffer = g_byte_array_new();
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static gint64
|
||||
vips_streamo_write_real( VipsStreamo *streamo, const void *data, size_t length )
|
||||
vips_target_write_real( VipsTarget *target, const void *data, size_t length )
|
||||
{
|
||||
VipsStream *stream = VIPS_STREAM( streamo );
|
||||
VipsConnection *stream = VIPS_CONNECTION( target );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamo_write_real: %zd bytes\n", length );
|
||||
VIPS_DEBUG_MSG( "vips_target_write_real: %zd bytes\n", length );
|
||||
|
||||
return( write( stream->descriptor, data, length ) );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_streamo_finish_real( VipsStreamo *streamo )
|
||||
vips_target_finish_real( VipsTarget *target )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_streamo_finish_real:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_target_finish_real:\n" );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_streamo_class_init( VipsStreamoClass *class )
|
||||
vips_target_class_init( VipsTargetClass *class )
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
|
||||
VipsObjectClass *object_class = VIPS_OBJECT_CLASS( class );
|
||||
|
||||
gobject_class->finalize = vips_streamo_finalize;
|
||||
gobject_class->finalize = vips_target_finalize;
|
||||
gobject_class->set_property = vips_object_set_property;
|
||||
gobject_class->get_property = vips_object_get_property;
|
||||
|
||||
object_class->nickname = "streamo";
|
||||
object_class->nickname = "target";
|
||||
object_class->description = _( "stream stream" );
|
||||
|
||||
object_class->build = vips_streamo_build;
|
||||
object_class->build = vips_target_build;
|
||||
|
||||
class->write = vips_streamo_write_real;
|
||||
class->finish = vips_streamo_finish_real;
|
||||
class->write = vips_target_write_real;
|
||||
class->finish = vips_target_finish_real;
|
||||
|
||||
VIPS_ARG_BOOL( class, "memory", 3,
|
||||
_( "Memory" ),
|
||||
_( "File descriptor should output to memory" ),
|
||||
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||
G_STRUCT_OFFSET( VipsStreamo, memory ),
|
||||
G_STRUCT_OFFSET( VipsTarget, memory ),
|
||||
FALSE );
|
||||
|
||||
/* SET_ALWAYS means that blob is set by C and the obj system is not
|
||||
@ -190,132 +190,132 @@ vips_streamo_class_init( VipsStreamoClass *class )
|
||||
_( "Blob" ),
|
||||
_( "Blob to save to" ),
|
||||
VIPS_ARGUMENT_SET_ALWAYS,
|
||||
G_STRUCT_OFFSET( VipsStreamo, blob ),
|
||||
G_STRUCT_OFFSET( VipsTarget, blob ),
|
||||
VIPS_TYPE_BLOB );
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
vips_streamo_init( VipsStreamo *streamo )
|
||||
vips_target_init( VipsTarget *target )
|
||||
{
|
||||
streamo->blob = vips_blob_new( NULL, NULL, 0 );
|
||||
streamo->write_point = 0;
|
||||
target->blob = vips_blob_new( NULL, NULL, 0 );
|
||||
target->write_point = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamo_new_to_descriptor:
|
||||
* vips_target_new_to_descriptor:
|
||||
* @descriptor: write to this file descriptor
|
||||
*
|
||||
* Create a stream attached to a file descriptor.
|
||||
* @descriptor is kept open until the #VipsStreamo is finalized.
|
||||
* @descriptor is kept open until the #VipsTarget is finalized.
|
||||
*
|
||||
* See also: vips_streamo_new_to_file().
|
||||
* See also: vips_target_new_to_file().
|
||||
*
|
||||
* Returns: a new #VipsStreamo
|
||||
* Returns: a new #VipsTarget
|
||||
*/
|
||||
VipsStreamo *
|
||||
vips_streamo_new_to_descriptor( int descriptor )
|
||||
VipsTarget *
|
||||
vips_target_new_to_descriptor( int descriptor )
|
||||
{
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamo_new_to_descriptor: %d\n",
|
||||
VIPS_DEBUG_MSG( "vips_target_new_to_descriptor: %d\n",
|
||||
descriptor );
|
||||
|
||||
streamo = VIPS_STREAMO( g_object_new( VIPS_TYPE_STREAMO,
|
||||
target = VIPS_TARGET( g_object_new( VIPS_TYPE_TARGET,
|
||||
"descriptor", descriptor,
|
||||
NULL ) );
|
||||
|
||||
if( vips_object_build( VIPS_OBJECT( streamo ) ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
if( vips_object_build( VIPS_OBJECT( target ) ) ) {
|
||||
VIPS_UNREF( target );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( streamo );
|
||||
return( target );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamo_new_to_file:
|
||||
* vips_target_new_to_file:
|
||||
* @filename: write to this file
|
||||
*
|
||||
* Create a stream attached to a file.
|
||||
*
|
||||
* Returns: a new #VipsStreamo
|
||||
* Returns: a new #VipsTarget
|
||||
*/
|
||||
VipsStreamo *
|
||||
vips_streamo_new_to_file( const char *filename )
|
||||
VipsTarget *
|
||||
vips_target_new_to_file( const char *filename )
|
||||
{
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamo_new_to_file: %s\n",
|
||||
VIPS_DEBUG_MSG( "vips_target_new_to_file: %s\n",
|
||||
filename );
|
||||
|
||||
streamo = VIPS_STREAMO( g_object_new( VIPS_TYPE_STREAMO,
|
||||
target = VIPS_TARGET( g_object_new( VIPS_TYPE_TARGET,
|
||||
"filename", filename,
|
||||
NULL ) );
|
||||
|
||||
if( vips_object_build( VIPS_OBJECT( streamo ) ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
if( vips_object_build( VIPS_OBJECT( target ) ) ) {
|
||||
VIPS_UNREF( target );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( streamo );
|
||||
return( target );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamo_new_to_memory:
|
||||
* vips_target_new_to_memory:
|
||||
*
|
||||
* Create a stream which will stream to a memory area. Read from @blob to get
|
||||
* memory.
|
||||
*
|
||||
* See also: vips_streamo_new_to_file().
|
||||
* See also: vips_target_new_to_file().
|
||||
*
|
||||
* Returns: a new #VipsStream
|
||||
* Returns: a new #VipsConnection
|
||||
*/
|
||||
VipsStreamo *
|
||||
vips_streamo_new_to_memory( void )
|
||||
VipsTarget *
|
||||
vips_target_new_to_memory( void )
|
||||
{
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamo_new_to_memory:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_target_new_to_memory:\n" );
|
||||
|
||||
streamo = VIPS_STREAMO( g_object_new( VIPS_TYPE_STREAMO,
|
||||
target = VIPS_TARGET( g_object_new( VIPS_TYPE_TARGET,
|
||||
"memory", TRUE,
|
||||
NULL ) );
|
||||
|
||||
if( vips_object_build( VIPS_OBJECT( streamo ) ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
if( vips_object_build( VIPS_OBJECT( target ) ) ) {
|
||||
VIPS_UNREF( target );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( streamo );
|
||||
return( target );
|
||||
}
|
||||
|
||||
static int
|
||||
vips_streamo_write_unbuffered( VipsStreamo *streamo,
|
||||
vips_target_write_unbuffered( VipsTarget *target,
|
||||
const void *data, size_t length )
|
||||
{
|
||||
VipsStreamoClass *class = VIPS_STREAMO_GET_CLASS( streamo );
|
||||
VipsTargetClass *class = VIPS_TARGET_GET_CLASS( target );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamo_write_unbuffered:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_target_write_unbuffered:\n" );
|
||||
|
||||
if( streamo->finished )
|
||||
if( target->finished )
|
||||
return( 0 );
|
||||
|
||||
if( streamo->memory_buffer )
|
||||
g_byte_array_append( streamo->memory_buffer, data, length );
|
||||
if( target->memory_buffer )
|
||||
g_byte_array_append( target->memory_buffer, data, length );
|
||||
else
|
||||
while( length > 0 ) {
|
||||
gint64 bytes_written;
|
||||
|
||||
bytes_written = class->write( streamo, data, length );
|
||||
bytes_written = class->write( target, data, length );
|
||||
|
||||
/* n == 0 isn't strictly an error, but we treat it as
|
||||
* one to make sure we don't get stuck in this loop.
|
||||
*/
|
||||
if( bytes_written <= 0 ) {
|
||||
vips_error_system( errno,
|
||||
vips_stream_nick(
|
||||
VIPS_STREAM( streamo ) ),
|
||||
vips_connection_nick(
|
||||
VIPS_CONNECTION( target ) ),
|
||||
"%s", _( "write error" ) );
|
||||
return( -1 );
|
||||
}
|
||||
@ -328,26 +328,26 @@ vips_streamo_write_unbuffered( VipsStreamo *streamo,
|
||||
}
|
||||
|
||||
static int
|
||||
vips_streamo_flush( VipsStreamo *streamo )
|
||||
vips_target_flush( VipsTarget *target )
|
||||
{
|
||||
g_assert( streamo->write_point >= 0 );
|
||||
g_assert( streamo->write_point <= VIPS_STREAMO_BUFFER_SIZE );
|
||||
g_assert( target->write_point >= 0 );
|
||||
g_assert( target->write_point <= VIPS_TARGET_BUFFER_SIZE );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamo_flush:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_target_flush:\n" );
|
||||
|
||||
if( streamo->write_point > 0 ) {
|
||||
if( vips_streamo_write_unbuffered( streamo,
|
||||
streamo->output_buffer, streamo->write_point ) )
|
||||
if( target->write_point > 0 ) {
|
||||
if( vips_target_write_unbuffered( target,
|
||||
target->output_buffer, target->write_point ) )
|
||||
return( -1 );
|
||||
streamo->write_point = 0;
|
||||
target->write_point = 0;
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamo_write:
|
||||
* @streamo: output stream to operate on
|
||||
* vips_target_write:
|
||||
* @target: output stream to operate on
|
||||
* @buffer: bytes to write
|
||||
* @length: length of @buffer in bytes
|
||||
*
|
||||
@ -356,183 +356,183 @@ vips_streamo_flush( VipsStreamo *streamo )
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_streamo_write( VipsStreamo *streamo, const void *buffer, size_t length )
|
||||
vips_target_write( VipsTarget *target, const void *buffer, size_t length )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_streamo_write: %zd bytes\n", length );
|
||||
VIPS_DEBUG_MSG( "vips_target_write: %zd bytes\n", length );
|
||||
|
||||
if( length > VIPS_STREAMO_BUFFER_SIZE - streamo->write_point &&
|
||||
vips_streamo_flush( streamo ) )
|
||||
if( length > VIPS_TARGET_BUFFER_SIZE - target->write_point &&
|
||||
vips_target_flush( target ) )
|
||||
return( -1 );
|
||||
|
||||
if( length > VIPS_STREAMO_BUFFER_SIZE - streamo->write_point ) {
|
||||
if( length > VIPS_TARGET_BUFFER_SIZE - target->write_point ) {
|
||||
/* Still too large? Do an unbuffered write.
|
||||
*/
|
||||
if( vips_streamo_write_unbuffered( streamo, buffer, length ) )
|
||||
if( vips_target_write_unbuffered( target, buffer, length ) )
|
||||
return( -1 );
|
||||
}
|
||||
else {
|
||||
memcpy( streamo->output_buffer + streamo->write_point,
|
||||
memcpy( target->output_buffer + target->write_point,
|
||||
buffer, length );
|
||||
streamo->write_point += length;
|
||||
target->write_point += length;
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamo_finish:
|
||||
* @streamo: output stream to operate on
|
||||
* vips_target_finish:
|
||||
* @target: output stream to operate on
|
||||
* @buffer: bytes to write
|
||||
* @length: length of @buffer in bytes
|
||||
*
|
||||
* Call this at the end of write to make the stream do any cleaning up. You
|
||||
* can call it many times.
|
||||
*
|
||||
* After a streamo has been finished, further writes will do nothing.
|
||||
* After a target has been finished, further writes will do nothing.
|
||||
*/
|
||||
void
|
||||
vips_streamo_finish( VipsStreamo *streamo )
|
||||
vips_target_finish( VipsTarget *target )
|
||||
{
|
||||
VipsStreamoClass *class = VIPS_STREAMO_GET_CLASS( streamo );
|
||||
VipsTargetClass *class = VIPS_TARGET_GET_CLASS( target );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamo_finish:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_target_finish:\n" );
|
||||
|
||||
if( streamo->finished )
|
||||
if( target->finished )
|
||||
return;
|
||||
|
||||
(void) vips_streamo_flush( streamo );
|
||||
(void) vips_target_flush( target );
|
||||
|
||||
/* Move the stream buffer into the blob so it can be read out.
|
||||
*/
|
||||
if( streamo->memory_buffer ) {
|
||||
if( target->memory_buffer ) {
|
||||
unsigned char *data;
|
||||
size_t length;
|
||||
|
||||
length = streamo->memory_buffer->len;
|
||||
data = g_byte_array_free( streamo->memory_buffer, FALSE );
|
||||
streamo->memory_buffer = NULL;
|
||||
vips_blob_set( streamo->blob,
|
||||
length = target->memory_buffer->len;
|
||||
data = g_byte_array_free( target->memory_buffer, FALSE );
|
||||
target->memory_buffer = NULL;
|
||||
vips_blob_set( target->blob,
|
||||
(VipsCallbackFn) g_free, data, length );
|
||||
}
|
||||
else
|
||||
class->finish( streamo );
|
||||
class->finish( target );
|
||||
|
||||
streamo->finished = TRUE;
|
||||
target->finished = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamo_steal:
|
||||
* @streamo: output stream to operate on
|
||||
* vips_target_steal:
|
||||
* @target: output stream to operate on
|
||||
* @length: return number of bytes of data
|
||||
*
|
||||
* Memory streams only (see vips_streamo_new_to_memory()). Steal all data
|
||||
* Memory streams only (see vips_target_new_to_memory()). Steal all data
|
||||
* written to the stream so far, and finish it.
|
||||
*
|
||||
* You must free the returned pointer with g_free().
|
||||
*
|
||||
* The data is NOT automatically null-terminated. vips_streamo_putc() a '\0'
|
||||
* The data is NOT automatically null-terminated. vips_target_putc() a '\0'
|
||||
* before calling this to get a null-terminated string.
|
||||
*
|
||||
* Returns: (array length=length) (element-type guint8) (transfer full): the
|
||||
* data
|
||||
*/
|
||||
unsigned char *
|
||||
vips_streamo_steal( VipsStreamo *streamo, size_t *length )
|
||||
vips_target_steal( VipsTarget *target, size_t *length )
|
||||
{
|
||||
unsigned char *data;
|
||||
|
||||
(void) vips_streamo_flush( streamo );
|
||||
(void) vips_target_flush( target );
|
||||
|
||||
if( !streamo->memory_buffer ||
|
||||
streamo->finished ) {
|
||||
if( !target->memory_buffer ||
|
||||
target->finished ) {
|
||||
if( length )
|
||||
*length = streamo->memory_buffer->len;
|
||||
*length = target->memory_buffer->len;
|
||||
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if( length )
|
||||
*length = streamo->memory_buffer->len;
|
||||
data = g_byte_array_free( streamo->memory_buffer, FALSE );
|
||||
streamo->memory_buffer = NULL;
|
||||
*length = target->memory_buffer->len;
|
||||
data = g_byte_array_free( target->memory_buffer, FALSE );
|
||||
target->memory_buffer = NULL;
|
||||
|
||||
/* We must have a valid byte array or finish will fail.
|
||||
*/
|
||||
streamo->memory_buffer = g_byte_array_new();
|
||||
target->memory_buffer = g_byte_array_new();
|
||||
|
||||
vips_streamo_finish( streamo );
|
||||
vips_target_finish( target );
|
||||
|
||||
return( data );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamo_steal_text:
|
||||
* @streamo: output stream to operate on
|
||||
* vips_target_steal_text:
|
||||
* @target: output stream to operate on
|
||||
*
|
||||
* As vips_streamo_steal_text(), but return a null-terminated string.
|
||||
* As vips_target_steal_text(), but return a null-terminated string.
|
||||
*
|
||||
* Returns: (transfer full): stream contents as a null-terminated string.
|
||||
*/
|
||||
char *
|
||||
vips_streamo_steal_text( VipsStreamo *streamo )
|
||||
vips_target_steal_text( VipsTarget *target )
|
||||
{
|
||||
vips_streamo_putc( streamo, '\0' );
|
||||
vips_target_putc( target, '\0' );
|
||||
|
||||
return( (char *) vips_streamo_steal( streamo, NULL ) );
|
||||
return( (char *) vips_target_steal( target, NULL ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamo_putc:
|
||||
* @streamo: output stream to operate on
|
||||
* vips_target_putc:
|
||||
* @target: output stream to operate on
|
||||
* @ch: character to write
|
||||
*
|
||||
* Write a single character @ch to @streamo. See the macro VIPS_STREAMO_PUTC()
|
||||
* Write a single character @ch to @target. See the macro VIPS_TARGET_PUTC()
|
||||
* for a faster way to do this.
|
||||
*
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_streamo_putc( VipsStreamo *streamo, int ch )
|
||||
vips_target_putc( VipsTarget *target, int ch )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_streamo_putc: %d\n", ch );
|
||||
VIPS_DEBUG_MSG( "vips_target_putc: %d\n", ch );
|
||||
|
||||
if( streamo->write_point >= VIPS_STREAMO_BUFFER_SIZE &&
|
||||
vips_streamo_flush( streamo ) )
|
||||
if( target->write_point >= VIPS_TARGET_BUFFER_SIZE &&
|
||||
vips_target_flush( target ) )
|
||||
return( -1 );
|
||||
|
||||
streamo->output_buffer[streamo->write_point++] = ch;
|
||||
target->output_buffer[target->write_point++] = ch;
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamo_writes:
|
||||
* @streamo: output stream to operate on
|
||||
* vips_target_writes:
|
||||
* @target: output stream to operate on
|
||||
* @str: string to write
|
||||
*
|
||||
* Write a null-terminated string to @streamo.
|
||||
* Write a null-terminated string to @target.
|
||||
*
|
||||
* Returns: 0 on success, and -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_streamo_writes( VipsStreamo *streamo, const char *str )
|
||||
vips_target_writes( VipsTarget *target, const char *str )
|
||||
{
|
||||
return( vips_streamo_write( streamo,
|
||||
return( vips_target_write( target,
|
||||
(unsigned char *) str, strlen( str ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamo_writef:
|
||||
* @streamo: output stream to operate on
|
||||
* vips_target_writef:
|
||||
* @target: output stream to operate on
|
||||
* @fmt: <function>printf()</function>-style format string
|
||||
* @...: arguments to format string
|
||||
*
|
||||
* Format the string and write to @streamo.
|
||||
* Format the string and write to @target.
|
||||
*
|
||||
* Returns: 0 on success, and -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_streamo_writef( VipsStreamo *streamo, const char *fmt, ... )
|
||||
vips_target_writef( VipsTarget *target, const char *fmt, ... )
|
||||
{
|
||||
va_list ap;
|
||||
char *line;
|
||||
@ -542,7 +542,7 @@ vips_streamo_writef( VipsStreamo *streamo, const char *fmt, ... )
|
||||
line = g_strdup_vprintf( fmt, ap );
|
||||
va_end( ap );
|
||||
|
||||
result = vips_streamo_writes( streamo, line );
|
||||
result = vips_target_writes( target, line );
|
||||
|
||||
g_free( line );
|
||||
|
||||
@ -550,11 +550,11 @@ vips_streamo_writef( VipsStreamo *streamo, const char *fmt, ... )
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamo_write_amp:
|
||||
* @streamo: output stream to operate on
|
||||
* vips_target_write_amp:
|
||||
* @target: output stream to operate on
|
||||
* @str: string to write
|
||||
*
|
||||
* Write @str to @streamo, but escape stuff that xml hates in text. Our
|
||||
* Write @str to @target, but escape stuff that xml hates in text. Our
|
||||
* argument string is utf-8.
|
||||
*
|
||||
* XML rules:
|
||||
@ -566,7 +566,7 @@ vips_streamo_writef( VipsStreamo *streamo, const char *fmt, ... )
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_streamo_write_amp( VipsStreamo *streamo, const char *str )
|
||||
vips_target_write_amp( VipsTarget *target, const char *str )
|
||||
{
|
||||
const char *p;
|
||||
|
||||
@ -583,24 +583,24 @@ vips_streamo_write_amp( VipsStreamo *streamo, const char *str )
|
||||
* control characters, so we can use them -- thanks
|
||||
* electroly.
|
||||
*/
|
||||
if( vips_streamo_writef( streamo,
|
||||
if( vips_target_writef( target,
|
||||
"&#x%04x;", 0x2400 + *p ) )
|
||||
return( -1 );
|
||||
}
|
||||
else if( *p == '<' ) {
|
||||
if( vips_streamo_writes( streamo, "<" ) )
|
||||
if( vips_target_writes( target, "<" ) )
|
||||
return( -1 );
|
||||
}
|
||||
else if( *p == '>' ) {
|
||||
if( vips_streamo_writes( streamo, ">" ) )
|
||||
if( vips_target_writes( target, ">" ) )
|
||||
return( -1 );
|
||||
}
|
||||
else if( *p == '&' ) {
|
||||
if( vips_streamo_writes( streamo, "&" ) )
|
||||
if( vips_target_writes( target, "&" ) )
|
||||
return( -1 );
|
||||
}
|
||||
else {
|
||||
if( VIPS_STREAMO_PUTC( streamo, *p ) )
|
||||
if( VIPS_TARGET_PUTC( target, *p ) )
|
||||
return( -1 );
|
||||
}
|
||||
|
@ -58,7 +58,7 @@
|
||||
|
||||
#include "vipsmarshal.h"
|
||||
|
||||
G_DEFINE_TYPE( VipsStreamou, vips_streamou, VIPS_TYPE_STREAMO );
|
||||
G_DEFINE_TYPE( VipsTargetCustom, vips_target_custom, VIPS_TYPE_TARGET );
|
||||
|
||||
/* Our signals.
|
||||
*/
|
||||
@ -68,21 +68,21 @@ enum {
|
||||
SIG_LAST
|
||||
};
|
||||
|
||||
static guint vips_streamou_signals[SIG_LAST] = { 0 };
|
||||
static guint vips_target_custom_signals[SIG_LAST] = { 0 };
|
||||
|
||||
static gint64
|
||||
vips_streamou_write_real( VipsStreamo *streamo,
|
||||
vips_target_custom_write_real( VipsTarget *target,
|
||||
const void *data, size_t length )
|
||||
{
|
||||
gint64 bytes_written;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamou_write_real:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_target_custom_write_real:\n" );
|
||||
|
||||
/* Return value if no attached handler.
|
||||
*/
|
||||
bytes_written = 0;
|
||||
|
||||
g_signal_emit( streamo, vips_streamou_signals[SIG_WRITE], 0,
|
||||
g_signal_emit( target, vips_target_custom_signals[SIG_WRITE], 0,
|
||||
data, (gint64) length, &bytes_written );
|
||||
|
||||
VIPS_DEBUG_MSG( " %zd\n", bytes_written );
|
||||
@ -91,46 +91,46 @@ vips_streamou_write_real( VipsStreamo *streamo,
|
||||
}
|
||||
|
||||
static void
|
||||
vips_streamou_finish_real( VipsStreamo *streamo )
|
||||
vips_target_custom_finish_real( VipsTarget *target )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_streamou_seek_real:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_target_custom_seek_real:\n" );
|
||||
|
||||
g_signal_emit( streamo, vips_streamou_signals[SIG_FINISH], 0 );
|
||||
g_signal_emit( target, vips_target_custom_signals[SIG_FINISH], 0 );
|
||||
}
|
||||
|
||||
static gint64
|
||||
vips_streamou_write_signal_real( VipsStreamou *streamou,
|
||||
vips_target_custom_write_signal_real( VipsTargetCustom *target_custom,
|
||||
const void *data, gint64 length )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_streamou_write_signal_real:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_target_custom_write_signal_real:\n" );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_streamou_finish_signal_real( VipsStreamou *streamou )
|
||||
vips_target_custom_finish_signal_real( VipsTargetCustom *target_custom )
|
||||
{
|
||||
VIPS_DEBUG_MSG( "vips_streamou_finish_signal_real:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_target_custom_finish_signal_real:\n" );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_streamou_class_init( VipsStreamouClass *class )
|
||||
vips_target_custom_class_init( VipsTargetCustomClass *class )
|
||||
{
|
||||
VipsObjectClass *object_class = VIPS_OBJECT_CLASS( class );
|
||||
VipsStreamoClass *streamo_class = VIPS_STREAMO_CLASS( class );
|
||||
VipsTargetClass *target_class = VIPS_TARGET_CLASS( class );
|
||||
|
||||
object_class->nickname = "streamou";
|
||||
object_class->nickname = "target_custom";
|
||||
object_class->description = _( "input stream" );
|
||||
|
||||
streamo_class->write = vips_streamou_write_real;
|
||||
streamo_class->finish = vips_streamou_finish_real;
|
||||
target_class->write = vips_target_custom_write_real;
|
||||
target_class->finish = vips_target_custom_finish_real;
|
||||
|
||||
class->write = vips_streamou_write_signal_real;
|
||||
class->finish = vips_streamou_finish_signal_real;
|
||||
class->write = vips_target_custom_write_signal_real;
|
||||
class->finish = vips_target_custom_finish_signal_real;
|
||||
|
||||
/**
|
||||
* VipsStreamou::write:
|
||||
* @streamou: the stream being operated on
|
||||
* VipsTargetCustom::write:
|
||||
* @target_custom: the stream being operated on
|
||||
* @data: %pointer, bytes to write
|
||||
* @length: %gint64, number of bytes
|
||||
*
|
||||
@ -138,26 +138,26 @@ vips_streamou_class_init( VipsStreamouClass *class )
|
||||
*
|
||||
* Returns: the number of bytes written.
|
||||
*/
|
||||
vips_streamou_signals[SIG_WRITE] = g_signal_new( "write",
|
||||
vips_target_custom_signals[SIG_WRITE] = g_signal_new( "write",
|
||||
G_TYPE_FROM_CLASS( class ),
|
||||
G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET( VipsStreamouClass, write ),
|
||||
G_STRUCT_OFFSET( VipsTargetCustomClass, write ),
|
||||
NULL, NULL,
|
||||
vips_INT64__POINTER_INT64,
|
||||
G_TYPE_INT64, 2,
|
||||
G_TYPE_POINTER, G_TYPE_INT64 );
|
||||
|
||||
/**
|
||||
* VipsStreamou::finish:
|
||||
* @streamou: the stream being operated on
|
||||
* VipsTargetCustom::finish:
|
||||
* @target_custom: the stream being operated on
|
||||
*
|
||||
* This signal is emitted at the end of write. The stream should do
|
||||
* any finishing necessary.
|
||||
*/
|
||||
vips_streamou_signals[SIG_FINISH] = g_signal_new( "finish",
|
||||
vips_target_custom_signals[SIG_FINISH] = g_signal_new( "finish",
|
||||
G_TYPE_FROM_CLASS( class ),
|
||||
G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET( VipsStreamouClass, finish ),
|
||||
G_STRUCT_OFFSET( VipsTargetCustomClass, finish ),
|
||||
NULL, NULL,
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0 );
|
||||
@ -165,30 +165,30 @@ vips_streamou_class_init( VipsStreamouClass *class )
|
||||
}
|
||||
|
||||
static void
|
||||
vips_streamou_init( VipsStreamou *streamou )
|
||||
vips_target_custom_init( VipsTargetCustom *target_custom )
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_streamou_new:
|
||||
* vips_target_custom_new:
|
||||
*
|
||||
* Create a #VipsStreamou. Attach signals to implement write and finish.
|
||||
* Create a #VipsTargetCustom. Attach signals to implement write and finish.
|
||||
*
|
||||
* Returns: a new #VipsStreamou
|
||||
* Returns: a new #VipsTargetCustom
|
||||
*/
|
||||
VipsStreamou *
|
||||
vips_streamou_new( void )
|
||||
VipsTargetCustom *
|
||||
vips_target_custom_new( void )
|
||||
{
|
||||
VipsStreamou *streamou;
|
||||
VipsTargetCustom *target_custom;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_streamou_new:\n" );
|
||||
VIPS_DEBUG_MSG( "vips_target_custom_new:\n" );
|
||||
|
||||
streamou = VIPS_STREAMOU( g_object_new( VIPS_TYPE_STREAMOU, NULL ) );
|
||||
target_custom = VIPS_TARGET_CUSTOM( g_object_new( VIPS_TYPE_TARGET_CUSTOM, NULL ) );
|
||||
|
||||
if( vips_object_build( VIPS_OBJECT( streamou ) ) ) {
|
||||
VIPS_UNREF( streamou );
|
||||
if( vips_object_build( VIPS_OBJECT( target_custom ) ) ) {
|
||||
VIPS_UNREF( target_custom );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( streamou );
|
||||
return( target_custom );
|
||||
}
|
@ -813,7 +813,7 @@ vips__write_extension_block( VipsImage *im, void *buf, int size )
|
||||
/* Append a string to a buffer, but escape " as \".
|
||||
*/
|
||||
static void
|
||||
streamo_write_quotes( VipsStreamo *streamo, const char *str )
|
||||
target_write_quotes( VipsTarget *target, const char *str )
|
||||
{
|
||||
const char *p;
|
||||
size_t len;
|
||||
@ -821,14 +821,14 @@ streamo_write_quotes( VipsStreamo *streamo, const char *str )
|
||||
for( p = str; *p; p += len ) {
|
||||
len = strcspn( p, "\"" );
|
||||
|
||||
vips_streamo_write( streamo, (unsigned char *) p, len );
|
||||
vips_target_write( target, (unsigned char *) p, len );
|
||||
if( p[len] == '"' )
|
||||
vips_streamo_writes( streamo, "\\" );
|
||||
vips_target_writes( target, "\\" );
|
||||
}
|
||||
}
|
||||
|
||||
static void *
|
||||
build_xml_meta( VipsMeta *meta, VipsStreamo *streamo )
|
||||
build_xml_meta( VipsMeta *meta, VipsTarget *target )
|
||||
{
|
||||
GType type = G_VALUE_TYPE( &meta->value );
|
||||
|
||||
@ -853,13 +853,13 @@ build_xml_meta( VipsMeta *meta, VipsStreamo *streamo )
|
||||
*/
|
||||
str = vips_value_get_save_string( &save_value );
|
||||
if( g_utf8_validate( str, -1, NULL ) ) {
|
||||
vips_streamo_writef( streamo,
|
||||
vips_target_writef( target,
|
||||
" <field type=\"%s\" name=\"",
|
||||
g_type_name( type ) );
|
||||
streamo_write_quotes( streamo, meta->name );
|
||||
vips_streamo_writes( streamo, "\">" );
|
||||
vips_streamo_write_amp( streamo, str );
|
||||
vips_streamo_writes( streamo, "</field>\n" );
|
||||
target_write_quotes( target, meta->name );
|
||||
vips_target_writes( target, "\">" );
|
||||
vips_target_write_amp( target, str );
|
||||
vips_target_writes( target, "</field>\n" );
|
||||
}
|
||||
|
||||
g_value_unset( &save_value );
|
||||
@ -873,42 +873,42 @@ build_xml_meta( VipsMeta *meta, VipsStreamo *streamo )
|
||||
static char *
|
||||
build_xml( VipsImage *image )
|
||||
{
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
const char *str;
|
||||
char *result;
|
||||
|
||||
streamo = vips_streamo_new_to_memory();
|
||||
target = vips_target_new_to_memory();
|
||||
|
||||
vips_streamo_writef( streamo, "<?xml version=\"1.0\"?>\n" );
|
||||
vips_streamo_writef( streamo, "<root xmlns=\"%svips/%d.%d.%d\">\n",
|
||||
vips_target_writef( target, "<?xml version=\"1.0\"?>\n" );
|
||||
vips_target_writef( target, "<root xmlns=\"%svips/%d.%d.%d\">\n",
|
||||
NAMESPACE_URI,
|
||||
VIPS_MAJOR_VERSION, VIPS_MINOR_VERSION, VIPS_MICRO_VERSION );
|
||||
vips_streamo_writef( streamo, " <header>\n" );
|
||||
vips_target_writef( target, " <header>\n" );
|
||||
|
||||
str = vips_image_get_history( image );
|
||||
if( g_utf8_validate( str, -1, NULL ) ) {
|
||||
vips_streamo_writef( streamo,
|
||||
vips_target_writef( target,
|
||||
" <field type=\"%s\" name=\"Hist\">",
|
||||
g_type_name( VIPS_TYPE_REF_STRING ) );
|
||||
vips_streamo_write_amp( streamo, str );
|
||||
vips_streamo_writef( streamo, "</field>\n" );
|
||||
vips_target_write_amp( target, str );
|
||||
vips_target_writef( target, "</field>\n" );
|
||||
}
|
||||
|
||||
vips_streamo_writef( streamo, " </header>\n" );
|
||||
vips_streamo_writef( streamo, " <meta>\n" );
|
||||
vips_target_writef( target, " </header>\n" );
|
||||
vips_target_writef( target, " <meta>\n" );
|
||||
|
||||
if( vips_slist_map2( image->meta_traverse,
|
||||
(VipsSListMap2Fn) build_xml_meta, streamo, NULL ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
(VipsSListMap2Fn) build_xml_meta, target, NULL ) ) {
|
||||
VIPS_UNREF( target );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
vips_streamo_writef( streamo, " </meta>\n" );
|
||||
vips_streamo_writef( streamo, "</root>\n" );
|
||||
vips_target_writef( target, " </meta>\n" );
|
||||
vips_target_writef( target, "</root>\n" );
|
||||
|
||||
result = vips_streamo_steal_text( streamo );
|
||||
result = vips_target_steal_text( target );
|
||||
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( result );
|
||||
}
|
||||
@ -917,7 +917,7 @@ static void *
|
||||
vips__xml_properties_meta( VipsImage *image,
|
||||
const char *field, GValue *value, void *a )
|
||||
{
|
||||
VipsStreamo *streamo = (VipsStreamo *) a;
|
||||
VipsTarget *target = (VipsTarget *) a;
|
||||
GType type = G_VALUE_TYPE( value );
|
||||
|
||||
const char *str;
|
||||
@ -933,19 +933,19 @@ vips__xml_properties_meta( VipsImage *image,
|
||||
if( !g_value_transform( value, &save_value ) ) {
|
||||
vips_error( "VipsImage", "%s",
|
||||
_( "error transforming to save format" ) );
|
||||
return( streamo );
|
||||
return( target );
|
||||
}
|
||||
str = vips_value_get_save_string( &save_value );
|
||||
|
||||
vips_streamo_writef( streamo, " <property>\n" );
|
||||
vips_streamo_writef( streamo, " <name>" );
|
||||
vips_streamo_write_amp( streamo, field );
|
||||
vips_streamo_writef( streamo, "</name>\n" );
|
||||
vips_streamo_writef( streamo, " <value type=\"%s\">",
|
||||
vips_target_writef( target, " <property>\n" );
|
||||
vips_target_writef( target, " <name>" );
|
||||
vips_target_write_amp( target, field );
|
||||
vips_target_writef( target, "</name>\n" );
|
||||
vips_target_writef( target, " <value type=\"%s\">",
|
||||
g_type_name( type ) );
|
||||
vips_streamo_write_amp( streamo, str );
|
||||
vips_streamo_writef( streamo, "</value>\n" );
|
||||
vips_streamo_writef( streamo, " </property>\n" );
|
||||
vips_target_write_amp( target, str );
|
||||
vips_target_writef( target, "</value>\n" );
|
||||
vips_target_writef( target, " </property>\n" );
|
||||
|
||||
g_value_unset( &save_value );
|
||||
}
|
||||
@ -959,34 +959,34 @@ vips__xml_properties_meta( VipsImage *image,
|
||||
char *
|
||||
vips__xml_properties( VipsImage *image )
|
||||
{
|
||||
VipsStreamo *streamo;
|
||||
VipsTarget *target;
|
||||
char *date;
|
||||
char *result;
|
||||
|
||||
date = vips__get_iso8601();
|
||||
|
||||
streamo = vips_streamo_new_to_memory();
|
||||
vips_streamo_writef( streamo, "<?xml version=\"1.0\"?>\n" );
|
||||
vips_streamo_writef( streamo, "<image xmlns=\"%s/dzsave\" "
|
||||
target = vips_target_new_to_memory();
|
||||
vips_target_writef( target, "<?xml version=\"1.0\"?>\n" );
|
||||
vips_target_writef( target, "<image xmlns=\"%s/dzsave\" "
|
||||
"date=\"%s\" version=\"%d.%d.%d\">\n",
|
||||
NAMESPACE_URI,
|
||||
date,
|
||||
VIPS_MAJOR_VERSION, VIPS_MINOR_VERSION, VIPS_MICRO_VERSION );
|
||||
vips_streamo_writef( streamo, " <properties>\n" );
|
||||
vips_target_writef( target, " <properties>\n" );
|
||||
|
||||
g_free( date );
|
||||
|
||||
if( vips_image_map( image, vips__xml_properties_meta, streamo ) ) {
|
||||
VIPS_UNREF( streamo );
|
||||
if( vips_image_map( image, vips__xml_properties_meta, target ) ) {
|
||||
VIPS_UNREF( target );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
vips_streamo_writef( streamo, " </properties>\n" );
|
||||
vips_streamo_writef( streamo, "</image>\n" );
|
||||
vips_target_writef( target, " </properties>\n" );
|
||||
vips_target_writef( target, "</image>\n" );
|
||||
|
||||
result = vips_streamo_steal_text( streamo );
|
||||
result = vips_target_steal_text( target );
|
||||
|
||||
VIPS_UNREF( streamo );
|
||||
VIPS_UNREF( target );
|
||||
|
||||
return( result );
|
||||
}
|
||||
|
@ -157,7 +157,7 @@ vips_resample_operation_init( void )
|
||||
extern GType vips_thumbnail_file_get_type( void );
|
||||
extern GType vips_thumbnail_buffer_get_type( void );
|
||||
extern GType vips_thumbnail_image_get_type( void );
|
||||
extern GType vips_thumbnail_stream_get_type( void );
|
||||
extern GType vips_thumbnail_source_get_type( void );
|
||||
extern GType vips_mapim_get_type( void );
|
||||
extern GType vips_shrink_get_type( void );
|
||||
extern GType vips_shrinkh_get_type( void );
|
||||
@ -174,7 +174,7 @@ vips_resample_operation_init( void )
|
||||
vips_thumbnail_file_get_type();
|
||||
vips_thumbnail_buffer_get_type();
|
||||
vips_thumbnail_image_get_type();
|
||||
vips_thumbnail_stream_get_type();
|
||||
vips_thumbnail_source_get_type();
|
||||
vips_mapim_get_type();
|
||||
vips_shrink_get_type();
|
||||
vips_shrinkh_get_type();
|
||||
|
@ -1257,19 +1257,19 @@ vips_thumbnail_buffer( void *buf, size_t len, VipsImage **out, int width, ... )
|
||||
typedef struct _VipsThumbnailStream {
|
||||
VipsThumbnail parent_object;
|
||||
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
char *option_string;
|
||||
} VipsThumbnailStream;
|
||||
|
||||
typedef VipsThumbnailClass VipsThumbnailStreamClass;
|
||||
|
||||
G_DEFINE_TYPE( VipsThumbnailStream, vips_thumbnail_stream,
|
||||
G_DEFINE_TYPE( VipsThumbnailStream, vips_thumbnail_source,
|
||||
vips_thumbnail_get_type() );
|
||||
|
||||
/* Get the info from a stream.
|
||||
*/
|
||||
static int
|
||||
vips_thumbnail_stream_get_info( VipsThumbnail *thumbnail )
|
||||
vips_thumbnail_source_get_info( VipsThumbnail *thumbnail )
|
||||
{
|
||||
VipsThumbnailStream *stream = (VipsThumbnailStream *) thumbnail;
|
||||
|
||||
@ -1277,9 +1277,9 @@ vips_thumbnail_stream_get_info( VipsThumbnail *thumbnail )
|
||||
|
||||
g_info( "thumbnailing stream" );
|
||||
|
||||
if( !(thumbnail->loader = vips_foreign_find_load_stream(
|
||||
stream->streami )) ||
|
||||
!(image = vips_image_new_from_stream( stream->streami,
|
||||
if( !(thumbnail->loader = vips_foreign_find_load_source(
|
||||
stream->source )) ||
|
||||
!(image = vips_image_new_from_source( stream->source,
|
||||
stream->option_string, NULL )) )
|
||||
return( -1 );
|
||||
|
||||
@ -1293,13 +1293,13 @@ vips_thumbnail_stream_get_info( VipsThumbnail *thumbnail )
|
||||
/* Open an image, scaling as appropriate.
|
||||
*/
|
||||
static VipsImage *
|
||||
vips_thumbnail_stream_open( VipsThumbnail *thumbnail, double factor )
|
||||
vips_thumbnail_source_open( VipsThumbnail *thumbnail, double factor )
|
||||
{
|
||||
VipsThumbnailStream *stream = (VipsThumbnailStream *) thumbnail;
|
||||
|
||||
if( vips_isprefix( "VipsForeignLoadJpeg", thumbnail->loader ) ) {
|
||||
return( vips_image_new_from_stream(
|
||||
stream->streami,
|
||||
return( vips_image_new_from_source(
|
||||
stream->source,
|
||||
stream->option_string,
|
||||
"access", VIPS_ACCESS_SEQUENTIAL,
|
||||
"shrink", (int) factor,
|
||||
@ -1307,8 +1307,8 @@ vips_thumbnail_stream_open( VipsThumbnail *thumbnail, double factor )
|
||||
}
|
||||
else if( vips_isprefix( "VipsForeignLoadOpenslide",
|
||||
thumbnail->loader ) ) {
|
||||
return( vips_image_new_from_stream(
|
||||
stream->streami,
|
||||
return( vips_image_new_from_source(
|
||||
stream->source,
|
||||
stream->option_string,
|
||||
"access", VIPS_ACCESS_SEQUENTIAL,
|
||||
"level", (int) factor,
|
||||
@ -1317,32 +1317,32 @@ vips_thumbnail_stream_open( VipsThumbnail *thumbnail, double factor )
|
||||
else if( vips_isprefix( "VipsForeignLoadPdf", thumbnail->loader ) ||
|
||||
vips_isprefix( "VipsForeignLoadSvg", thumbnail->loader ) ||
|
||||
vips_isprefix( "VipsForeignLoadWebp", thumbnail->loader ) ) {
|
||||
return( vips_image_new_from_stream(
|
||||
stream->streami,
|
||||
return( vips_image_new_from_source(
|
||||
stream->source,
|
||||
stream->option_string,
|
||||
"access", VIPS_ACCESS_SEQUENTIAL,
|
||||
"scale", 1.0 / factor,
|
||||
NULL ) );
|
||||
}
|
||||
else if( vips_isprefix( "VipsForeignLoadTiff", thumbnail->loader ) ) {
|
||||
return( vips_image_new_from_stream(
|
||||
stream->streami,
|
||||
return( vips_image_new_from_source(
|
||||
stream->source,
|
||||
stream->option_string,
|
||||
"access", VIPS_ACCESS_SEQUENTIAL,
|
||||
"page", (int) factor,
|
||||
NULL ) );
|
||||
}
|
||||
else if( vips_isprefix( "VipsForeignLoadHeif", thumbnail->loader ) ) {
|
||||
return( vips_image_new_from_stream(
|
||||
stream->streami,
|
||||
return( vips_image_new_from_source(
|
||||
stream->source,
|
||||
stream->option_string,
|
||||
"access", VIPS_ACCESS_SEQUENTIAL,
|
||||
"thumbnail", (int) factor,
|
||||
NULL ) );
|
||||
}
|
||||
else {
|
||||
return( vips_image_new_from_stream(
|
||||
stream->streami,
|
||||
return( vips_image_new_from_source(
|
||||
stream->source,
|
||||
stream->option_string,
|
||||
"access", VIPS_ACCESS_SEQUENTIAL,
|
||||
NULL ) );
|
||||
@ -1350,7 +1350,7 @@ vips_thumbnail_stream_open( VipsThumbnail *thumbnail, double factor )
|
||||
}
|
||||
|
||||
static void
|
||||
vips_thumbnail_stream_class_init( VipsThumbnailClass *class )
|
||||
vips_thumbnail_source_class_init( VipsThumbnailClass *class )
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
|
||||
VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS( class );
|
||||
@ -1362,15 +1362,15 @@ vips_thumbnail_stream_class_init( VipsThumbnailClass *class )
|
||||
vobject_class->nickname = "thumbnail_stream";
|
||||
vobject_class->description = _( "generate thumbnail from stream" );
|
||||
|
||||
thumbnail_class->get_info = vips_thumbnail_stream_get_info;
|
||||
thumbnail_class->open = vips_thumbnail_stream_open;
|
||||
thumbnail_class->get_info = vips_thumbnail_source_get_info;
|
||||
thumbnail_class->open = vips_thumbnail_source_open;
|
||||
|
||||
VIPS_ARG_OBJECT( class, "streami", 1,
|
||||
VIPS_ARG_OBJECT( class, "source", 1,
|
||||
_( "Streami" ),
|
||||
_( "Stream to load from" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsThumbnailStream, streami ),
|
||||
VIPS_TYPE_STREAMI );
|
||||
G_STRUCT_OFFSET( VipsThumbnailStream, source ),
|
||||
VIPS_TYPE_SOURCE );
|
||||
|
||||
VIPS_ARG_STRING( class, "option_string", 20,
|
||||
_( "Extra options" ),
|
||||
@ -1382,13 +1382,13 @@ vips_thumbnail_stream_class_init( VipsThumbnailClass *class )
|
||||
}
|
||||
|
||||
static void
|
||||
vips_thumbnail_stream_init( VipsThumbnailStream *stream )
|
||||
vips_thumbnail_source_init( VipsThumbnailStream *stream )
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_thumbnail_stream:
|
||||
* @streami: stream to thumbnail
|
||||
* vips_thumbnail_source:
|
||||
* @source: stream to thumbnail
|
||||
* @out: (out): output image
|
||||
* @width: target width in pixels
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
@ -1411,13 +1411,13 @@ vips_thumbnail_stream_init( VipsThumbnailStream *stream )
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_thumbnail_stream( VipsStreami *streami, VipsImage **out, int width, ... )
|
||||
vips_thumbnail_source( VipsSource *source, VipsImage **out, int width, ... )
|
||||
{
|
||||
va_list ap;
|
||||
int result;
|
||||
|
||||
va_start( ap, width );
|
||||
result = vips_call_split( "thumbnail_stream", ap, streami, out, width );
|
||||
result = vips_call_split( "thumbnail_stream", ap, source, out, width );
|
||||
va_end( ap );
|
||||
|
||||
return( result );
|
||||
|
@ -1,6 +1,6 @@
|
||||
# don't run test_thumbnail.sh by default, it takes ages
|
||||
TESTS = \
|
||||
test_streams.sh \
|
||||
test_connections.sh \
|
||||
test_descriptors.sh \
|
||||
test_cli.sh \
|
||||
test_formats.sh \
|
||||
@ -13,13 +13,13 @@ SUBDIRS = \
|
||||
|
||||
noinst_PROGRAMS = \
|
||||
test_descriptors \
|
||||
test_streams
|
||||
test_connections
|
||||
|
||||
test_descriptors_SOURCES = \
|
||||
test_descriptors.c
|
||||
|
||||
test_streams_SOURCES = \
|
||||
test_streams.c
|
||||
test_connections_SOURCES = \
|
||||
test_connections.c
|
||||
|
||||
AM_CPPFLAGS = -I${top_srcdir}/libvips/include @VIPS_CFLAGS@ @VIPS_INCLUDES@
|
||||
AM_LDFLAGS = @LDFLAGS@
|
||||
@ -29,7 +29,7 @@ EXTRA_DIST = \
|
||||
variables.sh.in \
|
||||
test_cli.sh \
|
||||
test_descriptors.sh \
|
||||
test_streams.sh \
|
||||
test_connections.sh \
|
||||
test_formats.sh \
|
||||
test_seq.sh \
|
||||
test_thumbnail.sh \
|
||||
|
210
test/test_connections
Executable file
210
test/test_connections
Executable file
@ -0,0 +1,210 @@
|
||||
#! /bin/bash
|
||||
|
||||
# test_connections - temporary wrapper script for .libs/test_connections
|
||||
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-11
|
||||
#
|
||||
# The test_connections program cannot be directly executed until all the libtool
|
||||
# libraries that it depends on are installed.
|
||||
#
|
||||
# This wrapper script should never be moved out of the build directory.
|
||||
# If it is, it will not operate correctly.
|
||||
|
||||
# Sed substitution that helps us do robust quoting. It backslashifies
|
||||
# metacharacters that are still active within double-quoted strings.
|
||||
sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
|
||||
|
||||
# Be Bourne compatible
|
||||
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
|
||||
emulate sh
|
||||
NULLCMD=:
|
||||
# Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
|
||||
# is contrary to our usage. Disable this feature.
|
||||
alias -g '${1+"$@"}'='"$@"'
|
||||
setopt NO_GLOB_SUBST
|
||||
else
|
||||
case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
|
||||
fi
|
||||
BIN_SH=xpg4; export BIN_SH # for Tru64
|
||||
DUALCASE=1; export DUALCASE # for MKS sh
|
||||
|
||||
# The HP-UX ksh and POSIX shell print the target directory to stdout
|
||||
# if CDPATH is set.
|
||||
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
|
||||
|
||||
relink_command=""
|
||||
|
||||
# This environment variable determines our operation mode.
|
||||
if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
|
||||
# install mode needs the following variables:
|
||||
generated_by_libtool_version='2.4.6'
|
||||
notinst_deplibs=' ../libvips/libvips.la'
|
||||
else
|
||||
# When we are sourced in execute mode, $file and $ECHO are already set.
|
||||
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
|
||||
file="$0"
|
||||
|
||||
# A function that is used when there is no print builtin or printf.
|
||||
func_fallback_echo ()
|
||||
{
|
||||
eval 'cat <<_LTECHO_EOF
|
||||
$1
|
||||
_LTECHO_EOF'
|
||||
}
|
||||
ECHO="printf %s\\n"
|
||||
fi
|
||||
|
||||
# Very basic option parsing. These options are (a) specific to
|
||||
# the libtool wrapper, (b) are identical between the wrapper
|
||||
# /script/ and the wrapper /executable/ that is used only on
|
||||
# windows platforms, and (c) all begin with the string --lt-
|
||||
# (application programs are unlikely to have options that match
|
||||
# this pattern).
|
||||
#
|
||||
# There are only two supported options: --lt-debug and
|
||||
# --lt-dump-script. There is, deliberately, no --lt-help.
|
||||
#
|
||||
# The first argument to this parsing function should be the
|
||||
# script's ../libtool value, followed by no.
|
||||
lt_option_debug=
|
||||
func_parse_lt_options ()
|
||||
{
|
||||
lt_script_arg0=$0
|
||||
shift
|
||||
for lt_opt
|
||||
do
|
||||
case "$lt_opt" in
|
||||
--lt-debug) lt_option_debug=1 ;;
|
||||
--lt-dump-script)
|
||||
lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
|
||||
test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
|
||||
lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
|
||||
cat "$lt_dump_D/$lt_dump_F"
|
||||
exit 0
|
||||
;;
|
||||
--lt-*)
|
||||
$ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Print the debug banner immediately:
|
||||
if test -n "$lt_option_debug"; then
|
||||
echo "test_connections:test_connections:$LINENO: libtool wrapper (GNU libtool) 2.4.6 Debian-2.4.6-11" 1>&2
|
||||
fi
|
||||
}
|
||||
|
||||
# Used when --lt-debug. Prints its arguments to stdout
|
||||
# (redirection is the responsibility of the caller)
|
||||
func_lt_dump_args ()
|
||||
{
|
||||
lt_dump_args_N=1;
|
||||
for lt_arg
|
||||
do
|
||||
$ECHO "test_connections:test_connections:$LINENO: newargv[$lt_dump_args_N]: $lt_arg"
|
||||
lt_dump_args_N=`expr $lt_dump_args_N + 1`
|
||||
done
|
||||
}
|
||||
|
||||
# Core function for launching the target application
|
||||
func_exec_program_core ()
|
||||
{
|
||||
|
||||
if test -n "$lt_option_debug"; then
|
||||
$ECHO "test_connections:test_connections:$LINENO: newargv[0]: $progdir/$program" 1>&2
|
||||
func_lt_dump_args ${1+"$@"} 1>&2
|
||||
fi
|
||||
exec "$progdir/$program" ${1+"$@"}
|
||||
|
||||
$ECHO "$0: cannot exec $program $*" 1>&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# A function to encapsulate launching the target application
|
||||
# Strips options in the --lt-* namespace from $@ and
|
||||
# launches target application with the remaining arguments.
|
||||
func_exec_program ()
|
||||
{
|
||||
case " $* " in
|
||||
*\ --lt-*)
|
||||
for lt_wr_arg
|
||||
do
|
||||
case $lt_wr_arg in
|
||||
--lt-*) ;;
|
||||
*) set x "$@" "$lt_wr_arg"; shift;;
|
||||
esac
|
||||
shift
|
||||
done ;;
|
||||
esac
|
||||
func_exec_program_core ${1+"$@"}
|
||||
}
|
||||
|
||||
# Parse options
|
||||
func_parse_lt_options "$0" ${1+"$@"}
|
||||
|
||||
# Find the directory that this script lives in.
|
||||
thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
|
||||
test "x$thisdir" = "x$file" && thisdir=.
|
||||
|
||||
# Follow symbolic links until we get to the real thisdir.
|
||||
file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
|
||||
while test -n "$file"; do
|
||||
destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
|
||||
|
||||
# If there was a directory component, then change thisdir.
|
||||
if test "x$destdir" != "x$file"; then
|
||||
case "$destdir" in
|
||||
[\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
|
||||
*) thisdir="$thisdir/$destdir" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
|
||||
file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
|
||||
done
|
||||
|
||||
# Usually 'no', except on cygwin/mingw when embedded into
|
||||
# the cwrapper.
|
||||
WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
|
||||
if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
|
||||
# special case for '.'
|
||||
if test "$thisdir" = "."; then
|
||||
thisdir=`pwd`
|
||||
fi
|
||||
# remove .libs from thisdir
|
||||
case "$thisdir" in
|
||||
*[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
|
||||
.libs ) thisdir=. ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Try to get the absolute directory name.
|
||||
absdir=`cd "$thisdir" && pwd`
|
||||
test -n "$absdir" && thisdir="$absdir"
|
||||
|
||||
program='test_connections'
|
||||
progdir="$thisdir/.libs"
|
||||
|
||||
|
||||
if test -f "$progdir/$program"; then
|
||||
# Add our own library path to LD_LIBRARY_PATH
|
||||
LD_LIBRARY_PATH="/home/john/GIT/libvips/libvips/.libs:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
|
||||
|
||||
# Some systems cannot cope with colon-terminated LD_LIBRARY_PATH
|
||||
# The second colon is a workaround for a bug in BeOS R4 sed
|
||||
LD_LIBRARY_PATH=`$ECHO "$LD_LIBRARY_PATH" | /bin/sed 's/::*$//'`
|
||||
|
||||
export LD_LIBRARY_PATH
|
||||
|
||||
if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
|
||||
# Run the actual program with our arguments.
|
||||
func_exec_program ${1+"$@"}
|
||||
fi
|
||||
else
|
||||
# The program doesn't exist.
|
||||
$ECHO "$0: error: '$progdir/$program' does not exist" 1>&2
|
||||
$ECHO "This script is just a wrapper for $program." 1>&2
|
||||
$ECHO "See the libtool documentation for more information." 1>&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
@ -20,7 +20,7 @@ typedef struct _MyOutput {
|
||||
} MyOutput;
|
||||
|
||||
static gint64
|
||||
read_cb( VipsStreamiu *streamiu,
|
||||
read_cb( VipsSourceCustom *source_custom,
|
||||
void *buffer, gint64 length, MyInput *my_input )
|
||||
{
|
||||
gint64 bytes_read = VIPS_MIN( length,
|
||||
@ -38,7 +38,7 @@ read_cb( VipsStreamiu *streamiu,
|
||||
}
|
||||
|
||||
static gint64
|
||||
seek_cb( VipsStreamiu *streamiu,
|
||||
seek_cb( VipsSourceCustom *source_custom,
|
||||
gint64 offset, int whence, MyInput *my_input )
|
||||
{
|
||||
gint64 new_pos;
|
||||
@ -71,7 +71,7 @@ seek_cb( VipsStreamiu *streamiu,
|
||||
}
|
||||
|
||||
static gint64
|
||||
write_cb( VipsStreamou *streamou,
|
||||
write_cb( VipsTargetCustom *target_custom,
|
||||
const void *data, gint64 length, MyOutput *my_output )
|
||||
{
|
||||
gint64 bytes_written;
|
||||
@ -86,7 +86,7 @@ write_cb( VipsStreamou *streamou,
|
||||
}
|
||||
|
||||
static void
|
||||
finish_cb( VipsStreamou *streamou, MyOutput *my_output )
|
||||
finish_cb( VipsTargetCustom *target_custom, MyOutput *my_output )
|
||||
{
|
||||
/*
|
||||
printf( "finish_cb:\n" );
|
||||
@ -101,8 +101,8 @@ main( int argc, char **argv )
|
||||
{
|
||||
MyInput my_input;
|
||||
MyOutput my_output;
|
||||
VipsStreamiu *streamiu;
|
||||
VipsStreamou *streamou;
|
||||
VipsSourceCustom *source_custom;
|
||||
VipsTargetCustom *target_custom;
|
||||
VipsImage *image;
|
||||
|
||||
if( VIPS_INIT( NULL ) )
|
||||
@ -120,11 +120,14 @@ main( int argc, char **argv )
|
||||
(char **) &my_input.contents, &my_input.length, NULL ) )
|
||||
vips_error_exit( "unable to load from %s", my_input.filename );
|
||||
|
||||
streamiu = vips_streamiu_new();
|
||||
g_signal_connect( streamiu, "seek", G_CALLBACK( seek_cb ), &my_input );
|
||||
g_signal_connect( streamiu, "read", G_CALLBACK( read_cb ), &my_input );
|
||||
source_custom = vips_source_custom_new();
|
||||
g_signal_connect( source_custom, "seek",
|
||||
G_CALLBACK( seek_cb ), &my_input );
|
||||
g_signal_connect( source_custom, "read",
|
||||
G_CALLBACK( read_cb ), &my_input );
|
||||
|
||||
if( !(image = vips_image_new_from_stream( VIPS_STREAMI( streamiu ), "",
|
||||
if( !(image = vips_image_new_from_source(
|
||||
VIPS_SOURCE( source_custom ), "",
|
||||
"access", VIPS_ACCESS_SEQUENTIAL,
|
||||
NULL )) )
|
||||
vips_error_exit( NULL );
|
||||
@ -136,19 +139,19 @@ main( int argc, char **argv )
|
||||
O_WRONLY | O_CREAT | O_TRUNC, 0644 )) == -1 )
|
||||
vips_error_exit( "unable to save to %s", my_output.filename );
|
||||
|
||||
streamou = vips_streamou_new();
|
||||
g_signal_connect( streamou, "write",
|
||||
target_custom = vips_target_custom_new();
|
||||
g_signal_connect( target_custom, "write",
|
||||
G_CALLBACK( write_cb ), &my_output );
|
||||
g_signal_connect( streamou, "finish",
|
||||
g_signal_connect( target_custom, "finish",
|
||||
G_CALLBACK( finish_cb ), &my_output );
|
||||
|
||||
if( vips_image_write_to_stream( image, ".png",
|
||||
VIPS_STREAMO( streamou ), NULL ) )
|
||||
if( vips_image_write_to_target( image, ".png",
|
||||
VIPS_TARGET( target_custom ), NULL ) )
|
||||
vips_error_exit( NULL );
|
||||
|
||||
VIPS_UNREF( image );
|
||||
VIPS_UNREF( streamiu );
|
||||
VIPS_UNREF( streamou );
|
||||
VIPS_UNREF( source_custom );
|
||||
VIPS_UNREF( target_custom );
|
||||
|
||||
return( 0 );
|
||||
}
|
@ -8,7 +8,7 @@ set -e
|
||||
. ./variables.sh
|
||||
|
||||
if test_supported jpegload_stream; then
|
||||
./test_streams $image $tmp/x.png
|
||||
./test_connections $image $tmp/x.png
|
||||
|
||||
# test max difference < 10
|
||||
test_difference $image $tmp/x.png 10
|
@ -31,7 +31,7 @@ count_files( const char *dirname )
|
||||
int
|
||||
main( int argc, char **argv )
|
||||
{
|
||||
VipsStreami *streami;
|
||||
VipsSource *source;
|
||||
VipsImage *image, *x;
|
||||
char fd_dir[256];
|
||||
int n_files;
|
||||
@ -57,9 +57,9 @@ main( int argc, char **argv )
|
||||
/* Opening an image should read the header, then close the fd.
|
||||
*/
|
||||
printf( "** seq open ..\n" );
|
||||
if( !(streami = vips_streami_new_from_file( argv[1] )) )
|
||||
if( !(source = vips_source_new_from_file( argv[1] )) )
|
||||
vips_error_exit( NULL );
|
||||
if( !(image = vips_image_new_from_stream( streami, "",
|
||||
if( !(image = vips_image_new_from_source( source, "",
|
||||
"access", VIPS_ACCESS_SEQUENTIAL,
|
||||
NULL )) )
|
||||
vips_error_exit( NULL );
|
||||
@ -95,7 +95,7 @@ main( int argc, char **argv )
|
||||
*/
|
||||
printf( "** unref ..\n" );
|
||||
g_object_unref( image );
|
||||
g_object_unref( streami );
|
||||
g_object_unref( source );
|
||||
printf( "** shutdown ..\n" );
|
||||
vips_shutdown();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user