• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • krita API Reference
  • KDE Home
  • Contact Us
 

plugins/paintops/libpaintop

  • sources
  • kfour-appscomplete
  • krita
  • plugins
  • paintops
  • libpaintop
kis_pressure_sharpness_option.cpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2010 Lukáš Tvrdý <[email protected]>
3  *
4  * SPDX-License-Identifier: LGPL-2.0-or-later
5  */
6 
7 #include "kis_pressure_sharpness_option.h"
8 
9 #include <klocalizedstring.h>
10 
11 #include <widgets/kis_curve_widget.h>
12 
13 #include <KoColor.h>
14 #include <KoColorSpace.h>
15 #include <kis_fixed_paint_device.h>
16 #include <brushengine/kis_paintop.h>
17 
18 KisPressureSharpnessOption::KisPressureSharpnessOption()
19  : KisCurveOption("Sharpness", KisPaintOpOption::GENERAL, false)
20  , m_softness(0)
21 {
22 }
23 
24 void KisPressureSharpnessOption::writeOptionSetting(KisPropertiesConfigurationSP setting) const
25 {
26  KisCurveOption::writeOptionSetting(setting);
27  setting->setProperty(SHARPNESS_SOFTNESS, m_softness);
28 }
29 
30 void KisPressureSharpnessOption::readOptionSetting(const KisPropertiesConfigurationSP setting)
31 {
32  KisCurveOption::readOptionSetting(setting);
33  m_softness = quint32(setting->getInt(SHARPNESS_SOFTNESS));
34 
35  // backward compatibility: test for a "sharpness factor" property
36  // and use this value if it does exist
37  if (setting->hasProperty(SHARPNESS_FACTOR) && !setting->hasProperty("SharpnessValue")) {
38  KisCurveOption::setValue(setting->getDouble(SHARPNESS_FACTOR));
39  m_softness = quint32(setting->getDouble(SHARPNESS_FACTOR) * 100);
40  }
41 
42 }
43 
44 void KisPressureSharpnessOption::apply(const KisPaintInformation &info, const QPointF &pt, qint32 &x, qint32 &y, qreal &xFraction, qreal &yFraction) const
45 {
46  if (!isChecked() || KisCurveOption::value() == 0.0) {
47  // brush
48  KisPaintOp::splitCoordinate(pt.x(), &x, &xFraction);
49  KisPaintOp::splitCoordinate(pt.y(), &y, &yFraction);
50  }
51  else {
52  qreal processedSharpness = computeSizeLikeValue(info);
53 
54  if (processedSharpness == 1.0) {
55  // pen
56  xFraction = 0.0;
57  yFraction = 0.0;
58  x = qRound(pt.x());
59  y = qRound(pt.y());
60  }
61  else {
62  // something in between
63  qint32 xi = qRound(pt.x());
64  qint32 yi = qRound(pt.y());
65 
66  qreal xf = processedSharpness * xi + (1.0 - processedSharpness) * pt.x();
67  qreal yf = processedSharpness * yi + (1.0 - processedSharpness) * pt.y();
68 
69  KisPaintOp::splitCoordinate(xf, &x, &xFraction);
70  KisPaintOp::splitCoordinate(yf, &y, &yFraction);
71  }
72  }
73 }
74 
75 void KisPressureSharpnessOption::applyThreshold(KisFixedPaintDeviceSP dab, const KisPaintInformation & info)
76 {
77  if (!isChecked()) return;
78  const KoColorSpace * cs = dab->colorSpace();
79 
80  // Set all alpha > opaque/2 to opaque, the rest to transparent.
81  // XXX: Using 4/10 as the 1x1 circle brush paints nothing with 0.5.
82  quint8* dabPointer = dab->data();
83  QRect rc = dab->bounds();
84 
85  qreal threshold = computeSizeLikeValue(info);
86 
87  quint32 pixelSize = dab->pixelSize();
88  int pixelCount = rc.width() * rc.height();
89 
90  quint32 tolerance = quint32(OPACITY_OPAQUE_U8 - (threshold * OPACITY_OPAQUE_U8));
91 
92  for (int i = 0; i < pixelCount; i++) {
93  quint8 opacity = cs->opacityU8(dabPointer);
94 
95  // Check what pixel goes sharp
96  if (opacity > (tolerance) ) {
97  cs->setOpacity(dabPointer, OPACITY_OPAQUE_U8, 1);
98  } else {
99  // keep original value if in soft range
100  if (opacity <= (100 - m_softness) * tolerance / 100) {
101  cs->setOpacity(dabPointer, OPACITY_TRANSPARENT_U8, 1);
102  }
103  }
104  dabPointer += pixelSize;
105  }
106 }
KisCurveOption::value
qreal value() const
Definition: kis_curve_option.cpp:99
KisCurveOption
KisCurveOption is the base class for paintop options that are defined through one or more curves.
Definition: kis_curve_option.h:34
KisCurveOption::writeOptionSetting
virtual void writeOptionSetting(KisPropertiesConfigurationSP setting) const
Definition: kis_curve_option.cpp:113
SHARPNESS_SOFTNESS
const QString SHARPNESS_SOFTNESS
Definition: kis_pressure_sharpness_option.h:16
QRect
QRect::width
int width() const
KisCurveOption::setValue
void setValue(qreal value)
Definition: kis_curve_option.cpp:390
QPointF
KisPressureSharpnessOption::KisPressureSharpnessOption
KisPressureSharpnessOption()
Definition: kis_pressure_sharpness_option.cpp:18
KisPressureSharpnessOption::threshold
qint32 threshold()
Definition: kis_pressure_sharpness_option.h:43
KisCurveOption::computeSizeLikeValue
qreal computeSizeLikeValue(const KisPaintInformation &info) const
Definition: kis_curve_option.cpp:461
KisCurveOption::readOptionSetting
virtual void readOptionSetting(KisPropertiesConfigurationSP setting)
Definition: kis_curve_option.cpp:143
SHARPNESS_FACTOR
const QString SHARPNESS_FACTOR
Definition: kis_pressure_sharpness_option.h:15
KisCurveOption::isChecked
bool isChecked() const
Definition: kis_curve_option.cpp:319
QRect::height
int height() const
QPointF::x
qreal x() const
QPointF::y
qreal y() const
KisPressureSharpnessOption::readOptionSetting
void readOptionSetting(const KisPropertiesConfigurationSP setting) override
Definition: kis_pressure_sharpness_option.cpp:30
KisPaintOpOption
KisPressureSharpnessOption::applyThreshold
void applyThreshold(KisFixedPaintDeviceSP dab, const KisPaintInformation &info)
Apply threshold specified by user.
Definition: kis_pressure_sharpness_option.cpp:75
KisPressureSharpnessOption::writeOptionSetting
void writeOptionSetting(KisPropertiesConfigurationSP setting) const override
Definition: kis_pressure_sharpness_option.cpp:24
kis_pressure_sharpness_option.h
KisPressureSharpnessOption::apply
void apply(const KisPaintInformation &info, const QPointF &pt, qint32 &x, qint32 &y, qreal &xFraction, qreal &yFraction) const
First part of the sharpness is the coordinates: in pen mode they are integers without fractions.
Definition: kis_pressure_sharpness_option.cpp:44
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Sat Apr 17 2021 23:38:22 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

plugins/paintops/libpaintop

Skip menu "plugins/paintops/libpaintop"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

krita API Reference

Skip menu "krita API Reference"
  • libs
  •   KritaBasicFlakes
  •   brush
  •   KritaUndo2
  •   KritaFlake
  •   image
  •   KritaPlugin
  •   Krita
  •   KritaPigment
  •   KritaResources
  •   KritaStore
  •   ui
  •   KritaWidgets
  •   KritaWidgetUtils
  • plugins
  •   Assitants
  •   Extensions
  •   Filters
  •   Generators
  •   Formats
  •           src
  •   PaintOps
  •     libpaintop

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal