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
 
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)
 
 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)
 
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)
 

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 37 of file kis_display_color_converter.h.

Member Typedef Documentation

◆ ConversionOptions

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

Definition at line 98 of file kis_display_color_converter.h.

Constructor & Destructor Documentation

◆ KisDisplayColorConverter() [1/2]

KisDisplayColorConverter::KisDisplayColorConverter ( )

Definition at line 244 of file kis_display_color_converter.cpp.

245 : m_d(new Private(this, 0))
246{
248
249 m_d->inputImageProfile = KoColorSpaceRegistry::instance()->p709SRGBProfile();
250 m_d->paintingColorSpace = KoColorSpaceRegistry::instance()->rgb8();
251
252 m_d->setCurrentNode(0);
253}
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 230 of file kis_display_color_converter.cpp.

231 : QObject(parent),
232 m_d(new Private(this, resourceManager))
233{
234 connect(m_d->resourceManager, SIGNAL(canvasResourceChanged(int,QVariant)),
235 SLOT(slotCanvasResourceChanged(int,QVariant)));
236 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()),
237 SLOT(selectPaintingColorSpace()));
238
239 m_d->inputImageProfile = KoColorSpaceRegistry::instance()->p709SRGBProfile();
240 m_d->setCurrentNode(0);
242}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
static KisConfigNotifier * instance()

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

◆ ~KisDisplayColorConverter()

KisDisplayColorConverter::~KisDisplayColorConverter ( )
override

Definition at line 255 of file kis_display_color_converter.cpp.

256{
257}

Member Function Documentation

◆ applyDisplayFiltering()

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

Definition at line 487 of file kis_display_color_converter.cpp.

