rename parent/child as upstream/downstream

This commit is contained in:
John Cupitt 2010-03-08 17:52:32 +00:00
parent 6ed775b817
commit a3456511b6
7 changed files with 39 additions and 59 deletions

View File

@ -26,6 +26,7 @@
im_fastlineuser() is terrible im_fastlineuser() is terrible
- instead, users of the inplace operations need to call im_invalidate() at the - instead, users of the inplace operations need to call im_invalidate() at the
end of a set of paint actions to trigger an update end of a set of paint actions to trigger an update
- parent/child -> upstream/downstream in DAG
15/1/10 started 7.21.1 15/1/10 started 7.21.1
- added "written" callbacks, used to implement write to non-vips formats - added "written" callbacks, used to implement write to non-vips formats

18
TODO
View File

@ -1,21 +1,3 @@
- we use parent/child a lot, but it's confusing
imagine building the pipeline
A + B -> C
we create A, we create B, we create C, we call im_add ... C is the parent
of A and B, since parents have many children (see comment in image.h for
GSList *parents)
however, we make A and B before C, and pixels flow from them to C, so they
seem older, argh
change name scheme from parent/child to upstream/downstream, so A and B are
upstream of C, C is downstream of A and B
clearer expression of arrow direction in DAG
- add a dependency on the icc-profiles package - add a dependency on the icc-profiles package
the vips load/save ops need to search the icc-profile dir the vips load/save ops need to search the icc-profile dir

View File

@ -195,18 +195,16 @@ typedef struct _VipsImage {
*/ */
GSList *windows; GSList *windows;
/* Parent/child relationships, built from args to im_demand_hint(). /* Upstream/downstream relationships, built from args to
* We use these to invalidate pixel buffers on im_invalidate(). Use * im_demand_hint().
* 'serial' to spot circular dependencies.
* *
* Parents are later in the tree, so it's child1 + child2 -> parent, * We use these to invalidate downstream pixel buffers on
* for example. On im_invalidate(), we dispose the caches on all * im_invalidate(). Use 'serial' to spot circular dependencies.
* parents of an image.
* *
* See also hint_set below. * See also hint_set below.
*/ */
GSList *parents; GSList *upstream;
GSList *children; GSList *downstream;
int serial; int serial;
/* Keep a list of recounted GValue strings so we can share hist /* Keep a list of recounted GValue strings so we can share hist
@ -236,8 +234,8 @@ typedef struct _VipsImage {
/* Set this when im_demand_hint_array() is called, and check in any /* Set this when im_demand_hint_array() is called, and check in any
* operation that will demand pixels from the image. * operation that will demand pixels from the image.
* *
* We use im_demand_hint_array() to build the tree of parent/child * We use im_demand_hint_array() to build the tree of
* relationships, so it's a mandatory thing. * upstream/downstream relationships, so it's a mandatory thing.
*/ */
gboolean hint_set; gboolean hint_set;

View File

@ -134,7 +134,6 @@ typedef enum {
IMAGE *im__convert_saveable( IMAGE *in, IMAGE *im__convert_saveable( IMAGE *in,
im__saveable_t saveable, gboolean sixteen ); im__saveable_t saveable, gboolean sixteen );
void im__link_make( IMAGE *parent, IMAGE *child );
void im__link_break_all( IMAGE *im ); void im__link_break_all( IMAGE *im );
void *im__link_map( IMAGE *im, VSListMap2Fn fn, void *a, void *b ); void *im__link_map( IMAGE *im, VSListMap2Fn fn, void *a, void *b );

View File

@ -171,7 +171,7 @@ im__close( IMAGE *im )
im->generate = NULL; im->generate = NULL;
im->stop = NULL; im->stop = NULL;
/* No more parent/child links. /* No more upstream/downstream links.
*/ */
im__link_break_all( im ); im__link_break_all( im );

View File

@ -14,6 +14,8 @@
* - gtkdoc comments * - gtkdoc comments
* 5/3/10 * 5/3/10
* - move link maintenance to im_demand_hint * - move link maintenance to im_demand_hint
* 8/3/10
* - rename parent/child as downstream/upstream, much clearer!
*/ */
/* /*
@ -66,48 +68,46 @@
*/ */
#define MAX_IMAGES (1000) #define MAX_IMAGES (1000)
/* Make a parent/child link. child is one of parent's inputs. /* Make a upstream/downstream link. upstream is one of downstream's inputs.
*/ */
void static void
im__link_make( IMAGE *parent, IMAGE *child ) im__link_make( IMAGE *im_up, IMAGE *im_down )
{ {
g_assert( parent ); g_assert( im_up );
g_assert( child ); g_assert( im_down );
parent->children = g_slist_prepend( parent->children, child ); im_up->downstream = g_slist_prepend( im_up->downstream, im_down );
child->parents = g_slist_prepend( child->parents, parent ); im_down->upstream = g_slist_prepend( im_down->downstream, im_up );
/* Propogate the progress indicator. /* Propogate the progress indicator.
*/ */
if( child->progress && !parent->progress ) if( im_up->progress && !im_down->progress )
parent->progress = child->progress; im_down->progress = im_up->progress;
} }
/* Break link. child is one of parent's inputs.
*/
static void * static void *
im__link_break( IMAGE *parent, IMAGE *child ) im__link_break( IMAGE *im_up, IMAGE *im_down )
{ {
g_assert( parent ); g_assert( im_up );
g_assert( child ); g_assert( im_down );
g_assert( g_slist_find( parent->children, child ) ); g_assert( g_slist_find( im_up->downstream, im_down ) );
g_assert( g_slist_find( child->parents, parent ) ); g_assert( g_slist_find( im_down->upstream, im_up ) );
parent->children = g_slist_remove( parent->children, child ); im_up->downstream = g_slist_remove( im_up->downstream, im_down );
child->parents = g_slist_remove( child->parents, parent ); im_down->upstream = g_slist_remove( im_down->upstream, im_up );
/* Unlink the progress chain. /* Unlink the progress chain.
*/ */
if( parent->progress && parent->progress == child->progress ) if( im_down->progress && im_down->progress == im_up->progress )
parent->progress = NULL; im_down->progress = NULL;
return( NULL ); return( NULL );
} }
static void * static void *
im__link_break_rev( IMAGE *child, IMAGE *parent ) im__link_break_rev( IMAGE *im_down, IMAGE *im_up )
{ {
return( im__link_break( parent, child ) ); return( im__link_break( im_up, im_down ) );
} }
/* An IMAGE is going ... break all links. /* An IMAGE is going ... break all links.
@ -115,9 +115,9 @@ im__link_break_rev( IMAGE *child, IMAGE *parent )
void void
im__link_break_all( IMAGE *im ) im__link_break_all( IMAGE *im )
{ {
im_slist_map2( im->parents, im_slist_map2( im->upstream,
(VSListMap2Fn) im__link_break, im, NULL ); (VSListMap2Fn) im__link_break, im, NULL );
im_slist_map2( im->children, im_slist_map2( im->downstream,
(VSListMap2Fn) im__link_break_rev, im, NULL ); (VSListMap2Fn) im__link_break_rev, im, NULL );
} }
@ -135,11 +135,11 @@ im__link_mapp( IMAGE *im, VSListMap2Fn fn, int *serial, void *a, void *b )
if( (res = fn( im, a, b )) ) if( (res = fn( im, a, b )) )
return( res ); return( res );
return( im_slist_map4( im->parents, return( im_slist_map4( im->downstream,
(VSListMap4Fn) im__link_mapp, fn, serial, a, b ) ); (VSListMap4Fn) im__link_mapp, fn, serial, a, b ) );
} }
/* Apply a function to an image and all it's parents, direct and indirect. /* Apply a function to an image and all downstream images, direct and indirect.
*/ */
void * void *
im__link_map( IMAGE *im, VSListMap2Fn fn, void *a, void *b ) im__link_map( IMAGE *im, VSListMap2Fn fn, void *a, void *b )
@ -217,7 +217,7 @@ im_demand_hint_array( IMAGE *im, VipsDemandStyle hint, IMAGE **in )
/* im depends on all these ims. /* im depends on all these ims.
*/ */
for( i = 0; i < len; i++ ) for( i = 0; i < len; i++ )
im__link_make( im, in[i] ); im__link_make( in[i], im );
/* Set a flag on the image to say we remember to call this thing. /* Set a flag on the image to say we remember to call this thing.
* im_generate() and friends check this. * im_generate() and friends check this.

View File

@ -161,8 +161,8 @@ im_init( const char *filename )
im->windows = NULL; im->windows = NULL;
im->parents = NULL; im->upstream = NULL;
im->children = NULL; im->downstream = NULL;
im->serial = 0; im->serial = 0;
im->history_list = NULL; im->history_list = NULL;