36 template <
class T1,
class T2,
class T3>
37 inline T3
indexOf(
const T1& arr, T3 sz,
const T2& val, T3 notfoundval )
39 for ( T3 idx=0; idx<sz; idx++ )
41 if ( arr[idx] == val )
51 template <
class T1,
class T2,
class T3>
52 inline T3
derefIndexOf(
const T1& arr, T3 sz,
const T2& val, T3 notfoundval )
54 for ( T3 idx=0; idx<sz; idx++ )
56 if ( *arr[idx] == val )
73 template <
class T1,
class T2,
class T3>
74 bool findPos(
const T1& posarr, T3 sz, T2 pos, T3 beforefirst, T3& idx )
77 if ( sz < 1 || pos < posarr[0] )
80 if ( pos == posarr[0] )
81 { idx = 0;
return true; }
82 else if ( pos > posarr[sz-1] || pos == posarr[sz-1] )
83 { idx = sz-1;
return pos == posarr[sz-1]; }
87 while ( idx2 - idx1 > 1 )
89 idx = (idx2 + idx1) / 2;
90 T2 arrval = posarr[idx];
91 if ( arrval == pos )
return true;
92 else if ( arrval > pos ) idx2 = idx;
97 return posarr[idx] == pos;
111 template <
class T1,
class T2,
class T3>
112 bool findFPPos(
const T1& posarr, T3 sz, T2 pos, T3 beforefirst, T3& idx,
116 if ( !sz )
return false;
117 if ( sz < 2 || pos <= posarr[0] )
120 { idx = 0;
return true; }
124 else if ( pos >= posarr[sz-1] )
125 { idx = sz-1;
return mIsEqual(pos,posarr[sz-1],eps); }
130 while ( idx2 - idx1 > 1 )
132 idx = (idx2 + idx1) / 2;
133 T2 diff = posarr[idx] - pos;
134 if (
mIsZero(diff,eps) )
return true;
135 else if ( diff > 0 ) idx2 = idx;
140 return mIsEqual(pos,posarr[idx],eps);
153 int idx;
findFPPos( x, sz, pos, -1, idx );
return idx;
170 const bool exactmatch =
findFPPos( x, sz, pos, -1, idx );
171 return idx < 1 ? 1 : ( exactmatch ? idx : idx+1 );
180 template <
class X,
class Y,
class RT>
183 RT& ret,
bool extrapolate=
false )
188 ret = extrapolate ? y[0] :
mUdf(
RT);
192 else if ( desiredx < x[0] || desiredx > x[sz-1] )
197 ret = desiredx < x[0]
204 int prevpos =
getLowIdx( x, sz, desiredx );
205 int nextpos = prevpos + 1;
209 x[nextpos], y[nextpos], desiredx );
213 { prevpos++; nextpos++; }
214 else if ( nextpos == sz-1 )
215 { prevpos--; nextpos--; }
218 x[prevpos], y[prevpos],
219 x[nextpos], y[nextpos],
220 x[nextpos+1], y[nextpos+1],
226 template <
class X,
class Y>
228 bool extrapolate=
false )
230 float ret =
mUdf(
float);
244 || (!extrap && (pos<-snapdist || (pos+offset)>sz-1+snapdist)) )
248 const float dist = pos - intpos;
250 if ( dist>-snapdist && dist<snapdist && intpos>-1 && intpos<sz )
251 { p[0] = intpos;
return 0; }
253 p[1] = dist > 0 ? intpos : intpos - 1;
254 if ( p[1] < 0 ) p[1] = 0;
255 if ( p[1] >= sz ) p[1] = sz - 1;
256 p[0] = p[1] < 1 ? p[1] : p[1] - 1;
257 p[2] = p[1] < sz-1 ? p[1] + 1 : p[1];
258 p[3] = p[2] < sz-1 ? p[2] + 1 : p[2];
267 return getInterpolateIdxsWithOff<T>(idxabl,sz,0,pos,extrap,snapdist,p);
271 template <
class T,
class RT>
273 bool extrapolate=
false,
float snapdist=
mDefEps )
278 { ret =
mUdf(
RT);
return false; }
280 { ret = idxabl[p[0]];
return true; }
282 const float relpos = pos - p[1];
284 idxabl[p[3]], relpos );
292 template <
class T,
class RT>
294 od_int64 offset,
float pos,
RT& ret,
bool extrapolate=
false,
298 int res = getInterpolateIdxsWithOff<T>( idxabl, sz, offset, pos,
299 extrapolate, snapdist, p );
301 { ret =
mUdf(
RT);
return false; }
303 { ret = idxabl[p[0]];
return true; }
305 const float relpos = pos - p[1];
307 idxabl[p[2]], idxabl[p[3]], relpos );
312 template <
class T,
class RT>
314 bool extrapolate=
false,
float snapdist=
mDefEps )
316 return interpolateRegWithUdfWithOff<T,RT>( idxabl, sz, 0, pos, ret,
317 extrapolate, snapdist );
323 bool extrapolate=
false,
float snapdist=
mDefEps )
325 float ret =
mUdf(
float);
333 bool extrapolate=
false,
336 float ret =
mUdf(
float);
349 template <
class T>
inline
351 const T* controlpts,
const int* controlsamples,
int nrcontrols,
352 bool usefactor, T* output,
353 float* calibrationcurve = 0 )
355 int firstsample =
mUdf(
int), lastsample = -
mUdf(
int);
357 for (
int idx=0; idx<nrcontrols; idx++ )
359 const int sample = controlsamples[idx];
363 if ( !idx || sample<firstsample )
364 firstsample = sample;
365 if ( !idx || sample>=lastsample )
368 const float value = usefactor
369 ? controlpts[idx]/input[sample]
370 : controlpts[idx]-input[sample];
372 func.
add(
mCast(
float,sample), value );
376 { OD::memCopy( output, input,
sizeof(T)*sz );
return; }
378 for (
int idx=0; idx<sz; idx++ )
381 if ( idx<=firstsample )
382 calibration = func.
yVals()[0];
383 else if ( idx>=lastsample )
384 calibration = func.
yVals()[func.
size()-1];
388 output[idx] = usefactor
389 ? input[idx]*calibration
390 : input[idx]+calibration;
392 if ( calibrationcurve )
393 calibrationcurve[idx] = calibration;