Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_grid_config.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "kis_grid_config.h"
8
9#include <QDomElement>
10#include <QtMath>
11
12#include "kis_config.h"
13#include "kis_dom_utils.h"
14#include "kis_algebra_2d.h"
16
18 qRegisterMetaType<KisGridConfig>("KisGridConfig");
19}
20
21Q_GLOBAL_STATIC(KisGridConfig, staticDefaultObject)
22
24{
25 staticDefaultObject->loadStaticData();
26 return *staticDefaultObject;
27}
28
29void KisGridConfig::transform(const QTransform &transform)
30{
31 if (transform.type() >= QTransform::TxShear) return;
32
34
36 QTransform t = m.scaleTransform();
37
38 const qreal eps = 1e-3;
39 const qreal wrappedRotation = KisAlgebra2D::wrapValue(m.angle, 90.0);
40 if (wrappedRotation <= eps || wrappedRotation >= 90.0 - eps) {
41 t *= m.rotateTransform();
42 }
43
45 // Transform map may round spacing down to 0, but it must be at least 1
46 m_spacing.setX(qMax(1, m_spacing.x()));
47 m_spacing.setY(qMax(1, m_spacing.y()));
48
49 } else if (m_gridType == GRID_ISOMETRIC_LEGACY) {
50 if (qFuzzyCompare(m.scaleX, m.scaleY)) {
51 m_cellSpacing = qRound(qAbs(m_cellSpacing * m.scaleX));
52 }
53 }
55}
56
71
82
83QDomElement KisGridConfig::saveDynamicDataToXml(QDomDocument& doc, const QString &tag) const
84{
85 QDomElement gridElement = doc.createElement(tag);
86 KisDomUtils::saveValue(&gridElement, "showGrid", m_showGrid);
87 KisDomUtils::saveValue(&gridElement, "snapToGrid", m_snapToGrid);
88 KisDomUtils::saveValue(&gridElement, "offsetActive", m_offsetActive);
89 KisDomUtils::saveValue(&gridElement, "offset", m_offset);
90 KisDomUtils::saveValue(&gridElement, "spacing", m_spacing);
91 KisDomUtils::saveValue(&gridElement, "xSpacingActive", m_xSpacingActive);
92 KisDomUtils::saveValue(&gridElement, "ySpacingActive", m_ySpacingActive);
93 KisDomUtils::saveValue(&gridElement, "offsetAspectLocked", m_offsetAspectLocked);
94 KisDomUtils::saveValue(&gridElement, "spacingAspectLocked", m_spacingAspectLocked);
95 KisDomUtils::saveValue(&gridElement, "subdivision", m_subdivision);
96 KisDomUtils::saveValue(&gridElement, "angleLeft", m_angleLeft);
97 KisDomUtils::saveValue(&gridElement, "angleRight", m_angleRight);
98 KisDomUtils::saveValue(&gridElement, "angleLeftActive", m_angleLeftActive);
99 KisDomUtils::saveValue(&gridElement, "angleRightActive", m_angleRightActive);
100 KisDomUtils::saveValue(&gridElement, "angleAspectLocked", m_angleAspectLocked);
101 KisDomUtils::saveValue(&gridElement, "cellSpacing", m_cellSpacing);
102 KisDomUtils::saveValue(&gridElement, "cellSize", m_cellSize);
103 KisDomUtils::saveValue(&gridElement, "gridType", m_gridType);
104
105 KisDomUtils::saveValue(&gridElement, "colorMain", m_colorMain);
106 KisDomUtils::saveValue(&gridElement, "colorSubdivision", m_colorSubdivision);
107 KisDomUtils::saveValue(&gridElement, "colorVertical", m_colorIsoVertical);
108 KisDomUtils::saveValue(&gridElement, "lineTypeMain", m_lineTypeMain);
109 KisDomUtils::saveValue(&gridElement, "lineTypeSubdivision", m_lineTypeSubdivision);
110 KisDomUtils::saveValue(&gridElement, "lineTypeVertical", m_lineTypeIsoVertical);
111
112 return gridElement;
113}
114
115bool KisGridConfig::loadDynamicDataFromXml(const QDomElement &gridElement)
116{
117 KisConfig cfg(true);
118 bool result = true;
119
120 result &= KisDomUtils::loadValue(gridElement, "showGrid", &m_showGrid);
121 result &= KisDomUtils::loadValue(gridElement, "snapToGrid", &m_snapToGrid);
122 result &= KisDomUtils::loadValue(gridElement, "offset", &m_offset);
123 result &= KisDomUtils::loadValue(gridElement, "spacing", &m_spacing);
124 result &= KisDomUtils::loadValue(gridElement, "offsetAspectLocked", &m_offsetAspectLocked);
125 result &= KisDomUtils::loadValue(gridElement, "spacingAspectLocked", &m_spacingAspectLocked);
126 result &= KisDomUtils::loadValue(gridElement, "subdivision", &m_subdivision);
127 result &= KisDomUtils::loadValue(gridElement, "angleLeft", &m_angleLeft);
128 result &= KisDomUtils::loadValue(gridElement, "angleRight", &m_angleRight);
129 result &= KisDomUtils::loadValue(gridElement, "cellSpacing", &m_cellSpacing);
130 result &= KisDomUtils::loadValue(gridElement, "gridType", (int*)(&m_gridType));
131
132 // following variables may not be present in older files; do not update result variable
133 KisDomUtils::loadValue(gridElement, "offsetActive", &m_offsetActive);
134 KisDomUtils::loadValue(gridElement, "xSpacingActive", &m_xSpacingActive);
135 KisDomUtils::loadValue(gridElement, "ySpacingActive", &m_ySpacingActive);
136 KisDomUtils::loadValue(gridElement, "angleLeftActive", &m_angleLeftActive);
137 KisDomUtils::loadValue(gridElement, "angleRightActive", &m_angleRightActive);
138 KisDomUtils::loadValue(gridElement, "angleAspectLocked", &m_angleAspectLocked);
139 KisDomUtils::loadValue(gridElement, "cellSize", &m_cellSize);
140
141 int lineTypeMain = cfg.getGridMainStyle();
142 KisDomUtils::loadValue(gridElement, "lineTypeMain", &lineTypeMain);
144
146 KisDomUtils::loadValue(gridElement, "lineTypeSubdivision", &lineTypeSubdivision);
148
150 KisDomUtils::loadValue(gridElement, "lineTypeVertical", &lineTypeVertical);
152
154 KisDomUtils::loadValue(gridElement, "colorMain", &m_colorMain);
155
157 KisDomUtils::loadValue(gridElement, "colorSubdivision", &m_colorSubdivision);
158
160 KisDomUtils::loadValue(gridElement, "colorVertical", &m_colorIsoVertical);
161
166
167 return result;
168}
169
170void KisGridConfig::updatePenStyle(QPen *pen, QColor color, LineTypeInternal type)
171{
172 pen->setColor(color);
173
174 if (type == LINE_DASHED) {
175 QVector<qreal> dashes;
176 dashes << 5 << 5;
177 pen->setDashPattern(dashes);
178 } else if (type == LINE_DOTTED) {
179 pen->setStyle(Qt::DotLine);
180 } else if (type == LINE_NONE) {
181 pen->setStyle(Qt::NoPen);
182 } else {
183 // assume it's SOLID by default
184 pen->setStyle(Qt::SolidLine);
185 }
186}
187
189{
190 // Here some variable needed to render grid that can be calculated when grid settings in done, instead
191 // of doing recalculation on every canvas refresh
192 const qreal cosAngleRight = qCos(qDegreesToRadians(m_angleRight));
193 const qreal cosAngleLeft = qCos(qDegreesToRadians(m_angleLeft));
194
195 m_trigoCache.tanAngleRight = qTan(qDegreesToRadians(m_angleRight));
196 m_trigoCache.correctedAngleRightCellSize = m_cellSize * (qSin(qDegreesToRadians(m_angleLeft)) + cosAngleLeft * m_trigoCache.tanAngleRight);
197 if (m_angleRight > 0.0) {
199 } else {
201 }
202
203 m_trigoCache.tanAngleLeft = qTan(qDegreesToRadians(m_angleLeft));
204 m_trigoCache.correctedAngleLeftCellSize = m_cellSize * (qSin(qDegreesToRadians(m_angleRight)) + cosAngleRight * m_trigoCache.tanAngleLeft);
205 if (m_angleLeft > 0.0) {
207 } else {
209 }
210
212 m_trigoCache.verticalSpace = m_subdivision * m_cellSize * (cosAngleLeft + cosAngleRight) / 2;
213 } else {
214 // allow vertical grid line only if angle left and right are the same
216 }
217}
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
void setGridSubdivisionColor(const QColor &v) const
QPoint getDefaultGridSpacing(bool defaultValue=false) const
void setGridSubdivisionStyle(quint32 v) const
void setGridIsoVerticalStyle(quint32 v) const
quint32 getGridMainStyle(bool defaultValue=false) const
QColor getGridMainColor(bool defaultValue=false) const
void setGridMainStyle(quint32 v) const
void setGridIsoVerticalColor(const QColor &v) const
quint32 getGridIsoVerticalStyle(bool defaultValue=false) const
QColor getGridIsoVerticalColor(bool defaultValue=false) const
void setGridMainColor(const QColor &v) const
quint32 getGridSubdivisionStyle(bool defaultValue=false) const
QColor getGridSubdivisionColor(bool defaultValue=false) const
LineTypeInternal lineTypeMain() const
QColor m_colorIsoVertical
bool loadDynamicDataFromXml(const QDomElement &parent)
void transform(const QTransform &transform)
QDomElement saveDynamicDataToXml(QDomDocument &doc, const QString &tag) const
LineTypeInternal m_lineTypeIsoVertical
void updatePenStyle(QPen *pen, QColor color, LineTypeInternal type)
void saveStaticData() const
LineTypeInternal lineTypeSubdivision() const
QColor m_colorSubdivision
LineTypeInternal m_lineTypeSubdivision
LineTypeInternal m_lineTypeMain
LineTypeInternal lineTypeVertical() const
TrigoCache m_trigoCache
static bool qFuzzyCompare(half p1, half p2)
const qreal eps
KIS_DECLARE_STATIC_INITIALIZER
QVariantHash defaultGrid
T wrapValue(T value, T wrapBounds)
Point abs(const Point &pt)
void saveValue(QDomElement *parent, const QString &tag, const QSize &size)
bool loadValue(const QDomElement &e, float *v)
QTransform rotateTransform() const
QTransform scaleTransform() const