/* Use one mosiaced file to mosaic another set of images. * * 1/11/01 JC * - from global_balance * 25/02/02 JC * - detect size change * 10/4/06 * - spot file-not-found */ /* 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 */ /* Define for debug output. #define DEBUG */ #ifdef HAVE_CONFIG_H #include #endif /*HAVE_CONFIG_H*/ #include #include #include #include #include #include #include #include "merge.h" #include "global_balance.h" #ifdef WITH_DMALLOC #include #endif /*WITH_DMALLOC*/ typedef struct _RemosaicData { const char *old_str; const char *new_str; int new_len; int old_len; } RemosaicData; static IMAGE * remosaic( JoinNode *node, RemosaicData *rd ) { SymbolTable *st = node->st; IMAGE *im = node->im; IMAGE *out; char filename[FILENAME_MAX]; char *p; if( !im ) { im_error( "im_remosaic", _( "file \"%s\" not found" ), node->name ); return( NULL ); } /* Remove substring rd->old_str from in->filename, replace with * rd->new_str. */ im_strncpy( filename, im->filename, FILENAME_MAX ); if( (p = im_strrstr( filename, rd->old_str )) ) { int offset = p - &filename[0]; im_strncpy( p, rd->new_str, FILENAME_MAX - offset ); im_strncpy( p + rd->new_len, im->filename + offset + rd->old_len, FILENAME_MAX - offset - rd->new_len ); } #ifdef DEBUG printf( "im_remosaic: filename \"%s\" -> \"%s\"\n", im->filename, filename ); #endif /*DEBUG*/ if( !(out = im__global_open_image( st, filename )) ) return( NULL ); if( out->Xsize != im->Xsize || out->Ysize != im->Ysize ) { im_error( "im_remosaic", _( "substitute image \"%s\" is not " "the same size as \"%s\"" ), filename, im->filename ); return( NULL ); } return( out ); } int im_remosaic( IMAGE *in, IMAGE *out, const char *old_str, const char *new_str ) { SymbolTable *st; RemosaicData rd; if( !(st = im__build_symtab( out, SYM_TAB_SIZE )) || im__parse_desc( st, in ) ) return( -1 ); /* Re-make mosaic. */ rd.old_str = old_str; rd.new_str = new_str; rd.new_len = strlen( new_str ); rd.old_len = strlen( old_str ); if( im__build_mosaic( st, out, (transform_fn) remosaic, &rd ) ) return( -1 ); return( 0 ); }