From ccd26e2affb0fb4a10b7261a85cb85b2525e5d9e Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 23 Jul 2017 20:48:18 +0200 Subject: Fix some errors, add manual for blind-colour-matrix and add blind-primary-key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/blind-affine-colour.c | 13 +++++++-- src/blind-colour-matrix.c | 72 +++++++++++++++++++++++++---------------------- src/blind-from-named.c | 4 +-- src/util.c | 6 ++-- 4 files changed, 55 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/src/blind-affine-colour.c b/src/blind-affine-colour.c index 7be9ab6..654345f 100644 --- a/src/blind-affine-colour.c +++ b/src/blind-affine-colour.c @@ -88,14 +88,23 @@ PROCESS(struct stream *colour, struct stream *matrix) if (!x) { if (!y && !eread_segment(matrix, mbuf, dim * matrix->row_size)) break; - if (!per_pixel) + if (!per_pixel) { + if (!y) { + mat = (TYPE *)mbuf; + for (i = 0; i < dim; i++, mat += w) + for (j = 0; j < dim; j++) + M[i][j] = mat[j * matrix->n_chan + 1] + * mat[(j + 1) * matrix->n_chan - 1]; + } y = (y + 1) % colour->height; + } } if (per_pixel) { mat = (TYPE *)(mbuf + x * dim * matrix->pixel_size); for (i = 0; i < dim; i++, mat += w) for (j = 0; j < dim; j++) - M[i][j] = mat[j * matrix->n_chan + 1] * mat[(j + 1) * matrix->n_chan - 1]; + M[i][j] = mat[j * matrix->n_chan + 1] + * mat[(j + 1) * matrix->n_chan - 1]; } pixel = (TYPE *)(colour->buf + ptr); for (i = 0; i < dim; i++) { diff --git a/src/blind-colour-matrix.c b/src/blind-colour-matrix.c index e4ff869..7387beb 100644 --- a/src/blind-colour-matrix.c +++ b/src/blind-colour-matrix.c @@ -1,7 +1,33 @@ /* See LICENSE file for copyright and license details. */ #include "common.h" -USAGE("[-F pixel-format] (-z x1 y1 x2 y2 x3 y3 white-x white-y | X1 Y1 Z1 X2 Y2 Z2 X3 Y3 Z3 [white-X white-Y white-Z])") +USAGE("[-F pixel-format] (-z x1 y1 x2 y2 x3 y3 [white-x white-y] | X1 Y1 Z1 X2 Y2 Z2 X3 Y3 Z3 [white-X white-Y white-Z])") + +static void +invert(double M[3][6]) +{ + size_t r1, r2, i; + double t; + for (r1 = 0; r1 < 3; r1++) { + if (!M[r1][r1]) { + for (r2 = r1 + 1; r2 < 3 && !M[r2][r1]; r2++); + if (r2 >= 3) + eprintf("the colour space's rank is less than 3\n"); + for (i = 0; i < 6; i++) + t = M[r1][i], M[r1][i] = M[r2][i], M[r2][i] = t; + } + t = 1. / M[r1][r1]; + for (i = 0; i < 6; i++) + M[r1][i] *= t; + for (r2 = r1 + 1; r2 < 3; r2++) + for (i = 0, t = M[r2][r1]; i < 6; i++) + M[r2][i] -= M[r1][i] * t; + } + for (r1 = 3; --r1;) + for (r2 = r1; r2--;) + for (i = 0, t = M[r2][r1]; i < 6; i++) + M[r2][i] -= M[r1][i] * t; +} int main(int argc, char *argv[]) @@ -12,7 +38,7 @@ main(int argc, char *argv[]) double x[4], y[4], z[4], M[3][6], t; double Mlf[9 * 4]; float Mf[9 * 4]; - size_t i, j, r1, r2; + size_t i, j; ARGBEGIN { case 'F': @@ -59,15 +85,6 @@ main(int argc, char *argv[]) x[3] = argc > 9 ? etolf_arg("white-X", argv[9]) : D65_XYZ_X; y[3] = argc > 9 ? etolf_arg("white-Y", argv[10]) : 1; z[3] = argc > 9 ? etolf_arg("white-Z", argv[11]) : D65_XYZ_Z; - for (i = 0; i < 4; i++) { - if (y[i] && y[i] != 1.) { - x[i] /= y[i]; - z[i] /= y[i]; - y[i] = 1.; - } else if (!y[i]) { - x[i] = y[i] = z[i] = 0.; - } - } } for (i = 0; i < 3; i++) { @@ -78,25 +95,7 @@ main(int argc, char *argv[]) M[i][3 + i] = 1.; } - for (r1 = 0; r1 < 3; r1++) { - if (!M[r1][r1]) { - for (r2 = r1 + 1; r2 < 3 && !M[r2][r1]; r2++); - if (r2 >= 3) - eprintf("the colour space's rank is less than 3\n"); - for (i = 0; i < 6; i++) - t = M[r1][i], M[r1][i] = M[r2][i], M[r2][i] = t; - } - t = 1. / M[r1][r1]; - for (i = 0; i < 6; i++) - M[r1][i] *= t; - for (r2 = r1; r2--;) - for (i = 0, t = M[r2][r1]; i < 6; i++) - M[r2][i] -= M[r1][i] * t; - } - for (r1 = 3; r1--;) - for (r2 = r1; r2--;) - for (i = 0, t = M[r2][r1]; i < 6; i++) - M[r2][i] -= M[r1][i] * t; + invert(M); for (i = 0; i < 3; i++) { t = M[i][3] * x[3] + M[i][4] * y[3] + M[i][5] * z[3]; @@ -105,15 +104,22 @@ main(int argc, char *argv[]) M[2][i] = t * z[i]; } + for (i = 0; i < 3; i++) { + M[i][3] = M[i][4] = M[i][5] = 0.; + M[i][3 + i] = 1.; + } + + invert(M); + eset_pixel_format(&stream, pixfmt); fprint_stream_head(stdout, &stream); efflush(stdout, ""); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { - Mlf[i * 12 + j * 4 + 0] = M[i][j]; - Mlf[i * 12 + j * 4 + 1] = M[i][j]; - Mlf[i * 12 + j * 4 + 2] = M[i][j]; + Mlf[i * 12 + j * 4 + 0] = M[i][3 + j]; + Mlf[i * 12 + j * 4 + 1] = M[i][3 + j]; + Mlf[i * 12 + j * 4 + 2] = M[i][3 + j]; Mlf[i * 12 + j * 4 + 3] = 1.; } } diff --git a/src/blind-from-named.c b/src/blind-from-named.c index 8290bc5..04c6e91 100644 --- a/src/blind-from-named.c +++ b/src/blind-from-named.c @@ -107,9 +107,7 @@ retry: eprintf("execvp %s:", argv[0]); } - while ((n = read(fd, buf, sizeof(buf))) > 0) + while ((n = eread(fd, buf, sizeof(buf), ""))) ewriteall(STDOUT_FILENO, buf, (size_t)n, ""); - if (n < 0) - eprintf("read :"); return 0; } diff --git a/src/util.c b/src/util.c index 3e03b67..3fc3716 100644 --- a/src/util.c +++ b/src/util.c @@ -158,16 +158,18 @@ getfile(int fd, void *buffer, size_t *restrict ptr, size_t *restrict size) { char *restrict *restrict buf = buffer; void *new; + size_t new_size; ssize_t r; for (;;) { if (*ptr == *size) { - if (!(new = realloc(*buf, *size << 1))) { + new_size = *size ? *size << 1 : BUFSIZ; + if (!(new = realloc(*buf, new_size))) { errno = ENOMEM; return -1; } *buf = new; - *size <<= 1; + *size = new_size; } r = read(fd, *buf + *ptr, *size - *ptr); if (r <= 0) { -- cgit v1.2.3-70-g09d2