Krita Source Code Documentation
Loading...
Searching...
No Matches
PatternGeneratorConfiguration Class Reference
+ Inheritance diagram for PatternGeneratorConfiguration:

Public Member Functions

virtual KisFilterConfigurationSP clone () const override
 
QList< KoResourceLoadResultlinkedResources (KisResourcesInterfaceSP globalResourcesInterface) const override
 
KoPatternSP pattern () const
 
KoResourceLoadResult pattern (KisResourcesInterfaceSP resourcesInterface) const
 
 PatternGeneratorConfiguration (const PatternGeneratorConfiguration &rhs)
 
 PatternGeneratorConfiguration (const QString &name, qint32 version, KisResourcesInterfaceSP resourcesInterface)
 
QTransform transform () const
 
- Public Member Functions inherited from KisFilterConfiguration
QBitArray channelFlags () const
 
KisFilterConfigurationSP cloneWithResourcesSnapshot (KisResourcesInterfaceSP globalResourcesInterface=nullptr) const
 
virtual bool compareTo (const KisPropertiesConfiguration *rhs) const override
 
void createLocalResourcesSnapshot (KisResourcesInterfaceSP globalResourcesInterface=nullptr)
 
virtual QList< KoResourceLoadResultembeddedResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
virtual void fromLegacyXML (const QDomElement &)
 
void fromXML (const QDomElement &) override
 
void fromXML (const QDomElement &) override
 
bool fromXML (const QString &xml, bool clear=true) override
 
bool hasLocalResourcesSnapshot () const
 
virtual bool isCompatible (const KisPaintDeviceSP) const
 
 KisFilterConfiguration (const QString &name, qint32 version, KisResourcesInterfaceSP resourcesInterface)
 
const QString & name () const
 
 Private (const Private &rhs)
 
 Private (const QString &_name, qint32 _version, KisResourcesInterfaceSP _resourcesInterface)
 
QList< KoResourceLoadResultrequiredResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
KisResourcesInterfaceSP resourcesInterface () const
 
void setChannelFlags (QBitArray channelFlags)
 
virtual void setResourcesInterface (KisResourcesInterfaceSP resourcesInterface)
 
QString toXML () const override
 
void toXML (QDomDocument &, QDomElement &) const override
 
void toXML (QDomDocument &, QDomElement &) const override
 
qint32 version () const
 
 ~KisFilterConfiguration () override
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisPropertiesConfiguration
void clearProperties ()
 Clear the map of properties.
 
virtual void dump () const
 
void fromXML (const QDomElement &) override
 
bool fromXML (const QString &xml, bool clear=true) override
 
bool getBool (const QString &name, bool def=false) const
 
KoColor getColor (const QString &name, const KoColor &color=KoColor()) const
 getColor fetch the given property as a KoColor.
 
KisCubicCurve getCubicCurve (const QString &name, const KisCubicCurve &curve=KisCubicCurve()) const
 
double getDouble (const QString &name, double def=0.0) const
 
float getFloat (const QString &name, float def=0.0) const
 
int getInt (const QString &name, int def=0) const
 
void getPrefixedProperties (const QString &prefix, KisPropertiesConfiguration *config) const
 
void getPrefixedProperties (const QString &prefix, KisPropertiesConfigurationSP config) const
 
virtual QMap< QString, QVariant > getProperties () const
 
virtual QList< QString > getPropertiesKeys () const
 
virtual QVariant getProperty (const QString &name) const
 
virtual bool getProperty (const QString &name, QVariant &value) const
 
QString getPropertyLazy (const QString &name, const char *defaultValue) const
 
QStringList getPropertyLazy (const QString &name, const QStringList &defaultValue) const
 
template<typename T >
getPropertyLazy (const QString &name, const T &defaultValue) const
 
QString getString (const QString &name, const QString &def=QString()) const
 
QStringList getStringList (const QString &name, const QStringList &defaultValue=QStringList()) const
 
virtual bool hasProperty (const QString &name) const
 
 KisPropertiesConfiguration ()
 
 KisPropertiesConfiguration (const KisPropertiesConfiguration &rhs)
 
KisPropertiesConfigurationoperator= (const KisPropertiesConfiguration &rhs)
 
void removeProperty (const QString &name)
 
void setPrefixedProperties (const QString &prefix, const KisPropertiesConfiguration *config)
 
void setPrefixedProperties (const QString &prefix, const KisPropertiesConfigurationSP config)
 
void setProperty (const QString &name, const QStringList &value)
 
virtual void setProperty (const QString &name, const QVariant &value)
 
void setPropertyNotSaved (const QString &name)
 Marks a property that should not be saved by toXML.
 
QString toXML () const override
 
void toXML (QDomDocument &, QDomElement &) const override
 
 ~KisPropertiesConfiguration () override
 
- Public Member Functions inherited from KisSerializableConfiguration
 KisSerializableConfiguration ()
 
 KisSerializableConfiguration (const KisSerializableConfiguration &rhs)
 
