rename parent/child as upstream/downstream
This commit is contained in:
parent
6ed775b817
commit
a3456511b6
@ -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
18
TODO
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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 );
|
||||||
|
|
||||||
|
@ -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 );
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user