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

246 : m_d(new Private(this, 0))
247{
249
250 m_d->inputImageProfile = KoColorSpaceRegistry::instance()->p709SRGBProfile();
251 m_d->paintingColorSpace = KoColorSpaceRegistry::instance()->rgb8();
252
253 m_d->setCurrentNode(0);
254}
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->paintingColorSpace = KoColorSpaceRegistry::instance()->rgb8();
241 m_d->setCurrentNode(0);
243}
static KisConfigNotifier * instance()

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

◆ ~KisDisplayColorConverter()

KisDisplayColorConverter::~KisDisplayColorConverter ( )
override

Definition at line 256 of file kis_display_color_converter.cpp.

257{
258}

Member Function Documentation

◆ applyDisplayFiltering()

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

Definition at line 488 of file kis_display_color_converter.cpp.

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

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

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

References m_d.

◆ canSkipDisplayConversion()

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

Definition at line 507 of file kis_display_color_converter.cpp.

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

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

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

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

References m_d.

◆ displayConfigurationChanged

void KisDisplayColorConverter::displayConfigurationChanged ( )
signal

◆ displayFilter()

QSharedPointer< KisDisplayFilter > KisDisplayColorConverter::displayFilter ( ) const

Definition at line 445 of file kis_display_color_converter.cpp.

446{
447 return m_d->displayFilter;
448}

References m_d.

◆ displayRendererInterface()

KoColorDisplayRendererInterface * KisDisplayColorConverter::displayRendererInterface ( ) const

Definition at line 276 of file kis_display_color_converter.cpp.

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

References m_d.

◆ dumbConverterInstance()

KisDisplayColorConverter * KisDisplayColorConverter::dumbConverterInstance ( )
static

Definition at line 271 of file kis_display_color_converter.cpp.

272{
273 return s_instance;
274}

◆ fromHsiF()

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

Definition at line 741 of file kis_display_color_converter.cpp.

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

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

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

References m_d, and v.

◆ fromHsvF()

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

Definition at line 674 of file kis_display_color_converter.cpp.

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

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

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

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

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

References m_d.

◆ getHsv()

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

Definition at line 667 of file kis_display_color_converter.cpp.

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

References m_d, and v.

◆ getHsvF()

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

Definition at line 681 of file kis_display_color_converter.cpp.

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

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

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

451{
452 return m_d->multiSurfaceDisplayConfig;
453}

References m_d.

◆ nodeColorSpace()

const KoColorSpace * KisDisplayColorConverter::nodeColorSpace ( ) const

Definition at line 398 of file kis_display_color_converter.cpp.

399{
400 return m_d->nodeColorSpace;
401}

References m_d.

◆ paintingColorSpace()

const KoColorSpace * KisDisplayColorConverter::paintingColorSpace ( ) const

Definition at line 389 of file kis_display_color_converter.cpp.

390{
391 KIS_SAFE_ASSERT_RECOVER(m_d->paintingColorSpace) {
393 }
394
395 return m_d->paintingColorSpace;
396}
#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 413 of file kis_display_color_converter.cpp.

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

261{
262 m_d->inputImageProfile =
264 cs->profile() :
266
267 m_d->notifyDisplayConfigurationChanged();
268}

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

◆ setMultiSurfaceDisplayConfig()

void KisDisplayColorConverter::setMultiSurfaceDisplayConfig ( const KisMultiSurfaceDisplayConfig & config)

Definition at line 403 of file kis_display_color_converter.cpp.

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

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

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

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

525{
526 KisPaintDeviceSP device = srcDevice;
527
528 QRect bounds = srcDevice->exactBounds();
529 if (bounds.isEmpty()) return QImage();
530
531 if (proofPaintColors && m_d->needsColorProofing(srcDevice->colorSpace())) {
532 srcDevice->convertTo(paintingColorSpace(), m_d->multiSurfaceDisplayConfig.intent, m_d->multiSurfaceDisplayConfig.conversionFlags);
533 }
534
535 if (m_d->useOcio()) {
536 KIS_ASSERT_RECOVER(m_d->ocioInputColorSpace()->pixelSize() == 16) {
537 return QImage();
538 }
539
540 device = new KisPaintDevice(*srcDevice);
541 device->convertTo(m_d->ocioInputColorSpace());
542
543 KisSequentialIterator it(device, bounds);
544 int numConseqPixels = it.nConseqPixels();
545 while (it.nextPixels(numConseqPixels)) {
546 numConseqPixels = it.nConseqPixels();
547 m_d->displayFilter->filter(it.rawData(), numConseqPixels);
548 }
549
550 device->setProfile(m_d->ocioOutputProfile(), 0);
551 }
552
553 // we expect the display profile is rgb8, which is BGRA here
554 KIS_ASSERT_RECOVER(m_d->qtWidgetsColorSpace()->pixelSize() == 4) {
555 return QImage();
556 }
557
558 return device->convertToQImage(m_d->qtWidgetsProfile(),
559 bounds,
560 m_d->multiSurfaceDisplayConfig.intent,
561 m_d->multiSurfaceDisplayConfig.conversionFlags);
562}
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: