File: | ccv_resample.c |
Warning: | line 74, column 18 The left expression of the compound assignment is an uninitialized value. The computed value will also be garbage |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | #include "ccv.h" | |||
2 | #include "ccv_internal.h" | |||
3 | ||||
4 | /* area interpolation resample is adopted from OpenCV */ | |||
5 | ||||
6 | typedef struct { | |||
7 | int si, di; | |||
8 | unsigned int alpha; | |||
9 | } ccv_int_alpha; | |||
10 | ||||
11 | static void _ccv_resample_area_8u(ccv_dense_matrix_t* a, ccv_dense_matrix_t* b, double rows_scale, double cols_scale) | |||
12 | { | |||
13 | assert(a->cols > 0 && b->cols > 0)((void) sizeof ((a->cols > 0 && b->cols > 0) ? 1 : 0), __extension__ ({ if (a->cols > 0 && b->cols > 0) ; else __assert_fail ("a->cols > 0 && b->cols > 0" , "ccv_resample.c", 13, __extension__ __PRETTY_FUNCTION__); } )); | |||
| ||||
14 | int ch = ccv_clamp(CCV_GET_CHANNEL(a->type), 1, 4)({ typeof (1) _a = (1); typeof (4) _b = (4); typeof (((a-> type) & 0xFFF)) _x = (((a->type) & 0xFFF)); (_x < _a) ? _a : ((_x > _b) ? _b : _x); }); | |||
15 | unsigned char* workspace = 0; | |||
16 | ccv_int_alpha* xofs; | |||
17 | unsigned int* buf; | |||
18 | unsigned int* sum; | |||
19 | if (a->cols > 1024 || b->cols * ch > 1024) | |||
20 | { | |||
21 | workspace = (unsigned char*)ccmallocmalloc(sizeof(ccv_int_alpha) * a->cols * 2 + 2 * b->cols * ch * sizeof(unsigned int)); | |||
22 | xofs = (ccv_int_alpha*)workspace; | |||
23 | buf = (unsigned int*)(workspace + sizeof(ccv_int_alpha) * a->cols * 2); | |||
24 | sum = buf + b->cols * ch; | |||
25 | } else { | |||
26 | xofs = (ccv_int_alpha*)alloca(sizeof(ccv_int_alpha) * a->cols * 2)__builtin_alloca (sizeof(ccv_int_alpha) * a->cols * 2); | |||
27 | buf = (unsigned int*)alloca(b->cols * ch * sizeof(unsigned int))__builtin_alloca (b->cols * ch * sizeof(unsigned int)); | |||
28 | sum = (unsigned int*)alloca(b->cols * ch * sizeof(unsigned int))__builtin_alloca (b->cols * ch * sizeof(unsigned int)); | |||
29 | } | |||
30 | double scale_x = (double)1 / cols_scale; | |||
31 | double scale_y = (double)1 / rows_scale; | |||
32 | // double scale = 1.f / (scale_x * scale_y); | |||
33 | unsigned int inv_scale_256 = (int)(scale_x * scale_y * 0x10000); | |||
34 | int dx, dy, sx, sy, i, k; | |||
35 | for (dx = 0, k = 0; dx
| |||
36 | { | |||
37 | double fsx1 = dx * scale_x, fsx2 = fsx1 + scale_x; | |||
38 | int sx1 = (int)(fsx1 + 1.0 - 1e-6), sx2 = (int)(fsx2); | |||
39 | ||||
40 | if (sx1 > fsx1) | |||
41 | { | |||
42 | xofs[k].di = dx * ch; | |||
43 | xofs[k].si = ccv_min(sx1 - 1, a->cols - 1)({ typeof (sx1 - 1) _a = (sx1 - 1); typeof (a->cols - 1) _b = (a->cols - 1); (_a < _b) ? _a : _b; }) * ch; | |||
44 | xofs[k++].alpha = (unsigned int)((sx1 - fsx1) * 0x100); | |||
45 | } | |||
46 | ||||
47 | for (sx = sx1; sx < sx2; sx++) | |||
48 | { | |||
49 | xofs[k].di = dx * ch; | |||
50 | xofs[k].si = ccv_min(sx, a->cols - 1)({ typeof (sx) _a = (sx); typeof (a->cols - 1) _b = (a-> cols - 1); (_a < _b) ? _a : _b; }) * ch; | |||
51 | xofs[k++].alpha = 256; | |||
52 | } | |||
53 | ||||
54 | if (fsx2 - sx2 > 1e-3) | |||
55 | { | |||
56 | xofs[k].di = dx * ch; | |||
57 | xofs[k].si = ccv_min(sx2, a->cols - 1)({ typeof (sx2) _a = (sx2); typeof (a->cols - 1) _b = (a-> cols - 1); (_a < _b) ? _a : _b; }) * ch; | |||
58 | xofs[k++].alpha = (unsigned int)((fsx2 - sx2) * 256); | |||
59 | } | |||
60 | } | |||
61 | int xofs_count = k; | |||
62 | for (dx = 0; dx < b->cols * ch; dx++) | |||
63 | buf[dx] = sum[dx] = 0; | |||
64 | dy = 0; | |||
65 | int dy_weight_256 = 0; | |||
66 | for (sy = 0; sy < a->rows; sy++) | |||
67 | { | |||
68 | unsigned char* a_ptr = a->data.u8 + a->step * sy; | |||
69 | for (k = 0; k < xofs_count; k++) | |||
70 | { | |||
71 | int dxn = xofs[k].di; | |||
72 | unsigned int alpha = xofs[k].alpha; | |||
73 | for (i = 0; i
| |||
74 | buf[dxn + i] += a_ptr[xofs[k].si + i] * alpha; | |||
| ||||
75 | } | |||
76 | if ((dy + 1) * scale_y <= sy + 1) | |||
77 | { | |||
78 | unsigned int beta = (int)(ccv_max(sy + 1 - (dy + 1) * scale_y, 0.f)({ typeof (sy + 1 - (dy + 1) * scale_y) _a = (sy + 1 - (dy + 1 ) * scale_y); typeof (0.f) _b = (0.f); (_a > _b) ? _a : _b ; }) * 256); | |||
79 | unsigned int beta1 = 256 - beta; | |||
80 | unsigned char* b_ptr = b->data.u8 + b->step * dy; | |||
81 | if (sy == a->rows - 1) | |||
82 | beta = (int)(scale_y * 256); | |||
83 | else | |||
84 | dy_weight_256 = beta; | |||
85 | if (beta <= 0) | |||
86 | { | |||
87 | for (dx = 0; dx < b->cols * ch; dx++) | |||
88 | { | |||
89 | b_ptr[dx] = ccv_clamp((sum[dx] + buf[dx] * 256) / inv_scale_256, 0, 255)({ typeof (0) _a = (0); typeof (255) _b = (255); typeof ((sum [dx] + buf[dx] * 256) / inv_scale_256) _x = ((sum[dx] + buf[dx ] * 256) / inv_scale_256); (_x < _a) ? _a : ((_x > _b) ? _b : _x); }); | |||
90 | sum[dx] = buf[dx] = 0; | |||
91 | } | |||
92 | } else { | |||
93 | for (dx = 0; dx < b->cols * ch; dx++) | |||
94 | { | |||
95 | b_ptr[dx] = ccv_clamp((sum[dx] + buf[dx] * beta1) / inv_scale_256, 0, 255)({ typeof (0) _a = (0); typeof (255) _b = (255); typeof ((sum [dx] + buf[dx] * beta1) / inv_scale_256) _x = ((sum[dx] + buf [dx] * beta1) / inv_scale_256); (_x < _a) ? _a : ((_x > _b) ? _b : _x); }); | |||
96 | sum[dx] = buf[dx] * beta; | |||
97 | buf[dx] = 0; | |||
98 | } | |||
99 | } | |||
100 | dy++; | |||
101 | } else { | |||
102 | if (sy == a->rows - 1) | |||
103 | { | |||
104 | dy_weight_256 = (int)(scale_y * 256) - dy_weight_256; | |||
105 | for(dx = 0; dx < b->cols * ch; dx++) | |||
106 | { | |||
107 | sum[dx] += buf[dx] * dy_weight_256; | |||
108 | buf[dx] = 0; | |||
109 | } | |||
110 | } else { | |||
111 | dy_weight_256 += 256; | |||
112 | for(dx = 0; dx < b->cols * ch; dx++) | |||
113 | { | |||
114 | sum[dx] += buf[dx] * 256; | |||
115 | buf[dx] = 0; | |||
116 | } | |||
117 | } | |||
118 | } | |||
119 | } | |||
120 | for (; dy < b->rows; dy++) | |||
121 | { | |||
122 | unsigned char* b_ptr = b->data.u8 + b->step * dy; | |||
123 | for (dx = 0; dx < b->cols * ch; dx++) | |||
124 | b_ptr[dx] = ccv_clamp(sum[dx] / inv_scale_256, 0, 255)({ typeof (0) _a = (0); typeof (255) _b = (255); typeof (sum[ dx] / inv_scale_256) _x = (sum[dx] / inv_scale_256); (_x < _a) ? _a : ((_x > _b) ? _b : _x); }); | |||
125 | } | |||
126 | if (workspace) | |||
127 | ccfreefree(workspace); | |||
128 | } | |||
129 | ||||
130 | typedef struct { | |||
131 | int si, di; | |||
132 | float alpha; | |||
133 | } ccv_area_alpha_t; | |||
134 | ||||
135 | static void _ccv_resample_area(ccv_dense_matrix_t* a, ccv_dense_matrix_t* b, double rows_scale, double cols_scale) | |||
136 | { | |||
137 | assert(a->cols > 0 && b->cols > 0)((void) sizeof ((a->cols > 0 && b->cols > 0) ? 1 : 0), __extension__ ({ if (a->cols > 0 && b->cols > 0) ; else __assert_fail ("a->cols > 0 && b->cols > 0" , "ccv_resample.c", 137, __extension__ __PRETTY_FUNCTION__); } )); | |||
138 | int ch = CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF); | |||
139 | unsigned char* workspace = 0; | |||
140 | ccv_area_alpha_t* xofs; | |||
141 | float* buf; | |||
142 | float* sum; | |||
143 | if (a->cols > 1024 || b->cols * ch > 1024) | |||
144 | { | |||
145 | workspace = (unsigned char*)ccmallocmalloc(sizeof(ccv_area_alpha_t) * a->cols * 2 + 2 * b->cols * ch * sizeof(float)); | |||
146 | xofs = (ccv_area_alpha_t*)workspace; | |||
147 | buf = (float*)(workspace + sizeof(ccv_area_alpha_t) * a->cols * 2); | |||
148 | sum = buf + b->cols * ch; | |||
149 | } else { | |||
150 | xofs = (ccv_area_alpha_t*)alloca(sizeof(ccv_area_alpha_t) * a->cols * 2)__builtin_alloca (sizeof(ccv_area_alpha_t) * a->cols * 2); | |||
151 | buf = (float*)alloca(b->cols * ch * sizeof(float))__builtin_alloca (b->cols * ch * sizeof(float)); | |||
152 | sum = (float*)alloca(b->cols * ch * sizeof(float))__builtin_alloca (b->cols * ch * sizeof(float)); | |||
153 | } | |||
154 | double scale_x = (double)1 / cols_scale; | |||
155 | double scale_y = (double)1 / rows_scale; | |||
156 | double scale = 1.f / (scale_x * scale_y); | |||
157 | int dx, dy, sx, sy, i, k; | |||
158 | for (dx = 0, k = 0; dx < b->cols; dx++) | |||
159 | { | |||
160 | double fsx1 = dx * scale_x, fsx2 = fsx1 + scale_x; | |||
161 | int sx1 = (int)(fsx1 + 1.0 - 1e-6), sx2 = (int)(fsx2); | |||
162 | ||||
163 | if (sx1 > fsx1) | |||
164 | { | |||
165 | xofs[k].di = dx * ch; | |||
166 | xofs[k].si = ccv_min(sx1 - 1, a->cols - 1)({ typeof (sx1 - 1) _a = (sx1 - 1); typeof (a->cols - 1) _b = (a->cols - 1); (_a < _b) ? _a : _b; }) * ch; | |||
167 | xofs[k++].alpha = (float)((sx1 - fsx1) * scale); | |||
168 | } | |||
169 | ||||
170 | for (sx = sx1; sx < sx2; sx++) | |||
171 | { | |||
172 | xofs[k].di = dx * ch; | |||
173 | xofs[k].si = ccv_min(sx, a->cols - 1)({ typeof (sx) _a = (sx); typeof (a->cols - 1) _b = (a-> cols - 1); (_a < _b) ? _a : _b; }) * ch; | |||
174 | xofs[k++].alpha = (float)scale; | |||
175 | } | |||
176 | ||||
177 | if (fsx2 - sx2 > 1e-3) | |||
178 | { | |||
179 | xofs[k].di = dx * ch; | |||
180 | xofs[k].si = ccv_min(sx2, a->cols - 1)({ typeof (sx2) _a = (sx2); typeof (a->cols - 1) _b = (a-> cols - 1); (_a < _b) ? _a : _b; }) * ch; | |||
181 | xofs[k++].alpha = (float)((fsx2 - sx2) * scale); | |||
182 | } | |||
183 | } | |||
184 | int xofs_count = k; | |||
185 | for (dx = 0; dx < b->cols * ch; dx++) | |||
186 | buf[dx] = sum[dx] = 0; | |||
187 | dy = 0; | |||
188 | float dy_weight = 0; | |||
189 | #define for_block(_for_get, _for_set) \ | |||
190 | for (sy = 0; sy < a->rows; sy++) \ | |||
191 | { \ | |||
192 | unsigned char* a_ptr = a->data.u8 + a->step * sy; \ | |||
193 | for (k = 0; k < xofs_count; k++) \ | |||
194 | { \ | |||
195 | int dxn = xofs[k].di; \ | |||
196 | float alpha = xofs[k].alpha; \ | |||
197 | for (i = 0; i < ch; i++) \ | |||
198 | buf[dxn + i] += _for_get(a_ptr, xofs[k].si + i) * alpha; \ | |||
199 | } \ | |||
200 | if ((dy + 1) * scale_y <= sy + 1) \ | |||
201 | { \ | |||
202 | float beta = ccv_max(sy + 1 - (dy + 1) * scale_y, 0.f)({ typeof (sy + 1 - (dy + 1) * scale_y) _a = (sy + 1 - (dy + 1 ) * scale_y); typeof (0.f) _b = (0.f); (_a > _b) ? _a : _b ; }); \ | |||
203 | float beta1 = 1 - beta; \ | |||
204 | unsigned char* b_ptr = b->data.u8 + b->step * dy; \ | |||
205 | if (sy == a->rows - 1) \ | |||
206 | beta = scale_y; /* Such that if there are any residue, we will scale it up. */ \ | |||
207 | else \ | |||
208 | dy_weight = beta; \ | |||
209 | if (fabs(beta) < 1e-3) \ | |||
210 | { \ | |||
211 | for (dx = 0; dx < b->cols * ch; dx++) \ | |||
212 | { \ | |||
213 | _for_set(b_ptr, dx, sum[dx] + buf[dx]); \ | |||
214 | sum[dx] = buf[dx] = 0; \ | |||
215 | } \ | |||
216 | } else { \ | |||
217 | for (dx = 0; dx < b->cols * ch; dx++) \ | |||
218 | { \ | |||
219 | _for_set(b_ptr, dx, sum[dx] + buf[dx] * beta1); \ | |||
220 | sum[dx] = buf[dx] * beta; \ | |||
221 | buf[dx] = 0; \ | |||
222 | } \ | |||
223 | } \ | |||
224 | dy++; \ | |||
225 | } else { \ | |||
226 | if (sy == a->rows - 1) \ | |||
227 | { \ | |||
228 | dy_weight = scale_y - dy_weight; \ | |||
229 | for(dx = 0; dx < b->cols * ch; dx++) \ | |||
230 | { \ | |||
231 | sum[dx] += buf[dx] * dy_weight; \ | |||
232 | buf[dx] = 0; \ | |||
233 | } \ | |||
234 | } else { \ | |||
235 | dy_weight += 1; \ | |||
236 | for(dx = 0; dx < b->cols * ch; dx++) \ | |||
237 | { \ | |||
238 | sum[dx] += buf[dx]; \ | |||
239 | buf[dx] = 0; \ | |||
240 | } \ | |||
241 | } \ | |||
242 | } \ | |||
243 | } \ | |||
244 | for (; dy < b->rows; dy++) \ | |||
245 | { \ | |||
246 | unsigned char* b_ptr = b->data.u8 + b->step * dy; \ | |||
247 | for (dx = 0; dx < b->cols * ch; dx++) \ | |||
248 | _for_set(b_ptr, dx, sum[dx]); \ | |||
249 | } | |||
250 | ccv_matrix_getter(a->type, ccv_matrix_setter, b->type, for_block){ switch (((a->type) & 0xFF000)) { case CCV_32S: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_32s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32s_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32s_value , _ccv_set_8u_value); } } }; break; } case CCV_32F: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32f_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32f_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_32f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32f_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32f_value , _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64s_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64s_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value , _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64f_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64f_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64f_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64f_value , _ccv_set_8u_value); } } }; break; } default: { { switch ((( b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_8u_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_8u_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_8u_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_8u_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_8u_value , _ccv_set_8u_value); } } }; } } }; | |||
251 | #undef for_block | |||
252 | if (workspace) | |||
253 | ccfreefree(workspace); | |||
254 | } | |||
255 | ||||
256 | typedef struct { | |||
257 | int si[4]; | |||
258 | float coeffs[4]; | |||
259 | } ccv_cubic_coeffs_t; | |||
260 | ||||
261 | typedef struct { | |||
262 | int si[4]; | |||
263 | int coeffs[4]; | |||
264 | } ccv_cubic_integer_coeffs_t; | |||
265 | ||||
266 | static void _ccv_init_cubic_coeffs(int si, int sz, float s, ccv_cubic_coeffs_t* coeff) | |||
267 | { | |||
268 | const float A = -0.75f; | |||
269 | coeff->si[0] = ccv_min(ccv_max(si - 1, 0), sz - 1)({ typeof (({ typeof (si - 1) _a = (si - 1); typeof (0) _b = ( 0); (_a > _b) ? _a : _b; })) _a = (({ typeof (si - 1) _a = (si - 1); typeof (0) _b = (0); (_a > _b) ? _a : _b; })); typeof (sz - 1) _b = (sz - 1); (_a < _b) ? _a : _b; }); | |||
270 | coeff->si[1] = ccv_min(ccv_max(si, 0), sz - 1)({ typeof (({ typeof (si) _a = (si); typeof (0) _b = (0); (_a > _b) ? _a : _b; })) _a = (({ typeof (si) _a = (si); typeof (0) _b = (0); (_a > _b) ? _a : _b; })); typeof (sz - 1) _b = (sz - 1); (_a < _b) ? _a : _b; }); | |||
271 | coeff->si[2] = ccv_min(ccv_max(si + 1, 0), sz - 1)({ typeof (({ typeof (si + 1) _a = (si + 1); typeof (0) _b = ( 0); (_a > _b) ? _a : _b; })) _a = (({ typeof (si + 1) _a = (si + 1); typeof (0) _b = (0); (_a > _b) ? _a : _b; })); typeof (sz - 1) _b = (sz - 1); (_a < _b) ? _a : _b; }); | |||
272 | coeff->si[3] = ccv_min(ccv_max(si + 2, 0), sz - 1)({ typeof (({ typeof (si + 2) _a = (si + 2); typeof (0) _b = ( 0); (_a > _b) ? _a : _b; })) _a = (({ typeof (si + 2) _a = (si + 2); typeof (0) _b = (0); (_a > _b) ? _a : _b; })); typeof (sz - 1) _b = (sz - 1); (_a < _b) ? _a : _b; }); | |||
273 | float x = s - si; | |||
274 | coeff->coeffs[0] = ((A * (x + 1) - 5 * A) * (x + 1) + 8 * A) * (x + 1) - 4 * A; | |||
275 | coeff->coeffs[1] = ((A + 2) * x - (A + 3)) * x * x + 1; | |||
276 | coeff->coeffs[2] = ((A + 2) * (1 - x) - (A + 3)) * (1 - x) * (1 - x) + 1; | |||
277 | coeff->coeffs[3] = 1.f - coeff->coeffs[0] - coeff->coeffs[1] - coeff->coeffs[2]; | |||
278 | } | |||
279 | ||||
280 | static void _ccv_resample_cubic_float_only(ccv_dense_matrix_t* a, ccv_dense_matrix_t* b, double rows_scale, double cols_scale) | |||
281 | { | |||
282 | assert(CCV_GET_DATA_TYPE(b->type) == CCV_32F || CCV_GET_DATA_TYPE(b->type) == CCV_64F)((void) sizeof ((((b->type) & 0xFF000) == CCV_32F || ( (b->type) & 0xFF000) == CCV_64F) ? 1 : 0), __extension__ ({ if (((b->type) & 0xFF000) == CCV_32F || ((b->type ) & 0xFF000) == CCV_64F) ; else __assert_fail ("CCV_GET_DATA_TYPE(b->type) == CCV_32F || CCV_GET_DATA_TYPE(b->type) == CCV_64F" , "ccv_resample.c", 282, __extension__ __PRETTY_FUNCTION__); } )); | |||
283 | int i, j, k, ch = CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF); | |||
284 | assert(b->cols > 0 && b->step > 0)((void) sizeof ((b->cols > 0 && b->step > 0) ? 1 : 0), __extension__ ({ if (b->cols > 0 && b->step > 0) ; else __assert_fail ("b->cols > 0 && b->step > 0" , "ccv_resample.c", 284, __extension__ __PRETTY_FUNCTION__); } )); | |||
285 | unsigned char* workspace = 0; | |||
286 | ccv_cubic_coeffs_t* xofs; | |||
287 | unsigned char* buf; | |||
288 | if (b->step > 2048) | |||
289 | { | |||
290 | workspace = (unsigned char*)ccmallocmalloc(sizeof(ccv_cubic_coeffs_t) * b->cols + b->step * 4); | |||
291 | xofs = (ccv_cubic_coeffs_t*)workspace; | |||
292 | buf = (unsigned char*)(workspace + sizeof(ccv_cubic_coeffs_t) * b->cols); | |||
293 | } else { | |||
294 | xofs = (ccv_cubic_coeffs_t*)alloca(sizeof(ccv_cubic_coeffs_t) * b->cols)__builtin_alloca (sizeof(ccv_cubic_coeffs_t) * b->cols); | |||
295 | buf = (unsigned char*)alloca(b->step * 4)__builtin_alloca (b->step * 4); | |||
296 | } | |||
297 | double scale_x = (double)1 / cols_scale; | |||
298 | for (i = 0; i < b->cols; i++) | |||
299 | { | |||
300 | double sx = (i + 0.5) * scale_x - 0.5; | |||
301 | _ccv_init_cubic_coeffs((int)sx, a->cols, (float)sx, xofs + i); | |||
302 | } | |||
303 | double scale_y = (double)1 / rows_scale; | |||
304 | #ifdef __clang_analyzer__1 | |||
305 | memset(buf, 0, b->step * 4); | |||
306 | #endif | |||
307 | unsigned char* a_ptr = a->data.u8; | |||
308 | unsigned char* b_ptr = b->data.u8; | |||
309 | int psi = -1, siy = 0; | |||
310 | #define for_block(_for_get, _for_set_b, _for_get_b) \ | |||
311 | for (i = 0; i < b->rows; i++) \ | |||
312 | { \ | |||
313 | ccv_cubic_coeffs_t yofs; \ | |||
314 | double sy = (i + 0.5) * scale_y - 0.5; \ | |||
315 | _ccv_init_cubic_coeffs((int)sy, a->rows, (float)sy, &yofs); \ | |||
316 | if (yofs.si[3] > psi) \ | |||
317 | { \ | |||
318 | for (; siy <= yofs.si[3]; siy++) \ | |||
319 | { \ | |||
320 | unsigned char* row = buf + (siy & 0x3) * b->step; \ | |||
321 | for (j = 0; j < b->cols; j++) \ | |||
322 | for (k = 0; k < ch; k++) \ | |||
323 | _for_set_b(row, j * ch + k, _for_get(a_ptr, xofs[j].si[0] * ch + k) * xofs[j].coeffs[0] + \ | |||
324 | _for_get(a_ptr, xofs[j].si[1] * ch + k) * xofs[j].coeffs[1] + \ | |||
325 | _for_get(a_ptr, xofs[j].si[2] * ch + k) * xofs[j].coeffs[2] + \ | |||
326 | _for_get(a_ptr, xofs[j].si[3] * ch + k) * xofs[j].coeffs[3]); \ | |||
327 | a_ptr += a->step; \ | |||
328 | } \ | |||
329 | psi = yofs.si[3]; \ | |||
330 | } \ | |||
331 | unsigned char* row[4] = { \ | |||
332 | buf + (yofs.si[0] & 0x3) * b->step, \ | |||
333 | buf + (yofs.si[1] & 0x3) * b->step, \ | |||
334 | buf + (yofs.si[2] & 0x3) * b->step, \ | |||
335 | buf + (yofs.si[3] & 0x3) * b->step, \ | |||
336 | }; \ | |||
337 | for (j = 0; j < b->cols * ch; j++) \ | |||
338 | _for_set_b(b_ptr, j, _for_get_b(row[0], j, 0) * yofs.coeffs[0] + _for_get_b(row[1], j) * yofs.coeffs[1] + \ | |||
339 | _for_get_b(row[2], j, 0) * yofs.coeffs[2] + _for_get_b(row[3], j) * yofs.coeffs[3]); \ | |||
340 | b_ptr += b->step; \ | |||
341 | } | |||
342 | ccv_matrix_getter(a->type, ccv_matrix_setter_getter_float_only, b->type, for_block){ switch (((a->type) & 0xFF000)) { case CCV_32S: { { switch (((b->type) & 0xFF000)) { case CCV_32F: { for_block(_ccv_get_32s_value , _ccv_set_32f_value, _ccv_get_32f_value); break; } case CCV_64F : { for_block(_ccv_get_32s_value, _ccv_set_64f_value, _ccv_get_64f_value ); break; } default: { ((void) sizeof (((b->type & CCV_32F ) || (b->type & CCV_64F)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32F) || (b->type & CCV_64F)) ; else __assert_fail ("(b->type & CCV_32F) || (b->type & CCV_64F)" , "ccv_resample.c", 342, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_32F: { { switch (((b->type) & 0xFF000)) { case CCV_32F: { for_block(_ccv_get_32f_value, _ccv_set_32f_value , _ccv_get_32f_value); break; } case CCV_64F: { for_block(_ccv_get_32f_value , _ccv_set_64f_value, _ccv_get_64f_value); break; } default: { ((void) sizeof (((b->type & CCV_32F) || (b->type & CCV_64F)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32F ) || (b->type & CCV_64F)) ; else __assert_fail ("(b->type & CCV_32F) || (b->type & CCV_64F)" , "ccv_resample.c", 342, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64S: { { switch (((b->type) & 0xFF000)) { case CCV_32F: { for_block(_ccv_get_64s_value, _ccv_set_32f_value , _ccv_get_32f_value); break; } case CCV_64F: { for_block(_ccv_get_64s_value , _ccv_set_64f_value, _ccv_get_64f_value); break; } default: { ((void) sizeof (((b->type & CCV_32F) || (b->type & CCV_64F)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32F ) || (b->type & CCV_64F)) ; else __assert_fail ("(b->type & CCV_32F) || (b->type & CCV_64F)" , "ccv_resample.c", 342, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64F: { { switch (((b->type) & 0xFF000)) { case CCV_32F: { for_block(_ccv_get_64f_value, _ccv_set_32f_value , _ccv_get_32f_value); break; } case CCV_64F: { for_block(_ccv_get_64f_value , _ccv_set_64f_value, _ccv_get_64f_value); break; } default: { ((void) sizeof (((b->type & CCV_32F) || (b->type & CCV_64F)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32F ) || (b->type & CCV_64F)) ; else __assert_fail ("(b->type & CCV_32F) || (b->type & CCV_64F)" , "ccv_resample.c", 342, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } default: { { switch (((b->type) & 0xFF000 )) { case CCV_32F: { for_block(_ccv_get_8u_value, _ccv_set_32f_value , _ccv_get_32f_value); break; } case CCV_64F: { for_block(_ccv_get_8u_value , _ccv_set_64f_value, _ccv_get_64f_value); break; } default: { ((void) sizeof (((b->type & CCV_32F) || (b->type & CCV_64F)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32F ) || (b->type & CCV_64F)) ; else __assert_fail ("(b->type & CCV_32F) || (b->type & CCV_64F)" , "ccv_resample.c", 342, __extension__ __PRETTY_FUNCTION__); } )); } } }; } } }; | |||
343 | #undef for_block | |||
344 | if (workspace) | |||
345 | ccfreefree(workspace); | |||
346 | } | |||
347 | ||||
348 | static void _ccv_init_cubic_integer_coeffs(int si, int sz, float s, ccv_cubic_integer_coeffs_t* coeff) | |||
349 | { | |||
350 | const float A = -0.75f; | |||
351 | coeff->si[0] = ccv_min(ccv_max(si - 1, 0), sz - 1)({ typeof (({ typeof (si - 1) _a = (si - 1); typeof (0) _b = ( 0); (_a > _b) ? _a : _b; })) _a = (({ typeof (si - 1) _a = (si - 1); typeof (0) _b = (0); (_a > _b) ? _a : _b; })); typeof (sz - 1) _b = (sz - 1); (_a < _b) ? _a : _b; }); | |||
352 | coeff->si[1] = ccv_min(ccv_max(si, 0), sz - 1)({ typeof (({ typeof (si) _a = (si); typeof (0) _b = (0); (_a > _b) ? _a : _b; })) _a = (({ typeof (si) _a = (si); typeof (0) _b = (0); (_a > _b) ? _a : _b; })); typeof (sz - 1) _b = (sz - 1); (_a < _b) ? _a : _b; }); | |||
353 | coeff->si[2] = ccv_min(ccv_max(si + 1, 0), sz - 1)({ typeof (({ typeof (si + 1) _a = (si + 1); typeof (0) _b = ( 0); (_a > _b) ? _a : _b; })) _a = (({ typeof (si + 1) _a = (si + 1); typeof (0) _b = (0); (_a > _b) ? _a : _b; })); typeof (sz - 1) _b = (sz - 1); (_a < _b) ? _a : _b; }); | |||
354 | coeff->si[3] = ccv_min(ccv_max(si + 2, 0), sz - 1)({ typeof (({ typeof (si + 2) _a = (si + 2); typeof (0) _b = ( 0); (_a > _b) ? _a : _b; })) _a = (({ typeof (si + 2) _a = (si + 2); typeof (0) _b = (0); (_a > _b) ? _a : _b; })); typeof (sz - 1) _b = (sz - 1); (_a < _b) ? _a : _b; }); | |||
355 | float x = s - si; | |||
356 | const int W_BITS = 1 << 6; | |||
357 | coeff->coeffs[0] = (int)((((A * (x + 1) - 5 * A) * (x + 1) + 8 * A) * (x + 1) - 4 * A) * W_BITS + 0.5); | |||
358 | coeff->coeffs[1] = (int)((((A + 2) * x - (A + 3)) * x * x + 1) * W_BITS + 0.5); | |||
359 | coeff->coeffs[2] = (int)((((A + 2) * (1 - x) - (A + 3)) * (1 - x) * (1 - x) + 1) * W_BITS + 0.5); | |||
360 | coeff->coeffs[3] = W_BITS - coeff->coeffs[0] - coeff->coeffs[1] - coeff->coeffs[2]; | |||
361 | } | |||
362 | ||||
363 | static void _ccv_resample_cubic_integer_only(ccv_dense_matrix_t* a, ccv_dense_matrix_t* b, double rows_scale, double cols_scale) | |||
364 | { | |||
365 | assert(CCV_GET_DATA_TYPE(b->type) == CCV_8U || CCV_GET_DATA_TYPE(b->type) == CCV_32S || CCV_GET_DATA_TYPE(b->type) == CCV_64S)((void) sizeof ((((b->type) & 0xFF000) == CCV_8U || (( b->type) & 0xFF000) == CCV_32S || ((b->type) & 0xFF000 ) == CCV_64S) ? 1 : 0), __extension__ ({ if (((b->type) & 0xFF000) == CCV_8U || ((b->type) & 0xFF000) == CCV_32S || ((b->type) & 0xFF000) == CCV_64S) ; else __assert_fail ("CCV_GET_DATA_TYPE(b->type) == CCV_8U || CCV_GET_DATA_TYPE(b->type) == CCV_32S || CCV_GET_DATA_TYPE(b->type) == CCV_64S" , "ccv_resample.c", 365, __extension__ __PRETTY_FUNCTION__); } )); | |||
366 | int i, j, k, ch = CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF); | |||
367 | int no_8u_type = (b->type & CCV_8U) ? CCV_32S : b->type; | |||
368 | assert(b->cols > 0)((void) sizeof ((b->cols > 0) ? 1 : 0), __extension__ ( { if (b->cols > 0) ; else __assert_fail ("b->cols > 0" , "ccv_resample.c", 368, __extension__ __PRETTY_FUNCTION__); } )); | |||
369 | unsigned char* workspace = 0; | |||
370 | ccv_cubic_integer_coeffs_t* xofs; | |||
371 | unsigned char* buf; | |||
372 | int bufstep = b->cols * ch * CCV_GET_DATA_TYPE_SIZE(no_8u_type)_ccv_get_data_type_size[((no_8u_type) & 0xFF000) >> 12]; | |||
373 | if (b->step > 2048) | |||
374 | { | |||
375 | workspace = (unsigned char*)ccmallocmalloc(sizeof(ccv_cubic_integer_coeffs_t) * b->cols + bufstep * 4); | |||
376 | xofs = (ccv_cubic_integer_coeffs_t*)workspace; | |||
377 | buf = (unsigned char*)(workspace + sizeof(ccv_cubic_integer_coeffs_t) * b->cols); | |||
378 | } else { | |||
379 | xofs = (ccv_cubic_integer_coeffs_t*)alloca(sizeof(ccv_cubic_integer_coeffs_t) * b->cols)__builtin_alloca (sizeof(ccv_cubic_integer_coeffs_t) * b-> cols); | |||
380 | buf = (unsigned char*)alloca(bufstep * 4)__builtin_alloca (bufstep * 4); | |||
381 | } | |||
382 | double scale_x = (double)1 / cols_scale; | |||
383 | for (i = 0; i < b->cols; i++) | |||
384 | { | |||
385 | double sx = (i + 0.5) * scale_x - 0.5; | |||
386 | _ccv_init_cubic_integer_coeffs((int)sx, a->cols, (float)sx, xofs + i); | |||
387 | } | |||
388 | double scale_y = (double)1 / rows_scale; | |||
389 | #ifdef __clang_analyzer__1 | |||
390 | memset(buf, 0, bufstep * 4); | |||
391 | #endif | |||
392 | unsigned char* a_ptr = a->data.u8; | |||
393 | unsigned char* b_ptr = b->data.u8; | |||
394 | int psi = -1, siy = 0; | |||
395 | #define for_block(_for_get_a, _for_set, _for_get, _for_set_b) \ | |||
396 | for (i = 0; i < b->rows; i++) \ | |||
397 | { \ | |||
398 | ccv_cubic_integer_coeffs_t yofs; \ | |||
399 | double sy = (i + 0.5) * scale_y - 0.5; \ | |||
400 | _ccv_init_cubic_integer_coeffs((int)sy, a->rows, (float)sy, &yofs); \ | |||
401 | if (yofs.si[3] > psi) \ | |||
402 | { \ | |||
403 | for (; siy <= yofs.si[3]; siy++) \ | |||
404 | { \ | |||
405 | unsigned char* row = buf + (siy & 0x3) * bufstep; \ | |||
406 | for (j = 0; j < b->cols; j++) \ | |||
407 | for (k = 0; k < ch; k++) \ | |||
408 | _for_set(row, j * ch + k, _for_get_a(a_ptr, xofs[j].si[0] * ch + k) * xofs[j].coeffs[0] + \ | |||
409 | _for_get_a(a_ptr, xofs[j].si[1] * ch + k) * xofs[j].coeffs[1] + \ | |||
410 | _for_get_a(a_ptr, xofs[j].si[2] * ch + k) * xofs[j].coeffs[2] + \ | |||
411 | _for_get_a(a_ptr, xofs[j].si[3] * ch + k) * xofs[j].coeffs[3]); \ | |||
412 | a_ptr += a->step; \ | |||
413 | } \ | |||
414 | psi = yofs.si[3]; \ | |||
415 | } \ | |||
416 | unsigned char* row[4] = { \ | |||
417 | buf + (yofs.si[0] & 0x3) * bufstep, \ | |||
418 | buf + (yofs.si[1] & 0x3) * bufstep, \ | |||
419 | buf + (yofs.si[2] & 0x3) * bufstep, \ | |||
420 | buf + (yofs.si[3] & 0x3) * bufstep, \ | |||
421 | }; \ | |||
422 | for (j = 0; j < b->cols * ch; j++) \ | |||
423 | _for_set_b(b_ptr, j, ccv_descale(_for_get(row[0], j) * yofs.coeffs[0] + _for_get(row[1], j) * yofs.coeffs[1] + \(((_for_get(row[0], j) * yofs.coeffs[0] + _for_get(row[1], j) * yofs.coeffs[1] + _for_get(row[2], j) * yofs.coeffs[2] + _for_get (row[3], j) * yofs.coeffs[3]) + (1 << ((12) - 1))) >> (12)) | |||
424 | _for_get(row[2], j) * yofs.coeffs[2] + _for_get(row[3], j) * yofs.coeffs[3], 12)(((_for_get(row[0], j) * yofs.coeffs[0] + _for_get(row[1], j) * yofs.coeffs[1] + _for_get(row[2], j) * yofs.coeffs[2] + _for_get (row[3], j) * yofs.coeffs[3]) + (1 << ((12) - 1))) >> (12))); \ | |||
425 | b_ptr += b->step; \ | |||
426 | } | |||
427 | ccv_matrix_getter(a->type, ccv_matrix_setter_getter_integer_only, no_8u_type, ccv_matrix_setter_integer_only, b->type, for_block){ switch (((a->type) & 0xFF000)) { case CCV_32S: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (( (b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_32s_value) ; break; } case CCV_64S: { for_block(_ccv_get_32s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_64s_value); break; } case CCV_8U : { for_block(_ccv_get_32s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_8u_value); break; } default: { ((void) sizeof (((b ->type & CCV_32S) || (b->type & CCV_64S) || (b-> type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64S: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_32s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_32s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_8u_value); break; } default: { ((void) sizeof (((b->type & CCV_32S ) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_8U: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_32s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_32s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); break ; } default: { ((void) sizeof (((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b-> type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U )) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ; else __assert_fail ("(no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_32F: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((b->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_32f_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_32f_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_32f_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_8u_value); break; } default: { ((void) sizeof (((b->type & CCV_32S ) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64S: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32f_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_32f_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_32f_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_8u_value); break; } default: { ((void) sizeof (((b->type & CCV_32S ) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_8U: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32f_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_32f_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_32f_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); break ; } default: { ((void) sizeof (((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b-> type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U )) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ; else __assert_fail ("(no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64S: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((b->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_64s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_64s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_64s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_8u_value); break; } default: { ((void) sizeof (((b->type & CCV_32S ) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64S: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_64s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_64s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_8u_value); break; } default: { ((void) sizeof (((b->type & CCV_32S ) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_8U: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_64s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_64s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); break ; } default: { ((void) sizeof (((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b-> type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U )) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ; else __assert_fail ("(no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64F: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((b->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_64f_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_64f_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_64f_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_8u_value); break; } default: { ((void) sizeof (((b->type & CCV_32S ) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64S: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64f_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_64f_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_64f_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_8u_value); break; } default: { ((void) sizeof (((b->type & CCV_32S ) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_8U: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64f_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_64f_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_64f_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); break ; } default: { ((void) sizeof (((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b-> type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U )) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ; else __assert_fail ("(no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } default: { { switch (((no_8u_type) & 0xFF000 )) { case CCV_32S: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_8u_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_8u_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_8u_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_8u_value); break; } default: { ((void) sizeof (((b->type & CCV_32S ) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64S: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_8u_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_8u_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_8u_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_8u_value); break; } default: { ((void) sizeof (((b->type & CCV_32S ) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_8U: { { switch (((b->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_8u_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32s_value); break; } case CCV_64S : { for_block(_ccv_get_8u_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64s_value); break; } case CCV_8U: { for_block(_ccv_get_8u_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); break ; } default: { ((void) sizeof (((b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((b->type & CCV_32S) || (b-> type & CCV_64S) || (b->type & CCV_8U)) ; else __assert_fail ("(b->type & CCV_32S) || (b->type & CCV_64S) || (b->type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U )) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ; else __assert_fail ("(no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)" , "ccv_resample.c", 427, __extension__ __PRETTY_FUNCTION__); } )); } } }; } } }; | |||
428 | #undef for_block | |||
429 | if (workspace) | |||
430 | ccfreefree(workspace); | |||
431 | } | |||
432 | ||||
433 | void ccv_resample(ccv_dense_matrix_t* a, ccv_dense_matrix_t** b, int btype, double rows_scale, double cols_scale, int type) | |||
434 | { | |||
435 | assert(rows_scale > 0 && cols_scale > 0)((void) sizeof ((rows_scale > 0 && cols_scale > 0) ? 1 : 0), __extension__ ({ if (rows_scale > 0 && cols_scale > 0) ; else __assert_fail ("rows_scale > 0 && cols_scale > 0" , "ccv_resample.c", 435, __extension__ __PRETTY_FUNCTION__); } )); | |||
436 | ccv_declare_derived_signature(sig, a->sig != 0, ccv_sign_with_format(64, "ccv_resample(%f,%f,%d)", rows_scale, cols_scale, type), a->sig, CCV_EOF_SIGN)char _ccv_identifier_436[(64)]; memset(_ccv_identifier_436, 0 , (64)); snprintf(_ccv_identifier_436, (64), ("ccv_resample(%f,%f,%d)" ), rows_scale, cols_scale, type); size_t _ccv_string_size_436 = (64);; uint64_t sig = (a->sig != 0) ? ccv_cache_generate_signature (_ccv_identifier_436, _ccv_string_size_436, a->sig, ((uint64_t )0)) : 0;; | |||
437 | btype = (btype == 0) ? CCV_GET_DATA_TYPE(a->type)((a->type) & 0xFF000) | CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF) : CCV_GET_DATA_TYPE(btype)((btype) & 0xFF000) | CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF); | |||
438 | int rows, cols; | |||
439 | if (*b) | |||
440 | { | |||
441 | rows = (*b)->rows; | |||
442 | cols = (*b)->cols; | |||
443 | } else { | |||
444 | rows = (int)(a->rows * rows_scale + 0.5); | |||
445 | cols = (int)(a->cols * cols_scale + 0.5); | |||
446 | } | |||
447 | ccv_dense_matrix_t* db = *b = ccv_dense_matrix_renew(*b, rows, cols, CCV_ALL_DATA_TYPE(CCV_8U | CCV_32S | CCV_32F | CCV_64S | CCV_64F | CCV_16F | CCV_QX ) | CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF), btype, sig); | |||
448 | ccv_object_return_if_cached(, db){ if ((!(db) || (((int*)(db))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE))) { (void)((db) && (((int*)(db))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~ CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE ));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE) );(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)) ;(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)); (void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));( void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void )((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void) ((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)( (0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)(( 0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0 ) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ( ((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (( (int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ((( int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int *)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int* )(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*) (0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)( 0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0 ))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0) )[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0)) [0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[ 0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0 ] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~ CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE ));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE) );(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)) ;(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)); (void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));( void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void )((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void) ((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)( (0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)(( 0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0 ) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ( ((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (( (int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ((( int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int *)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int* )(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*) (0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)( 0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0 ))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0) )[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0)) [0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[ 0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0 ] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~ CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE ));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE) );(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)) ;(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)); (void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));; ; return ; } }; | |||
449 | if (a->rows == db->rows && a->cols == db->cols) | |||
450 | { | |||
451 | if (CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF) == CCV_GET_CHANNEL(db->type)((db->type) & 0xFFF) && CCV_GET_DATA_TYPE(db->type)((db->type) & 0xFF000) == CCV_GET_DATA_TYPE(a->type)((a->type) & 0xFF000)) | |||
452 | memcpy(db->data.u8, a->data.u8, a->rows * a->step); | |||
453 | else { | |||
454 | ccv_shift(a, (ccv_matrix_t**)&db, 0, 0, 0); | |||
455 | } | |||
456 | return; | |||
457 | } | |||
458 | if ((type & CCV_INTER_AREA) && a->rows >= db->rows && a->cols >= db->cols) | |||
459 | { | |||
460 | /* using the fast alternative (fix point scale, 0x100 to avoid overflow) */ | |||
461 | if (CCV_GET_DATA_TYPE(a->type)((a->type) & 0xFF000) == CCV_8U && CCV_GET_DATA_TYPE(db->type)((db->type) & 0xFF000) == CCV_8U && a->rows * a->cols / (db->rows * db->cols) < 0x100) | |||
462 | _ccv_resample_area_8u(a, db, rows_scale, cols_scale); | |||
463 | else | |||
464 | _ccv_resample_area(a, db, rows_scale, cols_scale); | |||
465 | } else if (type & CCV_INTER_CUBIC) { | |||
466 | if (CCV_GET_DATA_TYPE(db->type)((db->type) & 0xFF000) == CCV_32F || CCV_GET_DATA_TYPE(db->type)((db->type) & 0xFF000) == CCV_64F) | |||
467 | _ccv_resample_cubic_float_only(a, db, rows_scale, cols_scale); | |||
468 | else | |||
469 | _ccv_resample_cubic_integer_only(a, db, rows_scale, cols_scale); | |||
470 | } else if (type & CCV_INTER_LINEAR) { | |||
471 | assert(0 && "CCV_INTER_LINEAR is not implemented")((void) sizeof ((0 && "CCV_INTER_LINEAR is not implemented" ) ? 1 : 0), __extension__ ({ if (0 && "CCV_INTER_LINEAR is not implemented" ) ; else __assert_fail ("0 && \"CCV_INTER_LINEAR is not implemented\"" , "ccv_resample.c", 471, __extension__ __PRETTY_FUNCTION__); } )); | |||
472 | } else if (type & CCV_INTER_LANCZOS) { | |||
473 | assert(0 && "CCV_INTER_LANCZOS is not implemented")((void) sizeof ((0 && "CCV_INTER_LANCZOS is not implemented" ) ? 1 : 0), __extension__ ({ if (0 && "CCV_INTER_LANCZOS is not implemented" ) ; else __assert_fail ("0 && \"CCV_INTER_LANCZOS is not implemented\"" , "ccv_resample.c", 473, __extension__ __PRETTY_FUNCTION__); } )); | |||
474 | } else { | |||
475 | assert(0 && "Not implemented")((void) sizeof ((0 && "Not implemented") ? 1 : 0), __extension__ ({ if (0 && "Not implemented") ; else __assert_fail ( "0 && \"Not implemented\"", "ccv_resample.c", 475, __extension__ __PRETTY_FUNCTION__); })); | |||
476 | } | |||
477 | } | |||
478 | ||||
479 | /* the following code is adopted from OpenCV cvPyrDown */ | |||
480 | void ccv_sample_down(ccv_dense_matrix_t* a, ccv_dense_matrix_t** b, int type, int src_x, int src_y) | |||
481 | { | |||
482 | assert(src_x >= 0 && src_y >= 0)((void) sizeof ((src_x >= 0 && src_y >= 0) ? 1 : 0), __extension__ ({ if (src_x >= 0 && src_y >= 0) ; else __assert_fail ("src_x >= 0 && src_y >= 0" , "ccv_resample.c", 482, __extension__ __PRETTY_FUNCTION__); } )); | |||
483 | ccv_declare_derived_signature(sig, a->sig != 0, ccv_sign_with_format(64, "ccv_sample_down(%d,%d)", src_x, src_y), a->sig, CCV_EOF_SIGN)char _ccv_identifier_483[(64)]; memset(_ccv_identifier_483, 0 , (64)); snprintf(_ccv_identifier_483, (64), ("ccv_sample_down(%d,%d)" ), src_x, src_y); size_t _ccv_string_size_483 = (64);; uint64_t sig = (a->sig != 0) ? ccv_cache_generate_signature(_ccv_identifier_483 , _ccv_string_size_483, a->sig, ((uint64_t)0)) : 0;; | |||
484 | type = (type == 0) ? CCV_GET_DATA_TYPE(a->type)((a->type) & 0xFF000) | CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF) : CCV_GET_DATA_TYPE(type)((type) & 0xFF000) | CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF); | |||
485 | ccv_dense_matrix_t* db = *b = ccv_dense_matrix_renew(*b, a->rows / 2, a->cols / 2, CCV_ALL_DATA_TYPE(CCV_8U | CCV_32S | CCV_32F | CCV_64S | CCV_64F | CCV_16F | CCV_QX ) | CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF), type, sig); | |||
486 | ccv_object_return_if_cached(, db){ if ((!(db) || (((int*)(db))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE))) { (void)((db) && (((int*)(db))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~ CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE ));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE) );(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)) ;(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)); (void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));( void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void )((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void) ((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)( (0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)(( 0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0 ) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ( ((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (( (int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ((( int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int *)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int* )(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*) (0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)( 0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0 ))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0) )[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0)) [0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[ 0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0 ] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~ CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE ));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE) );(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)) ;(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)); (void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));( void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void )((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void) ((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)( (0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)(( 0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0 ) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ( ((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (( (int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ((( int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int *)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int* )(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*) (0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)( 0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0 ))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0) )[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0)) [0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[ 0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0 ] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~ CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE ));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE) );(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)) ;(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)); (void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));; ; return ; } }; | |||
487 | int ch = CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF); | |||
488 | int cols0 = db->cols - 1 - src_x; | |||
489 | int dy, sy = -2 + src_y, sx = src_x * ch, dx, k; | |||
490 | unsigned char* workspace = 0; | |||
491 | int* tab; | |||
492 | unsigned char* buf; | |||
493 | if (a->cols + src_x + 2 > 1024 || db->cols * ch > 1024) | |||
494 | { | |||
495 | workspace = (unsigned char*)ccmallocmalloc((a->cols + src_x + 2) * ch * sizeof(int) + 5 * db->cols * ch * ccv_max(CCV_GET_DATA_TYPE_SIZE(db->type), sizeof(int))({ typeof (_ccv_get_data_type_size[((db->type) & 0xFF000 ) >> 12]) _a = (_ccv_get_data_type_size[((db->type) & 0xFF000) >> 12]); typeof (sizeof(int)) _b = (sizeof(int )); (_a > _b) ? _a : _b; })); | |||
496 | tab = (int*)workspace; | |||
497 | buf = (unsigned char*)(workspace + (a->cols + src_x + 2) * ch * sizeof(int)); | |||
498 | } else { | |||
499 | tab = (int*)alloca((a->cols + src_x + 2) * ch * sizeof(int))__builtin_alloca ((a->cols + src_x + 2) * ch * sizeof(int) ); | |||
500 | buf = (unsigned char*)alloca(5 * db->cols * ch * ccv_max(CCV_GET_DATA_TYPE_SIZE(db->type), sizeof(int)))__builtin_alloca (5 * db->cols * ch * ({ typeof (_ccv_get_data_type_size [((db->type) & 0xFF000) >> 12]) _a = (_ccv_get_data_type_size [((db->type) & 0xFF000) >> 12]); typeof (sizeof( int)) _b = (sizeof(int)); (_a > _b) ? _a : _b; })); | |||
501 | } | |||
502 | for (dx = 0; dx < a->cols + src_x + 2; dx++) | |||
503 | for (k = 0; k < ch; k++) | |||
504 | tab[dx * ch + k] = ((dx >= a->cols) ? a->cols * 2 - 1 - dx : dx) * ch + k; | |||
505 | int bufstep = db->cols * ch * ccv_max(CCV_GET_DATA_TYPE_SIZE(db->type), sizeof(int))({ typeof (_ccv_get_data_type_size[((db->type) & 0xFF000 ) >> 12]) _a = (_ccv_get_data_type_size[((db->type) & 0xFF000) >> 12]); typeof (sizeof(int)) _b = (sizeof(int )); (_a > _b) ? _a : _b; }); | |||
506 | #ifdef __clang_analyzer__1 | |||
507 | memset(buf, 0, 5 * bufstep); | |||
508 | #endif | |||
509 | unsigned char* b_ptr = db->data.u8; | |||
510 | /* why is src_y * 4 in computing the offset of row? | |||
511 | * Essentially, it means sy - src_y but in a manner that doesn't result negative number. | |||
512 | * notice that we added src_y before when computing sy in the first place, however, | |||
513 | * it is not desirable to have that offset when we try to wrap it into our 5-row buffer ( | |||
514 | * because in later rearrangement, we have no src_y to backup the arrangement). In | |||
515 | * such micro scope, we managed to stripe 5 addition into one shift and addition. */ | |||
516 | #define for_block(_for_get_a, _for_set, _for_get, _for_set_b) \ | |||
517 | for (dy = 0; dy < db->rows; dy++) \ | |||
518 | { \ | |||
519 | for(; sy <= dy * 2 + 2 + src_y; sy++) \ | |||
520 | { \ | |||
521 | unsigned char* row = buf + ((sy + src_y * 4 + 2) % 5) * bufstep; \ | |||
522 | int _sy = (sy < 0) ? -1 - sy : (sy >= a->rows) ? a->rows * 2 - 1 - sy : sy; \ | |||
523 | unsigned char* a_ptr = a->data.u8 + a->step * _sy; \ | |||
524 | for (k = 0; k < ch; k++) \ | |||
525 | _for_set(row, k, _for_get_a(a_ptr, sx + k) * 10 + _for_get_a(a_ptr, ch + sx + k) * 5 + _for_get_a(a_ptr, 2 * ch + sx + k)); \ | |||
526 | for(dx = ch; dx < cols0 * ch; dx += ch) \ | |||
527 | for (k = 0; k < ch; k++) \ | |||
528 | _for_set(row, dx + k, _for_get_a(a_ptr, dx * 2 + sx + k) * 6 + (_for_get_a(a_ptr, dx * 2 + sx + k - ch) + _for_get_a(a_ptr, dx * 2 + sx + k + ch)) * 4 + _for_get_a(a_ptr, dx * 2 + sx + k - ch * 2) + _for_get_a(a_ptr, dx * 2 + sx + k + ch * 2)); \ | |||
529 | x_block(_for_get_a, _for_set, _for_get, _for_set_b); \ | |||
530 | } \ | |||
531 | unsigned char* rows[5]; \ | |||
532 | for(k = 0; k < 5; k++) \ | |||
533 | rows[k] = buf + ((dy * 2 + k) % 5) * bufstep; \ | |||
534 | for(dx = 0; dx < db->cols * ch; dx++) \ | |||
535 | _for_set_b(b_ptr, dx, (_for_get(rows[2], dx) * 6 + (_for_get(rows[1], dx) + _for_get(rows[3], dx)) * 4 + _for_get(rows[0], dx) + _for_get(rows[4], dx)) / 256); \ | |||
536 | b_ptr += db->step; \ | |||
537 | } | |||
538 | int no_8u_type = (a->type & CCV_8U) ? CCV_32S : a->type; | |||
539 | if (src_x > 0) | |||
540 | { | |||
541 | #define x_block(_for_get_a, _for_set, _for_get, _for_set_b) \ | |||
542 | for (dx = cols0 * ch; dx < db->cols * ch; dx += ch) \ | |||
543 | for (k = 0; k < ch; k++) \ | |||
544 | _for_set(row, dx + k, _for_get_a(a_ptr, tab[dx * 2 + sx + k]) * 6 + (_for_get_a(a_ptr, tab[dx * 2 + sx + k - ch]) + _for_get_a(a_ptr, tab[dx * 2 + sx + k + ch])) * 4 + _for_get_a(a_ptr, tab[dx * 2 + sx + k - ch * 2]) + _for_get_a(a_ptr, tab[dx * 2 + sx + k + ch * 2])); | |||
545 | ccv_matrix_getter_a(a->type, ccv_matrix_setter_getter, no_8u_type, ccv_matrix_setter_b, db->type, for_block){ switch (((a->type) & 0xFF000)) { case CCV_32S: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (( (db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_32s_value) ; break; } case CCV_32F: { for_block(_ccv_get_32s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_32s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_8u_value); } } }; break; } case CCV_32F: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_32s_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32s_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_32s_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_32s_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32s_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_32s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_32s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_32s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_32s_value, _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_32s_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32s_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32s_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_32s_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_8u_value); } } }; break; } default : { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32f_value); break ; } case CCV_64S: { for_block(_ccv_get_32s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_32s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); } } }; } } }; break; } case CCV_32F: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32f_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_32f_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_32f_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_32f_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32f_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_8u_value); } } }; break; } case CCV_32F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_32f_value, _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_32f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_32f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_32f_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32f_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_32f_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_32f_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32f_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_32f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_32f_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_32f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_8u_value); } } }; break; } default: { { switch ((( db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32f_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32s_value); break ; } case CCV_32F: { for_block(_ccv_get_32f_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32f_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32f_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_64f_value); break ; } default: { for_block(_ccv_get_32f_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_8u_value); } } }; } } }; break; } case CCV_64S: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_64s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_64s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_64s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_8u_value); } } }; break; } case CCV_32F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64s_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_64s_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64s_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_64s_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_64s_value, _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_64s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_64s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_64s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_64s_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64s_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_64s_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_64s_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_8u_value); } } }; break; } default: { { switch (((db->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_64s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_64s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_64s_value); break ; } case CCV_64F: { for_block(_ccv_get_64s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_8u_value); } } }; } } }; break; } case CCV_64F: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_64f_value, _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_64f_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_64f_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64f_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_64f_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_8u_value); } } }; break; } case CCV_32F: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_64f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_64f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_64f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64f_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_64f_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64f_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_64f_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64f_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_64f_value, _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_64f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_64f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64f_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_64f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_8u_value); } } }; break; } default : { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64f_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64f_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32f_value); break ; } case CCV_64S: { for_block(_ccv_get_64f_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_64f_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64f_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); } } }; } } }; break; } default: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_8u_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_8u_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_8u_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_8u_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_8u_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_8u_value); } } }; break; } case CCV_32F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_8u_value, _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_8u_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_8u_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_8u_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_8u_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_8u_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_8u_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_8u_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_8u_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_8u_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_8u_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_8u_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_8u_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_8u_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_8u_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_8u_value); } } }; break; } default: { { switch ((( db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_8u_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32s_value); break ; } case CCV_32F: { for_block(_ccv_get_8u_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_8u_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_8u_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_64f_value); break ; } default: { for_block(_ccv_get_8u_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_8u_value); } } }; } } }; } } }; | |||
546 | #undef x_block | |||
547 | } else { | |||
548 | #define x_block(_for_get_a, _for_set, _for_get, _for_set_b) \ | |||
549 | for (k = 0; k < ch; k++) \ | |||
550 | _for_set(row, (db->cols - 1) * ch + k, _for_get_a(a_ptr, a->cols * ch + sx - ch + k) * 10 + _for_get_a(a_ptr, (a->cols - 2) * ch + sx + k) * 5 + _for_get_a(a_ptr, (a->cols - 3) * ch + sx + k)); | |||
551 | ccv_matrix_getter_a(a->type, ccv_matrix_setter_getter, no_8u_type, ccv_matrix_setter_b, db->type, for_block){ switch (((a->type) & 0xFF000)) { case CCV_32S: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (( (db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_32s_value) ; break; } case CCV_32F: { for_block(_ccv_get_32s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_32s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_8u_value); } } }; break; } case CCV_32F: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_32s_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32s_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_32s_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_32s_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32s_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_32s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_32s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_32s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_32s_value, _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_32s_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32s_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32s_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_32s_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_8u_value); } } }; break; } default : { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32f_value); break ; } case CCV_64S: { for_block(_ccv_get_32s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_32s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); } } }; } } }; break; } case CCV_32F: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32f_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_32f_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_32f_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_32f_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32f_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_8u_value); } } }; break; } case CCV_32F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_32f_value, _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_32f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_32f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_32f_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32f_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_32f_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_32f_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32f_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_32f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_32f_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_32f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_8u_value); } } }; break; } default: { { switch ((( db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32f_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32s_value); break ; } case CCV_32F: { for_block(_ccv_get_32f_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32f_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32f_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_64f_value); break ; } default: { for_block(_ccv_get_32f_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_8u_value); } } }; } } }; break; } case CCV_64S: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_64s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_64s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_64s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_8u_value); } } }; break; } case CCV_32F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64s_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_64s_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64s_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_64s_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_64s_value, _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_64s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_64s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_64s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_64s_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64s_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_64s_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_64s_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_8u_value); } } }; break; } default: { { switch (((db->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_64s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_64s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_64s_value); break ; } case CCV_64F: { for_block(_ccv_get_64s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_8u_value); } } }; } } }; break; } case CCV_64F: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_64f_value, _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_64f_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_64f_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64f_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_64f_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_8u_value); } } }; break; } case CCV_32F: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_64f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_64f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_64f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64f_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_64f_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64f_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_64f_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64f_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_64f_value, _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_64f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_64f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64f_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_64f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_8u_value); } } }; break; } default : { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_64f_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64f_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32f_value); break ; } case CCV_64S: { for_block(_ccv_get_64f_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_64f_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64f_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); } } }; } } }; break; } default: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_8u_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_8u_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_8u_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_8u_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_8u_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_8u_value); } } }; break; } case CCV_32F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_8u_value, _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_8u_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_8u_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_8u_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_8u_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_8u_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_8u_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_8u_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_8u_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_8u_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_8u_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_8u_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_8u_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_8u_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_8u_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_8u_value); } } }; break; } default: { { switch ((( db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_8u_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32s_value); break ; } case CCV_32F: { for_block(_ccv_get_8u_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_8u_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_8u_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_64f_value); break ; } default: { for_block(_ccv_get_8u_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_8u_value); } } }; } } }; } } }; | |||
552 | #undef x_block | |||
553 | } | |||
554 | #undef for_block | |||
555 | if (workspace) | |||
556 | ccfreefree(workspace); | |||
557 | } | |||
558 | ||||
559 | void ccv_sample_up(ccv_dense_matrix_t* a, ccv_dense_matrix_t** b, int type, int src_x, int src_y) | |||
560 | { | |||
561 | assert(src_x >= 0 && src_y >= 0)((void) sizeof ((src_x >= 0 && src_y >= 0) ? 1 : 0), __extension__ ({ if (src_x >= 0 && src_y >= 0) ; else __assert_fail ("src_x >= 0 && src_y >= 0" , "ccv_resample.c", 561, __extension__ __PRETTY_FUNCTION__); } )); | |||
562 | ccv_declare_derived_signature(sig, a->sig != 0, ccv_sign_with_format(64, "ccv_sample_up(%d,%d)", src_x, src_y), a->sig, CCV_EOF_SIGN)char _ccv_identifier_562[(64)]; memset(_ccv_identifier_562, 0 , (64)); snprintf(_ccv_identifier_562, (64), ("ccv_sample_up(%d,%d)" ), src_x, src_y); size_t _ccv_string_size_562 = (64);; uint64_t sig = (a->sig != 0) ? ccv_cache_generate_signature(_ccv_identifier_562 , _ccv_string_size_562, a->sig, ((uint64_t)0)) : 0;; | |||
563 | type = (type == 0) ? CCV_GET_DATA_TYPE(a->type)((a->type) & 0xFF000) | CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF) : CCV_GET_DATA_TYPE(type)((type) & 0xFF000) | CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF); | |||
564 | ccv_dense_matrix_t* db = *b = ccv_dense_matrix_renew(*b, a->rows * 2, a->cols * 2, CCV_ALL_DATA_TYPE(CCV_8U | CCV_32S | CCV_32F | CCV_64S | CCV_64F | CCV_16F | CCV_QX ) | CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF), type, sig); | |||
565 | ccv_object_return_if_cached(, db){ if ((!(db) || (((int*)(db))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE )) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0 ) || (((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || ( ((int*)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int *)(0))[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0) )[0] & CCV_GARBAGE)) && (!(0) || (((int*)(0))[0] & CCV_GARBAGE))) { (void)((db) && (((int*)(db))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~ CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE ));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE) );(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)) ;(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)); (void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));( void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void )((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void) ((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)( (0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)(( 0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0 ) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ( ((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (( (int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ((( int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int *)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int* )(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*) (0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)( 0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0 ))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0) )[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0)) [0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[ 0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0 ] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~ CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE ));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE) );(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)) ;(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)); (void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));( void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void )((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void) ((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)( (0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)(( 0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0 ) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ( ((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (( (int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && ((( int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int *)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int* )(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*) (0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)( 0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0 ))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0) )[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0)) [0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[ 0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0 ] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~ CCV_GARBAGE));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE ));(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE) );(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)) ;(void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE)); (void)((0) && (((int*)(0))[0] &= ~CCV_GARBAGE));; ; return ; } }; | |||
566 | int ch = CCV_GET_CHANNEL(a->type)((a->type) & 0xFFF); | |||
567 | int cols0 = a->cols - 1 - src_x; | |||
568 | assert(a->cols > 0 && cols0 > 0)((void) sizeof ((a->cols > 0 && cols0 > 0) ? 1 : 0), __extension__ ({ if (a->cols > 0 && cols0 > 0) ; else __assert_fail ("a->cols > 0 && cols0 > 0" , "ccv_resample.c", 568, __extension__ __PRETTY_FUNCTION__); } )); | |||
569 | int y, x, sy = -1 + src_y, sx = src_x * ch, k; | |||
570 | unsigned char* workspace = 0; | |||
571 | int* tab; | |||
572 | unsigned char* buf; | |||
573 | if (a->cols + src_x + 2 > 1024 || db->cols * ch > 1024) | |||
574 | { | |||
575 | workspace = (unsigned char*)ccmallocmalloc((a->cols + src_x + 2) * ch * sizeof(int) + 3 * db->cols * ch * ccv_max(CCV_GET_DATA_TYPE_SIZE(db->type), sizeof(int))({ typeof (_ccv_get_data_type_size[((db->type) & 0xFF000 ) >> 12]) _a = (_ccv_get_data_type_size[((db->type) & 0xFF000) >> 12]); typeof (sizeof(int)) _b = (sizeof(int )); (_a > _b) ? _a : _b; })); | |||
576 | tab = (int*)workspace; | |||
577 | buf = (unsigned char*)(workspace + (a->cols + src_x + 2) * ch * sizeof(int)); | |||
578 | } else { | |||
579 | tab = (int*)alloca((a->cols + src_x + 2) * ch * sizeof(int))__builtin_alloca ((a->cols + src_x + 2) * ch * sizeof(int) ); | |||
580 | buf = (unsigned char*)alloca(3 * db->cols * ch * ccv_max(CCV_GET_DATA_TYPE_SIZE(db->type), sizeof(int)))__builtin_alloca (3 * db->cols * ch * ({ typeof (_ccv_get_data_type_size [((db->type) & 0xFF000) >> 12]) _a = (_ccv_get_data_type_size [((db->type) & 0xFF000) >> 12]); typeof (sizeof( int)) _b = (sizeof(int)); (_a > _b) ? _a : _b; })); | |||
581 | } | |||
582 | for (x = 0; x < a->cols + src_x + 2; x++) | |||
583 | for (k = 0; k < ch; k++) | |||
584 | tab[x * ch + k] = ((x >= a->cols) ? a->cols * 2 - 1 - x : x) * ch + k; | |||
585 | int bufstep = db->cols * ch * ccv_max(CCV_GET_DATA_TYPE_SIZE(db->type), sizeof(int))({ typeof (_ccv_get_data_type_size[((db->type) & 0xFF000 ) >> 12]) _a = (_ccv_get_data_type_size[((db->type) & 0xFF000) >> 12]); typeof (sizeof(int)) _b = (sizeof(int )); (_a > _b) ? _a : _b; }); | |||
586 | #ifdef __clang_analyzer__1 | |||
587 | memset(buf, 0, 3 * bufstep); | |||
588 | #endif | |||
589 | unsigned char* b_ptr = db->data.u8; | |||
590 | /* why src_y * 2: the same argument as in ccv_sample_down */ | |||
591 | #define for_block(_for_get_a, _for_set, _for_get, _for_set_b) \ | |||
592 | for (y = 0; y < a->rows; y++) \ | |||
593 | { \ | |||
594 | for (; sy <= y + 1 + src_y; sy++) \ | |||
595 | { \ | |||
596 | unsigned char* row = buf + ((sy + src_y * 2 + 1) % 3) * bufstep; \ | |||
597 | int _sy = (sy < 0) ? -1 - sy : (sy >= a->rows) ? a->rows * 2 - 1 - sy : sy; \ | |||
598 | unsigned char* a_ptr = a->data.u8 + a->step * _sy; \ | |||
599 | if (a->cols == 1) \ | |||
600 | { \ | |||
601 | for (k = 0; k < ch; k++) \ | |||
602 | { \ | |||
603 | _for_set(row, k, _for_get_a(a_ptr, k) * (G025 + G075 + G125)); \ | |||
604 | _for_set(row, k + ch, _for_get_a(a_ptr, k) * (G025 + G075 + G125)); \ | |||
605 | } \ | |||
606 | continue; \ | |||
607 | } \ | |||
608 | if (sx == 0) \ | |||
609 | { \ | |||
610 | for (k = 0; k < ch; k++) \ | |||
611 | { \ | |||
612 | _for_set(row, k, _for_get_a(a_ptr, k + sx) * (G025 + G075) + _for_get_a(a_ptr, k + sx + ch) * G125); \ | |||
613 | _for_set(row, k + ch, _for_get_a(a_ptr, k + sx) * (G125 + G025) + _for_get_a(a_ptr, k + sx + ch) * G075); \ | |||
614 | } \ | |||
615 | } \ | |||
616 | /* some serious flaw in computing Gaussian weighting in previous version | |||
617 | * specially, we are doing perfect upsampling (2x) so, it concerns a grid like: | |||
618 | * XXYY | |||
619 | * XXYY | |||
620 | * in this case, to upsampling, the weight should be from distance 0.25 and 1.25, and 0.25 and 0.75 | |||
621 | * previously, it was mistakingly be 0.0 1.0, 0.5 0.5 (imperfect upsampling (2x - 1)) */ \ | |||
622 | for (x = (sx == 0) ? ch : 0; x < cols0 * ch; x += ch) \ | |||
623 | { \ | |||
624 | for (k = 0; k < ch; k++) \ | |||
625 | { \ | |||
626 | _for_set(row, x * 2 + k, _for_get_a(a_ptr, x + sx - ch + k) * G075 + _for_get_a(a_ptr, x + sx + k) * G025 + _for_get_a(a_ptr, x + sx + ch + k) * G125); \ | |||
627 | _for_set(row, x * 2 + ch + k, _for_get_a(a_ptr, x + sx - ch + k) * G125 + _for_get_a(a_ptr, x + sx + k) * G025 + _for_get_a(a_ptr, x + sx + ch + k) * G075); \ | |||
628 | } \ | |||
629 | } \ | |||
630 | x_block(_for_get_a, _for_set, _for_get, _for_set_b); \ | |||
631 | } \ | |||
632 | unsigned char* rows[3]; \ | |||
633 | for (k = 0; k < 3; k++) \ | |||
634 | rows[k] = buf + ((y + k) % 3) * bufstep; \ | |||
635 | for (x = 0; x < db->cols * ch; x++) \ | |||
636 | { \ | |||
637 | _for_set_b(b_ptr, x, (_for_get(rows[0], x) * G075 + _for_get(rows[1], x) * G025 + _for_get(rows[2], x) * G125) / GALL); \ | |||
638 | _for_set_b(b_ptr + db->step, x, (_for_get(rows[0], x) * G125 + _for_get(rows[1], x) * G025 + _for_get(rows[2], x) * G075) / GALL); \ | |||
639 | } \ | |||
640 | b_ptr += 2 * db->step; \ | |||
641 | } | |||
642 | int no_8u_type = (a->type & CCV_8U) ? CCV_32S : a->type; | |||
643 | /* unswitch if condition in manual way */ | |||
644 | if ((a->type & CCV_8U) || (a->type & CCV_32S) || (a->type & CCV_64S)) | |||
645 | { | |||
646 | #define G025 (23) | |||
647 | #define G075 (8) | |||
648 | #define G125 (1) | |||
649 | #define GALL (1024) | |||
650 | if (src_x > 0) | |||
651 | { | |||
652 | #define x_block(_for_get_a, _for_set, _for_get, _for_set_b) \ | |||
653 | for (x = cols0 * ch; x < a->cols * ch; x += ch) \ | |||
654 | for (k = 0; k < ch; k++) \ | |||
655 | { \ | |||
656 | _for_set(row, x * 2 + k, _for_get_a(a_ptr, tab[x + sx - ch + k]) * G075 + _for_get_a(a_ptr, tab[x + sx + k]) * G025 + _for_get_a(a_ptr, tab[x + sx + ch + k]) * G125); \ | |||
657 | _for_set(row, x * 2 + ch + k, _for_get_a(a_ptr, tab[x + sx - ch + k]) * G125 + _for_get_a(a_ptr, tab[x + sx + k]) * G025 + _for_get_a(a_ptr, tab[x + sx + ch + k], 0) * G075); \ | |||
658 | } | |||
659 | ccv_matrix_getter_integer_only(a->type, ccv_matrix_setter_getter_integer_only, no_8u_type, ccv_matrix_setter_b, db->type, for_block){ switch (((a->type) & 0xFF000)) { case CCV_32S: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (( (db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_32s_value) ; break; } case CCV_32F: { for_block(_ccv_get_32s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_32s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_32s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_32s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_32s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_8U: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_32s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_32s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_64s_value); break ; } case CCV_64F: { for_block(_ccv_get_32s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_8u_value); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ; else __assert_fail ("(no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)" , "ccv_resample.c", 659, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64S: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_64s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_64s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_64s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_64s_value, _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_64s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_64s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_64s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_8U: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_64s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32f_value); break ; } case CCV_64S: { for_block(_ccv_get_64s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_64s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32S ) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ; else __assert_fail ("(no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)" , "ccv_resample.c", 659, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_8U: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_8u_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_8u_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_8u_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_8u_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_8u_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_8u_value, _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_8u_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_8u_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_8u_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_8u_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_8U: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_8u_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_8u_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32f_value); break ; } case CCV_64S: { for_block(_ccv_get_8u_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_8u_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_8u_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32S ) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ; else __assert_fail ("(no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)" , "ccv_resample.c", 659, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } default: { ((void) sizeof (((a->type & CCV_32S) || (a->type & CCV_64S) || (a->type & CCV_8U )) ? 1 : 0), __extension__ ({ if ((a->type & CCV_32S) || (a->type & CCV_64S) || (a->type & CCV_8U)) ; else __assert_fail ("(a->type & CCV_32S) || (a->type & CCV_64S) || (a->type & CCV_8U)" , "ccv_resample.c", 659, __extension__ __PRETTY_FUNCTION__); } )); } } }; | |||
660 | #undef x_block | |||
661 | } else { | |||
662 | #define x_block(_for_get_a, _for_set, _for_get, _for_set_b) \ | |||
663 | for (k = 0; k < ch; k++) \ | |||
664 | { \ | |||
665 | _for_set(row, (a->cols - 1) * 2 * ch + k, _for_get_a(a_ptr, (a->cols - 2) * ch + k) * G075 + _for_get_a(a_ptr, (a->cols - 1) * ch + k) * (G025 + G125)); \ | |||
666 | _for_set(row, (a->cols - 1) * 2 * ch + ch + k, _for_get_a(a_ptr, (a->cols - 2) * ch + k) * G125 + _for_get_a(a_ptr, (a->cols - 1) * ch + k) * (G025 + G075)); \ | |||
667 | } | |||
668 | ccv_matrix_getter_integer_only(a->type, ccv_matrix_setter_getter_integer_only, no_8u_type, ccv_matrix_setter_b, db->type, for_block){ switch (((a->type) & 0xFF000)) { case CCV_32S: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (( (db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_32s_value) ; break; } case CCV_32F: { for_block(_ccv_get_32s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_32s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_32s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_32s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_32s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_8U: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_32s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_32s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_64s_value); break ; } case CCV_64F: { for_block(_ccv_get_32s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_8u_value); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ; else __assert_fail ("(no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)" , "ccv_resample.c", 668, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64S: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_64s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_64s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64s_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_64s_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_64s_value, _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_64s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_64s_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64s_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_64s_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_8U: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_64s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_64s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32f_value); break ; } case CCV_64S: { for_block(_ccv_get_64s_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_64s_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64s_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32S ) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ; else __assert_fail ("(no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)" , "ccv_resample.c", 668, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_8U: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32S: { { switch (((db->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_8u_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_8u_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_8u_value , _ccv_set_32s_value, _ccv_get_32s_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_8u_value, _ccv_set_32s_value , _ccv_get_32s_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_8u_value, _ccv_set_32s_value, _ccv_get_32s_value , _ccv_set_8u_value); } } }; break; } case CCV_64S: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_8u_value, _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_8u_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_8u_value, _ccv_set_64s_value, _ccv_get_64s_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_8u_value , _ccv_set_64s_value, _ccv_get_64s_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_8u_value, _ccv_set_64s_value , _ccv_get_64s_value, _ccv_set_8u_value); } } }; break; } case CCV_8U: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_8u_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_8u_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_32f_value); break ; } case CCV_64S: { for_block(_ccv_get_8u_value, _ccv_set_8u_value , _ccv_get_8u_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_8u_value, _ccv_set_8u_value, _ccv_get_8u_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_8u_value , _ccv_set_8u_value, _ccv_get_8u_value, _ccv_set_8u_value); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32S ) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)) ; else __assert_fail ("(no_8u_type & CCV_32S) || (no_8u_type & CCV_64S) || (no_8u_type & CCV_8U)" , "ccv_resample.c", 668, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } default: { ((void) sizeof (((a->type & CCV_32S) || (a->type & CCV_64S) || (a->type & CCV_8U )) ? 1 : 0), __extension__ ({ if ((a->type & CCV_32S) || (a->type & CCV_64S) || (a->type & CCV_8U)) ; else __assert_fail ("(a->type & CCV_32S) || (a->type & CCV_64S) || (a->type & CCV_8U)" , "ccv_resample.c", 668, __extension__ __PRETTY_FUNCTION__); } )); } } }; | |||
669 | #undef x_block | |||
670 | } | |||
671 | #undef GALL | |||
672 | #undef G125 | |||
673 | #undef G075 | |||
674 | #undef G025 | |||
675 | } else { | |||
676 | #define G025 (0.705385) | |||
677 | #define G075 (0.259496) | |||
678 | #define G125 (0.035119) | |||
679 | #define GALL (1) | |||
680 | if (src_x > 0) | |||
681 | { | |||
682 | #define x_block(_for_get_a, _for_set, _for_get, _for_set_b) \ | |||
683 | for (x = cols0 * ch; x < a->cols * ch; x += ch) \ | |||
684 | for (k = 0; k < ch; k++) \ | |||
685 | { \ | |||
686 | _for_set(row, x * 2 + k, _for_get_a(a_ptr, tab[x + sx - ch + k]) * G075 + _for_get_a(a_ptr, tab[x + sx + k]) * G025 + _for_get_a(a_ptr, tab[x + sx + ch + k]) * G125); \ | |||
687 | _for_set(row, x * 2 + ch + k, _for_get_a(a_ptr, tab[x + sx - ch + k]) * G125 + _for_get_a(a_ptr, tab[x + sx + k]) * G025 + _for_get_a(a_ptr, tab[x + sx + ch + k]) * G075); \ | |||
688 | } | |||
689 | ccv_matrix_getter_float_only(a->type, ccv_matrix_setter_getter_float_only, no_8u_type, ccv_matrix_setter_b, db->type, for_block){ switch (((a->type) & 0xFF000)) { case CCV_32F: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32F: { { switch (( (db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_32s_value) ; break; } case CCV_32F: { for_block(_ccv_get_32f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_32f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_32f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32f_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_32f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_32f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32f_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_8u_value); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32F) || (no_8u_type & CCV_64F)) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32F) || (no_8u_type & CCV_64F )) ; else __assert_fail ("(no_8u_type & CCV_32F) || (no_8u_type & CCV_64F)" , "ccv_resample.c", 689, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64F: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32F: { { switch (((db->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_64f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_64f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_64f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_64f_value, _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_64f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_64f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64f_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_64f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_8u_value); } } }; break; } default : { ((void) sizeof (((no_8u_type & CCV_32F) || (no_8u_type & CCV_64F)) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32F) || (no_8u_type & CCV_64F)) ; else __assert_fail ("(no_8u_type & CCV_32F) || (no_8u_type & CCV_64F)", "ccv_resample.c", 689, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } default: { ((void) sizeof (((a->type & CCV_32F) || (a->type & CCV_64F)) ? 1 : 0), __extension__ ({ if ((a->type & CCV_32F) || (a->type & CCV_64F )) ; else __assert_fail ("(a->type & CCV_32F) || (a->type & CCV_64F)" , "ccv_resample.c", 689, __extension__ __PRETTY_FUNCTION__); } )); } } }; | |||
690 | #undef x_block | |||
691 | } else { | |||
692 | #define x_block(_for_get_a, _for_set, _for_get, _for_set_b) \ | |||
693 | for (k = 0; k < ch; k++) \ | |||
694 | { \ | |||
695 | _for_set(row, (a->cols - 1) * 2 * ch + k, _for_get_a(a_ptr, (a->cols - 2) * ch + k) * G075 + _for_get_a(a_ptr, (a->cols - 1) * ch + k) * (G025 + G125)); \ | |||
696 | _for_set(row, (a->cols - 1) * 2 * ch + ch + k, _for_get_a(a_ptr, (a->cols - 2) * ch + k) * G125 + _for_get_a(a_ptr, (a->cols - 1) * ch + k) * (G025 + G075)); \ | |||
697 | } | |||
698 | ccv_matrix_getter_float_only(a->type, ccv_matrix_setter_getter_float_only, no_8u_type, ccv_matrix_setter_b, db->type, for_block){ switch (((a->type) & 0xFF000)) { case CCV_32F: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32F: { { switch (( (db->type) & 0xFF000)) { case CCV_32S: { for_block(_ccv_get_32f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_32s_value) ; break; } case CCV_32F: { for_block(_ccv_get_32f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_32f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_32f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_32f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S : { for_block(_ccv_get_32f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_32s_value); break; } case CCV_32F: { for_block(_ccv_get_32f_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_32f_value) ; break; } case CCV_64S: { for_block(_ccv_get_32f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_64s_value); break; } case CCV_64F : { for_block(_ccv_get_32f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_64f_value); break; } default: { for_block(_ccv_get_32f_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_8u_value); } } }; break; } default: { ((void) sizeof (((no_8u_type & CCV_32F) || (no_8u_type & CCV_64F)) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32F) || (no_8u_type & CCV_64F )) ; else __assert_fail ("(no_8u_type & CCV_32F) || (no_8u_type & CCV_64F)" , "ccv_resample.c", 698, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } case CCV_64F: { { switch (((no_8u_type) & 0xFF000)) { case CCV_32F: { { switch (((db->type) & 0xFF000 )) { case CCV_32S: { for_block(_ccv_get_64f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_32s_value); break; } case CCV_32F : { for_block(_ccv_get_64f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_32f_value); break; } case CCV_64S: { for_block(_ccv_get_64f_value , _ccv_set_32f_value, _ccv_get_32f_value, _ccv_set_64s_value) ; break; } case CCV_64F: { for_block(_ccv_get_64f_value, _ccv_set_32f_value , _ccv_get_32f_value, _ccv_set_64f_value); break; } default: { for_block(_ccv_get_64f_value, _ccv_set_32f_value, _ccv_get_32f_value , _ccv_set_8u_value); } } }; break; } case CCV_64F: { { switch (((db->type) & 0xFF000)) { case CCV_32S: { for_block( _ccv_get_64f_value, _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_32s_value ); break; } case CCV_32F: { for_block(_ccv_get_64f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_32f_value); break; } case CCV_64S : { for_block(_ccv_get_64f_value, _ccv_set_64f_value, _ccv_get_64f_value , _ccv_set_64s_value); break; } case CCV_64F: { for_block(_ccv_get_64f_value , _ccv_set_64f_value, _ccv_get_64f_value, _ccv_set_64f_value) ; break; } default: { for_block(_ccv_get_64f_value, _ccv_set_64f_value , _ccv_get_64f_value, _ccv_set_8u_value); } } }; break; } default : { ((void) sizeof (((no_8u_type & CCV_32F) || (no_8u_type & CCV_64F)) ? 1 : 0), __extension__ ({ if ((no_8u_type & CCV_32F) || (no_8u_type & CCV_64F)) ; else __assert_fail ("(no_8u_type & CCV_32F) || (no_8u_type & CCV_64F)", "ccv_resample.c", 698, __extension__ __PRETTY_FUNCTION__); } )); } } }; break; } default: { ((void) sizeof (((a->type & CCV_32F) || (a->type & CCV_64F)) ? 1 : 0), __extension__ ({ if ((a->type & CCV_32F) || (a->type & CCV_64F )) ; else __assert_fail ("(a->type & CCV_32F) || (a->type & CCV_64F)" , "ccv_resample.c", 698, __extension__ __PRETTY_FUNCTION__); } )); } } }; | |||
699 | #undef x_block | |||
700 | } | |||
701 | #undef GALL | |||
702 | #undef G125 | |||
703 | #undef G075 | |||
704 | #undef G025 | |||
705 | } | |||
706 | #undef for_block | |||
707 | if (workspace) | |||
708 | ccfreefree(workspace); | |||
709 | } |