diff options
Diffstat (limited to 'src/blind-apply-palette.c')
| -rw-r--r-- | src/blind-apply-palette.c | 102 |
1 files changed, 53 insertions, 49 deletions
diff --git a/src/blind-apply-palette.c b/src/blind-apply-palette.c index 1e0d5f8..113f57b 100644 --- a/src/blind-apply-palette.c +++ b/src/blind-apply-palette.c @@ -1,4 +1,5 @@ /* See LICENSE file for copyright and license details. */ +#ifndef TYPE #include "common.h" USAGE("palette-stream") @@ -16,55 +17,8 @@ distance_xyz(double x1, double y1, double z1, double a1, double x2, double y2, d return sqrt(x2 + y2 + z2 + a2); } -#define PROCESS(TYPE, SUFFIX)\ - static void\ - process_##SUFFIX(struct stream *stream, struct stream *palette, char *pal)\ - {\ - size_t i, j, n, m;\ - size_t palsiz = palette->width * palette->height;\ - size_t best = 0;\ - TYPE x, y, z, a, lx = 0, ly = 0, lz = 0, la = 0;\ - TYPE cx, cy, cz, ca;\ - double distance, best_distance = 0;\ - while (eread_frame(palette, pal)) {\ - m = stream->frame_size;\ - do {\ - n = MIN(stream->ptr, m) / stream->pixel_size;\ - for (i = 0; i < n; i++) {\ - x = ((TYPE *)(stream->buf + i * stream->pixel_size))[0];\ - y = ((TYPE *)(stream->buf + i * stream->pixel_size))[1];\ - z = ((TYPE *)(stream->buf + i * stream->pixel_size))[2];\ - a = ((TYPE *)(stream->buf + i * stream->pixel_size))[3];\ - if ((!i && m == stream->frame_size) || x != lx || y != ly || z != lz || a != la) {\ - for (j = 0; j < palsiz; j++) {\ - cx = ((TYPE *)(pal + j * stream->pixel_size))[0];\ - cy = ((TYPE *)(pal + j * stream->pixel_size))[1];\ - cz = ((TYPE *)(pal + j * stream->pixel_size))[2];\ - ca = ((TYPE *)(pal + j * stream->pixel_size))[3];\ - distance = compare((double)x, (double)y, (double)z, (double)a,\ - (double)cx, (double)cy, (double)cz, (double)ca);\ - if (!j || distance < best_distance) {\ - best_distance = distance;\ - best = j;\ - }\ - }\ - lx = x, ly = y, lz = z, la = a;\ - }\ - memcpy(stream->buf + i * stream->pixel_size,\ - pal + best * stream->pixel_size,\ - stream->pixel_size);\ - }\ - m -= n *= stream->pixel_size;\ - ewriteall(STDOUT_FILENO, stream->buf, n, "<stdout>");\ - memmove(stream->buf, stream->buf + n, stream->ptr -= n);\ - } while (m && eread_stream(stream, SIZE_MAX));\ - if (m)\ - eprintf("%s: incomplete frame\n", stream->file);\ - }\ - } - -PROCESS(double, lf) -PROCESS(float, f) +#define FILE "blind-apply-palette.c" +#include "define-functions.h" int main(int argc, char *argv[]) @@ -101,3 +55,53 @@ main(int argc, char *argv[]) free(pal); return 0; } + +#else + +static void +PROCESS(struct stream *stream, struct stream *palette, char *pal) +{ + size_t i, j, n, m; + size_t palsiz = palette->width * palette->height; + size_t best = 0; + TYPE x, y, z, a, lx = 0, ly = 0, lz = 0, la = 0; + TYPE cx, cy, cz, ca; + double distance, best_distance = 0; + while (eread_frame(palette, pal)) { + m = stream->frame_size; + do { + n = MIN(stream->ptr, m) / stream->pixel_size; + for (i = 0; i < n; i++) { + x = ((TYPE *)(stream->buf + i * stream->pixel_size))[0]; + y = ((TYPE *)(stream->buf + i * stream->pixel_size))[1]; + z = ((TYPE *)(stream->buf + i * stream->pixel_size))[2]; + a = ((TYPE *)(stream->buf + i * stream->pixel_size))[3]; + if ((!i && m == stream->frame_size) || x != lx || y != ly || z != lz || a != la) { + for (j = 0; j < palsiz; j++) { + cx = ((TYPE *)(pal + j * stream->pixel_size))[0]; + cy = ((TYPE *)(pal + j * stream->pixel_size))[1]; + cz = ((TYPE *)(pal + j * stream->pixel_size))[2]; + ca = ((TYPE *)(pal + j * stream->pixel_size))[3]; + distance = compare((double)x, (double)y, (double)z, (double)a, + (double)cx, (double)cy, (double)cz, (double)ca); + if (!j || distance < best_distance) { + best_distance = distance; + best = j; + } + } + lx = x, ly = y, lz = z, la = a; + } + memcpy(stream->buf + i * stream->pixel_size, + pal + best * stream->pixel_size, + stream->pixel_size); + } + m -= n *= stream->pixel_size; + ewriteall(STDOUT_FILENO, stream->buf, n, "<stdout>"); + memmove(stream->buf, stream->buf + n, stream->ptr -= n); + } while (m && eread_stream(stream, SIZE_MAX)); + if (m) + eprintf("%s: incomplete frame\n", stream->file); + } +} + +#endif |
