1 //========================================================================
2 //
3 // sanitychecks.cc
4 //
5 // This file is licensed under the GPLv2 or later
6 //
7 // Copyright (C) 2020 Philipp Knechtges <philipp-dev@knechtges.com>
8 //
9 // To see a description of the changes please see the Changelog file that
10 // came with your tarball or type make ChangeLog if you are building from git
11 //
12 //========================================================================
13 
14 #include <cstdio>
15 #include <cstddef>
16 #include <cstring>
17 #include <cstdlib>
18 #include <cctype>
19 #include "sanitychecks.h"
20 
21 #ifdef USE_CMS
checkICCProfile(const GfxLCMSProfilePtr & profile,const char * filename,cmsUInt32Number UsedDirection,cmsColorSpaceSignature expectedColorSpace)22 bool checkICCProfile(const GfxLCMSProfilePtr &profile, const char *filename, cmsUInt32Number UsedDirection, cmsColorSpaceSignature expectedColorSpace)
23 {
24     if (!profile) {
25         fprintf(stderr, "Could not open the ICC profile \"%s\".\n", filename);
26         return false;
27     }
28     if (!cmsIsIntentSupported(profile.get(), INTENT_RELATIVE_COLORIMETRIC, UsedDirection) && !cmsIsIntentSupported(profile.get(), INTENT_ABSOLUTE_COLORIMETRIC, UsedDirection)
29         && !cmsIsIntentSupported(profile.get(), INTENT_SATURATION, UsedDirection) && !cmsIsIntentSupported(profile.get(), INTENT_PERCEPTUAL, LCMS_USED_AS_OUTPUT)) {
30         if (UsedDirection == LCMS_USED_AS_OUTPUT) {
31             fprintf(stderr, "ICC profile \"%s\" is not an output profile.\n", filename);
32         } else if (UsedDirection == LCMS_USED_AS_INPUT) {
33             fprintf(stderr, "ICC profile \"%s\" is not an input profile.\n", filename);
34         } else {
35             fprintf(stderr, "ICC profile \"%s\" is not suitable.\n", filename);
36         }
37         return false;
38     }
39     auto profilecolorspace = cmsGetColorSpace(profile.get());
40     if (profilecolorspace != expectedColorSpace) {
41         if (expectedColorSpace == cmsSigCmykData) {
42             fprintf(stderr, "Supplied ICC profile \"%s\" is not a CMYK profile.\n", filename);
43         } else if (expectedColorSpace == cmsSigGrayData) {
44             fprintf(stderr, "Supplied ICC profile \"%s\" is not a monochrome profile.\n", filename);
45         } else if (expectedColorSpace == cmsSigRgbData) {
46             fprintf(stderr, "Supplied ICC profile \"%s\" is not a RGB profile.\n", filename);
47         }
48         return false;
49     }
50     return true;
51 }
52 #endif
53