10#ifndef KOLCMSCOLORSPACE_H_
11#define KOLCMSCOLORSPACE_H_
63 static QMap< QString, QMap< LcmsColorProfileContainer *, KoLcmsDefaultTransformations * > >
s_transformations;
70template<
class _CSTraits>
104 void transform(
const quint8 *src, quint8 *dst, qint32 nPixels)
const override
106 cmsDoTransform(
cmstransform,
const_cast<quint8 *
>(src), dst, nPixels);
108 qint32 numPixels = nPixels;
113 float *alpha =
new float[nPixels];
114 float *dstalpha =
new float[nPixels];
116 while (index < nPixels) {
122 cmsDoTransform(
cmsAlphaTransform,
const_cast<float *
>(alpha),
static_cast<float *
>(dstalpha), nPixels);
123 for (
int i = 0; i < numPixels; i++) {
131 while (numPixels > 0) {
178 cmsUInt32Number cmType,
214 this->colorSpaceType(),
225 this->colorSpaceType(),
233 this->colorSpaceType(),
262 void fromQColor(
const QColor &color, quint8 *dst)
const override
264 std::array<quint8, 3> qcolordata;
266 qcolordata[2] =
static_cast<quint8
>(color.red());
267 qcolordata[1] =
static_cast<quint8
>(color.green());
268 qcolordata[0] =
static_cast<quint8
>(color.blue());
274 this->
setOpacity(dst,
static_cast<quint8
>(color.alpha()), 1);
277 void toQColor(
const quint8 *src, QColor *color)
const override
279 std::array<quint8, 3> qcolordata;
285 color->setRgb(qcolordata[2], qcolordata[1], qcolordata[0]);
289 void toQColor16(
const quint8 *src, QColor *color)
const override
291 std::array<quint16, 3> qcolordata;
297 color->setRgba64(QRgba64::fromRgba64(qcolordata[2], qcolordata[1], qcolordata[0], 0x0000));
307 cmsToneCurve *transferFunctions[3];
308 transferFunctions[0] = cmsBuildTabulatedToneCurve16(0, 256, transferValues);
309 transferFunctions[1] = cmsBuildGamma(0, 1.0);
310 transferFunctions[2] = cmsBuildGamma(0, 1.0);
313 adj->
profiles[1] = cmsCreateLinearizationDeviceLink(cmsSigLabData, transferFunctions);
314 cmsSetDeviceClass(adj->
profiles[1], cmsSigAbstractClass);
318 adj->
cmstransform = cmsCreateMultiprofileTransform(adj->
profiles, 3, this->colorSpaceType(), this->colorSpaceType(),
331 cmsToneCurve **transferFunctions =
new cmsToneCurve*[ this->
colorChannelCount()];
334 transferFunctions[ch] = transferValues[ch] ?
335 cmsBuildTabulatedToneCurve16(0, 256, transferValues[ch]) :
336 cmsBuildGamma(0, 1.0);
339 cmsToneCurve **alphaTransferFunctions =
new cmsToneCurve*[1];
341 cmsBuildTabulatedToneCurve16(0, 256, transferValues[this->
colorChannelCount()]) :
342 cmsBuildGamma(0, 1.0);
346 adj->
profiles[1] = cmsCreateLinearizationDeviceLink(cmsSigGrayData, alphaTransferFunctions);
349 adj->
cmstransform = cmsCreateTransform(adj->
profiles[0], this->colorSpaceType(), 0, this->colorSpaceType(),
357 delete [] transferFunctions;
358 delete [] alphaTransferFunctions;
362 quint8
difference(
const quint8 *src1,
const quint8 *src2)
const override
364 quint8 lab1[8], lab2[8];
365 cmsCIELab labF1, labF2;
374 cmsLabEncoded2Float(&labF1, (cmsUInt16Number *)lab1);
375 cmsLabEncoded2Float(&labF2, (cmsUInt16Number *)lab2);
376 qreal diff = cmsDeltaE(&labF1, &labF2);
385 quint8
differenceA(
const quint8 *src1,
const quint8 *src2)
const override
396 const qreal alphaScale = 100.0 / 255.0;
402 cmsLabEncoded2Float(&labF1, (cmsUInt16Number *)lab1);
403 cmsLabEncoded2Float(&labF2, (cmsUInt16Number *)lab2);
408 cmsFloat64Number dAlpha;
410 dL = fabs((qreal)(labF1.L - labF2.L));
411 da = fabs((qreal)(labF1.a - labF2.a));
412 db = fabs((qreal)(labF1.b - labF2.b));
414 static const int LabAAlphaPos = 3;
416 quint16 alpha1 =
reinterpret_cast<quint16 *
>(lab1)[LabAAlphaPos];
417 quint16 alpha2 =
reinterpret_cast<quint16 *
>(lab2)[LabAAlphaPos];
418 dAlpha = fabs((qreal)(alpha1 - alpha2)) * alphaScale;
420 qreal diff = pow(dL * dL + da * da + db * db + dAlpha * dAlpha, 0.5);
const quint8 OPACITY_TRANSPARENT_U8
LcmsColorProfileContainer * asLcms() const
quint32 pixelSize() const override
void setOpacity(quint8 *pixels, quint8 alpha, qint32 nPixels) const override
quint32 colorChannelCount() const override
quint8 opacityU8(const quint8 *U8_pixel) const override
const KoColorConversionTransformation * toLabA16Converter() const
virtual quint32 pixelSize() const =0
virtual qreal opacityF(const quint8 *pixel) const =0
virtual void setOpacity(quint8 *pixels, quint8 alpha, qint32 nPixels) const =0
virtual cmsColorSpaceSignature colorSpaceSignature() const
virtual quint32 colorSpaceType() const
KoLcmsInfo(cmsUInt32Number cmType, cmsColorSpaceSignature colorSpaceSignature)
cmsHPROFILE lcmsProfile() const
bool isHdr() const override
bool profileIsCompatible(const KoColorProfile *profile) const override
KoColorProfile * createColorProfile(const QByteArray &rawData) const override
QList< KoColorConversionTransformationFactory * > colorConversionLinks() const override
int crossingCost() const override
QString colorSpaceEngine() const override
LcmsColorSpaceFactory(cmsUInt32Number cmType, cmsColorSpaceSignature colorSpaceSignature)
void toQColor(const quint8 *src, QColor *color) const override
KisLocklessStack< KisLcmsLastTransformationSP > KisLcmsTransformationStack
void fromQColor(const QColor &color, quint8 *dst) const override
QSharedPointer< KisLcmsLastTransformation > KisLcmsLastTransformationSP
bool hasHighDynamicRange() const override
void toQColor16(const quint8 *src, QColor *color) const override
KoColorTransformation * createPerChannelAdjustment(const quint16 *const *transferValues) const override
static LcmsColorProfileContainer * asLcmsProfile(const KoColorProfile *p)
quint8 differenceA(const quint8 *src1, const quint8 *src2) const override
LcmsColorSpace(const QString &id, const QString &name, cmsUInt32Number cmType, cmsColorSpaceSignature colorSpaceSignature, KoColorProfile *p)
LcmsColorProfileContainer * lcmsProfile() const
KoColorTransformation * createBrightnessContrastAdjustment(const quint16 *transferValues) const override
quint8 difference(const quint8 *src1, const quint8 *src2) const override
~LcmsColorSpace() override
const KoColorProfile * profile() const override
bool profileIsCompatible(const KoColorProfile *profile) const override
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
virtual bool isSuitableForOutput() const =0
cmsColorSpaceSignature colorSpaceSignature
KisLcmsTransformationStack fromRGBCachedTransformations
KisLcmsTransformationStack toRGB16CachedTransformations
KoLcmsDefaultTransformations * defaultTransformations
KisLcmsTransformationStack toRGBCachedTransformations
LcmsColorProfileContainer * profile
KoColorProfile * colorProfile