Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 741e53b

Browse files
committed
Templatize _image.resample to deduplicate it.
1 parent 3b576e6 commit 741e53b

File tree

1 file changed

+24
-83
lines changed

1 file changed

+24
-83
lines changed

src/_image_wrapper.cpp

Lines changed: 24 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,19 @@ _get_transform_mesh(PyObject *py_affine, npy_intp *dims)
105105
}
106106

107107

108+
template<class T>
109+
static void
110+
resample(PyArrayObject* input, PyArrayObject* output, resample_params_t params)
111+
{
112+
Py_BEGIN_ALLOW_THREADS
113+
resample(
114+
(T*)PyArray_DATA(input), PyArray_DIM(input, 1), PyArray_DIM(input, 0),
115+
(T*)PyArray_DATA(output), PyArray_DIM(output, 1), PyArray_DIM(output, 0),
116+
params);
117+
Py_END_ALLOW_THREADS
118+
}
119+
120+
108121
static PyObject *
109122
image_resample(PyObject *self, PyObject* args, PyObject *kwargs)
110123
{
@@ -216,56 +229,20 @@ image_resample(PyObject *self, PyObject* args, PyObject *kwargs)
216229
}
217230

218231
if (PyArray_DIM(input_array, 2) == 4) {
219-
switch(PyArray_TYPE(input_array)) {
220-
case NPY_BYTE:
232+
switch (PyArray_TYPE(input_array)) {
221233
case NPY_UINT8:
222-
Py_BEGIN_ALLOW_THREADS
223-
resample(
224-
(agg::rgba8 *)PyArray_DATA(input_array),
225-
PyArray_DIM(input_array, 1),
226-
PyArray_DIM(input_array, 0),
227-
(agg::rgba8 *)PyArray_DATA(output_array),
228-
PyArray_DIM(output_array, 1),
229-
PyArray_DIM(output_array, 0),
230-
params);
231-
Py_END_ALLOW_THREADS
234+
case NPY_INT8:
235+
resample<agg::rgba8>(input_array, output_array, params);
232236
break;
233237
case NPY_UINT16:
234238
case NPY_INT16:
235-
Py_BEGIN_ALLOW_THREADS
236-
resample(
237-
(agg::rgba16 *)PyArray_DATA(input_array),
238-
PyArray_DIM(input_array, 1),
239-
PyArray_DIM(input_array, 0),
240-
(agg::rgba16 *)PyArray_DATA(output_array),
241-
PyArray_DIM(output_array, 1),
242-
PyArray_DIM(output_array, 0),
243-
params);
244-
Py_END_ALLOW_THREADS
239+
resample<agg::rgba16>(input_array, output_array, params);
245240
break;
246241
case NPY_FLOAT32:
247-
Py_BEGIN_ALLOW_THREADS
248-
resample(
249-
(agg::rgba32 *)PyArray_DATA(input_array),
250-
PyArray_DIM(input_array, 1),
251-
PyArray_DIM(input_array, 0),
252-
(agg::rgba32 *)PyArray_DATA(output_array),
253-
PyArray_DIM(output_array, 1),
254-
PyArray_DIM(output_array, 0),
255-
params);
256-
Py_END_ALLOW_THREADS
242+
resample<agg::rgba32>(input_array, output_array, params);
257243
break;
258244
case NPY_FLOAT64:
259-
Py_BEGIN_ALLOW_THREADS
260-
resample(
261-
(agg::rgba64 *)PyArray_DATA(input_array),
262-
PyArray_DIM(input_array, 1),
263-
PyArray_DIM(input_array, 0),
264-
(agg::rgba64 *)PyArray_DATA(output_array),
265-
PyArray_DIM(output_array, 1),
266-
PyArray_DIM(output_array, 0),
267-
params);
268-
Py_END_ALLOW_THREADS
245+
resample<agg::rgba64>(input_array, output_array, params);
269246
break;
270247
default:
271248
PyErr_SetString(
@@ -284,54 +261,18 @@ image_resample(PyObject *self, PyObject* args, PyObject *kwargs)
284261
} else { // NDIM == 2
285262
switch (PyArray_TYPE(input_array)) {
286263
case NPY_DOUBLE:
287-
Py_BEGIN_ALLOW_THREADS
288-
resample(
289-
(double *)PyArray_DATA(input_array),
290-
PyArray_DIM(input_array, 1),
291-
PyArray_DIM(input_array, 0),
292-
(double *)PyArray_DATA(output_array),
293-
PyArray_DIM(output_array, 1),
294-
PyArray_DIM(output_array, 0),
295-
params);
296-
Py_END_ALLOW_THREADS
264+
resample<double>(input_array, output_array, params);
297265
break;
298266
case NPY_FLOAT:
299-
Py_BEGIN_ALLOW_THREADS
300-
resample(
301-
(float *)PyArray_DATA(input_array),
302-
PyArray_DIM(input_array, 1),
303-
PyArray_DIM(input_array, 0),
304-
(float *)PyArray_DATA(output_array),
305-
PyArray_DIM(output_array, 1),
306-
PyArray_DIM(output_array, 0),
307-
params);
308-
Py_END_ALLOW_THREADS
267+
resample<float>(input_array, output_array, params);
309268
break;
310269
case NPY_UINT8:
311-
case NPY_BYTE:
312-
Py_BEGIN_ALLOW_THREADS
313-
resample(
314-
(unsigned char *)PyArray_DATA(input_array),
315-
PyArray_DIM(input_array, 1),
316-
PyArray_DIM(input_array, 0),
317-
(unsigned char *)PyArray_DATA(output_array),
318-
PyArray_DIM(output_array, 1),
319-
PyArray_DIM(output_array, 0),
320-
params);
321-
Py_END_ALLOW_THREADS
270+
case NPY_INT8:
271+
resample<unsigned char>(input_array, output_array, params);
322272
break;
323273
case NPY_UINT16:
324274
case NPY_INT16:
325-
Py_BEGIN_ALLOW_THREADS
326-
resample(
327-
(unsigned short *)PyArray_DATA(input_array),
328-
PyArray_DIM(input_array, 1),
329-
PyArray_DIM(input_array, 0),
330-
(unsigned short *)PyArray_DATA(output_array),
331-
PyArray_DIM(output_array, 1),
332-
PyArray_DIM(output_array, 0),
333-
params);
334-
Py_END_ALLOW_THREADS
275+
resample<unsigned short>(input_array, output_array, params);
335276
break;
336277
default:
337278
PyErr_SetString(PyExc_ValueError, "Unsupported dtype");

0 commit comments

Comments
 (0)