summaryrefslogtreecommitdiff
path: root/utils/samples/roundtrip.c
blob: 024a1904ce84ba2b2769c964f5df4c0d9522038d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

#include "lcms2.h"


static
double VecDist(BYTE bin[3], BYTE bout[3])
{
       double rdist, gdist, bdist;

       rdist = fabs(bout[0] - bin[0]);
       gdist = fabs(bout[1] - bin[1]);
       bdist = fabs(bout[2] - bin[2]);

       return (sqrt((rdist*rdist + gdist*gdist + bdist*bdist)));
}


int main(int  argc, char* argv[])
{

	int r, g, b;
	BYTE RGB[3], RGB_OUT[3];
	cmsHTRANSFORM xform;
	cmsHPROFILE hProfile;
	double err, SumX=0, SumX2=0, Peak = 0, n = 0;


	if (argc != 2) {
		printf("roundtrip <icc profile>\n");
		return 1;
	}

	hProfile = cmsOpenProfileFromFile(argv[1], "r");
	xform = cmsCreateTransform(hProfile,TYPE_RGB_8, hProfile, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOTPRECALC);

	for (r=0; r< 256; r++) {
		printf("%d  \r", r);
		for (g=0; g < 256; g++) {
			for (b=0; b < 256; b++) {

				RGB[0] = r;
				RGB[1] = g;
				RGB[2] = b;

				cmsDoTransform(xform, RGB, RGB_OUT, 1);

				err = VecDist(RGB, RGB_OUT);

				SumX  += err;
                SumX2 += err * err;
				n += 1.0;
				if (err > Peak)
					Peak = err;

			}
		}
	}

	printf("Average %g\n", SumX / n);
	printf("Max %g\n", Peak);
	printf("Std  %g\n", sqrt((n*SumX2 - SumX * SumX) / (n*(n-1))));
	cmsCloseProfile(hProfile);
	cmsDeleteTransform(xform);

		return 0;
}