Krita Source Code Documentation
Loading...
Searching...
No Matches
KisBrushModel.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2022 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "KisBrushModel.h"
12
13namespace KisBrushModel {
14
15namespace detail {
16
18 const AutoBrushData &autoBrush,
19 const PredefinedBrushData &predefinedBrush,
20 const TextBrushData &textBrush)
21{
22 qreal result = 42;
23
24 switch (type) {
25 case Auto:
26 result = autoBrush.generator.diameter;
27 break;
28 case Predefined:
29 result = predefinedBrush.baseSize.width() * predefinedBrush.scale;
30 break;
31 case Text:
32 result = textBrush.baseSize.width() * textBrush.scale;
33 break;
34 }
35
36 return result;
37}
38
40{
41 QDomElement element;
42
43 QString brushDefinition = setting->getString("brush_definition");
44
45 if (!brushDefinition.isEmpty()) {
46 QDomDocument d;
47 d.setContent(brushDefinition, false);
48 element = d.firstChildElement("Brush");
49 }
50
51 return element;
52}
53
54}
55
57{
58 QDomDocument d;
59 QDomElement e = d.createElement("Brush");
60 KisBrushRegistry::instance()->toXML(d, e, *this);
61 d.appendChild(e);
62 settings->setProperty("brush_definition", d.toString());
63}
64
65std::optional<BrushData> BrushData::read(const KisPropertiesConfiguration *settings, KisResourcesInterfaceSP resourcesInterface)
66{
67 QDomElement element = detail::getBrushXMLElement(settings);
68 return KisBrushRegistry::instance()->createBrushModel(element, resourcesInterface);
69}
70
72{
74
75 if (!data.common.useAutoSpacing && data.common.spacing > 0.5) {
76 l.limitations << KoID("huge-spacing", i18nc("PaintOp instant preview limitation", "Spacing > 0.5, consider disabling Instant Preview"));
77 }
78
79 if (data.type == Auto) {
80 if (!qFuzzyCompare(data.autoBrush.density, 1.0)) {
81 l.limitations << KoID("auto-brush-density", i18nc("PaintOp instant preview limitation", "Brush Density recommended value 100.0"));
82 }
83
84 if (!qFuzzyCompare(data.autoBrush.randomness, 0.0)) {
85 l.limitations << KoID("auto-brush-randomness", i18nc("PaintOp instant preview limitation", "Brush Randomness recommended value 0.0"));
86 }
87 }
88
89 return l;
90}
91
93 const AutoBrushData &autoBrush,
94 const PredefinedBrushData &predefinedBrush,
95 const TextBrushData &textBrush)
96{
97 qreal result = 42;
98
99 switch (type) {
100 case Auto:
101 result = autoBrush.generator.diameter;
102 break;
103 case Predefined:
104 result = predefinedBrush.baseSize.width() * predefinedBrush.scale;
105 break;
106 case Text:
107 result = textBrush.baseSize.width() * textBrush.scale;
108 break;
109 }
110
111 return result;
112}
113
114qreal lightnessModeActivated(BrushType type, const PredefinedBrushData &predefinedBrush)
115{
116 // TODO: use effectiveApplication instead!!!
117 return type == Predefined && predefinedBrush.application == LIGHTNESSMAP;
118}
119
121 AutoBrushData &autoBrush,
122 PredefinedBrushData &predefinedBrush,
123 TextBrushData &textBrush,
124 qreal value)
125{
126 switch (type) {
127 case Auto:
128 autoBrush.generator.diameter = value;
129 break;
130 case Predefined:
131 predefinedBrush.scale = value / predefinedBrush.baseSize.width();
132 break;
133 case Text:
134 textBrush.scale = value / textBrush.baseSize.width();
135 break;
136 }
137}
138
140{
141 return effectiveSizeForBrush(brush.type, brush.autoBrush, brush.predefinedBrush, brush.textBrush);
142}
143
144}
float value(const T *src, size_t ch)
static KisBrushRegistry * instance()
void toXML(QDomDocument &doc, QDomElement &element, const KisBrushModel::BrushData &model)
std::optional< KisBrushModel::BrushData > createBrushModel(const QDomElement &element, KisResourcesInterfaceSP resourcesInterface)
Definition KoID.h:30
static bool qFuzzyCompare(half p1, half p2)
@ LIGHTNESSMAP
Definition kis_brush.h:41
QDomElement getBrushXMLElement(const KisPropertiesConfiguration *setting)
qreal effectiveSizeForBrush(BrushType type, const AutoBrushData &autoBrush, const PredefinedBrushData &predefinedBrush, const TextBrushData &textBrush)
qreal effectiveSizeForBrush(BrushType type, const AutoBrushData &autoBrush, const PredefinedBrushData &predefinedBrush, const TextBrushData &textBrush)
KisPaintopLodLimitations brushLodLimitations(const BrushData &data)
qreal lightnessModeActivated(BrushType type, const PredefinedBrushData &predefinedBrush)
void setEffectiveSizeForBrush(const BrushType type, AutoBrushData &autoBrush, PredefinedBrushData &predefinedBrush, TextBrushData &textBrush, qreal value)
AutoBrushGeneratorData generator
void write(KisPropertiesConfiguration *settings) const
static std::optional< BrushData > read(const KisPropertiesConfiguration *settings, KisResourcesInterfaceSP resourcesInterface)
PredefinedBrushData predefinedBrush
QString getString(const QString &name, const QString &def=QString()) const
virtual void setProperty(const QString &name, const QVariant &value)