summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rwxr-xr-xutils/samples/vericc.c65
-rw-r--r--utils/transicc/transicc.c136
3 files changed, 138 insertions, 65 deletions
diff --git a/ChangeLog b/ChangeLog
index 7d18304..e84bef6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,3 +2,5 @@ Major version bump
-------------------
Fixed a bug on V2 CHAD construction, affects absolute colorimetric intent
+Fixed a bug that prevented linkicc to work
+Fixed a bug on transicc that made profiles with output colorants info to malfunction
diff --git a/utils/samples/vericc.c b/utils/samples/vericc.c
new file mode 100755
index 0000000..9ac94a7
--- /dev/null
+++ b/utils/samples/vericc.c
@@ -0,0 +1,65 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2010 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2.h"
+#include <string.h>
+#include <math.h>
+
+static
+int PrintUsage(void)
+{
+ fprintf(stderr, "Sets profile version\n\nUsage: vericc --r<version> iccprofile.icc\n");
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ cmsHPROFILE hProfile;
+ char* ptr;
+ cmsFloat64Number Version;
+
+ if (argc != 3) return PrintUsage();
+
+ ptr = argv[1];
+ if (strncmp(ptr, "--r", 3) != 0) return PrintUsage();
+ ptr += 3;
+ if (!*ptr) { fprintf(stderr, "Wrong version number\n"); return 1; }
+
+ Version = atof(ptr);
+
+ hProfile = cmsOpenProfileFromFile(argv[2], "r");
+ if (hProfile == NULL) { fprintf(stderr, "'%s': cannot open\n", argv[2]); return 1; }
+
+ cmsSetProfileVersion(hProfile, Version);
+ cmsSaveProfileToFile(hProfile, "$$tmp.icc");
+ cmsCloseProfile(hProfile);
+
+ remove(argv[2]);
+ rename("$$tmp.icc", argv[2]);
+ return 0;
+
+
+}
diff --git a/utils/transicc/transicc.c b/utils/transicc/transicc.c
index 81ce28f..1840e33 100644
--- a/utils/transicc/transicc.c
+++ b/utils/transicc/transicc.c
@@ -71,6 +71,8 @@ static cmsColorSpaceSignature InputColorSpace, OutputColorSpace;
static cmsNAMEDCOLORLIST* InputColorant = NULL;
static cmsNAMEDCOLORLIST* OutputColorant = NULL;
+static cmsFloat64Number InputRange, OutputRange;
+
// isatty replacement
#ifdef _MSC_VER
@@ -265,21 +267,26 @@ void HandleSwitches(int argc, char *argv[])
}
}
+
+
+static
+void SetRange(cmsFloat64Number range, cmsBool IsInput)
+{
+ if (IsInput)
+ InputRange = range;
+ else
+ OutputRange = range;
+}
+
// Populate a named color list with usual component names.
// I am using the first Colorant channel to store the range, but it works since
// this space is not used anyway.
static
-cmsNAMEDCOLORLIST* ComponentNames(cmsColorSpaceSignature space)
+cmsNAMEDCOLORLIST* ComponentNames(cmsColorSpaceSignature space, cmsBool IsInput)
{
cmsNAMEDCOLORLIST* out;
int i, n;
char Buffer[cmsMAX_PATH];
- cmsUInt16Number Range[cmsMAXCHANNELS];
-
-
- // Empty colorants (to store range in first one)
- for (i=0; i < cmsMAXCHANNELS; i++)
- Range[i] = 0;
out = cmsAllocNamedColorList(0, 12, cmsMAXCHANNELS, "", "");
if (out == NULL) return NULL;
@@ -287,93 +294,92 @@ cmsNAMEDCOLORLIST* ComponentNames(cmsColorSpaceSignature space)
switch (space) {
case cmsSigXYZData:
- Range[0] = 100;
- cmsAppendNamedColor(out, "X", NULL, Range);
- cmsAppendNamedColor(out, "Y", NULL, Range);
- cmsAppendNamedColor(out, "Z", NULL, Range);
+ SetRange(100, IsInput);
+ cmsAppendNamedColor(out, "X", NULL, NULL);
+ cmsAppendNamedColor(out, "Y", NULL, NULL);
+ cmsAppendNamedColor(out, "Z", NULL, NULL);
break;
case cmsSigLabData:
- Range[0] = 1;
- cmsAppendNamedColor(out, "L*", NULL, Range);
- cmsAppendNamedColor(out, "a*", NULL, Range);
- cmsAppendNamedColor(out, "b*", NULL, Range);
+ SetRange(1, IsInput);
+ cmsAppendNamedColor(out, "L*", NULL, NULL);
+ cmsAppendNamedColor(out, "a*", NULL, NULL);
+ cmsAppendNamedColor(out, "b*", NULL, NULL);
break;
case cmsSigLuvData:
- Range[0] = 1;
- cmsAppendNamedColor(out, "L", NULL, Range);
- cmsAppendNamedColor(out, "u", NULL, Range);
- cmsAppendNamedColor(out, "v", NULL, Range);
+ SetRange(1, IsInput);
+ cmsAppendNamedColor(out, "L", NULL, NULL);
+ cmsAppendNamedColor(out, "u", NULL, NULL);
+ cmsAppendNamedColor(out, "v", NULL, NULL);
break;
case cmsSigYCbCrData:
- Range[0] = 255;
- cmsAppendNamedColor(out, "Y", NULL, Range );
- cmsAppendNamedColor(out, "Cb", NULL, Range);
- cmsAppendNamedColor(out, "Cr", NULL, Range);
+ SetRange(255, IsInput);
+ cmsAppendNamedColor(out, "Y", NULL, NULL );
+ cmsAppendNamedColor(out, "Cb", NULL, NULL);
+ cmsAppendNamedColor(out, "Cr", NULL, NULL);
break;
case cmsSigYxyData:
- Range[0] = 1;
- cmsAppendNamedColor(out, "Y", NULL, Range);
- cmsAppendNamedColor(out, "x", NULL, Range);
- cmsAppendNamedColor(out, "y", NULL, Range);
+ SetRange(1, IsInput);
+ cmsAppendNamedColor(out, "Y", NULL, NULL);
+ cmsAppendNamedColor(out, "x", NULL, NULL);
+ cmsAppendNamedColor(out, "y", NULL, NULL);
break;
case cmsSigRgbData:
- Range[0] = 255;
- cmsAppendNamedColor(out, "R", NULL, Range);
- cmsAppendNamedColor(out, "G", NULL, Range);
- cmsAppendNamedColor(out, "B", NULL, Range);
+ SetRange(255, IsInput);
+ cmsAppendNamedColor(out, "R", NULL, NULL);
+ cmsAppendNamedColor(out, "G", NULL, NULL);
+ cmsAppendNamedColor(out, "B", NULL, NULL);
break;
case cmsSigGrayData:
- Range[0] = 255;
- cmsAppendNamedColor(out, "G", NULL, Range);
+ SetRange(255, IsInput);
+ cmsAppendNamedColor(out, "G", NULL, NULL);
break;
case cmsSigHsvData:
- Range[0] = 255;
- cmsAppendNamedColor(out, "H", NULL, Range);
- cmsAppendNamedColor(out, "s", NULL, Range);
- cmsAppendNamedColor(out, "v", NULL, Range);
+ SetRange(255, IsInput);
+ cmsAppendNamedColor(out, "H", NULL, NULL);
+ cmsAppendNamedColor(out, "s", NULL, NULL);
+ cmsAppendNamedColor(out, "v", NULL, NULL);
break;
case cmsSigHlsData:
- Range[0] = 255;
- cmsAppendNamedColor(out, "H", NULL, Range);
- cmsAppendNamedColor(out, "l", NULL, Range);
- cmsAppendNamedColor(out, "s", NULL, Range);
+ SetRange(255, IsInput);
+ cmsAppendNamedColor(out, "H", NULL, NULL);
+ cmsAppendNamedColor(out, "l", NULL, NULL);
+ cmsAppendNamedColor(out, "s", NULL, NULL);
break;
case cmsSigCmykData:
- Range[0] = 1;
- cmsAppendNamedColor(out, "C", NULL, Range);
- cmsAppendNamedColor(out, "M", NULL, Range);
- cmsAppendNamedColor(out, "Y", NULL, Range);
- cmsAppendNamedColor(out, "K", NULL, Range);
-
+ SetRange(1, IsInput);
+ cmsAppendNamedColor(out, "C", NULL, NULL);
+ cmsAppendNamedColor(out, "M", NULL, NULL);
+ cmsAppendNamedColor(out, "Y", NULL, NULL);
+ cmsAppendNamedColor(out, "K", NULL, NULL);
break;
case cmsSigCmyData:
- Range[0] = 1;
- cmsAppendNamedColor(out, "C", NULL, Range);
- cmsAppendNamedColor(out, "M", NULL, Range);
- cmsAppendNamedColor(out, "Y", NULL, Range);
+ SetRange(1, IsInput);
+ cmsAppendNamedColor(out, "C", NULL, NULL);
+ cmsAppendNamedColor(out, "M", NULL, NULL);
+ cmsAppendNamedColor(out, "Y", NULL, NULL);
break;
default:
- Range[0] = 1;
+ SetRange(1, IsInput);
n = cmsChannelsOf(space);
for (i=0; i < n; i++) {
sprintf(Buffer, "Channel #%d", i + 1);
- cmsAppendNamedColor(out, Buffer, NULL, Range);
+ cmsAppendNamedColor(out, Buffer, NULL, NULL);
}
}
@@ -408,15 +414,17 @@ cmsBool OpenTransforms(void)
if (cmsIsTag(hInput, cmsSigColorantTableTag)) {
List = cmsReadTag(hInput, cmsSigColorantTableTag);
InputColorant = cmsDupNamedColorList(List);
+ InputRange = 1;
}
- else InputColorant = ComponentNames(InputColorSpace);
+ else InputColorant = ComponentNames(InputColorSpace, TRUE);
if (cmsIsTag(hInput, cmsSigColorantTableOutTag)){
List = cmsReadTag(hInput, cmsSigColorantTableOutTag);
OutputColorant = cmsDupNamedColorList(List);
+ OutputRange = 1;
}
- else OutputColorant = ComponentNames(OutputColorSpace);
+ else OutputColorant = ComponentNames(OutputColorSpace, FALSE);
}
else {
@@ -442,14 +450,14 @@ cmsBool OpenTransforms(void)
List = cmsReadTag(hInput, cmsSigColorantTableTag);
InputColorant = cmsDupNamedColorList(List);
}
- else InputColorant = ComponentNames(InputColorSpace);
+ else InputColorant = ComponentNames(InputColorSpace, TRUE);
if (cmsIsTag(hOutput, cmsSigColorantTableTag)){
List = cmsReadTag(hInput, cmsSigColorantTableTag);
OutputColorant = cmsDupNamedColorList(List);
}
- else OutputColorant = ComponentNames(OutputColorSpace);
+ else OutputColorant = ComponentNames(OutputColorSpace, FALSE);
if (cProofing != NULL) {
@@ -614,7 +622,6 @@ void PrintFloatResults(cmsFloat64Number Value[])
{
cmsUInt32Number i, n;
char ChannelName[cmsMAX_PATH];
- cmsUInt16Number Range[cmsMAXCHANNELS];
cmsFloat64Number v;
n = cmsChannelsOf(OutputColorSpace);
@@ -622,14 +629,14 @@ void PrintFloatResults(cmsFloat64Number Value[])
if (OutputColorant != NULL) {
- cmsNamedColorInfo(OutputColorant, i, ChannelName, NULL, NULL, NULL, Range);
+ cmsNamedColorInfo(OutputColorant, i, ChannelName, NULL, NULL, NULL, NULL);
}
else {
- Range[0] = 1;
+ OutputRange = 1;
sprintf(ChannelName, "Channel #%d", i + 1);
}
- v = (cmsFloat64Number) Value[i]* Range[0];
+ v = (cmsFloat64Number) Value[i]* OutputRange;
if (lQuantize)
v = floor(v + 0.5);
@@ -673,7 +680,6 @@ void TakeFloatValues(cmsFloat64Number Float[])
cmsUInt32Number i, n;
char ChannelName[cmsMAX_PATH];
char Buffer[cmsMAX_PATH];
- cmsUInt16Number Range[cmsMAXCHANNELS];
if (xisatty(stdin))
fprintf(stderr, "\nEnter values, 'q' to quit\n");
@@ -688,16 +694,16 @@ void TakeFloatValues(cmsFloat64Number Float[])
for (i=0; i < n; i++) {
if (InputColorant) {
- cmsNamedColorInfo(InputColorant, i, ChannelName, NULL, NULL, NULL, Range);
+ cmsNamedColorInfo(InputColorant, i, ChannelName, NULL, NULL, NULL, NULL);
}
else {
- Range[0] = 1;
+ InputRange = 1;
sprintf(ChannelName, "Channel #%d", i+1);
}
GetLine(Buffer, "%s? ", ChannelName);
- Float[i] = (cmsFloat64Number) atof(Buffer) / Range[0];
+ Float[i] = (cmsFloat64Number) atof(Buffer) / InputRange;
}
if (xisatty(stdin))