1 |
|
|
/* |
2 |
|
|
Teem: Tools to process and visualize scientific data and images . |
3 |
|
|
Copyright (C) 2013, 2012, 2011, 2010, 2009 University of Chicago |
4 |
|
|
Copyright (C) 2008, 2007, 2006, 2005 Gordon Kindlmann |
5 |
|
|
Copyright (C) 2004, 2003, 2002, 2001, 2000, 1999, 1998 University of Utah |
6 |
|
|
|
7 |
|
|
This library is free software; you can redistribute it and/or |
8 |
|
|
modify it under the terms of the GNU Lesser General Public License |
9 |
|
|
(LGPL) as published by the Free Software Foundation; either |
10 |
|
|
version 2.1 of the License, or (at your option) any later version. |
11 |
|
|
The terms of redistributing and/or modifying this software also |
12 |
|
|
include exceptions to the LGPL that facilitate static linking. |
13 |
|
|
|
14 |
|
|
This library is distributed in the hope that it will be useful, |
15 |
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 |
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
17 |
|
|
Lesser General Public License for more details. |
18 |
|
|
|
19 |
|
|
You should have received a copy of the GNU Lesser General Public License |
20 |
|
|
along with this library; if not, write to Free Software Foundation, Inc., |
21 |
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
22 |
|
|
*/ |
23 |
|
|
|
24 |
|
|
#include "meet.h" |
25 |
|
|
|
26 |
|
|
typedef union { |
27 |
|
|
const NrrdKernel ***k; |
28 |
|
|
void **v; |
29 |
|
|
} _kernu; |
30 |
|
|
|
31 |
|
|
/* |
32 |
|
|
** ALLOCATES and returns a NULL-terminated array of all the |
33 |
|
|
** NrrdKernels in Teem |
34 |
|
|
*/ |
35 |
|
|
const NrrdKernel ** |
36 |
|
|
meetNrrdKernelAll(void) { |
37 |
|
|
airArray *arr; |
38 |
|
2 |
const NrrdKernel **kern; |
39 |
|
|
unsigned int ii; |
40 |
|
|
int di, ci, ai, dmax, cmax, amax; |
41 |
|
|
_kernu ku; |
42 |
|
|
|
43 |
|
|
ku.k = &kern; |
44 |
|
1 |
arr = airArrayNew(ku.v, NULL, sizeof(NrrdKernel *), 2); |
45 |
|
|
|
46 |
|
|
/* kernel.c */ |
47 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelZero; |
48 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBox; |
49 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBoxSupportDebug; |
50 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRomSupportDebug; |
51 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRomSupportDebugD; |
52 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRomSupportDebugDD; |
53 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCos4SupportDebug; |
54 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCos4SupportDebugD; |
55 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCos4SupportDebugDD; |
56 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCos4SupportDebugDDD; |
57 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCheap; |
58 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelHermiteScaleSpaceFlag; |
59 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelTent; |
60 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelForwDiff; |
61 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCentDiff; |
62 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBCCubic; |
63 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBCCubicD; |
64 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBCCubicDD; |
65 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRom; |
66 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRomD; |
67 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelCatmullRomDD; |
68 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelAQuartic; |
69 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelAQuarticD; |
70 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelAQuarticDD; |
71 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC3Quintic; |
72 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC3QuinticD; |
73 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC3QuinticDD; |
74 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC4Hexic; |
75 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC4HexicD; |
76 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC4HexicDD; |
77 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC4HexicDDD; |
78 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC4HexicApproxInverse; |
79 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC5Septic; |
80 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC5SepticD; |
81 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC5SepticDD; |
82 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC5SepticDDD; |
83 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelC5SepticApproxInverse; |
84 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelGaussian; |
85 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelGaussianD; |
86 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelGaussianDD; |
87 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelDiscreteGaussian; |
88 |
|
|
|
89 |
|
|
/* winKernel.c */ |
90 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelHann; |
91 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelHannD; |
92 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelHannDD; |
93 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBlackman; |
94 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBlackmanD; |
95 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBlackmanDD; |
96 |
|
|
|
97 |
|
|
/* bsplKernel.c */ |
98 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline1; |
99 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline1D; |
100 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline2; |
101 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline2D; |
102 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline2DD; |
103 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline3; |
104 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline3D; |
105 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline3DD; |
106 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline3DDD; |
107 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline3ApproxInverse; |
108 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline4; |
109 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline4D; |
110 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline4DD; |
111 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline4DDD; |
112 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline5; |
113 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline5D; |
114 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline5DD; |
115 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline5DDD; |
116 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline5ApproxInverse; |
117 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline6; |
118 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline6D; |
119 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline6DD; |
120 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline6DDD; |
121 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline7; |
122 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline7D; |
123 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline7DD; |
124 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline7DDD; |
125 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = nrrdKernelBSpline7ApproxInverse; |
126 |
|
|
|
127 |
|
|
/* tmfKernel.c |
128 |
|
|
nrrdKernelTMF[D+1][C+1][A] is d<D>_c<C>_<A>ef: |
129 |
|
|
Dth-derivative, C-order continuous ("smooth"), A-order accurate |
130 |
|
|
(for D and C, index 0 accesses the function for -1) |
131 |
|
|
NRRD_EXPORT NrrdKernel *const nrrdKernelTMF[4][5][5]; |
132 |
|
|
*/ |
133 |
|
1 |
dmax = AIR_CAST(int, nrrdKernelTMF_maxD); |
134 |
|
1 |
cmax = AIR_CAST(int, nrrdKernelTMF_maxC); |
135 |
|
1 |
amax = AIR_CAST(int, nrrdKernelTMF_maxA); |
136 |
✓✓ |
10 |
for (di=-1; di<=dmax; di++) { |
137 |
✓✓ |
48 |
for (ci=-1; ci<=cmax; ci++) { |
138 |
✓✓ |
200 |
for (ai=1; ai<=amax; ai++) { |
139 |
|
80 |
ii = airArrayLenIncr(arr, 1); |
140 |
|
80 |
kern[ii] = nrrdKernelTMF[di+1][ci+1][ai]; |
141 |
|
|
} |
142 |
|
|
} |
143 |
|
|
} |
144 |
|
|
|
145 |
|
|
/* NULL-terminate the list */ |
146 |
|
1 |
ii = airArrayLenIncr(arr, 1); kern[ii] = NULL; |
147 |
|
|
/* nix, not nuke the airArray */ |
148 |
|
1 |
airArrayNix(arr); |
149 |
|
2 |
return kern; |
150 |
|
1 |
} |
151 |
|
|
|
152 |
|
|
/* the knowledge here about what is a derivative of what is something |
153 |
|
|
that will be built into kernels in a future Teem version */ |
154 |
|
|
static const NrrdKernel * |
155 |
|
|
kintegral(const NrrdKernel *kd) { |
156 |
|
|
const NrrdKernel *ret=NULL; |
157 |
|
|
|
158 |
|
|
/* the statement "INTGL(K)" is saying that K has a derivative with the |
159 |
|
|
usual name K##D. This is made more convenient by the |
160 |
|
|
consistent use of the "D" suffix for indicating a derivative */ |
161 |
|
|
#define INTGL(K) if (K##D == kd) { ret = K; } |
162 |
✓✓ |
686 |
INTGL(nrrdKernelHann); |
163 |
✓✓ |
346 |
INTGL(nrrdKernelHannD); |
164 |
✓✓ |
346 |
INTGL(nrrdKernelBlackman); |
165 |
✓✓ |
346 |
INTGL(nrrdKernelBlackmanD); |
166 |
|
|
|
167 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline1); |
168 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline2); |
169 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline2D); |
170 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline3); |
171 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline3D); |
172 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline3DD); |
173 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline4); |
174 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline4D); |
175 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline4DD); |
176 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline5); |
177 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline5D); |
178 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline5DD); |
179 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline6); |
180 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline6D); |
181 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline6DD); |
182 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline7); |
183 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline7D); |
184 |
✓✓ |
341 |
INTGL(nrrdKernelBSpline7DD); |
185 |
|
|
|
186 |
✓✓ |
342 |
INTGL(nrrdKernelCos4SupportDebug); |
187 |
✓✓ |
342 |
INTGL(nrrdKernelCos4SupportDebugD); |
188 |
✓✓ |
342 |
INTGL(nrrdKernelCos4SupportDebugDD); |
189 |
✓✓ |
342 |
INTGL(nrrdKernelCatmullRomSupportDebug); |
190 |
✓✓ |
342 |
INTGL(nrrdKernelCatmullRomSupportDebugD); |
191 |
✓✓ |
348 |
INTGL(nrrdKernelBCCubic); |
192 |
✓✓ |
348 |
INTGL(nrrdKernelBCCubicD); |
193 |
✓✓ |
341 |
INTGL(nrrdKernelCatmullRom); |
194 |
✓✓ |
341 |
INTGL(nrrdKernelCatmullRomD); |
195 |
✓✓ |
344 |
INTGL(nrrdKernelAQuartic); |
196 |
✓✓ |
344 |
INTGL(nrrdKernelAQuarticD); |
197 |
✓✓ |
342 |
INTGL(nrrdKernelC3Quintic); |
198 |
✓✓ |
342 |
INTGL(nrrdKernelC3QuinticD); |
199 |
✓✓ |
342 |
INTGL(nrrdKernelC4Hexic); |
200 |
✓✓ |
342 |
INTGL(nrrdKernelC4HexicD); |
201 |
✓✓ |
342 |
INTGL(nrrdKernelC4HexicDD); |
202 |
✓✓ |
342 |
INTGL(nrrdKernelC5Septic); |
203 |
✓✓ |
342 |
INTGL(nrrdKernelC5SepticD); |
204 |
✓✓ |
342 |
INTGL(nrrdKernelC5SepticDD); |
205 |
✓✓ |
346 |
INTGL(nrrdKernelGaussian); |
206 |
✓✓ |
346 |
INTGL(nrrdKernelGaussianD); |
207 |
|
|
#undef INTGL |
208 |
|
340 |
return ret; |
209 |
|
|
} |
210 |
|
|
|
211 |
|
|
/* |
212 |
|
|
** Does more than call nrrdKernelCheck on all kernels: |
213 |
|
|
** makes sure that all kernels have unique names |
214 |
|
|
** makes sure that derivative relationships are correct |
215 |
|
|
** Also, simply calling nrrdKernelCheck requires some knowledge |
216 |
|
|
** of the kernel's needed parameters |
217 |
|
|
** |
218 |
|
|
** HEY: its problematic that because the various kernels have different |
219 |
|
|
** parameter epsilon requirements, they usually end up having to be |
220 |
|
|
** enumerated in some of the if/else statements below; it would be much |
221 |
|
|
** better if new kernels didn't need to be so explicitly added! |
222 |
|
|
*/ |
223 |
|
|
int |
224 |
|
|
meetNrrdKernelAllCheck(void) { |
225 |
|
|
static const char me[]="meetNrrdKernelAllCheck"; |
226 |
|
|
const NrrdKernel **kern, *kk, *ll; |
227 |
|
|
unsigned int ki, kj, pnum; |
228 |
|
|
airArray *mop; |
229 |
|
2 |
double epsl, XX, YY, |
230 |
|
|
parm0[NRRD_KERNEL_PARMS_NUM], |
231 |
|
|
parm1_1[NRRD_KERNEL_PARMS_NUM], parm1_X[NRRD_KERNEL_PARMS_NUM], |
232 |
|
|
parm[NRRD_KERNEL_PARMS_NUM]; |
233 |
|
|
size_t evalNum; |
234 |
|
|
int EE; |
235 |
|
|
|
236 |
|
1 |
mop = airMopNew(); |
237 |
|
1 |
kern = meetNrrdKernelAll(); |
238 |
|
1 |
airMopAdd(mop, AIR_CAST(void*, kern), airFree, airMopAlways); |
239 |
|
|
evalNum = 120000; /* success of kernel integral test is surprisingly |
240 |
|
|
dependent on this, likely due to the naive way |
241 |
|
|
the integral is numerically computed; the current |
242 |
|
|
value here represents some experimentation */ |
243 |
|
|
epsl = 0.9e-5; |
244 |
|
|
XX = 7.0/3.0; /* 2.333.. */ |
245 |
|
|
YY = 43.0/9.0; /* 4.777.. */ |
246 |
|
1 |
parm0[0] = AIR_NAN; /* shouldn't be read */ |
247 |
|
1 |
parm1_1[0] = 1.0; |
248 |
|
1 |
parm1_X[0] = XX; |
249 |
|
|
ki = 0; |
250 |
✓✓ |
312 |
while ((kk = kern[ki])) { |
251 |
|
|
kj = 0; |
252 |
✓✓ |
24180 |
while (kj < ki) { |
253 |
|
11935 |
ll = kern[kj]; |
254 |
✗✓ |
11935 |
if (kk == ll) { |
255 |
|
|
biffAddf(MEET, "%s: kern[%u] and [%u] were identical (%s)", |
256 |
|
|
me, kj, ki, kk->name); |
257 |
|
|
airMopError(mop); return 1; |
258 |
|
|
} |
259 |
✗✓ |
11935 |
if (!airStrcmp(kk->name, ll->name)) { |
260 |
|
|
biffAddf(MEET, "%s: kern[%u] and [%u] have same name (%s)", |
261 |
|
|
me, kj, ki, kk->name); |
262 |
|
|
airMopError(mop); return 1; |
263 |
|
|
} |
264 |
|
11935 |
kj++; |
265 |
|
|
} |
266 |
|
155 |
pnum = kk->numParm; |
267 |
|
|
EE = 0; |
268 |
|
|
/* the second argument to CHECK is how much to scale up the |
269 |
|
|
permissible error in kernel evaluations (between float and double) |
270 |
|
|
The kernels for which this is higher should be targets for |
271 |
|
|
re-coding with an eye towards numerical accuracy */ |
272 |
|
|
#define CHECK(P, S, N) \ |
273 |
|
|
if (!EE) EE |= nrrdKernelCheck(kk, (P), evalNum, epsl*(S), \ |
274 |
|
|
N, N, \ |
275 |
|
|
kintegral(kk), (P)); |
276 |
✓✓✓✓
|
308 |
if (nrrdKernelBCCubic == kk || |
277 |
✓✓ |
154 |
nrrdKernelBCCubicD == kk || |
278 |
|
153 |
nrrdKernelBCCubicDD == kk) { |
279 |
|
|
/* try a few settings of the 3 parms */ |
280 |
✓✗ |
6 |
ELL_3V_SET(parm, 1.0, 0.0, 0.0); CHECK(parm, 1, 2); |
281 |
✓✗ |
6 |
ELL_3V_SET(parm, XX, 0.0, 0.0); CHECK(parm, 1, 2); |
282 |
✓✗ |
6 |
ELL_3V_SET(parm, 1.0, 1.0/3.0, 1.0/3.0); CHECK(parm, 1, 2); |
283 |
✓✗ |
6 |
ELL_3V_SET(parm, XX, 1.0/3.0, 1.0/3.0); CHECK(parm, 1, 2); |
284 |
✓✗ |
6 |
ELL_3V_SET(parm, 1.0, 0.0, 1.0); CHECK(parm, 1, 2); |
285 |
✓✗ |
6 |
ELL_3V_SET(parm, XX, 0.0, 1.0); CHECK(parm, 1, 2); |
286 |
✓✗ |
6 |
ELL_3V_SET(parm, 1.0, 0.5, 0.0); CHECK(parm, 1, 2); |
287 |
✓✗ |
6 |
ELL_3V_SET(parm, XX, 0.5, 0.0); CHECK(parm, 1, 2); |
288 |
✓✓ |
152 |
} else if (2 == pnum) { |
289 |
✓✓✓✓
|
24 |
if (nrrdKernelAQuartic == kk || |
290 |
✓✓ |
12 |
nrrdKernelAQuarticD == kk || |
291 |
|
11 |
nrrdKernelAQuarticDD == kk) { |
292 |
✓✗ |
6 |
ELL_2V_SET(parm, 1.0, 0.0); CHECK(parm, 10, 2); |
293 |
✓✗ |
6 |
ELL_2V_SET(parm, 1.0, 0.5); CHECK(parm, 10, 2); |
294 |
✓✗ |
6 |
ELL_2V_SET(parm, XX, 0.0); CHECK(parm, 10, 2); |
295 |
✓✗ |
6 |
ELL_2V_SET(parm, XX, 0.5); CHECK(parm, 10, 2); |
296 |
✓✓✓✓
|
18 |
} else if (nrrdKernelGaussian == kk || |
297 |
✓✓ |
9 |
nrrdKernelGaussianD == kk || |
298 |
|
8 |
nrrdKernelGaussianDD == kk) { |
299 |
✓✗ |
6 |
ELL_2V_SET(parm, 0.1, XX); CHECK(parm, 10, 2); |
300 |
✓✗ |
6 |
ELL_2V_SET(parm, 0.1, YY); CHECK(parm, 10, 2); |
301 |
✓✗ |
6 |
ELL_2V_SET(parm, 1.0, XX); CHECK(parm, 10, 2); |
302 |
✓✗ |
6 |
ELL_2V_SET(parm, 1.0, YY); CHECK(parm, 10, 2); |
303 |
✓✗ |
6 |
ELL_2V_SET(parm, XX, XX); CHECK(parm, 10, 2); |
304 |
✓✗ |
6 |
ELL_2V_SET(parm, XX, YY); CHECK(parm, 10, 2); |
305 |
✓✓✓✓
|
12 |
} else if (nrrdKernelHann == kk || |
306 |
✓✓ |
6 |
nrrdKernelHannD == kk || |
307 |
|
5 |
nrrdKernelBlackman == kk) { |
308 |
✓✗ |
6 |
ELL_2V_SET(parm, 0.5, XX); CHECK(parm, 100, 2); |
309 |
✓✗ |
6 |
ELL_2V_SET(parm, 0.5, YY); CHECK(parm, 100, 2); |
310 |
✓✗ |
6 |
ELL_2V_SET(parm, 1.0, XX); CHECK(parm, 100, 2); |
311 |
✓✗ |
6 |
ELL_2V_SET(parm, 1.0, YY); CHECK(parm, 100, 2); |
312 |
✓✗ |
6 |
ELL_2V_SET(parm, XX, XX); CHECK(parm, 100, 2); |
313 |
✓✗ |
6 |
ELL_2V_SET(parm, XX, YY); CHECK(parm, 100, 2); |
314 |
✓✓✓✓
|
6 |
} else if (nrrdKernelHannDD == kk || |
315 |
✓✓ |
3 |
nrrdKernelBlackmanD == kk || |
316 |
|
2 |
nrrdKernelBlackmanDD == kk) { |
317 |
|
|
/* there are apparently bugs in these kernels */ |
318 |
✓✗ |
6 |
ELL_2V_SET(parm, 0.5, XX); CHECK(parm, 10000000, 2); |
319 |
✓✗ |
6 |
ELL_2V_SET(parm, 0.5, YY); CHECK(parm, 10000000, 2); |
320 |
✓✗ |
6 |
ELL_2V_SET(parm, 1.0, XX); CHECK(parm, 1000000, 2); |
321 |
✓✗ |
6 |
ELL_2V_SET(parm, 1.0, YY); CHECK(parm, 1000000, 2); |
322 |
✓✗ |
6 |
ELL_2V_SET(parm, XX, XX); CHECK(parm, 100000, 2); |
323 |
✓✗ |
6 |
ELL_2V_SET(parm, XX, YY); CHECK(parm, 100000, 2); |
324 |
✓✗ |
1 |
} else if (nrrdKernelDiscreteGaussian == kk) { |
325 |
✓✗ |
2 |
ELL_2V_SET(parm, 0.1, XX); CHECK(parm, 1, 2); |
326 |
✓✗ |
2 |
ELL_2V_SET(parm, 0.1, YY); CHECK(parm, 1, 2); |
327 |
✓✗ |
2 |
ELL_2V_SET(parm, 1.0, XX); CHECK(parm, 1, 2); |
328 |
✓✗ |
2 |
ELL_2V_SET(parm, 1.0, YY); CHECK(parm, 1, 2); |
329 |
✓✗ |
2 |
ELL_2V_SET(parm, XX, XX); CHECK(parm, 1, 2); |
330 |
✓✗ |
2 |
ELL_2V_SET(parm, XX, YY); CHECK(parm, 1, 2); |
331 |
|
|
} else { |
332 |
|
|
biffAddf(MEET, "%s: sorry, got unexpected 2-parm kernel %s", |
333 |
|
|
me, kk->name); |
334 |
|
|
airMopError(mop); return 1; |
335 |
|
|
} |
336 |
✓✓ |
139 |
} else if (1 == pnum) { |
337 |
✓✓ |
94 |
if (strstr(kk->name, "TMF")) { |
338 |
|
|
/* these take a single parm, but its not support */ |
339 |
✓✗ |
160 |
parm[0] = 0.0; CHECK(parm, 10, 2); |
340 |
✓✗ |
160 |
parm[0] = 1.0/3.0; CHECK(parm, 10, 2); |
341 |
|
|
} else { |
342 |
|
|
/* zero, box, boxsup, cos4sup{,D,DD,DDD}, cheap, |
343 |
|
|
ctmrsup{,D,DD}, tent, fordif, cendif */ |
344 |
|
|
/* takes a single support/scale parm[0], try two different values */ |
345 |
✓✓✓✓
|
23 |
if (nrrdKernelCos4SupportDebug == kk || |
346 |
✓✓ |
13 |
nrrdKernelCos4SupportDebugD == kk || |
347 |
✓✓ |
12 |
nrrdKernelCos4SupportDebugDD == kk || |
348 |
✓✓ |
11 |
nrrdKernelCos4SupportDebugDDD == kk || |
349 |
✓✓ |
10 |
nrrdKernelCatmullRomSupportDebugD == kk || |
350 |
|
9 |
nrrdKernelCatmullRomSupportDebugDD == kk) { |
351 |
✓✗ |
12 |
CHECK(parm1_1, 10, 4); |
352 |
✓✗ |
12 |
CHECK(parm1_X, 10, 4); |
353 |
|
|
} else { |
354 |
✓✗ |
16 |
CHECK(parm1_1, 1, 2); |
355 |
✓✗ |
16 |
CHECK(parm1_X, 1, 2); |
356 |
|
|
} |
357 |
|
|
} |
358 |
✓✗ |
45 |
} else if (0 == pnum) { |
359 |
|
|
/* C3Quintic{,D,DD,DD}, C4Hexic{,D,DD,DDD}, C5Septic{,D}, |
360 |
|
|
hermiteSS, catmull-rom{,D}, bspl{3,5,7}{,D,DD,DDD} */ |
361 |
✓✓✓✓
|
80 |
if (nrrdKernelC3Quintic == kk || |
362 |
✓✓ |
44 |
nrrdKernelC3QuinticD == kk || |
363 |
✓✓ |
43 |
nrrdKernelC3QuinticDD == kk || |
364 |
✓✓ |
42 |
nrrdKernelC4Hexic == kk || |
365 |
✓✓ |
41 |
nrrdKernelC4HexicD == kk || |
366 |
✓✓ |
40 |
nrrdKernelC4HexicDD == kk || |
367 |
✓✓ |
39 |
nrrdKernelC4HexicDDD == kk || |
368 |
✓✓ |
38 |
nrrdKernelC5Septic == kk || |
369 |
✓✓ |
37 |
nrrdKernelC5SepticD == kk || |
370 |
✓✓ |
36 |
nrrdKernelC5SepticDD == kk || |
371 |
|
35 |
nrrdKernelC5SepticDDD == kk |
372 |
|
|
) { |
373 |
✓✗ |
22 |
CHECK(parm0, 1, 2); |
374 |
✓✗ |
22 |
CHECK(parm0, 1, 2); |
375 |
✓✓✓✓
|
66 |
} else if (nrrdKernelBSpline5DD == kk || |
376 |
✓✓ |
33 |
nrrdKernelBSpline5DDD == kk || |
377 |
|
32 |
nrrdKernelBSpline7DD == kk ) { |
378 |
✓✗ |
6 |
CHECK(parm0, 100, 2); |
379 |
|
|
} else { |
380 |
✓✗ |
62 |
CHECK(parm0, 10, 2); |
381 |
|
|
} |
382 |
|
|
} else { |
383 |
|
|
biffAddf(MEET, "%s: sorry, didn't expect %u parms for %s", |
384 |
|
|
me, pnum, kk->name); |
385 |
|
|
airMopError(mop); return 1; |
386 |
|
|
} |
387 |
|
|
#undef CHECK |
388 |
✗✓ |
155 |
if (EE) { |
389 |
|
|
biffMovef(MEET, NRRD, "%s: problem with kern[%u] \"%s\"", me, ki, |
390 |
|
|
kk->name ? kk->name : "(NULL name)"); |
391 |
|
|
airMopError(mop); return 1; |
392 |
|
|
} |
393 |
|
155 |
ki++; |
394 |
|
|
} |
395 |
|
|
|
396 |
|
1 |
airMopOkay(mop); |
397 |
|
1 |
return 0; |
398 |
|
1 |
} |