Subversion Repositories Scribus

Rev

Rev 23668 | Rev 23779 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
15127 jghali 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
7
 
8
#include "sclcms2colorprofileimpl.h"
9
#include "sclcms2colormgmtengineimpl.h"
15143 fschmid 10
#include <cstdlib>
15127 jghali 11
 
12
ScLcms2ColorProfileImpl::ScLcms2ColorProfileImpl(ScColorMgmtEngine& engine, cmsHPROFILE lcmsProfile)
23668 craig 13
        : ScColorProfileImplBase(engine), m_profileHandle(lcmsProfile)
15127 jghali 14
{
15
 
16
}
17
 
18
ScLcms2ColorProfileImpl::~ScLcms2ColorProfileImpl()
19
{
20
        closeProfile();
21
}
22
 
23
bool ScLcms2ColorProfileImpl::isNull() const
24
{
22518 craig 25
        return (m_profileHandle == nullptr);
15127 jghali 26
}
27
 
28
eColorSpaceType ScLcms2ColorProfileImpl::colorSpace()  const
29
{
30
        if (m_profileHandle)
31
                return ScLcms2ColorMgmtEngineImpl::translateLcmsColorSpaceType( cmsGetColorSpace(m_profileHandle) );
32
        return ColorSpace_Unknown;
33
}
34
 
35
eProfileClass ScLcms2ColorProfileImpl::deviceClass() const
36
{
37
        if (m_profileHandle)
38
                return ScLcms2ColorMgmtEngineImpl::translateLcmsProfileClass( cmsGetDeviceClass(m_profileHandle) );
39
        return Class_Unknown;
40
}
41
 
23489 jghali 42
bool ScLcms2ColorProfileImpl::isSuitableForOutput() const
43
{
44
        if (!m_profileHandle)
45
                return false;
46
 
47
        if (cmsIsMatrixShaper(m_profileHandle))
48
                return true;
49
 
50
        cmsUInt32Number defaultIntent = cmsGetHeaderRenderingIntent(m_profileHandle);
23668 craig 51
        return (cmsIsCLUT(m_profileHandle, defaultIntent, LCMS_USED_AS_INPUT) &&
52
                        cmsIsCLUT(m_profileHandle, defaultIntent, LCMS_USED_AS_OUTPUT));
23489 jghali 53
}
54
 
15127 jghali 55
QString ScLcms2ColorProfileImpl::productDescription() const
56
{
57
        if (m_productDescription.isEmpty())
58
        {
59
                if (m_profileHandle)
60
                {
15143 fschmid 61
#ifdef _WIN32
22518 craig 62
                        cmsUInt32Number descSize = cmsGetProfileInfo(m_profileHandle, cmsInfoDescription, "en", "US", nullptr, 0);
15127 jghali 63
                        if (descSize > 0)
64
                        {
65
                                wchar_t* descData = (wchar_t*) malloc(descSize + sizeof(wchar_t));
23778 jghali 66
                                if (descData)
67
                                        descSize = cmsGetProfileInfo(m_profileHandle, cmsInfoDescription, "en", "US", descData, descSize);
68
                                if (descData && (descSize > 0))
15127 jghali 69
                                {
15135 jghali 70
                                        uint stringLen = descSize / sizeof(wchar_t);
71
                                        descData[stringLen] = 0;
15127 jghali 72
                                        if (sizeof(wchar_t) == sizeof(QChar)) {
15135 jghali 73
                                                m_productDescription = QString::fromUtf16((ushort *) descData);
15127 jghali 74
                                        } else {
15135 jghali 75
                                                m_productDescription = QString::fromUcs4((uint *) descData);
15127 jghali 76
                                        }
77
                                }
23778 jghali 78
                                free(descData);
15127 jghali 79
                        }
15143 fschmid 80
#else
22518 craig 81
                        cmsUInt32Number descSize = cmsGetProfileInfoASCII(m_profileHandle, cmsInfoDescription, "en", "US", nullptr, 0);
15143 fschmid 82
                        if (descSize > 0)
83
                        {
84
                                char* descData = (char*) malloc(descSize + sizeof(char));
23778 jghali 85
                                if (descData)
86
                                        descSize = cmsGetProfileInfoASCII(m_profileHandle, cmsInfoDescription, "en", "US", descData, descSize);
87
                                if (descData && (descSize > 0))
15143 fschmid 88
                                        m_productDescription = QString(descData);
23778 jghali 89
                                free(descData);
15143 fschmid 90
                        }
91
#endif
15127 jghali 92
                }
93
        }
94
        return m_productDescription;
95
}
96
 
22599 craig 97
void ScLcms2ColorProfileImpl::closeProfile()
15127 jghali 98
{
99
        if (m_profileHandle)
100
        {
101
                cmsCloseProfile(m_profileHandle);
22518 craig 102
                m_profileHandle = nullptr;
15127 jghali 103
        }
22518 craig 104
}
23515 jghali 105
 
106
bool ScLcms2ColorProfileImpl::save(QByteArray& profileData) const
107
{
108
        if (!m_profileHandle)
109
                return false;
110
        profileData.clear();
111
 
112
        // First retrieve profile size
113
        cmsUInt32Number bytesNeeded = 0;
114
        bool done = cmsSaveProfileToMem(m_profileHandle, 0, &bytesNeeded);
115
        if (!done)
116
                return false;
117
 
118
        // Allocate array for profile data
119
        profileData.resize(bytesNeeded);
120
        if (profileData.size() != bytesNeeded)
121
                return false;
122
        done = cmsSaveProfileToMem(m_profileHandle, profileData.data(), &bytesNeeded);
123
 
124
        return done;
23668 craig 125
}