aboutsummaryrefslogtreecommitdiffstats
path: root/src/blind-apply-palette.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/blind-apply-palette.c')
-rw-r--r--src/blind-apply-palette.c102
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