|
|
@@ -26,15 +26,12 @@ |
|
|
|
#include "pipi.h" |
|
|
|
#include "pipi_internals.h" |
|
|
|
|
|
|
|
static int cmpint(void const *i1, void const *i2) |
|
|
|
static int cmpdouble(void const *i1, void const *i2) |
|
|
|
{ |
|
|
|
/* On Linux amd64, this is 20 to 30 % faster than using a real |
|
|
|
* comparison (which wouldn't work on Windows since it expects both |
|
|
|
* negative and positive values), a ternary operator, or floats instead |
|
|
|
* of doubles. */ |
|
|
|
union { int32_t i; double d; } u; |
|
|
|
u.d = *(double const *)i1 - *(double const *)i2; |
|
|
|
return u.i; |
|
|
|
double a = *(double const *)i1; |
|
|
|
double b = *(double const *)i2; |
|
|
|
|
|
|
|
return (a > b) - (a < b); |
|
|
|
} |
|
|
|
|
|
|
|
pipi_image_t *pipi_median(pipi_image_t *src, int radius) |
|
|
@@ -109,12 +106,12 @@ pipi_image_t *pipi_median_ext(pipi_image_t *src, int rx, int ry) |
|
|
|
} |
|
|
|
|
|
|
|
/* Sort the list */ |
|
|
|
qsort(list, size, sizeof(double), cmpint); |
|
|
|
qsort(list, size, sizeof(double), cmpdouble); |
|
|
|
if(!gray) |
|
|
|
{ |
|
|
|
qsort(list + size, size, sizeof(double), cmpint); |
|
|
|
qsort(list + 2 * size, size, sizeof(double), cmpint); |
|
|
|
qsort(list + 3 * size, size, sizeof(double), cmpint); |
|
|
|
qsort(list + size, size, sizeof(double), cmpdouble); |
|
|
|
qsort(list + 2 * size, size, sizeof(double), cmpdouble); |
|
|
|
qsort(list + 3 * size, size, sizeof(double), cmpdouble); |
|
|
|
} |
|
|
|
|
|
|
|
/* Store the median value */ |
|
|
|