mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-08-21 20:54:47 +03:00
Embed sort function in Quant.c to get same results in Windows and Linux
This commit is contained in:
parent
330f77ae7a
commit
aebf54a47b
|
@ -789,6 +789,47 @@ resort_distance_tables(
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* build_distance_tables() below used to call qsort() from stdlib.h.
|
||||||
|
* qsort() is not guaranteed stable, so different implementations can
|
||||||
|
* give different results, causing images created on Linux and Windows
|
||||||
|
* to differ. Shell sort is also not stable, but having the implementation
|
||||||
|
* included here will give consistent results across platforms. -rdg- */
|
||||||
|
|
||||||
|
/* ssort() -- Fast, small, qsort()-compatible Shell sort */
|
||||||
|
/* By Raymond Gardner. Released here under PIL license. */
|
||||||
|
static void
|
||||||
|
ssort(void *base, uint32_t nmemb, uint32_t size,
|
||||||
|
int (*compar)(const void *, const void *)) {
|
||||||
|
uint32_t sz_nmemb, gap, sz_gap, i, j, k;
|
||||||
|
char *a, *b, tmp;
|
||||||
|
|
||||||
|
sz_nmemb = size * nmemb;
|
||||||
|
for (gap = 0; ++gap < nmemb; ) {
|
||||||
|
gap *= 3;
|
||||||
|
}
|
||||||
|
while (gap /= 3) {
|
||||||
|
sz_gap = size * gap;
|
||||||
|
for (i = sz_gap; i < sz_nmemb; i += size) {
|
||||||
|
for (j = i - sz_gap; ; j -= sz_gap) {
|
||||||
|
a = (char *)base + j;
|
||||||
|
b = a + sz_gap;
|
||||||
|
if ((*compar)(a, b) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
k = size;
|
||||||
|
do {
|
||||||
|
tmp = *a;
|
||||||
|
*a++ = *b;
|
||||||
|
*b++ = tmp;
|
||||||
|
} while (--k);
|
||||||
|
if (j < sz_gap) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
build_distance_tables(
|
build_distance_tables(
|
||||||
uint32_t *avgDist, uint32_t **avgDistSortKey, Pixel *p, uint32_t nEntries) {
|
uint32_t *avgDist, uint32_t **avgDistSortKey, Pixel *p, uint32_t nEntries) {
|
||||||
|
@ -805,7 +846,7 @@ build_distance_tables(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (i = 0; i < nEntries; i++) {
|
for (i = 0; i < nEntries; i++) {
|
||||||
qsort(
|
ssort( /* was qsort() */
|
||||||
avgDistSortKey + i * nEntries,
|
avgDistSortKey + i * nEntries,
|
||||||
nEntries,
|
nEntries,
|
||||||
sizeof(uint32_t *),
|
sizeof(uint32_t *),
|
||||||
|
@ -1243,7 +1284,7 @@ error_1:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static int
|
||||||
quantize(
|
quantize(
|
||||||
Pixel *pixelData,
|
Pixel *pixelData,
|
||||||
uint32_t nPixels,
|
uint32_t nPixels,
|
||||||
|
@ -1511,7 +1552,7 @@ compute_distances(const HashTable *h, const Pixel pixel, uint32_t *dist, void *u
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static int
|
||||||
quantize2(
|
quantize2(
|
||||||
Pixel *pixelData,
|
Pixel *pixelData,
|
||||||
uint32_t nPixels,
|
uint32_t nPixels,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user