/* fut_new_gtbl creates a new grid table and optionally intializes it. * The input channels defined for the grid are specified in the input * channel mask portion of iomask. Each input defined must have a size * specified in a KpInt32_t array. * Gfun must be a pointer to a function accepting from zero to three * doubles (depending on values of sx, sy, and sz) in the range (0.0,1.0) * and returning a fut_gtbldat_t in the range (0,FUT_GRD_MAXVAL). * A pointer to the newly allocated table is returned if there were no * errors. (If gfun is NULL, the table is not initialized). */ fut_gtbl_p fut_new_gtblEx ( PTTableType_t tableType, KpInt32_t iomask, fut_gfunc_t gfun, fut_calcData_p data, KpInt32_p dimList) { fut_gtbl_p gtbl; KpInt32_t imask, i, dim_size, grid_size; /* get input mask */ imask = (KpInt32_t)FUT_IMASK(iomask); /* allocate grid table structure */ gtbl = fut_alloc_gtbl (); if ( gtbl == FUT_NULL_GTBL ) { DIAG("fut_new_gtblA: can't alloc grid table struct.\n", 0); return (FUT_NULL_GTBL); } /* get sizes from dimList */ grid_size = 1; for ( i=0; i<FUT_NCHAN; i++ ) { dim_size = (imask & FUT_BIT(i)) ? dimList[i] : 1; if ( dim_size <= 0 ) { dim_size = 1; /* make sure > 0 */ } gtbl->size[i] = (KpInt16_t)dim_size; grid_size *= (KpInt32_t)dim_size; } /* check for valid grid size */ if ( grid_size <= 0 || grid_size > FUT_GRD_MAX_ENT ) { DIAG("fut_new_gtblA: bad grid table size (%d).\n", grid_size); fut_free_gtbl(gtbl); return (FUT_NULL_GTBL); } gtbl->tbl_size = (KpInt32_t)grid_size * (KpInt32_t)sizeof(fut_gtbldat_t); /* allocate grid table */ if (tableType == KCP_PT_TABLES) { gtbl->refTbl = fut_alloc_gtbldat (gtbl); } else { gtbl->refTbl = fut_alloc_gmftdat (gtbl); } if ( gtbl->refTbl == NULL ) { DIAG("fut_new_gtblA: can't alloc grid table array.\n", 0); fut_free_gtbl(gtbl); return (FUT_NULL_GTBL); } /* compute the grid table entries */ if ( ! fut_calc_gtblEx (gtbl, gfun, data) ) { fut_free_gtbl(gtbl); return (FUT_NULL_GTBL); } return (gtbl); }
PTErr_t makeInverseXformMono ( ResponseRecord_p grayTRC, fut_p theFut) { PTErr_t PTErr = KCP_FAILURE; fut_otbldat_p otblDat; ResponseRecord_t rrt; KpInt32_t futReturn; fut_calcData_t data; double gamma; KpUInt16_t rrpData[2] = { 0, RRECORD_DATA_SIZE -1 }; /* compute new grid table entries */ data.chan = 0; if (!fut_calc_gtblEx (theFut->chan[0]->gtbl, fut_grampEx, &data)) { goto ErrOut0; } /* compute new output table entries */ if (!fut_calc_otblEx (theFut->chan[0]->otbl, otblFunc, NULL)) { goto ErrOut0; } /* get address of the first output table */ futReturn = fut_get_otbl (theFut, 0, &otblDat); if ((futReturn != 1) || (otblDat == (fut_otbldat_p)NULL)) { goto ErrOut0; } /* setup the output table */ switch (grayTRC->count) { case 0: /* setup the responseRecord struct */ rrt.count = 2; rrt.data = rrpData; /* make the output table */ PTErr = calcOtblLN (otblDat, &rrt); break; case 1: gamma = (double)grayTRC->data[0] / SCALEDOT8; if (gamma <= 0.0) { goto ErrOut0; } /* make the output table */ PTErr = calcOtblL1 (otblDat, gamma); break; default: /* make the output table */ makeInverseMonotonic (grayTRC->count, grayTRC->data); PTErr = calcOtblLN (otblDat, grayTRC); } GetOut: return (PTErr); ErrOut0: PTErr = KCP_SYSERR_0; goto GetOut; }
PTErr_t makeForwardXformMono ( ResponseRecord_p grayTRC, fut_p theFut) { PTErr_t PTErr = KCP_FAILURE; KpInt32_t futReturn, i1; fut_otbldat_p otblDat; double gamma; fut_calcData_t calcData; KpUInt16_t rrpData[2] = { 0, RRECORD_DATA_SIZE -1 }; ResponseRecord_t rrt; KpUInt16_t *pCurveData = NULL; /* compute new table entries */ calcData.chan = 0; /* always uses 1st input chan */ for (i1 = 0; i1 < FWD_MONO_OCHANS; i1++) { if (( ! IS_CHAN(theFut->chan[i1])) || !fut_calc_gtblEx (theFut->chan[i1]->gtbl, fut_grampEx, &calcData) || !fut_calc_otblEx (theFut->chan[i1]->otbl, otblFunc, NULL)) { goto ErrOut0; } } /* get address of the first output table */ futReturn = fut_get_otbl (theFut, 0, &otblDat); if ((futReturn != 1) || (otblDat == (fut_otbldat_p)NULL)) { goto ErrOut0; } if (PARA_TYPE_SIG == grayTRC->TagSig) { pCurveData = (KpUInt16_p) allocBufferPtr (MFV_CURVE_TBL_ENT); /* get memory for curve data */ if (NULL == pCurveData) { return KCP_NO_MEMORY; } makeCurveFromPara (grayTRC->ParaFunction, grayTRC->ParaParams, pCurveData, MFV_CURVE_TBL_ENT); grayTRC->CurveCount = MFV_CURVE_TBL_ENT; grayTRC->CurveData = pCurveData; } /* setup the output table */ switch (grayTRC->CurveCount) { case 0: /* setup the responseRecord struct */ rrt.CurveCount = 2; rrt.CurveData = rrpData; /* make the output table */ PTErr = calcOtblLSN (otblDat, &rrt); break; case 1: gamma = (double)grayTRC->CurveData[0] / SCALEDOT8; if (gamma <= 0.0) { goto ErrOut0; } /* make the output table */ PTErr = calcOtblLS1 (otblDat, gamma); break; default: /* make the output table */ makeMonotonic (grayTRC->CurveCount, grayTRC->CurveData); PTErr = calcOtblLSN (otblDat, grayTRC); } GetOut: if (NULL != pCurveData) { freeBufferPtr (pCurveData); } return PTErr; ErrOut0: PTErr = KCP_SYSERR_0; goto GetOut; }