File indexing completed on 2024-06-09 04:27:19

0001 /*
0002  * This file is part of Krita
0003  *
0004  * SPDX-FileCopyrightText: 2006 Frederic Coiffier <fcoiffie@gmail.com>
0005  * SPDX-FileCopyrightText: 2021 Deif Lou <ginoba@gmail.com>
0006  *
0007  * SPDX-License-Identifier: GPL-2.0-or-later
0008  */
0009 
0010 #include <filter/kis_filter_category_ids.h>
0011 
0012 #include "../colorsfilters/kis_multichannel_utils.h"
0013 
0014 #include "KisLevelsFilter.h"
0015 #include "KisLevelsConfigWidget.h"
0016 
0017 KisLevelsFilter::KisLevelsFilter()
0018     : KisColorTransformationFilter(id(), FiltersCategoryAdjustId, i18n("&Levels..."))
0019 {
0020     setSupportsPainting(true);
0021     setColorSpaceIndependence(TO_LAB16);
0022     setShortcut(QKeySequence(Qt::CTRL + Qt::Key_L));
0023 }
0024 
0025 KisFilterConfigurationSP KisLevelsFilter::factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
0026 {
0027     return new KisLevelsFilterConfiguration(0, resourcesInterface);
0028 }
0029 
0030 KisConfigWidget * KisLevelsFilter::createConfigurationWidget(QWidget* parent, const KisPaintDeviceSP dev, bool) const
0031 {
0032     return new KisLevelsConfigWidget(parent, dev, dev->compositionSourceColorSpace());
0033 }
0034 
0035 KoColorTransformation* KisLevelsFilter::createTransformation(const KoColorSpace* cs, const KisFilterConfigurationSP config) const
0036 {
0037     Q_ASSERT(cs);
0038     const KisLevelsFilterConfiguration *config_ = dynamic_cast<const KisLevelsFilterConfiguration*>(config.data());
0039     Q_ASSERT(config_);
0040 
0041     if (config_->useLightnessMode()) {
0042         if (!config_->lightnessLevelsCurve().isIdentity()) {
0043             return cs->createBrightnessContrastAdjustment(config_->lightnessTransfer().constData());
0044         }
0045     } else {
0046         QList<bool> isIdentityList;
0047         for (const KisLevelsCurve &levelsCurve : config_->levelsCurves()) {
0048             isIdentityList.append(levelsCurve.isIdentity());
0049         }
0050 
0051         return KisMultiChannelUtils::createPerChannelTransformationFromTransfers(cs, config_->transfers(), isIdentityList);
0052     }
0053     return nullptr;
0054 }