489{
490 KoColor c(srcColor);
491
492 if (m_d->useOcio()) {
493 KIS_ASSERT_RECOVER(m_d->ocioInputColorSpace()->pixelSize() == 16) {
494 return srcColor;
495 }
496
497 c.convertTo(m_d->ocioInputColorSpace());
498 m_d->displayFilter->filter(c.data(), 1);
499 c.setProfile(m_d->ocioOutputProfile());
500 }
501
502 c.convertTo(m_d->openGLSurfaceColorSpace(bitDepthId), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
503 return c;
504}
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 607 of file kis_display_color_converter.cpp.

609{
617 KIS_SAFE_ASSERT_RECOVER_RETURN(device->bounds().isValid());
618
619 if (m_d->useOcio()) {
620 KIS_ASSERT_RECOVER_RETURN(m_d->ocioInputColorSpace()->pixelSize() == 16);
621
622 device->convertTo(m_d->ocioInputColorSpace());
623 m_d->displayFilter->filter(device->data(), device->bounds().width() * device->bounds().height());
624 device->setProfile(m_d->ocioOutputProfile());
625 }
626
627 KIS_SAFE_ASSERT_RECOVER_RETURN(dstColorSpace);
628 device->convertTo(dstColorSpace);
629}
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 518 of file kis_display_color_converter.cpp.

519{
520 return m_d->approximateFromQColor(c);
521}

References m_d.

◆ canSkipDisplayConversion()

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

Definition at line 506 of file kis_display_color_converter.cpp.

507{
508 const KoColorProfile *displayProfile = m_d->openGLSurfaceProfile();
509
510 return !m_d->useOcio() &&
512 (!!cs->profile() == !!displayProfile) &&
513 (!cs->profile() ||
514 cs->profile()->uniqueId() == displayProfile->uniqueId());
515}
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 454 of file kis_display_color_converter.cpp.

455{
456 return m_d->multiSurfaceDisplayConfig.options();
457}

References m_d.

◆ convertToDisplayImpl()

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

◆ displayConfig()

KisDisplayConfig KisDisplayColorConverter::displayConfig ( ) const

Definition at line 439 of file kis_display_color_converter.cpp.

440{
441 return m_d->multiSurfaceDisplayConfig.uiDisplayConfig();
442}

References m_d.

◆ displayConfigurationChanged

void KisDisplayColorConverter::displayConfigurationChanged ( )
signal

◆ displayFilter()

QSharedPointer< KisDisplayFilter > KisDisplayColorConverter::displayFilter ( ) const

Definition at line 444 of file kis_display_color_converter.cpp.

445{
446 return m_d->displayFilter;
447}

References m_d.

◆ displayRendererInterface()

KoColorDisplayRendererInterface * KisDisplayColorConverter::displayRendererInterface ( ) const

Definition at line 275 of file kis_display_color_converter.cpp.

276{
277 return m_d->displayRenderer.data();
278}

References m_d.

◆ dumbConverterInstance()

KisDisplayColorConverter * KisDisplayColorConverter::dumbConverterInstance ( )
static

Definition at line 270 of file kis_display_color_converter.cpp.

271{
272 return s_instance;
273}

◆ fromHsiF()

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

Definition at line 740 of file kis_display_color_converter.cpp.

741{
742 // generate HSI from sRGB!
743 qreal r=0.0;
744 qreal g=0.0;
745 qreal b=0.0;
746 qreal a=1.0;
747 HSIToRGB(h, s, i, &r, &g, &b);
748 QColor qcolor;
749 qcolor.setRgbF(qBound(0.0,r,1.0), qBound(0.0,g,1.0), qBound(0.0,b,1.0), a);
750 return m_d->approximateFromQColor(qcolor);
751}
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 704 of file kis_display_color_converter.cpp.

705{
706 // generate HSL from sRGB!
707 QColor qcolor(QColor::fromHslF(h, s, l, a));
708 if (!qcolor.isValid()) {
709 warnKrita << "Could not construct valid color from h" << h << "s" << s << "l" << l << "a" << a;
710 qcolor = Qt::black;
711 }
712 return m_d->approximateFromQColor(qcolor);
713
714}
#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 659 of file kis_display_color_converter.cpp.

660{
661 // generate HSV from sRGB!
662 QColor qcolor(QColor::fromHsv(h, s, v, a));
663 return m_d->approximateFromQColor(qcolor);
664}
qreal v

References m_d, and v.

◆ fromHsvF()

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

Definition at line 673 of file kis_display_color_converter.cpp.

674{
675 // generate HSV from sRGB!
676 QColor qcolor(QColor::fromHsvF(h, s, v, a));
677 return m_d->approximateFromQColor(qcolor);
678}

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

764{
765 // generate HSL from sRGB!
766 QVector <qreal> channelValues(3);
767 y = pow(y, gamma);
768 HSYToRGB(h, s, y, &channelValues[0], &channelValues[1], &channelValues[2], R, G, B);
770 QColor qcolor;
771 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);
772 return m_d->approximateFromQColor(qcolor);
773}
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 753 of file kis_display_color_converter.cpp.

754{
755 // we are going through sRGB here!
756 QColor color = m_d->approximateToQColor(srcColor);
757 qreal r=color.redF();
758 qreal g=color.greenF();
759 qreal b=color.blueF();
760 RGBToHSI(r, g, b, h, s, i);
761}
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 716 of file kis_display_color_converter.cpp.

717{
718 // we are going through sRGB here!
719 QColor color = m_d->approximateToQColor(srcColor);
720#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
721 color.getHslF(h, s, l, a);
722#else
723 float fH, fS, fL, fA;
724 fH = *h;
725 fS = *s;
726 fL = *l;
727 if (a) {
728 fA = *a;
729 }
730 color.getHslF(&fH, &fS, &fL, &fA);
731 *h = fH;
732 *s = fS;
733 *l = fL;
734 if (a) {
735 *a = fA;
736 }
737#endif
738}

References m_d.

◆ getHsv()

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

Definition at line 666 of file kis_display_color_converter.cpp.

667{
668 // we are going through sRGB here!
669 QColor color = m_d->approximateToQColor(srcColor);
670 color.getHsv(h, s, v, a);
671}

References m_d, and v.

◆ getHsvF()

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

Definition at line 680 of file kis_display_color_converter.cpp.

