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

277 : m_d(new Private(this, 0))
278{
280
281 m_d->inputImageProfile = KoColorSpaceRegistry::instance()->p709SRGBProfile();
282 m_d->paintingColorSpace = KoColorSpaceRegistry::instance()->rgb8();
283
284 m_d->setCurrentNode(0);
285}
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 259 of file kis_display_color_converter.cpp.

260 : QObject(parent),
261 m_d(new Private(this, resourceManager))
262{
263 connect(m_d->resourceManager, SIGNAL(canvasResourceChanged(int,QVariant)),
264 SLOT(slotCanvasResourceChanged(int,QVariant)));
265 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()),
266 SLOT(selectPaintingColorSpace()));
267
268 m_d->inputImageProfile = KoColorSpaceRegistry::instance()->p709SRGBProfile();
269 m_d->paintingColorSpace = KoColorSpaceRegistry::instance()->rgb8();
270 m_d->setCurrentNode(0);
273 connect(this, SIGNAL(displayConfigurationChanged()), this, SLOT(updatePalettes()));
274}
static KisConfigNotifier * instance()

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

◆ ~KisDisplayColorConverter()

KisDisplayColorConverter::~KisDisplayColorConverter ( )
override

Definition at line 287 of file kis_display_color_converter.cpp.

288{
289}

Member Function Documentation

◆ applyDisplayFiltering()

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

Definition at line 559 of file kis_display_color_converter.cpp.

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

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

591{
592 return m_d->approximateFromQColor(c);
593}

References m_d.

◆ canSkipDisplayConversion()

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

Definition at line 578 of file kis_display_color_converter.cpp.

579{
580 const KoColorProfile *displayProfile = m_d->openGLSurfaceProfile();
581
582 return !m_d->useOcio() &&
584 (!!cs->profile() == !!displayProfile) &&
585 (!cs->profile() ||
586 cs->profile()->uniqueId() == displayProfile->uniqueId());
587}
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 526 of file kis_display_color_converter.cpp.

527{
528 return m_d->multiSurfaceDisplayConfig.options();
529}

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

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

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

512{
513 return m_d->multiSurfaceDisplayConfig.uiDisplayConfig();
514}

References m_d.

◆ displayConfigurationChanged

void KisDisplayColorConverter::displayConfigurationChanged ( )
signal

◆ displayFilter()

QSharedPointer< KisDisplayFilter > KisDisplayColorConverter::displayFilter ( ) const

Definition at line 516 of file kis_display_color_converter.cpp.

517{
518 return m_d->displayFilter;
519}

References m_d.

◆ displayRendererInterface()

KoColorDisplayRendererInterface * KisDisplayColorConverter::displayRendererInterface ( ) const

Definition at line 307 of file kis_display_color_converter.cpp.

308{
309 return m_d->displayRenderer.data();
310}

References m_d.

◆ dumbConverterInstance()

KisDisplayColorConverter * KisDisplayColorConverter::dumbConverterInstance ( )
static

Definition at line 302 of file kis_display_color_converter.cpp.

303{
304 return s_instance;
305}

◆ fromHsiF()

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

Definition at line 875 of file kis_display_color_converter.cpp.

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

840{
841 // generate HSL from sRGB!
842 QColor qcolor(QColor::fromHslF(h, s, l, a));
843 if (!qcolor.isValid()) {
844 warnKrita << "Could not construct valid color from h" << h << "s" << s << "l" << l << "a" << a;
845 qcolor = Qt::black;
846 }
847 return m_d->approximateFromQColor(qcolor);
848
849}
#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 794 of file kis_display_color_converter.cpp.

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

References m_d, and v.

◆ fromHsvF()

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

Definition at line 808 of file kis_display_color_converter.cpp.

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

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

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

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

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

References m_d.

◆ getHsv()

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

Definition at line 801 of file kis_display_color_converter.cpp.

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

References m_d, and v.

◆ getHsvF()

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

Definition at line 815 of file kis_display_color_converter.cpp.

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

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

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

757{
758 return m_d->handlePalette;
759}

References m_d.

◆ multiSurfaceDisplayConfig()

KisMultiSurfaceDisplayConfig KisDisplayColorConverter::multiSurfaceDisplayConfig ( ) const

Definition at line 521 of file kis_display_color_converter.cpp.

522{
523 return m_d->multiSurfaceDisplayConfig;
524}

References m_d.

◆ nodeColorSpace()

const KoColorSpace * KisDisplayColorConverter::nodeColorSpace ( ) const

Definition at line 469 of file kis_display_color_converter.cpp.

470{
471 return m_d->nodeColorSpace;
472}

References m_d.

◆ paintingColorSpace()

const KoColorSpace * KisDisplayColorConverter::paintingColorSpace ( ) const

Definition at line 460 of file kis_display_color_converter.cpp.

461{
462 KIS_SAFE_ASSERT_RECOVER(m_d->paintingColorSpace) {
464 }
465
466 return m_d->paintingColorSpace;
467}
#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 484 of file kis_display_color_converter.cpp.

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

292{
293 m_d->inputImageProfile =
295 cs->profile() :
297
298 m_d->notifyDisplayConfigurationChanged();
299}

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

◆ setMultiSurfaceDisplayConfig()

void KisDisplayColorConverter::setMultiSurfaceDisplayConfig ( const KisMultiSurfaceDisplayConfig & config)

Definition at line 474 of file kis_display_color_converter.cpp.

475{
476 if (m_d->multiSurfaceDisplayConfig == config) return;
477
478
479
480 m_d->multiSurfaceDisplayConfig = config;
481 m_d->notifyDisplayConfigurationChanged();
482}

References m_d.

◆ systemPaletteForDisplayColorSpace()

QPalette KisDisplayColorConverter::systemPaletteForDisplayColorSpace ( ) const

systemPaletteForDisplayColorSpace

Returns
QPalette suitable to draw canvas decorations with.

Definition at line 761 of file kis_display_color_converter.cpp.

762{
763 return m_d->systemPalette;
764}

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

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

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

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

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