diff --git a/plugins/paintops/libpaintop/kis_dab_cache.cpp b/plugins/paintops/libpaintop/kis_dab_cache.cpp --- a/plugins/paintops/libpaintop/kis_dab_cache.cpp +++ b/plugins/paintops/libpaintop/kis_dab_cache.cpp @@ -412,7 +412,7 @@ const KisPaintInformation& info) { if (m_d->sharpnessOption) { - m_d->sharpnessOption->applyThreshold(dab); + m_d->sharpnessOption->applyThreshold(dab, info); } if (m_d->textureOption) { diff --git a/plugins/paintops/libpaintop/kis_pressure_sharpness_option.h b/plugins/paintops/libpaintop/kis_pressure_sharpness_option.h --- a/plugins/paintops/libpaintop/kis_pressure_sharpness_option.h +++ b/plugins/paintops/libpaintop/kis_pressure_sharpness_option.h @@ -28,6 +28,7 @@ const QString SHARPNESS_FACTOR = "Sharpness/factor"; const QString SHARPNESS_THRESHOLD = "Sharpness/threshold"; +const QString SOFT_MODE = "Sharpness/soft"; /** * This option is responsible to mimic pencil effect from former Pixel Pencil brush engine.auto @@ -45,19 +46,22 @@ /** * Apply threshold specified by user */ - void applyThreshold(KisFixedPaintDeviceSP dab); + void applyThreshold(KisFixedPaintDeviceSP dab, const KisPaintInformation &info); void writeOptionSetting(KisPropertiesConfigurationSP setting) const override; void readOptionSetting(const KisPropertiesConfigurationSP setting) override; /// threshold has 100 levels (like opacity) void setThreshold(qint32 threshold) { - m_threshold = qBound(0, threshold, 100); + m_softness = qBound(0, threshold, 100); } qint32 threshold() { - return m_threshold; + return m_softness; } + void setSoft(bool soft); + bool isSoft(); + void setSharpnessFactor(qreal factor) { KisCurveOption::setValue(factor); } @@ -66,7 +70,8 @@ } private: - qint32 m_threshold; + qint32 m_softness; + bool m_soft; }; #endif diff --git a/plugins/paintops/libpaintop/kis_pressure_sharpness_option.cpp b/plugins/paintops/libpaintop/kis_pressure_sharpness_option.cpp --- a/plugins/paintops/libpaintop/kis_pressure_sharpness_option.cpp +++ b/plugins/paintops/libpaintop/kis_pressure_sharpness_option.cpp @@ -31,19 +31,32 @@ KisPressureSharpnessOption::KisPressureSharpnessOption() : KisCurveOption("Sharpness", KisPaintOpOption::GENERAL, false) { - m_threshold = 40; + m_softness = 0; + m_soft = false; +} + +void KisPressureSharpnessOption::setSoft(bool soft) +{ + m_soft = soft; +} + +bool KisPressureSharpnessOption::isSoft() +{ + return m_soft; } void KisPressureSharpnessOption::writeOptionSetting(KisPropertiesConfigurationSP setting) const { KisCurveOption::writeOptionSetting(setting); - setting->setProperty(SHARPNESS_THRESHOLD, m_threshold); + setting->setProperty(SHARPNESS_THRESHOLD, m_softness); + setting->setProperty(SOFT_MODE, m_soft); } void KisPressureSharpnessOption::readOptionSetting(const KisPropertiesConfigurationSP setting) { KisCurveOption::readOptionSetting(setting); - m_threshold = setting->getInt(SHARPNESS_THRESHOLD, 4); + m_softness = setting->getInt(SHARPNESS_THRESHOLD, 0); + m_soft = setting->getBool(SOFT_MODE, false); // backward compatibility: test for a "sharpness factor" property // and use this value if it does exist @@ -82,7 +95,7 @@ } } -void KisPressureSharpnessOption::applyThreshold(KisFixedPaintDeviceSP dab) +void KisPressureSharpnessOption::applyThreshold(KisFixedPaintDeviceSP dab, const KisPaintInformation & info) { if (!isChecked()) return; const KoColorSpace * cs = dab->colorSpace(); @@ -92,17 +105,21 @@ quint8* dabPointer = dab->data(); QRect rc = dab->bounds(); + qreal threshold = computeSizeLikeValue(info); + int pixelSize = dab->pixelSize(); int pixelCount = rc.width() * rc.height(); for (int i = 0; i < pixelCount; i++) { quint8 alpha = cs->opacityU8(dabPointer); - if (alpha < (m_threshold * OPACITY_OPAQUE_U8) / 100) { + if (alpha + m_softness < (threshold * OPACITY_OPAQUE_U8 ) ) { cs->setOpacity(dabPointer, OPACITY_TRANSPARENT_U8, 1); } - else { - cs->setOpacity(dabPointer, OPACITY_OPAQUE_U8, 1); + else if (m_soft == false) { + if (alpha - m_softness > (threshold * OPACITY_OPAQUE_U8 ) ) { + cs->setOpacity(dabPointer, OPACITY_OPAQUE_U8, 1); + } } dabPointer += pixelSize; diff --git a/plugins/paintops/libpaintop/kis_pressure_sharpness_option_widget.h b/plugins/paintops/libpaintop/kis_pressure_sharpness_option_widget.h --- a/plugins/paintops/libpaintop/kis_pressure_sharpness_option_widget.h +++ b/plugins/paintops/libpaintop/kis_pressure_sharpness_option_widget.h @@ -23,6 +23,7 @@ #include "kis_curve_option_widget.h" class KisSliderSpinBox; +class QCheckBox; class PAINTOP_EXPORT KisPressureSharpnessOptionWidget : public KisCurveOptionWidget @@ -34,9 +35,11 @@ private Q_SLOTS: void setThreshold(int threshold); + void setSoft(bool soft); private: KisSliderSpinBox* m_threshold; + QCheckBox *m_soft; }; #endif // KIS_PRESSURE_SHARPNESS_OPTION_WIDGET_H diff --git a/plugins/paintops/libpaintop/kis_pressure_sharpness_option_widget.cpp b/plugins/paintops/libpaintop/kis_pressure_sharpness_option_widget.cpp --- a/plugins/paintops/libpaintop/kis_pressure_sharpness_option_widget.cpp +++ b/plugins/paintops/libpaintop/kis_pressure_sharpness_option_widget.cpp @@ -26,6 +26,7 @@ #include #include +#include #include "kis_curve_option_widget.h" #include "kis_pressure_sharpness_option.h" @@ -36,14 +37,18 @@ { setObjectName("KisPressureSharpnessOptionWidget"); - QLabel* thresholdLbl = new QLabel(i18n("Threshold:")); + QLabel* thresholdLbl = new QLabel(i18n("Soft edge:")); m_threshold = new KisSliderSpinBox(); - m_threshold->setRange(1, 100); - m_threshold->setValue(40); - m_threshold->setSingleStep(1); + m_threshold->setRange(0, 100); + m_threshold->setValue(0); + m_threshold->setSingleStep(1); + + m_soft = new QCheckBox(i18n("Soft mode")); + m_soft->setChecked(false); QHBoxLayout* hl = new QHBoxLayout; + hl->addWidget(m_soft); hl->addWidget(thresholdLbl); hl->addWidget(m_threshold, 1); @@ -58,7 +63,11 @@ KisCurveOptionWidget::setConfigurationPage(w); connect(m_threshold, SIGNAL(valueChanged(int)), this, SLOT(setThreshold(int))); + connect(m_soft, SIGNAL(toggled(bool)), this, SLOT(setSoft(bool))); + setThreshold(m_threshold->value()); + setSoft(m_soft->isChecked()); + } void KisPressureSharpnessOptionWidget::setThreshold(int threshold) @@ -66,3 +75,9 @@ static_cast(KisCurveOptionWidget::curveOption())->setThreshold(threshold); emitSettingChanged(); } + +void KisPressureSharpnessOptionWidget::setSoft(bool soft) +{ + static_cast(KisCurveOptionWidget::curveOption())->setSoft(soft); + emitSettingChanged(); +}