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)
 
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 279 of file kis_display_color_converter.cpp.

280 : m_d(new Private(this, 0))
281{
283
284 m_d->inputImageProfile = KoColorSpaceRegistry::instance()->p709SRGBProfile();
285 m_d->paintingColorSpace = KoColorSpaceRegistry::instance()->rgb8();
286
287 m_d->setCurrentNode(0);
288}
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 )

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 connect(KisPart::instance()->currentMainwindow(), SIGNAL(themeChanged()), this, SLOT(updatePalettes()));
277}
static KisConfigNotifier * instance()
static KisPart * instance()
Definition KisPart.cpp:131

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

◆ ~KisDisplayColorConverter()

KisDisplayColorConverter::~KisDisplayColorConverter ( )
override

Definition at line 290 of file kis_display_color_converter.cpp.

291{
292}

Member Function Documentation

◆ applyDisplayFiltering()

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

Definition at line 562 of file kis_display_color_converter.cpp.

564{
565 KoColor c(srcColor);
566
567 if (m_d->useOcio()) {
568 KIS_ASSERT_RECOVER(m_d->ocioInputColorSpace()->pixelSize() == 16) {
569 return srcColor;
570 }
571
572 c.convertTo(m_d->ocioInputColorSpace());
573 m_d->displayFilter->filter(c.data(), 1);
574 c.setProfile(m_d->ocioOutputProfile());
575 }
576
577 c.convertTo(m_d->openGLSurfaceColorSpace(bitDepthId), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
578 return c;
579}
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 682 of file kis_display_color_converter.cpp.

684{
692 KIS_SAFE_ASSERT_RECOVER_RETURN(device->bounds().isValid());
693
694 if (m_d->useOcio()) {
695 KIS_ASSERT_RECOVER_RETURN(m_d->ocioInputColorSpace()->pixelSize() == 16);
696
697 device->convertTo(m_d->ocioInputColorSpace());
698 m_d->displayFilter->filter(device->data(), device->bounds().width() * device->bounds().height());
699 device->setProfile(m_d->ocioOutputProfile());
700 }
701
702 KIS_SAFE_ASSERT_RECOVER_RETURN(dstColorSpace);
703 device->convertTo(dstColorSpace);
704}
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 593 of file kis_display_color_converter.cpp.

594{
595 return m_d->approximateFromQColor(c);
596}

References m_d.

◆ canSkipDisplayConversion()

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

Definition at line 581 of file kis_display_color_converter.cpp.

582{
583 const KoColorProfile *displayProfile = m_d->openGLSurfaceProfile();
584
585 return !m_d->useOcio() &&
587 (!!cs->profile() == !!displayProfile) &&
588 (!cs->profile() ||
589 cs->profile()->uniqueId() == displayProfile->uniqueId());
590}
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 529 of file kis_display_color_converter.cpp.

530{
531 return m_d->multiSurfaceDisplayConfig.options();
532}

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 706 of file kis_display_color_converter.cpp.

707{
708 KoColor newColor;
709 if (applyOcio) {
711 } else {
712 newColor = KoColor(color);
713 newColor.convertTo(m_d->openGLSurfaceColorSpace(Float32BitsColorDepthID), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
714 }
715
718
720 newColor.colorSpace()->normalisedChannelsValue(newColor.data(), norm);
721
722 // sort into RGBA order... maybe a little overengineered.
723 QVector<float> sorted = norm;
724 for (int ch = 0; ch < norm.size(); ch++) {
725 const KoChannelInfo *info = newColor.colorSpace()->channels().at(ch);
726 sorted[info->displayPosition()] = norm[ch];
727 }
728
729 // We need to manually create a QColor here, because if we use KoColor.toQColor, the whole KoColor is first
730 // converted to sRGB before becoming a QColor, while we explicitely do not want that for our QColor.
731 // This is further complicated by the fact that QColors cannot have any (Q)ColorSpace metadata associated with it, unlike KoColor.
732 return QColor::fromRgbF(sorted[0], sorted[1], sorted[2], sorted[3]);
733}
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 735 of file kis_display_color_converter.cpp.

736{
737 KisPaintDeviceSP conversionDevice = new KisPaintDevice(*srcDevice.data());
738 const QRect s = source.isValid()? source: conversionDevice->exactBounds();
739
740 if (m_d->useOcio() && applyOcio) {
741 KIS_ASSERT_RECOVER(m_d->ocioInputColorSpace()->pixelSize() == 16) {
742 return QImage();
743 }
744
745 conversionDevice->convertTo(m_d->ocioInputColorSpace());
746 KisSequentialIterator it(conversionDevice, s);
747 int numConseqPixels = it.nConseqPixels();
748 while (it.nextPixels(numConseqPixels)) {
749 numConseqPixels = it.nConseqPixels();
750 m_d->displayFilter->filter(it.rawData(), numConseqPixels);
751 }
752 conversionDevice->setProfile(m_d->ocioOutputProfile(), 0);
753 }
754
755 conversionDevice->convertTo(m_d->openGLSurfaceColorSpace(Float32BitsColorDepthID), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
756 return conversionDevice->convertToQImage(m_d->openGLSurfaceProfile(), s, m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
757}
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 514 of file kis_display_color_converter.cpp.

515{
516 return m_d->multiSurfaceDisplayConfig.uiDisplayConfig();
517}

References m_d.

◆ displayConfigurationChanged

void KisDisplayColorConverter::displayConfigurationChanged ( )
signal

◆ displayFilter()

QSharedPointer< KisDisplayFilter > KisDisplayColorConverter::displayFilter ( ) const

Definition at line 519 of file kis_display_color_converter.cpp.

520{
521 return m_d->displayFilter;
522}

References m_d.

◆ displayRendererInterface()

KoColorDisplayRendererInterface * KisDisplayColorConverter::displayRendererInterface ( ) const

Definition at line 310 of file kis_display_color_converter.cpp.

311{
312 return m_d->displayRenderer.data();
313}

References m_d.

◆ dumbConverterInstance()

KisDisplayColorConverter * KisDisplayColorConverter::dumbConverterInstance ( )
static

Definition at line 305 of file kis_display_color_converter.cpp.

306{
307 return s_instance;
308}

◆ fromHsiF()

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

Definition at line 878 of file kis_display_color_converter.cpp.

879{
880 // generate HSI from sRGB!
881 qreal r=0.0;
882 qreal g=0.0;
883 qreal b=0.0;
884 qreal a=1.0;
885 HSIToRGB(h, s, i, &r, &g, &b);
886 QColor qcolor;
887 qcolor.setRgbF(qBound(0.0,r,1.0), qBound(0.0,g,1.0), qBound(0.0,b,1.0), a);
888 return m_d->approximateFromQColor(qcolor);
889}
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 842 of file kis_display_color_converter.cpp.

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

References m_d, and warnKrita.

◆ fromHsv()

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

Definition at line 797 of file kis_display_color_converter.cpp.

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

References m_d, and v.

◆ fromHsvF()

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

Definition at line 811 of file kis_display_color_converter.cpp.

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

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 901 of file kis_display_color_converter.cpp.

902{
903 // generate HSL from sRGB!
904 QVector <qreal> channelValues(3);
905 y = pow(y, gamma);
906 HSYToRGB(h, s, y, &channelValues[0], &channelValues[1], &channelValues[2], R, G, B);
908 QColor qcolor;
909 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);
910 return m_d->approximateFromQColor(qcolor);
911}
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 891 of file kis_display_color_converter.cpp.

892{
893 // we are going through sRGB here!
894 QColor color = m_d->approximateToQColor(srcColor);
895 qreal r=color.redF();
896 qreal g=color.greenF();
897 qreal b=color.blueF();
898 RGBToHSI(r, g, b, h, s, i);
899}
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 854 of file kis_display_color_converter.cpp.

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

References m_d.

◆ getHsv()

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

Definition at line 804 of file kis_display_color_converter.cpp.

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

References m_d, and v.

◆ getHsvF()

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

Definition at line 818 of file kis_display_color_converter.cpp.

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

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 913 of file kis_display_color_converter.cpp.

914{
915 // we are going through sRGB here!
916 QColor color = m_d->approximateToQColor(srcColor);
917 QVector <qreal> channelValues(3);
918 channelValues[0]=color.redF();
919 channelValues[1]=color.greenF();
920 channelValues[2]=color.blueF();
921 //TODO: if we're going to have KoColor here, remember to check whether the TRC of the profile exists...
923 RGBToHSY(channelValues[0], channelValues[1], channelValues[2], h, s, y, R, G, B);
924 *y = pow(*y, 1/gamma);
925}
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 759 of file kis_display_color_converter.cpp.

760{
761 return m_d->handlePalette;
762}

References m_d.

◆ multiSurfaceDisplayConfig()

KisMultiSurfaceDisplayConfig KisDisplayColorConverter::multiSurfaceDisplayConfig ( ) const

Definition at line 524 of file kis_display_color_converter.cpp.

525{
526 return m_d->multiSurfaceDisplayConfig;
527}

References m_d.

◆ nodeColorSpace()

const KoColorSpace * KisDisplayColorConverter::nodeColorSpace ( ) const

Definition at line 472 of file kis_display_color_converter.cpp.

473{
474 return m_d->nodeColorSpace;
475}

References m_d.

◆ paintingColorSpace()

const KoColorSpace * KisDisplayColorConverter::paintingColorSpace ( ) const

Definition at line 463 of file kis_display_color_converter.cpp.

464{
465 KIS_SAFE_ASSERT_RECOVER(m_d->paintingColorSpace) {
467 }
468
469 return m_d->paintingColorSpace;
470}
#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 487 of file kis_display_color_converter.cpp.

488{
489 if (m_d->displayFilter && displayFilter &&
490 displayFilter->lockCurrentColorVisualRepresentation()) {
491
492 KoColor color(m_d->intermediateFgColor);
493 displayFilter->approximateInverseTransformation(color.data(), 1);
494 color.convertTo(m_d->paintingColorSpace);
495 m_d->resourceManager->setForegroundColor(color);
496 }
497
498 m_d->displayFilter = displayFilter;
499
500 if (m_d->displayFilter) {
501 m_d->updateIntermediateFgColor(
502 m_d->resourceManager->foregroundColor());
503 }
504
505
506 { // sanity check
507 // KisConfig cfg;
508 // KIS_ASSERT_RECOVER_NOOP(cfg.useOcio() == (bool) m_d->displayFilter);
509 }
510
511 m_d->selectPaintingColorSpace();
512}
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 294 of file kis_display_color_converter.cpp.

295{
296 m_d->inputImageProfile =
298 cs->profile() :
300
301 m_d->notifyDisplayConfigurationChanged();
302}

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

◆ setMultiSurfaceDisplayConfig()

void KisDisplayColorConverter::setMultiSurfaceDisplayConfig ( const KisMultiSurfaceDisplayConfig & config)

Definition at line 477 of file kis_display_color_converter.cpp.

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

References m_d.

◆ systemPaletteForDisplayColorSpace()

QPalette KisDisplayColorConverter::systemPaletteForDisplayColorSpace ( ) const

systemPaletteForDisplayColorSpace

Returns
QPalette suitable to draw canvas decorations with.

Definition at line 764 of file kis_display_color_converter.cpp.

765{
766 return m_d->systemPalette;
767}

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 534 of file kis_display_color_converter.cpp.

535{
536 KoColor c(srcColor);
537
538 if (proofToPaintColors && m_d->needsColorProofing(c.colorSpace())) {
539 c.convertTo(m_d->paintingColorSpace, m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
540 }
541
542 if (m_d->useOcio()) {
543 KIS_ASSERT_RECOVER(m_d->ocioInputColorSpace()->pixelSize() == 16) {
544 return QColor(Qt::green);
545 }
546
547 c.convertTo(m_d->ocioInputColorSpace());
548 m_d->displayFilter->filter(c.data(), 1);
549 c.setProfile(m_d->ocioOutputProfile());
550 }
551
552 // we expect the display profile is rgb8, which is BGRA here
553 KIS_ASSERT_RECOVER(m_d->qtWidgetsColorSpace()->pixelSize() == 4) {
554 return QColor(Qt::red);
555 }
556
557 c.convertTo(m_d->qtWidgetsColorSpace(), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
558 const quint8 *p = c.data();
559 return QColor(p[2], p[1], p[0], p[3]);
560}
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 638 of file kis_display_color_converter.cpp.

639{
640 const int numPixels = size.width() * size.height();
641
642 const KoColorSpace *colorSpace = srcColorSpace;
643 const quint8 *pixels = data;
644
645 QScopedArrayPointer<quint8> proofBuffer;
646
647 if (proofPaintColors && m_d->needsColorProofing(srcColorSpace)) {
648 const int imageSize = numPixels * paintingColorSpace()->pixelSize();
649 proofBuffer.reset(new quint8[imageSize]);
650 colorSpace->convertPixelsTo(pixels, proofBuffer.data(),
652 numPixels,
653 m_d->multiSurfaceDisplayConfig.intent,
654 m_d->multiSurfaceDisplayConfig.conversionFlags);
655 colorSpace = paintingColorSpace();
656 pixels = proofBuffer.data();
657 }
658
659 QScopedArrayPointer<quint8> ocioBuffer;
660 if (m_d->useOcio()) {
661 const int imageSize = numPixels * m_d->ocioInputColorSpace()->pixelSize();
662 ocioBuffer.reset(new quint8[imageSize]);
663 colorSpace->convertPixelsTo(pixels, ocioBuffer.data(),
664 m_d->ocioInputColorSpace(),
665 numPixels,
666 m_d->multiSurfaceDisplayConfig.intent,
667 m_d->multiSurfaceDisplayConfig.conversionFlags);
668 m_d->displayFilter->filter(ocioBuffer.data(), numPixels);
669
670 return m_d->ocioOutputColorSpace()->convertToQImage(ocioBuffer.data(), size.width(), size.height(),
671 m_d->qtWidgetsProfile(),
672 m_d->multiSurfaceDisplayConfig.intent,
673 m_d->multiSurfaceDisplayConfig.conversionFlags);
674 }
675
676 return colorSpace->convertToQImage(pixels, size.width(), size.height(),
677 m_d->qtWidgetsProfile(),
678 m_d->multiSurfaceDisplayConfig.intent,
679 m_d->multiSurfaceDisplayConfig.conversionFlags);
680}
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 598 of file kis_display_color_converter.cpp.

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

370{
372 KoColor c;
373 c.fromQColor(palette.gradientFillColor);
374 palette.gradientFillColor = convertColorToDisplayColorSpace(c);
375
376 c.fromQColor(palette.highlightColor);
377 palette.highlightColor = convertColorToDisplayColorSpace(c);
378
379 c.fromQColor(palette.highlightOutlineColor);
380 palette.highlightOutlineColor = convertColorToDisplayColorSpace(c);
381
382 c.fromQColor(palette.primaryColor);
384
385 c.fromQColor(palette.secondaryColor);
386 palette.secondaryColor = convertColorToDisplayColorSpace(c);
387
388 c.fromQColor(palette.selectionColor);
389 palette.selectionColor = convertColorToDisplayColorSpace(c);
390
391 c.fromQColor(palette.white);
393
394 c.fromQColor(palette.black);
396
397 QPalette pal = qApp->palette();
398 for (int r = 0; r < QPalette::NColorRoles; r++) {
399 for (int cg = 0; cg < QPalette::NColorGroups; cg++) {
400 c.fromQColor(pal.brush(QPalette::ColorGroup(cg), QPalette::ColorRole(r)).color());
401 pal.setBrush(QPalette::ColorGroup(cg), QPalette::ColorRole(r), convertColorToDisplayColorSpace(c));
402 }
403 }
404
405 m_d->handlePalette = palette;
406 m_d->systemPalette = pal;
407}
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
rgba palette[MAX_PALETTE]
Definition palette.c:35

References convertColorToDisplayColorSpace(), KoColor::fromQColor(), m_d, and palette.

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: