summaryrefslogtreecommitdiff
path: root/src/pnmcurve.c
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-01-15 18:02:16 +0100
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-01-15 18:02:16 +0100
commit0103847557f98b5a2958065c8e7ef9c0c424a249 (patch)
tree039860409c7651c3774dd91e26b21939e7306251 /src/pnmcurve.c
parent3d0a45e0177b85efba5936f020e984224d04234d (diff)
make things work for 8bit color depth
Diffstat (limited to 'src/pnmcurve.c')
-rw-r--r--src/pnmcurve.c36
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);