int limnSplineNrrdEvaluate(Nrrd *nout, limnSpline *spline, Nrrd *nin) { char me[]="limnSplineNrrdEvaluate", err[BIFF_STRLEN]; double tt, *out, (*lup)(const void *, size_t); int odim, infoSize; size_t I, M, size[NRRD_DIM_MAX+1]; if (!(nout && spline && nin)) { sprintf(err, "%s: got NULL pointer", me); biffAdd(LIMN, err); return 1; } if (limnSplineInfoScalar == spline->info) { nrrdAxisInfoGet_va(nin, nrrdAxisInfoSize, size); infoSize = 1; odim = nin->dim; } else { nrrdAxisInfoGet_va(nin, nrrdAxisInfoSize, size+1); infoSize = size[0] = limnSplineInfoSize[spline->info]; odim = 1 + nin->dim; } if (nrrdMaybeAlloc_nva(nout, nrrdTypeDouble, odim, size)) { sprintf(err, "%s: output allocation failed", me); biffMove(LIMN, err, NRRD); return 1; } lup = nrrdDLookup[nin->type]; out = (double*)(nout->data); M = nrrdElementNumber(nin); for (I=0; I<M; I++) { tt = lup(nin->data, I); limnSplineEvaluate(out, spline, tt); out += infoSize; } /* HEY: peripheral info copying? */ return 0; }
/* ******** nrrdApply1DSubstitution ** ** A "subst" is a substitution table, i.e. a list of pairs that ** describes what values should be substituted with what (substitution ** rules). So, nsubst must be a scalar 2xN array. The output is a ** copy of the input with values substituted using this table. ** ** Unlike with lookup tables and maps (irregular and regular), we ** aren't at liberty to change the dimensionality of the data (can't ** substitute a grayscale with a color). The ability to apply ** substitutions to non-scalar data will be in a different function. ** Also unlike lookup tables and maps, the output type is the SAME as ** the input type; the output does NOT inherit the type of the ** substitution */ int nrrdApply1DSubstitution(Nrrd *nout, const Nrrd *nin, const Nrrd *_nsubst) { char me[]="nrrdApply1DSubstitution", err[BIFF_STRLEN]; double (*lup)(const void *, size_t); double (*ins)(void *, size_t, double); Nrrd *nsubst; double val, *subst; size_t ii, num; int jj, asize0, asize1, changed; airArray *mop; if (!(nout && _nsubst && nin)) { sprintf(err, "%s: got NULL pointer", me); biffAdd(NRRD, err); return 1; } if (nrrdTypeBlock == nin->type || nrrdTypeBlock == _nsubst->type) { sprintf(err, "%s: input or substitution type is %s, need scalar", me, airEnumStr(nrrdType, nrrdTypeBlock)); biffAdd(NRRD, err); return 1; } if (2 != _nsubst->dim) { sprintf(err, "%s: substitution table has to be 2-D, not %d-D", me, _nsubst->dim); biffAdd(NRRD, err); return 1; } nrrdAxisInfoGet_va(_nsubst, nrrdAxisInfoSize, &asize0, &asize1); if (2 != asize0) { sprintf(err, "%s: substitution table has to be 2xN, not %dxN", me, asize0); biffAdd(NRRD, err); return 1; } if (nout != nin) { if (nrrdCopy(nout, nin)) { sprintf(err, "%s: couldn't initialize by copy to output", me); biffAdd(NRRD, err); return 1; } } mop = airMopNew(); nsubst = nrrdNew(); airMopAdd(mop, nsubst, (airMopper)nrrdNuke, airMopAlways); if (nrrdConvert(nsubst, _nsubst, nrrdTypeDouble)) { sprintf(err, "%s: couldn't create double copy of substitution table", me); biffAdd(NRRD, err); airMopError(mop); return 1; } lup = nrrdDLookup[nout->type]; ins = nrrdDInsert[nout->type]; subst = (double *)nsubst->data; num = nrrdElementNumber(nout); for (ii=0; ii<num; ii++) { val = lup(nout->data, ii); changed = AIR_FALSE; for (jj=0; jj<asize1; jj++) { if (val == subst[jj*2+0]) { val = subst[jj*2+1]; changed = AIR_TRUE; } } if (changed) { ins(nout->data, ii, val); } } airMopOkay(mop); return 0; }