diff options
Diffstat (limited to 'src/pnmlcms.c')
| -rw-r--r-- | src/pnmlcms.c | 58 |
1 files changed, 22 insertions, 36 deletions
diff --git a/src/pnmlcms.c b/src/pnmlcms.c index 41b3047..bbb785a 100644 --- a/src/pnmlcms.c +++ b/src/pnmlcms.c @@ -1,8 +1,10 @@ -#include <pam.h> #include <lcms.h> +#include "pnm.h" + static int -pam_transform(struct pam *inpam, struct pam *outpam, cmsHTRANSFORM *hTransform); +pam_transform(FILE *in_fp, FILE *out_fp, + const struct pnm *in_pnm, cmsHTRANSFORM *hTransform); int main(int argc, char **argv) { @@ -11,7 +13,7 @@ main(int argc, char **argv) { double gamma = 0.0; cmsHTRANSFORM hTransform; cmsHPROFILE profiles[3]; - struct pam inpam, outpam; + struct pnm in_pnm; while ((c = getopt(argc, argv, "i:o:g:")) != EOF) { switch (c) { @@ -57,20 +59,19 @@ main(int argc, char **argv) { hTransform = cmsCreateMultiprofileTransform( profiles, nProf, - TYPE_RGB_16, - TYPE_RGB_16, + TYPE_RGB_16_SE, + TYPE_RGB_16_SE, INTENT_PERCEPTUAL, 0); - pm_init(argv[0], 0); - - pnm_readpaminit(stdin, &inpam, PAM_STRUCT_SIZE(tuple_type)); - outpam = inpam; outpam.file = stdout; + if (readPnmHeader(stdin, &in_pnm) != 0) { + exit(1); + } - pnm_writepaminit(&outpam); + writePnmHeader(stdout, &in_pnm); - pam_transform(&inpam, &outpam, &hTransform); + pam_transform(stdin, stdout, &in_pnm, &hTransform); cmsDeleteTransform(hTransform); @@ -82,38 +83,23 @@ main(int argc, char **argv) { } static int -pam_transform(struct pam *inpam, struct pam *outpam, cmsHTRANSFORM *hTransform) +pam_transform(FILE *in_fp, FILE *out_fp, + const struct pnm *in_pnm, cmsHTRANSFORM *hTransform) { - tuple *inrow, *outrow; int row, col; + char *in_buf = malloc(in_pnm->width * 2 * 3); + char *out_buf = malloc(in_pnm->width * 2 * 3); + for (row = 0; row < in_pnm->height; row++) { + fread(in_buf, in_pnm->width, 2 * 3, in_fp); - inrow = pnm_allocpamrow(inpam); - outrow = pnm_allocpamrow(outpam); - - for (row = 0; row < inpam->height; row++) { - pnm_readpamrow(inpam, inrow); - for (col = 0; col < inpam->width; col++) { - int i; - unsigned short inpix[3], outpix[3]; - - for (i = 0; i < 3; i++) { - inpix[i] = (unsigned short) inrow[col][i]; - } - - cmsDoTransform(*hTransform, inpix, outpix, 1); - - for (i = 0; i < 3; i++) { - outrow[col][i] = (sample) outpix[i]; - } - } - + cmsDoTransform(*hTransform, in_buf, out_buf, in_pnm->width); - pnm_writepamrow(outpam, outrow); + fwrite(out_buf, in_pnm->width, 2 * 3, out_fp); } - pnm_freepamrow(inrow); - pnm_freepamrow(outrow); + free(in_buf); + free(out_buf); return 0; } |
