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

#include <fastcolortransfer.h>

+ Inheritance diagram for KisFilterFastColorTransfer:

Public Member Functions

KisConfigWidgetcreateConfigurationWidget (QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
 
KisFilterConfigurationSP defaultConfiguration (KisResourcesInterfaceSP resourcesInterface) const override
 
 KisFilterFastColorTransfer ()
 
void processImpl (KisPaintDeviceSP device, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
 
- Public Member Functions inherited from KisFilter
virtual QRect changedRect (const QRect &rect, const KisFilterConfigurationSP config, int lod) const
 
virtual bool configurationAllowedForMask (KisFilterConfigurationSP config) const
 
virtual void fixLoadedFilterConfigurationForMasks (KisFilterConfigurationSP config) const
 
 KisFilter (const KoID &id, const KoID &category, const QString &entry)
 
virtual QRect neededRect (const QRect &rect, const KisFilterConfigurationSP config, int lod) const
 
virtual bool needsTransparentPixels (const KisFilterConfigurationSP config, const KoColorSpace *cs) const
 
void process (const KisPaintDeviceSP src, KisPaintDeviceSP dst, KisSelectionSP selection, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater=0) const
 
void process (KisPaintDeviceSP device, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater=0) const
 
virtual bool supportsLevelOfDetail (const KisFilterConfigurationSP config, int lod) const
 
 ~KisFilter () override
 
- Public Member Functions inherited from KisBaseProcessor
KisBookmarkedConfigurationManagerbookmarkManager ()
 
const KisBookmarkedConfigurationManagerbookmarkManager () const
 
ColorSpaceIndependence colorSpaceIndependence () const
 
virtual KisFilterConfigurationSP factoryConfiguration (KisResourcesInterfaceSP resourcesInterface) const
 
QString id () const
 
 KisBaseProcessor (const KoID &id, const KoID &category, const QString &entry)
 
KoID menuCategory () const
 
QString menuEntry () const
 
QString name () const
 
 Private ()
 
QKeySequence shortcut () const
 
bool showConfigurationWidget ()
 If true, the filter wants to show a configuration widget.
 
bool supportsAdjustmentLayers () const
 This filter can be used in adjustment layers.
 
bool supportsPainting () const
 
bool supportsThreading () const
 
virtual ~KisBaseProcessor ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Static Public Member Functions

static KoID id ()
 

Additional Inherited Members

- Public Attributes inherited from KisBaseProcessor
KisBookmarkedConfigurationManagerbookmarkManager
 
KoID category
 
ColorSpaceIndependence colorSpaceIndependence
 
QString entry
 
KoID id
 
QKeySequence shortcut
 
bool showConfigurationWidget
 
bool supportsAdjustmentLayers
 
bool supportsPainting
 
bool supportsThreading
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Protected Member Functions inherited from KisFilter
QString configEntryGroup () const
 
void setSupportsLevelOfDetail (bool value)
 
- Protected Member Functions inherited from KisBaseProcessor
void init (const QString &configEntryGroup)
 
void setColorSpaceIndependence (ColorSpaceIndependence v)
 
void setShortcut (const QKeySequence &shortcut)
 
void setShowConfigurationWidget (bool v)
 
void setSupportsAdjustmentLayers (bool v)
 
void setSupportsPainting (bool v)
 
void setSupportsThreading (bool v)
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Detailed Description

Definition at line 24 of file fastcolortransfer.h.

Constructor & Destructor Documentation

◆ KisFilterFastColorTransfer()

KisFilterFastColorTransfer::KisFilterFastColorTransfer ( )

Definition at line 48 of file fastcolortransfer.cpp.

48 : KisFilter(id(), FiltersCategoryColorId, i18n("&Color Transfer..."))
49{
54}
@ FULLY_INDEPENDENT
KisFilter(const KoID &id, const KoID &category, const QString &entry)
Definition kis_filter.cc:22
const KoID FiltersCategoryColorId("color_filters", ki18nc("The category of color transfer filters, like color to alpha. Noun.", "Colors"))
void setSupportsThreading(bool v)
void setSupportsAdjustmentLayers(bool v)
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)

References FULLY_INDEPENDENT, KisBaseProcessor::setColorSpaceIndependence(), KisBaseProcessor::setSupportsAdjustmentLayers(), KisBaseProcessor::setSupportsPainting(), and KisBaseProcessor::setSupportsThreading().

Member Function Documentation

◆ createConfigurationWidget()

KisConfigWidget * KisFilterFastColorTransfer::createConfigurationWidget ( QWidget * parent,
const KisPaintDeviceSP dev,
bool useForMasks ) const
overridevirtual

Create the configuration widget for this processor.

Parameters
parentthe Qt owner widget of this widget
devthe paintdevice this filter will act on
useForMasksshown if the filer is going to be used in a mask. Some filters may provide limited options when applied as a mask (e.g. Gaussian Blur)

Reimplemented from KisBaseProcessor.

Definition at line 57 of file fastcolortransfer.cpp.

58{
59 Q_UNUSED(dev);
60 return new KisWdgFastColorTransfer(parent);
61}

◆ defaultConfiguration()

KisFilterConfigurationSP KisFilterFastColorTransfer::defaultConfiguration ( KisResourcesInterfaceSP resourcesInterface) const
overridevirtual

Return the configuration set as the default by the user or the default configuration from the filter writer as returned by factoryConfiguration.

This configuration is used by default for the configuration widget and given to the process function if there is no configuration widget.

Returns
the default configuration of this widget

Reimplemented from KisBaseProcessor.

Definition at line 63 of file fastcolortransfer.cpp.

64{
65 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
66 config->setProperty("filename", "");
67 return config;
68}
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const

References KisBaseProcessor::factoryConfiguration().

◆ id()

static KoID KisFilterFastColorTransfer::id ( )
inlinestatic

Definition at line 34 of file fastcolortransfer.h.

34 {
35 return KoID("colortransfer", i18n("Color Transfer"));
36 }
Definition KoID.h:30

◆ processImpl()

void KisFilterFastColorTransfer::processImpl ( KisPaintDeviceSP device,
const QRect & applyRect,
const KisFilterConfigurationSP config,
KoUpdater * progressUpdater ) const
overridevirtual

Override this function with the implementation of your filter.

This is a low level function that expects all the conditions for the

Parameters
devicebe met. Use usual process() methods instead.
devicethe paint device to filter
applyRectthe rectangle where the filter is applied
configthe parameters of the filter
progressUpdaterto pass on the progress the filter is making

Implements KisFilter.

Definition at line 72 of file fastcolortransfer.cpp.

76{
77 Q_ASSERT(device != 0);
78
79 dbgPlugins << "Start transferring color";
80
81 // Convert ref and src to LAB
83 if (!labCS) {
84 dbgPlugins << "The LAB colorspace is not available.";
85 return;
86 }
87
88 dbgPlugins << "convert a copy of src to lab";
89 const KoColorSpace* oldCS = device->colorSpace();
90 KisPaintDeviceSP srcLAB = new KisPaintDevice(*device.data());
91 dbgPlugins << "srcLab : " << srcLAB->extent();
93
94 KoProgressUpdater compositeUpdater(progressUpdater, KoProgressUpdater::Unthreaded);
95 KoUpdater *updaterStats = compositeUpdater.startSubtask(1);
96 KoUpdater *updaterMap = compositeUpdater.startSubtask(2);
97
98 // Compute the means and sigmas of src
99 dbgPlugins << "Compute the means and sigmas of src";
100 double meanL_src = 0., meanA_src = 0., meanB_src = 0.;
101 double sigmaL_src = 0., sigmaA_src = 0., sigmaB_src = 0.;
102
103 {
104 KisSequentialConstIteratorProgress srcIt(srcLAB, applyRect, updaterStats);
105 while (srcIt.nextPixel()) {
106 const quint16* data = reinterpret_cast<const quint16*>(srcIt.oldRawData());
107 quint32 L = data[0];
108 quint32 A = data[1];
109 quint32 B = data[2];
110 meanL_src += L;
111 meanA_src += A;
112 meanB_src += B;
113 sigmaL_src += L * L;
114 sigmaA_src += A * A;
115 sigmaB_src += B * B;
116 }
117 }
118
119 double totalSize = 1. / (applyRect.width() * applyRect.height());
120 meanL_src *= totalSize;
121 meanA_src *= totalSize;
122 meanB_src *= totalSize;
123 sigmaL_src *= totalSize;
124 sigmaA_src *= totalSize;
125 sigmaB_src *= totalSize;
126
127 dbgPlugins << totalSize << "" << meanL_src << "" << meanA_src << "" << meanB_src << "" << sigmaL_src << "" << sigmaA_src << "" << sigmaB_src;
128
129 double meanL_ref = config->getDouble("meanL");
130 double meanA_ref = config->getDouble("meanA");
131 double meanB_ref = config->getDouble("meanB");
132 double sigmaL_ref = config->getDouble("sigmaL");
133 double sigmaA_ref = config->getDouble("sigmaA");
134 double sigmaB_ref = config->getDouble("sigmaB");
135
136 // Transfer colors
137 dbgPlugins << "Transfer colors";
138 {
139 double coefL = sqrt((sigmaL_ref - meanL_ref * meanL_ref) / (sigmaL_src - meanL_src * meanL_src));
140 double coefA = sqrt((sigmaA_ref - meanA_ref * meanA_ref) / (sigmaA_src - meanA_src * meanA_src));
141 double coefB = sqrt((sigmaB_ref - meanB_ref * meanB_ref) / (sigmaB_src - meanB_src * meanB_src));
142
143 quint16 labPixel[4];
144
145 KisSequentialConstIteratorProgress srcLabIt(srcLAB, applyRect, updaterMap);
146 KisSequentialIterator dstIt(device, applyRect);
147 while (srcLabIt.nextPixel() && dstIt.nextPixel()) {
148 const quint16* data = reinterpret_cast<const quint16*>(srcLabIt.oldRawData());
149
150 labPixel[0] = (quint16)CLAMP(((double)data[0] - meanL_src) * coefL + meanL_ref, 0., 65535.);
151 labPixel[1] = (quint16)CLAMP(((double)data[1] - meanA_src) * coefA + meanA_ref, 0., 65535.);
152 labPixel[2] = (quint16)CLAMP(((double)data[2] - meanB_src) * coefB + meanB_ref, 0., 65535.);
153 labPixel[3] = data[3];
154 oldCS->fromLabA16(reinterpret_cast<const quint8*>(labPixel), dstIt.rawData(), 1);
155 }
156 }
157}
QRect extent() const
const KoColorSpace * colorSpace() const
void convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)
virtual void fromLabA16(const quint8 *src, quint8 *dst, quint32 nPixels) const
#define CLAMP(x, l, h)
#define dbgPlugins
Definition kis_debug.h:51
const KoColorSpace * lab16(const QString &profileName=QString())
static KoColorSpaceRegistry * instance()

References A, B, CLAMP, KisPaintDevice::colorSpace(), KisPaintDevice::convertTo(), KisSharedPtr< T >::data(), dbgPlugins, KisPaintDevice::extent(), KoColorSpace::fromLabA16(), KoColorSpaceRegistry::instance(), KoColorConversionTransformation::internalConversionFlags(), KoColorConversionTransformation::internalRenderingIntent(), KoColorSpaceRegistry::lab16(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::oldRawData(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), KoProgressUpdater::startSubtask(), and KoProgressUpdater::Unthreaded.


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