Example #1
0
int do_varifilter(dataptr dz)
{
	double *dls = dz->parray[FLT_DLS];
 	double *dbs = dz->parray[FLT_DBS];
	double *dhs = dz->parray[FLT_DHS];
	double *dns = dz->parray[FLT_DNS];
	double *dops[2];
	double coeff = 0.0;
	float  *buf  = dz->sampbuf[0];
	int   n;
	int    k, chans = dz->infile->channels;
	int    is_fbrk = FALSE, is_qbrk = FALSE;
	if(dz->brksize[FLT_ONEFRQ])	is_fbrk = TRUE;
	if(dz->brksize[FLT_Q])	    is_qbrk = TRUE;
	for(n=0;n<chans;n++) {
		switch(dz->mode){
		case(FSW_HIGH):		dops[n] = &(dz->parray[FLT_DHS][n]);	break;
		case(FSW_LOW):		dops[n] = &(dz->parray[FLT_DLS][n]);	break;
		case(FSW_BAND):		dops[n] = &(dz->parray[FLT_DBS][n]);	break;
		case(FSW_NOTCH):	dops[n] = &(dz->parray[FLT_DNS][n]);	break;
		}
	}
	for (n = 0 ; n < dz->ssampsread; n += chans) {
		if(is_fbrk && (--dz->iparam[FLT_FSAMS] <= 0)) {
			if(!newvalue(FLT_ONEFRQ,FLT_F_INCR,FLT_FSAMS,dz)) {
		 		sprintf(errstr,"Ran out of sweepfrq values: do_varifilter()\n");
				return(PROGRAM_ERROR);
			}
		}
		if(is_qbrk && (--dz->iparam[FLT_SAMS] <= 0)) {
			if(!newvalue(FLT_Q,FLT_Q_INCR,FLT_SAMS,dz)) { 
		 		sprintf(errstr,"Ran out of Q values: do_sweep_filter()\n");
				return(PROGRAM_ERROR);
			}
		}
		if(--dz->iparam[FLT_BLOKCNT] <= 0){
			coeff = (2.0 * PI * dz->param[FLT_ONEFRQ]) * dz->param[FLT_INV_SR];
			if(is_fbrk)    dz->param[FLT_ONEFRQ] *= dz->param[FLT_F_INCR];
			if(is_qbrk) {
				dz->param[FLT_QFAC] = 1.0/(1.0 + dz->param[FLT_Q]);
				dz->param[FLT_Q]   *= dz->param[FLT_Q_INCR];
			}
			dz->iparam[FLT_BLOKCNT] = dz->iparam[FLT_BLOKSIZE];
		}
		for(k=0;k<chans;k++)
			buf[n+k] = multifilter(&(dbs[k]),&(dls[k]),&(dhs[k]),&(dns[k]),dops[k],dz->param[FLT_Q],coeff,buf[n+k],dz);
	}
	return(CONTINUE);
}
Example #2
0
int do_qvary_filters(dataptr dz)
{
	int   n;
	int    fno, chans = dz->infile->channels;
	float *buf = dz->sampbuf[0];
	double *ampl = dz->parray[FLT_AMPL];
	double *a = dz->parray[FLT_A];
	double *b = dz->parray[FLT_B];
	double *y = dz->parray[FLT_Y];
	double *z = dz->parray[FLT_Z];
	double *d = dz->parray[FLT_D];
	double *e = dz->parray[FLT_E];

	for (n = 0; n < dz->ssampsread; n += chans) { 
		if((dz->iparam[FLT_SAMS] -= chans) <= 0) {
			if(!newvalue(FLT_Q,FLT_Q_INCR,FLT_SAMS,dz)) {
		 		sprintf(errstr,"Ran out of Q values: do_qvary_filters()\n");
				return(PROGRAM_ERROR);
			}
			dz->iparam[FLT_SAMS] *= chans;
		}
		if((dz->iparam[FLT_BLOKCNT] -= chans) <= 0) {
			for (fno = 0; fno < dz->iparam[FLT_CNT]; fno++)
				get_coeffs2(fno,dz);
			dz->param[FLT_Q] *= dz->param[FLT_Q_INCR];
			dz->iparam[FLT_BLOKCNT] = dz->iparam[FLT_BLOKSIZE] * chans;
		}
		filtering(n,chans,buf,a,b,y,z,d,e,ampl,dz);
	}
	return(CONTINUE);
}
Example #3
0
int
lbind_pushnil(struct vars *v) {
	struct lvar * s = newvalue(v);
	if (s == NULL)
		return -1;
	s->type = LT_NIL;
	return 0;
}
Example #4
0
int
lbind_pushinteger(struct vars *v, int i) {
	struct lvar * s = newvalue(v);
	if (s == NULL)
		return -1;
	s->type = LT_INTEGER;
	s->v.i = i;
	return 0;
}
Example #5
0
int
lbind_pushreal(struct vars *v, double f) {
	struct lvar * s = newvalue(v);
	if (s == NULL)
		return -1;
	s->type = LT_REAL;
	s->v.f = f;
	return 0;
}
Example #6
0
int
lbind_pushstring(struct vars *v, const char *str) {
	struct lvar * s = newvalue(v);
	if (s == NULL)
		return -1;
	s->type = LT_STRING;
	s->v.s = str;
	return 0;
}
Example #7
0
int
lbind_pushboolean(struct vars *v, int b) {
	struct lvar * s = newvalue(v);
	if (s == NULL)
		return -1;
	s->type = LT_BOOLEAN;
	s->v.b = b;
	return 0;
}
Example #8
0
int
lbind_pushpointer(struct vars *v, void *p) {
	struct lvar * s = newvalue(v);
	if (s == NULL)
		return -1;
	s->type = LT_POINTER;
	s->v.p = p;
	return 0;
}
void	ConfigParameter::testLastParam()
{
  Config*	config = Config::getInstance();
  std::string	key("key");
  std::string	value("i wish to replace this value");
  std::string	newvalue("new value");

  config->setParam(key, value);
  config->setParam(key, newvalue);
  config->setLastParam(key);
  CPPUNIT_ASSERT(config->getParam(key) == value);
}
Example #10
0
std::string UtilsWin::convertPathTo83Path(const std::string& path)
{
    std::string newvalue(path);
    DWORD lenght;

    lenght = GetShortPathName(path.c_str(), NULL, 0);
    if (lenght > 0) {
        TCHAR* buffer = new TCHAR[lenght];
        lenght = GetShortPathName(path.c_str(), buffer, lenght);
        if (lenght > 0) {
            newvalue.assign(static_cast < char* >(buffer));
        }
        delete [] buffer;
    }

    return newvalue;
}
Example #11
0
int do_fvary2_filters(dataptr dz)
{
	int exit_status;
	int    n, fno, chans = dz->infile->channels;
	float *buf = dz->sampbuf[0];

	//double *fincr = dz->parray[FLT_FINCR];
	//double *aincr = dz->parray[FLT_AINCR];
 
 	double *ampl = dz->parray[FLT_AMPL];
	double *a = dz->parray[FLT_A];
	double *b = dz->parray[FLT_B];
	double *y = dz->parray[FLT_Y];
	double *z = dz->parray[FLT_Z];
	double *d = dz->parray[FLT_D];
	double *e = dz->parray[FLT_E];
 
 	int fsams = dz->iparam[FLT_FSAMS];
	for (n = 0; n < dz->ssampsread; n += chans) { 
		if(dz->brksize[FLT_Q]) {
			if((dz->iparam[FLT_SAMS] -= chans) <= 0) {
				if(!newvalue(FLT_Q,FLT_Q_INCR,FLT_SAMS,dz)) {
			 		sprintf(errstr,"Ran out of Q values: do_fvary2_filters()\n");
					return(PROGRAM_ERROR);
				}
				dz->iparam[FLT_SAMS] *= chans;
			}
		}
		if(fsams <= 0) {
			if((exit_status = newfval2(dz->parray[FLT_FBRK],dz->parray[FLT_HBRK],dz))<0)
				return(exit_status);
			fsams = dz->iparam[FLT_FSAMS];
			for (fno = 0; fno < dz->iparam[FLT_CNT]; fno++) {
				get_coeffs1(fno,dz);
				get_coeffs2(fno,dz);
			}
			if(dz->brksize[FLT_Q])
				dz->param[FLT_Q] *= dz->param[FLT_Q_INCR];
		}

		filtering(n,chans,buf,a,b,y,z,d,e,ampl,dz);
		fsams--;
	}
	return(CONTINUE);
}
Example #12
0
int varidelay_allpass(float *buf,int chans,double prescale,dataptr dz)
{
	int   n, thisdelbfpos1, thisdelbfpos2, sampno;
	int    delay, channo;
	double frac, ip, op, delval1,delval2, delval;
	double *delbuf1 = dz->parray[FLT_DELBUF1];
	double *delbuf2 = dz->parray[FLT_DELBUF2];
	int    maxdelsamps = dz->iparam[FLT_MAXDELSAMPS] * chans;
	int	   delbufpos   = dz->iparam[FLT_DELBUFPOS];
	switch(dz->mode) {
	case(FLT_PHASESHIFT):
		for(n=0;n<dz->ssampsread;n+= chans){
			if(--dz->iparam[FLT_SAMS] <= 0) {
				if(!newvalue(FLT_DELAY,FLT_D_INCR,FLT_SAMS,dz)) {
		 			sprintf(errstr,"Ran out of Delay vals: varidelay_allpass()\n");
					return(PROGRAM_ERROR);
				}
			}
			delay = (int)dz->param[FLT_DELAY];
			frac  = dz->param[FLT_DELAY] - (double)delay;
			for(channo = 0;channo < chans; channo++) {
				sampno = n + channo;
				thisdelbfpos1 = my_modulus((delbufpos - (delay*chans)),maxdelsamps);
				thisdelbfpos2 = my_modulus((thisdelbfpos1 + chans)    ,maxdelsamps);
				ip = (double)buf[sampno]	* prescale;
				op = (-dz->param[FLT_GAIN]) * ip;
				delval1     = delbuf1[thisdelbfpos1];
				delval2     = delbuf1[thisdelbfpos2];
				delval      = delval1 + ((delval2 - delval1) * frac);
				op += delval;
				delval1     = delbuf2[thisdelbfpos1];
				delval2     = delbuf2[thisdelbfpos2];
				delval      = delval1 + ((delval2 - delval1) * frac);
				op += dz->param[FLT_GAIN] * delval;
				delbuf1[delbufpos] = ip;
				delbuf2[delbufpos] = op;
				if(++delbufpos >= maxdelsamps)
//					delbufpos = 0;
					delbufpos -= maxdelsamps;		/*RWD 9:2001 */
//TW ?????? maxdelsamps is a mutiple of channels, delbufpos is incremented by 1 each time
//   so (delbufpos -= maxdelsamps) = 0
				buf[sampno] = (float) (op);
			}
			if(dz->vflag[FLT_LINDELAY])
				dz->param[FLT_DELAY] += dz->param[FLT_D_INCR];
			else
				dz->param[FLT_DELAY] *= dz->param[FLT_D_INCR];
		}
		break;
	case(FLT_PHASER):
		for(n=0;n<dz->ssampsread;n+= chans){
			if(--dz->iparam[FLT_SAMS] <= 0) {
				if(!newvalue(FLT_DELAY,FLT_D_INCR,FLT_SAMS,dz)) {
	 				sprintf(errstr,"Ran out of Delay vals: varidelay_allpass()\n");
					return(PROGRAM_ERROR);
				}
			}
			delay = (int)dz->param[FLT_DELAY];
			frac  = dz->param[FLT_DELAY] - (double)delay;
			for(channo = 0;channo < chans; channo++) {
				sampno = n + channo;
				thisdelbfpos1 = my_modulus((delbufpos - (delay*chans)),maxdelsamps);
				thisdelbfpos2 = my_modulus((thisdelbfpos1 + chans)    ,maxdelsamps);
				ip = (double)buf[sampno]	* prescale;
				op = (-dz->param[FLT_GAIN]) * ip;
				delval1     = delbuf1[thisdelbfpos1];
				delval2     = delbuf1[thisdelbfpos2];
				delval      = delval1 + ((delval2 - delval1) * frac);
				op += delval;
				delval1     = delbuf2[thisdelbfpos1];
				delval2     = delbuf2[thisdelbfpos2];
				delval      = delval1 + ((delval2 - delval1) * frac);
				op += dz->param[FLT_GAIN] * delval;
				delbuf1[delbufpos] = ip;
				delbuf2[delbufpos] = op;
				if(++delbufpos >= maxdelsamps)
					//delbufpos = 0;
					delbufpos -= maxdelsamps;	/*RWD 9:2001 (see e_tmp/cdpfloat ) */
//TW ?????? maxdelsamps is a mutiple of channels, delbufpos is incremented by 1 each time
//   so (delbufpos -= maxdelsamps) = 0
				buf[sampno] = (float) ((op + (double)buf[sampno]) * 0.5);
			}
			if(dz->vflag[FLT_LINDELAY])
				dz->param[FLT_DELAY] += dz->param[FLT_D_INCR];
			else
				dz->param[FLT_DELAY] *= dz->param[FLT_D_INCR];
		}
		break;
	default:
		sprintf(errstr,"Unknown case:varidelay_allpass()\n");
		return(PROGRAM_ERROR); 
  	}
	dz->iparam[FLT_DELBUFPOS] = delbufpos;
	return(FINISHED);
}
Example #13
0
 void reset( T *ptr = nullptr ) {
     shared_ptr<T> newvalue(ptr);
     locker.writer.lock();
     internalPtr = newvalue;
     locker.writer.unlock();
 }
