int unrrdu_padMain(int argc, char **argv, char *me, hestParm *hparm) { hestOpt *opt = NULL; char *out, *err; Nrrd *nin, *nout; unsigned int ai; int minLen, maxLen, bb, pret; long int *minOff, *maxOff; ptrdiff_t min[NRRD_DIM_MAX], max[NRRD_DIM_MAX]; double padVal; airArray *mop; OPT_ADD_BOUND("min,minimum", minOff, "low corner of bounding box.\n " "\b\bo <int> gives 0-based index\n " "\b\bo M, M+<int>, M-<int> give index relative " "to the last sample on the axis (M == #samples-1).", minLen); OPT_ADD_BOUND("max,maximum", maxOff, "high corner of bounding box. " "Besides the specification styles described above, " "there's also:\n " "\b\bo m+<int> give index relative to minimum.", maxLen); hestOptAdd(&opt, "b,boundary", "behavior", airTypeEnum, 1, 1, &bb, "bleed", "How to handle samples beyond the input bounds:\n " "\b\bo \"pad\": use some specified value\n " "\b\bo \"bleed\": extend border values outward\n " "\b\bo \"wrap\": wrap-around to other side", NULL, nrrdBoundary); hestOptAdd(&opt, "v,value", "val", airTypeDouble, 1, 1, &padVal, "0.0", "for \"pad\" boundary behavior, pad with this value"); OPT_ADD_NIN(nin, "input nrrd"); OPT_ADD_NOUT(out, "output nrrd"); mop = airMopNew(); airMopAdd(mop, opt, (airMopper)hestOptFree, airMopAlways); USAGE(_unrrdu_padInfoL); /* hammerhead problems were here */ PARSE(); airMopAdd(mop, opt, (airMopper)hestParseFree, airMopAlways); if (!( minLen == (int)nin->dim && maxLen == (int)nin->dim )) { fprintf(stderr, "%s: # min coords (%d) or max coords (%d) != nrrd dim (%d)\n", me, minLen, maxLen, nin->dim); airMopError(mop); return 1; } for (ai=0; ai<nin->dim; ai++) { if (-1 == minOff[0 + 2*ai]) { fprintf(stderr, "%s: can't use m+<int> specification for axis %d min\n", me, ai); airMopError(mop); return 1; } } for (ai=0; ai<nin->dim; ai++) { min[ai] = minOff[0 + 2*ai]*(nin->axis[ai].size-1) + minOff[1 + 2*ai]; if (-1 == maxOff[0 + 2*ai]) { max[ai] = min[ai] + maxOff[1 + 2*ai]; } else { max[ai] = maxOff[0 + 2*ai]*(nin->axis[ai].size-1) + maxOff[1 + 2*ai]; } /* fprintf(stderr, "%s: ai %2d: min = %4d, max = %4d\n", me, ai, min[ai], mai[ai]); */ } nout = nrrdNew(); airMopAdd(mop, nout, (airMopper)nrrdNuke, airMopAlways); if (nrrdPad_nva(nout, nin, min, max, bb, padVal)) { airMopAdd(mop, err = biffGetDone(NRRD), airFree, airMopAlways); fprintf(stderr, "%s: error padding nrrd:\n%s", me, err); airMopError(mop); return 1; } SAVE(out, nout, NULL); airMopOkay(mop); return 0; }
int unrrdu_cropMain(int argc, char **argv, char *me, hestParm *hparm) { hestOpt *opt = NULL; char *out, *err; Nrrd *nin, *nout; unsigned int ai; int minLen, maxLen, pret; long int *minOff, *maxOff; size_t min[NRRD_DIM_MAX], max[NRRD_DIM_MAX]; airArray *mop; OPT_ADD_BOUND("min,minimum", minOff, "low corner of bounding box.\n " "\b\bo <int> gives 0-based index\n " "\b\bo M, M+<int>, M-<int> give index relative " "to the last sample on the axis (M == #samples-1).", minLen); OPT_ADD_BOUND("max,maximum", maxOff, "high corner of bounding box. Besides " "the specification styles described above, there's also:\n " "\b\bo m+<int> give index relative to minimum.", maxLen); OPT_ADD_NIN(nin, "input nrrd"); OPT_ADD_NOUT(out, "output nrrd"); mop = airMopNew(); airMopAdd(mop, opt, (airMopper)hestOptFree, airMopAlways); USAGE(_unrrdu_cropInfoL); PARSE(); airMopAdd(mop, opt, (airMopper)hestParseFree, airMopAlways); if (!( minLen == (int)nin->dim && maxLen == (int)nin->dim )) { fprintf(stderr, "%s: # min coords (%d) or max coords (%d) != nrrd dim (%d)\n", me, minLen, maxLen, nin->dim); airMopError(mop); return 1; } for (ai=0; ai<nin->dim; ai++) { if (-1 == minOff[0 + 2*ai]) { fprintf(stderr, "%s: can't use m+<int> specification for axis %d min\n", me, ai); airMopError(mop); return 1; } } for (ai=0; ai<nin->dim; ai++) { min[ai] = minOff[0 + 2*ai]*(nin->axis[ai].size-1) + minOff[1 + 2*ai]; if (-1 == maxOff[0 + 2*ai]) { max[ai] = min[ai] + maxOff[1 + 2*ai]; } else { max[ai] = maxOff[0 + 2*ai]*(nin->axis[ai].size-1) + maxOff[1 + 2*ai]; } /* fprintf(stderr, "%s: ai %2d: min = %4d, max = %4d\n", me, ai, min[ai], max[ai]); */ } nout = nrrdNew(); airMopAdd(mop, nout, (airMopper)nrrdNuke, airMopAlways); if (nrrdCrop(nout, nin, min, max)) { airMopAdd(mop, err = biffGetDone(NRRD), airFree, airMopAlways); fprintf(stderr, "%s: error cropping nrrd:\n%s", me, err); airMopError(mop); return 1; } SAVE(out, nout, NULL); airMopOkay(mop); return 0; }
int unrrdu_insetMain(int argc, char **argv, char *me, hestParm *hparm) { hestOpt *opt = NULL; char *out, *err; Nrrd *nin, *nout, *nsub; unsigned int ai, minLen; int pret; long int *minOff; size_t min[NRRD_DIM_MAX]; airArray *mop; OPT_ADD_BOUND("min,minimum", minOff, "coordinates of where to locate sub-volume within " "input nrrd.\n " "\b\bo <int> gives 0-based index\n " "\b\bo M, M+<int>, M-<int> give index relative " "to the last sample on the axis (M == #samples-1).", minLen); hestOptAdd(&opt, "s,subset", "nsub", airTypeOther, 1, 1, &(nsub), NULL, "sub-region nrrd. This the data to be inset in \"nin\"", NULL, NULL, nrrdHestNrrd); OPT_ADD_NIN(nin, "input nrrd"); OPT_ADD_NOUT(out, "output nrrd"); mop = airMopNew(); airMopAdd(mop, opt, (airMopper)hestOptFree, airMopAlways); USAGE(_unrrdu_insetInfoL); PARSE(); airMopAdd(mop, opt, (airMopper)hestParseFree, airMopAlways); if (!( minLen == nin->dim )) { fprintf(stderr, "%s: # min coords (%d) != nrrd dim (%d)\n", me, minLen, nin->dim); airMopError(mop); return 1; } for (ai=0; ai<nin->dim; ai++) { if (-1 == minOff[0 + 2*ai]) { fprintf(stderr, "%s: can't use m+<int> specification for axis %u min\n", me, ai); airMopError(mop); return 1; } } for (ai=0; ai<=nin->dim-1; ai++) { min[ai] = minOff[0 + 2*ai]*(nin->axis[ai].size-1) + minOff[1 + 2*ai]; } nout = nrrdNew(); airMopAdd(mop, nout, (airMopper)nrrdNuke, airMopAlways); if (nrrdInset(nout, nin, nsub, min)) { airMopAdd(mop, err = biffGetDone(NRRD), airFree, airMopAlways); fprintf(stderr, "%s: error insetting nrrd:\n%s", me, err); airMopError(mop); return 1; } SAVE(out, nout, NULL); airMopOkay(mop); return 0; }