summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pnmlcms.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/pnmlcms.c b/src/pnmlcms.c
index 800af08..426b923 100644
--- a/src/pnmlcms.c
+++ b/src/pnmlcms.c
@@ -10,6 +10,10 @@ pam_transform(FILE *in_fp, FILE *out_fp,
static LPGAMMATABLE
buildGammaCurve(const char *ctrl_points, int resolution);
+
+#define RED 0x1
+#define GREEN 0x2
+#define BLUE 0x4
int
main(int argc, char **argv) {
int c, i, nProf = 0;
@@ -22,8 +26,9 @@ main(int argc, char **argv) {
cmsHPROFILE profiles[3];
DWORD type;
struct pnm in_pnm;
+ int channels = 0;
- while ((c = getopt(argc, argv, "i:o:g:b:c:h:s:S:D:C:")) != EOF) {
+ while ((c = getopt(argc, argv, "i:o:rgbc:h:s:S:D:C:")) != EOF) {
switch (c) {
case 'i':
in_prof = optarg;
@@ -31,11 +36,14 @@ main(int argc, char **argv) {
case 'o':
out_prof = optarg;
break;
+ case 'r':
+ channels |= RED;
+ break;
case 'g':
- gamma = atof(optarg);
+ channels |= GREEN;
break;
case 'b':
- bright = atof(optarg);
+ channels |= BLUE;
break;
case 'c':
contrast = atof(optarg);
@@ -80,8 +88,16 @@ main(int argc, char **argv) {
if (curve) {
LPGAMMATABLE gTable[3];
+ LPGAMMATABLE table, nopTable;
- gTable[0] = gTable[1] = gTable[2] = buildGammaCurve(curve, 256);
+ if (channels == 0) channels = RED | GREEN | BLUE;
+
+ table = buildGammaCurve(curve, 256);
+ nopTable = cmsBuildGamma(256, 1.0);
+
+ gTable[0] = channels & RED?table:nopTable;
+ gTable[1] = channels & GREEN?table:nopTable;
+ gTable[2] = channels & BLUE?table:nopTable;
profiles[nProf++] = cmsCreateLinearizationDeviceLink(
icSigLabData,
@@ -170,14 +186,14 @@ buildGammaCurve(const char *ctrl_points, int resolution) {
gsl_interp_accel *acc;
gsl_spline *spline;
- while (pstr = strsep(&buf, ";")) {
+ while (pstr = strsep(&buf, ",")) {
if (n == MAX_CTRL) {
fprintf(stderr, "Maximum number of control points (%d) reached.\n",
MAX_CTRL);
break;
}
- if (sscanf(pstr, "%lf,%lf", &X[n], &Y[n]) != 2 ||
+ if (sscanf(pstr, "%lf:%lf", &X[n], &Y[n]) != 2 ||
X[n] < 0.0 || X[n] > 1.0 || Y[n] < 0.0 || Y[n] > 1.0) {
fprintf(stderr, "Could not parse control point %s.\n", pstr);
free(buf);