Example #14
0
 bool resetIfNull( T *ptr = nullptr ) {
     shared_ptr<T> newvalue(ptr);
     shared_ptr<T> oldvalue(nullptr);
     return compare_exchange(oldvalue, newvalue);
 }
Example #15
0
 bool clearIfEqual( const shared_ptr<T> &curvalue ) {
     shared_ptr<T> newvalue(nullptr);
     return compare_exchange(curvalue, newvalue);
 }
Example #16
0
int do_fvary_filters(dataptr dz)
{
	int exit_status;
	int    n, m, fno, chans = dz->infile->channels;
	float *buf = dz->sampbuf[0];

	double *fincr = dz->parray[FLT_FINCR];
	double *aincr = dz->parray[FLT_AINCR];
 
 	double *ampl = dz->parray[FLT_AMPL];
	double *a = dz->parray[FLT_A];
	double *b = dz->parray[FLT_B];
	double *y = dz->parray[FLT_Y];
	double *z = dz->parray[FLT_Z];
	double *d = dz->parray[FLT_D];
	double *e = dz->parray[FLT_E];
 	int fsams = dz->iparam[FLT_FSAMS];
	if (dz->vflag[DROP_OUT_AT_OVFLOW]) {
		for (n = 0; n < dz->ssampsread; n += chans) { 
			if(fsams <= 0) {
				if((exit_status = newfval(&fsams,dz))<0)
					return(exit_status);
			}
			if(dz->brksize[FLT_Q]) {
				if((dz->iparam[FLT_SAMS] -= chans) <= 0) {
					if(!newvalue(FLT_Q,FLT_Q_INCR,FLT_SAMS,dz)) {
						sprintf(errstr,"Ran out of Q values: do_fvary_filters()\n");
						return(PROGRAM_ERROR);
					}
					dz->iparam[FLT_SAMS] *= chans;
				}
			}
			if((dz->iparam[FLT_BLOKCNT] -= chans) <= 0) {
				for (fno = 0; fno < dz->iparam[FLT_CNT]; fno++) {
					get_coeffs1(fno,dz);
					get_coeffs2(fno,dz);
				}
				if(dz->brksize[FLT_Q])
					dz->param[FLT_Q] *= dz->param[FLT_Q_INCR];
				
				for(m=0;m<dz->iparam[FLT_CNT];m++) {
					dz->parray[FLT_FRQ][m] *= fincr[m];
					dz->parray[FLT_AMP][m] *= aincr[m];
				}
				dz->iparam[FLT_BLOKCNT] = dz->iparam[FLT_BLOKSIZE] * chans;
			}
			filtering(n,chans,buf,a,b,y,z,d,e,ampl,dz);
			if(dz->iparam[FLT_OVFLW] > 0) {
				sprintf(errstr,"Filter overflowed\n");
				return(GOAL_FAILED);
			}
			fsams--;
		}
	} else {
		for (n = 0; n < dz->ssampsread; n += chans) { 
			if(fsams <= 0) {
				if((exit_status = newfval(&fsams,dz))<0)
					return(exit_status);
			}
			if(dz->brksize[FLT_Q]) {
				if((dz->iparam[FLT_SAMS] -= chans) <= 0) {
					if(!newvalue(FLT_Q,FLT_Q_INCR,FLT_SAMS,dz)) {
			 			sprintf(errstr,"Ran out of Q values: do_fvary_filters()\n");
						return(PROGRAM_ERROR);
					}
					dz->iparam[FLT_SAMS] *= chans;
				}
			}
			if((dz->iparam[FLT_BLOKCNT] -= chans) <= 0) {
				for (fno = 0; fno < dz->iparam[FLT_CNT]; fno++) {
					get_coeffs1(fno,dz);
					get_coeffs2(fno,dz);
				}
				if(dz->brksize[FLT_Q])
					dz->param[FLT_Q] *= dz->param[FLT_Q_INCR];

				for(m=0;m<dz->iparam[FLT_CNT];m++) {
					dz->parray[FLT_FRQ][m] *= fincr[m];
					dz->parray[FLT_AMP][m] *= aincr[m];
				}
				dz->iparam[FLT_BLOKCNT] = dz->iparam[FLT_BLOKSIZE] * chans;
			}
			filtering(n,chans,buf,a,b,y,z,d,e,ampl,dz);
			fsams--;
		}
	}
 	dz->iparam[FLT_FSAMS] = fsams;
	return(CONTINUE);
}
Example #17
0
int main(int argc, char *argv[])
{
    char *p;
    int method;
    int in_fd;
    int selection_fd;
    int out_fd;
    DCELL *result;
    char *selection;
    RASTER_MAP_TYPE map_type;
    int row, col;
    int readrow;
    int nrows, ncols;
    int n;
    int copycolr;
    int half;
    stat_func *newvalue;
    stat_func_w *newvalue_w;
    ifunc cat_names;
    double quantile;
    const void *closure;
    struct Colors colr;
    struct Cell_head cellhd;
    struct Cell_head window;
    struct History history;
    struct GModule *module;
    struct
    {
	struct Option *input, *output, *selection;
	struct Option *method, *size;
	struct Option *title;
	struct Option *weight;
	struct Option *gauss;
	struct Option *quantile;
    } parm;
    struct
    {
	struct Flag *align, *circle;
    } flag;

    DCELL *values;		/* list of neighborhood values */

    DCELL(*values_w)[2];	/* list of neighborhood values and weights */

    G_gisinit(argv[0]);

    module = G_define_module();
    G_add_keyword(_("raster"));
    G_add_keyword(_("algebra"));
    G_add_keyword(_("statistics"));
    module->description =
	_("Makes each cell category value a "
	  "function of the category values assigned to the cells "
	  "around it, and stores new cell values in an output raster "
	  "map layer.");

    parm.input = G_define_standard_option(G_OPT_R_INPUT);

    parm.selection = G_define_standard_option(G_OPT_R_INPUT);
    parm.selection->key = "selection";
    parm.selection->required = NO;
    parm.selection->description = _("Name of an input raster map to select the cells which should be processed");

    parm.output = G_define_standard_option(G_OPT_R_OUTPUT);

    parm.method = G_define_option();
    parm.method->key = "method";
    parm.method->type = TYPE_STRING;
    parm.method->required = NO;
    parm.method->answer = "average";
    p = G_malloc(1024);
    for (n = 0; menu[n].name; n++) {
	if (n)
	    strcat(p, ",");
	else
	    *p = 0;
	strcat(p, menu[n].name);
    }
    parm.method->options = p;
    parm.method->description = _("Neighborhood operation");
    parm.method->guisection = _("Neighborhood");

    parm.size = G_define_option();
    parm.size->key = "size";
    parm.size->type = TYPE_INTEGER;
    parm.size->required = NO;
    parm.size->description = _("Neighborhood size");
    parm.size->answer = "3";
    parm.size->guisection = _("Neighborhood");

    parm.title = G_define_option();
    parm.title->key = "title";
    parm.title->key_desc = "phrase";
    parm.title->type = TYPE_STRING;
    parm.title->required = NO;
    parm.title->description = _("Title of the output raster map");

    parm.weight = G_define_standard_option(G_OPT_F_INPUT);
    parm.weight->key = "weight";
    parm.weight->required = NO;
    parm.weight->description = _("Text file containing weights");

    parm.gauss = G_define_option();
    parm.gauss->key = "gauss";
    parm.gauss->type = TYPE_DOUBLE;
    parm.gauss->required = NO;
    parm.gauss->description = _("Sigma (in cells) for Gaussian filter");

    parm.quantile = G_define_option();
    parm.quantile->key = "quantile";
    parm.quantile->type = TYPE_DOUBLE;
    parm.quantile->required = NO;
    parm.quantile->description = _("Quantile to calculate for method=quantile");
    parm.quantile->options = "0.0-1.0";
    parm.quantile->answer = "0.5";

    flag.align = G_define_flag();
    flag.align->key = 'a';
    flag.align->description = _("Do not align output with the input");

    flag.circle = G_define_flag();
    flag.circle->key = 'c';
    flag.circle->description = _("Use circular neighborhood");
    flag.circle->guisection = _("Neighborhood");

    if (G_parser(argc, argv))
	exit(EXIT_FAILURE);

    sscanf(parm.size->answer, "%d", &ncb.nsize);
    if (ncb.nsize <= 0)
	G_fatal_error(_("Neighborhood size must be positive"));
    if (ncb.nsize % 2 == 0)
	G_fatal_error(_("Neighborhood size must be odd"));
    ncb.dist = ncb.nsize / 2;

    if (parm.weight->answer && flag.circle->answer)
	G_fatal_error(_("weight= and -c are mutually exclusive"));

    if (parm.weight->answer && parm.gauss->answer)
	G_fatal_error(_("weight= and gauss= are mutually exclusive"));

    ncb.oldcell = parm.input->answer;
    ncb.newcell = parm.output->answer;

    if (!flag.align->answer) {
	Rast_get_cellhd(ncb.oldcell, "", &cellhd);
	G_get_window(&window);
	Rast_align_window(&window, &cellhd);
	Rast_set_window(&window);
    }

    nrows = Rast_window_rows();
    ncols = Rast_window_cols();

    /* open raster maps */
    in_fd = Rast_open_old(ncb.oldcell, "");
    map_type = Rast_get_map_type(in_fd);

    /* get the method */
    for (method = 0; (p = menu[method].name); method++)
	if ((strcmp(p, parm.method->answer) == 0))
	    break;
    if (!p) {
	G_warning(_("<%s=%s> unknown %s"),
		  parm.method->key, parm.method->answer, parm.method->key);
	G_usage();
	exit(EXIT_FAILURE);
    }

    if (menu[method].method == c_quant) {
	quantile = atoi(parm.quantile->answer);
	closure = &quantile;
    }

    half = (map_type == CELL_TYPE) ? menu[method].half : 0;

    /* establish the newvalue routine */
    newvalue = menu[method].method;
    newvalue_w = menu[method].method_w;

    /* copy color table? */
    copycolr = menu[method].copycolr;
    if (copycolr) {
	G_suppress_warnings(1);
	copycolr =
	    (Rast_read_colors(ncb.oldcell, "", &colr) > 0);
	G_suppress_warnings(0);
    }

    /* read the weights */
    if (parm.weight->answer) {
	read_weights(parm.weight->answer);
	if (!newvalue_w)
	    weights_mask();
    }
    else if (parm.gauss->answer) {
	if (!newvalue_w)
	    G_fatal_error(_("Method %s not compatible with Gaussian filter"), parm.method->answer);
	gaussian_weights(atof(parm.gauss->answer));
    }
    else
	newvalue_w = NULL;

    /* allocate the cell buffers */
    allocate_bufs();
    result = Rast_allocate_d_buf();

    /* get title, initialize the category and stat info */
    if (parm.title->answer)
	strcpy(ncb.title, parm.title->answer);
    else
	sprintf(ncb.title, "%dx%d neighborhood: %s of %s",
		ncb.nsize, ncb.nsize, menu[method].name, ncb.oldcell);


    /* initialize the cell bufs with 'dist' rows of the old cellfile */

    readrow = 0;
    for (row = 0; row < ncb.dist; row++)
	readcell(in_fd, readrow++, nrows, ncols);

    /* open the selection raster map */
    if (parm.selection->answer) {
	G_message(_("Opening selection map <%s>"), parm.selection->answer);
	selection_fd = Rast_open_old(parm.selection->answer, "");
        selection = Rast_allocate_null_buf();
    } else {
        selection_fd = -1;
        selection = NULL;
    }

    /*open the new raster map */
    out_fd = Rast_open_new(ncb.newcell, map_type);

    if (flag.circle->answer)
	circle_mask();

    if (newvalue_w)
	values_w =
	    (DCELL(*)[2]) G_malloc(ncb.nsize * ncb.nsize * 2 * sizeof(DCELL));
    else
	values = (DCELL *) G_malloc(ncb.nsize * ncb.nsize * sizeof(DCELL));

    for (row = 0; row < nrows; row++) {
	G_percent(row, nrows, 2);
	readcell(in_fd, readrow++, nrows, ncols);

	if (selection)
            Rast_get_null_value_row(selection_fd, selection, row);

	for (col = 0; col < ncols; col++) {
	    DCELL *rp = &result[col];

            if (selection && selection[col]) {
		*rp = ncb.buf[ncb.dist][col];
		continue;
	    }

	    if (newvalue_w)
		n = gather_w(values_w, col);
	    else
		n = gather(values, col);

	    if (n < 0)
		Rast_set_d_null_value(rp, 1);
	    else {
		if (newvalue_w)
		    newvalue_w(rp, values_w, n, closure);
		else
		    newvalue(rp, values, n, closure);

		if (half && !Rast_is_d_null_value(rp))
		    *rp += 0.5;
	    }
	}

	Rast_put_d_row(out_fd, result);
    }
    G_percent(row, nrows, 2);

    Rast_close(out_fd);
    Rast_close(in_fd);

    if (selection)
        Rast_close(selection_fd);

    /* put out category info */
    null_cats();
    if ((cat_names = menu[method].cat_names))
	cat_names();

    Rast_write_cats(ncb.newcell, &ncb.cats);

    if (copycolr)
	Rast_write_colors(ncb.newcell, G_mapset(), &colr);

    Rast_short_history(ncb.newcell, "raster", &history);
    Rast_command_history(&history);
    Rast_write_history(ncb.newcell, &history);


    exit(EXIT_SUCCESS);
}