summaryrefslogtreecommitdiff
path: root/src/pnmlcms.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pnmlcms.c')
-rw-r--r--src/pnmlcms.c58
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;
}