127 lines
3.7 KiB
C
127 lines
3.7 KiB
C
|
/* 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 * );
|