virtual ~KisSerializableConfiguration ()
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Additional Inherited Members

- Static Public Member Functions inherited from KisPropertiesConfiguration
static QString escapeString (const QString &string)
 
static QString extractedPrefixKey ()
 
static QString unescapeString (const QString &string)
 
- Public Attributes inherited from KisFilterConfiguration
QBitArray channelFlags
 
QString name
 
KisResourcesInterfaceSP resourcesInterface = 0
 
qint32 version
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Public Attributes inherited from KisPropertiesConfiguration
QSet< QString > notSavedProperties
 
QMap< QString, QVariant > properties
 
- Protected Member Functions inherited from KisFilterConfiguration
 KisFilterConfiguration (const KisFilterConfiguration &rhs)
 
void setVersion (qint32 version)
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Detailed Description

Definition at line 55 of file patterngenerator.cpp.

Constructor & Destructor Documentation

◆ PatternGeneratorConfiguration() [1/2]

PatternGeneratorConfiguration::PatternGeneratorConfiguration ( const QString & name,
qint32 version,
KisResourcesInterfaceSP resourcesInterface )
inline

Definition at line 58 of file patterngenerator.cpp.

60 {
61 }
KisFilterConfiguration(const QString &name, qint32 version, KisResourcesInterfaceSP resourcesInterface)
KisResourcesInterfaceSP resourcesInterface

◆ PatternGeneratorConfiguration() [2/2]

PatternGeneratorConfiguration::PatternGeneratorConfiguration ( const PatternGeneratorConfiguration & rhs)
inline

Definition at line 63 of file patterngenerator.cpp.

65 {
66 }

Member Function Documentation

◆ clone()

virtual KisFilterConfigurationSP PatternGeneratorConfiguration::clone ( ) const
inlineoverridevirtual
Returns
an exact copy of the filter configuration. Resources interface is becomes shared between two configuration objects.

Reimplemented from KisFilterConfiguration.

Definition at line 68 of file patterngenerator.cpp.

68 {
69 return new PatternGeneratorConfiguration(*this);
70 }
PatternGeneratorConfiguration(const QString &name, qint32 version, KisResourcesInterfaceSP resourcesInterface)

References PatternGeneratorConfiguration().

◆ linkedResources()

QList< KoResourceLoadResult > PatternGeneratorConfiguration::linkedResources ( KisResourcesInterfaceSP globalResourcesInterface) const
inlineoverridevirtual
Returns
all the resources that are needed but (*this) filter and are not embedded into it. The resources are fetched from globalResourcesInterface. If fetching of some resources is failed, then (*this) filter is invalid.

Reimplemented from KisFilterConfiguration.

Definition at line 185 of file patterngenerator.cpp.

186 {
187 return {pattern(globalResourcesInterface)};
188 }

References pattern().

◆ pattern() [1/2]

KoPatternSP PatternGeneratorConfiguration::pattern ( ) const
inline

Definition at line 82 of file patterngenerator.cpp.

82 {
83 return pattern(resourcesInterface()).resource<KoPattern>();
84 }
Write API docs here.
Definition KoPattern.h:21

References pattern(), and KisFilterConfiguration::resourcesInterface.

◆ pattern() [2/2]

KoResourceLoadResult PatternGeneratorConfiguration::pattern ( KisResourcesInterfaceSP resourcesInterface) const
inline

Definition at line 72 of file patterngenerator.cpp.

73 {
74 const QString patternMD5 = getString("md5sum", "");
75 const QString patternName = getString("pattern", "Grid01.pat");
76 const QString patternFileName = getString("fileName", "");
78 KoResourceLoadResult res = source.bestMatchLoadResult(patternMD5, patternFileName, patternName);
79 return res;
80 }
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
const QString Patterns
QString getString(const QString &name, const QString &def=QString()) const

References KisPropertiesConfiguration::getString(), ResourceType::Patterns, KisFilterConfiguration::resourcesInterface, and source().

◆ transform()

QTransform PatternGeneratorConfiguration::transform ( ) const
inline

Definition at line 86 of file patterngenerator.cpp.

