amke vips_cache() a vips8 operation
This commit is contained in:
parent
c04458c7ce
commit
a5b3eb2040
@ -68,6 +68,7 @@
|
|||||||
- support gobject-introspection
|
- support gobject-introspection
|
||||||
- new Python binding based on gobject-introspection
|
- new Python binding based on gobject-introspection
|
||||||
- only spot options at the end of arg strings
|
- only spot options at the end of arg strings
|
||||||
|
- add vips_cache() as a vips8 operator
|
||||||
|
|
||||||
12/10/11 started 7.26.6
|
12/10/11 started 7.26.6
|
||||||
- NOCACHE was not being set correctly on OS X causing performance
|
- NOCACHE was not being set correctly on OS X causing performance
|
||||||
|
10
TODO
10
TODO
@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- magickload is broken
|
- magickload is broken
|
||||||
|
|
||||||
$ vips magickload healthygirl.jpg x.v
|
$ vips magickload healthygirl.jpg x.v
|
||||||
@ -42,8 +41,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- how about
|
- how about
|
||||||
|
|
||||||
vips max add[babe.jpg,babe2.jpg]
|
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
|
- make an argb coding type, add to nip2 and known coding
|
||||||
|
|
||||||
|
see openslide
|
||||||
|
|
||||||
- nip2 should use zooming support, if possible
|
- nip2 should use zooming support, if possible
|
||||||
|
|
||||||
- transform_g_string_array_image() can't handle quoted strings, so filenames
|
- transform_g_string_array_image() can't handle quoted strings, so filenames
|
||||||
|
@ -4,6 +4,7 @@ libconversion_la_SOURCES = \
|
|||||||
conversion.c \
|
conversion.c \
|
||||||
conversion.h \
|
conversion.h \
|
||||||
tilecache.c \
|
tilecache.c \
|
||||||
|
cache.c \
|
||||||
copy.c \
|
copy.c \
|
||||||
embed.c \
|
embed.c \
|
||||||
flip.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_copy_get_type( void );
|
||||||
extern GType vips_tile_cache_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_embed_get_type( void );
|
||||||
extern GType vips_flip_get_type( void );
|
extern GType vips_flip_get_type( void );
|
||||||
extern GType vips_insert_get_type( void );
|
extern GType vips_insert_get_type( void );
|
||||||
@ -122,6 +123,7 @@ vips_conversion_operation_init( void )
|
|||||||
|
|
||||||
vips_copy_get_type();
|
vips_copy_get_type();
|
||||||
vips_tile_cache_get_type();
|
vips_tile_cache_get_type();
|
||||||
|
vips_cache_get_type();
|
||||||
vips_embed_get_type();
|
vips_embed_get_type();
|
||||||
vips_flip_get_type();
|
vips_flip_get_type();
|
||||||
vips_insert_get_type();
|
vips_insert_get_type();
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
* - gtkdoc
|
* - gtkdoc
|
||||||
* 12/12/10
|
* 12/12/10
|
||||||
* - use im_prepare_to() and avoid making a sequence for every cache tile
|
* - use im_prepare_to() and avoid making a sequence for every cache tile
|
||||||
* 5/12/12
|
* 5/12/11
|
||||||
* - rework as a class
|
* - rework as a class
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -419,35 +419,6 @@ dupims( IMAGE *out, IMAGE **in )
|
|||||||
return( new );
|
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
|
int
|
||||||
im_wrapmany( IMAGE **in, IMAGE *out, im_wrapmany_fn fn, void *a, void *b )
|
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) (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
|
int
|
||||||
im_wrapone( IMAGE *in, IMAGE *out, im_wrapone_fn fn, void *a, void *b )
|
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 );
|
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
|
int
|
||||||
im_wraptwo( IMAGE *in1, IMAGE *in2, IMAGE *out,
|
im_wraptwo( IMAGE *in1, IMAGE *in2, IMAGE *out,
|
||||||
im_wraptwo_fn fn, void *a, void *b )
|
im_wraptwo_fn fn, void *a, void *b )
|
||||||
@ -2166,3 +2077,10 @@ im_ri2c( IMAGE *in1, IMAGE *in2, IMAGE *out )
|
|||||||
return( 0 );
|
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));
|
__attribute__((sentinel));
|
||||||
int vips_tilecache( VipsImage *in, VipsImage **out, ... )
|
int vips_tilecache( VipsImage *in, VipsImage **out, ... )
|
||||||
__attribute__((sentinel));
|
__attribute__((sentinel));
|
||||||
|
int vips_cache( VipsImage *in, VipsImage **out, ... )
|
||||||
|
__attribute__((sentinel));
|
||||||
|
|
||||||
int vips_embed( VipsImage *in, VipsImage **out,
|
int vips_embed( VipsImage *in, VipsImage **out,
|
||||||
int x, int y, int width, int height, ... )
|
int x, int y, int width, int height, ... )
|
||||||
__attribute__((sentinel));
|
__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 tile_width, int tile_height, int max_tiles,
|
||||||
int priority,
|
int priority,
|
||||||
VipsSinkNotify notify, void *a );
|
VipsSinkNotify notify, void *a );
|
||||||
int vips_image_cache( VipsImage *in, VipsImage *out,
|
|
||||||
int width, int height, int max );
|
|
||||||
|
|
||||||
int vips_sink_memory( VipsImage *im );
|
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;
|
extern GMutex *vips__global_lock;
|
||||||
|
|
||||||
|
|
||||||
int vips__formatalike_vec( VipsImage **in, VipsImage **out, int n );
|
int vips__formatalike_vec( VipsImage **in, VipsImage **out, int n );
|
||||||
int vips__sizealike_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 );
|
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_remapfilerw vips_remapfilerw
|
||||||
|
|
||||||
#define im__print_renders vips__print_renders
|
#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 ) \
|
#define IM_FREEF( F, S ) \
|
||||||
G_STMT_START { \
|
G_STMT_START { \
|
||||||
|
@ -1124,11 +1124,3 @@ vips__print_renders( void )
|
|||||||
#endif /*VIPS_DEBUG_AMBER*/
|
#endif /*VIPS_DEBUG_AMBER*/
|
||||||
printf( "%d dirty renders\n", g_slist_length( render_dirty_all ) );
|
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,
|
(GBoxedCopyFunc) vips_thing_copy,
|
||||||
(GBoxedFreeFunc) vips_thing_free );
|
(GBoxedFreeFunc) vips_thing_free );
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION: VipsArea
|
* SECTION: VipsArea
|
||||||
* @short_description: an area of memory
|
* @short_description: an area of memory
|
||||||
|
Loading…
Reference in New Issue
Block a user