Krita Source Code Documentation
Loading...
Searching...
No Matches
LcmsColorSpace< _CSTraits > Class Template Reference

#include <LcmsColorSpace.h>

+ Inheritance diagram for LcmsColorSpace< _CSTraits >:

Classes

struct  KisLcmsLastTransformation
 
struct  KoLcmsColorTransformation
 
struct  Private
 

Public Member Functions

KoColorTransformationcreateBrightnessContrastAdjustment (const quint16 *transferValues) const override
 
KoColorTransformationcreatePerChannelAdjustment (const quint16 *const *transferValues) const override
 
quint8 difference (const quint8 *src1, const quint8 *src2) const override
 
quint8 differenceA (const quint8 *src1, const quint8 *src2) const override
 
void fromQColor (const QColor &color, quint8 *dst) const override
 
bool hasHighDynamicRange () const override
 
const KoColorProfileprofile () const override
 
bool profileIsCompatible (const KoColorProfile *profile) const override
 
void toQColor (const quint8 *src, QColor *color) const override
 
void toQColor16 (const quint8 *src, QColor *color) const override
 
- Public Member Functions inherited from KoColorSpaceAbstract< _CSTraits >
quint32 alphaPos () const override
 
void applyAlphaNormedFloatMask (quint8 *pixels, const float *alpha, qint32 nPixels) const override
 
void applyAlphaU8Mask (quint8 *pixels, const quint8 *alpha, qint32 nPixels) const override
 
void applyInverseAlphaU8Mask (quint8 *pixels, const quint8 *alpha, qint32 nPixels) const override
 
void applyInverseNormedFloatMask (quint8 *pixels, const float *alpha, qint32 nPixels) const override
 
quint32 channelCount () const override
 
QString channelValueText (const quint8 *pixel, quint32 channelIndex) const override
 
quint32 colorChannelCount () const override
 
void convertChannelToVisualRepresentation (const quint8 *src, quint8 *dst, quint32 nPixels, const QBitArray selectedChannels) const override
 
void convertChannelToVisualRepresentation (const quint8 *src, quint8 *dst, quint32 nPixels, const qint32 selectedChannelIndex) const override
 
void copyOpacityU8 (quint8 *src, quint8 *dst, qint32 nPixels) const override
 
KoColorTransformationcreateDarkenAdjustment (qint32 shade, bool compensate, qreal compensation) const override
 
KoColorTransformationcreateInvertTransformation () const override
 
void fillGrayBrushWithColor (quint8 *dst, const QRgb *brush, quint8 *brushColor, qint32 nPixels) const override
 
void fillInverseAlphaNormedFloatMaskWithColor (quint8 *pixels, const float *alpha, const quint8 *brushColor, qint32 nPixels) const override
 
void fromNormalisedChannelsValue (quint8 *pixel, const QVector< float > &values) const override
 
quint8 intensity8 (const quint8 *src) const override
 
qreal intensityF (const quint8 *src) const override
 
 KoColorSpaceAbstract (const QString &id, const QString &name)
 
void multiplyAlpha (quint8 *pixels, quint8 alpha, qint32 nPixels) const override
 
void normalisedChannelsValue (const quint8 *pixel, QVector< float > &channels) const override
 
QString normalisedChannelValueText (const quint8 *pixel, quint32 channelIndex) const override
 
qreal opacityF (const quint8 *U8_pixel) const override
 
quint8 opacityU8 (const quint8 *U8_pixel) const override
 
quint32 pixelSize () const override
 
quint8 scaleToU8 (const quint8 *srcPixel, qint32 channelIndex) const override
 
void setOpacity (quint8 *pixels, qreal alpha, qint32 nPixels) const override
 
void setOpacity (quint8 *pixels, quint8 alpha, qint32 nPixels) const override
 
void singleChannelPixel (quint8 *dstPixel, const quint8 *srcPixel, quint32 channelIndex) const override
 
- Public Member Functions inherited from KoColorSpace
virtual void addCompositeOp (const KoCompositeOp *op)
 
virtual void addDitherOp (KisDitherOp *op)
 
virtual void bitBlt (const KoColorSpace *srcSpace, const KoCompositeOp::ParameterInfo &params, const KoCompositeOp *op, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
 
QBitArray channelFlags (bool color=true, bool alpha=false) const
 
QList< KoChannelInfo * > channels () const
 
virtual KoID colorDepthId () const =0
 
virtual void colorFromXML (quint8 *pixel, const QDomElement &elt) const =0
 
virtual KoID colorModelId () const =0
 
virtual void colorToXML (const quint8 *pixel, QDomDocument &doc, QDomElement &colorElt) const =0
 
const KoCompositeOpcompositeOp (const QString &id, const KoColorSpace *srcSpace=nullptr) const
 
virtual QList< KoCompositeOp * > compositeOps () const
 
virtual bool convertPixelsTo (const quint8 *src, quint8 *dst, const KoColorSpace *dstColorSpace, quint32 numPixels, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
 
virtual QImage convertToQImage (const quint8 *data, qint32 width, qint32 height, const KoColorProfile *dstProfile, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
 
virtual KoConvolutionOpconvolutionOp () const
 
virtual KoColorConversionTransformationcreateColorConverter (const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
 
KoColorTransformationcreateColorTransformation (const QString &id, const QHash< QString, QVariant > &parameters) const
 
virtual KoColorConversionTransformationcreateProofingTransform (const KoColorSpace *dstColorSpace, const KoColorSpace *proofingSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::Intent proofingIntent, bool bpcFirstTransform, quint8 *gamutWarning, KoColorConversionTransformation::ConversionFlags displayConversionFlags) const
 createProofingTransform Create a proofing transform. This is a two part transform that can also do gamut checks. The first transform is from source -> proofing space. Here the gamut checks are performed. The second is the proofing to destination space.
 
virtual void decreaseHue (quint8 *pixel, qreal step) const
 
virtual void decreaseLuminosity (quint8 *pixel, qreal step) const
 
virtual void decreaseSaturation (quint8 *pixel, qreal step) const
 
virtual const KisDitherOpditherOp (const QString &depth, DitherType type) const
 
QPolygonF estimatedTRCXYY () const
 
virtual void fillGrayBrushWithColorAndLightnessOverlay (quint8 *dst, const QRgb *brush, quint8 *brushColor, qint32 nPixels) const
 
virtual void fillGrayBrushWithColorAndLightnessWithStrength (quint8 *dst, const QRgb *brush, quint8 *brushColor, qreal strength, qint32 nPixels) const
 
virtual QVector< double > fromHSY (qreal *hue, qreal *sat, qreal *luma) const =0
 
virtual void fromLabA16 (const quint8 *src, quint8 *dst, quint32 nPixels) const
 
virtual void fromRgbA16 (const quint8 *src, quint8 *dst, quint32 nPixels) const
 
virtual QVector< double > fromYUV (qreal *y, qreal *u, qreal *v) const =0
 
QPolygonF gamutXYY () const
 
virtual bool hasCompositeOp (const QString &id, const KoColorSpace *srcSpace=nullptr) const
 
QString id () const
 
virtual void increaseBlue (quint8 *pixel, qreal step) const
 
virtual void increaseGreen (quint8 *pixel, qreal step) const
 
virtual void increaseHue (quint8 *pixel, qreal step) const
 
virtual void increaseLuminosity (quint8 *pixel, qreal step) const
 
virtual void increaseRed (quint8 *pixel, qreal step) const
 
virtual void increaseSaturation (quint8 *pixel, qreal step) const
 
virtual void increaseYellow (quint8 *pixel, qreal step) const
 
 KoColorSpace (const QString &id, const QString &name, KoMixColorsOp *mixColorsOp, KoConvolutionOp *convolutionOp)
 Should be called by real color spaces.
 
QVector< qreal > lumaCoefficients () const
 
virtual KoMixColorsOpmixColorsOp () const
 
virtual void modulateLightnessByGrayBrush (quint8 *dst, const QRgb *brush, qreal strength, qint32 nPixels) const
 
QString name () const
 
virtual bool operator== (const KoColorSpace &rhs) const
 
virtual bool proofPixelsTo (const quint8 *src, quint8 *dst, quint32 numPixels, KoColorConversionTransformation *proofingTransform) const
 proofPixelsTo
 
virtual void toHSY (const QVector< double > &channelValues, qreal *hue, qreal *sat, qreal *luma) const =0
 
virtual void toLabA16 (const quint8 *src, quint8 *dst, quint32 nPixels) const
 
virtual void toRgbA16 (const quint8 *src, quint8 *dst, quint32 nPixels) const
 
virtual void toYUV (const QVector< double > &channelValues, qreal *y, qreal *u, qreal *v) const =0
 
virtual void transparentColor (quint8 *dst, quint32 nPixels) const
 
virtual bool willDegrade (ColorSpaceIndependence independence) const =0
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KoLcmsInfo
virtual cmsColorSpaceSignature colorSpaceSignature () const
 
virtual quint32 colorSpaceType () const
 
 KoLcmsInfo (cmsUInt32Number cmType, cmsColorSpaceSignature colorSpaceSignature)
 
virtual ~KoLcmsInfo ()
 

Protected Member Functions

void init ()
 
 LcmsColorSpace (const QString &id, const QString &name, cmsUInt32Number cmType, cmsColorSpaceSignature colorSpaceSignature, KoColorProfile *p)
 
 ~LcmsColorSpace () override
 
- Protected Member Functions inherited from KoColorSpace
virtual void addChannel (KoChannelInfo *ci)
 
const KoColorConversionTransformationfromLabA16Converter () const
 
const KoColorConversionTransformationfromRgbA16Converter () const
 
 KoColorSpace ()
 Only for use by classes that serve as baseclass for real color spaces.
 
virtual bool preferCompositionInSourceColorSpace () const
 
const KoColorConversionTransformationtoLabA16Converter () const
 
const KoColorConversionTransformationtoRgbA16Converter () const
 
virtual ~KoColorSpace ()
 

Private Types

typedef QSharedPointer< KisLcmsLastTransformationKisLcmsLastTransformationSP
 
typedef KisLocklessStack< KisLcmsLastTransformationSPKisLcmsTransformationStack
 

Private Member Functions

LcmsColorProfileContainerlcmsProfile () const
 

Static Private Member Functions

static LcmsColorProfileContainerasLcmsProfile (const KoColorProfile *p)
 

Private Attributes

Private *const d
 

Additional Inherited Members

- Public Types inherited from KoColorSpaceAbstract< _CSTraits >
typedef _CSTraits ColorSpaceTraits
 
- Public Attributes inherited from KoColorSpace
ThreadLocalCache channelFlagsApplicationCache
 
QList< KoChannelInfo * > channels
 
QVector< qreal > colorants
 
QHash< QString, KoCompositeOp * > compositeOps
 
ThreadLocalCache conversionCache
 
KoConvolutionOpconvolutionOp
 
Deletability deletability
 
QHash< QString, QMap< DitherType, KisDitherOp * > > ditherOps
 
QPolygonF gamutXYY
 
KoColorSpaceEngineiccEngine
 
QString id
 
quint32 idNumber
 
QVector< qreal > lumaCoefficients
 
KoMixColorsOpmixColorsOp
 
QString name
 
KoColorConversionTransformationtransfoFromLABA16
 
KoColorConversionTransformationtransfoFromRGBA16
 
KoColorConversionTransformationtransfoToLABA16
 
KoColorConversionTransformationtransfoToRGBA16
 
QPolygonF TRCXYY
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Protected Attributes inherited from KoColorSpace
Private *const d
 

Detailed Description

template<class _CSTraits>
class LcmsColorSpace< _CSTraits >

This is the base class for all colorspaces that are based on the lcms library, for instance RGB 8bits and 16bits, CMYK 8bits and 16bits, LAB...

Definition at line 71 of file LcmsColorSpace.h.

Member Typedef Documentation

◆ KisLcmsLastTransformationSP

template<class _CSTraits >
typedef QSharedPointer<KisLcmsLastTransformation> LcmsColorSpace< _CSTraits >::KisLcmsLastTransformationSP
private

Definition at line 159 of file LcmsColorSpace.h.

◆ KisLcmsTransformationStack

template<class _CSTraits >
typedef KisLocklessStack<KisLcmsLastTransformationSP> LcmsColorSpace< _CSTraits >::KisLcmsTransformationStack
private

Definition at line 161 of file LcmsColorSpace.h.

Constructor & Destructor Documentation

◆ LcmsColorSpace()

template<class _CSTraits >
LcmsColorSpace< _CSTraits >::LcmsColorSpace ( const QString & id,
const QString & name,
cmsUInt32Number cmType,
cmsColorSpaceSignature colorSpaceSignature,
KoColorProfile * p )
inlineprotected

Definition at line 176 of file LcmsColorSpace.h.

183 , d(new Private())
184 {
185 Q_ASSERT(p); // No profile means the lcms color space can't work
186 Q_ASSERT(profileIsCompatible(p));
188 Q_ASSERT(d->profile);
189 d->colorProfile = p;
191 }
const Params2D p
virtual cmsColorSpaceSignature colorSpaceSignature() const
KoLcmsInfo(cmsUInt32Number cmType, cmsColorSpaceSignature colorSpaceSignature)
static LcmsColorProfileContainer * asLcmsProfile(const KoColorProfile *p)
Private *const d
bool profileIsCompatible(const KoColorProfile *profile) const override
KoLcmsDefaultTransformations * defaultTransformations
LcmsColorProfileContainer * profile
KoColorProfile * colorProfile

References LcmsColorSpace< _CSTraits >::asLcmsProfile(), LcmsColorSpace< _CSTraits >::Private::colorProfile, LcmsColorSpace< _CSTraits >::d, LcmsColorSpace< _CSTraits >::Private::defaultTransformations, p, LcmsColorSpace< _CSTraits >::Private::profile, and LcmsColorSpace< _CSTraits >::profileIsCompatible().

◆ ~LcmsColorSpace()

template<class _CSTraits >
LcmsColorSpace< _CSTraits >::~LcmsColorSpace ( )
inlineoverrideprotected

Member Function Documentation

◆ asLcmsProfile()

template<class _CSTraits >
static LcmsColorProfileContainer * LcmsColorSpace< _CSTraits >::asLcmsProfile ( const KoColorProfile * p)
inlinestaticprivate

Definition at line 436 of file LcmsColorSpace.h.

437 {
438 if (!p) {
439 return 0;
440 }
441
442 const IccColorProfile *iccp = dynamic_cast<const IccColorProfile *>(p);
443
444 if (!iccp) {
445 return 0;
446 }
447
448 Q_ASSERT(iccp->asLcms());
449
450 return iccp->asLcms();
451 }
LcmsColorProfileContainer * asLcms() const

References IccColorProfile::asLcms(), and p.

◆ createBrightnessContrastAdjustment()

template<class _CSTraits >
KoColorTransformation * LcmsColorSpace< _CSTraits >::createBrightnessContrastAdjustment ( const quint16 * transferValues) const
inlineoverridevirtual

Create an adjustment object for adjusting the brightness and contrast transferValues is a 256 bins array with values from 0 to 0xFFFF This function is thread-safe, but you need to create one KoColorTransformation per thread.

Implements KoColorSpace.

Definition at line 301 of file LcmsColorSpace.h.

302 {
303 if (!d->profile) {
304 return 0;
305 }
306
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);
311
312 KoLcmsColorTransformation *adj = new KoLcmsColorTransformation(this);
313 adj->profiles[1] = cmsCreateLinearizationDeviceLink(cmsSigLabData, transferFunctions);
314 cmsSetDeviceClass(adj->profiles[1], cmsSigAbstractClass);
315
316 adj->profiles[0] = d->profile->lcmsProfile();
317 adj->profiles[2] = d->profile->lcmsProfile();
318 adj->cmstransform = cmsCreateMultiprofileTransform(adj->profiles, 3, this->colorSpaceType(), this->colorSpaceType(),
321 adj->csProfile = d->profile->lcmsProfile();
322 return adj;
323 }

References KoColorConversionTransformation::adjustmentConversionFlags(), KoColorConversionTransformation::adjustmentRenderingIntent(), LcmsColorSpace< _CSTraits >::KoLcmsColorTransformation::cmstransform, LcmsColorSpace< _CSTraits >::KoLcmsColorTransformation::csProfile, LcmsColorSpace< _CSTraits >::d, LcmsColorProfileContainer::lcmsProfile(), LcmsColorSpace< _CSTraits >::Private::profile, and LcmsColorSpace< _CSTraits >::KoLcmsColorTransformation::profiles.

◆ createPerChannelAdjustment()

template<class _CSTraits >
KoColorTransformation * LcmsColorSpace< _CSTraits >::createPerChannelAdjustment ( const quint16 *const * transferValues) const
inlineoverridevirtual

Create an adjustment object for adjusting individual channels transferValues is an array of colorChannelCount number of 256 bins array with values from 0 to 0xFFFF This function is thread-safe, but you need to create one KoColorTransformation per thread.

The layout of the channels must be the following:

0..N-2 - color channels of the pixel; N-1 - alpha channel of the pixel (if exists)

Implements KoColorSpace.

Definition at line 325 of file LcmsColorSpace.h.

326 {
327 if (!d->profile) {
328 return 0;
329 }
330
331 cmsToneCurve **transferFunctions = new cmsToneCurve*[ this->colorChannelCount()];
332
333 for (uint ch = 0; ch < this->colorChannelCount(); ch++) {
334 transferFunctions[ch] = transferValues[ch] ?
335 cmsBuildTabulatedToneCurve16(0, 256, transferValues[ch]) :
336 cmsBuildGamma(0, 1.0);
337 }
338
339 cmsToneCurve **alphaTransferFunctions = new cmsToneCurve*[1];
340 alphaTransferFunctions[0] = transferValues[this->colorChannelCount()] ?
341 cmsBuildTabulatedToneCurve16(0, 256, transferValues[this->colorChannelCount()]) :
342 cmsBuildGamma(0, 1.0);
343
344 KoLcmsColorTransformation *adj = new KoLcmsColorTransformation(this);
345 adj->profiles[0] = cmsCreateLinearizationDeviceLink(this->colorSpaceSignature(), transferFunctions);
346 adj->profiles[1] = cmsCreateLinearizationDeviceLink(cmsSigGrayData, alphaTransferFunctions);
347 adj->profiles[2] = 0;
348 adj->csProfile = d->profile->lcmsProfile();
349 adj->cmstransform = cmsCreateTransform(adj->profiles[0], this->colorSpaceType(), 0, this->colorSpaceType(),
352
353 adj->cmsAlphaTransform = cmsCreateTransform(adj->profiles[1], TYPE_GRAY_FLT, 0, TYPE_GRAY_FLT,
356
357 delete [] transferFunctions;
358 delete [] alphaTransferFunctions;
359 return adj;
360 }
unsigned int uint
quint32 colorChannelCount() const override

References KoColorConversionTransformation::adjustmentConversionFlags(), KoColorConversionTransformation::adjustmentRenderingIntent(), LcmsColorSpace< _CSTraits >::KoLcmsColorTransformation::cmsAlphaTransform, LcmsColorSpace< _CSTraits >::KoLcmsColorTransformation::cmstransform, KoColorSpaceAbstract< _CSTraits >::colorChannelCount(), KoLcmsInfo::colorSpaceSignature(), LcmsColorSpace< _CSTraits >::KoLcmsColorTransformation::csProfile, LcmsColorSpace< _CSTraits >::d, LcmsColorProfileContainer::lcmsProfile(), LcmsColorSpace< _CSTraits >::Private::profile, and LcmsColorSpace< _CSTraits >::KoLcmsColorTransformation::profiles.

◆ difference()

template<class _CSTraits >
quint8 LcmsColorSpace< _CSTraits >::difference ( const quint8 * src1,
const quint8 * src2 ) const
inlineoverridevirtual

Get the difference between 2 colors, normalized in the range (0,255). Only completely opaque and completely transparent are taken into account when computing the difference; other transparency levels are not regarded when finding the difference.

Completely transparent pixels are treated as if they are completely different from any non-transparent pixels.

Implements KoColorSpace.

Definition at line 362 of file LcmsColorSpace.h.

363 {
364 quint8 lab1[8], lab2[8];
365 cmsCIELab labF1, labF2;
366
367 if (this->opacityU8(src1) == OPACITY_TRANSPARENT_U8
368 || this->opacityU8(src2) == OPACITY_TRANSPARENT_U8) {
369 return (this->opacityU8(src1) == this->opacityU8(src2) ? 0 : 255);
370 }
371 Q_ASSERT(this->toLabA16Converter());
372 this->toLabA16Converter()->transform(src1, lab1, 1);
373 this->toLabA16Converter()->transform(src2, lab2, 1);
374 cmsLabEncoded2Float(&labF1, (cmsUInt16Number *)lab1);
375 cmsLabEncoded2Float(&labF2, (cmsUInt16Number *)lab2);
376 qreal diff = cmsDeltaE(&labF1, &labF2);
377
378 if (diff > 255.0) {
379 return 255;
380 } else {
381 return quint8(diff);
382 }
383 }
const quint8 OPACITY_TRANSPARENT_U8
quint8 opacityU8(const quint8 *U8_pixel) const override
const KoColorConversionTransformation * toLabA16Converter() const
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override=0

References OPACITY_TRANSPARENT_U8, KoColorSpaceAbstract< _CSTraits >::opacityU8(), KoColorSpace::toLabA16Converter(), and KoColorConversionTransformation::transform().

◆ differenceA()

template<class _CSTraits >
quint8 LcmsColorSpace< _CSTraits >::differenceA ( const quint8 * src1,
const quint8 * src2 ) const
inlineoverridevirtual

Get the difference between 2 colors, normalized in the range (0,255). This function takes the Alpha channel of the pixel into account. Alpha channel has the same weight as Lightness channel.

Completely transparent pixels are treated as if their color channels are the same as ones of the other pixel. In other words, only alpha channel difference is compared.

Implements KoColorSpace.

Definition at line 385 of file LcmsColorSpace.h.

386 {
387 quint8 lab1[8];
388 quint8 lab2[8];
389 cmsCIELab labF1;
390 cmsCIELab labF2;
391
392 if (this->opacityU8(src1) == OPACITY_TRANSPARENT_U8
393 || this->opacityU8(src2) == OPACITY_TRANSPARENT_U8) {
394
395
396 const qreal alphaScale = 100.0 / 255.0;
397 return qRound(alphaScale * qAbs(this->opacityU8(src1) - this->opacityU8(src2)));
398 }
399 Q_ASSERT(this->toLabA16Converter());
400 this->toLabA16Converter()->transform(src1, lab1, 1);
401 this->toLabA16Converter()->transform(src2, lab2, 1);
402 cmsLabEncoded2Float(&labF1, (cmsUInt16Number *)lab1);
403 cmsLabEncoded2Float(&labF2, (cmsUInt16Number *)lab2);
404
405 cmsFloat64Number dL;
406 cmsFloat64Number da;
407 cmsFloat64Number db;
408 cmsFloat64Number dAlpha;
409
410 dL = fabs((qreal)(labF1.L - labF2.L));
411 da = fabs((qreal)(labF1.a - labF2.a));
412 db = fabs((qreal)(labF1.b - labF2.b));
413
414 static const int LabAAlphaPos = 3;
415 static const cmsFloat64Number alphaScale = 100.0 / KoColorSpaceMathsTraits<quint16>::max;
416 quint16 alpha1 = reinterpret_cast<quint16 *>(lab1)[LabAAlphaPos];
417 quint16 alpha2 = reinterpret_cast<quint16 *>(lab2)[LabAAlphaPos];
418 dAlpha = fabs((qreal)(alpha1 - alpha2)) * alphaScale;
419
420 qreal diff = pow(dL * dL + da * da + db * db + dAlpha * dAlpha, 0.5);
421
422 if (diff > 255.0) {
423 return 255;
424 } else {
425 return quint8(diff);
426 }
427 }

References OPACITY_TRANSPARENT_U8, KoColorSpaceAbstract< _CSTraits >::opacityU8(), KoColorSpace::toLabA16Converter(), and KoColorConversionTransformation::transform().

◆ fromQColor()

template<class _CSTraits >
void LcmsColorSpace< _CSTraits >::fromQColor ( const QColor & color,
quint8 * dst ) const
inlineoverridevirtual

The fromQColor methods take a given color defined as an RGB QColor and fills a byte array with the corresponding color in the the colorspace managed by this strategy.

Parameters
colorthe QColor that will be used to fill dst
dsta pointer to a pixel

Implements KoColorSpace.

Definition at line 262 of file LcmsColorSpace.h.

263 {
264 std::array<quint8, 3> qcolordata;
265
266 qcolordata[2] = static_cast<quint8>(color.red());
267 qcolordata[1] = static_cast<quint8>(color.green());
268 qcolordata[0] = static_cast<quint8>(color.blue());
269
270 // Default sRGB
272 cmsDoTransform(d->defaultTransformations->fromRGB, qcolordata.data(), dst, 1);
273
274 this->setOpacity(dst, static_cast<quint8>(color.alpha()), 1);
275 }
void setOpacity(quint8 *pixels, quint8 alpha, qint32 nPixels) const override
#define KIS_ASSERT(cond)
Definition kis_assert.h:33

References LcmsColorSpace< _CSTraits >::d, LcmsColorSpace< _CSTraits >::Private::defaultTransformations, KoLcmsDefaultTransformations::fromRGB, KIS_ASSERT, and KoColorSpaceAbstract< _CSTraits >::setOpacity().

◆ hasHighDynamicRange()

template<class _CSTraits >
bool LcmsColorSpace< _CSTraits >::hasHighDynamicRange ( ) const
inlineoverridevirtual

Returns true if the colorspace supports channel values outside the (normalised) range 0 to 1.

Implements KoColorSpace.

Reimplemented in RgbF16ColorSpace, RgbF32ColorSpace, XyzF16ColorSpace, XyzF32ColorSpace, and YCbCrF32ColorSpace.

Definition at line 246 of file LcmsColorSpace.h.

247 {
248 return false;
249 }

◆ init()

template<class _CSTraits >
void LcmsColorSpace< _CSTraits >::init ( )
inlineprotected

Definition at line 200 of file LcmsColorSpace.h.

201 {
203
205 KoLcmsDefaultTransformations::s_RGBProfile = cmsCreate_sRGBProfile();
206 }
209 KoColorConversionTransformation::ConversionFlags conversionFlags = KoColorConversionTransformation::internalConversionFlags();
212 TYPE_BGR_8,
214 this->colorSpaceType(),
216 conversionFlags);
218
219 // LCMS has a too optimistic optimization when transforming from linear color spaces
220 if (d->profile->isLinear()) {
222 }
223
224 d->defaultTransformations->toRGB = cmsCreateTransform(d->profile->lcmsProfile(),
225 this->colorSpaceType(),
227 TYPE_BGR_8,
229 conversionFlags);
231
232 d->defaultTransformations->toRGB16 = cmsCreateTransform(d->profile->lcmsProfile(),
233 this->colorSpaceType(),
235 TYPE_BGR_16,
237 conversionFlags);
239
241 }
242 }
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
virtual bool isSuitableForOutput() const =0
static QMap< QString, QMap< LcmsColorProfileContainer *, KoLcmsDefaultTransformations * > > s_transformations
static cmsHPROFILE s_RGBProfile

References LcmsColorSpace< _CSTraits >::Private::colorProfile, LcmsColorSpace< _CSTraits >::d, LcmsColorSpace< _CSTraits >::Private::defaultTransformations, KoLcmsDefaultTransformations::fromRGB, KoColorSpace::id, KoColorConversionTransformation::internalConversionFlags(), KoColorConversionTransformation::internalRenderingIntent(), LcmsColorProfileContainer::isLinear(), KoColorProfile::isSuitableForOutput(), KIS_ASSERT, KIS_SAFE_ASSERT_RECOVER_NOOP, LcmsColorProfileContainer::lcmsProfile(), KoColorConversionTransformation::NoOptimization, LcmsColorSpace< _CSTraits >::Private::profile, KoLcmsDefaultTransformations::s_RGBProfile, KoLcmsDefaultTransformations::s_transformations, KoLcmsDefaultTransformations::toRGB, and KoLcmsDefaultTransformations::toRGB16.

◆ lcmsProfile()

template<class _CSTraits >
LcmsColorProfileContainer * LcmsColorSpace< _CSTraits >::lcmsProfile ( ) const
inlineprivate

Definition at line 431 of file LcmsColorSpace.h.

432 {
433 return d->profile;
434 }

References LcmsColorSpace< _CSTraits >::d, and LcmsColorSpace< _CSTraits >::Private::profile.

◆ profile()

template<class _CSTraits >
const KoColorProfile * LcmsColorSpace< _CSTraits >::profile ( ) const
inlineoverridevirtual

Return the profile of this color space.

Implements KoColorSpace.

Definition at line 251 of file LcmsColorSpace.h.

252 {
253 return d->colorProfile;
254 }

References LcmsColorSpace< _CSTraits >::Private::colorProfile, and LcmsColorSpace< _CSTraits >::d.

◆ profileIsCompatible()

template<class _CSTraits >
bool LcmsColorSpace< _CSTraits >::profileIsCompatible ( const KoColorProfile * profile) const
inlineoverridevirtual
Returns
true if the profile given in argument can be used by this color space

Implements KoColorSpace.

Definition at line 256 of file LcmsColorSpace.h.

257 {
258 const IccColorProfile *p = dynamic_cast<const IccColorProfile *>(profile);
259 return (p && p->asLcms()->colorSpaceSignature() == colorSpaceSignature());
260 }
const KoColorProfile * profile() const override

References KoLcmsInfo::colorSpaceSignature(), p, and LcmsColorSpace< _CSTraits >::profile().

◆ toQColor()

template<class _CSTraits >
void LcmsColorSpace< _CSTraits >::toQColor ( const quint8 * src,
QColor * c ) const
inlineoverridevirtual

The toQColor methods take a byte array that is at least pixelSize() long and converts the contents to a QColor, using the given profile as a source profile and the optional profile as a destination profile.

Parameters
srca pointer to the source pixel
cthe QColor that will be filled with the color at src

Implements KoColorSpace.

Definition at line 277 of file LcmsColorSpace.h.

278 {
279 std::array<quint8, 3> qcolordata;
280
281 // Default sRGB transform
283 cmsDoTransform(d->defaultTransformations->toRGB, src, qcolordata.data(), 1);
284
285 color->setRgb(qcolordata[2], qcolordata[1], qcolordata[0]);
286 color->setAlpha(this->opacityU8(src));
287 }

References LcmsColorSpace< _CSTraits >::d, LcmsColorSpace< _CSTraits >::Private::defaultTransformations, KIS_ASSERT, KoColorSpaceAbstract< _CSTraits >::opacityU8(), and KoLcmsDefaultTransformations::toRGB.

◆ toQColor16()

template<class _CSTraits >
void LcmsColorSpace< _CSTraits >::toQColor16 ( const quint8 * src,
QColor * c ) const
inlineoverridevirtual

By default this does the same as toQColor

Reimplemented from KoColorSpaceAbstract< _CSTraits >.

Definition at line 289 of file LcmsColorSpace.h.

290 {
291 std::array<quint16, 3> qcolordata;
292
293 // Default sRGB transform
295 cmsDoTransform(d->defaultTransformations->toRGB16, src, qcolordata.data(), 1);
296
297 color->setRgba64(QRgba64::fromRgba64(qcolordata[2], qcolordata[1], qcolordata[0], 0x0000));
298 color->setAlpha(this->opacityU8(src));
299 }

References LcmsColorSpace< _CSTraits >::d, LcmsColorSpace< _CSTraits >::Private::defaultTransformations, KoColorSpaceAbstract< _CSTraits >::opacityU8(), and KoLcmsDefaultTransformations::toRGB16.

Member Data Documentation

◆ d

template<class _CSTraits >
Private* const LcmsColorSpace< _CSTraits >::d
private

Definition at line 453 of file LcmsColorSpace.h.


The documentation for this class was generated from the following file: