summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarti Maria <marti.maria@littlecms.com>2020-05-21 17:54:27 +0200
committerMarti Maria <marti.maria@littlecms.com>2020-05-21 17:54:27 +0200
commit0813f64d3827c52b969a9a58f6e79cc4f96921e1 (patch)
tree0597ad180371197301a867249028f2e0be23d5bd
parent7a0330cd5555a14016a5a920310c3db585dba452 (diff)
downloadlcms2-0813f64d3827c52b969a9a58f6e79cc4f96921e1.tar.gz
fix overoptimization issue
The cmsFLAGS_NOOPTIMIZE was ignored when a plug-in was used
-rw-r--r--plugins/fast_float/testbed/fast_float_testbed.c83
-rw-r--r--src/cmsxform.c2
2 files changed, 82 insertions, 3 deletions
diff --git a/plugins/fast_float/testbed/fast_float_testbed.c b/plugins/fast_float/testbed/fast_float_testbed.c
index 59e1d68..96e67b9 100644
--- a/plugins/fast_float/testbed/fast_float_testbed.c
+++ b/plugins/fast_float/testbed/fast_float_testbed.c
@@ -819,6 +819,84 @@ void CheckChangeFormat(void)
}
+static
+cmsBool ValidInt(cmsUInt16Number a, cmsUInt16Number b)
+{
+ return abs(a - b) <= 32;
+}
+
+static
+void CheckLab2Roundtrip(void)
+{
+ cmsHPROFILE hsRGB, hLab;
+ cmsHTRANSFORM xform, xform2;
+ cmsInt8Number* lab;
+ cmsInt32Number Mb, j;
+ cmsInt32Number r, g, b;
+ Scanline_rgb8bits* In;
+ Scanline_rgb8bits* Out;
+
+ printf("Checking lab2 roundtrip...");
+
+ hsRGB = cmsCreate_sRGBProfile();
+ hLab = cmsCreateLab2Profile(NULL);
+
+
+ xform = cmsCreateTransform(hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_8, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_BLACKPOINTCOMPENSATION);
+ xform2 = cmsCreateTransform(hLab, TYPE_Lab_8, hsRGB, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_BLACKPOINTCOMPENSATION);
+
+ cmsCloseProfile(hsRGB);
+ cmsCloseProfile(hLab);
+
+
+ Mb = 256 * 256 * 256 * sizeof(Scanline_rgb8bits);
+ In = (Scanline_rgb8bits*)malloc(Mb);
+ Out = (Scanline_rgb8bits*)malloc(Mb);
+ lab = (cmsInt8Number*)malloc(256 * 256 * 256 * 3 * sizeof(cmsInt8Number));
+
+ j = 0;
+ for (r = 0; r < 256; r++)
+ for (g = 0; g < 256; g++)
+ for (b = 0; b < 256; b++)
+ {
+
+ In[j].r = (cmsUInt8Number)r;
+ In[j].g = (cmsUInt8Number)g;
+ In[j].b = (cmsUInt8Number)b;
+ j++;
+ }
+
+
+ cmsDoTransform(xform, In, lab, 256 * 256 * 256);
+ cmsDoTransform(xform2, lab, Out, 256 * 256 * 256);
+
+ cmsDeleteTransform(xform);
+ cmsDeleteTransform(xform2);
+
+
+ j = 0;
+ for (r = 0; r < 256; r++)
+ for (g = 0; g < 256; g++)
+ for (b = 0; b < 256; b++) {
+
+ // Check for same values
+ if (!ValidInt(In[j].r, Out[j].r) ||
+ !ValidInt(In[j].g, Out[j].g) ||
+ !ValidInt(In[j].b, Out[j].b))
+ Fail("Conversion failed at (%d %d %d) != (%d %d %d)", In[j].r, In[j].g, In[j].b,
+ Out[j].r, Out[j].g, Out[j].b);
+
+ j++;
+ }
+
+
+ free(In);
+ free(Out);
+ free(lab);
+ printf("Ok\n");
+
+}
+
// Convert some known values
static
void CheckConversionFloat(void)
@@ -1682,8 +1760,7 @@ int main()
{
printf("FastFloating point extensions testbed - 1.2\n");
printf("Copyright (c) 1998-2020 Marti Maria Saguer, all rights reserved\n");
-
-
+
printf("\nInstalling error logger ... ");
cmsSetLogErrorHandler(FatalErrorQuit);
printf("done.\n");
@@ -1692,6 +1769,8 @@ int main()
cmsPlugin(cmsFastFloatExtensions());
printf("done.\n\n");
+ CheckLab2Roundtrip();
+
CheckComputeIncrements();
// 15 bit functionality
diff --git a/src/cmsxform.c b/src/cmsxform.c
index 1d8fc4c..ee9f2c3 100644
--- a/src/cmsxform.c
+++ b/src/cmsxform.c
@@ -795,7 +795,7 @@ _cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut,
p->Lut = lut;
// Let's see if any plug-in want to do the transform by itself
- if (p->Lut != NULL) {
+ if (p->Lut != NULL && !(*dwFlags & cmsFLAGS_NOOPTIMIZE)) {
for (Plugin = ctx->TransformCollection;
Plugin != NULL;