86 {
87 const bool constrainScale = getBool("transform_keep_scale_aspect", true);
88 const qreal scaleX = getDouble("transform_scale_x", 1.0);
89 // Ensure that the size y component is equal to the x component if keepSizeSquare is true
90 const qreal scaleY = constrainScale ? scaleX : getDouble("transform_scale_y", 1.0);
91 const qreal positionX = getInt("transform_offset_x", 0);
92 const qreal positionY = getInt("transform_offset_y", 0);
93 const qreal shearX = getDouble("transform_shear_x", 0.0);
94 const qreal shearY = getDouble("transform_shear_y", 0.0);
95 const qreal rotationX = getDouble("transform_rotation_x", 0.0);
96 const qreal rotationY = getDouble("transform_rotation_y", 0.0);
97 const qreal rotationZ = getDouble("transform_rotation_z", 0.0);
98 const bool align = getBool("transform_align_to_pixel_grid", false);
99 const qint32 alignX = getInt("transform_align_to_pixel_grid_x", 1);
100 const qint32 alignY = getInt("transform_align_to_pixel_grid_y", 1);
101
102 QTransform transform;
103
104 if (align && qFuzzyIsNull(rotationX) && qFuzzyIsNull(rotationY) && pattern()) {
105 // STEP 1: compose the transformation
106 transform.shear(shearX, shearY);
107 transform.scale(scaleX, scaleY);
108 transform.rotate(rotationZ);
109 // STEP 2: transform the horizontal and vertical vectors of the
110 // "repetition rect" (which size is some multiple of the
111 // pattern size)
112 const QSizeF repetitionRectSize(
113 static_cast<qreal>(alignX * pattern()->width()),
114 static_cast<qreal>(alignY * pattern()->height())
115 );
116 // u1 is the unaligned vector that goes from the origin to the top-right
117 // corner of the repetition rect. u2 is the unaligned vector that
118 // goes from the origin to the bottom-left corner of the repetition rect
119 const QPointF u1 = transform.map(QPointF(repetitionRectSize.width(), 0.0));
120 const QPointF u2 = transform.map(QPointF(0.0, repetitionRectSize.height()));
121 // STEP 3: align the transformed vectors to the pixel grid. v1 is
122 // the aligned version of u1 and v2 is the aligned version of u2
123 QPointF v1(qRound(u1.x()), qRound(u1.y()));
124 QPointF v2(qRound(u2.x()), qRound(u2.y()));
125 // If the following condition is met, that means that the pattern is
126 // transformed in such a way that the repetition rect corners are
127 // colinear so we move v1 or v2 to a neighbor position
128 if (qFuzzyCompare(v1.y() * v2.x(), v2.y() * v1.x()) &&
129 !qFuzzyIsNull(v1.x() * v2.x() + v1.y() * v2.y())) {
130 // Choose point to move based on distance from non aligned point to
131 // aligned point
132 const qreal dist1 = kisSquareDistance(u1, v1);
133 const qreal dist2 = kisSquareDistance(u2, v2);
134 const QPointF *p_u = dist1 > dist2 ? &u1 : &u2;
135 QPointF *p_v = dist1 > dist2 ? &v1 : &v2;
136 // Then we get the closest pixel aligned point to the current,
137 // colinear, point
138 QPair<int, qreal> dists[4]{
139 {1, kisSquareDistance(*p_u, *p_v + QPointF(0.0, -1.0))},
140 {2, kisSquareDistance(*p_u, *p_v + QPointF(1.0, 0.0))},
141 {3, kisSquareDistance(*p_u, *p_v + QPointF(0.0, 1.0))},
142 {4, kisSquareDistance(*p_u, *p_v + QPointF(-1.0, 0.0))}
143 };
144 std::sort(
145 std::begin(dists), std::end(dists),
146 [](const QPair<int, qreal> &a, const QPair<int, qreal> &b)
147 {
148 return a.second < b.second;
149 }
150 );
151 // Move the point
152 if (dists[0].first == 1) {
153 p_v->setY(p_v->y() - 1.0);
154 } else if (dists[0].first == 2) {
155 p_v->setX(p_v->x() + 1.0);
156 } else if (dists[0].first == 3) {
157 p_v->setY(p_v->y() + 1.0);
158 } else {
159 p_v->setX(p_v->x() - 1.0);
160 }
161 }
162 // STEP 4: get the transform that maps the aligned vectors to the
163 // untransformed rect (this is in fact the inverse transform)
164 QPolygonF quad;
165 quad.append(QPointF(0, 0));
166 quad.append(v1 / repetitionRectSize.width());
167 quad.append(v1 / repetitionRectSize.width() + v2 / repetitionRectSize.height());
168 quad.append(v2 / repetitionRectSize.height());
169 QTransform::quadToSquare(quad, transform);
170 // STEP 5: get the forward transform
171 transform = transform.inverted();
172 transform.translate(qRound(positionX), qRound(positionY));
173 } else {
174 transform.shear(shearX, shearY);
175 transform.scale(scaleX, scaleY);
176 transform.rotate(rotationX, Qt::XAxis);
177 transform.rotate(rotationY, Qt::YAxis);
178 transform.rotate(rotationZ, Qt::ZAxis);
179 transform.translate(positionX, positionY);
180 }
181
182 return transform;
183 }
static bool qFuzzyCompare(half p1, half p2)
static bool qFuzzyIsNull(half h)
qreal kisSquareDistance(const QPointF &pt1, const QPointF &pt2)
Definition kis_global.h:194
bool getBool(const QString &name, bool def=false) const
int getInt(const QString &name, int def=0) const
double getDouble(const QString &name, double def=0.0) const

References KisPropertiesConfiguration::getBool(), KisPropertiesConfiguration::getDouble(), KisPropertiesConfiguration::getInt(), kisSquareDistance(), pattern(), qFuzzyCompare(), qFuzzyIsNull(), and transform().


The documentation for this class was generated from the following file: