Krita Source Code Documentation
Loading...
Searching...
No Matches
KisDisplayColorConverter Class Reference

#include <kis_display_color_converter.h>

+ Inheritance diagram for KisDisplayColorConverter:

Classes

struct  Private
 

Public Types

using ConversionOptions = std::pair<KoColorConversionTransformation::Intent, KoColorConversionTransformation::ConversionFlags>
 

Signals

void displayConfigurationChanged ()
 

Public Member Functions

KoColor applyDisplayFiltering (const KoColor &srcColor, const KoID &bitDepthId) const
 
void applyDisplayFilteringF32 (KisFixedPaintDeviceSP device, const KoColorSpace *dstColorSpace) const
 
KoColor approximateFromRenderedQColor (const QColor &c) const
 
bool canSkipDisplayConversion (const KoColorSpace *cs) const
 
ConversionOptions conversionOptions () const
 
QColor convertColorToDisplayColorSpace (const KoColor color, bool applyOcio=false) const
 convertColorToDisplayColorSpace This applies displayfiltering to the given KoColor, and then funnels the resulting data into a QColor for display. This function is used to draw canvas decorations into the canvas colorspace, as required for proper HDR and wide gamut support.
 
QImage convertImageToDisplayColorSpace (KisPaintDeviceSP srcDevice, QRect source=QRect(), bool applyOcio=false) const
 convertImageToDisplayColorSpace Same as convertColorToDisplayColorSpace, but then for a KisPaintDevice.
 
KisDisplayConfig displayConfig () const
 
QSharedPointer< KisDisplayFilterdisplayFilter () const
 
KoColorDisplayRendererInterfacedisplayRendererInterface () const
 
KoColor fromHsiF (qreal h, qreal s, qreal i)
 
KoColor fromHslF (qreal h, qreal s, qreal l, qreal a=1.0)
 
KoColor fromHsv (int h, int s, int v, int a=255) const
 
KoColor fromHsvF (qreal h, qreal s, qreal v, qreal a=1.0)
 
KoColor fromHsyF (qreal h, qreal s, qreal y, qreal R=0.2126, qreal G=0.7152, qreal B=0.0722, qreal gamma=2.2)
 
void getHsiF (const KoColor &srcColor, qreal *h, qreal *s, qreal *i)
 
void getHslF (const KoColor &srcColor, qreal *h, qreal *s, qreal *l, qreal *a=0)
 
void getHsv (const KoColor &srcColor, int *h, int *s, int *v, int *a=0) const
 
void getHsvF (const KoColor &srcColor, qreal *h, qreal *s, qreal *v, qreal *a=0)
 
void getHsyF (const KoColor &srcColor, qreal *h, qreal *s, qreal *y, qreal R=0.2126, qreal G=0.7152, qreal B=0.0722, qreal gamma=2.2)
 
KisHandlePalette handlePaletteForDisplayColorSpace () const
 handlePaletteForDisplayColorSpace
 
 KisDisplayColorConverter ()
 
 KisDisplayColorConverter (KoCanvasResourceProvider *resourceManager, QObject *parent, bool reactOnThemeChange=true)
 
KisMultiSurfaceDisplayConfig multiSurfaceDisplayConfig () const
 
const KoColorSpacenodeColorSpace () const
 
const KoColorSpacepaintingColorSpace () const
 
void setDisplayFilter (QSharedPointer< KisDisplayFilter > displayFilter)
 
void setImage (KisImageSP image)
 
void setImageColorSpace (const KoColorSpace *cs)
 
void setMultiSurfaceDisplayConfig (const KisMultiSurfaceDisplayConfig &config)
 
QPalette systemPaletteForDisplayColorSpace () const
 systemPaletteForDisplayColorSpace
 
QColor toQColor (const KoColor &c, bool proofToPaintColors=false) const
 
QImage toQImage (const KoColorSpace *srcColorSpace, const quint8 *data, QSize size, bool proofPaintColors=false) const
 
QImage toQImage (KisPaintDeviceSP srcDevice, bool proofPaintColors=false) const
 
 ~KisDisplayColorConverter () override
 

Static Public Member Functions

static KisDisplayColorConverterdumbConverterInstance ()
 

Private Member Functions

template<class Policy >
Policy::Result convertToDisplayImpl (const KoColor &srcColor, bool alreadyInDestinationF32=false) const
 
 Q_PRIVATE_SLOT (m_d, void selectPaintingColorSpace())
 
 Q_PRIVATE_SLOT (m_d, void slotCanvasResourceChanged(int key, const QVariant &v))
 
 Q_PRIVATE_SLOT (m_d, void slotUpdateCurrentNodeColorSpace())
 
KoColor toKoColor (const QColor &c)
 
Q_SLOT void updatePalettes ()
 

Private Attributes

const QScopedPointer< Privatem_d
 

Detailed Description

Special helper class that provides primitives for converting colors when displaying. We have at least 3 color spaces:

1) Image color space (any: RGB, CMYK, Lab, etc) 2) Display color space (a limited RGB color space) 3) Color selectors color space (the one where color selectors generate their HSV-based colors. Right now it is sRGB.

KoColor may be in any of these color spaces. QColor should always be in the display color space only.

Definition at line 39 of file kis_display_color_converter.h.

Member Typedef Documentation

◆ ConversionOptions

using KisDisplayColorConverter::ConversionOptions = std::pair<KoColorConversionTransformation::Intent, KoColorConversionTransformation::ConversionFlags>

Definition at line 133 of file kis_display_color_converter.h.

Constructor & Destructor Documentation

◆ KisDisplayColorConverter() [1/2]

KisDisplayColorConverter::KisDisplayColorConverter ( )

Definition at line 281 of file kis_display_color_converter.cpp.

282 : m_d(new Private(this, 0))
283{
285
286 m_d->inputImageProfile = KoColorSpaceRegistry::instance()->p709SRGBProfile();
287 m_d->paintingColorSpace = KoColorSpaceRegistry::instance()->rgb8();
288
289 m_d->setCurrentNode(0);
290}
const QScopedPointer< Private > m_d
void setDisplayFilter(QSharedPointer< KisDisplayFilter > displayFilter)
static KoColorSpaceRegistry * instance()
const KoColorProfile * p709SRGBProfile() const
const KoColorSpace * rgb8(const QString &profileName=QString())

References KoColorSpaceRegistry::instance(), m_d, KoColorSpaceRegistry::p709SRGBProfile(), KoColorSpaceRegistry::rgb8(), and setDisplayFilter().

◆ KisDisplayColorConverter() [2/2]

KisDisplayColorConverter::KisDisplayColorConverter ( KoCanvasResourceProvider * resourceManager,
QObject * parent,
bool reactOnThemeChange = true )

Definition at line 261 of file kis_display_color_converter.cpp.

262 : QObject(parent),
263 m_d(new Private(this, resourceManager))
264{
265 connect(m_d->resourceManager, SIGNAL(canvasResourceChanged(int,QVariant)),
266 SLOT(slotCanvasResourceChanged(int,QVariant)));
267 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()),
268 SLOT(selectPaintingColorSpace()));
269
270 m_d->inputImageProfile = KoColorSpaceRegistry::instance()->p709SRGBProfile();
271 m_d->paintingColorSpace = KoColorSpaceRegistry::instance()->rgb8();
272 m_d->setCurrentNode(0);
275 connect(this, SIGNAL(displayConfigurationChanged()), this, SLOT(updatePalettes()));
276
277 if(reactOnThemeChange)
278 connect(KisPart::instance()->currentMainwindow(), SIGNAL(themeChanged()), this, SLOT(updatePalettes()));
279}
static KisConfigNotifier * instance()
static KisPart * instance()
Definition KisPart.cpp:130

References displayConfigurationChanged(), KisConfigNotifier::instance(), KoColorSpaceRegistry::instance(), KisPart::instance(), m_d, KoColorSpaceRegistry::p709SRGBProfile(), KoColorSpaceRegistry::rgb8(), setDisplayFilter(), and updatePalettes().

◆ ~KisDisplayColorConverter()

KisDisplayColorConverter::~KisDisplayColorConverter ( )
override

Definition at line 292 of file kis_display_color_converter.cpp.

293{
294}

Member Function Documentation

◆ applyDisplayFiltering()

KoColor KisDisplayColorConverter::applyDisplayFiltering ( const KoColor & srcColor,
const KoID & bitDepthId ) const

Definition at line 564 of file kis_display_color_converter.cpp.

566{
567 KoColor c(srcColor);
568
569 if (m_d->useOcio()) {
570 KIS_ASSERT_RECOVER(m_d->ocioInputColorSpace()->pixelSize() == 16) {
571 return srcColor;
572 }
573
574 c.convertTo(m_d->ocioInputColorSpace());
575 m_d->displayFilter->filter(c.data(), 1);
576 c.setProfile(m_d->ocioOutputProfile());
577 }
578
579 c.convertTo(m_d->openGLSurfaceColorSpace(bitDepthId), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
580 return c;
581}
void convertTo(const KoColorSpace *cs, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
Definition KoColor.cpp:136
#define KIS_ASSERT_RECOVER(cond)
Definition kis_assert.h:55

References KoColor::convertTo(), KoColor::data(), KIS_ASSERT_RECOVER, m_d, and KoColor::setProfile().

◆ applyDisplayFilteringF32()

void KisDisplayColorConverter::applyDisplayFilteringF32 ( KisFixedPaintDeviceSP device,
const KoColorSpace * dstColorSpace ) const

Apply display filtering and convert device into dstColorSpace on exiting the function. The conversion can actually change the bit-depth of the device if necessary

This method is optimized for the case when device is already in 32f version of the painting color space.

Definition at line 684 of file kis_display_color_converter.cpp.

686{
694 KIS_SAFE_ASSERT_RECOVER_RETURN(device->bounds().isValid());
695
696 if (m_d->useOcio()) {
697 KIS_ASSERT_RECOVER_RETURN(m_d->ocioInputColorSpace()->pixelSize() == 16);
698
699 device->convertTo(m_d->ocioInputColorSpace());
700 m_d->displayFilter->filter(device->data(), device->bounds().width() * device->bounds().height());
701 device->setProfile(m_d->ocioOutputProfile());
702 }
703
704 KIS_SAFE_ASSERT_RECOVER_RETURN(dstColorSpace);
705 device->convertTo(dstColorSpace);
706}
const KoID Float32BitsColorDepthID("F32", ki18n("32-bit float/channel"))
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
void setProfile(const KoColorProfile *profile)
void convertTo(const KoColorSpace *dstColorSpace=0, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags())
const KoColorSpace * colorSpace() const
virtual KoID colorModelId() const =0
virtual KoID colorDepthId() const =0
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75

References KisFixedPaintDevice::bounds(), KoColorSpace::colorDepthId(), KoColorSpace::colorModelId(), KisFixedPaintDevice::colorSpace(), KisFixedPaintDevice::convertTo(), KisFixedPaintDevice::data(), Float32BitsColorDepthID, KIS_ASSERT_RECOVER_RETURN, KIS_SAFE_ASSERT_RECOVER_RETURN, m_d, RGBAColorModelID, and KisFixedPaintDevice::setProfile().

◆ approximateFromRenderedQColor()

KoColor KisDisplayColorConverter::approximateFromRenderedQColor ( const QColor & c) const

Definition at line 595 of file kis_display_color_converter.cpp.

596{
597 return m_d->approximateFromQColor(c);
598}

References m_d.

◆ canSkipDisplayConversion()

bool KisDisplayColorConverter::canSkipDisplayConversion ( const KoColorSpace * cs) const

Definition at line 583 of file kis_display_color_converter.cpp.

584{
585 const KoColorProfile *displayProfile = m_d->openGLSurfaceProfile();
586
587 return !m_d->useOcio() &&
589 (!!cs->profile() == !!displayProfile) &&
590 (!cs->profile() ||
591 cs->profile()->uniqueId() == displayProfile->uniqueId());
592}
virtual const KoColorProfile * profile() const =0
virtual QByteArray uniqueId() const =0

References KoColorSpace::colorModelId(), m_d, KoColorSpace::profile(), RGBAColorModelID, and KoColorProfile::uniqueId().

◆ conversionOptions()

KisDisplayColorConverter::ConversionOptions KisDisplayColorConverter::conversionOptions ( ) const

Definition at line 531 of file kis_display_color_converter.cpp.

532{
533 return m_d->multiSurfaceDisplayConfig.options();
534}

References m_d.

◆ convertColorToDisplayColorSpace()

QColor KisDisplayColorConverter::convertColorToDisplayColorSpace ( const KoColor color,
bool applyOcio = false ) const

convertColorToDisplayColorSpace This applies displayfiltering to the given KoColor, and then funnels the resulting data into a QColor for display. This function is used to draw canvas decorations into the canvas colorspace, as required for proper HDR and wide gamut support.

Parameters
colorthe KoColor to convert.
applyOciowhether to also apply OCIO. This is only really relevant for color pickers.
Returns
a QColor in the display color space.

No idea why it wouldn't be RGBAColorModelID, but do something useful in any case...

Definition at line 708 of file kis_display_color_converter.cpp.

709{
710 KoColor newColor;
711 if (applyOcio) {
713 } else {
714 newColor = KoColor(color);
715 newColor.convertTo(m_d->openGLSurfaceColorSpace(Float32BitsColorDepthID), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
716 }
717
720
722 newColor.colorSpace()->normalisedChannelsValue(newColor.data(), norm);
723
724 // sort into RGBA order... maybe a little overengineered.
725 QVector<float> sorted = norm;
726 for (int ch = 0; ch < norm.size(); ch++) {
727 const KoChannelInfo *info = newColor.colorSpace()->channels().at(ch);
728 sorted[info->displayPosition()] = norm[ch];
729 }
730
731 // We need to manually create a QColor here, because if we use KoColor.toQColor, the whole KoColor is first
732 // converted to sRGB before becoming a QColor, while we explicitely do not want that for our QColor.
733 // This is further complicated by the fact that QColors cannot have any (Q)ColorSpace metadata associated with it, unlike KoColor.
734 return QColor::fromRgbF(sorted[0], sorted[1], sorted[2], sorted[3]);
735}
KoColor applyDisplayFiltering(const KoColor &srcColor, const KoID &bitDepthId) const
qint32 displayPosition() const
QList< KoChannelInfo * > channels
virtual quint32 channelCount() const =0
virtual void normalisedChannelsValue(const quint8 *pixel, QVector< float > &channels) const =0
quint8 * data()
Definition KoColor.h:144
const KoColorSpace * colorSpace() const
return the current colorSpace
Definition KoColor.h:82
void toQColor(QColor *c) const
a convenience method for the above.
Definition KoColor.cpp:198
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
qreal norm(const T &a)

References applyDisplayFiltering(), KoColorSpace::channelCount(), KoColorSpace::channels, KoColorSpace::colorModelId(), KoColor::colorSpace(), KoColor::convertTo(), KoColor::data(), KoChannelInfo::displayPosition(), Float32BitsColorDepthID, KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, m_d, KoColorSpace::normalisedChannelsValue(), RGBAColorModelID, and KoColor::toQColor().

◆ convertImageToDisplayColorSpace()

QImage KisDisplayColorConverter::convertImageToDisplayColorSpace ( KisPaintDeviceSP srcDevice,
QRect source = QRect(),
bool applyOcio = false ) const

convertImageToDisplayColorSpace Same as convertColorToDisplayColorSpace, but then for a KisPaintDevice.

Parameters
srcDevice– src device to process.
source– source rect.
applyOcio– whether to also apply OCIO. Only useful for previews and not UI elements.
Returns
a QImage in the display color space.

Definition at line 737 of file kis_display_color_converter.cpp.

738{
739 KisPaintDeviceSP conversionDevice = new KisPaintDevice(*srcDevice.data());
740 const QRect s = source.isValid()? source: conversionDevice->exactBounds();
741
742 if (m_d->useOcio() && applyOcio) {
743 KIS_ASSERT_RECOVER(m_d->ocioInputColorSpace()->pixelSize() == 16) {
744 return QImage();
745 }
746
747 conversionDevice->convertTo(m_d->ocioInputColorSpace());
748 KisSequentialIterator it(conversionDevice, s);
749 int numConseqPixels = it.nConseqPixels();
750 while (it.nextPixels(numConseqPixels)) {
751 numConseqPixels = it.nConseqPixels();
752 m_d->displayFilter->filter(it.rawData(), numConseqPixels);
753 }
754 conversionDevice->setProfile(m_d->ocioOutputProfile(), 0);
755 }
756
757 conversionDevice->convertTo(m_d->openGLSurfaceColorSpace(Float32BitsColorDepthID), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
758 return conversionDevice->convertToQImage(m_d->openGLSurfaceProfile(), s, m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
759}
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
QRect exactBounds() const
QImage convertToQImage(const KoColorProfile *dstProfile, qint32 x, qint32 y, qint32 w, qint32 h, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) const
bool setProfile(const KoColorProfile *profile, KUndo2Command *parentCommand)
void convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)

References KisPaintDevice::convertTo(), KisPaintDevice::convertToQImage(), KisSharedPtr< T >::data(), KisPaintDevice::exactBounds(), Float32BitsColorDepthID, KIS_ASSERT_RECOVER, m_d, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nConseqPixels(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixels(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), KisPaintDevice::setProfile(), and source().

◆ convertToDisplayImpl()

template<class Policy >
Policy::Result KisDisplayColorConverter::convertToDisplayImpl ( const KoColor & srcColor,
bool alreadyInDestinationF32 = false ) const
private

◆ displayConfig()

KisDisplayConfig KisDisplayColorConverter::displayConfig ( ) const

Definition at line 516 of file kis_display_color_converter.cpp.

517{
518 return m_d->multiSurfaceDisplayConfig.uiDisplayConfig();
519}

References m_d.

◆ displayConfigurationChanged

void KisDisplayColorConverter::displayConfigurationChanged ( )
signal

◆ displayFilter()

QSharedPointer< KisDisplayFilter > KisDisplayColorConverter::displayFilter ( ) const

Definition at line 521 of file kis_display_color_converter.cpp.

522{
523 return m_d->displayFilter;
524}

References m_d.

◆ displayRendererInterface()

KoColorDisplayRendererInterface * KisDisplayColorConverter::displayRendererInterface ( ) const

Definition at line 312 of file kis_display_color_converter.cpp.

313{
314 return m_d->displayRenderer.data();
315}

References m_d.

◆ dumbConverterInstance()

KisDisplayColorConverter * KisDisplayColorConverter::dumbConverterInstance ( )
static

Definition at line 307 of file kis_display_color_converter.cpp.

308{
309 return s_instance;
310}

◆ fromHsiF()

KoColor KisDisplayColorConverter::fromHsiF ( qreal h,
qreal s,
qreal i )

Definition at line 880 of file kis_display_color_converter.cpp.

881{
882 // generate HSI from sRGB!
883 qreal r=0.0;
884 qreal g=0.0;
885 qreal b=0.0;
886 qreal a=1.0;
887 HSIToRGB(h, s, i, &r, &g, &b);
888 QColor qcolor;
889 qcolor.setRgbF(qBound(0.0,r,1.0), qBound(0.0,g,1.0), qBound(0.0,b,1.0), a);
890 return m_d->approximateFromQColor(qcolor);
891}
void HSIToRGB(const qreal h, const qreal s, const qreal i, qreal *red, qreal *green, qreal *blue)

References HSIToRGB(), and m_d.

◆ fromHslF()

KoColor KisDisplayColorConverter::fromHslF ( qreal h,
qreal s,
qreal l,
qreal a = 1.0 )

Definition at line 844 of file kis_display_color_converter.cpp.

845{
846 // generate HSL from sRGB!
847 QColor qcolor(QColor::fromHslF(h, s, l, a));
848 if (!qcolor.isValid()) {
849 warnKrita << "Could not construct valid color from h" << h << "s" << s << "l" << l << "a" << a;
850 qcolor = Qt::black;
851 }
852 return m_d->approximateFromQColor(qcolor);
853
854}
#define warnKrita
Definition kis_debug.h:91

References m_d, and warnKrita.

◆ fromHsv()

KoColor KisDisplayColorConverter::fromHsv ( int h,
int s,
int v,
int a = 255 ) const

Definition at line 799 of file kis_display_color_converter.cpp.

800{
801 // generate HSV from sRGB!
802 QColor qcolor(QColor::fromHsv(h, s, v, a));
803 return m_d->approximateFromQColor(qcolor);
804}
qreal v

References m_d, and v.

◆ fromHsvF()

KoColor KisDisplayColorConverter::fromHsvF ( qreal h,
qreal s,
qreal v,
qreal a = 1.0 )

Definition at line 813 of file kis_display_color_converter.cpp.

814{
815 // generate HSV from sRGB!
816 QColor qcolor(QColor::fromHsvF(h, s, v, a));
817 return m_d->approximateFromQColor(qcolor);
818}

References m_d, and v.

◆ fromHsyF()

KoColor KisDisplayColorConverter::fromHsyF ( qreal h,
qreal s,
qreal y,
qreal R = 0.2126,
qreal G = 0.7152,
qreal B = 0.0722,
qreal gamma = 2.2 )

Definition at line 903 of file kis_display_color_converter.cpp.

904{
905 // generate HSL from sRGB!
906 QVector <qreal> channelValues(3);
907 y = pow(y, gamma);
908 HSYToRGB(h, s, y, &channelValues[0], &channelValues[1], &channelValues[2], R, G, B);
910 QColor qcolor;
911 qcolor.setRgbF(qBound(0.0,channelValues[0],1.0), qBound(0.0,channelValues[1],1.0), qBound(0.0,channelValues[2],1.0), 1.0);
912 return m_d->approximateFromQColor(qcolor);
913}
Eigen::Matrix< double, 4, 2 > R
void HSYToRGB(const qreal h, const qreal s, const qreal y, qreal *red, qreal *green, qreal *blue, qreal R, qreal G, qreal B)
virtual void delinearizeFloatValueFast(QVector< qreal > &Value) const =0

References B, KoColorProfile::delinearizeFloatValueFast(), G, HSYToRGB(), KoColorSpaceRegistry::instance(), m_d, KoColorSpace::profile(), R, and KoColorSpaceRegistry::rgb8().

◆ getHsiF()

void KisDisplayColorConverter::getHsiF ( const KoColor & srcColor,
qreal * h,
qreal * s,
qreal * i )

Definition at line 893 of file kis_display_color_converter.cpp.

894{
895 // we are going through sRGB here!
896 QColor color = m_d->approximateToQColor(srcColor);
897 qreal r=color.redF();
898 qreal g=color.greenF();
899 qreal b=color.blueF();
900 RGBToHSI(r, g, b, h, s, i);
901}
void RGBToHSI(qreal r, qreal g, qreal b, qreal *h, qreal *s, qreal *i)

References m_d, and RGBToHSI().

◆ getHslF()

void KisDisplayColorConverter::getHslF ( const KoColor & srcColor,
qreal * h,
qreal * s,
qreal * l,
qreal * a = 0 )

Definition at line 856 of file kis_display_color_converter.cpp.

857{
858 // we are going through sRGB here!
859 QColor color = m_d->approximateToQColor(srcColor);
860#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
861 color.getHslF(h, s, l, a);
862#else
863 float fH, fS, fL, fA;
864 fH = *h;
865 fS = *s;
866 fL = *l;
867 if (a) {
868 fA = *a;
869 }
870 color.getHslF(&fH, &fS, &fL, &fA);
871 *h = fH;
872 *s = fS;
873 *l = fL;
874 if (a) {
875 *a = fA;
876 }
877#endif
878}

References m_d.

◆ getHsv()

void KisDisplayColorConverter::getHsv ( const KoColor & srcColor,
int * h,
int * s,
int * v,
int * a = 0 ) const

Definition at line 806 of file kis_display_color_converter.cpp.

807{
808 // we are going through sRGB here!
809 QColor color = m_d->approximateToQColor(srcColor);
810 color.getHsv(h, s, v, a);
811}

References m_d, and v.

◆ getHsvF()

void KisDisplayColorConverter::getHsvF ( const KoColor & srcColor,
qreal * h,
qreal * s,
qreal * v,
qreal * a = 0 )

Definition at line 820 of file kis_display_color_converter.cpp.

821{
822 // we are going through sRGB here!
823 QColor color = m_d->approximateToQColor(srcColor);
824#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
825 color.getHsvF(h, s, v, a);
826#else
827 float fH, fS, fV, fA;
828 fH = *h;
829 fS = *s;
830 fV = *v;
831 if (a) {
832 fA = *a;
833 }
834 color.getHsvF(&fH, &fS, &fV, &fA);
835 *h = fH;
836 *s = fS;
837 *v = fV;
838 if (a) {
839 *a = fA;
840 }
841#endif
842}

References m_d, and v.

◆ getHsyF()

void KisDisplayColorConverter::getHsyF ( const KoColor & srcColor,
qreal * h,
qreal * s,
qreal * y,
qreal R = 0.2126,
qreal G = 0.7152,
qreal B = 0.0722,
qreal gamma = 2.2 )

Definition at line 915 of file kis_display_color_converter.cpp.

916{
917 // we are going through sRGB here!
918 QColor color = m_d->approximateToQColor(srcColor);
919 QVector <qreal> channelValues(3);
920 channelValues[0]=color.redF();
921 channelValues[1]=color.greenF();
922 channelValues[2]=color.blueF();
923 //TODO: if we're going to have KoColor here, remember to check whether the TRC of the profile exists...
925 RGBToHSY(channelValues[0], channelValues[1], channelValues[2], h, s, y, R, G, B);
926 *y = pow(*y, 1/gamma);
927}
void RGBToHSY(const qreal r, const qreal g, const qreal b, qreal *h, qreal *s, qreal *y, qreal R, qreal G, qreal B)
virtual void linearizeFloatValueFast(QVector< qreal > &Value) const =0

References B, G, KoColorSpaceRegistry::instance(), KoColorProfile::linearizeFloatValueFast(), m_d, KoColorSpace::profile(), R, KoColorSpaceRegistry::rgb8(), and RGBToHSY().

◆ handlePaletteForDisplayColorSpace()

KisHandlePalette KisDisplayColorConverter::handlePaletteForDisplayColorSpace ( ) const

handlePaletteForDisplayColorSpace

Returns
KisHandlePalette suitable to draw canvas decorations with.

Definition at line 761 of file kis_display_color_converter.cpp.

762{
763 return m_d->handlePalette;
764}

References m_d.

◆ multiSurfaceDisplayConfig()

KisMultiSurfaceDisplayConfig KisDisplayColorConverter::multiSurfaceDisplayConfig ( ) const

Definition at line 526 of file kis_display_color_converter.cpp.

527{
528 return m_d->multiSurfaceDisplayConfig;
529}

References m_d.

◆ nodeColorSpace()

const KoColorSpace * KisDisplayColorConverter::nodeColorSpace ( ) const

Definition at line 474 of file kis_display_color_converter.cpp.

475{
476 return m_d->nodeColorSpace;
477}

References m_d.

◆ paintingColorSpace()

const KoColorSpace * KisDisplayColorConverter::paintingColorSpace ( ) const

Definition at line 465 of file kis_display_color_converter.cpp.

466{
467 KIS_SAFE_ASSERT_RECOVER(m_d->paintingColorSpace) {
469 }
470
471 return m_d->paintingColorSpace;
472}
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126

References KoColorSpaceRegistry::instance(), KIS_SAFE_ASSERT_RECOVER, m_d, and KoColorSpaceRegistry::rgb8().

◆ Q_PRIVATE_SLOT() [1/3]

KisDisplayColorConverter::Q_PRIVATE_SLOT ( m_d ,
void selectPaintingColorSpace() )
private

◆ Q_PRIVATE_SLOT() [2/3]

KisDisplayColorConverter::Q_PRIVATE_SLOT ( m_d ,
void slotCanvasResourceChangedint key, const QVariant &v )
private

◆ Q_PRIVATE_SLOT() [3/3]

KisDisplayColorConverter::Q_PRIVATE_SLOT ( m_d ,
void slotUpdateCurrentNodeColorSpace() )
private

◆ setDisplayFilter()

void KisDisplayColorConverter::setDisplayFilter ( QSharedPointer< KisDisplayFilter > displayFilter)

Definition at line 489 of file kis_display_color_converter.cpp.

490{
491 if (m_d->displayFilter && displayFilter &&
492 displayFilter->lockCurrentColorVisualRepresentation()) {
493
494 KoColor color(m_d->intermediateFgColor);
495 displayFilter->approximateInverseTransformation(color.data(), 1);
496 color.convertTo(m_d->paintingColorSpace);
497 m_d->resourceManager->setForegroundColor(color);
498 }
499
500 m_d->displayFilter = displayFilter;
501
502 if (m_d->displayFilter) {
503 m_d->updateIntermediateFgColor(
504 m_d->resourceManager->foregroundColor());
505 }
506
507
508 { // sanity check
509 // KisConfig cfg;
510 // KIS_ASSERT_RECOVER_NOOP(cfg.useOcio() == (bool) m_d->displayFilter);
511 }
512
513 m_d->selectPaintingColorSpace();
514}
QSharedPointer< KisDisplayFilter > displayFilter() const

References KoColor::convertTo(), KoColor::data(), displayFilter(), and m_d.

◆ setImage()

void KisDisplayColorConverter::setImage ( KisImageSP image)

◆ setImageColorSpace()

void KisDisplayColorConverter::setImageColorSpace ( const KoColorSpace * cs)

Definition at line 296 of file kis_display_color_converter.cpp.

297{
298 m_d->inputImageProfile =
300 cs->profile() :
302
303 m_d->notifyDisplayConfigurationChanged();
304}

References KoColorSpace::colorModelId(), KoColorSpaceRegistry::instance(), m_d, KoColorSpaceRegistry::p709SRGBProfile(), KoColorSpace::profile(), and RGBAColorModelID.

◆ setMultiSurfaceDisplayConfig()

void KisDisplayColorConverter::setMultiSurfaceDisplayConfig ( const KisMultiSurfaceDisplayConfig & config)

Definition at line 479 of file kis_display_color_converter.cpp.

480{
481 if (m_d->multiSurfaceDisplayConfig == config) return;
482
483
484
485 m_d->multiSurfaceDisplayConfig = config;
486 m_d->notifyDisplayConfigurationChanged();
487}

References m_d.

◆ systemPaletteForDisplayColorSpace()

QPalette KisDisplayColorConverter::systemPaletteForDisplayColorSpace ( ) const

systemPaletteForDisplayColorSpace

Returns
QPalette suitable to draw canvas decorations with.

Definition at line 766 of file kis_display_color_converter.cpp.

767{
768 return m_d->systemPalette;
769}

References m_d.

◆ toKoColor()

KoColor KisDisplayColorConverter::toKoColor ( const QColor & c)
private

◆ toQColor()

QColor KisDisplayColorConverter::toQColor ( const KoColor & c,
bool proofToPaintColors = false ) const

Definition at line 536 of file kis_display_color_converter.cpp.

537{
538 KoColor c(srcColor);
539
540 if (proofToPaintColors && m_d->needsColorProofing(c.colorSpace())) {
541 c.convertTo(m_d->paintingColorSpace, m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
542 }
543
544 if (m_d->useOcio()) {
545 KIS_ASSERT_RECOVER(m_d->ocioInputColorSpace()->pixelSize() == 16) {
546 return QColor(Qt::green);
547 }
548
549 c.convertTo(m_d->ocioInputColorSpace());
550 m_d->displayFilter->filter(c.data(), 1);
551 c.setProfile(m_d->ocioOutputProfile());
552 }
553
554 // we expect the display profile is rgb8, which is BGRA here
555 KIS_ASSERT_RECOVER(m_d->qtWidgetsColorSpace()->pixelSize() == 4) {
556 return QColor(Qt::red);
557 }
558
559 c.convertTo(m_d->qtWidgetsColorSpace(), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
560 const quint8 *p = c.data();
561 return QColor(p[2], p[1], p[0], p[3]);
562}
const Params2D p
void setProfile(const KoColorProfile *profile)
assign new profile without converting pixel data
Definition KoColor.cpp:177

References KoColor::colorSpace(), KoColor::convertTo(), KoColor::data(), KIS_ASSERT_RECOVER, m_d, p, and KoColor::setProfile().

◆ toQImage() [1/2]

QImage KisDisplayColorConverter::toQImage ( const KoColorSpace * srcColorSpace,
const quint8 * data,
QSize size,
bool proofPaintColors = false ) const

Definition at line 640 of file kis_display_color_converter.cpp.

641{
642 const int numPixels = size.width() * size.height();
643
644 const KoColorSpace *colorSpace = srcColorSpace;
645 const quint8 *pixels = data;
646
647 QScopedArrayPointer<quint8> proofBuffer;
648
649 if (proofPaintColors && m_d->needsColorProofing(srcColorSpace)) {
650 const int imageSize = numPixels * paintingColorSpace()->pixelSize();
651 proofBuffer.reset(new quint8[imageSize]);
652 colorSpace->convertPixelsTo(pixels, proofBuffer.data(),
654 numPixels,
655 m_d->multiSurfaceDisplayConfig.intent,
656 m_d->multiSurfaceDisplayConfig.conversionFlags);
657 colorSpace = paintingColorSpace();
658 pixels = proofBuffer.data();
659 }
660
661 QScopedArrayPointer<quint8> ocioBuffer;
662 if (m_d->useOcio()) {
663 const int imageSize = numPixels * m_d->ocioInputColorSpace()->pixelSize();
664 ocioBuffer.reset(new quint8[imageSize]);
665 colorSpace->convertPixelsTo(pixels, ocioBuffer.data(),
666 m_d->ocioInputColorSpace(),
667 numPixels,
668 m_d->multiSurfaceDisplayConfig.intent,
669 m_d->multiSurfaceDisplayConfig.conversionFlags);
670 m_d->displayFilter->filter(ocioBuffer.data(), numPixels);
671
672 return m_d->ocioOutputColorSpace()->convertToQImage(ocioBuffer.data(), size.width(), size.height(),
673 m_d->qtWidgetsProfile(),
674 m_d->multiSurfaceDisplayConfig.intent,
675 m_d->multiSurfaceDisplayConfig.conversionFlags);
676 }
677
678 return colorSpace->convertToQImage(pixels, size.width(), size.height(),
679 m_d->qtWidgetsProfile(),
680 m_d->multiSurfaceDisplayConfig.intent,
681 m_d->multiSurfaceDisplayConfig.conversionFlags);
682}
const KoColorSpace * paintingColorSpace() const
virtual quint32 pixelSize() const =0
virtual QImage convertToQImage(const quint8 *data, qint32 width, qint32 height, const KoColorProfile *dstProfile, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
virtual bool convertPixelsTo(const quint8 *src, quint8 *dst, const KoColorSpace *dstColorSpace, quint32 numPixels, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References KoColorSpace::convertPixelsTo(), KoColorSpace::convertToQImage(), m_d, paintingColorSpace(), and KoColorSpace::pixelSize().

◆ toQImage() [2/2]

QImage KisDisplayColorConverter::toQImage ( KisPaintDeviceSP srcDevice,
bool proofPaintColors = false ) const

Converts the exactBounds() (!) of the srcDevice into QImage properly rendered into display RGB space. Please note that the offset of the image in QImage is always zero for efficiency reasons.

Definition at line 600 of file kis_display_color_converter.cpp.

601{
602 KisPaintDeviceSP device = srcDevice;
603
604 QRect bounds = srcDevice->exactBounds();
605 if (bounds.isEmpty()) return QImage();
606
607 if (proofPaintColors && m_d->needsColorProofing(srcDevice->colorSpace())) {
608 srcDevice->convertTo(paintingColorSpace(), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
609 }
610
611 if (m_d->useOcio()) {
612 KIS_ASSERT_RECOVER(m_d->ocioInputColorSpace()->pixelSize() == 16) {
613 return QImage();
614 }
615
616 device = new KisPaintDevice(*srcDevice);
617 device->convertTo(m_d->ocioInputColorSpace());
618
619 KisSequentialIterator it(device, bounds);
620 int numConseqPixels = it.nConseqPixels();
621 while (it.nextPixels(numConseqPixels)) {
622 numConseqPixels = it.nConseqPixels();
623 m_d->displayFilter->filter(it.rawData(), numConseqPixels);
624 }
625
626 device->setProfile(m_d->ocioOutputProfile(), 0);
627 }
628
629 // we expect the display profile is rgb8, which is BGRA here
630 KIS_ASSERT_RECOVER(m_d->qtWidgetsColorSpace()->pixelSize() == 4) {
631 return QImage();
632 }
633
634 return device->convertToQImage(m_d->qtWidgetsProfile(),
635 bounds,
636 m_d->multiSurfaceDisplayConfig.intent,
637 m_d->multiSurfaceDisplayConfig.conversionFlags);
638}
const KoColorSpace * colorSpace() const
#define bounds(x, a, b)

References bounds, KisPaintDevice::colorSpace(), KisPaintDevice::convertTo(), KisPaintDevice::convertToQImage(), KisPaintDevice::exactBounds(), KIS_ASSERT_RECOVER, m_d, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nConseqPixels(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixels(), paintingColorSpace(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), and KisPaintDevice::setProfile().

◆ updatePalettes()

void KisDisplayColorConverter::updatePalettes ( )
private

Definition at line 371 of file kis_display_color_converter.cpp.

372{
373 KisHandlePalette palette;
374 KoColor c;
375 c.fromQColor(palette.gradientFillColor);
377
378 c.fromQColor(palette.highlightColor);
380
383
384 c.fromQColor(palette.primaryColor);
386
387 c.fromQColor(palette.secondaryColor);
389
390 c.fromQColor(palette.selectionColor);
392
393 c.fromQColor(palette.white);
395
396 c.fromQColor(palette.black);
398
399 QPalette pal = qApp->palette();
400 for (int r = 0; r < QPalette::NColorRoles; r++) {
401 for (int cg = 0; cg < QPalette::NColorGroups; cg++) {
402 c.fromQColor(pal.brush(QPalette::ColorGroup(cg), QPalette::ColorRole(r)).color());
403 pal.setBrush(QPalette::ColorGroup(cg), QPalette::ColorRole(r), convertColorToDisplayColorSpace(c));
404 }
405 }
406
407 m_d->handlePalette = palette;
408 m_d->systemPalette = pal;
409}
QColor convertColorToDisplayColorSpace(const KoColor color, bool applyOcio=false) const
convertColorToDisplayColorSpace This applies displayfiltering to the given KoColor,...
void fromQColor(const QColor &c)
Convenient function for converting from a QColor.
Definition KoColor.cpp:213
QColor highlightOutlineColor

References KisHandlePalette::black, convertColorToDisplayColorSpace(), KoColor::fromQColor(), KisHandlePalette::gradientFillColor, KisHandlePalette::highlightColor, KisHandlePalette::highlightOutlineColor, m_d, KisHandlePalette::primaryColor, KisHandlePalette::secondaryColor, KisHandlePalette::selectionColor, and KisHandlePalette::white.

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisDisplayColorConverter::m_d
private

Definition at line 154 of file kis_display_color_converter.h.


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