diff --git a/plugins/paintops/libpaintop/KisDabCacheUtils.cpp b/plugins/paintops/libpaintop/KisDabCacheUtils.cpp --- a/plugins/paintops/libpaintop/KisDabCacheUtils.cpp +++ b/plugins/paintops/libpaintop/KisDabCacheUtils.cpp @@ -106,7 +106,7 @@ DabRenderingResources *resources) { if (resources->sharpnessOption) { - resources->sharpnessOption->applyThreshold(dab); + resources->sharpnessOption->applyThreshold(dab, info); } if (resources->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 @@ -25,9 +25,8 @@ #include #include - const QString SHARPNESS_FACTOR = "Sharpness/factor"; -const QString SHARPNESS_THRESHOLD = "Sharpness/threshold"; +const QString SHARPNESS_SOFTNESS = "Sharpness/softness"; /** * This option is responsible to mimic pencil effect from former Pixel Pencil brush engine.auto @@ -45,17 +44,17 @@ /** * 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, quint32(threshold), 100); } qint32 threshold() { - return m_threshold; + return qint32(m_softness); } void setSharpnessFactor(qreal factor) { @@ -66,7 +65,7 @@ } private: - qint32 m_threshold {40}; + quint32 m_softness {0}; }; #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 @@ -30,24 +30,28 @@ KisPressureSharpnessOption::KisPressureSharpnessOption() : KisCurveOption("Sharpness", KisPaintOpOption::GENERAL, false) + , m_softness(0) { } void KisPressureSharpnessOption::writeOptionSetting(KisPropertiesConfigurationSP setting) const { KisCurveOption::writeOptionSetting(setting); - setting->setProperty(SHARPNESS_THRESHOLD, m_threshold); + setting->setProperty(SHARPNESS_SOFTNESS, m_softness); } void KisPressureSharpnessOption::readOptionSetting(const KisPropertiesConfigurationSP setting) { KisCurveOption::readOptionSetting(setting); - m_threshold = setting->getInt(SHARPNESS_THRESHOLD, 4); + m_softness = quint32(setting->getInt(SHARPNESS_SOFTNESS)); // backward compatibility: test for a "sharpness factor" property // and use this value if it does exist - if (setting->hasProperty(SHARPNESS_FACTOR) && !setting->hasProperty("SharpnessValue")) + if (setting->hasProperty(SHARPNESS_FACTOR) && !setting->hasProperty("SharpnessValue")) { KisCurveOption::setValue(setting->getDouble(SHARPNESS_FACTOR)); + m_softness = quint32(setting->getDouble(SHARPNESS_FACTOR) * 100); + } + } void KisPressureSharpnessOption::apply(const KisPaintInformation &info, const QPointF &pt, qint32 &x, qint32 &y, qreal &xFraction, qreal &yFraction) const @@ -81,7 +85,7 @@ } } -void KisPressureSharpnessOption::applyThreshold(KisFixedPaintDeviceSP dab) +void KisPressureSharpnessOption::applyThreshold(KisFixedPaintDeviceSP dab, const KisPaintInformation & info) { if (!isChecked()) return; const KoColorSpace * cs = dab->colorSpace(); @@ -91,19 +95,25 @@ quint8* dabPointer = dab->data(); QRect rc = dab->bounds(); - int pixelSize = dab->pixelSize(); + qreal threshold = computeSizeLikeValue(info); + + quint32 pixelSize = dab->pixelSize(); int pixelCount = rc.width() * rc.height(); + quint32 tolerance = quint32(OPACITY_OPAQUE_U8 - (threshold * OPACITY_OPAQUE_U8)); + for (int i = 0; i < pixelCount; i++) { - quint8 alpha = cs->opacityU8(dabPointer); + quint8 opacity = cs->opacityU8(dabPointer); - if (alpha < (m_threshold * OPACITY_OPAQUE_U8) / 100) { - cs->setOpacity(dabPointer, OPACITY_TRANSPARENT_U8, 1); - } - else { + // Check what pixel goes sharp + if (opacity > (tolerance) ) { cs->setOpacity(dabPointer, OPACITY_OPAQUE_U8, 1); + } else { + // keep original value if in soft range + if (opacity <= (100 - m_softness) * tolerance / 100) { + cs->setOpacity(dabPointer, OPACITY_TRANSPARENT_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 @@ -24,19 +24,20 @@ class KisSliderSpinBox; - class PAINTOP_EXPORT KisPressureSharpnessOptionWidget : public KisCurveOptionWidget { Q_OBJECT public: KisPressureSharpnessOptionWidget(); + void readOptionSetting(const KisPropertiesConfigurationSP setting) override; + private Q_SLOTS: void setThreshold(int threshold); private: - KisSliderSpinBox* m_threshold; + KisSliderSpinBox* m_softenedge; }; #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 @@ -36,16 +36,16 @@ { setObjectName("KisPressureSharpnessOptionWidget"); - QLabel* thresholdLbl = new QLabel(i18n("Threshold:")); - - m_threshold = new KisSliderSpinBox(); - m_threshold->setRange(1, 100); - m_threshold->setValue(40); - m_threshold->setSingleStep(1); + QLabel* thresholdLbl = new QLabel(i18n("Soften edge:")); + m_softenedge = new KisSliderSpinBox(); + m_softenedge->setRange(0, 100); + m_softenedge->setValue(0); // Sets old behaviour + m_softenedge->setSingleStep(1); QHBoxLayout* hl = new QHBoxLayout; + hl->setMargin(9); hl->addWidget(thresholdLbl); - hl->addWidget(m_threshold, 1); + hl->addWidget(m_softenedge, 1); QVBoxLayout* vl = new QVBoxLayout; vl->setMargin(0); @@ -55,14 +55,21 @@ QWidget* w = new QWidget; w->setLayout(vl); - KisCurveOptionWidget::setConfigurationPage(w); + connect(m_softenedge, SIGNAL(valueChanged(int)), SLOT(setThreshold(int))); + + setConfigurationPage(w); - connect(m_threshold, SIGNAL(valueChanged(int)), this, SLOT(setThreshold(int))); - setThreshold(m_threshold->value()); + setThreshold(m_softenedge->value()); +} + +void KisPressureSharpnessOptionWidget::readOptionSetting(const KisPropertiesConfigurationSP setting) +{ + KisCurveOptionWidget::readOptionSetting(setting); + m_softenedge->setValue(static_cast(curveOption())->threshold()); } void KisPressureSharpnessOptionWidget::setThreshold(int threshold) { - static_cast(KisCurveOptionWidget::curveOption())->setThreshold(threshold); + static_cast(curveOption())->setThreshold(threshold); emitSettingChanged(); }