/* Header for the .desc file parser in im_global_balance() * * 1/11/01 JC * - cut from global_balance.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 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 */ /* Number of entries in spine of file name hash table. */ #define SYM_TAB_SIZE (113) typedef enum _JoinType JoinType; typedef struct _OverlapInfo OverlapInfo; typedef struct _JoinNode JoinNode; typedef struct _SymbolTable SymbolTable; /* Type of a transform function. */ typedef IMAGE *(*transform_fn)( JoinNode *, void * ); /* Join type. */ enum _JoinType { JOIN_LR, /* im_lrmerge join */ JOIN_TB, /* im_tbmerge join */ JOIN_LRROTSCALE, /* 1st oder lrmerge */ JOIN_TBROTSCALE, /* 1st oder tbmerge */ JOIN_CP, /* im_copy operation */ JOIN_LEAF /* Base file */ }; /* An overlap struct. Attach a list of these to each leaf, one for each of * the other leaves we touch. */ struct _OverlapInfo { JoinNode *node; /* The base node - we are on this list */ JoinNode *other; /* Node we overlap with */ Rect overlap; /* The overlap area */ DOUBLEMASK *nstats; /* Node's stats for overlap area */ DOUBLEMASK *ostats; /* Other's stats for overlap area */ }; /* Struct for a join node. */ struct _JoinNode { char *name; /* This file name */ JoinType type; /* What kind of join */ SymbolTable *st; /* Symbol table we are on */ int dirty; /* Used for circularity detection */ /* Params from join line in .desc file. */ double a, b; double dx, dy; int mwidth; /* Cumulative transform for this node. What our parents do to us. * cumtrn.area is position and size of us, thistrn.area is pos and * size of arg2. */ Transformation cumtrn; /* X-tras for LR/TB. thistrn is what we do to arg2. */ JoinNode *arg1; /* Left or up thing to join */ JoinNode *arg2; /* Right or down thing to join */ Transformation thistrn; /* Transformation for arg2 */ /* Special for leaves: all the join_nodes we overlap with, the * IMAGE for that file, and the index. */ GSList *overlaps; IMAGE *im; IMAGE *trnim; /* Transformed image .. used in 2nd pass */ int index; }; /* We need to keep a table of JoinNode, indexed by file name. Hash into one * of these from the name to get a pointer to the base of a list of JoinNode * which hash to that offset. */ struct _SymbolTable { GSList **table; /* Ptr to base of hash table */ int sz; /* Size of hash table */ IMAGE *im; /* Malloc relative to this */ int novl; /* Number of unique overlaps */ int nim; /* Number of leaf images */ int njoin; /* Number of join nodes */ JoinNode *root; /* Root of join tree */ JoinNode *leaf; /* Leaf nominated to be 1.000 */ double *fac; /* Correction factors */ }; IMAGE *im__global_open_image( SymbolTable *st, char *name ); SymbolTable *im__build_symtab( IMAGE *out, int sz ); int im__parse_desc( SymbolTable *st, IMAGE *in ); void *im__map_table( SymbolTable *st, void *(*fn)(), void *a, void *b ); int im__build_mosaic( SymbolTable *st, IMAGE *out, transform_fn tfn, void * );