libvips builds

clean build, phew, try tools next
This commit is contained in:
John Cupitt 2011-03-04 16:14:13 +00:00
parent df0eab1f35
commit bb813a21b5
11 changed files with 536 additions and 216 deletions

View File

@ -715,58 +715,3 @@ im_flood_other( IMAGE *test, IMAGE *mark,
return( im_draw_flood_other( mark, test, x, y, serial, dout ) );
}
/**
* im_initdesc:
* @image: image to init
* @xsize: image width
* @ysize: image height
* @bands: image bands
* @bandbits: ignored, just here for compatibility
* @bandfmt: band format
* @coding: image coding
* @type: image type
* @xres: horizontal resolution, pixels per millimetre
* @yres: vertical resolution, pixels per millimetre
* @xo: x offset
* @yo: y offset
*
* A convenience function to set the header fields after creating an image.
* Normally you copy the fields from one of your input images with
* im_cp_desc() and then make
* any adjustments you need, but if you are creating an image from scratch,
* for example im_black() or im_jpeg2vips(), you do need to set all the
* fields yourself.
*
* See also: im_cp_desc().
*/
void
im_initdesc( IMAGE *image,
int xsize, int ysize, int bands, int bandbits,
VipsBandFmt bandfmt, VipsCoding coding, VipsType type,
float xres, float yres,
int xo, int yo )
{
image->Xsize = xsize;
image->Ysize = ysize;
image->Bands = bands;
/* bandbits is deprecated ... set to whatever the format requires.
*/
image->Bbits = im_bits_of_fmt( bandfmt );
image->BandFmt = bandfmt;
image->Coding = coding;
image->Type = type;
image->Xres = xres;
image->Yres = yres;
image->Xoffset = xo;
image->Yoffset = yo;
}
/* Just here for compat.
*/
int
im_close( VipsImage *image )
{
g_object_unref( image );
return( 0 );
}

View File

@ -4,7 +4,6 @@ pkginclude_HEADERS = \
arithmetic.h \
boolean.h \
buf.h \
callback.h \
check.h \
colour.h \
conversion.h \
@ -45,6 +44,7 @@ pkginclude_HEADERS = \
util.h \
version.h \
vector.h \
vips7compat.h \
vips.h
vipsc++.h:

View File