681{
682 // we are going through sRGB here!
683 QColor color = m_d->approximateToQColor(srcColor);
684#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
685 color.getHsvF(h, s, v, a);
686#else
687 float fH, fS, fV, fA;
688 fH = *h;
689 fS = *s;
690 fV = *v;
691 if (a) {
692 fA = *a;
693 }
694 color.getHsvF(&fH, &fS, &fV, &fA);
695 *h = fH;
696 *s = fS;
697 *v = fV;
698 if (a) {
699 *a = fA;
700 }
701#endif
702}

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

776{
777 // we are going through sRGB here!
778 QColor color = m_d->approximateToQColor(srcColor);
779 QVector <qreal> channelValues(3);
780 channelValues[0]=color.redF();
781 channelValues[1]=color.greenF();
782 channelValues[2]=color.blueF();
783 //TODO: if we're going to have KoColor here, remember to check whether the TRC of the profile exists...
785 RGBToHSY(channelValues[0], channelValues[1], channelValues[2], h, s, y, R, G, B);
786 *y = pow(*y, 1/gamma);
787}
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().

◆ multiSurfaceDisplayConfig()

KisMultiSurfaceDisplayConfig KisDisplayColorConverter::multiSurfaceDisplayConfig ( ) const

Definition at line 449 of file kis_display_color_converter.cpp.

450{
451 return m_d->multiSurfaceDisplayConfig;
452}

References m_d.

◆ nodeColorSpace()

const KoColorSpace * KisDisplayColorConverter::nodeColorSpace ( ) const

Definition at line 397 of file kis_display_color_converter.cpp.

398{
399 return m_d->nodeColorSpace;
400}

References m_d.

◆ paintingColorSpace()

const KoColorSpace * KisDisplayColorConverter::paintingColorSpace ( ) const

Definition at line 388 of file kis_display_color_converter.cpp.

389{
390 KIS_ASSERT_RECOVER(m_d->paintingColorSpace) {
392 }
393
394 return m_d->paintingColorSpace;
395}

References KoColorSpaceRegistry::instance(), KIS_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 412 of file kis_display_color_converter.cpp.

413{
414 if (m_d->displayFilter && displayFilter &&
415 displayFilter->lockCurrentColorVisualRepresentation()) {
416
417 KoColor color(m_d->intermediateFgColor);
418 displayFilter->approximateInverseTransformation(color.data(), 1);
419 color.convertTo(m_d->paintingColorSpace);
420 m_d->resourceManager->setForegroundColor(color);
421 }
422
423 m_d->displayFilter = displayFilter;
424
425 if (m_d->displayFilter) {
426 m_d->updateIntermediateFgColor(
427 m_d->resourceManager->foregroundColor());
428 }
429
430
431 { // sanity check
432 // KisConfig cfg;
433 // KIS_ASSERT_RECOVER_NOOP(cfg.useOcio() == (bool) m_d->displayFilter);
434 }
435
436 m_d->selectPaintingColorSpace();
437}
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 259 of file kis_display_color_converter.cpp.

260{
261 m_d->inputImageProfile =
263 cs->profile() :
265
266 m_d->notifyDisplayConfigurationChanged();
267}

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

◆ setMultiSurfaceDisplayConfig()

void KisDisplayColorConverter::setMultiSurfaceDisplayConfig ( const KisMultiSurfaceDisplayConfig & config)

Definition at line 402 of file kis_display_color_converter.cpp.

403{
404 if (m_d->multiSurfaceDisplayConfig == config) return;
405
406
407
408 m_d->multiSurfaceDisplayConfig = config;
409 m_d->notifyDisplayConfigurationChanged();
410}

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

460{
461 KoColor c(srcColor);
462
463 if (proofToPaintColors && m_d->needsColorProofing(c.colorSpace())) {
464 c.convertTo(m_d->paintingColorSpace, m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
465 }
466
467 if (m_d->useOcio()) {
468 KIS_ASSERT_RECOVER(m_d->ocioInputColorSpace()->pixelSize() == 16) {
469 return QColor(Qt::green);
470 }
471
472 c.convertTo(m_d->ocioInputColorSpace());
473 m_d->displayFilter->filter(c.data(), 1);
474 c.setProfile(m_d->ocioOutputProfile());
475 }
476
477 // we expect the display profile is rgb8, which is BGRA here
478 KIS_ASSERT_RECOVER(m_d->qtWidgetsColorSpace()->pixelSize() == 4) {
479 return QColor(Qt::red);
480 }
481
482 c.convertTo(m_d->qtWidgetsColorSpace(), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
483 const quint8 *p = c.data();
484 return QColor(p[2], p[1], p[0], p[3]);
485}
const Params2D p
quint8 * data()
Definition KoColor.h:144
const KoColorSpace * colorSpace() const
return the current colorSpace
Definition KoColor.h:82
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 563 of file kis_display_color_converter.cpp.

564{
565 const int numPixels = size.width() * size.height();
566
567 const KoColorSpace *colorSpace = srcColorSpace;
568 const quint8 *pixels = data;
569
570 QScopedArrayPointer<quint8> proofBuffer;
571
572 if (proofPaintColors && m_d->needsColorProofing(srcColorSpace)) {
573 const int imageSize = numPixels * paintingColorSpace()->pixelSize();
574 proofBuffer.reset(new quint8[imageSize]);
575 colorSpace->convertPixelsTo(pixels, proofBuffer.data(),
577 numPixels,
578 m_d->multiSurfaceDisplayConfig.intent,
579 m_d->multiSurfaceDisplayConfig.conversionFlags);
580 colorSpace = paintingColorSpace();
581 pixels = proofBuffer.data();
582 }
583
584 QScopedArrayPointer<quint8> ocioBuffer;
585 if (m_d->useOcio()) {
586 const int imageSize = numPixels * m_d->ocioInputColorSpace()->pixelSize();
587 ocioBuffer.reset(new quint8[imageSize]);
588 colorSpace->convertPixelsTo(pixels, ocioBuffer.data(),
589 m_d->ocioInputColorSpace(),
590 numPixels,
591 m_d->multiSurfaceDisplayConfig.intent,
592 m_d->multiSurfaceDisplayConfig.conversionFlags);
593 m_d->displayFilter->filter(ocioBuffer.data(), numPixels);
594
595 return m_d->ocioOutputColorSpace()->convertToQImage(ocioBuffer.data(), size.width(), size.height(),
596 m_d->qtWidgetsProfile(),
597 m_d->multiSurfaceDisplayConfig.intent,
598 m_d->multiSurfaceDisplayConfig.conversionFlags);
599 }
600
601 return colorSpace->convertToQImage(pixels, size.width(), size.height(),
602 m_d->qtWidgetsProfile(),
603 m_d->multiSurfaceDisplayConfig.intent,
604 m_d->multiSurfaceDisplayConfig.conversionFlags);
605}
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 523 of file kis_display_color_converter.cpp.

524{
525 KisPaintDeviceSP device = srcDevice;
526
527 QRect bounds = srcDevice->exactBounds();
528 if (bounds.isEmpty()) return QImage();
529
530 if (proofPaintColors && m_d->needsColorProofing(srcDevice->colorSpace())) {
531 srcDevice->convertTo(paintingColorSpace(), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
532 }
533
534 if (m_d->useOcio()) {
535 KIS_ASSERT_RECOVER(m_d->ocioInputColorSpace()->pixelSize() == 16) {
536 return QImage();
537 }
538
539 device = new KisPaintDevice(*srcDevice);
540 device->convertTo(m_d->ocioInputColorSpace());
541
542 KisSequentialIterator it(device, bounds);
543 int numConseqPixels = it.nConseqPixels();
544 while (it.nextPixels(numConseqPixels)) {
545 numConseqPixels = it.nConseqPixels();
546 m_d->displayFilter->filter(it.rawData(), numConseqPixels);
547 }
548
549 device->setProfile(m_d->ocioOutputProfile(), 0);
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 QImage();
555 }
556
557 return device->convertToQImage(m_d->qtWidgetsProfile(),
558 bounds,
559 m_d->multiSurfaceDisplayConfig.intent,
560 m_d->multiSurfaceDisplayConfig.conversionFlags);
561}
QRect exactBounds() const
const KoColorSpace * colorSpace() 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)
#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().

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisDisplayColorConverter::m_d
private

Definition at line 118 of file kis_display_color_converter.h.


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