amke vips_cache() a vips8 operation
This commit is contained in:
parent
c04458c7ce
commit
a5b3eb2040
@ -68,6 +68,7 @@
|
||||
- support gobject-introspection
|
||||
- new Python binding based on gobject-introspection
|
||||
- only spot options at the end of arg strings
|
||||
- add vips_cache() as a vips8 operator
|
||||
|
||||
12/10/11 started 7.26.6
|
||||
- NOCACHE was not being set correctly on OS X causing performance
|
||||
|
10
TODO
10
TODO
@ -24,7 +24,6 @@
|
||||
|
||||
|
||||
|
||||
|
||||
- magickload is broken
|
||||
|
||||
$ vips magickload healthygirl.jpg x.v
|
||||
@ -42,8 +41,6 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
- how about
|
||||
|
||||
vips max add[babe.jpg,babe2.jpg]
|
||||
@ -61,13 +58,10 @@
|
||||
|
||||
|
||||
|
||||
- see vips_image_cache(): it currently writes to @out allocated by its caller
|
||||
|
||||
should this be called vips_image_write_cache()? or wrapped in the style
|
||||
of vips_copy()?
|
||||
|
||||
- make an argb coding type, add to nip2 and known coding
|
||||
|
||||
see openslide
|
||||
|
||||
- nip2 should use zooming support, if possible
|
||||
|
||||
- transform_g_string_array_image() can't handle quoted strings, so filenames
|
||||
|
@ -4,6 +4,7 @@ libconversion_la_SOURCES = \
|
||||
conversion.c \
|
||||
conversion.h \
|
||||
tilecache.c \
|
||||
cache.c \
|
||||
copy.c \
|
||||
embed.c \
|
||||
flip.c \
|
||||
|
184
libvips/conversion/cache.c
Normal file
184
libvips/conversion/cache.c
Normal file
@ -0,0 +1,184 @@
|
||||
/* vips_sink_screen() as an operation.
|
||||
*
|
||||
* 13/1/12
|
||||
* - from tilecache.c
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
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 cache 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>
|
||||
|
||||
#include "conversion.h"
|
||||
|
||||
/* Lower and upper bounds for tile cache size. Choose an exact number based on
|
||||
* tile size.
|
||||
*/
|
||||
#define VIPS_MAX_TILE_CACHE (250)
|
||||
#define VIPS_MIN_TILE_CACHE (5)
|
||||
|
||||
typedef struct _VipsCache {
|
||||
VipsConversion parent_instance;
|
||||
|
||||
VipsImage *in;
|
||||
int tile_width;
|
||||
int tile_height;
|
||||
int max_tiles;
|
||||
} VipsCache;
|
||||
|
||||
typedef VipsConversionClass VipsCacheClass;
|
||||
|
||||
G_DEFINE_TYPE( VipsCache, vips_cache, VIPS_TYPE_CONVERSION );
|
||||
|
||||
static int
|
||||
vips_cache_build( VipsObject *object )
|
||||
{
|
||||
VipsConversion *conversion = VIPS_CONVERSION( object );
|
||||
VipsCache *cache = (VipsCache *) object;
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_cache_build\n" );
|
||||
|
||||
if( VIPS_OBJECT_CLASS( vips_cache_parent_class )->build( object ) )
|
||||
return( -1 );
|
||||
|
||||
if( vips_sink_screen( cache->in, conversion->out, NULL,
|
||||
cache->tile_width, cache->tile_height, cache->max_tiles,
|
||||
0, NULL, NULL ) )
|
||||
return( -1 );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static void
|
||||
vips_cache_class_init( VipsCacheClass *class )
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS( class );
|
||||
VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS( class );
|
||||
|
||||
VIPS_DEBUG_MSG( "vips_cache_class_init\n" );
|
||||
|
||||
gobject_class->set_property = vips_object_set_property;
|
||||
gobject_class->get_property = vips_object_get_property;
|
||||
|
||||
vobject_class->nickname = "cache";
|
||||
vobject_class->description = _( "cache an image" );
|
||||
vobject_class->build = vips_cache_build;
|
||||
|
||||
VIPS_ARG_IMAGE( class, "in", 1,
|
||||
_( "Input" ),
|
||||
_( "Input image" ),
|
||||
VIPS_ARGUMENT_REQUIRED_INPUT,
|
||||
G_STRUCT_OFFSET( VipsCache, in ) );
|
||||
|
||||
VIPS_ARG_INT( class, "tile_width", 3,
|
||||
_( "Tile width" ),
|
||||
_( "Tile width in pixels" ),
|
||||
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||
G_STRUCT_OFFSET( VipsCache, tile_width ),
|
||||
1, 1000000, 128 );
|
||||
|
||||
VIPS_ARG_INT( class, "tile_height", 3,
|
||||
_( "Tile height" ),
|
||||
_( "Tile height in pixels" ),
|
||||
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||
G_STRUCT_OFFSET( VipsCache, tile_height ),
|
||||
1, 1000000, 128 );
|
||||
|
||||
VIPS_ARG_INT( class, "max_tiles", 3,
|
||||
_( "Max tiles" ),
|
||||
_( "Maximum number of tiles to cache" ),
|
||||
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||
G_STRUCT_OFFSET( VipsCache, max_tiles ),
|
||||
-1, 1000000, 1000 );
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
vips_cache_init( VipsCache *cache )
|
||||
{
|
||||
/* By default, enough pixels for two 1920 x 1080 displays.
|
||||
*/
|
||||
cache->tile_width = 128;
|
||||
cache->tile_height = 128;
|
||||
cache->max_tiles = 250;
|
||||
}
|
||||
|
||||
/**
|
||||
* vips_cache:
|
||||
* @in: input image
|
||||
* @out: output image
|
||||
* @...: %NULL-terminated list of optional named arguments
|
||||
*
|
||||
* Optional arguments:
|
||||
*
|
||||
* @tile_width: width of tiles in cache
|
||||
* @tile_height: height of tiles in cache
|
||||
* @max_tiles: maximum number of tiles to cache
|
||||
*
|
||||
* This operation behaves rather like vips_copy() between images
|
||||
* @in and @out, except that it keeps a cache of computed pixels.
|
||||
* This cache is made of up to @max_tiles tiles (a value of -1
|
||||
* means any number of tiles), and each tile is of size @tile_width
|
||||
* by @tile_height pixels. By default it will cache 250 128 x 128 pixel tiles,
|
||||
* enough for two 1920 x 1080 images.
|
||||
*
|
||||
* This operation is a thin wrapper over vips_sink_screen(), see the
|
||||
* documentation for that operation for details.
|
||||
*
|
||||
* It uses a set of background threads to calculate pixels and the various
|
||||
* active cache operations coordinate so as not to overwhelm your system.
|
||||
*
|
||||
* See also: vips_tilecache().
|
||||
*
|
||||
* Returns: 0 on success, -1 on error.
|
||||
*/
|
||||
int
|
||||
vips_cache( VipsImage *in, VipsImage **out, ... )
|
||||
{
|
||||
va_list ap;
|
||||
int result;
|
||||
|
||||
va_start( ap, out );
|
||||
result = vips_call_split( "cache", ap, in, out );
|
||||
va_end( ap );
|
||||
|
||||
return( result );
|
||||
}
|
@ -105,6 +105,7 @@ vips_conversion_operation_init( void )
|
||||
{
|
||||
extern GType vips_copy_get_type( void );
|
||||
extern GType vips_tile_cache_get_type( void );
|
||||
extern GType vips_cache_get_type( void );
|
||||
extern GType vips_embed_get_type( void );
|
||||
extern GType vips_flip_get_type( void );
|
||||
extern GType vips_insert_get_type( void );
|
||||
@ -122,6 +123,7 @@ vips_conversion_operation_init( void )
|
||||
|
||||
vips_copy_get_type();
|
||||
vips_tile_cache_get_type();
|
||||
vips_cache_get_type();
|
||||
vips_embed_get_type();
|
||||
vips_flip_get_type();
|
||||
vips_insert_get_type();
|
||||
|
@ -13,7 +13,7 @@
|
||||
* - gtkdoc
|
||||
* 12/12/10
|
||||
* - use im_prepare_to() and avoid making a sequence for every cache tile
|
||||
* 5/12/12
|
||||
* 5/12/11
|
||||
* - rework as a class
|
||||
*/
|
||||
|
||||
|
@ -419,35 +419,6 @@ dupims( IMAGE *out, IMAGE **in )
|
||||
return( new );
|
||||
}
|
||||
|
||||
/**
|
||||
* im_wrapmany_fn:
|
||||
* @in: %NULL-terminated array of input buffers
|
||||
* @out: write processed pixels here
|
||||
* @width: number of pixels in buffer
|
||||
* @a: user data
|
||||
* @b: user data
|
||||
*
|
||||
* Given an array of buffers of input pixels, write a buffer of output pixels.
|
||||
*/
|
||||
|
||||
/**
|
||||
* im_wrapmany:
|
||||
* @in: %NULL-terminated array of input images
|
||||
* @out: image to generate
|
||||
* @fn: buffer-processing function
|
||||
* @a: user data
|
||||
* @b: user data
|
||||
*
|
||||
* Wrap-up a buffer processing function as a PIO VIPS function.
|
||||
*
|
||||
* Given a NULL-terminated list of input images all of the same size, an
|
||||
* output image and a buffer processing function, make a PIO image processing
|
||||
* operation.
|
||||
*
|
||||
* See also: im_wrapone(), im_wraptwo(), vips_image_generate().
|
||||
*
|
||||
* Returns: 0 on success, or -1 on error.
|
||||
*/
|
||||
int
|
||||
im_wrapmany( IMAGE **in, IMAGE *out, im_wrapmany_fn fn, void *a, void *b )
|
||||
{
|
||||
@ -505,35 +476,6 @@ wrapone_gen( void **ins, void *out, int width, Bundle *bun, void *dummy )
|
||||
((im_wrapone_fn) (bun->fn)) (ins[0], out, width, bun->a, bun->b );
|
||||
}
|
||||
|
||||
/**
|
||||
* im_wrapone_fn:
|
||||
* @in: input pixels
|
||||
* @out: write processed pixels here
|
||||
* @width: number of pixels in buffer
|
||||
* @a: user data
|
||||
* @b: user data
|
||||
*
|
||||
* Given a buffer of input pixels, write a buffer of output pixels.
|
||||
*/
|
||||
|
||||
/**
|
||||
* im_wrapone:
|
||||
* @in: input image
|
||||
* @out: image to generate
|
||||
* @fn: buffer-processing function
|
||||
* @a: user data
|
||||
* @b: user data
|
||||
*
|
||||
* Wrap-up a buffer processing function as a PIO VIPS function.
|
||||
*
|
||||
* Given an input image, an
|
||||
* output image and a buffer processing function, make a PIO image processing
|
||||
* operation.
|
||||
*
|
||||
* See also: im_wrapmany(), im_wraptwo(), vips_image_generate().
|
||||
*
|
||||
* Returns: 0 on success, or -1 on error.
|
||||
*/
|
||||
int
|
||||
im_wrapone( IMAGE *in, IMAGE *out, im_wrapone_fn fn, void *a, void *b )
|
||||
{
|
||||
@ -559,37 +501,6 @@ wraptwo_gen( void **ins, void *out, int width, Bundle *bun, void *dummy )
|
||||
width, bun->a, bun->b );
|
||||
}
|
||||
|
||||
/**
|
||||
* im_wraptwo_fn:
|
||||
* @in1: input pixels from image 1
|
||||
* @in2: input pixels from image 2
|
||||
* @out: write processed pixels here
|
||||
* @width: number of pixels in buffer
|
||||
* @a: user data
|
||||
* @b: user data
|
||||
*
|
||||
* Given a pair of buffers of input pixels, write a buffer of output pixels.
|
||||
*/
|
||||
|
||||
/**
|
||||
* im_wraptwo:
|
||||
* @in1: first input image
|
||||
* @in2: second input image
|
||||
* @out: image to generate
|
||||
* @fn: buffer-processing function
|
||||
* @a: user data
|
||||
* @b: user data
|
||||
*
|
||||
* Wrap-up a buffer processing function as a PIO VIPS function.
|
||||
*
|
||||
* Given a pair of input images of the same size, an
|
||||
* output image and a buffer processing function, make a PIO image processing
|
||||
* operation.
|
||||
*
|
||||
* See also: im_wrapone(), im_wrapmany(), vips_image_generate().
|
||||
*
|
||||
* Returns: 0 on success, or -1 on error.
|
||||
*/
|
||||
int
|
||||
im_wraptwo( IMAGE *in1, IMAGE *in2, IMAGE *out,
|
||||
im_wraptwo_fn fn, void *a, void *b )
|
||||
@ -2166,3 +2077,10 @@ im_ri2c( IMAGE *in1, IMAGE *in2, IMAGE *out )
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
int
|
||||
im_cache( VipsImage *in, VipsImage *out,
|
||||
int width, int height, int max )
|
||||
{
|
||||
return( vips_sink_screen( in, out, NULL,
|
||||
width, height, max, 0, NULL, NULL ) );
|
||||
}
|
||||
|
@ -139,6 +139,9 @@ int vips_copy( VipsImage *in, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_tilecache( VipsImage *in, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
int vips_cache( VipsImage *in, VipsImage **out, ... )
|
||||
__attribute__((sentinel));
|
||||
|
||||
int vips_embed( VipsImage *in, VipsImage **out,
|
||||
int x, int y, int width, int height, ... )
|
||||
__attribute__((sentinel));
|
||||
|
@ -56,8 +56,6 @@ int vips_sink_screen( VipsImage *in, VipsImage *out, VipsImage *mask,
|
||||
int tile_width, int tile_height, int max_tiles,
|
||||
int priority,
|
||||
VipsSinkNotify notify, void *a );
|
||||
int vips_image_cache( VipsImage *in, VipsImage *out,
|
||||
int width, int height, int max );
|
||||
|
||||
int vips_sink_memory( VipsImage *im );
|
||||
|
||||
|
@ -119,7 +119,6 @@ int vips__write_header_bytes( VipsImage *im, unsigned char *to );
|
||||
|
||||
extern GMutex *vips__global_lock;
|
||||
|
||||
|
||||
int vips__formatalike_vec( VipsImage **in, VipsImage **out, int n );
|
||||
int vips__sizealike_vec( VipsImage **in, VipsImage **out, int n );
|
||||
int vips__bandup( const char *domain, VipsImage *in, VipsImage **out, int n );
|
||||
|
@ -285,7 +285,8 @@ int im_generate( VipsImage *im,
|
||||
#define im_remapfilerw vips_remapfilerw
|
||||
|
||||
#define im__print_renders vips__print_renders
|
||||
#define im_cache vips_image_cache
|
||||
|
||||
int im_cache( IMAGE *in, IMAGE *out, int width, int height, int max );
|
||||
|
||||
#define IM_FREEF( F, S ) \
|
||||
G_STMT_START { \
|
||||
|
@ -1124,11 +1124,3 @@ vips__print_renders( void )
|
||||
#endif /*VIPS_DEBUG_AMBER*/
|
||||
printf( "%d dirty renders\n", g_slist_length( render_dirty_all ) );
|
||||
}
|
||||
|
||||
int
|
||||
vips_image_cache( VipsImage *in, VipsImage *out,
|
||||
int width, int height, int max )
|
||||
{
|
||||
return( vips_sink_screen( in, out, NULL,
|
||||
width, height, max, 0, NULL, NULL ) );
|
||||
}
|
||||
|
@ -105,7 +105,6 @@ G_DEFINE_BOXED_TYPE( VipsThing, vips_thing,
|
||||
(GBoxedCopyFunc) vips_thing_copy,
|
||||
(GBoxedFreeFunc) vips_thing_free );
|
||||
|
||||
|
||||
/**
|
||||
* SECTION: VipsArea
|
||||
* @short_description: an area of memory
|
||||
|
Loading…
Reference in New Issue
Block a user