@ -229,8 +229,8 @@ typedef struct _VipsImage {
/* Upstream/downstream relationships, built from args to
* im_demand_hint().
*
* We use these to invalidate downstream pixel buffers on
* im_invalidate(). Use 'serial' to spot circular dependencies.
* We use these to invalidate downstream pixel buffers.
* Use 'serial' to spot circular dependencies.
*
* See also hint_set below.
*/
@ -289,7 +289,7 @@ typedef struct _VipsImageClass {
*/
void (*written)( VipsImage *image );
/* An image has been modified in some way and downstream caches all
/* An image has been modified in some way and caches all
* need dropping.
*/
void (*invalidate)( VipsImage *image );
@ -298,12 +298,12 @@ typedef struct _VipsImageClass {
GType vips_image_get_type( void );
extern const size_t vips__sizeof_bandfmt[];
extern const size_t vips__image_sizeof_bandformat[];
/* Pixel address calculation macros.
*/
#define VIPS_IMAGE_SIZEOF_ELEMENT( I ) \
(vips__sizeof_bandfmt[(I)->BandFmt])
(vips__image_sizeof_bandformat[(I)->BandFmt])
#define VIPS_IMAGE_SIZEOF_PEL( I ) \
(VIPS_IMAGE_SIZEOF_ELEMENT( I ) * (I)->Bands)
#define VIPS_IMAGE_SIZEOF_LINE( I ) \
@ -377,29 +377,15 @@ int vips_image_copy_fieldsv( VipsImage *out, VipsImage *in1, ... )
__attribute__((sentinel));
int vips_image_copy_fields( VipsImage *out, VipsImage *in );
#define vips_image_open_local( IM, NAME, MODE ) \
((IMAGE *) vips_local( (IM), \
(vips_construct_fn) im_open, (im_callback_fn) im_close, \
(void *) (NAME), (void *) (MODE), NULL ))
/* Strange double cast stops bogus warnings from gcc 4.1
*/
#define vips_image_open_local_array( IM, OUT, N, NAME, MODE ) \
(vips_local_array( (IM), (void **)((void*)(OUT)), (N),\
(im_construct_fn) im_open, (im_callback_fn) im_close, \
(void *) (NAME), (void *) (MODE), NULL ))
void vips_invalidate( VipsImage *im );
void vips_initdesc( VipsImage *image,
int xsize, int ysize, int bands, int bandbits,
void vips_image_init_fields( VipsImage *image,
int xsize, int ysize, int bands,
VipsBandFormat format, VipsCoding coding,
VipsInterpretation interpretation,
float xres, float yres,
int xo, int yo );
int vips_image_write_line( VipsImage *image, int ypos, PEL *linebuffer );
#ifdef __cplusplus
}
#endif /*__cplusplus*/

View File

@ -143,6 +143,10 @@ extern "C" {
#include <vips/deprecated.h>
#endif /*VIPS_ENABLE_DEPRECATED*/
#ifndef VIPS_DISABLE_VIPS7COMPAT
#include <vips/vips7compat.h>
#endif /*VIPS_DISABLE_VIPS7COMPAT*/
const char *vips_get_argv0( void );
int vips_init( const char *argv0 );
GOptionGroup *vips_get_option_group( void );

View File

@ -0,0 +1,215 @@
/* compat with the vips7 API
*
* 4/3/11
* - hacked up
*/
/*
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
*/
#ifndef VIPS_VIPS7COMPAT_H
#define VIPS_VIP7COMPATS_H
#ifdef __cplusplus
extern "C" {
#endif /*__cplusplus*/
/* Renamed types.
*/
#define IM_BANDFMT_NOTSET VIPS_FORMAT_NOTSET
#define IM_BANDFMT_UCHAR VIPS_FORMAT_UCHAR
#define IM_BANDFMT_CHAR VIPS_FORMAT_CHAR
#define IM_BANDFMT_USHORT VIPS_FORMAT_USHORT
#define IM_BANDFMT_SHORT VIPS_FORMAT_SHORT
#define IM_BANDFMT_UINT VIPS_FORMAT_UINT
#define IM_BANDFMT_INT VIPS_FORMAT_INT
#define IM_BANDFMT_FLOAT VIPS_FORMAT_FLOAT
#define IM_BANDFMT_COMPLEX VIPS_FORMAT_COMPLEX
#define IM_BANDFMT_DOUBLE VIPS_FORMAT_DOUBLE
#define IM_BANDFMT_DPCOMPLEX VIPS_FORMAT_DPCOMPLEX
#define IM_BANDFMT_LAST VIPS_FORMAT_LAST
#define VipsBandFmt VipsBandFormat
#define IM_SMALLTILE VIPS_DEMAND_STYLE_SMALLTILE
#define IM_FATSTRIP VIPS_DEMAND_STYLE_FATSTRIP
#define IM_THINSTRIP VIPS_DEMAND_STYLE_THINSTRIP
#define IM_ANY VIPS_DEMAND_STYLE_ANY
#define IM_CODING_NONE VIPS_CODING_NONE
#define IM_CODING_LABQ VIPS_CODING_LABQ
#define IM_CODING_RAD VIPS_CODING_RAD
#define IM_TYPE_MULTIBAND VIPS_INTERPRETATION_MULTIBAND
#define IM_TYPE_B_W VIPS_INTERPRETATION_B_W
#define IM_TYPE_HISTOGRAM VIPS_INTERPRETATION_HISTOGRAM
#define IM_TYPE_FOURIER VIPS_INTERPRETATION_FOURIER
#define IM_TYPE_XYZ VIPS_INTERPRETATION_XYZ
#define IM_TYPE_LAB VIPS_INTERPRETATION_LAB
#define IM_TYPE_CMYK VIPS_INTERPRETATION_CMYK
#define IM_TYPE_LABQ VIPS_INTERPRETATION_LABQ
#define IM_TYPE_RGB VIPS_INTERPRETATION_RGB
#define IM_TYPE_UCS VIPS_INTERPRETATION_UCS
#define IM_TYPE_LCH VIPS_INTERPRETATION_LCH
#define IM_TYPE_LABS VIPS_INTERPRETATION_LABS
#define IM_TYPE_sRGB VIPS_INTERPRETATION_sRGB
#define IM_TYPE_YXY VIPS_INTERPRETATION_YXY
#define IM_TYPE_RGB16 VIPS_INTERPRETATION_RGB16
#define IM_TYPE_GREY16 VIPS_INTERPRETATION_GREY16
#define VipsType VipsInterpretation
#define IMAGE VipsImage
#define REGION VipsRegion
/* Renamed macros.
*/
#define IM_MAX VIPS_MAX
#define IM_MIN VIPS_MIN
#define IM_RAD VIPS_RAD
#define IM_DEG VIPS_DEG
#define IM_PI VIPS_PI
#define IM_RINT VIPS_RINT
#define IM_NEW VIPS_NEW
#define IM_ARRAY VIPS_ARRAY
#define IM_FREE VIPS_FREE
#define IM_FREEF VIPS_FREEF
#define IM_NUMBER VIPS_NUMBER
#define IM_CLIP VIPS_CLIP
#define IM_CLIP_UCHAR VIPS_CLIP_UCHAR
#define IM_CLIP_CHAR VIPS_CLIP_CHAR
#define IM_CLIP_USHORT VIPS_CLIP_USHORT
#define IM_CLIP_SHORT VIPS_CLIP_SHORT
#define IM_CLIP_NONE VIPS_CLIP_NONE
#define IM_UNROLL VIPS_UNROLL
#define IM_SWAP VIPS_SWAP
#define IM_IMAGE_ADDR VIPS_IMAGE_ADDR
#define IM_IMAGE_N_ELEMENTS VIPS_IMAGE_N_ELEMENTS
#define IM_IMAGE_SIZEOF_ELEMENT VIPS_IMAGE_SIZEOF_ELEMENT
#define IM_IMAGE_SIZEOF_PEL VIPS_IMAGE_SIZEOF_PEL
#define IM_IMAGE_SIZEOF_LINE VIPS_IMAGE_SIZEOF_LINE
#define IM_REGION_LSKIP VIPS_REGION_LSKIP
#define IM_REGION_ADDR VIPS_REGION_ADDR
#define IM_REGION_ADDR_TOPLEFT VIPS_REGION_ADDR_TOPLEFT
#define IM_REGION_N_ELEMENTS VIPS_REGION_N_ELEMENTS
#define IM_REGION_SIZEOF_LINE VIPS_REGION_SIZEOF_LINE
/* Renamed externs.
*/
#define im__sizeof_bandfmt vips__image_sizeof_bandformat
/* Renamed functions.
*/
#define im_error vips_error
#define im_verror vips_verror
#define im_verror_system vips_verror_system
#define im_error_system vips_error_system
#define im_error_buffer vips_error_buffer
#define im_error_clear vips_error_clear
#define im_warn vips_warn
#define im_vwarn vips_vwarn
#define im_diag vips_diag
#define im_vdiag vips_vdiag
#define im_get_argv0 vips_get_argv0
#define im_version_string vips_version_string
#define im_version vips_version
#define im_cp_desc vips_image_copy_fields
#define im_cp_descv vips_image_copy_fieldsv
#define im_cp_desc_array vips_image_copy_fields_array
#define im_open vips_image_new_from_file
#define im_image vips_image_new_from_memory
#define im_binfile vips_image_new_from_file_raw
#define im__open_temp vips_image_new_disc_temp
#define im_invalidate vips_image_invalidate_all
#define im_initdesc( image, \
xsize, ysize, bands, bandbits, bandfmt, coding, \
type, xres, yres, xo, yo ) \
vips_image_init_fields( image, \
xsize, ysize, bands, bandfmt, coding, \
type, xres, yres, xo, yo )
#define im_writeline( Y, IM, P ) vips_image_write_line( IM, Y, P )
#define im_prepare vips_region_prepare
#define im_prepare_to vips_region_prepare_to
#define im_region_create vips_region_new
#define im_region_free g_object_unref
#define im_region_region vips_region_region
#define im_region_buffer vips_region_buffer
#define im_region_black vips_region_black
#define im_region_paint vips_region_paint
#define im__region_no_ownership vips__region_no_ownership
/* Compat functions.
*/
VipsImage *im_open_local( VipsImage *parent,
const char *filename, const char *mode );
int im_open_local_array( VipsImage *parent,
VipsImage **images, int n, const char *filename, const char *mode );
/* uncomment this when we remove the im_callback_fn from meta.h
typedef int (*im_callback_fn)( void *a, void *b );
*/
int im_add_callback( VipsImage *im,
const char *callback, im_callback_fn fn, void *a, void *b );
#define im_add_close_callback( IM, FN, A, B ) \
im_add_callback( IM, "close", FN, A, B )
#define im_add_postclose_callback( IM, FN, A, B ) \
im_add_callback( IM, "postclose", FN, A, B )
#define im_add_evalstart_callback( IM, FN, A, B ) \
im_add_callback( IM, "evalstart", FN, A, B )
#define im_add_evalend_callback( IM, FN, A, B ) \
im_add_callback( IM, "evalend", FN, A, B )
#define im_add_invalidate_callback( IM, FN, A, B ) \
im_add_callback( IM, "invalidate", FN, A, B )
#define im_bits_of_fmt( fmt ) (vips_format_sizeof( fmt ) << 3)
typedef void *(*im_construct_fn)( void *, void *, void * );
void *im_local( VipsImage *im,
im_construct_fn cons, im_callback_fn dest, void *a, void *b, void *c );
int im_local_array( VipsImage *im, void **out, int n,
im_construct_fn cons, im_callback_fn dest, void *a, void *b, void *c );
int im_close( VipsImage *im );
#ifdef __cplusplus
}
#endif /*__cplusplus*/
#endif /*VIPS_VIPS7COMPAT_H*/

View File

@ -22,7 +22,6 @@ libiofuncs_la_SOURCES = \
sinkdisc.c \
sink.c \
im_wrapmany.c \
im_writeline.c \
memory.c \
check.c \
package.c \
@ -36,6 +35,7 @@ libiofuncs_la_SOURCES = \
buf.c \
window.c \
vector.c \
vips7compat.c \
buffer.c
INCLUDES = -I${top_srcdir}/libvips/include @VIPS_CFLAGS@ @VIPS_INCLUDES@

View File

@ -231,8 +231,18 @@ im_incheck( IMAGE *im )
#ifdef DEBUG_IO
printf( "im_incheck: auto-rewind of %s\n", im->filename );
#endif/*DEBUG_IO*/
if( im__close( im ) ||
im_openin( im ) ||
/* Free any resources the image holds and reset to a base
* state.
*/
g_object_run_dispose( G_OBJECT( im ) );
/* And reopen .. recurse to get a mmaped image.
*/
g_object_set( im,
"mode", "r",
NULL );
if( vips_object_build( VIPS_OBJECT( im ) ) ||
im_incheck( im ) ) {
vips_error( "im_incheck",
_( "auto-rewind for %s failed" ),
@ -442,8 +452,16 @@ im_pincheck( IMAGE *im )
#ifdef DEBUG_IO
printf( "im_pincheck: auto-rewind of %s\n", im->filename );
#endif/*DEBUG_IO*/
if( im__close( im ) ||
im_openin( im ) ) {
/* Free any resources the image holds and reset to a base
* state.
*/
g_object_run_dispose( G_OBJECT( im ) );
g_object_set( im,
"mode", "r",
NULL );
if( vips_object_build( VIPS_OBJECT( im ) ) ) {
vips_error( "im_pincheck",
_( "auto-rewind for %s failed" ),
im->filename );

View File

@ -1,130 +0,0 @@
/* write a scanline
*
* Copyright: Nicos Dessipris
* Written on: 04/04/1990
* Modified on :
* 15/4/93 JC
* - support for partial images
* 13/12/93 JC
* - now triggers eval callbacks for the output image.
* 26/3/02 JC
* - better error messages
* 31/10/03 JC
* - stop early on kill
* 7/11/07
* - add eval start/stop
*/
/*
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /*HAVE_CONFIG_H*/
#include <vips/intl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif /*HAVE_UNISTD_H*/
#include <errno.h>
#ifdef HAVE_IO_H
#include <io.h>
#endif /*HAVE_IO_H*/
#include <vips/vips.h>
#include <vips/internal.h>
#include <vips/debug.h>
#ifdef WITH_DMALLOC
#include <dmalloc.h>
#endif /*WITH_DMALLOC*/
/**
* im_writeline:
* @image: image to write to
* @ypos: vertical position of scan-line to write
* @linebuffer: scanline of pixels
*
* Write a line of pixels to an image. This function must be called repeatedly
* with @ypos increasing from 0 to @YSize -
* @linebuffer must be IM_IMAGE_SIZEOF_LINE() bytes long.
*
* See also: im_setupout(), im_generate().
*
* Returns: 0 on success, or -1 on error.
*/
int
vips_image_write_line( VipsImage *image, int ypos, PEL *linebuffer )
{
int linesize = VIPS_IMAGE_SIZEOF_LINE( image );
/* Is this the start of eval?
*/
if( ypos == 0 )
vips_image_preeval( image );
/* Possible cases for output: FILE or SETBUF.
*/
switch( image->dtype ) {
case VIPS_IMAGE_SETBUF:
case VIPS_IMAGE_SETBUF_FOREIGN:
memcpy( VIPS_IMAGE_ADDR( image, 0, ypos ),
linebuffer, linesize );
break;
case VIPS_IMAGE_OPENOUT:
/* Don't use ypos for this.
*/
if( im__write( image->fd, linebuffer, linesize ) )
return( -1 );
break;
default:
vips_error( "im_writeline",
_( "unable to output to a %s image" ),
VIPS_ENUM_STRING( VIPS_TYPE_DEMAND_STYLE,
image->dtype ) );
return( -1 );
}
/* Trigger evaluation callbacks for this image.
*/
vips_image_eval( image, image->Xsize, 1 );
if( im__test_kill( image ) )
return( -1 );
/* Is this the end of eval?
*/
if( ypos == image->Ysize - 1 ) {
vips_image_posteval( image );
vips_image_written( image );
}
return( 0 );
}

View File

@ -1688,7 +1688,7 @@ vips_image_ispartial( VipsImage *image )
/* This is used by (eg.) IM_IMAGE_SIZEOF_ELEMENT() to calculate object
* size.
*/
const size_t vips_image__sizeof_bandformat[] = {
const size_t vips__image_sizeof_bandformat[] = {
sizeof( unsigned char ), /* VIPS_FORMAT_UCHAR */
sizeof( signed char ), /* VIPS_FORMAT_CHAR */
sizeof( unsigned short ), /* VIPS_FORMAT_USHORT */
@ -1709,7 +1709,7 @@ vips_format_sizeof( VipsBandFormat format )
return( (format < 0 || format > VIPS_FORMAT_DPCOMPLEX) ?
vips_error( "vips_format_sizeof",
_( "unknown band format %d" ), format ), -1 :
vips_image__sizeof_bandformat[format] );
vips__image_sizeof_bandformat[format] );
}
/**
@ -1833,5 +1833,126 @@ vips_image_copy_fields( IMAGE *out, IMAGE *in )
return( vips_image_copy_fieldsv( out, in, NULL ) );
}
int
vips_image_new_array( VipsImage *parent, VipsImage **images, int n )
{
int i;
for( i = 0; i < n; i++ )
if( !(images[i] = vips_image_new( "p" )) )
return( -1 );
return( 0 );
}
/**
* vips_image_init_fields:
* @image: image to init
* @xsize: image width
* @ysize: image height
* @bands: image bands
* @bandfmt: band format
* @coding: image coding
* @type: image type
* @xres: horizontal resolution, pixels per millimetre
* @yres: vertical resolution, pixels per millimetre
* @xo: x offset
* @yo: y offset
*
* A convenience function to set the header fields after creating an image.
* Normally you copy the fields from one of your input images with
* vips_image_copy_fields() and then make
* any adjustments you need, but if you are creating an image from scratch,
* for example im_black() or im_jpeg2vips(), you do need to set all the
* fields yourself.
*
* See also: vips_image_copy_fields().
*/
void
vips_image_init_fields( VipsImage *image,
int xsize, int ysize, int bands,
VipsBandFormat format, VipsCoding coding,
VipsInterpretation interpretation,
float xres, float yres,
int xo, int yo )
{
g_object_set( image,
"width", xsize,
"height", ysize,
"bands", bands,
"format", format,
NULL );
image->Coding = coding;
image->Type = interpretation;
image->Xres = xres;
image->Yres = yres;
image->Xoffset = xo;
image->Yoffset = yo;
}
/**
* vips_image_write_line:
* @image: image to write to
* @ypos: vertical position of scan-line to write
* @linebuffer: scanline of pixels
*
* Write a line of pixels to an image. This function must be called repeatedly
* with @ypos increasing from 0 to @YSize -
* @linebuffer must be IM_IMAGE_SIZEOF_LINE() bytes long.
*
* See also: im_setupout(), im_generate().
*
* Returns: 0 on success, or -1 on error.
*/
int
vips_image_write_line( VipsImage *image, int ypos, PEL *linebuffer )
{
int linesize = VIPS_IMAGE_SIZEOF_LINE( image );
/* Is this the start of eval?
*/
if( ypos == 0 )
vips_image_preeval( image );
/* Possible cases for output: FILE or SETBUF.
*/
switch( image->dtype ) {
case VIPS_IMAGE_SETBUF:
case VIPS_IMAGE_SETBUF_FOREIGN:
memcpy( VIPS_IMAGE_ADDR( image, 0, ypos ),
linebuffer, linesize );
break;
case VIPS_IMAGE_OPENOUT:
/* Don't use ypos for this.
*/
if( im__write( image->fd, linebuffer, linesize ) )
return( -1 );
break;
default:
vips_error( "im_writeline",
_( "unable to output to a %s image" ),
VIPS_ENUM_STRING( VIPS_TYPE_DEMAND_STYLE,
image->dtype ) );
return( -1 );
}
/* Trigger evaluation callbacks for this image.
*/
vips_image_eval( image, image->Xsize, 1 );
if( im__test_kill( image ) )
return( -1 );
/* Is this the end of eval?
*/
if( ypos == image->Ysize - 1 ) {
vips_image_posteval( image );
vips_image_written( image );
}
return( 0 );
}

View File

@ -1533,3 +1533,4 @@ im__temp_name( const char *format )
return( name );
}

View File

@ -0,0 +1,160 @@
/* compat stuff for vips7
*
* 4/3/11
* - hacked up
*/
/*
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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>
#include <string.h>
#include <vips/vips.h>
#include <vips/internal.h>
#include <vips/debug.h>
#ifdef WITH_DMALLOC
#include <dmalloc.h>
#endif /*WITH_DMALLOC*/
/* Just for compatibility. New code should use vips_object_local() directly.
*/
VipsImage *
im_open_local( VipsImage *parent,
const char *filename, const char *mode )
{
VipsImage *image;
if( !(image = vips_image_new_from_file( filename, mode )) )
return( NULL );
vips_object_local( parent, image );
return( image );
}
/* Just for compatibility. New code should use vips_image_new_array().
*/
int
im_open_local_array( VipsImage *parent,
VipsImage **images, int n,
const char *filename, const char *mode )
{
int i;
for( i = 0; i < n; i++ )
if( !(images[i] = im_open_local( parent, filename, mode )) )
return( -1 );
return( 0 );
}
typedef struct {
im_callback_fn fn;
void *a;
void *b;
} Callback;
static void
im_add_callback_cb( VipsImage *im, Callback *callback )
{
callback->fn( callback->a, callback->b );
}
int
im_add_callback( VipsImage *im,
const char *name, im_callback_fn fn, void *a, void *b )
{
Callback *callback;
if( !(callback = VIPS_NEW( im, Callback )) )
return( -1 );
callback->fn = fn;
callback->a = a;
callback->b = b;
g_signal_connect( im, name,
G_CALLBACK( im_add_callback_cb ), callback );
return( 0 );
}
/* Make something local to an image descriptor ... pass in a constructor
* and a destructor, plus three args.
*/
void *
im_local( IMAGE *im,
im_construct_fn cons, im_callback_fn dest, void *a, void *b, void *c )
{
void *obj;
if( !im ) {
im_error( "im_local", "%s", _( "NULL image descriptor" ) );
return( NULL );
}
if( !(obj = cons( a, b, c )) )
return( NULL );
if( im_add_close_callback( im, (im_callback_fn) dest, obj, a ) ) {
dest( obj, a );
return( NULL );
}
return( obj );
}
/* Make an array of things local to a descriptor ... eg. make 6 local temp
* images.
*/
int
im_local_array( IMAGE *im, void **out, int n,
im_construct_fn cons, im_callback_fn dest, void *a, void *b, void *c )
{
int i;
for( i = 0; i < n; i++ )
if( !(out[i] = im_local( im, cons, dest, a, b, c )) )
return( -1 );
return( 0 );
}
int
im_close( VipsImage *im )
{
g_object_unref( im );
return( 0 );
}