summaryrefslogtreecommitdiff
path: root/src/pnmlcms.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pnmlcms.c')
-rw-r--r--src/pnmlcms.c51
1 files changed, 40 insertions, 11 deletions
diff --git a/src/pnmlcms.c b/src/pnmlcms.c
index 5c14d44..41b3047 100644
--- a/src/pnmlcms.c
+++ b/src/pnmlcms.c
@@ -6,13 +6,14 @@ pam_transform(struct pam *inpam, struct pam *outpam, cmsHTRANSFORM *hTransform);
int
main(int argc, char **argv) {
- int c;
+ int c, i, nProf = 0;
char *in_prof = NULL, *out_prof = NULL;
+ double gamma = 0.0;
cmsHTRANSFORM hTransform;
- cmsHPROFILE hInProfile, hOutProfile;
+ cmsHPROFILE profiles[3];
struct pam inpam, outpam;
- while ((c = getopt(argc, argv, "i:o:")) != EOF) {
+ while ((c = getopt(argc, argv, "i:o:g:")) != EOF) {
switch (c) {
case 'i':
in_prof = optarg;
@@ -20,20 +21,46 @@ main(int argc, char **argv) {
case 'o':
out_prof = optarg;
break;
+ case 'g':
+ gamma = atof(optarg);
+ break;
default:
break;
}
}
- hInProfile = cmsOpenProfileFromFile(in_prof, "r");
- hOutProfile = cmsOpenProfileFromFile(out_prof, "r");
- hTransform = cmsCreateTransform(hInProfile,
+ if (in_prof) {
+ profiles[nProf++] = cmsOpenProfileFromFile(in_prof, "r");
+ } else {
+ profiles[nProf++] = cmsCreate_sRGBProfile();
+ }
+
+ if (gamma) {
+ LPGAMMATABLE gTable[3];
+
+ gTable[0] = cmsBuildGamma(256, gamma);
+ gTable[1] = gTable[2] = cmsBuildGamma(256, 1.0);
+
+ profiles[nProf++] = cmsCreateLinearizationDeviceLink(
+ icSigLabData,
+ gTable);
+ }
+
+ if (out_prof) {
+ profiles[nProf++] = cmsOpenProfileFromFile(out_prof, "r");
+ } else {
+ profiles[nProf++] = cmsCreate_sRGBProfile();
+ }
+
+
+ hTransform = cmsCreateMultiprofileTransform(
+ profiles,
+ nProf,
TYPE_RGB_16,
- hOutProfile,
TYPE_RGB_16,
- INTENT_PERCEPTUAL, 0);
-
+ INTENT_PERCEPTUAL,
+ 0);
pm_init(argv[0], 0);
@@ -46,8 +73,10 @@ main(int argc, char **argv) {
pam_transform(&inpam, &outpam, &hTransform);
cmsDeleteTransform(hTransform);
- cmsCloseProfile(hInProfile);
- cmsCloseProfile(hOutProfile);
+
+ for (i = 0; i < nProf; i++) {
+ cmsCloseProfile(profiles[i]);
+ }
return 0;
}