diff options
| author | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2008-01-15 18:02:16 +0100 |
|---|---|---|
| committer | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2008-01-15 18:02:16 +0100 |
| commit | 0103847557f98b5a2958065c8e7ef9c0c424a249 (patch) | |
| tree | 039860409c7651c3774dd91e26b21939e7306251 /src/pnmcurve.c | |
| parent | 3d0a45e0177b85efba5936f020e984224d04234d (diff) | |
make things work for 8bit color depth
Diffstat (limited to 'src/pnmcurve.c')
| -rw-r--r-- | src/pnmcurve.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/src/pnmcurve.c b/src/pnmcurve.c index e170f36..37d2dd2 100644 --- a/src/pnmcurve.c +++ b/src/pnmcurve.c @@ -17,7 +17,7 @@ pam_transform(FILE *in_fp, FILE *out_fp, const struct pnm *in_pnm, table_t **tables); static table_t* -buildCurve(const char *ctrl_points, int resolution); +buildCurve(const char *ctrl_points, int resolution, int maxval); #define RED 0x1 #define GREEN 0x2 @@ -67,12 +67,11 @@ main(int argc, char **argv) { if (channels == 0) channels = RED | GREEN | BLUE; - table = buildCurve(curve, 256); + 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; - } writePnmHeader(stdout, &in_pnm); @@ -85,24 +84,37 @@ main(int argc, char **argv) { static int pam_transform(FILE *in_fp, FILE *out_fp, const struct pnm *in_pnm, table_t **tables) { - int row, col; + int i, c, row, col; int nbytes = in_pnm->maxval == 65535?2:1; - char *buf = malloc(in_pnm->width * nbytes * 3); + unsigned char *buf = malloc(in_pnm->width * nbytes * 3); + + for (c = 0; c < 3; c++) { + if (tables[c] && tables[c]->n < in_pnm->maxval) { + fprintf(stderr, "Table %d too small (%d)\n", c, tables[c]->n); + return 1; + } + } for (row = 0; row < in_pnm->height; row++) { fread(buf, in_pnm->width, nbytes * 3, in_fp); for (i = 0; i < in_pnm->width; i++) { - for (c = 0; c < in_pnm->depth; c++) { + for (c = 0; c < 3; c++) { if (tables[c]) { - int val = (unsigned char) buf[(i * in_pnm->depth + c) * nbytes]; + int val = (unsigned char) buf[(i * 3 + c) * nbytes]; if (nbytes == 2) { val = (val << 8) | - (uchar) buf[(i * in_pnm->depth + c) * nbytes + 1]; + (unsigned char) buf[(i * 3 + c) * nbytes + 1]; } - bud + if (val < 0 || val > in_pnm->maxval) { + fprintf(stderr, "Invalid pixel value %d\n", val); + return 1; + } + if (nbytes == 1) { + buf[i * 3 + c] = (unsigned char) tables[c]->value[val]; + } } } } @@ -117,7 +129,7 @@ pam_transform(FILE *in_fp, FILE *out_fp, #define MAX_CTRL 256 static table_t* -buildCurve(const char *ctrl_points, int resolution) { +buildCurve(const char *ctrl_points, int resolution, int maxval) { table_t *table; char *pstr, *buf = strdup(ctrl_points); int i, n = 0; @@ -154,8 +166,8 @@ buildCurve(const char *ctrl_points, int resolution) { for (i = 0; i < resolution; i++) { double _x = (double) i / (resolution - 1); double _y = gsl_spline_eval(spline, _x, acc); - double dval = _y * 65535.0 + .5; - if (dval > 65535.) dval = 65535.0; + double dval = _y * (double) maxval + .5; + if (dval > (double) maxval) dval = (double) maxval; if (dval < 0) dval = 0; table->value[i] = (short) floor(dval); |
