From e77ec70c29e3db2777b9f625899ec51b4df15b5d Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Tue, 15 Jan 2008 23:02:40 +0100 Subject: fix 16bit case --- src/pnm.c | 1 - src/pnmcurve.c | 24 ++++++++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/pnm.c b/src/pnm.c index b2fa3c8..222e2ee 100644 --- a/src/pnm.c +++ b/src/pnm.c @@ -64,4 +64,3 @@ writePnmHeader(FILE *fp, const struct pnm *h) { return 0; } - diff --git a/src/pnmcurve.c b/src/pnmcurve.c index 37d2dd2..770de44 100644 --- a/src/pnmcurve.c +++ b/src/pnmcurve.c @@ -9,7 +9,7 @@ typedef struct { int n; - short value[1]; + unsigned short value[1]; } table_t; static int @@ -69,9 +69,9 @@ main(int argc, char **argv) { table = buildCurve(curve, in_pnm.maxval + 1, in_pnm.maxval); - gTable[0] = channels & RED?table:NULL; - gTable[1] = channels & GREEN?table:NULL; - gTable[2] = channels & BLUE?table:NULL; + gTable[0] = channels & RED ? table : NULL; + gTable[1] = channels & GREEN ? table : NULL; + gTable[2] = channels & BLUE ? table : NULL; } writePnmHeader(stdout, &in_pnm); @@ -101,19 +101,23 @@ pam_transform(FILE *in_fp, FILE *out_fp, for (i = 0; i < in_pnm->width; i++) { for (c = 0; c < 3; c++) { if (tables[c]) { - int val = (unsigned char) buf[(i * 3 + c) * nbytes]; + int val = buf[(i * 3 + c) * nbytes]; if (nbytes == 2) { - val = (val << 8) | - (unsigned char) buf[(i * 3 + c) * nbytes + 1]; + val = (val << 8) | buf[(i * 3 + c) * nbytes + 1]; } if (val < 0 || val > in_pnm->maxval) { fprintf(stderr, "Invalid pixel value %d\n", val); + free(buf); return 1; } if (nbytes == 1) { buf[i * 3 + c] = (unsigned char) tables[c]->value[val]; + } else { + int v1 = tables[c]->value[val]; + buf[(i * 3 + c) * 2] = (unsigned char) (v1 >> 8); + buf[(i * 3 + c) * 2 + 1] = (unsigned char) v1; } } } @@ -166,11 +170,11 @@ buildCurve(const char *ctrl_points, int resolution, int maxval) { for (i = 0; i < resolution; i++) { double _x = (double) i / (resolution - 1); double _y = gsl_spline_eval(spline, _x, acc); - double dval = _y * (double) maxval + .5; - if (dval > (double) maxval) dval = (double) maxval; + double dval = _y * maxval + .5; + if (dval > maxval) dval = (double) maxval; if (dval < 0) dval = 0; - table->value[i] = (short) floor(dval); + table->value[i] = (unsigned short) floor(dval); } gsl_spline_free(spline); -- cgit v1.2.3